From 6807607a974eceded7e0fd0cc557a64f249f8d28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Simon?= Date: Thu, 28 Feb 2013 11:24:47 +0100 Subject: [PATCH 1/3] [Finder] added adapter selection/unselection capabilities --- src/Symfony/Component/Finder/Finder.php | 45 ++++++++++++++++++- .../Component/Finder/Tests/FinderTest.php | 15 +++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Finder/Finder.php b/src/Symfony/Component/Finder/Finder.php index 23531c25340f8..a0870d35e9c62 100644 --- a/src/Symfony/Component/Finder/Finder.php +++ b/src/Symfony/Component/Finder/Finder.php @@ -68,7 +68,7 @@ public function __construct() $this ->addAdapter(new GnuFindAdapter()) ->addAdapter(new BsdFindAdapter()) - ->addAdapter(new PhpAdapter(), -50) + ->setAdapter(new PhpAdapter(), -50) ; } @@ -97,11 +97,48 @@ public function addAdapter(Adapter\AdapterInterface $adapter, $priority = 0) $this->adapters[$adapter->getName()] = array( 'adapter' => $adapter, 'priority' => $priority, + 'selected' => false, ); return $this->sortAdapters(); } + /** + * Removes adapter selection adapter to use best one. + * + * @return Finder The current Finder instance + */ + public function useBestAdapter() + { + $this->adapters = array_map(function (array $properties) { + $properties['selected'] = false; + + return $properties; + }, $this->adapters); + + return $this->sortAdapters(); + } + + /** + * Selects the adapter to use. + * + * @param Adapter\AdapterInterface $adapter + * @param int $priority + * + * @return Finder The current Finder instance + */ + public function setAdapter(Adapter\AdapterInterface $adapter, $priority = 0) + { + if (!isset($this->adapters[$adapter->getName()])) { + $this->addAdapter($adapter, $priority); + } + + $this->useBestAdapter(); + $this->adapters[$adapter->getName()]['selected'] = true; + + return $this->sortAdapters(); + } + /** * Removes all adapters registered in the finder. * @@ -692,12 +729,16 @@ public function count() return iterator_count($this->getIterator()); } - /* + /** * @return Finder The current Finder instance */ private function sortAdapters() { uasort($this->adapters, function (array $a, array $b) { + if ($a['selected'] || $b['selected']) { + return $a['selected'] ? -1 : 1; + } + return $a['priority'] > $b['priority'] ? -1 : 1; }); diff --git a/src/Symfony/Component/Finder/Tests/FinderTest.php b/src/Symfony/Component/Finder/Tests/FinderTest.php index c074d2cb847bd..35f4b92f5d249 100644 --- a/src/Symfony/Component/Finder/Tests/FinderTest.php +++ b/src/Symfony/Component/Finder/Tests/FinderTest.php @@ -683,6 +683,21 @@ public function testPath(Adapter\AdapterInterface $adapter, $matchPatterns, $noM $this->assertIterator($this->toAbsoluteFixtures($expected), $finder); } + public function testAdapterSelection() + { + // test that by default, PhpAdapter is selected + $adapters = Finder::create()->getAdapters(); + $this->assertTrue($adapters[0] instanceof Adapter\PhpAdapter); + + // test another adapter selection + $adapters = Finder::create()->setAdapter(new Adapter\GnuFindAdapter())->getAdapters(); + $this->assertTrue($adapters[0] instanceof Adapter\GnuFindAdapter); + + // test that useBestAdapter method removes selection + $adapters = Finder::create()->useBestAdapter()->getAdapters(); + $this->assertFalse($adapters[0] instanceof Adapter\PhpAdapter); + } + public function getTestPathData() { $tests = array( From 489b94b9f2ca2289d5f4b4cbd9686d8ed8f84da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Simon?= Date: Thu, 28 Feb 2013 13:25:46 +0100 Subject: [PATCH 2/3] [Finder] updated 'setAdapter' method --- src/Symfony/Component/Finder/Finder.php | 16 +++++++++------- .../Component/Finder/Tests/FinderTest.php | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/Finder/Finder.php b/src/Symfony/Component/Finder/Finder.php index a0870d35e9c62..14be36df570ac 100644 --- a/src/Symfony/Component/Finder/Finder.php +++ b/src/Symfony/Component/Finder/Finder.php @@ -68,7 +68,8 @@ public function __construct() $this ->addAdapter(new GnuFindAdapter()) ->addAdapter(new BsdFindAdapter()) - ->setAdapter(new PhpAdapter(), -50) + ->addAdapter(new PhpAdapter(), -50) + ->setAdapter('php') ; } @@ -122,19 +123,20 @@ public function useBestAdapter() /** * Selects the adapter to use. * - * @param Adapter\AdapterInterface $adapter - * @param int $priority + * @param string $name + * + * @throws \InvalidArgumentException * * @return Finder The current Finder instance */ - public function setAdapter(Adapter\AdapterInterface $adapter, $priority = 0) + public function setAdapter($name) { - if (!isset($this->adapters[$adapter->getName()])) { - $this->addAdapter($adapter, $priority); + if (!isset($this->adapters[$name])) { + throw new \InvalidArgumentException(sprintf('There is no registered adapter with "%s" name.', $name)); } $this->useBestAdapter(); - $this->adapters[$adapter->getName()]['selected'] = true; + $this->adapters[$name]['selected'] = true; return $this->sortAdapters(); } diff --git a/src/Symfony/Component/Finder/Tests/FinderTest.php b/src/Symfony/Component/Finder/Tests/FinderTest.php index 35f4b92f5d249..33750fc27613d 100644 --- a/src/Symfony/Component/Finder/Tests/FinderTest.php +++ b/src/Symfony/Component/Finder/Tests/FinderTest.php @@ -690,7 +690,7 @@ public function testAdapterSelection() $this->assertTrue($adapters[0] instanceof Adapter\PhpAdapter); // test another adapter selection - $adapters = Finder::create()->setAdapter(new Adapter\GnuFindAdapter())->getAdapters(); + $adapters = Finder::create()->setAdapter('gnu_find')->getAdapters(); $this->assertTrue($adapters[0] instanceof Adapter\GnuFindAdapter); // test that useBestAdapter method removes selection From 44241bd27eaa357e2b77de810ad347963234af51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Simon?= Date: Thu, 28 Feb 2013 15:02:44 +0100 Subject: [PATCH 3/3] [Finder] applied small changes --- src/Symfony/Component/Finder/Finder.php | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/Finder/Finder.php b/src/Symfony/Component/Finder/Finder.php index 14be36df570ac..f3ba20cf04d9c 100644 --- a/src/Symfony/Component/Finder/Finder.php +++ b/src/Symfony/Component/Finder/Finder.php @@ -105,17 +105,13 @@ public function addAdapter(Adapter\AdapterInterface $adapter, $priority = 0) } /** - * Removes adapter selection adapter to use best one. + * Sets the selected adapter to the best one according to the current platform the code is run on. * * @return Finder The current Finder instance */ public function useBestAdapter() { - $this->adapters = array_map(function (array $properties) { - $properties['selected'] = false; - - return $properties; - }, $this->adapters); + $this->resetAdapterSelection(); return $this->sortAdapters(); } @@ -132,10 +128,10 @@ public function useBestAdapter() public function setAdapter($name) { if (!isset($this->adapters[$name])) { - throw new \InvalidArgumentException(sprintf('There is no registered adapter with "%s" name.', $name)); + throw new \InvalidArgumentException(sprintf('Adapter "%s" does not exist.', $name)); } - $this->useBestAdapter(); + $this->resetAdapterSelection(); $this->adapters[$name]['selected'] = true; return $this->sortAdapters(); @@ -800,4 +796,16 @@ private function buildAdapter(AdapterInterface $adapter) ->setPath($this->paths) ->setNotPath($this->notPaths); } + + /** + * Unselects all adapters. + */ + private function resetAdapterSelection() + { + $this->adapters = array_map(function (array $properties) { + $properties['selected'] = false; + + return $properties; + }, $this->adapters); + } }