deprecate not using a rounding mode

This commit is contained in:
Christian Flothmann 2020-04-25 11:27:26 +02:00
parent c6cf433589
commit 25ba1a241d
7 changed files with 144 additions and 39 deletions

View File

@ -39,6 +39,8 @@ EventDispatcher
Form
----
* Not configuring the `rounding_mode` option of the `PercentType` is deprecated. It will default to `PercentToLocalizedStringTransformer::ROUND_HALF_UP` in Symfony 6.
* Not passing a rounding mode to the constructor of `PercentToLocalizedStringTransformer` is deprecated. It will default to `ROUND_HALF_UP` in Symfony 6.
* Implementing the `FormConfigInterface` without implementing the `getIsEmptyCallback()` method
is deprecated. The method will be added to the interface in 6.0.
* Implementing the `FormConfigBuilderInterface` without implementing the `setIsEmptyCallback()` method

View File

@ -39,6 +39,8 @@ EventDispatcher
Form
----
* The default value of the `rounding_mode` option of the `PercentType` has been changed to `PercentToLocalizedStringTransformer::ROUND_HALF_UP`.
* The default rounding mode of the `PercentToLocalizedStringTransformer` has been changed to `ROUND_HALF_UP`.
* Added the `getIsEmptyCallback()` method to the `FormConfigInterface`.
* Added the `setIsEmptyCallback()` method to the `FormConfigBuilderInterface`.
* Added argument `callable|null $filter` to `ChoiceListFactoryInterface::createListFromChoices()` and `createListFromLoader()`.

View File

@ -4,6 +4,8 @@ CHANGELOG
5.1.0
-----
* Deprecated not configuring the `rounding_mode` option of the `PercentType`. It will default to `PercentToLocalizedStringTransformer::ROUND_HALF_UP` in Symfony 6.
* Deprecated not passing a rounding mode to the constructor of `PercentToLocalizedStringTransformer`. It will default to `ROUND_HALF_UP` in Symfony 6.
* Added `collection_entry` block prefix to `CollectionType` entries
* Added a `choice_filter` option to `ChoiceType`
* Added argument `callable|null $filter` to `ChoiceListFactoryInterface::createListFromChoices()` and `createListFromLoader()` - not defining them is deprecated.

View File

