-
-
Notifications
You must be signed in to change notification settings - Fork 9.6k
[Finder] Allow arrays as parameters of some methods for better fluent experience and code readability #27891
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Finder] Allow arrays as parameters of some methods for better fluent experience and code readability #27891
Conversation
70dab9f
to
daec10f
Compare
daec10f
to
93a35eb
Compare
@nicolas-grekas I'm not very familiar with the travis-ci build system yet. |
$this->depths[] = new Comparator\NumberComparator($level); | ||
$this->depths = \array_merge( | ||
$this->depths, | ||
ComparatorFactory::createBatch(NumberComparator::class, (array) $levels) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IMHO you can inline the array_map
call per case, no need for ComparatorFactory
or just wrap $this->depths[] = new Comparator\NumberComparator($level);
in a foreach
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You are right, the Factory did not please me either (it was on my PR TODO list).
I opt for the simplicity of the foreach loop.
AFAIK the classical |
f88f9d8
to
a2dbbd1
Compare
a2dbbd1
to
72812ed
Compare
} | ||
|
||
public function testDate() | ||
{ | ||
$finder = $this->buildFinder(); | ||
$this->assertSame($finder, $finder->files()->date('until last month')); | ||
$this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php')), $finder->in(self::$tmpDir)->getIterator()); | ||
|
||
$finder = $this->buildFinder(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should be a separate test instead of making 2 independent tests in the same PHPUnit test. This makes things much better, as it means they will both run all the time (if the first logic fails, it does not prevent the second from running if they are in separate tests) and it also makes the test more readable (as each test stays self-contained)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is true for your other changes too.
And yes, I know that many Finder tests are still mixed in the same method. That's something we were doing a lot in the very early days of Symfony 2 development (i.e. in the early days of using PHPUnit in the Symfony community), and we haven't rewritten all existing tests to improve them.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks a lot for your explanations.
I extracted my tests in their own methods but I might lack some inspiration to name them ... What do you think about it ?
When I run php-cs-fix on tests, it throws an error
1) src/Symfony/Component/Finder/Tests/FinderTest.php (native_constant_invocation)
I understand that this is a new way of writing native constant for more performance in Symfony. Is this something that I have to correct now?
I will be able to rewrite the old tests to update them by following the new practices in a dedicated PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
72812ed
to
3dd230a
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
small change in one example
@@ -131,18 +134,21 @@ public function depth($level) | |||
* $finder->date('until 2 days ago'); | |||
* $finder->date('> now - 2 hours'); | |||
* $finder->date('>= 2005-10-15'); | |||
* $finder->date(['>= 2005-10-15', '>= 2005-05-27']); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I suppose the first one should probably be <=
for the range to make sense.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, it’s fixed.
I checked that i did not make the mistake in the tests and documentation.
fe41694
to
4dacad4
Compare
… experience and code readability
3296753
to
ad97cd7
Compare
Thank you @jfredon. |
…r better fluent experience and code readability (jfredon) This PR was squashed before being merged into the 4.2-dev branch (closes #27891). Discussion ---------- [Finder] Allow arrays as parameters of some methods for better fluent experience and code readability | Q | A | ------------- | --- | Branch? | master | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | none | License | MIT | Doc PR | symfony/symfony-docs#10038 Makes the Finder library a little more convenient to use by allowing the use of arrays as parameters of methods that can be called multiple times. This way of doing things was already present for the `Finder::in()` and `Finder::exclude()` methods, it has been extended to other methods that can be called several times to cumulate their effects. This allows a better use of fluent methods by avoiding breaking the chaining to iterate on array variables (a little more complexity in the Finder library for less complexity in applications that uses it). ```php // we could use $finder = Finder::create()->in($fileRepository)->name($fileList); // instead of $finder = Finder::create()->in($fileRepository); foreach ($fileList as $file) { $finder->name($file); } ``` In `.php_cs` files, this would make the code more readable by separating the configuration of the execution code: ```php <?php const RULES = [ '@symfony' => true, '@symfony:risky' => true, ]; const EXCLUDED_DIRS = [ // directories containing files with content that is autogenerated by `var_export`, which breaks CS in output code 'Symfony/Component/Cache/Tests/Marshaller/Fixtures', 'Symfony/Component/DependencyInjection/Tests/Fixtures', // ... ]; const EXCLUDED_FILES = [ // file content autogenerated by `var_export` 'Symfony/Component/Translation/Tests/fixtures/resources.php', // test template 'Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Resources/Custom/_name_entry_label.html.php', // ... ]; return PhpCsFixer\Config::create() ->setRules(RULES) ->setRiskyAllowed(true) ->setFinder( PhpCsFixer\Finder::create() ->in(__DIR__.'/src') ->append(array(__FILE__)) ->exclude(EXCLUDED_DIRS) ->notPath(EXCLUDED_FILES) ) ; ``` TODO - [x] complete the tests to validate the new syntax on all modified methods - [x] submit changes to the Finder documentation Commits ------- ad97cd7 [Finder] Allow arrays as parameters of some methods for better fluent experience and code readability
…arameter (jfredon) This PR was merged into the master branch. Discussion ---------- [Finder] Add documentation and code on array as method parameter Documents symfony/symfony#27891 Commits ------- 361dde5 [Finder] Add documentation and code on array as method parameter
Makes the Finder library a little more convenient to use by allowing the use of arrays as parameters of methods that can be called multiple times.
This way of doing things was already present for the
Finder::in()
andFinder::exclude()
methods, it has been extended to other methods that can be called several times to cumulate their effects.This allows a better use of fluent methods by avoiding breaking the chaining to iterate on array variables (a little more complexity in the Finder library for less complexity in applications that uses it).
In
.php_cs
files, this would make the code more readable by separating the configuration of the execution code:TODO