Merge branch '3.4' into 4.1

* 3.4:
  Fix CS
  Allow reuse of Session between requests
  [MonologBridge] Re-add option option to ignore empty context and extra data
  [Lock] remove useless code
  [PhpUnitBridge] fix disabling DeprecationErrorHandler using phpunit.xml file
  Provide debug_backtrace with proper args
  [DI] fix infinite loop involving self-references in decorated services
  forward false label option to nested types
  forward the invalid_message option in date types
This commit is contained in:
Nicolas Grekas 2018-09-21 14:49:42 +02:00
commit 76cf0ca661
20 changed files with 208 additions and 145 deletions

View File

@ -61,6 +61,7 @@ class ConsoleFormatter implements FormatterInterface
'colors' => true, 'colors' => true,
'multiline' => false, 'multiline' => false,
'level_name_format' => '%-9s', 'level_name_format' => '%-9s',
'ignore_empty_context_and_extra' => true,
), $options); ), $options);
if (class_exists(VarCloner::class)) { if (class_exists(VarCloner::class)) {
@ -101,20 +102,16 @@ class ConsoleFormatter implements FormatterInterface
$levelColor = self::$levelColorMap[$record['level']]; $levelColor = self::$levelColorMap[$record['level']];
if ($this->options['multiline']) { if (!$this->options['ignore_empty_context_and_extra'] || !empty($record['context'])) {
$separator = "\n"; $context = ($this->options['multiline'] ? "\n" : ' ').$this->dumpData($record['context']);
} else { } else {
$separator = ' '; $context = '';
} }
$context = $this->dumpData($record['context']); if (!$this->options['ignore_empty_context_and_extra'] || !empty($record['extra'])) {
if ($context) { $extra = ($this->options['multiline'] ? "\n" : ' ').$this->dumpData($record['extra']);
$context = $separator.$context; } else {
} $extra = '';
$extra = $this->dumpData($record['extra']);
if ($extra) {
$extra = $separator.$extra;
} }
$formatted = strtr($this->options['format'], array( $formatted = strtr($this->options['format'], array(

View File

@ -64,9 +64,9 @@ class ConsoleHandlerTest extends TestCase
$realOutput = $this->getMockBuilder('Symfony\Component\Console\Output\Output')->setMethods(array('doWrite'))->getMock(); $realOutput = $this->getMockBuilder('Symfony\Component\Console\Output\Output')->setMethods(array('doWrite'))->getMock();
$realOutput->setVerbosity($verbosity); $realOutput->setVerbosity($verbosity);
if ($realOutput->isDebug()) { if ($realOutput->isDebug()) {
$log = "16:21:54 $levelName [app] My info message\n[]\n[]\n"; $log = "16:21:54 $levelName [app] My info message\n";
} else { } else {
$log = "16:21:54 $levelName [app] My info message [] []\n"; $log = "16:21:54 $levelName [app] My info message\n";
} }
$realOutput $realOutput
->expects($isHandling ? $this->once() : $this->never()) ->expects($isHandling ? $this->once() : $this->never())
@ -149,7 +149,7 @@ class ConsoleHandlerTest extends TestCase
$output $output
->expects($this->once()) ->expects($this->once())
->method('write') ->method('write')
->with("16:21:54 <fg=green>INFO </> <comment>[app]</> My info message\n[]\n[]\n") ->with("16:21:54 <fg=green>INFO </> <comment>[app]</> My info message\n")
; ;
$handler = new ConsoleHandler(null, false); $handler = new ConsoleHandler(null, false);

View File

@ -54,7 +54,11 @@ class DeprecationErrorHandler
if (false === $mode) { if (false === $mode) {
$mode = getenv('SYMFONY_DEPRECATIONS_HELPER'); $mode = getenv('SYMFONY_DEPRECATIONS_HELPER');
} }
if (DeprecationErrorHandler::MODE_WEAK !== $mode && DeprecationErrorHandler::MODE_WEAK_VENDORS !== $mode && (!isset($mode[0]) || '/' !== $mode[0])) { if (DeprecationErrorHandler::MODE_DISABLED !== $mode
&& DeprecationErrorHandler::MODE_WEAK !== $mode
&& DeprecationErrorHandler::MODE_WEAK_VENDORS !== $mode
&& (!isset($mode[0]) || '/' !== $mode[0])
) {
$mode = preg_match('/^[1-9][0-9]*$/', $mode) ? (int) $mode : 0; $mode = preg_match('/^[1-9][0-9]*$/', $mode) ? (int) $mode : 0;
} }
@ -108,7 +112,7 @@ class DeprecationErrorHandler
return $ErrorHandler::handleError($type, $msg, $file, $line, $context); return $ErrorHandler::handleError($type, $msg, $file, $line, $context);
} }
$trace = debug_backtrace(true); $trace = debug_backtrace();
$group = 'other'; $group = 'other';
$isVendor = DeprecationErrorHandler::MODE_WEAK_VENDORS === $mode && $inVendors($file); $isVendor = DeprecationErrorHandler::MODE_WEAK_VENDORS === $mode && $inVendors($file);

View File

@ -159,8 +159,8 @@ abstract class CompleteConfigurationTest extends TestCase
null, null,
null, null,
array( array(
'simple_form', 'simple_form',
'anonymous', 'anonymous',
), ),
null, null,
), ),

View File

@ -64,10 +64,10 @@ class UndefinedMethodFatalErrorHandlerTest extends TestCase
), ),
array( array(
array( array(
'type' => 1, 'type' => 1,
'message' => 'Call to undefined method class@anonymous::test()', 'message' => 'Call to undefined method class@anonymous::test()',
'file' => '/home/possum/work/symfony/test.php', 'file' => '/home/possum/work/symfony/test.php',
'line' => 11, 'line' => 11,
), ),
'Attempted to call an undefined method named "test" of class "class@anonymous".', 'Attempted to call an undefined method named "test" of class "class@anonymous".',
), ),

