Forráskód Böngészése

merged branch lenar/dialoghelper-eof (PR #1704)

Commits
-------

07298ac Detect EOF when reading input stream

Discussion
----------

[Console] Detect EOF when reading input stream

This is related to commits 511a9a1fd75a89146056 and 3a5d508766f0480c3f1b.

First of them introduced abort-on-EOF and the second regressed the functionality.
Problem is stream_get_line() doesn't return false on EOF. So it needs call to feof() to
detect the situation.

Still, it's not ideal. With fgets() it worked fine, but with stream_get_line() one has to press
CTRL+D twice to get out. I presume this could be bug in PHP itself.

But better than nothing. Please consider.

---------------------------------------------------------------------------

by fabpot at 2011/07/19 22:47:53 -0700

I have used `stream_get_line` especially because it does not return `false` on eof. This is needed when you pass your own stream for unit tests.

---------------------------------------------------------------------------

by lenar at 2011/07/25 06:05:59 -0700

This is not the best solution I think. Tests should mimic and cope with real life not the other way around.
Better solution would be to fix testcase. Like this: lenar/SensioGeneratorBundle@6ff3f26881b2a130f51d3878596460db7c8263e1. Or maybe create a special "testing" stream wrapper that wraps php://memory and gives out just linefeeds after real data ends.

And then change stream_get_line() back to fgets() if there is no other reason for this change.

---------------------------------------------------------------------------

by fabpot at 2011/07/25 06:24:20 -0700

When applying your patch to the generator bundle (and revert to use `fgets`), I get "RuntimeException: Aborted" exceptions.

---------------------------------------------------------------------------

by lenar at 2011/07/25 06:35:08 -0700

With d326f89 added + lenar/SensioGeneratorBundle@6ff3f26881b2a130f51d3878596460db7c8263e1 I can successfully run every test in that file.

---------------------------------------------------------------------------

by fabpot at 2011/07/26 23:31:36 -0700

@lenar: not for me. I have many 'Aborted' exception on my Mac.

---------------------------------------------------------------------------

by fabpot at 2011/07/26 23:41:18 -0700

And I have the exact same errors on Linux:

    There were 7 errors:

    1) Sensio\Bundle\GeneratorBundle\Tests\Command\GenerateBundleCommandTest::testInteractiveCommand with data set #0 (array('/tmp'), 'Foo/BarBundle
    ', array('Foo\\BarBundle', 'FooBarBundle', '/tmp/', 'annotation', false))
    RuntimeException: Aborted

    .../Symfony/Component/Console/Helper/DialogHelper.php:40
    .../Symfony/Component/Console/Helper/DialogHelper.php:97
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Command/GenerateBundleCommand.php:165
    .../Symfony/Component/Console/Command/Command.php:205
    .../Symfony/Component/Console/Tester/CommandTester.php:66
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateBundleCommandTest.php:39

    2) Sensio\Bundle\GeneratorBundle\Tests\Command\GenerateBundleCommandTest::testInteractiveCommand with data set #1 (array('/tmp'), 'Foo/BarBundle
    BarBundle
    foo
    yml
    n', array('Foo\\BarBundle', 'BarBundle', 'foo/', 'yml', false))
    RuntimeException: Aborted

    .../Symfony/Component/Console/Helper/DialogHelper.php:40
    .../Symfony/Component/Console/Helper/DialogHelper.php:62
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Command/GenerateBundleCommand.php:83
    .../Symfony/Component/Console/Command/Command.php:214
    .../Symfony/Component/Console/Tester/CommandTester.php:66
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateBundleCommandTest.php:39

    3) Sensio\Bundle\GeneratorBundle\Tests\Command\GenerateBundleCommandTest::testInteractiveCommand with data set #2 (array('/tmp', 'yml', 'BarBundle', true), 'Foo/BarBundle
    ', array('Foo\\BarBundle', 'BarBundle', '/tmp/', 'yml', true))
    RuntimeException: Aborted

    .../Symfony/Component/Console/Helper/DialogHelper.php:40
    .../Symfony/Component/Console/Helper/DialogHelper.php:97
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Command/GenerateBundleCommand.php:165
    .../Symfony/Component/Console/Command/Command.php:205
    .../Symfony/Component/Console/Tester/CommandTester.php:66
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateBundleCommandTest.php:39

    4) Sensio\Bundle\GeneratorBundle\Tests\Command\GenerateDoctrineEntityCommandTest::testInteractiveCommand with data set #0 (array(), 'AcmeBlogBundle:Blog/Post
    ', array('Blog\\Post', 'annotation', array()))
    RuntimeException: Aborted

    .../Symfony/Component/Console/Helper/DialogHelper.php:40
    .../Symfony/Component/Console/Helper/DialogHelper.php:97
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Command/GenerateDoctrineEntityCommand.php:145
    .../Symfony/Component/Console/Command/Command.php:205
    .../Symfony/Component/Console/Tester/CommandTester.php:66
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateDoctrineEntityCommandTest.php:39

    5) Sensio\Bundle\GeneratorBundle\Tests\Command\GenerateDoctrineEntityCommandTest::testInteractiveCommand with data set #1 (array('AcmeBlogBundle:Blog/Post'), '', array('Blog\\Post', 'annotation', array()))
    RuntimeException: Aborted

    .../Symfony/Component/Console/Helper/DialogHelper.php:40
    .../Symfony/Component/Console/Helper/DialogHelper.php:97
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Command/GenerateDoctrineEntityCommand.php:121
    .../Symfony/Component/Console/Command/Command.php:205
    .../Symfony/Component/Console/Tester/CommandTester.php:66
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateDoctrineEntityCommandTest.php:39

    6) Sensio\Bundle\GeneratorBundle\Tests\Command\GenerateDoctrineEntityCommandTest::testInteractiveCommand with data set #2 (array(), 'AcmeBlogBundle:Blog/Post
    yml

    ', array('Blog\\Post', 'yml', array()))
    RuntimeException: Aborted

    .../Symfony/Component/Console/Helper/DialogHelper.php:40
    .../Symfony/Component/Console/Helper/DialogHelper.php:62
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Command/GenerateDoctrineEntityCommand.php:153
    .../Symfony/Component/Console/Command/Command.php:205
    .../Symfony/Component/Console/Tester/CommandTester.php:66
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateDoctrineEntityCommandTest.php:39

    7) Sensio\Bundle\GeneratorBundle\Tests\Command\GenerateDoctrineEntityCommandTest::testInteractiveCommand with data set #3 (array(), 'AcmeBlogBundle:Blog/Post
    yml
    title

    255
    description
    text

    ', array('Blog\\Post', 'yml', array(array('title', 'string', 255), array('description', 'text'))))
    RuntimeException: Aborted

    .../Symfony/Component/Console/Helper/DialogHelper.php:40
    .../Symfony/Component/Console/Helper/DialogHelper.php:62
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Command/GenerateDoctrineEntityCommand.php:153
    .../Symfony/Component/Console/Command/Command.php:205
    .../Symfony/Component/Console/Tester/CommandTester.php:66
    .../symfony-standard/vendor/bundles/Sensio/Bundle/GeneratorBundle/Tests/Command/GenerateDoctrineEntityCommandTest.php:39