@ -80,8 +80,7 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface
self::INTEGER,
];
protected $roundingMode;
private $roundingMode;
private $type;
private $scale;
@ -93,7 +92,7 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface
*
* @throws UnexpectedTypeException if the given value of type is unknown
*/
public function __construct(int $scale = null, string $type = null, ?int $roundingMode = self::ROUND_HALF_UP)
public function __construct(int $scale = null, string $type = null, ?int $roundingMode = null)
{
if (null === $scale) {
$scale = 0;
@ -103,8 +102,8 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface
$type = self::FRACTIONAL;
}
if (null === $roundingMode) {
$roundingMode = self::ROUND_HALF_UP;
if (null === $roundingMode && (\func_num_args() < 4 || func_get_arg(3))) {
trigger_deprecation('symfony/form', '5.1', sprintf('Not passing a rounding mode to %s() is deprecated. Starting with Symfony 6.0 it will default to "%s::ROUND_HALF_UP".', __METHOD__, __CLASS__));
}
if (!\in_array($type, self::$types, true)) {
@ -235,7 +234,10 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface
$formatter = new \NumberFormatter(\Locale::getDefault(), \NumberFormatter::DECIMAL);
$formatter->setAttribute(\NumberFormatter::FRACTION_DIGITS, $this->scale);
$formatter->setAttribute(\NumberFormatter::ROUNDING_MODE, $this->roundingMode);
if (null !== $this->roundingMode) {
$formatter->setAttribute(\NumberFormatter::ROUNDING_MODE, $this->roundingMode);
}
return $formatter;
}

View File

@ -12,11 +12,11 @@
namespace Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\DataTransformer\NumberToLocalizedStringTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class PercentType extends AbstractType
@ -29,7 +29,8 @@ class PercentType extends AbstractType
$builder->addViewTransformer(new PercentToLocalizedStringTransformer(
$options['scale'],
$options['type'],
$options['rounding_mode']
$options['rounding_mode'],
false
));
}
@ -48,7 +49,11 @@ class PercentType extends AbstractType
{
$resolver->setDefaults([
'scale' => 0,
'rounding_mode' => NumberToLocalizedStringTransformer::ROUND_HALF_UP,
'rounding_mode' => function (Options $options) {
trigger_deprecation('symfony/form', '5.1', sprintf('Not configuring the "rounding_mode" option is deprecated. It will default to "%s::ROUND_HALF_UP" in Symfony 6.0.', PercentToLocalizedStringTransformer::class));
return null;
},
'symbol' => '%',
'type' => 'fractional',
'compound' => false,
@ -59,16 +64,24 @@ class PercentType extends AbstractType
'integer',
]);
$resolver->setAllowedValues('rounding_mode', [
NumberToLocalizedStringTransformer::ROUND_FLOOR,
NumberToLocalizedStringTransformer::ROUND_DOWN,
NumberToLocalizedStringTransformer::ROUND_HALF_DOWN,
NumberToLocalizedStringTransformer::ROUND_HALF_EVEN,
NumberToLocalizedStringTransformer::ROUND_HALF_UP,
NumberToLocalizedStringTransformer::ROUND_UP,
NumberToLocalizedStringTransformer::ROUND_CEILING,
null,
PercentToLocalizedStringTransformer::ROUND_FLOOR,
PercentToLocalizedStringTransformer::ROUND_DOWN,
PercentToLocalizedStringTransformer::ROUND_HALF_DOWN,
PercentToLocalizedStringTransformer::ROUND_HALF_EVEN,
PercentToLocalizedStringTransformer::ROUND_HALF_UP,
PercentToLocalizedStringTransformer::ROUND_UP,
PercentToLocalizedStringTransformer::ROUND_CEILING,
]);
$resolver->setAllowedTypes('scale', 'int');
$resolver->setAllowedTypes('symbol', ['bool', 'string']);
$resolver->setDeprecated('rounding_mode', 'symfony/form', '5.1', function (Options $options, $roundingMode) {
if (null === $roundingMode) {
return sprintf('Not configuring the "rounding_mode" option is deprecated. It will default to "%s::ROUND_HALF_UP" in Symfony 6.0.', PercentToLocalizedStringTransformer::class);
}
return '';
});
}
/**

View File

@ -12,11 +12,14 @@
namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;
use PHPUnit\Framework\TestCase;
use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait;
use Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer;
use Symfony\Component\Intl\Util\IntlTestHelper;
class PercentToLocalizedStringTransformerTest extends TestCase
{
use ExpectDeprecationTrait;
private $defaultLocale;
protected function setUp(): void
@ -32,7 +35,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
public function testTransform()
{
$transformer = new PercentToLocalizedStringTransformer();
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$this->assertEquals('10', $transformer->transform(0.1));
$this->assertEquals('15', $transformer->transform(0.15));
@ -42,14 +45,14 @@ class PercentToLocalizedStringTransformerTest extends TestCase
public function testTransformEmpty()
{
$transformer = new PercentToLocalizedStringTransformer();
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$this->assertEquals('', $transformer->transform(null));
}
public function testTransformWithInteger()
{
$transformer = new PercentToLocalizedStringTransformer(null, 'integer');
$transformer = new PercentToLocalizedStringTransformer(null, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$this->assertEquals('0', $transformer->transform(0.1));
$this->assertEquals('1', $transformer->transform(1));
@ -64,14 +67,26 @@ class PercentToLocalizedStringTransformerTest extends TestCase
\Locale::setDefault('de_AT');
$transformer = new PercentToLocalizedStringTransformer(2);
$transformer = new PercentToLocalizedStringTransformer(2, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$this->assertEquals('12,34', $transformer->transform(0.1234));
}
/**
* @group legacy
*/
public function testReverseTransformWithScaleAndRoundingDisabled()
{
$this->expectDeprecation('Since symfony/form 5.1: Not passing a rounding mode to Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer::__construct() is deprecated. Starting with Symfony 6.0 it will default to Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer::ROUND_HALF_UP.');
$transformer = new PercentToLocalizedStringTransformer(2, PercentToLocalizedStringTransformer::FRACTIONAL);
$this->assertEquals(0.0123456, $transformer->reverseTransform('1.23456'));
}
public function testReverseTransform()
{
$transformer = new PercentToLocalizedStringTransformer();
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$this->assertEquals(0.1, $transformer->reverseTransform('10'));
$this->assertEquals(0.15, $transformer->reverseTransform('15'));
@ -184,14 +199,14 @@ class PercentToLocalizedStringTransformerTest extends TestCase
public function testReverseTransformEmpty()
{
$transformer = new PercentToLocalizedStringTransformer();
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$this->assertNull($transformer->reverseTransform(''));
}
public function testReverseTransformWithInteger()
{
$transformer = new PercentToLocalizedStringTransformer(null, 'integer');
$transformer = new PercentToLocalizedStringTransformer(null, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$this->assertEquals(10, $transformer->reverseTransform('10'));
$this->assertEquals(15, $transformer->reverseTransform('15'));
@ -206,14 +221,14 @@ class PercentToLocalizedStringTransformerTest extends TestCase
\Locale::setDefault('de_AT');
$transformer = new PercentToLocalizedStringTransformer(2);
$transformer = new PercentToLocalizedStringTransformer(2, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$this->assertEquals(0.1234, $transformer->reverseTransform('12,34'));
}
public function testTransformExpectsNumeric()
{
$transformer = new PercentToLocalizedStringTransformer();
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
@ -222,7 +237,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
public function testReverseTransformExpectsString()
{
$transformer = new PercentToLocalizedStringTransformer();
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
@ -234,7 +249,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
IntlTestHelper::requireFullIntl($this, '4.8.1.1');
\Locale::setDefault('fr');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
// completely valid format
$this->assertEquals(1234.5, $transformer->reverseTransform('1 234,5'));
@ -253,7 +268,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
\Locale::setDefault('de_DE');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$transformer->reverseTransform('1.234.5');
}
@ -266,7 +281,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
\Locale::setDefault('de_DE');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$transformer->reverseTransform('1234.5');
}
@ -277,7 +292,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
IntlTestHelper::requireFullIntl($this, false);
\Locale::setDefault('fr');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
$this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
@ -289,7 +304,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
IntlTestHelper::requireFullIntl($this, '4.8.1.1');
\Locale::setDefault('bg');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
// completely valid format
$this->assertEquals(1234.5, $transformer->reverseTransform('1 234.5'));
@ -305,7 +320,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
IntlTestHelper::requireFullIntl($this, '4.8.1.1');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$transformer->reverseTransform('1,234,5');
}
@ -315,7 +330,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
IntlTestHelper::requireFullIntl($this, '4.8.1.1');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer');
$transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$transformer->reverseTransform('1234,5');
}
@ -328,7 +343,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
$transformer = $this->getMockBuilder('Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer')
->setMethods(['getNumberFormatter'])
->setConstructorArgs([1, 'integer'])
->setConstructorArgs([1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP])
->getMock();
$transformer->expects($this->any())
->method('getNumberFormatter')
@ -341,7 +356,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
public function testReverseTransformDisallowsLeadingExtraCharacters()
{
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
$transformer = new PercentToLocalizedStringTransformer();
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$transformer->reverseTransform('foo123');
}
@ -350,7 +365,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
{
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
$this->expectExceptionMessage('The number contains unrecognized characters: "foo3"');
$transformer = new PercentToLocalizedStringTransformer();
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$transformer->reverseTransform('12foo3');
}
@ -367,7 +382,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
\Locale::setDefault('ru');
$transformer = new PercentToLocalizedStringTransformer();
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$transformer->reverseTransform("12\xc2\xa0345,67foo8");
}
@ -376,7 +391,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
{
$this->expectException('Symfony\Component\Form\Exception\TransformationFailedException');
$this->expectExceptionMessage('The number contains unrecognized characters: "foo"');
$transformer = new PercentToLocalizedStringTransformer();
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$transformer->reverseTransform('123foo');
}
@ -393,7 +408,7 @@ class PercentToLocalizedStringTransformerTest extends TestCase
\Locale::setDefault('ru');
$transformer = new PercentToLocalizedStringTransformer();
$transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP);
$transformer->reverseTransform("12\xc2\xa0345,678foo");
}