View File

@ -113,6 +113,8 @@ class AnalyzeServiceReferencesPass extends AbstractRecursivePass implements Repe
return $value; return $value;
} }
$this->currentDefinition = $value; $this->currentDefinition = $value;
} elseif ($this->currentDefinition === $value) {
return $value;
} }
$this->lazy = false; $this->lazy = false;

View File

@ -1476,6 +1476,22 @@ class ContainerBuilderTest extends TestCase
$container->get('errored_definition'); $container->get('errored_definition');
} }
public function testDecoratedSelfReferenceInvolvingPrivateServices()
{
$container = new ContainerBuilder();
$container->register('foo', 'stdClass')
->setPublic(false)
->setProperty('bar', new Reference('foo'));
$container->register('baz', 'stdClass')
->setPublic(false)
->setProperty('inner', new Reference('baz.inner'))
->setDecoratedService('foo');
$container->compile();
$this->assertSame(array('service_container'), array_keys($container->getDefinitions()));
}
} }
class FooClass class FooClass

View File

@ -392,8 +392,8 @@ class PhpDumperTest extends TestCase
$container->compile(true); $container->compile(true);
$expected = array( $expected = array(
'env(foo)' => 'd29ybGQ=', 'env(foo)' => 'd29ybGQ=',
'hello' => 'world', 'hello' => 'world',
); );
$this->assertSame($expected, $container->getParameterBag()->all()); $this->assertSame($expected, $container->getParameterBag()->all());
} }

View File

