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()); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy