diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 11ae3e9..3f36d28 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -1,80 +1,66 @@ name: Test on: - pull_request: ~ - push: - branches: - - 'master' - schedule: - - cron: "0 0 * * *" + pull_request: ~ + push: + branches: + - "master" + schedule: + - cron: "0 0 * * *" jobs: - test: - name: "PHP ${{ matrix.php-version }} ${{ matrix.dependency-versions }} ${{ matrix.composer-stability }}" - runs-on: ubuntu-latest + test: + name: "PHP ${{ matrix.php-version }} ${{ matrix.dependency-versions }} ${{ matrix.composer-stability }}" + runs-on: ubuntu-latest - env: - PHPUNIT_VERSION: ${{ matrix.phpunit-version }} + env: + PHPUNIT_VERSION: ${{ matrix.phpunit-version }} - strategy: - fail-fast: false - matrix: - include: - - php-version: '5.3' - phpunit-version: 4 - dependency-versions: 'lowest' - - php-version: '5.4' - phpunit-version: 4 - - php-version: '5.5' - phpunit-version: 4 - - php-version: '5.6' - - php-version: '7.0' - - php-version: '7.1' - - php-version: '7.2' - - php-version: '7.3' - - php-version: '7.4' - - php-version: '8.0' - - php-version: '8.1' - - php-version: '8.1' - dependency-versions: 'highest' - composer-stability: 'dev' + strategy: + fail-fast: false + matrix: + os: [ubuntu-20.04] + php-version: [8.1, 8.0, 7.4, 7.3, 7.2, 7.1, 7.0, 5.6, 5.5] + dependency-versions: [prefer-lowest, prefer-stable] + include: + - php-version: 5.5 + phpunit-version: 4 - steps: - - name: Checkout project - uses: actions/checkout@v2 + steps: + - name: Checkout project + uses: actions/checkout@v2 - - name: Install and configure PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-version }} - tools: composer:v2 - coverage: none + - name: Install and configure PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + tools: composer:v2 + coverage: none - - name: Install phpunit - if: ${{ matrix.phpunit-version }} - run: | - composer remove symfony/phpunit-bridge --dev - wget -O phpunit "https://phar.phpunit.de/phpunit-${{ matrix.phpunit-version }}.phar" - chmod +x phpunit - composer require "roave/security-advisories" dev-master --no-update + - name: Install phpunit + if: ${{ matrix.phpunit-version }} + run: | + composer remove symfony/phpunit-bridge --dev + wget -O phpunit "https://phar.phpunit.de/phpunit-${{ matrix.phpunit-version }}.phar" + chmod +x phpunit + composer require "roave/security-advisories" dev-master --no-update - - name: Set composer stability - if: ${{ matrix.composer-stability }} - run: composer config minimum-stability ${{ matrix.composer-stability }} + - name: Set composer stability + if: ${{ matrix.composer-stability }} + run: composer config minimum-stability ${{ matrix.composer-stability }} - - name: Install composer dependencies - uses: ramsey/composer-install@v1 - with: - dependency-versions: ${{ matrix.dependency-versions }} + - name: Install composer dependencies + uses: ramsey/composer-install@v1 + with: + dependency-versions: ${{ matrix.dependency-versions }} - - name: Install ffmpeg - uses: FedericoCarboni/setup-ffmpeg@v1 + - name: Install ffmpeg + uses: FedericoCarboni/setup-ffmpeg@v1 - - name: Run tests - if: ${{ matrix.phpunit-version }} - run: | - if [ "$PHPUNIT_VERSION" ]; then - ./phpunit --verbose - else - ./vendor/bin/simple-phpunit --verbose - fi; + - name: Run tests + run: | + if [ "$PHPUNIT_VERSION" ]; then + ./phpunit --verbose + else + ./vendor/bin/simple-phpunit --verbose + fi; diff --git a/composer.json b/composer.json index 87b9039..8850836 100644 --- a/composer.json +++ b/composer.json @@ -32,11 +32,11 @@ } ], "require": { - "php": ">=5.3.9", + "php": ">=5.5.9", "alchemy/binary-driver": "^1.5 || ~2.0.0 || ^5.0", - "doctrine/cache": "^1.0|^2.0", "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "neutron/temporary-filesystem": "^2.1.1 || ^3.0" + "neutron/temporary-filesystem": "^2.1.1 || ^3.0", + "symfony/cache": "^3.1 || ^4.0 || ^5.0 || ^6.0" }, "suggest": { "php-ffmpeg/extras": "A compilation of common audio & video drivers for PHP-FFMpeg" diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 8b9403d..feaaa7b 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -12,6 +12,7 @@ > + diff --git a/src/FFMpeg/FFMpegServiceProvider.php b/src/FFMpeg/FFMpegServiceProvider.php index 2ada76d..05d34e4 100644 --- a/src/FFMpeg/FFMpegServiceProvider.php +++ b/src/FFMpeg/FFMpegServiceProvider.php @@ -11,9 +11,9 @@ namespace FFMpeg; -use Doctrine\Common\Cache\ArrayCache; use Silex\Application; use Silex\ServiceProviderInterface; +use Symfony\Component\Cache\Adapter\ArrayAdapter; /** * @deprecated @@ -47,7 +47,7 @@ class FFMpegServiceProvider implements ServiceProviderInterface }); $app['ffprobe.cache'] = $app->share(function () { - return new ArrayCache(); + return new ArrayAdapter; }); $app['ffmpeg.ffprobe'] = $app->share(function (Application $app) { diff --git a/src/FFMpeg/FFProbe.php b/src/FFMpeg/FFProbe.php index a1a0ba3..8eb7c66 100644 --- a/src/FFMpeg/FFProbe.php +++ b/src/FFMpeg/FFProbe.php @@ -13,27 +13,27 @@ namespace FFMpeg; use Alchemy\BinaryDriver\ConfigurationInterface; use Alchemy\BinaryDriver\Exception\ExecutionFailureException; -use Doctrine\Common\Cache\ArrayCache; -use Doctrine\Common\Cache\Cache; use FFMpeg\Driver\FFProbeDriver; +use FFMpeg\Exception\InvalidArgumentException; +use FFMpeg\Exception\RuntimeException; use FFMpeg\FFProbe\DataMapping\Format; +use FFMpeg\FFProbe\DataMapping\StreamCollection; use FFMpeg\FFProbe\Mapper; use FFMpeg\FFProbe\MapperInterface; use FFMpeg\FFProbe\OptionsTester; use FFMpeg\FFProbe\OptionsTesterInterface; use FFMpeg\FFProbe\OutputParser; use FFMpeg\FFProbe\OutputParserInterface; -use FFMpeg\Exception\InvalidArgumentException; -use FFMpeg\Exception\RuntimeException; -use FFMpeg\FFProbe\DataMapping\StreamCollection; +use Psr\Cache\CacheItemPoolInterface; use Psr\Log\LoggerInterface; +use Symfony\Component\Cache\Adapter\ArrayAdapter; class FFProbe { const TYPE_STREAMS = 'streams'; const TYPE_FORMAT = 'format'; - /** @var Cache */ + /** @var CacheItemPoolInterface */ private $cache; /** @var OptionsTesterInterface */ private $optionsTester; @@ -44,7 +44,7 @@ class FFProbe /** @var MapperInterface */ private $mapper; - public function __construct(FFProbeDriver $ffprobe, Cache $cache) + public function __construct(FFProbeDriver $ffprobe, CacheItemPoolInterface $cache) { $this->ffprobe = $ffprobe; $this->optionsTester = new OptionsTester($ffprobe, $cache); @@ -114,11 +114,11 @@ class FFProbe } /** - * @param Cache $cache + * @param CacheItemPoolInterface $cache * * @return FFProbe */ - public function setCache(Cache $cache) + public function setCache(CacheItemPoolInterface $cache) { $this->cache = $cache; @@ -213,14 +213,14 @@ class FFProbe * * @param array|ConfigurationInterface $configuration * @param LoggerInterface $logger - * @param Cache $cache + * @param CacheItemPoolInterface $cache * * @return FFProbe */ - public static function create($configuration = array(), LoggerInterface $logger = null, Cache $cache = null) + public static function create($configuration = array(), LoggerInterface $logger = null, CacheItemPoolInterface $cache = null) { if (null === $cache) { - $cache = new ArrayCache(); + $cache = new ArrayAdapter(); } return new static(FFProbeDriver::create($configuration, $logger), $cache); @@ -228,10 +228,10 @@ class FFProbe private function probe($pathfile, $command, $type, $allowJson = true) { - $id = sprintf('%s-%s', $command, $pathfile); + $id = md5(sprintf('%s-%s', $command, $pathfile)); - if ($this->cache->contains($id)) { - return $this->cache->fetch($id); + if ($this->cache->hasItem($id)) { + return $this->cache->getItem($id)->get(); } if (!$this->optionsTester->has($command)) { @@ -276,7 +276,9 @@ class FFProbe $ret = $this->mapper->map($type, $data); - $this->cache->save($id, $ret); + $cacheItem = $this->cache->getItem($id); + $cacheItem->set($ret); + $this->cache->save($cacheItem); return $ret; } diff --git a/src/FFMpeg/FFProbe/DataMapping/AbstractData.php b/src/FFMpeg/FFProbe/DataMapping/AbstractData.php index 083e576..e830c8e 100644 --- a/src/FFMpeg/FFProbe/DataMapping/AbstractData.php +++ b/src/FFMpeg/FFProbe/DataMapping/AbstractData.php @@ -86,6 +86,7 @@ abstract class AbstractData implements \Countable /** * {@inheritdoc} */ + #[\ReturnTypeWillChange] public function count() { return count($this->properties); diff --git a/src/FFMpeg/FFProbe/DataMapping/StreamCollection.php b/src/FFMpeg/FFProbe/DataMapping/StreamCollection.php index 409cf91..4b640e8 100644 --- a/src/FFMpeg/FFProbe/DataMapping/StreamCollection.php +++ b/src/FFMpeg/FFProbe/DataMapping/StreamCollection.php @@ -74,6 +74,7 @@ class StreamCollection implements \Countable, \IteratorAggregate /** * {@inheritdoc} */ + #[\ReturnTypeWillChange] public function count() { return count($this->streams); @@ -92,6 +93,7 @@ class StreamCollection implements \Countable, \IteratorAggregate /** * {@inheritdoc} */ + #[\ReturnTypeWillChange] public function getIterator() { return new \ArrayIterator($this->streams); diff --git a/src/FFMpeg/FFProbe/OptionsTester.php b/src/FFMpeg/FFProbe/OptionsTester.php index a5cc885..1f95f3c 100644 --- a/src/FFMpeg/FFProbe/OptionsTester.php +++ b/src/FFMpeg/FFProbe/OptionsTester.php @@ -12,18 +12,18 @@ namespace FFMpeg\FFProbe; use Alchemy\BinaryDriver\Exception\ExecutionFailureException; -use Doctrine\Common\Cache\Cache; use FFMpeg\Driver\FFProbeDriver; use FFMpeg\Exception\RuntimeException; +use Psr\Cache\CacheItemPoolInterface; class OptionsTester implements OptionsTesterInterface { /** @var FFProbeDriver */ private $ffprobe; - /** @var Cache */ + /** @var CacheItemPoolInterface */ private $cache; - public function __construct(FFProbeDriver $ffprobe, Cache $cache) + public function __construct(FFProbeDriver $ffprobe, CacheItemPoolInterface $cache) { $this->ffprobe = $ffprobe; $this->cache = $cache; @@ -34,17 +34,19 @@ class OptionsTester implements OptionsTesterInterface */ public function has($name) { - $id = sprintf('option-%s', $name); + $id = md5(sprintf('option-%s', $name)); - if ($this->cache->contains($id)) { - return $this->cache->fetch($id); + if ($this->cache->hasItem($id)) { + return $this->cache->getItem($id)->get(); } $output = $this->retrieveHelpOutput(); $ret = (bool) preg_match('/^'.$name.'/m', $output); - $this->cache->save($id, $ret); + $cacheItem = $this->cache->getItem($id); + $cacheItem->set($ret); + $this->cache->save($cacheItem); return $ret; } @@ -53,8 +55,8 @@ class OptionsTester implements OptionsTesterInterface { $id = 'help'; - if ($this->cache->contains($id)) { - return $this->cache->fetch($id); + if ($this->cache->hasItem($id)) { + return $this->cache->getItem($id)->get(); } try { @@ -63,7 +65,9 @@ class OptionsTester implements OptionsTesterInterface throw new RuntimeException('Your FFProbe version is too old and does not support `-help` option, please upgrade.', $e->getCode(), $e); } - $this->cache->save($id, $output); + $cacheItem = $this->cache->getItem($id); + $cacheItem->set($output); + $this->cache->save($cacheItem); return $output; } diff --git a/src/FFMpeg/Filters/FiltersCollection.php b/src/FFMpeg/Filters/FiltersCollection.php index 1a1c20a..a0ebbf0 100644 --- a/src/FFMpeg/Filters/FiltersCollection.php +++ b/src/FFMpeg/Filters/FiltersCollection.php @@ -32,6 +32,7 @@ class FiltersCollection implements \Countable, \IteratorAggregate /** * {@inheritdoc} */ + #[\ReturnTypeWillChange] public function count() { if (0 === count($this->filters)) { @@ -44,6 +45,7 @@ class FiltersCollection implements \Countable, \IteratorAggregate /** * {@inheritdoc} */ + #[\ReturnTypeWillChange] public function getIterator() { if (null === $this->sorted) { diff --git a/tests/Unit/FFProbe/OptionsTesterTest.php b/tests/Unit/FFProbe/OptionsTesterTest.php index b55386d..619f990 100644 --- a/tests/Unit/FFProbe/OptionsTesterTest.php +++ b/tests/Unit/FFProbe/OptionsTesterTest.php @@ -2,8 +2,9 @@ namespace Tests\FFMpeg\Unit\FFProbe; -use Tests\FFMpeg\Unit\TestCase; use FFMpeg\FFProbe\OptionsTester; +use Symfony\Component\Cache\CacheItem; +use Tests\FFMpeg\Unit\TestCase; class OptionsTesterTest extends TestCase { @@ -36,11 +37,12 @@ class OptionsTesterTest extends TestCase { $cache = $this->getCacheMock(); - $cache->expects($this->never()) - ->method('fetch'); + $cache->expects($this->exactly(2)) + ->method('getItem') + ->will($this->returnValue(new CacheItem)); $cache->expects($this->exactly(2)) - ->method('contains') + ->method('hasItem') ->will($this->returnValue(false)); $cache->expects($this->exactly(2)) @@ -73,16 +75,22 @@ class OptionsTesterTest extends TestCase { $cache = $this->getCacheMock(); - $cache->expects($this->once()) - ->method('fetch') - ->will($this->returnValue($data)); + $cacheItem = new CacheItem; + $cacheItem->set($data); $cache->expects($this->exactly(2)) - ->method('contains') + ->method('getItem') + ->willReturnOnConsecutiveCalls( + $this->returnValue($cacheItem), + $this->returnValue(new CacheItem) + ); + + $cache->expects($this->exactly(2)) + ->method('hasItem') ->willReturnOnConsecutiveCalls( $this->returnValue(false), - $this->returnValue(true)); - + $this->returnValue(true) + ); $cache->expects($this->once()) ->method('save'); @@ -101,14 +109,17 @@ class OptionsTesterTest extends TestCase { $cache = $this->getCacheMock(); - $cache->expects($this->once()) - ->method('fetch') - ->with('option-' . $optionName) - ->will($this->returnValue($isPresent)); + $cacheItem = new CacheItem(); + $cacheItem->set($isPresent); $cache->expects($this->once()) - ->method('contains') - ->with('option-' . $optionName) + ->method('getItem') + ->with(md5('option-' . $optionName)) + ->will($this->returnValue($cacheItem)); + + $cache->expects($this->once()) + ->method('hasItem') + ->with(md5('option-' . $optionName)) ->will($this->returnValue(true)); $ffprobe = $this->getFFProbeDriverMock(); diff --git a/tests/Unit/FFProbeTest.php b/tests/Unit/FFProbeTest.php index d927ab9..57431d5 100644 --- a/tests/Unit/FFProbeTest.php +++ b/tests/Unit/FFProbeTest.php @@ -2,10 +2,11 @@ namespace Tests\FFMpeg\Unit; -use FFMpeg\FFProbe; -use Symfony\Component\Process\ExecutableFinder; -use Alchemy\BinaryDriver\ConfigurationInterface; use Alchemy\BinaryDriver\Configuration; +use Alchemy\BinaryDriver\ConfigurationInterface; +use FFMpeg\FFProbe; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Process\ExecutableFinder; class FFProbeTest extends TestCase { @@ -100,13 +101,14 @@ class FFProbeTest extends TestCase $cache = $this->getCacheMock(); $cache->expects($this->once()) - ->method('contains') + ->method('hasItem') ->will($this->returnValue(false)); - $cache->expects($this->never()) - ->method('fetch'); + $cache->expects($this->once()) + ->method('getItem') + ->will($this->returnValue(new CacheItem)); $cache->expects($this->once()) ->method('save') - ->with($this->anything(), $output); + ->with($this->anything()); $driver = $this->getFFProbeDriverMock(); $driver->expects($this->once()) @@ -160,10 +162,11 @@ class FFProbeTest extends TestCase $cache = $this->getCacheMock(); $cache->expects($this->exactly(2)) - ->method('contains') + ->method('hasItem') ->will($this->returnValue(false)); - $cache->expects($this->never()) - ->method('fetch'); + $cache->expects($this->once()) + ->method('getItem') + ->will($this->returnValue(new CacheItem)); $driver = $this->getFFProbeDriverMock(); $driver->expects($this->exactly(2)) @@ -205,13 +208,16 @@ class FFProbeTest extends TestCase $tester = $this->getFFProbeOptionsTesterMock(); + $cacheItem = new CacheItem; + $cacheItem->set($output); + $cache = $this->getCacheMock(); $cache->expects($this->once()) - ->method('contains') + ->method('hasItem') ->will($this->returnValue(true)); $cache->expects($this->once()) - ->method('fetch') - ->will($this->returnValue($output)); + ->method('getItem') + ->will($this->returnValue($cacheItem)); $cache->expects($this->never()) ->method('save'); diff --git a/tests/Unit/TestCase.php b/tests/Unit/TestCase.php index 60bd004..2171a78 100644 --- a/tests/Unit/TestCase.php +++ b/tests/Unit/TestCase.php @@ -13,7 +13,7 @@ class TestCase extends BaseTestCase public function getCacheMock() { - return $this->getMockBuilder('Doctrine\Common\Cache\Cache')->getMock(); + return $this->getMockBuilder('Psr\Cache\CacheItemPoolInterface')->getMock(); } public function getTimeCodeMock()