@ -948,12 +948,12 @@ class FormTest extends TestCase
{ {
$dom = new \DOMDocument(); $dom = new \DOMDocument();
$dom->loadHTML(' $dom->loadHTML('
<html> <html>
<form> <form>
<textarea name="example"></textarea> <textarea name="example"></textarea>
</form> </form>
</html> </html>'
'); );
$nodes = $dom->getElementsByTagName('form'); $nodes = $dom->getElementsByTagName('form');
$form = new Form($nodes->item(0), 'http://example.com'); $form = new Form($nodes->item(0), 'http://example.com');

View File

@ -29,12 +29,12 @@ class MockSplFileInfo extends \SplFileInfo
parent::__construct($param); parent::__construct($param);
} elseif (\is_array($param)) { } elseif (\is_array($param)) {
$defaults = array( $defaults = array(
'name' => 'file.txt', 'name' => 'file.txt',
'contents' => null, 'contents' => null,
'mode' => null, 'mode' => null,
'type' => null, 'type' => null,
'relativePath' => null, 'relativePath' => null,
'relativePathname' => null, 'relativePathname' => null,
); );
$defaults = array_merge($defaults, $param); $defaults = array_merge($defaults, $param);
parent::__construct($defaults['name']); parent::__construct($defaults['name']);

View File

@ -78,6 +78,18 @@ class DateType extends AbstractType
'error_bubbling' => true, 'error_bubbling' => true,
); );
if (isset($options['invalid_message'])) {
$dayOptions['invalid_message'] = $options['invalid_message'];
$monthOptions['invalid_message'] = $options['invalid_message'];
$yearOptions['invalid_message'] = $options['invalid_message'];
}
if (isset($options['invalid_message_parameters'])) {
$dayOptions['invalid_message_parameters'] = $options['invalid_message_parameters'];
$monthOptions['invalid_message_parameters'] = $options['invalid_message_parameters'];
$yearOptions['invalid_message_parameters'] = $options['invalid_message_parameters'];
}
$formatter = new \IntlDateFormatter( $formatter = new \IntlDateFormatter(
\Locale::getDefault(), \Locale::getDefault(),
$dateFormat, $dateFormat,

View File

@ -73,6 +73,18 @@ class TimeType extends AbstractType
'error_bubbling' => true, 'error_bubbling' => true,
); );
if (isset($options['invalid_message'])) {
$hourOptions['invalid_message'] = $options['invalid_message'];
$minuteOptions['invalid_message'] = $options['invalid_message'];
$secondOptions['invalid_message'] = $options['invalid_message'];
}
if (isset($options['invalid_message_parameters'])) {
$hourOptions['invalid_message_parameters'] = $options['invalid_message_parameters'];
$minuteOptions['invalid_message_parameters'] = $options['invalid_message_parameters'];
$secondOptions['invalid_message_parameters'] = $options['invalid_message_parameters'];
}
if ('choice' === $options['widget']) { if ('choice' === $options['widget']) {
$hours = $minutes = array(); $hours = $minutes = array();

View File

@ -209,7 +209,9 @@ class Session implements SessionInterface, \IteratorAggregate, \Countable
*/ */
public function setId($id) public function setId($id)
{ {
$this->storage->setId($id); if ($this->storage->getId() !== $id) {
$this->storage->setId($id);
}
} }
/** /**

View File

@ -70,6 +70,27 @@ class SessionTest extends TestCase
$this->assertEquals('0123456789abcdef', $this->session->getId()); $this->assertEquals('0123456789abcdef', $this->session->getId());
} }
public function testSetIdAfterStart()
{
$this->session->start();
$id = $this->session->getId();
$e = null;
try {
$this->session->setId($id);
} catch (\Exception $e) {
}
$this->assertNull($e);
try {
$this->session->setId('different');
} catch (\Exception $e) {
}
$this->assertInstanceOf('\LogicException', $e);
}
public function testSetName() public function testSetName()
{ {
$this->assertEquals('MOCKSESSID', $this->session->getName()); $this->assertEquals('MOCKSESSID', $this->session->getName());

View File

@ -48,7 +48,7 @@ class MockArraySessionStorageTest extends TestCase
$this->data = array( $this->data = array(
$this->attributes->getStorageKey() => array('foo' => 'bar'), $this->attributes->getStorageKey() => array('foo' => 'bar'),
$this->flashes->getStorageKey() => array('notice' => 'hello'), $this->flashes->getStorageKey() => array('notice' => 'hello'),
); );
$this->storage = new MockArraySessionStorage(); $this->storage = new MockArraySessionStorage();
$this->storage->registerBag($this->flashes); $this->storage->registerBag($this->flashes);

View File

@ -151,8 +151,6 @@ class CombinedStore implements StoreInterface, LoggerAwareInterface
$store->delete($key); $store->delete($key);
} catch (\Exception $e) { } catch (\Exception $e) {
$this->logger->notice('One store failed to delete the "{resource}" lock.', array('resource' => $key, 'store' => $store, 'exception' => $e)); $this->logger->notice('One store failed to delete the "{resource}" lock.', array('resource' => $key, 'store' => $store, 'exception' => $e));
} catch (\Throwable $e) {
$this->logger->notice('One store failed to delete the "{resource}" lock.', array('resource' => $key, 'store' => $store, 'exception' => $e));
} }
} }
} }

View File

@ -189,8 +189,8 @@ XML;
public function testEncodeScalarRootAttributes() public function testEncodeScalarRootAttributes()
{ {
$array = array( $array = array(
'#' => 'Paul', '#' => 'Paul',
'@gender' => 'm', '@gender' => 'm',
); );
$expected = '<?xml version="1.0"?>'."\n". $expected = '<?xml version="1.0"?>'."\n".
@ -202,8 +202,8 @@ XML;
public function testEncodeRootAttributes() public function testEncodeRootAttributes()
{ {
$array = array( $array = array(
'firstname' => 'Paul', 'firstname' => 'Paul',
'@gender' => 'm', '@gender' => 'm',
); );
$expected = '<?xml version="1.0"?>'."\n". $expected = '<?xml version="1.0"?>'."\n".
@ -215,7 +215,7 @@ XML;
public function testEncodeCdataWrapping() public function testEncodeCdataWrapping()
{ {
$array = array( $array = array(
'firstname' => 'Paul <or Me>', 'firstname' => 'Paul <or Me>',
); );
$expected = '<?xml version="1.0"?>'."\n". $expected = '<?xml version="1.0"?>'."\n".

View File

@ -75,8 +75,7 @@ class PropertyNormalizerTest extends TestCase
$group->setKevin('Kevin'); $group->setKevin('Kevin');
$group->setCoopTilleuls('coop'); $group->setCoopTilleuls('coop');
$this->assertEquals( $this->assertEquals(
array('foo' => 'foo', 'bar' => 'bar', 'kevin' => 'Kevin', array('foo' => 'foo', 'bar' => 'bar', 'kevin' => 'Kevin', 'coopTilleuls' => 'coop', 'fooBar' => null, 'symfony' => null, 'baz' => 'baz'),
'coopTilleuls' => 'coop', 'fooBar' => null, 'symfony' => null, 'baz' => 'baz', ),
$this->normalizer->normalize($group, 'any') $this->normalizer->normalize($group, 'any')
); );
} }

View File

@ -42,85 +42,85 @@ class TranslationDataCollectorTest extends TestCase
{ {
$collectedMessages = array( $collectedMessages = array(
array( array(
'id' => 'foo', 'id' => 'foo',
'translation' => 'foo (en)', 'translation' => 'foo (en)',
'locale' => 'en', 'locale' => 'en',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_DEFINED, 'state' => DataCollectorTranslator::MESSAGE_DEFINED,
'parameters' => array(), 'parameters' => array(),
'transChoiceNumber' => null, 'transChoiceNumber' => null,
), ),
array( array(
'id' => 'bar', 'id' => 'bar',
'translation' => 'bar (fr)', 'translation' => 'bar (fr)',
'locale' => 'fr', 'locale' => 'fr',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
'parameters' => array(), 'parameters' => array(),
'transChoiceNumber' => null, 'transChoiceNumber' => null,
), ),
array( array(
'id' => 'choice', 'id' => 'choice',
'translation' => 'choice', 'translation' => 'choice',
'locale' => 'en', 'locale' => 'en',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_MISSING, 'state' => DataCollectorTranslator::MESSAGE_MISSING,
'parameters' => array('%count%' => 3), 'parameters' => array('%count%' => 3),
'transChoiceNumber' => 3, 'transChoiceNumber' => 3,
), ),
array( array(
'id' => 'choice', 'id' => 'choice',
'translation' => 'choice', 'translation' => 'choice',
'locale' => 'en', 'locale' => 'en',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_MISSING, 'state' => DataCollectorTranslator::MESSAGE_MISSING,
'parameters' => array('%count%' => 3), 'parameters' => array('%count%' => 3),
'transChoiceNumber' => 3, 'transChoiceNumber' => 3,
), ),
array( array(
'id' => 'choice', 'id' => 'choice',
'translation' => 'choice', 'translation' => 'choice',
'locale' => 'en', 'locale' => 'en',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_MISSING, 'state' => DataCollectorTranslator::MESSAGE_MISSING,
'parameters' => array('%count%' => 4, '%foo%' => 'bar'), 'parameters' => array('%count%' => 4, '%foo%' => 'bar'),
'transChoiceNumber' => 4, 'transChoiceNumber' => 4,
), ),
); );
$expectedMessages = array( $expectedMessages = array(
array( array(
'id' => 'foo', 'id' => 'foo',
'translation' => 'foo (en)', 'translation' => 'foo (en)',
'locale' => 'en', 'locale' => 'en',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_DEFINED, 'state' => DataCollectorTranslator::MESSAGE_DEFINED,
'count' => 1, 'count' => 1,
'parameters' => array(), 'parameters' => array(),
'transChoiceNumber' => null, 'transChoiceNumber' => null,
), ),
array( array(
'id' => 'bar', 'id' => 'bar',
'translation' => 'bar (fr)', 'translation' => 'bar (fr)',
'locale' => 'fr', 'locale' => 'fr',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
'count' => 1, 'count' => 1,
'parameters' => array(), 'parameters' => array(),
'transChoiceNumber' => null, 'transChoiceNumber' => null,
), ),
array( array(
'id' => 'choice', 'id' => 'choice',
'translation' => 'choice', 'translation' => 'choice',
'locale' => 'en', 'locale' => 'en',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_MISSING, 'state' => DataCollectorTranslator::MESSAGE_MISSING,
'count' => 3, 'count' => 3,
'parameters' => array( 'parameters' => array(
array('%count%' => 3), array('%count%' => 3),
array('%count%' => 3), array('%count%' => 3),
array('%count%' => 4, '%foo%' => 'bar'), array('%count%' => 4, '%foo%' => 'bar'),
), ),
'transChoiceNumber' => 3, 'transChoiceNumber' => 3,
), ),
); );

View File

@ -31,49 +31,49 @@ class DataCollectorTranslatorTest extends TestCase
$expectedMessages = array(); $expectedMessages = array();
$expectedMessages[] = array( $expectedMessages[] = array(
'id' => 'foo', 'id' => 'foo',
'translation' => 'foo (en)', 'translation' => 'foo (en)',
'locale' => 'en', 'locale' => 'en',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_DEFINED, 'state' => DataCollectorTranslator::MESSAGE_DEFINED,
'parameters' => array(), 'parameters' => array(),
'transChoiceNumber' => null, 'transChoiceNumber' => null,
); );
$expectedMessages[] = array( $expectedMessages[] = array(
'id' => 'bar', 'id' => 'bar',
'translation' => 'bar (fr)', 'translation' => 'bar (fr)',
'locale' => 'fr', 'locale' => 'fr',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
'parameters' => array(), 'parameters' => array(),
'transChoiceNumber' => null, 'transChoiceNumber' => null,
); );
$expectedMessages[] = array( $expectedMessages[] = array(
'id' => 'choice', 'id' => 'choice',
'translation' => 'choice', 'translation' => 'choice',
'locale' => 'en', 'locale' => 'en',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_MISSING, 'state' => DataCollectorTranslator::MESSAGE_MISSING,
'parameters' => array(), 'parameters' => array(),
'transChoiceNumber' => 0, 'transChoiceNumber' => 0,
); );
$expectedMessages[] = array( $expectedMessages[] = array(
'id' => 'bar_ru', 'id' => 'bar_ru',
'translation' => 'bar (ru)', 'translation' => 'bar (ru)',
'locale' => 'ru', 'locale' => 'ru',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
'parameters' => array(), 'parameters' => array(),
'transChoiceNumber' => null, 'transChoiceNumber' => null,
); );
$expectedMessages[] = array( $expectedMessages[] = array(
'id' => 'bar_ru', 'id' => 'bar_ru',
'translation' => 'bar (ru)', 'translation' => 'bar (ru)',
'locale' => 'ru', 'locale' => 'ru',
'domain' => 'messages', 'domain' => 'messages',
'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
'parameters' => array('foo' => 'bar'), 'parameters' => array('foo' => 'bar'),
'transChoiceNumber' => null, 'transChoiceNumber' => null,
); );
$this->assertEquals($expectedMessages, $collector->getCollectedMessages()); $this->assertEquals($expectedMessages, $collector->getCollectedMessages());