diff --git a/.formatter.yml b/.formatter.yml index c90998a..8fc3d29 100644 --- a/.formatter.yml +++ b/.formatter.yml @@ -3,4 +3,15 @@ use-sort: - _main group-type: each sort-type: alph - sort-direction: asc \ No newline at end of file + sort-direction: asc +header: | + /** + * This file is part of the Extractor package. + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * Feel free to edit as you please, and have fun. + * + * @author Marc Morera + */ \ No newline at end of file diff --git a/Adapter/TarBz2ExtractorAdapter.php b/Adapter/TarBz2ExtractorAdapter.php new file mode 100644 index 0000000..84c6146 --- /dev/null +++ b/Adapter/TarBz2ExtractorAdapter.php @@ -0,0 +1,62 @@ + + */ + +namespace Mmoreram\Extractor\Adapter; + +use Mmoreram\Extractor\Adapter\Abstracts\AbstractExtractorAdapter; +use Mmoreram\Extractor\Adapter\Interfaces\ExtractorAdapterInterface; +use Phar; +use PharData; +use Symfony\Component\Finder\Finder; + +/** + * Class TarBz2ExtractorAdapter + */ +class TarBz2ExtractorAdapter extends AbstractExtractorAdapter implements ExtractorAdapterInterface +{ + /** + * Checks if current adapter can be used + * + * @return boolean Adapter usable + */ + public function isAvailable() + { + return 'Bz2'; + } + + /** + * Return the adapter identifier + * + * @return string Adapter identifier + */ + public function getIdentifier() + { + return class_exists('\PharData'); + } + + /** + * Extract files from a filepath + * + * @param string $filePath File path + * + * @return Finder + */ + public function extract($filePath) + { + $tmpDirectory = $this->getRandomTemporaryDir(); + $pharArchive = new PharData($filePath, null, null, Phar::BZ2); + $pharArchive->extractTo($tmpDirectory); + + return $this->createFinderFromDirectory($tmpDirectory); + } +} diff --git a/Adapter/TarExtractorAdapter.php b/Adapter/TarExtractorAdapter.php new file mode 100644 index 0000000..699c3e5 --- /dev/null +++ b/Adapter/TarExtractorAdapter.php @@ -0,0 +1,62 @@ + + */ + +namespace Mmoreram\Extractor\Adapter; + +use Mmoreram\Extractor\Adapter\Abstracts\AbstractExtractorAdapter; +use Mmoreram\Extractor\Adapter\Interfaces\ExtractorAdapterInterface; +use Phar; +use PharData; +use Symfony\Component\Finder\Finder; + +/** + * Class TarExtractorAdapter + */ +class TarExtractorAdapter extends AbstractExtractorAdapter implements ExtractorAdapterInterface +{ + /** + * Checks if current adapter can be used + * + * @return boolean Adapter usable + */ + public function isAvailable() + { + return 'Tar'; + } + + /** + * Return the adapter identifier + * + * @return string Adapter identifier + */ + public function getIdentifier() + { + return class_exists('\PharData'); + } + + /** + * Extract files from a filepath + * + * @param string $filePath File path + * + * @return Finder + */ + public function extract($filePath) + { + $tmpDirectory = $this->getRandomTemporaryDir(); + $pharArchive = new PharData($filePath, null, null, Phar::TAR); + $pharArchive->extractTo($tmpDirectory); + + return $this->createFinderFromDirectory($tmpDirectory); + } +} diff --git a/Adapter/TarGzExtractorAdapter.php b/Adapter/TarGzExtractorAdapter.php new file mode 100644 index 0000000..a49e9bf --- /dev/null +++ b/Adapter/TarGzExtractorAdapter.php @@ -0,0 +1,62 @@ + + */ + +namespace Mmoreram\Extractor\Adapter; + +use Mmoreram\Extractor\Adapter\Abstracts\AbstractExtractorAdapter; +use Mmoreram\Extractor\Adapter\Interfaces\ExtractorAdapterInterface; +use Phar; +use PharData; +use Symfony\Component\Finder\Finder; + +/** + * Class TarGzExtractorAdapter + */ +class TarGzExtractorAdapter extends AbstractExtractorAdapter implements ExtractorAdapterInterface +{ + /** + * Checks if current adapter can be used + * + * @return boolean Adapter usable + */ + public function isAvailable() + { + return 'Gz'; + } + + /** + * Return the adapter identifier + * + * @return string Adapter identifier + */ + public function getIdentifier() + { + return class_exists('\PharData'); + } + + /** + * Extract files from a filepath + * + * @param string $filePath File path + * + * @return Finder + */ + public function extract($filePath) + { + $tmpDirectory = $this->getRandomTemporaryDir(); + $pharArchive = new PharData($filePath, null, null, Phar::GZ); + $pharArchive->extractTo($tmpDirectory); + + return $this->createFinderFromDirectory($tmpDirectory); + } +} diff --git a/Exception/ExtensionNotSupportedException.php b/Exception/ExtensionNotSupportedException.php index 1096bc7..2dd4b3e 100644 --- a/Exception/ExtensionNotSupportedException.php +++ b/Exception/ExtensionNotSupportedException.php @@ -32,7 +32,7 @@ class ExtensionNotSupportedException extends Exception */ public function __construct($message = "", $code = 0, Exception $previous = null) { - $message = 'Extension "' . $message . '" is currenly not supported. Extensions supported are [RAR, ZIP, PHAR]'; + $message = 'Extension "' . $message . '" is currenly not supported. Extensions supported are [RAR, ZIP, PHAR, TAR, GZ, BZ2]'; parent::__construct($message, $code, $previous); } diff --git a/README.md b/README.md index 2c2f27f..43e1806 100644 --- a/README.md +++ b/README.md @@ -68,3 +68,6 @@ works if the php extension is installed. * Zip - http://php.net/manual/en/book.zip.php * Rar - http://php.net/manual/en/book.rar.php * Phar - http://php.net/manual/en/book.phar.php +* Tar +* GZ +* BZ2 diff --git a/Resolver/ExtensionResolver.php b/Resolver/ExtensionResolver.php index 14fe597..7a42279 100644 --- a/Resolver/ExtensionResolver.php +++ b/Resolver/ExtensionResolver.php @@ -1,9 +1,7 @@ - * @author Aldo Chiecchia */ namespace Mmoreram\Extractor\Resolver; @@ -51,6 +48,18 @@ public function getAdapterNamespaceGivenExtension($fileExtension) $adapterNamespace .= 'PharExtractorAdapter'; break; + case 'tar': + $adapterNamespace .= 'TarExtractorAdapter'; + break; + + case 'gz': + $adapterNamespace .= 'TarGzExtractorAdapter'; + break; + + case 'bz2': + $adapterNamespace .= 'TarBz2ExtractorAdapter'; + break; + default: throw new ExtensionNotSupportedException($fileExtension); } diff --git a/Resolver/Interfaces/ExtensionResolverInterface.php b/Resolver/Interfaces/ExtensionResolverInterface.php index 93838bb..f2da43b 100644 --- a/Resolver/Interfaces/ExtensionResolverInterface.php +++ b/Resolver/Interfaces/ExtensionResolverInterface.php @@ -1,9 +1,7 @@ - * @author Aldo Chiecchia */ namespace Mmoreram\Extractor\Resolver\Interfaces; diff --git a/composer.json b/composer.json index 94020e1..3a68702 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,8 @@ "require-dev": { "phpunit/phpunit": ">=3.7", "fabpot/php-cs-fixer": "~0.1", - "mmoreram/php-formatter": "~1.0" + "mmoreram/php-formatter": "~1.0", + "ext-tar": "*" }, "suggest": { "ext-phar": "For usage of Phar adapter", diff --git a/tests/Adapter/Fixtures/phar.phar b/tests/Adapter/Fixtures/file.phar similarity index 100% rename from tests/Adapter/Fixtures/phar.phar rename to tests/Adapter/Fixtures/file.phar diff --git a/tests/Adapter/Fixtures/rar.rar b/tests/Adapter/Fixtures/file.rar similarity index 100% rename from tests/Adapter/Fixtures/rar.rar rename to tests/Adapter/Fixtures/file.rar diff --git a/tests/Adapter/Fixtures/file.tar b/tests/Adapter/Fixtures/file.tar new file mode 100644 index 0000000..12ae57e Binary files /dev/null and b/tests/Adapter/Fixtures/file.tar differ diff --git a/tests/Adapter/Fixtures/file.tar.bz2 b/tests/Adapter/Fixtures/file.tar.bz2 new file mode 100644 index 0000000..39a785f Binary files /dev/null and b/tests/Adapter/Fixtures/file.tar.bz2 differ diff --git a/tests/Adapter/Fixtures/file.tar.gz b/tests/Adapter/Fixtures/file.tar.gz new file mode 100644 index 0000000..f6edb7d Binary files /dev/null and b/tests/Adapter/Fixtures/file.tar.gz differ diff --git a/tests/Adapter/Fixtures/zip.zip b/tests/Adapter/Fixtures/file.zip similarity index 100% rename from tests/Adapter/Fixtures/zip.zip rename to tests/Adapter/Fixtures/file.zip diff --git a/tests/Adapter/PharExtractorAdapterTest.php b/tests/Adapter/PharExtractorAdapterTest.php index b4cdb26..7a44517 100644 --- a/tests/Adapter/PharExtractorAdapterTest.php +++ b/tests/Adapter/PharExtractorAdapterTest.php @@ -39,7 +39,7 @@ public function setUp() public function testExtract() { $pharExtractorAdapter = new PharExtractorAdapter(); - $finder = $pharExtractorAdapter->extract(dirname(__FILE__). '/Fixtures/phar.phar'); + $finder = $pharExtractorAdapter->extract(dirname(__FILE__). '/Fixtures/file.phar'); $this->assertEquals($finder->count(), 3); } diff --git a/tests/Adapter/RarExtractorAdapterTest.php b/tests/Adapter/RarExtractorAdapterTest.php index cf8c776..757df35 100644 --- a/tests/Adapter/RarExtractorAdapterTest.php +++ b/tests/Adapter/RarExtractorAdapterTest.php @@ -39,7 +39,7 @@ public function setUp() public function testExtract() { $rarExtractorAdapter = new RarExtractorAdapter(); - $finder = $rarExtractorAdapter->extract(dirname(__FILE__). '/Fixtures/rar.rar'); + $finder = $rarExtractorAdapter->extract(dirname(__FILE__). '/Fixtures/file.rar'); $this->assertEquals($finder->count(), 3); } diff --git a/tests/Adapter/TarBz2ExtractorAdapterTest.php b/tests/Adapter/TarBz2ExtractorAdapterTest.php new file mode 100644 index 0000000..ebbee3d --- /dev/null +++ b/tests/Adapter/TarBz2ExtractorAdapterTest.php @@ -0,0 +1,46 @@ + + */ + +namespace Extractor\tests\Adapter; + +use Mmoreram\Extractor\Adapter\TarBz2ExtractorAdapter; +use PHPUnit_Framework_TestCase; + +/** + * Class TarBz2ExtractorAdapterTest + */ +class TarBz2ExtractorAdapterTest extends PHPUnit_Framework_TestCase +{ + /** + * Setup + */ + public function setUp() + { + $pharExtractorAdapter = new TarBz2ExtractorAdapter(); + if (!$pharExtractorAdapter->isAvailable()) { + + $this->markTestSkipped('Phar extension not installed'); + } + } + + /** + * Test extract + */ + public function testExtract() + { + $tarExtractorAdapter = new TarBz2ExtractorAdapter(); + $finder = $tarExtractorAdapter->extract(dirname(__FILE__). '/Fixtures/file.tar.bz2'); + + $this->assertEquals($finder->count(), 3); + } +} diff --git a/tests/Adapter/TarExtractorAdapterTest.php b/tests/Adapter/TarExtractorAdapterTest.php new file mode 100644 index 0000000..feb83b9 --- /dev/null +++ b/tests/Adapter/TarExtractorAdapterTest.php @@ -0,0 +1,46 @@ + + */ + +namespace Extractor\tests\Adapter; + +use Mmoreram\Extractor\Adapter\TarExtractorAdapter; +use PHPUnit_Framework_TestCase; + +/** + * Class TarExtractorAdapterTest + */ +class TarExtractorAdapterTest extends PHPUnit_Framework_TestCase +{ + /** + * Setup + */ + public function setUp() + { + $pharExtractorAdapter = new TarExtractorAdapter(); + if (!$pharExtractorAdapter->isAvailable()) { + + $this->markTestSkipped('Phar extension not installed'); + } + } + + /** + * Test extract + */ + public function testExtract() + { + $tarExtractorAdapter = new TarExtractorAdapter(); + $finder = $tarExtractorAdapter->extract(dirname(__FILE__). '/Fixtures/file.tar'); + + $this->assertEquals($finder->count(), 3); + } +} diff --git a/tests/Adapter/TarGzExtractorAdapterTest.php b/tests/Adapter/TarGzExtractorAdapterTest.php new file mode 100644 index 0000000..971a16b --- /dev/null +++ b/tests/Adapter/TarGzExtractorAdapterTest.php @@ -0,0 +1,46 @@ + + */ + +namespace Extractor\tests\Adapter; + +use Mmoreram\Extractor\Adapter\TarGzExtractorAdapter; +use PHPUnit_Framework_TestCase; + +/** + * Class TarGzExtractorAdapterTest + */ +class TarGzExtractorAdapterTest extends PHPUnit_Framework_TestCase +{ + /** + * Setup + */ + public function setUp() + { + $pharExtractorAdapter = new TarGzExtractorAdapter(); + if (!$pharExtractorAdapter->isAvailable()) { + + $this->markTestSkipped('Phar extension not installed'); + } + } + + /** + * Test extract + */ + public function testExtract() + { + $tarExtractorAdapter = new TarGzExtractorAdapter(); + $finder = $tarExtractorAdapter->extract(dirname(__FILE__). '/Fixtures/file.tar.gz'); + + $this->assertEquals($finder->count(), 3); + } +} diff --git a/tests/Adapter/ZipExtractorAdapterTest.php b/tests/Adapter/ZipExtractorAdapterTest.php index 1b1d0a9..314d1f3 100644 --- a/tests/Adapter/ZipExtractorAdapterTest.php +++ b/tests/Adapter/ZipExtractorAdapterTest.php @@ -39,7 +39,7 @@ public function setUp() public function testExtract() { $zipExtractorAdapter = new ZipExtractorAdapter(); - $finder = $zipExtractorAdapter->extract(dirname(__FILE__) . '/Fixtures/zip.zip'); + $finder = $zipExtractorAdapter->extract(dirname(__FILE__) . '/Fixtures/file.zip'); $this->assertEquals($finder->count(), 3); } diff --git a/tests/ExtractorTest.php b/tests/ExtractorTest.php index 2d0a2b1..76f0802 100644 --- a/tests/ExtractorTest.php +++ b/tests/ExtractorTest.php @@ -16,6 +16,7 @@ use Mmoreram\Extractor\Exception\AdapterNotAvailableException; use Mmoreram\Extractor\Exception\FileNotFoundException; use Mmoreram\Extractor\Extractor; +use Mmoreram\Extractor\Resolver\ExtensionResolver; use PHPUnit_Framework_TestCase; /** @@ -28,7 +29,7 @@ class ExtractorTest extends PHPUnit_Framework_TestCase */ public function testExtractFromFile() { - $fileName = dirname(__FILE__) . '/Adapter/Fixtures/phar.phar'; + $fileName = dirname(__FILE__) . '/Adapter/Fixtures/file.phar'; $extensionResolver = $this ->getMock('\Mmoreram\Extractor\Resolver\Interfaces\ExtensionResolverInterface'); @@ -75,7 +76,7 @@ public function testExtractFromNonExistingFile() */ public function testExtractWithNotAvailableAdapter() { - $fileName = dirname(__FILE__) . '/Adapter/Fixtures/phar.phar'; + $fileName = dirname(__FILE__) . '/Adapter/Fixtures/file.phar'; $extractorAdapterInterface = $this ->getMock('\Mmoreram\Extractor\Adapter\Interfaces\ExtractorAdapterInterface'); @@ -106,4 +107,21 @@ public function testExtractWithNotAvailableAdapter() } } + + /** + * Tests extractFromFile + */ + public function testExtractWithMultiExtension() + { + $fileName = dirname(__FILE__) . '/Adapter/Fixtures/file.tar.gz'; + + $extensionResolver = new ExtensionResolver(); + $extractor = new Extractor($extensionResolver); + + try { + $extractor->extractFromFile($fileName); + } catch (AdapterNotAvailableException $e) { + $this->fail(); + } + } } diff --git a/tests/Resolver/ExtensionResolverTest.php b/tests/Resolver/ExtensionResolverTest.php index 38d874b..b350729 100644 --- a/tests/Resolver/ExtensionResolverTest.php +++ b/tests/Resolver/ExtensionResolverTest.php @@ -40,40 +40,31 @@ public function setUp() /** * Test zip extension + * + * @dataProvider dataTestExtension */ - public function testZipExtension() - { - $this->assertEquals( - '\Mmoreram\Extractor\Adapter\ZipExtractorAdapter', - $this - ->extensionResolver - ->getAdapterNamespaceGivenExtension('zip') - ); - } - - /** - * Test rar extension - */ - public function testRarExtension() + public function testExtension($extension, $adapterNamespace) { $this->assertEquals( - '\Mmoreram\Extractor\Adapter\RarExtractorAdapter', + $adapterNamespace, $this ->extensionResolver - ->getAdapterNamespaceGivenExtension('rar') + ->getAdapterNamespaceGivenExtension($extension) ); } /** - * Test phar extension + * Data for test extensions */ - public function testPharExtension() + public function dataTestExtension() { - $this->assertEquals( - '\Mmoreram\Extractor\Adapter\PharExtractorAdapter', - $this - ->extensionResolver - ->getAdapterNamespaceGivenExtension('phar') + return array( + array('zip', '\Mmoreram\Extractor\Adapter\ZipExtractorAdapter'), + array('rar', '\Mmoreram\Extractor\Adapter\RarExtractorAdapter'), + array('phar', '\Mmoreram\Extractor\Adapter\PharExtractorAdapter'), + array('tar', '\Mmoreram\Extractor\Adapter\TarExtractorAdapter'), + array('gz', '\Mmoreram\Extractor\Adapter\TarGzExtractorAdapter'), + array('bz2', '\Mmoreram\Extractor\Adapter\TarBz2ExtractorAdapter'), ); }