From 51f4be2c9a370bf5e78b1deb63a1289176cb3d6a Mon Sep 17 00:00:00 2001 From: everzet Date: Sat, 19 Nov 2011 08:58:54 +0100 Subject: [PATCH 01/15] [Config] updated resources API to be more explicit --- .../Config/Resource/DirectoryResource.php | 39 ++++++++++++++++--- .../Config/Resource/FileResource.php | 26 ++++++++++++- .../Config/Resource/ResourceInterface.php | 14 +++++++ .../Tests/Resource/DirectoryResourceTest.php | 12 ++++++ .../Tests/Resource/FileResourceTest.php | 19 +++++++++ 5 files changed, 102 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/Config/Resource/DirectoryResource.php b/src/Symfony/Component/Config/Resource/DirectoryResource.php index 5ccd204ef9334..021523963e705 100644 --- a/src/Symfony/Component/Config/Resource/DirectoryResource.php +++ b/src/Symfony/Component/Config/Resource/DirectoryResource.php @@ -59,14 +59,14 @@ public function getPattern() } /** - * Returns true if the resource has not been updated since the given timestamp. - * - * @param integer $timestamp The last time the resource was loaded + * Returns resource mtime. * - * @return Boolean true if the resource has not been updated, false otherwise + * @return integer */ - public function isFresh($timestamp) + public function getModificationTime() { + clearstatcache(true, $this->resource); + if (!is_dir($this->resource)) { return false; } @@ -84,10 +84,37 @@ public function isFresh($timestamp) continue; } + clearstatcache(true, (string) $file); $newestMTime = max($file->getMTime(), $newestMTime); } - return $newestMTime < $timestamp; + return $newestMTime; + } + + /** + * Returns true if the resource has not been updated since the given timestamp. + * + * @param integer $timestamp The last time the resource was loaded + * + * @return Boolean true if the resource has not been updated, false otherwise + */ + public function isFresh($timestamp) + { + if (!$this->exists()) { + return false; + } + + return $this->getModificationTime() <= $timestamp; + } + + /** + * Returns true if the resource exists in the filesystem. + * + * @return Boolean + */ + public function exists() + { + return file_exists($this->resource); } public function serialize() diff --git a/src/Symfony/Component/Config/Resource/FileResource.php b/src/Symfony/Component/Config/Resource/FileResource.php index 619f84bcef2ec..2499de68e5f8c 100644 --- a/src/Symfony/Component/Config/Resource/FileResource.php +++ b/src/Symfony/Component/Config/Resource/FileResource.php @@ -52,6 +52,18 @@ public function getResource() return $this->resource; } + /** + * Returns resource mtime. + * + * @return integer + */ + public function getModificationTime() + { + clearstatcache(true, $this->resource); + + return filemtime($this->resource); + } + /** * Returns true if the resource has not been updated since the given timestamp. * @@ -61,11 +73,21 @@ public function getResource() */ public function isFresh($timestamp) { - if (!file_exists($this->resource)) { + if (!$this->exists()) { return false; } - return filemtime($this->resource) < $timestamp; + return $this->getModificationTime() <= $timestamp; + } + + /** + * Returns true if the resource exists in the filesystem. + * + * @return Boolean + */ + public function exists() + { + return file_exists($this->resource); } public function serialize() diff --git a/src/Symfony/Component/Config/Resource/ResourceInterface.php b/src/Symfony/Component/Config/Resource/ResourceInterface.php index d624a573b0067..52b3a0a9d4ba0 100644 --- a/src/Symfony/Component/Config/Resource/ResourceInterface.php +++ b/src/Symfony/Component/Config/Resource/ResourceInterface.php @@ -34,6 +34,20 @@ public function __toString(); */ public function isFresh($timestamp); + /** + * Returns resource mtime. + * + * @return integer + */ + function getModificationTime(); + + /** + * Returns true if the resource exists in the filesystem. + * + * @return Boolean + */ + function exists(); + /** * Returns the resource tied to this Resource. * diff --git a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php index 4bd56b7ca2343..dc6ac2ddb104b 100644 --- a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php +++ b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php @@ -118,8 +118,20 @@ public function testIsFreshDeleteDirectory() $this->assertFalse($resource->isFresh(time()), '->isFresh() returns false if the whole resource is removed'); } + /** + * @covers Symfony\Component\Config\Resource\DirectoryResource::exists + */ + public function testExists() + { + $this->assertTrue($this->resource->exists(), '->exists() returns true if the directory still exist'); + + $this->removeDirectory($this->directory); + $this->assertFalse($this->resource->exists(), '->exists() returns false if the directory does not exist'); + } + /** * @covers Symfony\Component\Config\Resource\DirectoryResource::isFresh + * @covers Symfony\Component\Config\Resource\DirectoryResource::getModificationTime */ public function testIsFreshCreateFileInSubdirectory() { diff --git a/src/Symfony/Component/Config/Tests/Resource/FileResourceTest.php b/src/Symfony/Component/Config/Tests/Resource/FileResourceTest.php index 83c403bbe7c42..1c5fa4253b59d 100644 --- a/src/Symfony/Component/Config/Tests/Resource/FileResourceTest.php +++ b/src/Symfony/Component/Config/Tests/Resource/FileResourceTest.php @@ -49,4 +49,23 @@ public function testIsFresh() $resource = new FileResource('/____foo/foobar'.rand(1, 999999)); $this->assertFalse($resource->isFresh(time()), '->isFresh() returns false if the resource does not exist'); } + + /** + * @covers Symfony\Component\Config\Resource\FileResource::exists + */ + public function testExists() + { + $this->assertTrue($this->resource->exists(), '->exists() returns true if the resource does exist'); + + $resource = new FileResource('/____foo/foobar'.rand(1, 999999)); + $this->assertFalse($resource->exists(), '->exists() returns false if the resource does not exist'); + } + + /** + * @covers Symfony\Component\Config\Resource\FileResource::getModificationTime + */ + public function testGetModificationTime() + { + $this->assertSame(filemtime($this->resource->getResource()), $this->resource->getModificationTime()); + } } From 1e5e3c1713e5bf6330844c2f1736b185d5cf8d57 Mon Sep 17 00:00:00 2001 From: everzet Date: Sat, 19 Nov 2011 10:50:13 +0100 Subject: [PATCH 02/15] [Config] moved DirectoryResource childs retrieving to the special getFilteredChilds method --- .../Config/Resource/DirectoryResource.php | 57 +++++++++++++------ .../Tests/Resource/DirectoryResourceTest.php | 1 + 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/Symfony/Component/Config/Resource/DirectoryResource.php b/src/Symfony/Component/Config/Resource/DirectoryResource.php index 021523963e705..1818f6da9fbb1 100644 --- a/src/Symfony/Component/Config/Resource/DirectoryResource.php +++ b/src/Symfony/Component/Config/Resource/DirectoryResource.php @@ -33,6 +33,46 @@ public function __construct($resource, $pattern = null) $this->pattern = $pattern; } + /** + * Returns the list of filtered file and directory childs of directory resource. + * + * @param Boolean $recursive search for files recursive + * + * @return array An array of files + */ + public function getFilteredChilds($recursive = true) + { + $iterator = $recursive + ? new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) + : new \DirectoryIterator($this->resource); + + $childs = array(); + foreach ($iterator as $file) { + // if regex filtering is enabled only return matching files + if (isset($this->filterRegexList) && $file->isFile()) { + $regexMatched = false; + foreach ($this->filterRegexList as $regex) { + if (preg_match($regex, (string) $file)) { + $regexMatched = true; + } + } + if (!$regexMatched) { + continue; + } + } + + // always monitor directories for changes, except the .. entries + // (otherwise deleted files wouldn't get detected) + if ($file->isDir() && '/..' === substr($file, -3)) { + continue; + } + + $childs[] = $file; + } + + return $childs; + } + /** * Returns a string representation of the Resource. * @@ -66,24 +106,9 @@ public function getPattern() public function getModificationTime() { clearstatcache(true, $this->resource); - - if (!is_dir($this->resource)) { - return false; - } - $newestMTime = filemtime($this->resource); - foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) as $file) { - // if regex filtering is enabled only check matching files - if ($this->pattern && $file->isFile() && !preg_match($this->pattern, $file->getBasename())) { - continue; - } - - // always monitor directories for changes, except the .. entries - // (otherwise deleted files wouldn't get detected) - if ($file->isDir() && '/..' === substr($file, -3)) { - continue; - } + foreach ($this->getFilteredChilds() as $file) { clearstatcache(true, (string) $file); $newestMTime = max($file->getMTime(), $newestMTime); } diff --git a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php index dc6ac2ddb104b..2d94a81f28c07 100644 --- a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php +++ b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php @@ -161,6 +161,7 @@ public function testIsFreshModifySubdirectory() /** * @covers Symfony\Component\Config\Resource\DirectoryResource::isFresh + * @covers Symfony\Component\Config\Resource\DirectoryResource::getFilteredChilds */ public function testFilterRegexListNoMatch() { From fb1d2440dc5463ed6a0b1fa8b2efca11c7ddd238 Mon Sep 17 00:00:00 2001 From: everzet Date: Sat, 19 Nov 2011 23:31:59 +0100 Subject: [PATCH 03/15] [Config] getFilteredChildResources() method added to DirectoryResource --- .../Config/Resource/DirectoryResource.php | 76 ++++++++++++++----- 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/src/Symfony/Component/Config/Resource/DirectoryResource.php b/src/Symfony/Component/Config/Resource/DirectoryResource.php index 1818f6da9fbb1..10424c3c6b4cb 100644 --- a/src/Symfony/Component/Config/Resource/DirectoryResource.php +++ b/src/Symfony/Component/Config/Resource/DirectoryResource.php @@ -36,29 +36,15 @@ public function __construct($resource, $pattern = null) /** * Returns the list of filtered file and directory childs of directory resource. * - * @param Boolean $recursive search for files recursive - * * @return array An array of files */ - public function getFilteredChilds($recursive = true) + public function getFilteredChilds() { - $iterator = $recursive - ? new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) - : new \DirectoryIterator($this->resource); - $childs = array(); - foreach ($iterator as $file) { + foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) as $file) { // if regex filtering is enabled only return matching files - if (isset($this->filterRegexList) && $file->isFile()) { - $regexMatched = false; - foreach ($this->filterRegexList as $regex) { - if (preg_match($regex, (string) $file)) { - $regexMatched = true; - } - } - if (!$regexMatched) { - continue; - } + if (!$this->isFileMatchesFilters($file)) { + continue; } // always monitor directories for changes, except the .. entries @@ -73,6 +59,36 @@ public function getFilteredChilds($recursive = true) return $childs; } + /** + * Returns child resources that matches directory filters. + * + * @return array + */ + public function getFilteredChildResources() + { + $iterator = new \DirectoryIterator($this->resource); + + $resources = array(); + foreach ($iterator as $file) { + // if regex filtering is enabled only return matching files + if (!$this->isFileMatchesFilters($file)) { + continue; + } + + // always monitor directories for changes, except the .. entries + // (otherwise deleted files wouldn't get detected) + if ($file->isDir() && '/..' === substr($file, -3)) { + continue; + } + + $resources[] = $file->isDir() + ? new DirectoryResource((string) $file) + : new FileResource((string) $file); + } + + return $resources; + } + /** * Returns a string representation of the Resource. * @@ -151,4 +167,28 @@ public function unserialize($serialized) { list($this->resource, $this->pattern) = unserialize($serialized); } + + /** + * Checks that passed file matches specified in resource filters. + * + * @param \SplFileInfo $file + * + * @return Boolean + */ + private function isFileMatchesFilters(\SplFileInfo $file) + { + if (isset($this->filterRegexList) && $file->isFile()) { + $regexMatched = false; + foreach ($this->filterRegexList as $regex) { + if (preg_match($regex, (string) $file)) { + $regexMatched = true; + } + } + if (!$regexMatched) { + return false; + } + } + + return true; + } } From 073ca6825f76c0c2d21055ed6f6260ab9faf1741 Mon Sep 17 00:00:00 2001 From: everzet Date: Fri, 25 Nov 2011 12:11:24 +0100 Subject: [PATCH 04/15] [Config] updated DirectoryResource tests --- .../Config/Resource/DirectoryResource.php | 27 +++++------ .../Tests/Resource/DirectoryResourceTest.php | 45 +++++++++++++------ 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/src/Symfony/Component/Config/Resource/DirectoryResource.php b/src/Symfony/Component/Config/Resource/DirectoryResource.php index 10424c3c6b4cb..b36e0372db964 100644 --- a/src/Symfony/Component/Config/Resource/DirectoryResource.php +++ b/src/Symfony/Component/Config/Resource/DirectoryResource.php @@ -43,7 +43,7 @@ public function getFilteredChilds() $childs = array(); foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) as $file) { // if regex filtering is enabled only return matching files - if (!$this->isFileMatchesFilters($file)) { + if ($file->isFile() && !$this->isFileMatchesPattern($file)) { continue; } @@ -71,7 +71,7 @@ public function getFilteredChildResources() $resources = array(); foreach ($iterator as $file) { // if regex filtering is enabled only return matching files - if (!$this->isFileMatchesFilters($file)) { + if ($file->isFile() && !$this->isFileMatchesPattern($file)) { continue; } @@ -109,6 +109,11 @@ public function getResource() return $this->resource; } + /** + * Returns check pattern. + * + * @return mixed + */ public function getPattern() { return $this->pattern; @@ -145,7 +150,7 @@ public function isFresh($timestamp) return false; } - return $this->getModificationTime() <= $timestamp; + return $this->getModificationTime() < $timestamp; } /** @@ -155,7 +160,7 @@ public function isFresh($timestamp) */ public function exists() { - return file_exists($this->resource); + return is_dir($this->resource); } public function serialize() @@ -175,18 +180,10 @@ public function unserialize($serialized) * * @return Boolean */ - private function isFileMatchesFilters(\SplFileInfo $file) + private function isFileMatchesPattern(\SplFileInfo $file) { - if (isset($this->filterRegexList) && $file->isFile()) { - $regexMatched = false; - foreach ($this->filterRegexList as $regex) { - if (preg_match($regex, (string) $file)) { - $regexMatched = true; - } - } - if (!$regexMatched) { - return false; - } + if ($this->pattern) { + return preg_match($this->pattern, $file->getBasename()); } return true; diff --git a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php index 2d94a81f28c07..35f389d3d22ee 100644 --- a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php +++ b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php @@ -118,20 +118,8 @@ public function testIsFreshDeleteDirectory() $this->assertFalse($resource->isFresh(time()), '->isFresh() returns false if the whole resource is removed'); } - /** - * @covers Symfony\Component\Config\Resource\DirectoryResource::exists - */ - public function testExists() - { - $this->assertTrue($this->resource->exists(), '->exists() returns true if the directory still exist'); - - $this->removeDirectory($this->directory); - $this->assertFalse($this->resource->exists(), '->exists() returns false if the directory does not exist'); - } - /** * @covers Symfony\Component\Config\Resource\DirectoryResource::isFresh - * @covers Symfony\Component\Config\Resource\DirectoryResource::getModificationTime */ public function testIsFreshCreateFileInSubdirectory() { @@ -161,7 +149,6 @@ public function testIsFreshModifySubdirectory() /** * @covers Symfony\Component\Config\Resource\DirectoryResource::isFresh - * @covers Symfony\Component\Config\Resource\DirectoryResource::getFilteredChilds */ public function testFilterRegexListNoMatch() { @@ -181,4 +168,36 @@ public function testFilterRegexListMatch() touch($this->directory.'/new.xml', time() + 20); $this->assertFalse($resource->isFresh(time() + 10), '->isFresh() returns false if an new file matching the filter regex is created '); } + + /** + * @covers Symfony\Component\Config\Resource\DirectoryResource::exists + */ + public function testDirectoryExists() + { + $resource = new DirectoryResource($this->directory); + + $this->assertTrue($resource->exists(), '->exists() returns true if directory exists '); + + unlink($this->directory.'/tmp.xml'); + rmdir($this->directory); + + $this->assertFalse($resource->exists(), '->exists() returns false if directory does not exists'); + } + + /** + * @covers Symfony\Component\Config\Resource\DirectoryResource::getModificationTime + */ + public function testGetModificationTime() + { + $resource = new DirectoryResource($this->directory, '/\.(foo|xml)$/'); + + touch($this->directory.'/new.xml', $time = time() + 20); + $this->assertSame($time, $resource->getModificationTime(), '->getModificationTime() returns time of the last modificated resource'); + + touch($this->directory.'/some', time() + 60); + $this->assertSame($time, $resource->getModificationTime(), '->getModificationTime() returns time of last modificated resource, that only matches pattern'); + + touch($this->directory, $time2 = time() + 90); + $this->assertSame($time2, $resource->getModificationTime(), '->getModificationTime() returns modification time of the directory itself'); + } } From 7ea86f9a20f0fb25c72f777230a0b5bc55ea6597 Mon Sep 17 00:00:00 2001 From: everzet Date: Fri, 25 Nov 2011 14:48:15 +0100 Subject: [PATCH 05/15] [Config] update FileResourceTest --- .../Tests/Resource/FileResourceTest.php | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Symfony/Component/Config/Tests/Resource/FileResourceTest.php b/src/Symfony/Component/Config/Tests/Resource/FileResourceTest.php index 1c5fa4253b59d..236dfabf8fb64 100644 --- a/src/Symfony/Component/Config/Tests/Resource/FileResourceTest.php +++ b/src/Symfony/Component/Config/Tests/Resource/FileResourceTest.php @@ -27,7 +27,9 @@ protected function setUp() protected function tearDown() { - unlink($this->file); + if ($this->file) { + unlink($this->file); + } } /** @@ -51,21 +53,24 @@ public function testIsFresh() } /** - * @covers Symfony\Component\Config\Resource\FileResource::exists + * @covers Symfony\Component\Config\Resource\FileResource::getModificationTime */ - public function testExists() + public function testGetModificationTime() { - $this->assertTrue($this->resource->exists(), '->exists() returns true if the resource does exist'); - - $resource = new FileResource('/____foo/foobar'.rand(1, 999999)); - $this->assertFalse($resource->exists(), '->exists() returns false if the resource does not exist'); + touch($this->file, $time = time() + 100); + $this->assertSame($time, $this->resource->getModificationTime()); } /** - * @covers Symfony\Component\Config\Resource\FileResource::getModificationTime + * @covers Symfony\Component\Config\Resource\FileResource::exists */ - public function testGetModificationTime() + public function testExists() { - $this->assertSame(filemtime($this->resource->getResource()), $this->resource->getModificationTime()); + $this->assertTrue($this->resource->exists(), '->exists() returns true if the resource exists'); + + unlink($this->file); + $this->file = null; + + $this->assertFalse($this->resource->exists(), '->exists() returns false if the resource does not exists'); } } From 0c4e7cbb387862a1ae8dbdde56896394f8c2100e Mon Sep 17 00:00:00 2001 From: everzet Date: Tue, 29 Nov 2011 22:51:48 +0100 Subject: [PATCH 06/15] [Config] added new methods and their tests to File and Directory resources --- .../Config/Resource/DirectoryResource.php | 69 +++++++++++----- .../Config/Resource/FileResource.php | 10 +++ .../Config/Resource/ResourceInterface.php | 7 ++ .../Tests/Resource/DirectoryResourceTest.php | 80 +++++++++++++++++++ .../Tests/Resource/FileResourceTest.php | 12 +++ 5 files changed, 156 insertions(+), 22 deletions(-) diff --git a/src/Symfony/Component/Config/Resource/DirectoryResource.php b/src/Symfony/Component/Config/Resource/DirectoryResource.php index b36e0372db964..c2c1e589597f4 100644 --- a/src/Symfony/Component/Config/Resource/DirectoryResource.php +++ b/src/Symfony/Component/Config/Resource/DirectoryResource.php @@ -43,7 +43,7 @@ public function getFilteredChilds() $childs = array(); foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) as $file) { // if regex filtering is enabled only return matching files - if ($file->isFile() && !$this->isFileMatchesPattern($file)) { + if ($file->isFile() && !$this->hasFile($file)) { continue; } @@ -64,14 +64,14 @@ public function getFilteredChilds() * * @return array */ - public function getFilteredChildResources() + public function getFilteredResources() { $iterator = new \DirectoryIterator($this->resource); $resources = array(); foreach ($iterator as $file) { // if regex filtering is enabled only return matching files - if ($file->isFile() && !$this->isFileMatchesPattern($file)) { + if ($file->isFile() && !$this->hasFile($file)) { continue; } @@ -81,9 +81,16 @@ public function getFilteredChildResources() continue; } - $resources[] = $file->isDir() - ? new DirectoryResource((string) $file) - : new FileResource((string) $file); + // if file is dot - continue + if ($file->isDot()) { + continue; + } + + if ($file->isFile()) { + $resources[] = new FileResource($file->getRealPath()); + } elseif ($file->isDir()) { + $resources[] = new DirectoryResource($file->getRealPath()); + } } return $resources; @@ -119,6 +126,30 @@ public function getPattern() return $this->pattern; } + /** + * Checks that passed file exists in resource and matches resource filters. + * + * @param SplFileInfo|string $file + * + * @return Boolean + */ + public function hasFile($file) + { + if (!$file instanceof \SplFileInfo) { + $file = new \SplFileInfo($file); + } + + if (0 !== strpos($file->getRealPath(), realpath($this->resource))) { + return false; + } + + if ($this->pattern) { + return (bool) preg_match($this->pattern, $file->getBasename()); + } + + return true; + } + /** * Returns resource mtime. * @@ -163,6 +194,16 @@ public function exists() return is_dir($this->resource); } + /** + * Returns unique resource ID. + * + * @return string + */ + public function getId() + { + return md5($this->resource.$this->pattern); + } + public function serialize() { return serialize(array($this->resource, $this->pattern)); @@ -172,20 +213,4 @@ public function unserialize($serialized) { list($this->resource, $this->pattern) = unserialize($serialized); } - - /** - * Checks that passed file matches specified in resource filters. - * - * @param \SplFileInfo $file - * - * @return Boolean - */ - private function isFileMatchesPattern(\SplFileInfo $file) - { - if ($this->pattern) { - return preg_match($this->pattern, $file->getBasename()); - } - - return true; - } } diff --git a/src/Symfony/Component/Config/Resource/FileResource.php b/src/Symfony/Component/Config/Resource/FileResource.php index 2499de68e5f8c..9d699dae004ec 100644 --- a/src/Symfony/Component/Config/Resource/FileResource.php +++ b/src/Symfony/Component/Config/Resource/FileResource.php @@ -90,6 +90,16 @@ public function exists() return file_exists($this->resource); } + /** + * Returns unique resource ID. + * + * @return string + */ + public function getId() + { + return md5($this->resource); + } + public function serialize() { return serialize($this->resource); diff --git a/src/Symfony/Component/Config/Resource/ResourceInterface.php b/src/Symfony/Component/Config/Resource/ResourceInterface.php index 52b3a0a9d4ba0..a6fe582c816a9 100644 --- a/src/Symfony/Component/Config/Resource/ResourceInterface.php +++ b/src/Symfony/Component/Config/Resource/ResourceInterface.php @@ -54,4 +54,11 @@ function exists(); * @return mixed The resource */ public function getResource(); + + /** + * Returns unique resource ID. + * + * @return string + */ + function getId(); } diff --git a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php index 35f389d3d22ee..7ce6d1c89753d 100644 --- a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php +++ b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php @@ -50,6 +50,20 @@ protected function removeDirectory($directory) rmdir($directory); } + /** + * @covers Symfony\Component\Config\Resource\DirectoryResource::getId + */ + public function testGetId() + { + $resource1 = new DirectoryResource($this->directory); + $resource2 = new DirectoryResource($this->directory); + $resource3 = new DirectoryResource($this->directory, '/\.(foo|xml)$/'); + + $this->assertNotNull($resource1->getId()); + $this->assertEquals($resource1->getId(), $resource2->getId()); + $this->assertNotEquals($resource1->getId(), $resource3->getId()); + } + /** * @covers Symfony\Component\Config\Resource\DirectoryResource::getResource */ @@ -169,6 +183,72 @@ public function testFilterRegexListMatch() $this->assertFalse($resource->isFresh(time() + 10), '->isFresh() returns false if an new file matching the filter regex is created '); } + /** + * @covers Symfony\Component\Config\Resource\DirectoryResource::hasFile + */ + public function testHasFile() + { + $resource = new DirectoryResource($this->directory, '/\.foo$/'); + + touch($this->directory.'/new.foo', time() + 20); + + $this->assertFalse($resource->hasFile($this->directory.'/tmp.xml')); + $this->assertTrue($resource->hasFile($this->directory.'/new.foo')); + } + + /** + * @covers Symfony\Component\Config\Resource\DirectoryResource::getFilteredChilds + */ + public function testGetFilteredChilds() + { + $resource = new DirectoryResource($this->directory, '/\.(foo|xml)$/'); + + touch($file1 = $this->directory.'/new.xml', time() + 20); + touch($file2 = $this->directory.'/old.foo', time() + 20); + touch($this->directory.'/old', time() + 20); + mkdir($dir = $this->directory.'/sub'); + touch($file3 = $this->directory.'/sub/file.foo', time() + 20); + + $childs = $resource->getFilteredChilds(); + $this->assertSame(5, count($childs)); + + $childs = array_map(function($item) { + return (string) $item; + }, $childs); + + $this->assertContains($file1, $childs); + $this->assertContains($file2, $childs); + $this->assertContains($dir, $childs); + $this->assertContains($this->directory.'/tmp.xml', $childs); + $this->assertContains($file3, $childs); + } + + /** + * @covers Symfony\Component\Config\Resource\DirectoryResource::getFilteredResources + */ + public function testGetFilteredResources() + { + $resource = new DirectoryResource($this->directory, '/\.(foo|xml)$/'); + + touch($file1 = $this->directory.'/new.xml', time() + 20); + touch($file2 = $this->directory.'/old.foo', time() + 20); + touch($this->directory.'/old', time() + 20); + mkdir($dir = $this->directory.'/sub'); + touch($file3 = $this->directory.'/sub/file.foo', time() + 20); + + $resources = $resource->getFilteredResources(); + $this->assertSame(4, count($resources)); + + $childs = array_map(function($item) { + return realpath($item->getResource()); + }, $resources); + + $this->assertContains(realpath($file1), $childs); + $this->assertContains(realpath($file2), $childs); + $this->assertContains(realpath($dir), $childs); + $this->assertContains(realpath($this->directory.'/tmp.xml'), $childs); + } + /** * @covers Symfony\Component\Config\Resource\DirectoryResource::exists */ diff --git a/src/Symfony/Component/Config/Tests/Resource/FileResourceTest.php b/src/Symfony/Component/Config/Tests/Resource/FileResourceTest.php index 236dfabf8fb64..5413c7ed70ad4 100644 --- a/src/Symfony/Component/Config/Tests/Resource/FileResourceTest.php +++ b/src/Symfony/Component/Config/Tests/Resource/FileResourceTest.php @@ -32,6 +32,18 @@ protected function tearDown() } } + /** + * @covers Symfony\Component\Config\Resource\DirectoryResource::getId + */ + public function testGetId() + { + $resource1 = new FileResource($this->file); + $resource2 = new FileResource($this->file); + + $this->assertNotNull($resource1->getId()); + $this->assertEquals($resource1->getId(), $resource2->getId()); + } + /** * @covers Symfony\Component\Config\Resource\FileResource::getResource */ From 49a12d2ee4af5aee6ecd94ef689ea14d818ae57f Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Mon, 5 Dec 2011 13:58:28 +0100 Subject: [PATCH 07/15] [Config] made ResourceInterface extends Serializable --- src/Symfony/Component/Config/Resource/DirectoryResource.php | 2 +- src/Symfony/Component/Config/Resource/FileResource.php | 2 +- src/Symfony/Component/Config/Resource/ResourceInterface.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Config/Resource/DirectoryResource.php b/src/Symfony/Component/Config/Resource/DirectoryResource.php index c2c1e589597f4..0a4c39d1512f2 100644 --- a/src/Symfony/Component/Config/Resource/DirectoryResource.php +++ b/src/Symfony/Component/Config/Resource/DirectoryResource.php @@ -16,7 +16,7 @@ * * @author Fabien Potencier */ -class DirectoryResource implements ResourceInterface, \Serializable +class DirectoryResource implements ResourceInterface { private $resource; private $pattern; diff --git a/src/Symfony/Component/Config/Resource/FileResource.php b/src/Symfony/Component/Config/Resource/FileResource.php index 9d699dae004ec..2ebc39f2daa59 100644 --- a/src/Symfony/Component/Config/Resource/FileResource.php +++ b/src/Symfony/Component/Config/Resource/FileResource.php @@ -18,7 +18,7 @@ * * @author Fabien Potencier */ -class FileResource implements ResourceInterface, \Serializable +class FileResource implements ResourceInterface { private $resource; diff --git a/src/Symfony/Component/Config/Resource/ResourceInterface.php b/src/Symfony/Component/Config/Resource/ResourceInterface.php index a6fe582c816a9..92c74f91b7511 100644 --- a/src/Symfony/Component/Config/Resource/ResourceInterface.php +++ b/src/Symfony/Component/Config/Resource/ResourceInterface.php @@ -16,7 +16,7 @@ * * @author Fabien Potencier */ -interface ResourceInterface +interface ResourceInterface extends \Serializable { /** * Returns a string representation of the Resource. From 0155e26cdd02f91f7e6c1e35ae2e5c90b6a1703c Mon Sep 17 00:00:00 2001 From: everzet Date: Fri, 20 Apr 2012 13:17:55 +0200 Subject: [PATCH 08/15] [Config] skip dots in getFilteredChilds() (fixes test suite on Linux) --- .../Component/Config/Resource/DirectoryResource.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Config/Resource/DirectoryResource.php b/src/Symfony/Component/Config/Resource/DirectoryResource.php index 0a4c39d1512f2..7d31cd3f5c5da 100644 --- a/src/Symfony/Component/Config/Resource/DirectoryResource.php +++ b/src/Symfony/Component/Config/Resource/DirectoryResource.php @@ -40,8 +40,17 @@ public function __construct($resource, $pattern = null) */ public function getFilteredChilds() { + if (!$this->exists()) { + return array(); + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($this->resource, \FilesystemIterator::SKIP_DOTS), + \RecursiveIteratorIterator::SELF_FIRST + ); + $childs = array(); - foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) as $file) { + foreach ($iterator as $file) { // if regex filtering is enabled only return matching files if ($file->isFile() && !$this->hasFile($file)) { continue; From c3fdbc066284e6dd482da028a4810bf1a35f4f8d Mon Sep 17 00:00:00 2001 From: everzet Date: Sat, 9 Jun 2012 13:25:01 +0200 Subject: [PATCH 09/15] [Config] added type prefixes to resource ids Makes sure that directory and the file resources with the same name will have different ids --- src/Symfony/Component/Config/Resource/DirectoryResource.php | 2 +- src/Symfony/Component/Config/Resource/FileResource.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Config/Resource/DirectoryResource.php b/src/Symfony/Component/Config/Resource/DirectoryResource.php index 7d31cd3f5c5da..13ef5d10da22b 100644 --- a/src/Symfony/Component/Config/Resource/DirectoryResource.php +++ b/src/Symfony/Component/Config/Resource/DirectoryResource.php @@ -210,7 +210,7 @@ public function exists() */ public function getId() { - return md5($this->resource.$this->pattern); + return md5('d'.$this->resource.$this->pattern); } public function serialize() diff --git a/src/Symfony/Component/Config/Resource/FileResource.php b/src/Symfony/Component/Config/Resource/FileResource.php index 2ebc39f2daa59..86618f63d143e 100644 --- a/src/Symfony/Component/Config/Resource/FileResource.php +++ b/src/Symfony/Component/Config/Resource/FileResource.php @@ -97,7 +97,7 @@ public function exists() */ public function getId() { - return md5($this->resource); + return md5('f'.$this->resource); } public function serialize() From e43bff8c8783f930daf3b3324776078322fafc3e Mon Sep 17 00:00:00 2001 From: everzet Date: Sat, 9 Jun 2012 13:31:14 +0200 Subject: [PATCH 10/15] [Config] use is_file in FileResource::exists() file resource existence check shouldn't return true if there's directory with same name instead of file. --- src/Symfony/Component/Config/Resource/FileResource.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Config/Resource/FileResource.php b/src/Symfony/Component/Config/Resource/FileResource.php index 86618f63d143e..07564a3470fd1 100644 --- a/src/Symfony/Component/Config/Resource/FileResource.php +++ b/src/Symfony/Component/Config/Resource/FileResource.php @@ -87,7 +87,7 @@ public function isFresh($timestamp) */ public function exists() { - return file_exists($this->resource); + return is_file($this->resource); } /** From 81980d75fdbe0c75ede8abfff35b388c3375da2a Mon Sep 17 00:00:00 2001 From: everzet Date: Wed, 20 Jun 2012 10:19:09 +0200 Subject: [PATCH 11/15] [Config] added existence check to some resource methods * fixed DELETED event when starting to watch a file that does not exist yet * fixed files that are deleted and then re-created Conflicts: src/Symfony/Component/ResourceWatcher/StateChecker/ResourceStateChecker.php tests/Symfony/Tests/Component/ResourceWatcher/StateChecker/DirectoryStateCheckerTest.php tests/Symfony/Tests/Component/ResourceWatcher/StateChecker/FileStateCheckerTest.php --- .../Component/Config/Resource/DirectoryResource.php | 8 ++++++++ src/Symfony/Component/Config/Resource/FileResource.php | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Config/Resource/DirectoryResource.php b/src/Symfony/Component/Config/Resource/DirectoryResource.php index 13ef5d10da22b..474fbb3078bcd 100644 --- a/src/Symfony/Component/Config/Resource/DirectoryResource.php +++ b/src/Symfony/Component/Config/Resource/DirectoryResource.php @@ -75,6 +75,10 @@ public function getFilteredChilds() */ public function getFilteredResources() { + if (!$this->exists()) { + return array(); + } + $iterator = new \DirectoryIterator($this->resource); $resources = array(); @@ -166,6 +170,10 @@ public function hasFile($file) */ public function getModificationTime() { + if (!$this->exists()) { + return -1; + } + clearstatcache(true, $this->resource); $newestMTime = filemtime($this->resource); diff --git a/src/Symfony/Component/Config/Resource/FileResource.php b/src/Symfony/Component/Config/Resource/FileResource.php index 07564a3470fd1..259db3c75de89 100644 --- a/src/Symfony/Component/Config/Resource/FileResource.php +++ b/src/Symfony/Component/Config/Resource/FileResource.php @@ -29,7 +29,7 @@ class FileResource implements ResourceInterface */ public function __construct($resource) { - $this->resource = realpath($resource); + $this->resource = file_exists($resource) ? realpath($resource) : $resource; } /** @@ -59,6 +59,10 @@ public function getResource() */ public function getModificationTime() { + if (!$this->exists()) { + return -1; + } + clearstatcache(true, $this->resource); return filemtime($this->resource); From 1ad8e0ea4652b78dfe1a2faaf3dfb473bd9f6808 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Sat, 13 Oct 2012 21:04:54 +0200 Subject: [PATCH 12/15] Fixed the CS --- src/Symfony/Component/Config/Resource/DirectoryResource.php | 2 +- src/Symfony/Component/Config/Resource/ResourceInterface.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Config/Resource/DirectoryResource.php b/src/Symfony/Component/Config/Resource/DirectoryResource.php index 474fbb3078bcd..642605e21a19c 100644 --- a/src/Symfony/Component/Config/Resource/DirectoryResource.php +++ b/src/Symfony/Component/Config/Resource/DirectoryResource.php @@ -142,7 +142,7 @@ public function getPattern() /** * Checks that passed file exists in resource and matches resource filters. * - * @param SplFileInfo|string $file + * @param SplFileInfo|string $file * * @return Boolean */ diff --git a/src/Symfony/Component/Config/Resource/ResourceInterface.php b/src/Symfony/Component/Config/Resource/ResourceInterface.php index 92c74f91b7511..f4030ed2e7408 100644 --- a/src/Symfony/Component/Config/Resource/ResourceInterface.php +++ b/src/Symfony/Component/Config/Resource/ResourceInterface.php @@ -39,14 +39,14 @@ public function isFresh($timestamp); * * @return integer */ - function getModificationTime(); + public function getModificationTime(); /** * Returns true if the resource exists in the filesystem. * * @return Boolean */ - function exists(); + public function exists(); /** * Returns the resource tied to this Resource. @@ -60,5 +60,5 @@ public function getResource(); * * @return string */ - function getId(); + public function getId(); } From c8efa9e55170be74ee164a19abb3d81ced5ea326 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Sat, 13 Oct 2012 21:42:32 +0200 Subject: [PATCH 13/15] [Config] Fixed the tests for Windows --- .../Tests/Resource/DirectoryResourceTest.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php index 7ce6d1c89753d..cc0e420a48418 100644 --- a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php +++ b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php @@ -38,13 +38,13 @@ protected function removeDirectory($directory) { $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory), \RecursiveIteratorIterator::CHILD_FIRST); foreach ($iterator as $path) { - if (preg_match('#[/\\\\]\.\.?$#', $path->__toString())) { + if (preg_match('#[/\\\\]\.\.?$#', (string) $path)) { continue; } if ($path->isDir()) { - rmdir($path->__toString()); + rmdir((string) $path); } else { - unlink($path->__toString()); + unlink((string) $path); } } rmdir($directory); @@ -213,14 +213,14 @@ public function testGetFilteredChilds() $this->assertSame(5, count($childs)); $childs = array_map(function($item) { - return (string) $item; + return $item->getRealPath(); }, $childs); - $this->assertContains($file1, $childs); - $this->assertContains($file2, $childs); - $this->assertContains($dir, $childs); - $this->assertContains($this->directory.'/tmp.xml', $childs); - $this->assertContains($file3, $childs); + $this->assertContains(realpath($file1), $childs); + $this->assertContains(realpath($file2), $childs); + $this->assertContains(realpath($dir), $childs); + $this->assertContains(realpath($this->directory.'/tmp.xml'), $childs); + $this->assertContains(realpath($file3), $childs); } /** From cca8598a66c2f5fa3ca1bb7f91e196c67d2d55b0 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Sat, 13 Oct 2012 21:49:36 +0200 Subject: [PATCH 14/15] Renamed childs to children --- .../Config/Resource/DirectoryResource.php | 12 +++---- .../Tests/Resource/DirectoryResourceTest.php | 32 +++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/Symfony/Component/Config/Resource/DirectoryResource.php b/src/Symfony/Component/Config/Resource/DirectoryResource.php index 642605e21a19c..9f5c98310a2b7 100644 --- a/src/Symfony/Component/Config/Resource/DirectoryResource.php +++ b/src/Symfony/Component/Config/Resource/DirectoryResource.php @@ -34,11 +34,11 @@ public function __construct($resource, $pattern = null) } /** - * Returns the list of filtered file and directory childs of directory resource. + * Returns the list of filtered file and directory children of directory resource. * * @return array An array of files */ - public function getFilteredChilds() + public function getFilteredChildren() { if (!$this->exists()) { return array(); @@ -49,7 +49,7 @@ public function getFilteredChilds() \RecursiveIteratorIterator::SELF_FIRST ); - $childs = array(); + $children = array(); foreach ($iterator as $file) { // if regex filtering is enabled only return matching files if ($file->isFile() && !$this->hasFile($file)) { @@ -62,10 +62,10 @@ public function getFilteredChilds() continue; } - $childs[] = $file; + $children[] = $file; } - return $childs; + return $children; } /** @@ -177,7 +177,7 @@ public function getModificationTime() clearstatcache(true, $this->resource); $newestMTime = filemtime($this->resource); - foreach ($this->getFilteredChilds() as $file) { + foreach ($this->getFilteredChildren() as $file) { clearstatcache(true, (string) $file); $newestMTime = max($file->getMTime(), $newestMTime); } diff --git a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php index cc0e420a48418..dea3bfaedf0f6 100644 --- a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php +++ b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php @@ -197,9 +197,9 @@ public function testHasFile() } /** - * @covers Symfony\Component\Config\Resource\DirectoryResource::getFilteredChilds + * @covers Symfony\Component\Config\Resource\DirectoryResource::getFilteredChildren */ - public function testGetFilteredChilds() + public function testGetFilteredChildren() { $resource = new DirectoryResource($this->directory, '/\.(foo|xml)$/'); @@ -209,18 +209,18 @@ public function testGetFilteredChilds() mkdir($dir = $this->directory.'/sub'); touch($file3 = $this->directory.'/sub/file.foo', time() + 20); - $childs = $resource->getFilteredChilds(); - $this->assertSame(5, count($childs)); + $children = $resource->getFilteredChildren(); + $this->assertSame(5, count($children)); - $childs = array_map(function($item) { + $children = array_map(function($item) { return $item->getRealPath(); - }, $childs); + }, $children); - $this->assertContains(realpath($file1), $childs); - $this->assertContains(realpath($file2), $childs); - $this->assertContains(realpath($dir), $childs); - $this->assertContains(realpath($this->directory.'/tmp.xml'), $childs); - $this->assertContains(realpath($file3), $childs); + $this->assertContains(realpath($file1), $children); + $this->assertContains(realpath($file2), $children); + $this->assertContains(realpath($dir), $children); + $this->assertContains(realpath($this->directory.'/tmp.xml'), $children); + $this->assertContains(realpath($file3), $children); } /** @@ -239,14 +239,14 @@ public function testGetFilteredResources() $resources = $resource->getFilteredResources(); $this->assertSame(4, count($resources)); - $childs = array_map(function($item) { + $children = array_map(function($item) { return realpath($item->getResource()); }, $resources); - $this->assertContains(realpath($file1), $childs); - $this->assertContains(realpath($file2), $childs); - $this->assertContains(realpath($dir), $childs); - $this->assertContains(realpath($this->directory.'/tmp.xml'), $childs); + $this->assertContains(realpath($file1), $children); + $this->assertContains(realpath($file2), $children); + $this->assertContains(realpath($dir), $children); + $this->assertContains(realpath($this->directory.'/tmp.xml'), $children); } /** From 0fc4282c0b49d4bb0d896c5bd9cf8d2393f51145 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Sat, 13 Oct 2012 22:05:21 +0200 Subject: [PATCH 15/15] Replaced assertion by assertCount --- .../Component/Config/Tests/Resource/DirectoryResourceTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php index dea3bfaedf0f6..bd3b6cf86831d 100644 --- a/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php +++ b/src/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php @@ -210,7 +210,7 @@ public function testGetFilteredChildren() touch($file3 = $this->directory.'/sub/file.foo', time() + 20); $children = $resource->getFilteredChildren(); - $this->assertSame(5, count($children)); + $this->assertCount(5, $children); $children = array_map(function($item) { return $item->getRealPath(); @@ -237,7 +237,7 @@ public function testGetFilteredResources() touch($file3 = $this->directory.'/sub/file.foo', time() + 20); $resources = $resource->getFilteredResources(); - $this->assertSame(4, count($resources)); + $this->assertCount(4, $resources); $children = array_map(function($item) { return realpath($item->getResource());