---------------------------------------------------------------------------

by lenar at 2011/07/26 23:56:46 -0700

@fabpot: and you modified all those tests? I only modified ```Tests/Command/GenerateDoctrineCrudCommandTest.php```
and that doesn't fail as I see from your log. I just provided example, though I could add necessary changes for other tests too.

---------------------------------------------------------------------------

by fabpot at 2011/07/27 00:09:32 -0700

@lenar: ah, sorry about that. Then, can you provide a fix for all the other tests too? Thanks a lot.

---------------------------------------------------------------------------

by lenar at 2011/07/27 00:22:54 -0700

@fabpot: actually what do you think about this kind of fix instead for tests: lenar/SensioGeneratorBundle@517f263cb01ea2ea1ef2 instead my previous proposal (lenar/SensioGeneratorBundle@6ff3f26). Really simple, short and effective.

---------------------------------------------------------------------------

by fabpot at 2011/07/27 00:37:51 -0700

@lenar: looks good to me. Can you create a PR?

---------------------------------------------------------------------------

by lenar at 2011/07/27 00:45:36 -0700

@fabpot: sensio/SensioGeneratorBundle#60
Fabien Potencier 14 éve
szülő
commit
5731516070
1 módosított fájl, 3 hozzáadás és 2 törlés
  1. 3 2
      src/Symfony/Component/Console/Helper/DialogHelper.php

+ 3 - 2
src/Symfony/Component/Console/Helper/DialogHelper.php

@@ -20,7 +20,7 @@ use Symfony\Component\Console\Output\OutputInterface;
  */
 class DialogHelper extends Helper
 {
-    private $inputStream;
+    private $inputStream = STDIN;
 
     /**
      * Asks a question to the user.
@@ -35,7 +35,8 @@ class DialogHelper extends Helper
     {
         $output->write($question);
 
-        if (false === $ret = stream_get_line(null === $this->inputStream ? STDIN : $this->inputStream, 4096, "\n")) {
+        $ret = fgets($this->inputStream, 4096);
+        if (false === $ret) {
             throw new \RuntimeException('Aborted');
         }
         $ret = trim($ret);