View File

@ -0,0 +1,69 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Form\Tests\Extension\Core\Type;
use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait;
use Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer;
use Symfony\Component\Form\Extension\Core\Type\PercentType;
use Symfony\Component\Form\Test\TypeTestCase;
class PercentTypeTest extends TypeTestCase
{
use ExpectDeprecationTrait;
const TESTED_TYPE = PercentType::class;
public function testSubmitWithRoundingMode()
{
$form = $this->factory->create(self::TESTED_TYPE, null, [
'scale' => 2,
'rounding_mode' => PercentToLocalizedStringTransformer::ROUND_CEILING,
]);
$form->submit('1.23456');
$this->assertEquals(0.0124, $form->getData());
}
/**
* @group legacy
*/
public function testSubmitWithoutRoundingMode()
{
$this->expectDeprecation('Since symfony/form 5.1: Not configuring the "rounding_mode" option is deprecated. It will default to Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer::ROUND_HALF_UP in Symfony 6.0.');
$form = $this->factory->create(self::TESTED_TYPE, null, [
'scale' => 2,
]);
$form->submit('1.23456');
$this->assertEquals(0.0123456, $form->getData());
}
/**
* @group legacy
*/
public function testSubmitWithNullRoundingMode()
{
$this->expectDeprecation('Since symfony/form 5.1: Not configuring the "rounding_mode" option is deprecated. It will default to Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer::ROUND_HALF_UP in Symfony 6.0.');
$form = $this->factory->create(self::TESTED_TYPE, null, [
'rounding_mode' => null,
'scale' => 2,
]);
$form->submit('1.23456');
$this->assertEquals(0.0123456, $form->getData());
}
}