From 1efeb274b1d25cdb589d811e9330ed3c6b744a48 Mon Sep 17 00:00:00 2001 From: Yaroslav Date: Wed, 19 Dec 2018 14:01:34 +0500 Subject: [PATCH 1/9] Allow override files and development mode settings For https://github.com/slowprog/CopyFile/issues/10#issue-392494774 --- ScriptHandler.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/ScriptHandler.php b/ScriptHandler.php index b477360..f513e68 100644 --- a/ScriptHandler.php +++ b/ScriptHandler.php @@ -15,12 +15,13 @@ class ScriptHandler public static function copy(Event $event) { $extras = $event->getComposer()->getPackage()->getExtra(); + $extraField = $event->isDevMode() && isset($extras['copy-file-dev']) ? 'copy-file-dev' : 'copy-file'; - if (!isset($extras['copy-file'])) { + if (!isset($extras[$extraField])) { throw new \InvalidArgumentException('The dirs or files needs to be configured through the extra.copy-file setting.'); } - $files = $extras['copy-file']; + $files = $extras[$extraField]; if ($files === array_values($files)) { throw new \InvalidArgumentException('The extra.copy-file must be hash like "{: }".'); @@ -30,6 +31,12 @@ public static function copy(Event $event) $io = $event->getIO(); foreach ($files as $from => $to) { + // check the overwrite newer files disable flag (? in end of path) + $overwriteNewerFiles = substr($to, -1) != '?'; + if (!$overwriteNewerFiles) { + $to = substr($to, 0, -1); + } + // Check the renaming of file for direct moving (file-to-file) $isRenameFile = substr($to, -1) != '/' && !is_dir($from); @@ -59,7 +66,7 @@ public static function copy(Event $event) $dest = sprintf('%s/%s', $to, $file->getRelativePathname()); try { - $fs->copy($file, $dest); + $fs->copy($file, $dest, $overwriteNewerFiles); } catch (IOException $e) { throw new \InvalidArgumentException(sprintf('Could not copy %s', $file->getBaseName())); } @@ -67,9 +74,9 @@ public static function copy(Event $event) } else { try { if ($isRenameFile) { - $fs->copy($from, $to); + $fs->copy($from, $to, $overwriteNewerFiles); } else { - $fs->copy($from, $to.'/'.basename($from)); + $fs->copy($from, $to.'/'.basename($from), $overwriteNewerFiles); } } catch (IOException $e) { throw new \InvalidArgumentException(sprintf('Could not copy %s', $from)); From 0f592a32cf5f6193374a4b040488c0e967932f0f Mon Sep 17 00:00:00 2001 From: Yaroslav Date: Tue, 25 Dec 2018 16:12:37 +0500 Subject: [PATCH 2/9] Append new features description --- README.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/README.md b/README.md index 41982bc..ab6e89f 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,39 @@ For example copy fonts: } ``` +In a development you may use `-dev` suffix. For example copy non-minified in development and minified in production: + +``` +{ + "require":{ + "twbs/bootstrap": "~3.3", + "slowprog/composer-copy-file": "~0.2" + }, + "scripts": { + "post-install-cmd": [ + "SlowProg\\CopyFile\\ScriptHandler::copy" + ], + "post-update-cmd": [ + "SlowProg\\CopyFile\\ScriptHandler::copy" + ] + }, + "extra": { + "copy-file": { + "vendor/twbs/bootstrap/dist/js/bootstrap.min.js": "web/js/bootstrap.js" + }, + "copy-file-dev": { + "vendor/twbs/bootstrap/dist/js/bootstrap.js": "web/js/bootstrap.js" + } + } +} +``` + ## Use cases You need to be careful when using a last slash. The file-destination is different from the directory-destination with the slash. +If in destination directory already exists copy of file, then it will be override. To overwrite only older files append `?` in end of destination path. + Source directory hierarchy: ``` @@ -104,3 +133,33 @@ dir/ file1.txt file_rename.txt ``` + +4. Override only older files: + + ``` + { + "extra": { + "copy-file": { + "dir/subdir/": "web/other/?" + } + } + } + ``` + + Preset: + + ``` + web/ + other/ + file1.txt - Recently modified + file2.txt - Old rotten file + ``` + + Result: + + ``` + web/ + other/ + file1.txt - Not changed + file2.txt - Replaced + ``` \ No newline at end of file From 6f4c134f7ccea1430fd92aa8995ff56f89cd749d Mon Sep 17 00:00:00 2001 From: Yaroslav Date: Wed, 26 Dec 2018 14:44:01 +0500 Subject: [PATCH 3/9] Add test case and Travis --- .travis.yml | 46 ++++++++++ README.md | 4 + composer.json | 12 ++- phpunit.xml | 2 +- tests/CopyFileTest.php | 187 +++++++++++------------------------------ tests/TestCase.php | 114 +++++++++++++++++++++++++ 6 files changed, 226 insertions(+), 139 deletions(-) create mode 100644 .travis.yml create mode 100644 tests/TestCase.php diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..1298cce --- /dev/null +++ b/.travis.yml @@ -0,0 +1,46 @@ +language: php + +dist: trusty +root: false + +env: + global: + - setup=stable + +cache: + directories: + - $HOME/.composer/cache + +matrix: + fast_finish: true + allow_failures: + - php: hhvm + include: + - php: 5.5 + - php: 5.5 + env: setup=lowest + - php: 5.6 + - php: 5.6 + env: setup=lowest + - php: 7.0 + - php: 7.0 + env: setup=lowest + - php: 7.1 + - php: 7.1 + env: setup=lowest + - php: 7.2 + - php: 7.2 + env: setup=lowest + - php: hhvm + - php: hhvm + env: setup=lowest + +before_install: + - travis_retry composer self-update + - travis_retry composer config -g github-oauth.github.com "$GITHUB_TOKEN" + +install: + - if [[ $setup = 'stable' ]]; then travis_retry composer update --prefer-dist --no-interaction --prefer-stable --no-suggest; fi + - if [[ $setup = 'lowest' ]]; then travis_retry composer update --prefer-dist --no-interaction --prefer-lowest --prefer-stable --no-suggest; fi + +script: composer run test diff --git a/README.md b/README.md index ab6e89f..487962a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +[![Build Status](https://travis-ci.org/lar-dragon/CopyFile.svg?branch=master)](https://travis-ci.org/lar-dragon/CopyFile) +[![Latest Stable Version](https://poser.pugx.org/slowprog/composer-copy-file/version)](https://packagist.org/packages/slowprog/composer-copy-file) +[![Total Downloads](https://poser.pugx.org/slowprog/composer-copy-file/downloads)](https://packagist.org/packages/slowprog/composer-copy-file) + # Composer copy file Composer script copying your files after install. Supports copying of entire directories, individual files and complex nested directories. diff --git a/composer.json b/composer.json index 3121f28..a2455b7 100644 --- a/composer.json +++ b/composer.json @@ -11,16 +11,24 @@ } ], "require": { - "php": ">=5.3.3" + "php": ">=5.5" }, "require-dev": { "composer/composer": "1.0.*@dev", "symfony/filesystem": "~2.7", "symfony/finder": "~2.7", "phpunit/phpunit": "~5.0", - "mikey179/vfsStream": "~1" + "mikey179/vfsStream": "~1", + "php-mock/php-mock-phpunit": "~1" }, "autoload": { "psr-4": { "SlowProg\\CopyFile\\": "" } + }, + "autoload-dev": { + "psr-4": { "SlowProg\\CopyFile\\": "" }, + "psr-0": { "": "tests/" } + }, + "scripts": { + "test": "phpunit --verbose" } } diff --git a/phpunit.xml b/phpunit.xml index 9f720ad..4bb4964 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -12,7 +12,7 @@ syntaxCheck="false"> - ./tests/ + ./tests/ diff --git a/tests/CopyFileTest.php b/tests/CopyFileTest.php index 4b212f7..7102a87 100644 --- a/tests/CopyFileTest.php +++ b/tests/CopyFileTest.php @@ -1,64 +1,51 @@ getFilesystem(); - - $this->assertTrue($root->hasChild('from/file1')); - $this->assertTrue($root->hasChild('from/file2')); + $this->assertTrue($this->root->hasChild('from/file1')); + $this->assertTrue($this->root->hasChild('from/file2')); - $this->assertTrue($root->hasChild('file3')); + $this->assertTrue($this->root->hasChild('file3')); - $this->assertTrue($root->hasChild('from_complex/file4')); - $this->assertTrue($root->hasChild('from_complex/sub_dir/file5')); + $this->assertTrue($this->root->hasChild('from_complex/file4')); + $this->assertTrue($this->root->hasChild('from_complex/sub_dir/file5')); } public function testCopyDirToDir() { - $root = $this->getFilesystem(); - - $this->assertFalse($root->hasChild('to/file1')); - $this->assertFalse($root->hasChild('to/file2')); + $this->assertFalse($this->root->hasChild('to/file1')); + $this->assertFalse($this->root->hasChild('to/file2')); ScriptHandler::copy($this->getEventMock([ vfsStream::url('root/from')=> vfsStream::url('root/to') ])); - $this->assertTrue($root->hasChild('to/file1')); - $this->assertTrue($root->hasChild('to/file2')); + $this->assertTrue($this->root->hasChild('to/file1')); + $this->assertTrue($this->root->hasChild('to/file2')); } public function testCopyDirToNotExistsDir() { - $root = $this->getFilesystem(); - - $this->assertFalse($root->hasChild('not_exists')); + $this->assertFalse($this->root->hasChild('not_exists')); ScriptHandler::copy($this->getEventMock([ vfsStream::url('root/from')=> vfsStream::url('root/not_exists') ])); - $this->assertTrue($root->hasChild('not_exists')); - $this->assertTrue($root->hasChild('not_exists/file1')); - $this->assertTrue($root->hasChild('not_exists/file2')); + $this->assertTrue($this->root->hasChild('not_exists')); + $this->assertTrue($this->root->hasChild('not_exists/file1')); + $this->assertTrue($this->root->hasChild('not_exists/file2')); } public function testCopyFromNotExistsDir() { - $root = $this->getFilesystem(); - $this->expectException(InvalidArgumentException::class); ScriptHandler::copy($this->getEventMock([ @@ -68,8 +55,6 @@ public function testCopyFromNotExistsDir() public function testCopyDirToFile() { - $root = $this->getFilesystem(); - $this->expectException(InvalidArgumentException::class); ScriptHandler::copy($this->getEventMock([ @@ -79,144 +64,74 @@ public function testCopyDirToFile() public function testCopyFileToDir() { - $root = $this->getFilesystem(); - - $this->assertFalse($root->hasChild('to/file3')); + $this->assertFalse($this->root->hasChild('to/file3')); ScriptHandler::copy($this->getEventMock([ vfsStream::url('root/file3')=> vfsStream::url('root/to/') ])); - $this->assertTrue($root->hasChild('to/file3')); + $this->assertTrue($this->root->hasChild('to/file3')); } public function testCopyFileToFile() { - $root = $this->getFilesystem(); - - $this->assertFalse($root->hasChild('to/file_new')); + $this->assertFalse($this->root->hasChild('to/file_new')); ScriptHandler::copy($this->getEventMock([ vfsStream::url('root/file3')=> vfsStream::url('root/to/file_new') ])); - $this->assertTrue($root->hasChild('to/file_new')); + $this->assertTrue($this->root->hasChild('to/file_new')); } public function testCopyFromComplexDir() { - $root = $this->getFilesystem(); - - $this->assertFalse($root->hasChild('to/file4')); - $this->assertFalse($root->hasChild('to/sub_dir/file5')); - $this->assertFalse($root->hasChild('to/git_keep_dir')); + $this->assertFalse($this->root->hasChild('to/file4')); + $this->assertFalse($this->root->hasChild('to/sub_dir/file5')); + $this->assertFalse($this->root->hasChild('to/git_keep_dir')); ScriptHandler::copy($this->getEventMock([ vfsStream::url('root/from_complex')=> vfsStream::url('root/to') ])); - $this->assertTrue($root->hasChild('to/file4')); - $this->assertTrue($root->hasChild('to/sub_dir/file5')); - $this->assertTrue($root->hasChild('to/git_keep_dir')); + $this->assertTrue($this->root->hasChild('to/file4')); + $this->assertTrue($this->root->hasChild('to/sub_dir/file5')); + $this->assertTrue($this->root->hasChild('to/git_keep_dir')); } - public function testConfigError() + public function testRewriteExists() { - $root = $this->getFilesystem(); + $this->root->lastModified(0); + $this->root->getChild('dynamic_dir/file1')->lastModified(1); - $this->expectException(InvalidArgumentException::class); + $exchanged = vfsStream::url('root/dynamic_dir/file1'); + $unaltered = vfsStream::url('root/dynamic_dir/file2'); - ScriptHandler::copy($this->getEventMock([])); - ScriptHandler::copy($this->getEventMock(['to', 'from', 'file3'])); - ScriptHandler::copy($this->getEventMock(null)); - ScriptHandler::copy($this->getEventMock('some string')); - } + // allow filemtime check apply for vfs protocol + $this->getFunctionMock('Symfony\Component\Filesystem', 'parse_url') + ->expects($this->any())->willReturn(null); - /** - * @return \PHPUnit_Framework_MockObject_MockObject - */ - private function getEventMock($copyFileConfig) - { - $event = $this->getMockBuilder('Composer\Script\Event') - ->disableOriginalConstructor() - ->getMock(); + // preset filemtime check + $this->getFunctionMock('Symfony\Component\Filesystem', 'filemtime') + ->expects($this->any())->willReturnCallback(function ($filename) use ($unaltered) { + return $filename === $unaltered ? 1 : 2; + }); - $event - ->expects($this->once()) - ->method('getComposer') - ->will($this->returnValue($this->getComposerMock($copyFileConfig))); + ScriptHandler::copy($this->getEventMock(array( + vfsStream::url('root/from') => vfsStream::url('root/dynamic_dir') . '?' + ))); - $event - ->method('getIO') - ->will($this->returnValue($this->createMock('\Composer\IO\IOInterface'))); - - return $event; - } - - /** - * @return \PHPUnit_Framework_MockObject_MockObject - */ - private function getComposerMock($copyFileConfig) - { - $package = $this->getPackageMock($copyFileConfig); - - $composer = $this->getMockBuilder('Composer\Composer') - ->disableOriginalConstructor() - ->getMock(); - - $composer - ->expects($this->once()) - ->method('getPackage') - ->will($this->returnValue($package)); - - return $composer; + $this->assertFileNotEquals(vfsStream::url('root/from/file1'), $exchanged); + $this->assertFileEquals(vfsStream::url('root/from/file2'), $unaltered); } - /** - * @return \PHPUnit_Framework_MockObject_MockObject - */ - private function getPackageMock($copyFileConfig) + public function testConfigError() { - $extra = null; - - if (!is_null($copyFileConfig)) { - $extra = [ - 'copy-file' => $copyFileConfig, - ]; - } - - $package = $this->getMockBuilder('Composer\Package\RootPackageInterface') - ->disableOriginalConstructor() - ->getMock(); - - $package - ->expects($this->once()) - ->method('getExtra') - ->will($this->returnValue($extra)); - - return $package; - } + $this->expectException(InvalidArgumentException::class); - private function getFilesystem() - { - $structure = [ - 'from' => [ - 'file1' => 'Some content', - 'file2' => 'Some content', - ], - 'to' => [], - 'file3' => 'Some content', - 'from_complex' => [ - 'file4' => 'Some content', - 'sub_dir' => [ - 'file5' => 'Some content', - ], - 'git_keep_dir' => [ - '.gitkeep' => '', - ], - ], - ]; - - return vfsStream::setup('root', null, $structure); + ScriptHandler::copy($this->getEventMock([])); + ScriptHandler::copy($this->getEventMock(['to', 'from', 'file3'])); + ScriptHandler::copy($this->getEventMock(null)); + ScriptHandler::copy($this->getEventMock('some string')); } } diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..e41f3b8 --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,114 @@ +root = $this->getFilesystem(); + } + + /** + * @param array|string|null $copyFileConfig + * @return \PHPUnit_Framework_MockObject_MockObject|\Composer\Script\Event + */ + protected function getEventMock($copyFileConfig) + { + $event = $this->getMockBuilder('\Composer\Script\Event') + ->disableOriginalConstructor() + ->getMock(); + + $event + ->expects($this->once()) + ->method('getComposer') + ->will($this->returnValue($this->getComposerMock($copyFileConfig))); + + $event + ->method('getIO') + ->will($this->returnValue($this->createMock('\Composer\IO\IOInterface'))); + + return $event; + } + + /** + * @param array|string|null $copyFileConfig + * @return \PHPUnit_Framework_MockObject_MockObject|\Composer\Composer + */ + protected function getComposerMock($copyFileConfig) + { + $package = $this->getPackageMock($copyFileConfig); + + $composer = $this->getMockBuilder('\Composer\Composer') + ->disableOriginalConstructor() + ->getMock(); + + $composer + ->expects($this->once()) + ->method('getPackage') + ->will($this->returnValue($package)); + + return $composer; + } + + /** + * @param array|string|null $copyFileConfig + * @return \PHPUnit_Framework_MockObject_MockObject|\Composer\Package\RootPackageInterface + */ + protected function getPackageMock($copyFileConfig) + { + $extra = null; + + if (!is_null($copyFileConfig)) { + $extra = array( + 'copy-file' => $copyFileConfig, + ); + } + + $package = $this->getMockBuilder('\Composer\Package\RootPackageInterface') + ->disableOriginalConstructor() + ->getMock(); + + $package + ->expects($this->once()) + ->method('getExtra') + ->will($this->returnValue($extra)); + + return $package; + } + + /** + * @return \org\bovigo\vfs\vfsStreamDirectory + */ + protected function getFilesystem() + { + $structure = array( + 'from' => array( + 'file1' => 'Some content', + 'file2' => 'Some content', + ), + 'to' => array(), + 'file3' => 'Some content', + 'from_complex' => array( + 'file4' => 'Some content', + 'sub_dir' => array( + 'file5' => 'Some content', + ), + 'git_keep_dir' => array( + '.gitkeep' => '', + ), + ), + 'dynamic_dir' => array( + 'file1' => 'Exchanged content', + 'file2' => 'Unaltered content', + ), + ); + + return vfsStream::setup('root', null, $structure); + } +} \ No newline at end of file From 305d780088301d669dc62d432bce1f6f8c95b845 Mon Sep 17 00:00:00 2001 From: Yaroslav Date: Wed, 26 Dec 2018 14:56:27 +0500 Subject: [PATCH 4/9] Up php version --- .travis.yml | 3 --- composer.json | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1298cce..9b2611d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,9 +16,6 @@ matrix: allow_failures: - php: hhvm include: - - php: 5.5 - - php: 5.5 - env: setup=lowest - php: 5.6 - php: 5.6 env: setup=lowest diff --git a/composer.json b/composer.json index a2455b7..0e75d9c 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ } ], "require": { - "php": ">=5.5" + "php": ">=5.6" }, "require-dev": { "composer/composer": "1.0.*@dev", From c229c3a55757444bc07e27912df60e93c56e6bb6 Mon Sep 17 00:00:00 2001 From: Yaroslav Date: Wed, 26 Dec 2018 15:37:52 +0500 Subject: [PATCH 5/9] Up phpunit version --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 0e75d9c..35f5bd5 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "composer/composer": "1.0.*@dev", "symfony/filesystem": "~2.7", "symfony/finder": "~2.7", - "phpunit/phpunit": "~5.0", + "phpunit/phpunit": "5.7.6", "mikey179/vfsStream": "~1", "php-mock/php-mock-phpunit": "~1" }, @@ -25,7 +25,6 @@ "psr-4": { "SlowProg\\CopyFile\\": "" } }, "autoload-dev": { - "psr-4": { "SlowProg\\CopyFile\\": "" }, "psr-0": { "": "tests/" } }, "scripts": { From 6ee12731a864208b2ee29638dbd4cb4d5a02910b Mon Sep 17 00:00:00 2001 From: Yaroslav Date: Wed, 26 Dec 2018 16:06:17 +0500 Subject: [PATCH 6/9] Up phpunit version --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 35f5bd5..ac54078 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ "composer/composer": "1.0.*@dev", "symfony/filesystem": "~2.7", "symfony/finder": "~2.7", - "phpunit/phpunit": "5.7.6", + "phpunit/phpunit": "5.7.27", "mikey179/vfsStream": "~1", "php-mock/php-mock-phpunit": "~1" }, From 17e152cd93629d4d6f26587947d9f93fa13e194d Mon Sep 17 00:00:00 2001 From: Yaroslav Date: Wed, 26 Dec 2018 16:17:27 +0500 Subject: [PATCH 7/9] Disable self-update on hhvm --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9b2611d..500e490 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ root: false env: global: - setup=stable + - update=self cache: directories: @@ -29,11 +30,12 @@ matrix: - php: 7.2 env: setup=lowest - php: hhvm + env: update=nothing - php: hhvm - env: setup=lowest + env: update=nothing setup=lowest before_install: - - travis_retry composer self-update + - if [[ $update = 'self' ]]; then travis_retry composer self-update; fi - travis_retry composer config -g github-oauth.github.com "$GITHUB_TOKEN" install: From 4a4bcd2c57bb0b1e4d99bf1e1375c49a4d25820d Mon Sep 17 00:00:00 2001 From: Yaroslav Date: Wed, 26 Dec 2018 16:25:39 +0500 Subject: [PATCH 8/9] Remove empty point in json --- .travis.yml | 6 ++---- composer.json | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 500e490..9b2611d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,6 @@ root: false env: global: - setup=stable - - update=self cache: directories: @@ -30,12 +29,11 @@ matrix: - php: 7.2 env: setup=lowest - php: hhvm - env: update=nothing - php: hhvm - env: update=nothing setup=lowest + env: setup=lowest before_install: - - if [[ $update = 'self' ]]; then travis_retry composer self-update; fi + - travis_retry composer self-update - travis_retry composer config -g github-oauth.github.com "$GITHUB_TOKEN" install: diff --git a/composer.json b/composer.json index ac54078..52b0bb7 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "psr-4": { "SlowProg\\CopyFile\\": "" } }, "autoload-dev": { - "psr-0": { "": "tests/" } + "classmap": [ "tests/" ] }, "scripts": { "test": "phpunit --verbose" From f5d0e38b0fbb4939c464ef89cf6a4cc44b38cae7 Mon Sep 17 00:00:00 2001 From: Yaroslav Date: Wed, 26 Dec 2018 16:49:11 +0500 Subject: [PATCH 9/9] Avoid coal sock --- README.md | 2 +- tests/TestCase.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 487962a..b1ac001 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.org/lar-dragon/CopyFile.svg?branch=master)](https://travis-ci.org/lar-dragon/CopyFile) +[![Build Status](https://travis-ci.org/slowprog/CopyFile.svg?branch=master)](https://travis-ci.org/slowprog/CopyFile) [![Latest Stable Version](https://poser.pugx.org/slowprog/composer-copy-file/version)](https://packagist.org/packages/slowprog/composer-copy-file) [![Total Downloads](https://poser.pugx.org/slowprog/composer-copy-file/downloads)](https://packagist.org/packages/slowprog/composer-copy-file) diff --git a/tests/TestCase.php b/tests/TestCase.php index e41f3b8..d92f7f6 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -2,7 +2,7 @@ use \org\bovigo\vfs\vfsStream; -class TestCase extends PHPUnit_Framework_TestCase +abstract class TestCase extends PHPUnit_Framework_TestCase { /** * @var \org\bovigo\vfs\vfsStreamDirectory