the whole shebang
This commit is contained in:
3
vendor/symfony/finder/Symfony/Component/Finder/.gitignore
vendored
Normal file
3
vendor/symfony/finder/Symfony/Component/Finder/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
vendor/
|
||||
composer.lock
|
||||
phpunit.xml
|
236
vendor/symfony/finder/Symfony/Component/Finder/Adapter/AbstractAdapter.php
vendored
Normal file
236
vendor/symfony/finder/Symfony/Component/Finder/Adapter/AbstractAdapter.php
vendored
Normal file
@@ -0,0 +1,236 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Adapter;
|
||||
|
||||
/**
|
||||
* Interface for finder engine implementations.
|
||||
*
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
abstract class AbstractAdapter implements AdapterInterface
|
||||
{
|
||||
protected $followLinks = false;
|
||||
protected $mode = 0;
|
||||
protected $minDepth = 0;
|
||||
protected $maxDepth = PHP_INT_MAX;
|
||||
protected $exclude = array();
|
||||
protected $names = array();
|
||||
protected $notNames = array();
|
||||
protected $contains = array();
|
||||
protected $notContains = array();
|
||||
protected $sizes = array();
|
||||
protected $dates = array();
|
||||
protected $filters = array();
|
||||
protected $sort = false;
|
||||
protected $paths = array();
|
||||
protected $notPaths = array();
|
||||
protected $ignoreUnreadableDirs = false;
|
||||
|
||||
private static $areSupported = array();
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function isSupported()
|
||||
{
|
||||
$name = $this->getName();
|
||||
|
||||
if (!array_key_exists($name, self::$areSupported)) {
|
||||
self::$areSupported[$name] = $this->canBeUsed();
|
||||
}
|
||||
|
||||
return self::$areSupported[$name];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setFollowLinks($followLinks)
|
||||
{
|
||||
$this->followLinks = $followLinks;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setMode($mode)
|
||||
{
|
||||
$this->mode = $mode;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setDepths(array $depths)
|
||||
{
|
||||
$this->minDepth = 0;
|
||||
$this->maxDepth = PHP_INT_MAX;
|
||||
|
||||
foreach ($depths as $comparator) {
|
||||
switch ($comparator->getOperator()) {
|
||||
case '>':
|
||||
$this->minDepth = $comparator->getTarget() + 1;
|
||||
break;
|
||||
case '>=':
|
||||
$this->minDepth = $comparator->getTarget();
|
||||
break;
|
||||
case '<':
|
||||
$this->maxDepth = $comparator->getTarget() - 1;
|
||||
break;
|
||||
case '<=':
|
||||
$this->maxDepth = $comparator->getTarget();
|
||||
break;
|
||||
default:
|
||||
$this->minDepth = $this->maxDepth = $comparator->getTarget();
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setExclude(array $exclude)
|
||||
{
|
||||
$this->exclude = $exclude;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setNames(array $names)
|
||||
{
|
||||
$this->names = $names;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setNotNames(array $notNames)
|
||||
{
|
||||
$this->notNames = $notNames;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setContains(array $contains)
|
||||
{
|
||||
$this->contains = $contains;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setNotContains(array $notContains)
|
||||
{
|
||||
$this->notContains = $notContains;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setSizes(array $sizes)
|
||||
{
|
||||
$this->sizes = $sizes;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setDates(array $dates)
|
||||
{
|
||||
$this->dates = $dates;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setFilters(array $filters)
|
||||
{
|
||||
$this->filters = $filters;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setSort($sort)
|
||||
{
|
||||
$this->sort = $sort;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setPath(array $paths)
|
||||
{
|
||||
$this->paths = $paths;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setNotPath(array $notPaths)
|
||||
{
|
||||
$this->notPaths = $notPaths;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function ignoreUnreadableDirs($ignore = true)
|
||||
{
|
||||
$this->ignoreUnreadableDirs = (Boolean) $ignore;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the adapter is supported in the current environment.
|
||||
*
|
||||
* This method should be implemented in all adapters. Do not implement
|
||||
* isSupported in the adapters as the generic implementation provides a cache
|
||||
* layer.
|
||||
*
|
||||
* @see isSupported
|
||||
*
|
||||
* @return Boolean Whether the adapter is supported
|
||||
*/
|
||||
abstract protected function canBeUsed();
|
||||
}
|
327
vendor/symfony/finder/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php
vendored
Normal file
327
vendor/symfony/finder/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php
vendored
Normal file
@@ -0,0 +1,327 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Adapter;
|
||||
|
||||
use Symfony\Component\Finder\Exception\AccessDeniedException;
|
||||
use Symfony\Component\Finder\Iterator;
|
||||
use Symfony\Component\Finder\Shell\Shell;
|
||||
use Symfony\Component\Finder\Expression\Expression;
|
||||
use Symfony\Component\Finder\Shell\Command;
|
||||
use Symfony\Component\Finder\Iterator\SortableIterator;
|
||||
use Symfony\Component\Finder\Comparator\NumberComparator;
|
||||
use Symfony\Component\Finder\Comparator\DateComparator;
|
||||
|
||||
/**
|
||||
* Shell engine implementation using GNU find command.
|
||||
*
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
abstract class AbstractFindAdapter extends AbstractAdapter
|
||||
{
|
||||
/**
|
||||
* @var Shell
|
||||
*/
|
||||
protected $shell;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->shell = new Shell();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function searchInDirectory($dir)
|
||||
{
|
||||
// having "/../" in path make find fail
|
||||
$dir = realpath($dir);
|
||||
|
||||
// searching directories containing or not containing strings leads to no result
|
||||
if (Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES === $this->mode && ($this->contains || $this->notContains)) {
|
||||
return new Iterator\FilePathsIterator(array(), $dir);
|
||||
}
|
||||
|
||||
$command = Command::create();
|
||||
$find = $this->buildFindCommand($command, $dir);
|
||||
|
||||
if ($this->followLinks) {
|
||||
$find->add('-follow');
|
||||
}
|
||||
|
||||
$find->add('-mindepth')->add($this->minDepth + 1);
|
||||
|
||||
if (PHP_INT_MAX !== $this->maxDepth) {
|
||||
$find->add('-maxdepth')->add($this->maxDepth + 1);
|
||||
}
|
||||
|
||||
if (Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES === $this->mode) {
|
||||
$find->add('-type d');
|
||||
} elseif (Iterator\FileTypeFilterIterator::ONLY_FILES === $this->mode) {
|
||||
$find->add('-type f');
|
||||
}
|
||||
|
||||
$this->buildNamesFiltering($find, $this->names);
|
||||
$this->buildNamesFiltering($find, $this->notNames, true);
|
||||
$this->buildPathsFiltering($find, $dir, $this->paths);
|
||||
$this->buildPathsFiltering($find, $dir, $this->notPaths, true);
|
||||
$this->buildSizesFiltering($find, $this->sizes);
|
||||
$this->buildDatesFiltering($find, $this->dates);
|
||||
|
||||
$useGrep = $this->shell->testCommand('grep') && $this->shell->testCommand('xargs');
|
||||
$useSort = is_int($this->sort) && $this->shell->testCommand('sort') && $this->shell->testCommand('cut');
|
||||
|
||||
if ($useGrep && ($this->contains || $this->notContains)) {
|
||||
$grep = $command->ins('grep');
|
||||
$this->buildContentFiltering($grep, $this->contains);
|
||||
$this->buildContentFiltering($grep, $this->notContains, true);
|
||||
}
|
||||
|
||||
if ($useSort) {
|
||||
$this->buildSorting($command, $this->sort);
|
||||
}
|
||||
|
||||
$command->setErrorHandler(
|
||||
$this->ignoreUnreadableDirs
|
||||
// If directory is unreadable and finder is set to ignore it, `stderr` is ignored.
|
||||
? function ($stderr) { return; }
|
||||
: function ($stderr) { throw new AccessDeniedException($stderr); }
|
||||
);
|
||||
|
||||
$paths = $this->shell->testCommand('uniq') ? $command->add('| uniq')->execute() : array_unique($command->execute());
|
||||
$iterator = new Iterator\FilePathsIterator($paths, $dir);
|
||||
|
||||
if ($this->exclude) {
|
||||
$iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $this->exclude);
|
||||
}
|
||||
|
||||
if (!$useGrep && ($this->contains || $this->notContains)) {
|
||||
$iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains);
|
||||
}
|
||||
|
||||
if ($this->filters) {
|
||||
$iterator = new Iterator\CustomFilterIterator($iterator, $this->filters);
|
||||
}
|
||||
|
||||
if (!$useSort && $this->sort) {
|
||||
$iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort);
|
||||
$iterator = $iteratorAggregate->getIterator();
|
||||
}
|
||||
|
||||
return $iterator;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function canBeUsed()
|
||||
{
|
||||
return $this->shell->testCommand('find');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Command $command
|
||||
* @param string $dir
|
||||
*
|
||||
* @return Command
|
||||
*/
|
||||
protected function buildFindCommand(Command $command, $dir)
|
||||
{
|
||||
return $command
|
||||
->ins('find')
|
||||
->add('find ')
|
||||
->arg($dir)
|
||||
->add('-noleaf'); // the -noleaf option is required for filesystems that don't follow the '.' and '..' conventions
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Command $command
|
||||
* @param string[] $names
|
||||
* @param Boolean $not
|
||||
*/
|
||||
private function buildNamesFiltering(Command $command, array $names, $not = false)
|
||||
{
|
||||
if (0 === count($names)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$command->add($not ? '-not' : null)->cmd('(');
|
||||
|
||||
foreach ($names as $i => $name) {
|
||||
$expr = Expression::create($name);
|
||||
|
||||
// Find does not support expandable globs ("*.{a,b}" syntax).
|
||||
if ($expr->isGlob() && $expr->getGlob()->isExpandable()) {
|
||||
$expr = Expression::create($expr->getGlob()->toRegex(false));
|
||||
}
|
||||
|
||||
// Fixes 'not search' and 'full path matching' regex problems.
|
||||
// - Jokers '.' are replaced by [^/].
|
||||
// - We add '[^/]*' before and after regex (if no ^|$ flags are present).
|
||||
if ($expr->isRegex()) {
|
||||
$regex = $expr->getRegex();
|
||||
$regex->prepend($regex->hasStartFlag() ? '/' : '/[^/]*')
|
||||
->setStartFlag(false)
|
||||
->setStartJoker(true)
|
||||
->replaceJokers('[^/]');
|
||||
if (!$regex->hasEndFlag() || $regex->hasEndJoker()) {
|
||||
$regex->setEndJoker(false)->append('[^/]*');
|
||||
}
|
||||
}
|
||||
|
||||
$command
|
||||
->add($i > 0 ? '-or' : null)
|
||||
->add($expr->isRegex()
|
||||
? ($expr->isCaseSensitive() ? '-regex' : '-iregex')
|
||||
: ($expr->isCaseSensitive() ? '-name' : '-iname')
|
||||
)
|
||||
->arg($expr->renderPattern());
|
||||
}
|
||||
|
||||
$command->cmd(')');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Command $command
|
||||
* @param string $dir
|
||||
* @param string[] $paths
|
||||
* @param Boolean $not
|
||||
*/
|
||||
private function buildPathsFiltering(Command $command, $dir, array $paths, $not = false)
|
||||
{
|
||||
if (0 === count($paths)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$command->add($not ? '-not' : null)->cmd('(');
|
||||
|
||||
foreach ($paths as $i => $path) {
|
||||
$expr = Expression::create($path);
|
||||
|
||||
// Find does not support expandable globs ("*.{a,b}" syntax).
|
||||
if ($expr->isGlob() && $expr->getGlob()->isExpandable()) {
|
||||
$expr = Expression::create($expr->getGlob()->toRegex(false));
|
||||
}
|
||||
|
||||
// Fixes 'not search' regex problems.
|
||||
if ($expr->isRegex()) {
|
||||
$regex = $expr->getRegex();
|
||||
$regex->prepend($regex->hasStartFlag() ? $dir.DIRECTORY_SEPARATOR : '.*')->setEndJoker(!$regex->hasEndFlag());
|
||||
} else {
|
||||
$expr->prepend('*')->append('*');
|
||||
}
|
||||
|
||||
$command
|
||||
->add($i > 0 ? '-or' : null)
|
||||
->add($expr->isRegex()
|
||||
? ($expr->isCaseSensitive() ? '-regex' : '-iregex')
|
||||
: ($expr->isCaseSensitive() ? '-path' : '-ipath')
|
||||
)
|
||||
->arg($expr->renderPattern());
|
||||
}
|
||||
|
||||
$command->cmd(')');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Command $command
|
||||
* @param NumberComparator[] $sizes
|
||||
*/
|
||||
private function buildSizesFiltering(Command $command, array $sizes)
|
||||
{
|
||||
foreach ($sizes as $i => $size) {
|
||||
$command->add($i > 0 ? '-and' : null);
|
||||
|
||||
switch ($size->getOperator()) {
|
||||
case '<=':
|
||||
$command->add('-size -'.($size->getTarget() + 1).'c');
|
||||
break;
|
||||
case '>=':
|
||||
$command->add('-size +'. ($size->getTarget() - 1).'c');
|
||||
break;
|
||||
case '>':
|
||||
$command->add('-size +'.$size->getTarget().'c');
|
||||
break;
|
||||
case '!=':
|
||||
$command->add('-size -'.$size->getTarget().'c');
|
||||
$command->add('-size +'.$size->getTarget().'c');
|
||||
case '<':
|
||||
default:
|
||||
$command->add('-size -'.$size->getTarget().'c');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Command $command
|
||||
* @param DateComparator[] $dates
|
||||
*/
|
||||
private function buildDatesFiltering(Command $command, array $dates)
|
||||
{
|
||||
foreach ($dates as $i => $date) {
|
||||
$command->add($i > 0 ? '-and' : null);
|
||||
|
||||
$mins = (int) round((time()-$date->getTarget()) / 60);
|
||||
|
||||
if (0 > $mins) {
|
||||
// mtime is in the future
|
||||
$command->add(' -mmin -0');
|
||||
// we will have no result so we don't need to continue
|
||||
return;
|
||||
}
|
||||
|
||||
switch ($date->getOperator()) {
|
||||
case '<=':
|
||||
$command->add('-mmin +'.($mins - 1));
|
||||
break;
|
||||
case '>=':
|
||||
$command->add('-mmin -'.($mins + 1));
|
||||
break;
|
||||
case '>':
|
||||
$command->add('-mmin -'.$mins);
|
||||
break;
|
||||
case '!=':
|
||||
$command->add('-mmin +'.$mins.' -or -mmin -'.$mins);
|
||||
break;
|
||||
case '<':
|
||||
default:
|
||||
$command->add('-mmin +'.$mins);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Command $command
|
||||
* @param string $sort
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
private function buildSorting(Command $command, $sort)
|
||||
{
|
||||
$this->buildFormatSorting($command, $sort);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Command $command
|
||||
* @param string $sort
|
||||
*/
|
||||
abstract protected function buildFormatSorting(Command $command, $sort);
|
||||
|
||||
/**
|
||||
* @param Command $command
|
||||
* @param array $contains
|
||||
* @param Boolean $not
|
||||
*/
|
||||
abstract protected function buildContentFiltering(Command $command, array $contains, $not = false);
|
||||
}
|
144
vendor/symfony/finder/Symfony/Component/Finder/Adapter/AdapterInterface.php
vendored
Normal file
144
vendor/symfony/finder/Symfony/Component/Finder/Adapter/AdapterInterface.php
vendored
Normal file
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Adapter;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
interface AdapterInterface
|
||||
{
|
||||
/**
|
||||
* @param Boolean $followLinks
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setFollowLinks($followLinks);
|
||||
|
||||
/**
|
||||
* @param integer $mode
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setMode($mode);
|
||||
|
||||
/**
|
||||
* @param array $exclude
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setExclude(array $exclude);
|
||||
|
||||
/**
|
||||
* @param array $depths
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setDepths(array $depths);
|
||||
|
||||
/**
|
||||
* @param array $names
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setNames(array $names);
|
||||
|
||||
/**
|
||||
* @param array $notNames
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setNotNames(array $notNames);
|
||||
|
||||
/**
|
||||
* @param array $contains
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setContains(array $contains);
|
||||
|
||||
/**
|
||||
* @param array $notContains
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setNotContains(array $notContains);
|
||||
|
||||
/**
|
||||
* @param array $sizes
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setSizes(array $sizes);
|
||||
|
||||
/**
|
||||
* @param array $dates
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setDates(array $dates);
|
||||
|
||||
/**
|
||||
* @param array $filters
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setFilters(array $filters);
|
||||
|
||||
/**
|
||||
* @param \Closure|integer $sort
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setSort($sort);
|
||||
|
||||
/**
|
||||
* @param array $paths
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setPath(array $paths);
|
||||
|
||||
/**
|
||||
* @param array $notPaths
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function setNotPath(array $notPaths);
|
||||
|
||||
/**
|
||||
* @param boolean $ignore
|
||||
*
|
||||
* @return AdapterInterface Current instance
|
||||
*/
|
||||
public function ignoreUnreadableDirs($ignore = true);
|
||||
|
||||
/**
|
||||
* @param string $dir
|
||||
*
|
||||
* @return \Iterator Result iterator
|
||||
*/
|
||||
public function searchInDirectory($dir);
|
||||
|
||||
/**
|
||||
* Tests adapter support for current platform.
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
public function isSupported();
|
||||
|
||||
/**
|
||||
* Returns adapter name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName();
|
||||
}
|
103
vendor/symfony/finder/Symfony/Component/Finder/Adapter/BsdFindAdapter.php
vendored
Normal file
103
vendor/symfony/finder/Symfony/Component/Finder/Adapter/BsdFindAdapter.php
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Adapter;
|
||||
|
||||
use Symfony\Component\Finder\Shell\Shell;
|
||||
use Symfony\Component\Finder\Shell\Command;
|
||||
use Symfony\Component\Finder\Iterator\SortableIterator;
|
||||
use Symfony\Component\Finder\Expression\Expression;
|
||||
|
||||
/**
|
||||
* Shell engine implementation using BSD find command.
|
||||
*
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class BsdFindAdapter extends AbstractFindAdapter
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'bsd_find';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function canBeUsed()
|
||||
{
|
||||
return in_array($this->shell->getType(), array(Shell::TYPE_BSD, Shell::TYPE_DARWIN)) && parent::canBeUsed();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function buildFormatSorting(Command $command, $sort)
|
||||
{
|
||||
switch ($sort) {
|
||||
case SortableIterator::SORT_BY_NAME:
|
||||
$command->ins('sort')->add('| sort');
|
||||
|
||||
return;
|
||||
case SortableIterator::SORT_BY_TYPE:
|
||||
$format = '%HT';
|
||||
break;
|
||||
case SortableIterator::SORT_BY_ACCESSED_TIME:
|
||||
$format = '%a';
|
||||
break;
|
||||
case SortableIterator::SORT_BY_CHANGED_TIME:
|
||||
$format = '%c';
|
||||
break;
|
||||
case SortableIterator::SORT_BY_MODIFIED_TIME:
|
||||
$format = '%m';
|
||||
break;
|
||||
default:
|
||||
throw new \InvalidArgumentException(sprintf('Unknown sort options: %s.', $sort));
|
||||
}
|
||||
|
||||
$command
|
||||
->add('-print0 | xargs -0 stat -f')
|
||||
->arg($format.'%t%N')
|
||||
->add('| sort | cut -f 2');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function buildFindCommand(Command $command, $dir)
|
||||
{
|
||||
parent::buildFindCommand($command, $dir)->addAtIndex('-E', 1);
|
||||
|
||||
return $command;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function buildContentFiltering(Command $command, array $contains, $not = false)
|
||||
{
|
||||
foreach ($contains as $contain) {
|
||||
$expr = Expression::create($contain);
|
||||
|
||||
// todo: avoid forking process for each $pattern by using multiple -e options
|
||||
$command
|
||||
->add('| grep -v \'^$\'')
|
||||
->add('| xargs -I{} grep -I')
|
||||
->add($expr->isCaseSensitive() ? null : '-i')
|
||||
->add($not ? '-L' : '-l')
|
||||
->add('-Ee')->arg($expr->renderPattern())
|
||||
->add('{}')
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
104
vendor/symfony/finder/Symfony/Component/Finder/Adapter/GnuFindAdapter.php
vendored
Normal file
104
vendor/symfony/finder/Symfony/Component/Finder/Adapter/GnuFindAdapter.php
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Adapter;
|
||||
|
||||
use Symfony\Component\Finder\Shell\Shell;
|
||||
use Symfony\Component\Finder\Shell\Command;
|
||||
use Symfony\Component\Finder\Iterator\SortableIterator;
|
||||
use Symfony\Component\Finder\Expression\Expression;
|
||||
|
||||
/**
|
||||
* Shell engine implementation using GNU find command.
|
||||
*
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class GnuFindAdapter extends AbstractFindAdapter
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'gnu_find';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function buildFormatSorting(Command $command, $sort)
|
||||
{
|
||||
switch ($sort) {
|
||||
case SortableIterator::SORT_BY_NAME:
|
||||
$command->ins('sort')->add('| sort');
|
||||
|
||||
return;
|
||||
case SortableIterator::SORT_BY_TYPE:
|
||||
$format = '%y';
|
||||
break;
|
||||
case SortableIterator::SORT_BY_ACCESSED_TIME:
|
||||
$format = '%A@';
|
||||
break;
|
||||
case SortableIterator::SORT_BY_CHANGED_TIME:
|
||||
$format = '%C@';
|
||||
break;
|
||||
case SortableIterator::SORT_BY_MODIFIED_TIME:
|
||||
$format = '%T@';
|
||||
break;
|
||||
default:
|
||||
throw new \InvalidArgumentException(sprintf('Unknown sort options: %s.', $sort));
|
||||
}
|
||||
|
||||
$command
|
||||
->get('find')
|
||||
->add('-printf')
|
||||
->arg($format.' %h/%f\\n')
|
||||
->add('| sort | cut')
|
||||
->arg('-d ')
|
||||
->arg('-f2-')
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function canBeUsed()
|
||||
{
|
||||
return $this->shell->getType() === Shell::TYPE_UNIX && parent::canBeUsed();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function buildFindCommand(Command $command, $dir)
|
||||
{
|
||||
return parent::buildFindCommand($command, $dir)->add('-regextype posix-extended');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function buildContentFiltering(Command $command, array $contains, $not = false)
|
||||
{
|
||||
foreach ($contains as $contain) {
|
||||
$expr = Expression::create($contain);
|
||||
|
||||
// todo: avoid forking process for each $pattern by using multiple -e options
|
||||
$command
|
||||
->add('| xargs -I{} -r grep -I')
|
||||
->add($expr->isCaseSensitive() ? null : '-i')
|
||||
->add($not ? '-L' : '-l')
|
||||
->add('-Ee')->arg($expr->renderPattern())
|
||||
->add('{}')
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
98
vendor/symfony/finder/Symfony/Component/Finder/Adapter/PhpAdapter.php
vendored
Normal file
98
vendor/symfony/finder/Symfony/Component/Finder/Adapter/PhpAdapter.php
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Adapter;
|
||||
|
||||
use Symfony\Component\Finder\Iterator;
|
||||
|
||||
/**
|
||||
* PHP finder engine implementation.
|
||||
*
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class PhpAdapter extends AbstractAdapter
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function searchInDirectory($dir)
|
||||
{
|
||||
$flags = \RecursiveDirectoryIterator::SKIP_DOTS;
|
||||
|
||||
if ($this->followLinks) {
|
||||
$flags |= \RecursiveDirectoryIterator::FOLLOW_SYMLINKS;
|
||||
}
|
||||
|
||||
$iterator = new \RecursiveIteratorIterator(
|
||||
new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs),
|
||||
\RecursiveIteratorIterator::SELF_FIRST
|
||||
);
|
||||
|
||||
if ($this->minDepth > 0 || $this->maxDepth < PHP_INT_MAX) {
|
||||
$iterator = new Iterator\DepthRangeFilterIterator($iterator, $this->minDepth, $this->maxDepth);
|
||||
}
|
||||
|
||||
if ($this->mode) {
|
||||
$iterator = new Iterator\FileTypeFilterIterator($iterator, $this->mode);
|
||||
}
|
||||
|
||||
if ($this->exclude) {
|
||||
$iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $this->exclude);
|
||||
}
|
||||
|
||||
if ($this->names || $this->notNames) {
|
||||
$iterator = new Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames);
|
||||
}
|
||||
|
||||
if ($this->contains || $this->notContains) {
|
||||
$iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains);
|
||||
}
|
||||
|
||||
if ($this->sizes) {
|
||||
$iterator = new Iterator\SizeRangeFilterIterator($iterator, $this->sizes);
|
||||
}
|
||||
|
||||
if ($this->dates) {
|
||||
$iterator = new Iterator\DateRangeFilterIterator($iterator, $this->dates);
|
||||
}
|
||||
|
||||
if ($this->filters) {
|
||||
$iterator = new Iterator\CustomFilterIterator($iterator, $this->filters);
|
||||
}
|
||||
|
||||
if ($this->sort) {
|
||||
$iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort);
|
||||
$iterator = $iteratorAggregate->getIterator();
|
||||
}
|
||||
|
||||
if ($this->paths || $this->notPaths) {
|
||||
$iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $this->notPaths);
|
||||
}
|
||||
|
||||
return $iterator;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'php';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function canBeUsed()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
30
vendor/symfony/finder/Symfony/Component/Finder/CHANGELOG.md
vendored
Normal file
30
vendor/symfony/finder/Symfony/Component/Finder/CHANGELOG.md
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
CHANGELOG
|
||||
=========
|
||||
|
||||
2.3.0
|
||||
-----
|
||||
|
||||
* added a way to ignore unreadable directories (via Finder::ignoreUnreadableDirs())
|
||||
* unified the way subfolders that are not executable are handled by always throwing an AccessDeniedException exception
|
||||
|
||||
2.2.0
|
||||
-----
|
||||
|
||||
* added Finder::path() and Finder::notPath() methods
|
||||
* added finder adapters to improve performance on specific platforms
|
||||
* added support for wildcard characters (glob patterns) in the paths passed
|
||||
to Finder::in()
|
||||
|
||||
2.1.0
|
||||
-----
|
||||
|
||||
* added Finder::sortByAccessedTime(), Finder::sortByChangedTime(), and
|
||||
Finder::sortByModifiedTime()
|
||||
* added Countable to Finder
|
||||
* added support for an array of directories as an argument to
|
||||
Finder::exclude()
|
||||
* added searching based on the file content via Finder::contains() and
|
||||
Finder::notContains()
|
||||
* added support for the != operator in the Comparator
|
||||
* [BC BREAK] filter expressions (used for file name and content) are no more
|
||||
considered as regexps but glob patterns when they are enclosed in '*' or '?'
|
98
vendor/symfony/finder/Symfony/Component/Finder/Comparator/Comparator.php
vendored
Normal file
98
vendor/symfony/finder/Symfony/Component/Finder/Comparator/Comparator.php
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Comparator;
|
||||
|
||||
/**
|
||||
* Comparator.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class Comparator
|
||||
{
|
||||
private $target;
|
||||
private $operator = '==';
|
||||
|
||||
/**
|
||||
* Gets the target value.
|
||||
*
|
||||
* @return string The target value
|
||||
*/
|
||||
public function getTarget()
|
||||
{
|
||||
return $this->target;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the target value.
|
||||
*
|
||||
* @param string $target The target value
|
||||
*/
|
||||
public function setTarget($target)
|
||||
{
|
||||
$this->target = $target;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the comparison operator.
|
||||
*
|
||||
* @return string The operator
|
||||
*/
|
||||
public function getOperator()
|
||||
{
|
||||
return $this->operator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the comparison operator.
|
||||
*
|
||||
* @param string $operator A valid operator
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function setOperator($operator)
|
||||
{
|
||||
if (!$operator) {
|
||||
$operator = '==';
|
||||
}
|
||||
|
||||
if (!in_array($operator, array('>', '<', '>=', '<=', '==', '!='))) {
|
||||
throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator));
|
||||
}
|
||||
|
||||
$this->operator = $operator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests against the target.
|
||||
*
|
||||
* @param mixed $test A test value
|
||||
*
|
||||
* @return Boolean
|
||||
*/
|
||||
public function test($test)
|
||||
{
|
||||
switch ($this->operator) {
|
||||
case '>':
|
||||
return $test > $this->target;
|
||||
case '>=':
|
||||
return $test >= $this->target;
|
||||
case '<':
|
||||
return $test < $this->target;
|
||||
case '<=':
|
||||
return $test <= $this->target;
|
||||
case '!=':
|
||||
return $test != $this->target;
|
||||
}
|
||||
|
||||
return $test == $this->target;
|
||||
}
|
||||
}
|
54
vendor/symfony/finder/Symfony/Component/Finder/Comparator/DateComparator.php
vendored
Normal file
54
vendor/symfony/finder/Symfony/Component/Finder/Comparator/DateComparator.php
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Comparator;
|
||||
|
||||
/**
|
||||
* DateCompare compiles date comparisons.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class DateComparator extends Comparator
|
||||
{
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $test A comparison string
|
||||
*
|
||||
* @throws \InvalidArgumentException If the test is not understood
|
||||
*/
|
||||
public function __construct($test)
|
||||
{
|
||||
if (!preg_match('#^\s*(==|!=|[<>]=?|after|since|before|until)?\s*(.+?)\s*$#i', $test, $matches)) {
|
||||
throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a date test.', $test));
|
||||
}
|
||||
|
||||
try {
|
||||
$date = new \DateTime($matches[2]);
|
||||
$target = $date->format('U');
|
||||
} catch (\Exception $e) {
|
||||
throw new \InvalidArgumentException(sprintf('"%s" is not a valid date.', $matches[2]));
|
||||
}
|
||||
|
||||
$operator = isset($matches[1]) ? $matches[1] : '==';
|
||||
if ('since' === $operator || 'after' === $operator) {
|
||||
$operator = '>';
|
||||
}
|
||||
|
||||
if ('until' === $operator || 'before' === $operator) {
|
||||
$operator = '<';
|
||||
}
|
||||
|
||||
$this->setOperator($operator);
|
||||
$this->setTarget($target);
|
||||
}
|
||||
}
|
82
vendor/symfony/finder/Symfony/Component/Finder/Comparator/NumberComparator.php
vendored
Normal file
82
vendor/symfony/finder/Symfony/Component/Finder/Comparator/NumberComparator.php
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Comparator;
|
||||
|
||||
/**
|
||||
* NumberComparator compiles a simple comparison to an anonymous
|
||||
* subroutine, which you can call with a value to be tested again.
|
||||
*
|
||||
* Now this would be very pointless, if NumberCompare didn't understand
|
||||
* magnitudes.
|
||||
*
|
||||
* The target value may use magnitudes of kilobytes (k, ki),
|
||||
* megabytes (m, mi), or gigabytes (g, gi). Those suffixed
|
||||
* with an i use the appropriate 2**n version in accordance with the
|
||||
* IEC standard: http://physics.nist.gov/cuu/Units/binary.html
|
||||
*
|
||||
* Based on the Perl Number::Compare module.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com> PHP port
|
||||
* @author Richard Clamp <richardc@unixbeard.net> Perl version
|
||||
*
|
||||
* @copyright 2004-2005 Fabien Potencier <fabien@symfony.com>
|
||||
* @copyright 2002 Richard Clamp <richardc@unixbeard.net>
|
||||
*
|
||||
* @see http://physics.nist.gov/cuu/Units/binary.html
|
||||
*/
|
||||
class NumberComparator extends Comparator
|
||||
{
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $test A comparison string
|
||||
*
|
||||
* @throws \InvalidArgumentException If the test is not understood
|
||||
*/
|
||||
public function __construct($test)
|
||||
{
|
||||
if (!preg_match('#^\s*(==|!=|[<>]=?)?\s*([0-9\.]+)\s*([kmg]i?)?\s*$#i', $test, $matches)) {
|
||||
throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a number test.', $test));
|
||||
}
|
||||
|
||||
$target = $matches[2];
|
||||
if (!is_numeric($target)) {
|
||||
throw new \InvalidArgumentException(sprintf('Invalid number "%s".', $target));
|
||||
}
|
||||
if (isset($matches[3])) {
|
||||
// magnitude
|
||||
switch (strtolower($matches[3])) {
|
||||
case 'k':
|
||||
$target *= 1000;
|
||||
break;
|
||||
case 'ki':
|
||||
$target *= 1024;
|
||||
break;
|
||||
case 'm':
|
||||
$target *= 1000000;
|
||||
break;
|
||||
case 'mi':
|
||||
$target *= 1024*1024;
|
||||
break;
|
||||
case 'g':
|
||||
$target *= 1000000000;
|
||||
break;
|
||||
case 'gi':
|
||||
$target *= 1024*1024*1024;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$this->setTarget($target);
|
||||
$this->setOperator(isset($matches[1]) ? $matches[1] : '==');
|
||||
}
|
||||
}
|
19
vendor/symfony/finder/Symfony/Component/Finder/Exception/AccessDeniedException.php
vendored
Normal file
19
vendor/symfony/finder/Symfony/Component/Finder/Exception/AccessDeniedException.php
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Exception;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
|
||||
*/
|
||||
class AccessDeniedException extends \UnexpectedValueException
|
||||
{
|
||||
}
|
46
vendor/symfony/finder/Symfony/Component/Finder/Exception/AdapterFailureException.php
vendored
Normal file
46
vendor/symfony/finder/Symfony/Component/Finder/Exception/AdapterFailureException.php
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Exception;
|
||||
|
||||
use Symfony\Component\Finder\Adapter\AdapterInterface;
|
||||
|
||||
/**
|
||||
* Base exception for all adapter failures.
|
||||
*
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class AdapterFailureException extends \RuntimeException implements ExceptionInterface
|
||||
{
|
||||
/**
|
||||
* @var \Symfony\Component\Finder\Adapter\AdapterInterface
|
||||
*/
|
||||
private $adapter;
|
||||
|
||||
/**
|
||||
* @param AdapterInterface $adapter
|
||||
* @param string|null $message
|
||||
* @param \Exception|null $previous
|
||||
*/
|
||||
public function __construct(AdapterInterface $adapter, $message = null, \Exception $previous = null)
|
||||
{
|
||||
$this->adapter = $adapter;
|
||||
parent::__construct($message ?: 'Search failed with "'.$adapter->getName().'" adapter.', $previous);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getAdapter()
|
||||
{
|
||||
return $this->adapter;
|
||||
}
|
||||
}
|
23
vendor/symfony/finder/Symfony/Component/Finder/Exception/ExceptionInterface.php
vendored
Normal file
23
vendor/symfony/finder/Symfony/Component/Finder/Exception/ExceptionInterface.php
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Exception;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
interface ExceptionInterface
|
||||
{
|
||||
/**
|
||||
* @return \Symfony\Component\Finder\Adapter\AdapterInterface
|
||||
*/
|
||||
public function getAdapter();
|
||||
}
|
19
vendor/symfony/finder/Symfony/Component/Finder/Exception/OperationNotPermitedException.php
vendored
Normal file
19
vendor/symfony/finder/Symfony/Component/Finder/Exception/OperationNotPermitedException.php
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Exception;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class OperationNotPermitedException extends AdapterFailureException
|
||||
{
|
||||
}
|
45
vendor/symfony/finder/Symfony/Component/Finder/Exception/ShellCommandFailureException.php
vendored
Normal file
45
vendor/symfony/finder/Symfony/Component/Finder/Exception/ShellCommandFailureException.php
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Exception;
|
||||
|
||||
use Symfony\Component\Finder\Adapter\AdapterInterface;
|
||||
use Symfony\Component\Finder\Shell\Command;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class ShellCommandFailureException extends AdapterFailureException
|
||||
{
|
||||
/**
|
||||
* @var Command
|
||||
*/
|
||||
private $command;
|
||||
|
||||
/**
|
||||
* @param AdapterInterface $adapter
|
||||
* @param Command $command
|
||||
* @param \Exception|null $previous
|
||||
*/
|
||||
public function __construct(AdapterInterface $adapter, Command $command, \Exception $previous = null)
|
||||
{
|
||||
$this->command = $command;
|
||||
parent::__construct($adapter, 'Shell command failed: "'.$command->join().'".', $previous);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Command
|
||||
*/
|
||||
public function getCommand()
|
||||
{
|
||||
return $this->command;
|
||||
}
|
||||
}
|
146
vendor/symfony/finder/Symfony/Component/Finder/Expression/Expression.php
vendored
Normal file
146
vendor/symfony/finder/Symfony/Component/Finder/Expression/Expression.php
vendored
Normal file
@@ -0,0 +1,146 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Expression;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class Expression implements ValueInterface
|
||||
{
|
||||
const TYPE_REGEX = 1;
|
||||
const TYPE_GLOB = 2;
|
||||
|
||||
/**
|
||||
* @var ValueInterface
|
||||
*/
|
||||
private $value;
|
||||
|
||||
/**
|
||||
* @param string $expr
|
||||
*
|
||||
* @return Expression
|
||||
*/
|
||||
public static function create($expr)
|
||||
{
|
||||
return new self($expr);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $expr
|
||||
*/
|
||||
public function __construct($expr)
|
||||
{
|
||||
try {
|
||||
$this->value = Regex::create($expr);
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
$this->value = new Glob($expr);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
return $this->value->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function renderPattern()
|
||||
{
|
||||
return $this->value->renderPattern();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isCaseSensitive()
|
||||
{
|
||||
return $this->value->isCaseSensitive();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return $this->value->getType();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function prepend($expr)
|
||||
{
|
||||
$this->value->prepend($expr);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function append($expr)
|
||||
{
|
||||
$this->value->append($expr);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isRegex()
|
||||
{
|
||||
return self::TYPE_REGEX === $this->value->getType();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isGlob()
|
||||
{
|
||||
return self::TYPE_GLOB === $this->value->getType();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \LogicException
|
||||
*
|
||||
* @return Glob
|
||||
*/
|
||||
public function getGlob()
|
||||
{
|
||||
if (self::TYPE_GLOB !== $this->value->getType()) {
|
||||
throw new \LogicException('Regex cant be transformed to glob.');
|
||||
}
|
||||
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Regex
|
||||
*/
|
||||
public function getRegex()
|
||||
{
|
||||
return self::TYPE_REGEX === $this->value->getType() ? $this->value : $this->value->toRegex();
|
||||
}
|
||||
}
|
157
vendor/symfony/finder/Symfony/Component/Finder/Expression/Glob.php
vendored
Normal file
157
vendor/symfony/finder/Symfony/Component/Finder/Expression/Glob.php
vendored
Normal file
@@ -0,0 +1,157 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Expression;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class Glob implements ValueInterface
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $pattern;
|
||||
|
||||
/**
|
||||
* @param string $pattern
|
||||
*/
|
||||
public function __construct($pattern)
|
||||
{
|
||||
$this->pattern = $pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
return $this->pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function renderPattern()
|
||||
{
|
||||
return $this->pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return Expression::TYPE_GLOB;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function isCaseSensitive()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function prepend($expr)
|
||||
{
|
||||
$this->pattern = $expr.$this->pattern;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function append($expr)
|
||||
{
|
||||
$this->pattern .= $expr;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if glob is expandable ("*.{a,b}" syntax).
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isExpandable()
|
||||
{
|
||||
return false !== strpos($this->pattern, '{')
|
||||
&& false !== strpos($this->pattern, '}');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $strictLeadingDot
|
||||
* @param bool $strictWildcardSlash
|
||||
*
|
||||
* @return Regex
|
||||
*/
|
||||
public function toRegex($strictLeadingDot = true, $strictWildcardSlash = true)
|
||||
{
|
||||
$firstByte = true;
|
||||
$escaping = false;
|
||||
$inCurlies = 0;
|
||||
$regex = '';
|
||||
$sizeGlob = strlen($this->pattern);
|
||||
for ($i = 0; $i < $sizeGlob; $i++) {
|
||||
$car = $this->pattern[$i];
|
||||
if ($firstByte) {
|
||||
if ($strictLeadingDot && '.' !== $car) {
|
||||
$regex .= '(?=[^\.])';
|
||||
}
|
||||
|
||||
$firstByte = false;
|
||||
}
|
||||
|
||||
if ('/' === $car) {
|
||||
$firstByte = true;
|
||||
}
|
||||
|
||||
if ('.' === $car || '(' === $car || ')' === $car || '|' === $car || '+' === $car || '^' === $car || '$' === $car) {
|
||||
$regex .= "\\$car";
|
||||
} elseif ('*' === $car) {
|
||||
$regex .= $escaping ? '\\*' : ($strictWildcardSlash ? '[^/]*' : '.*');
|
||||
} elseif ('?' === $car) {
|
||||
$regex .= $escaping ? '\\?' : ($strictWildcardSlash ? '[^/]' : '.');
|
||||
} elseif ('{' === $car) {
|
||||
$regex .= $escaping ? '\\{' : '(';
|
||||
if (!$escaping) {
|
||||
++$inCurlies;
|
||||
}
|
||||
} elseif ('}' === $car && $inCurlies) {
|
||||
$regex .= $escaping ? '}' : ')';
|
||||
if (!$escaping) {
|
||||
--$inCurlies;
|
||||
}
|
||||
} elseif (',' === $car && $inCurlies) {
|
||||
$regex .= $escaping ? ',' : '|';
|
||||
} elseif ('\\' === $car) {
|
||||
if ($escaping) {
|
||||
$regex .= '\\\\';
|
||||
$escaping = false;
|
||||
} else {
|
||||
$escaping = true;
|
||||
}
|
||||
|
||||
continue;
|
||||
} else {
|
||||
$regex .= $car;
|
||||
}
|
||||
$escaping = false;
|
||||
}
|
||||
|
||||
return new Regex('^'.$regex.'$');
|
||||
}
|
||||
}
|
317
vendor/symfony/finder/Symfony/Component/Finder/Expression/Regex.php
vendored
Normal file
317
vendor/symfony/finder/Symfony/Component/Finder/Expression/Regex.php
vendored
Normal file
@@ -0,0 +1,317 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Expression;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class Regex implements ValueInterface
|
||||
{
|
||||
const START_FLAG = '^';
|
||||
const END_FLAG = '$';
|
||||
const BOUNDARY = '~';
|
||||
const JOKER = '.*';
|
||||
const ESCAPING = '\\';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $pattern;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $options;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $startFlag;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $endFlag;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $startJoker;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $endJoker;
|
||||
|
||||
/**
|
||||
* @param string $expr
|
||||
*
|
||||
* @return Regex
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public static function create($expr)
|
||||
{
|
||||
if (preg_match('/^(.{3,}?)([imsxuADU]*)$/', $expr, $m)) {
|
||||
$start = substr($m[1], 0, 1);
|
||||
$end = substr($m[1], -1);
|
||||
|
||||
if (($start === $end && !preg_match('/[*?[:alnum:] \\\\]/', $start)) || ($start === '{' && $end === '}')) {
|
||||
return new self(substr($m[1], 1, -1), $m[2], $end);
|
||||
}
|
||||
}
|
||||
|
||||
throw new \InvalidArgumentException('Given expression is not a regex.');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $pattern
|
||||
* @param string $options
|
||||
* @param string $delimiter
|
||||
*/
|
||||
public function __construct($pattern, $options = '', $delimiter = null)
|
||||
{
|
||||
if (null !== $delimiter) {
|
||||
// removes delimiter escaping
|
||||
$pattern = str_replace('\\'.$delimiter, $delimiter, $pattern);
|
||||
}
|
||||
|
||||
$this->parsePattern($pattern);
|
||||
$this->options = $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
return self::BOUNDARY
|
||||
.$this->renderPattern()
|
||||
.self::BOUNDARY
|
||||
.$this->options;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function renderPattern()
|
||||
{
|
||||
return ($this->startFlag ? self::START_FLAG : '')
|
||||
.($this->startJoker ? self::JOKER : '')
|
||||
.str_replace(self::BOUNDARY, '\\'.self::BOUNDARY, $this->pattern)
|
||||
.($this->endJoker ? self::JOKER : '')
|
||||
.($this->endFlag ? self::END_FLAG : '');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function isCaseSensitive()
|
||||
{
|
||||
return !$this->hasOption('i');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return Expression::TYPE_REGEX;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function prepend($expr)
|
||||
{
|
||||
$this->pattern = $expr.$this->pattern;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function append($expr)
|
||||
{
|
||||
$this->pattern .= $expr;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $option
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function hasOption($option)
|
||||
{
|
||||
return false !== strpos($this->options, $option);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $option
|
||||
*
|
||||
* @return Regex
|
||||
*/
|
||||
public function addOption($option)
|
||||
{
|
||||
if (!$this->hasOption($option)) {
|
||||
$this->options.= $option;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $option
|
||||
*
|
||||
* @return Regex
|
||||
*/
|
||||
public function removeOption($option)
|
||||
{
|
||||
$this->options = str_replace($option, '', $this->options);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $startFlag
|
||||
*
|
||||
* @return Regex
|
||||
*/
|
||||
public function setStartFlag($startFlag)
|
||||
{
|
||||
$this->startFlag = $startFlag;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasStartFlag()
|
||||
{
|
||||
return $this->startFlag;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $endFlag
|
||||
*
|
||||
* @return Regex
|
||||
*/
|
||||
public function setEndFlag($endFlag)
|
||||
{
|
||||
$this->endFlag = (bool) $endFlag;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasEndFlag()
|
||||
{
|
||||
return $this->endFlag;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $startJoker
|
||||
*
|
||||
* @return Regex
|
||||
*/
|
||||
public function setStartJoker($startJoker)
|
||||
{
|
||||
$this->startJoker = $startJoker;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasStartJoker()
|
||||
{
|
||||
return $this->startJoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $endJoker
|
||||
*
|
||||
* @return Regex
|
||||
*/
|
||||
public function setEndJoker($endJoker)
|
||||
{
|
||||
$this->endJoker = (bool) $endJoker;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasEndJoker()
|
||||
{
|
||||
return $this->endJoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $replacement
|
||||
*
|
||||
* @return Regex
|
||||
*/
|
||||
public function replaceJokers($replacement)
|
||||
{
|
||||
$replace = function ($subject) use ($replacement) {
|
||||
$subject = $subject[0];
|
||||
$replace = 0 === substr_count($subject, '\\') % 2;
|
||||
|
||||
return $replace ? str_replace('.', $replacement, $subject) : $subject;
|
||||
};
|
||||
|
||||
$this->pattern = preg_replace_callback('~[\\\\]*\\.~', $replace, $this->pattern);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $pattern
|
||||
*/
|
||||
private function parsePattern($pattern)
|
||||
{
|
||||
if ($this->startFlag = self::START_FLAG === substr($pattern, 0, 1)) {
|
||||
$pattern = substr($pattern, 1);
|
||||
}
|
||||
|
||||
if ($this->startJoker = self::JOKER === substr($pattern, 0, 2)) {
|
||||
$pattern = substr($pattern, 2);
|
||||
}
|
||||
|
||||
if ($this->endFlag = (self::END_FLAG === substr($pattern, -1) && self::ESCAPING !== substr($pattern, -2, -1))) {
|
||||
$pattern = substr($pattern, 0, -1);
|
||||
}
|
||||
|
||||
if ($this->endJoker = (self::JOKER === substr($pattern, -2) && self::ESCAPING !== substr($pattern, -3, -2))) {
|
||||
$pattern = substr($pattern, 0, -2);
|
||||
}
|
||||
|
||||
$this->pattern = $pattern;
|
||||
}
|
||||
}
|
60
vendor/symfony/finder/Symfony/Component/Finder/Expression/ValueInterface.php
vendored
Normal file
60
vendor/symfony/finder/Symfony/Component/Finder/Expression/ValueInterface.php
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Expression;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
interface ValueInterface
|
||||
{
|
||||
/**
|
||||
* Renders string representation of expression.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function render();
|
||||
|
||||
/**
|
||||
* Renders string representation of pattern.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function renderPattern();
|
||||
|
||||
/**
|
||||
* Returns value case sensitivity.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isCaseSensitive();
|
||||
|
||||
/**
|
||||
* Returns expression type.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getType();
|
||||
|
||||
/**
|
||||
* @param string $expr
|
||||
*
|
||||
* @return ValueInterface
|
||||
*/
|
||||
public function prepend($expr);
|
||||
|
||||
/**
|
||||
* @param string $expr
|
||||
*
|
||||
* @return ValueInterface
|
||||
*/
|
||||
public function append($expr);
|
||||
}
|
829
vendor/symfony/finder/Symfony/Component/Finder/Finder.php
vendored
Normal file
829
vendor/symfony/finder/Symfony/Component/Finder/Finder.php
vendored
Normal file
@@ -0,0 +1,829 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder;
|
||||
|
||||
use Symfony\Component\Finder\Adapter\AdapterInterface;
|
||||
use Symfony\Component\Finder\Adapter\GnuFindAdapter;
|
||||
use Symfony\Component\Finder\Adapter\BsdFindAdapter;
|
||||
use Symfony\Component\Finder\Adapter\PhpAdapter;
|
||||
use Symfony\Component\Finder\Exception\ExceptionInterface;
|
||||
|
||||
/**
|
||||
* Finder allows to build rules to find files and directories.
|
||||
*
|
||||
* It is a thin wrapper around several specialized iterator classes.
|
||||
*
|
||||
* All rules may be invoked several times.
|
||||
*
|
||||
* All methods return the current Finder object to allow easy chaining:
|
||||
*
|
||||
* $finder = Finder::create()->files()->name('*.php')->in(__DIR__);
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
class Finder implements \IteratorAggregate, \Countable
|
||||
{
|
||||
const IGNORE_VCS_FILES = 1;
|
||||
const IGNORE_DOT_FILES = 2;
|
||||
|
||||
private $mode = 0;
|
||||
private $names = array();
|
||||
private $notNames = array();
|
||||
private $exclude = array();
|
||||
private $filters = array();
|
||||
private $depths = array();
|
||||
private $sizes = array();
|
||||
private $followLinks = false;
|
||||
private $sort = false;
|
||||
private $ignore = 0;
|
||||
private $dirs = array();
|
||||
private $dates = array();
|
||||
private $iterators = array();
|
||||
private $contains = array();
|
||||
private $notContains = array();
|
||||
private $adapters = array();
|
||||
private $paths = array();
|
||||
private $notPaths = array();
|
||||
private $ignoreUnreadableDirs = false;
|
||||
|
||||
private static $vcsPatterns = array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg');
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->ignore = static::IGNORE_VCS_FILES | static::IGNORE_DOT_FILES;
|
||||
|
||||
$this
|
||||
->addAdapter(new GnuFindAdapter())
|
||||
->addAdapter(new BsdFindAdapter())
|
||||
->addAdapter(new PhpAdapter(), -50)
|
||||
->setAdapter('php')
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new Finder.
|
||||
*
|
||||
* @return Finder A new Finder instance
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public static function create()
|
||||
{
|
||||
return new static();
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a finder engine implementation.
|
||||
*
|
||||
* @param AdapterInterface $adapter An adapter instance
|
||||
* @param integer $priority Highest is selected first
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*/
|
||||
public function addAdapter(Adapter\AdapterInterface $adapter, $priority = 0)
|
||||
{
|
||||
$this->adapters[$adapter->getName()] = array(
|
||||
'adapter' => $adapter,
|
||||
'priority' => $priority,
|
||||
'selected' => false,
|
||||
);
|
||||
|
||||
return $this->sortAdapters();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the selected adapter to the best one according to the current platform the code is run on.
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*/
|
||||
public function useBestAdapter()
|
||||
{
|
||||
$this->resetAdapterSelection();
|
||||
|
||||
return $this->sortAdapters();
|
||||
}
|
||||
|
||||
/**
|
||||
* Selects the adapter to use.
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*/
|
||||
public function setAdapter($name)
|
||||
{
|
||||
if (!isset($this->adapters[$name])) {
|
||||
throw new \InvalidArgumentException(sprintf('Adapter "%s" does not exist.', $name));
|
||||
}
|
||||
|
||||
$this->resetAdapterSelection();
|
||||
$this->adapters[$name]['selected'] = true;
|
||||
|
||||
return $this->sortAdapters();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes all adapters registered in the finder.
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*/
|
||||
public function removeAdapters()
|
||||
{
|
||||
$this->adapters = array();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns registered adapters ordered by priority without extra information.
|
||||
*
|
||||
* @return AdapterInterface[]
|
||||
*/
|
||||
public function getAdapters()
|
||||
{
|
||||
return array_values(array_map(function(array $adapter) {
|
||||
return $adapter['adapter'];
|
||||
}, $this->adapters));
|
||||
}
|
||||
|
||||
/**
|
||||
* Restricts the matching to directories only.
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function directories()
|
||||
{
|
||||
$this->mode = Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restricts the matching to files only.
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function files()
|
||||
{
|
||||
$this->mode = Iterator\FileTypeFilterIterator::ONLY_FILES;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds tests for the directory depth.
|
||||
*
|
||||
* Usage:
|
||||
*
|
||||
* $finder->depth('> 1') // the Finder will start matching at level 1.
|
||||
* $finder->depth('< 3') // the Finder will descend at most 3 levels of directories below the starting point.
|
||||
*
|
||||
* @param int $level The depth level expression
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\DepthRangeFilterIterator
|
||||
* @see Symfony\Component\Finder\Comparator\NumberComparator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function depth($level)
|
||||
{
|
||||
$this->depths[] = new Comparator\NumberComparator($level);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds tests for file dates (last modified).
|
||||
*
|
||||
* The date must be something that strtotime() is able to parse:
|
||||
*
|
||||
* $finder->date('since yesterday');
|
||||
* $finder->date('until 2 days ago');
|
||||
* $finder->date('> now - 2 hours');
|
||||
* $finder->date('>= 2005-10-15');
|
||||
*
|
||||
* @param string $date A date rage string
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see strtotime
|
||||
* @see Symfony\Component\Finder\Iterator\DateRangeFilterIterator
|
||||
* @see Symfony\Component\Finder\Comparator\DateComparator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function date($date)
|
||||
{
|
||||
$this->dates[] = new Comparator\DateComparator($date);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds rules that files must match.
|
||||
*
|
||||
* You can use patterns (delimited with / sign), globs or simple strings.
|
||||
*
|
||||
* $finder->name('*.php')
|
||||
* $finder->name('/\.php$/') // same as above
|
||||
* $finder->name('test.php')
|
||||
*
|
||||
* @param string $pattern A pattern (a regexp, a glob, or a string)
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\FilenameFilterIterator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function name($pattern)
|
||||
{
|
||||
$this->names[] = $pattern;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds rules that files must not match.
|
||||
*
|
||||
* @param string $pattern A pattern (a regexp, a glob, or a string)
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\FilenameFilterIterator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function notName($pattern)
|
||||
{
|
||||
$this->notNames[] = $pattern;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds tests that file contents must match.
|
||||
*
|
||||
* Strings or PCRE patterns can be used:
|
||||
*
|
||||
* $finder->contains('Lorem ipsum')
|
||||
* $finder->contains('/Lorem ipsum/i')
|
||||
*
|
||||
* @param string $pattern A pattern (string or regexp)
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\FilecontentFilterIterator
|
||||
*/
|
||||
public function contains($pattern)
|
||||
{
|
||||
$this->contains[] = $pattern;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds tests that file contents must not match.
|
||||
*
|
||||
* Strings or PCRE patterns can be used:
|
||||
*
|
||||
* $finder->notContains('Lorem ipsum')
|
||||
* $finder->notContains('/Lorem ipsum/i')
|
||||
*
|
||||
* @param string $pattern A pattern (string or regexp)
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\FilecontentFilterIterator
|
||||
*/
|
||||
public function notContains($pattern)
|
||||
{
|
||||
$this->notContains[] = $pattern;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds rules that filenames must match.
|
||||
*
|
||||
* You can use patterns (delimited with / sign) or simple strings.
|
||||
*
|
||||
* $finder->path('some/special/dir')
|
||||
* $finder->path('/some\/special\/dir/') // same as above
|
||||
*
|
||||
* Use only / as dirname separator.
|
||||
*
|
||||
* @param string $pattern A pattern (a regexp or a string)
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\FilenameFilterIterator
|
||||
*/
|
||||
public function path($pattern)
|
||||
{
|
||||
$this->paths[] = $pattern;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds rules that filenames must not match.
|
||||
*
|
||||
* You can use patterns (delimited with / sign) or simple strings.
|
||||
*
|
||||
* $finder->notPath('some/special/dir')
|
||||
* $finder->notPath('/some\/special\/dir/') // same as above
|
||||
*
|
||||
* Use only / as dirname separator.
|
||||
*
|
||||
* @param string $pattern A pattern (a regexp or a string)
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\FilenameFilterIterator
|
||||
*/
|
||||
public function notPath($pattern)
|
||||
{
|
||||
$this->notPaths[] = $pattern;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds tests for file sizes.
|
||||
*
|
||||
* $finder->size('> 10K');
|
||||
* $finder->size('<= 1Ki');
|
||||
* $finder->size(4);
|
||||
*
|
||||
* @param string $size A size range string
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\SizeRangeFilterIterator
|
||||
* @see Symfony\Component\Finder\Comparator\NumberComparator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function size($size)
|
||||
{
|
||||
$this->sizes[] = new Comparator\NumberComparator($size);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Excludes directories.
|
||||
*
|
||||
* @param string|array $dirs A directory path or an array of directories
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function exclude($dirs)
|
||||
{
|
||||
$this->exclude = array_merge($this->exclude, (array) $dirs);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Excludes "hidden" directories and files (starting with a dot).
|
||||
*
|
||||
* @param Boolean $ignoreDotFiles Whether to exclude "hidden" files or not
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function ignoreDotFiles($ignoreDotFiles)
|
||||
{
|
||||
if ($ignoreDotFiles) {
|
||||
$this->ignore = $this->ignore | static::IGNORE_DOT_FILES;
|
||||
} else {
|
||||
$this->ignore = $this->ignore & ~static::IGNORE_DOT_FILES;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Forces the finder to ignore version control directories.
|
||||
*
|
||||
* @param Boolean $ignoreVCS Whether to exclude VCS files or not
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function ignoreVCS($ignoreVCS)
|
||||
{
|
||||
if ($ignoreVCS) {
|
||||
$this->ignore = $this->ignore | static::IGNORE_VCS_FILES;
|
||||
} else {
|
||||
$this->ignore = $this->ignore & ~static::IGNORE_VCS_FILES;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds VCS patterns.
|
||||
*
|
||||
* @see ignoreVCS
|
||||
*
|
||||
* @param string|string[] $pattern VCS patterns to ignore
|
||||
*/
|
||||
public static function addVCSPattern($pattern)
|
||||
{
|
||||
foreach ((array) $pattern as $p) {
|
||||
self::$vcsPatterns[] = $p;
|
||||
}
|
||||
|
||||
self::$vcsPatterns = array_unique(self::$vcsPatterns);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts files and directories by an anonymous function.
|
||||
*
|
||||
* The anonymous function receives two \SplFileInfo instances to compare.
|
||||
*
|
||||
* This can be slow as all the matching files and directories must be retrieved for comparison.
|
||||
*
|
||||
* @param \Closure $closure An anonymous function
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\SortableIterator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function sort(\Closure $closure)
|
||||
{
|
||||
$this->sort = $closure;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts files and directories by name.
|
||||
*
|
||||
* This can be slow as all the matching files and directories must be retrieved for comparison.
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\SortableIterator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function sortByName()
|
||||
{
|
||||
$this->sort = Iterator\SortableIterator::SORT_BY_NAME;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts files and directories by type (directories before files), then by name.
|
||||
*
|
||||
* This can be slow as all the matching files and directories must be retrieved for comparison.
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\SortableIterator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function sortByType()
|
||||
{
|
||||
$this->sort = Iterator\SortableIterator::SORT_BY_TYPE;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts files and directories by the last accessed time.
|
||||
*
|
||||
* This is the time that the file was last accessed, read or written to.
|
||||
*
|
||||
* This can be slow as all the matching files and directories must be retrieved for comparison.
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\SortableIterator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function sortByAccessedTime()
|
||||
{
|
||||
$this->sort = Iterator\SortableIterator::SORT_BY_ACCESSED_TIME;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts files and directories by the last inode changed time.
|
||||
*
|
||||
* This is the time that the inode information was last modified (permissions, owner, group or other metadata).
|
||||
*
|
||||
* On Windows, since inode is not available, changed time is actually the file creation time.
|
||||
*
|
||||
* This can be slow as all the matching files and directories must be retrieved for comparison.
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\SortableIterator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function sortByChangedTime()
|
||||
{
|
||||
$this->sort = Iterator\SortableIterator::SORT_BY_CHANGED_TIME;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts files and directories by the last modified time.
|
||||
*
|
||||
* This is the last time the actual contents of the file were last modified.
|
||||
*
|
||||
* This can be slow as all the matching files and directories must be retrieved for comparison.
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\SortableIterator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function sortByModifiedTime()
|
||||
{
|
||||
$this->sort = Iterator\SortableIterator::SORT_BY_MODIFIED_TIME;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the iterator with an anonymous function.
|
||||
*
|
||||
* The anonymous function receives a \SplFileInfo and must return false
|
||||
* to remove files.
|
||||
*
|
||||
* @param \Closure $closure An anonymous function
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @see Symfony\Component\Finder\Iterator\CustomFilterIterator
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function filter(\Closure $closure)
|
||||
{
|
||||
$this->filters[] = $closure;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Forces the following of symlinks.
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function followLinks()
|
||||
{
|
||||
$this->followLinks = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells finder to ignore unreadable directories.
|
||||
*
|
||||
* By default, scanning unreadable directories content throws an AccessDeniedException.
|
||||
*
|
||||
* @param boolean $ignore
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*/
|
||||
public function ignoreUnreadableDirs($ignore = true)
|
||||
{
|
||||
$this->ignoreUnreadableDirs = (Boolean) $ignore;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches files and directories which match defined rules.
|
||||
*
|
||||
* @param string|array $dirs A directory path or an array of directories
|
||||
*
|
||||
* @return Finder The current Finder instance
|
||||
*
|
||||
* @throws \InvalidArgumentException if one of the directories does not exist
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
public function in($dirs)
|
||||
{
|
||||
$resolvedDirs = array();
|
||||
|
||||
foreach ((array) $dirs as $dir) {
|
||||
if (is_dir($dir)) {
|
||||
$resolvedDirs[] = $dir;
|
||||
} elseif ($glob = glob($dir, GLOB_ONLYDIR)) {
|
||||
$resolvedDirs = array_merge($resolvedDirs, $glob);
|
||||
} else {
|
||||
throw new \InvalidArgumentException(sprintf('The "%s" directory does not exist.', $dir));
|
||||
}
|
||||
}
|
||||
|
||||
$this->dirs = array_merge($this->dirs, $resolvedDirs);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an Iterator for the current Finder configuration.
|
||||
*
|
||||
* This method implements the IteratorAggregate interface.
|
||||
*
|
||||
* @return \Iterator An iterator
|
||||
*
|
||||
* @throws \LogicException if the in() method has not been called
|
||||
*/
|
||||
public function getIterator()
|
||||
{
|
||||
if (0 === count($this->dirs) && 0 === count($this->iterators)) {
|
||||
throw new \LogicException('You must call one of in() or append() methods before iterating over a Finder.');
|
||||
}
|
||||
|
||||
if (1 === count($this->dirs) && 0 === count($this->iterators)) {
|
||||
return $this->searchInDirectory($this->dirs[0]);
|
||||
}
|
||||
|
||||
$iterator = new \AppendIterator();
|
||||
foreach ($this->dirs as $dir) {
|
||||
$iterator->append($this->searchInDirectory($dir));
|
||||
}
|
||||
|
||||
foreach ($this->iterators as $it) {
|
||||
$iterator->append($it);
|
||||
}
|
||||
|
||||
return $iterator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends an existing set of files/directories to the finder.
|
||||
*
|
||||
* The set can be another Finder, an Iterator, an IteratorAggregate, or even a plain array.
|
||||
*
|
||||
* @param mixed $iterator
|
||||
*
|
||||
* @return Finder The finder
|
||||
*
|
||||
* @throws \InvalidArgumentException When the given argument is not iterable.
|
||||
*/
|
||||
public function append($iterator)
|
||||
{
|
||||
if ($iterator instanceof \IteratorAggregate) {
|
||||
$this->iterators[] = $iterator->getIterator();
|
||||
} elseif ($iterator instanceof \Iterator) {
|
||||
$this->iterators[] = $iterator;
|
||||
} elseif ($iterator instanceof \Traversable || is_array($iterator)) {
|
||||
$it = new \ArrayIterator();
|
||||
foreach ($iterator as $file) {
|
||||
$it->append($file instanceof \SplFileInfo ? $file : new \SplFileInfo($file));
|
||||
}
|
||||
$this->iterators[] = $it;
|
||||
} else {
|
||||
throw new \InvalidArgumentException('Finder::append() method wrong argument type.');
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts all the results collected by the iterators.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function count()
|
||||
{
|
||||
return iterator_count($this->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Finder The current Finder instance
|
||||
*/
|
||||
private function sortAdapters()
|
||||
{
|
||||
uasort($this->adapters, function (array $a, array $b) {
|
||||
if ($a['selected'] || $b['selected']) {
|
||||
return $a['selected'] ? -1 : 1;
|
||||
}
|
||||
|
||||
return $a['priority'] > $b['priority'] ? -1 : 1;
|
||||
});
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $dir
|
||||
*
|
||||
* @return \Iterator
|
||||
*
|
||||
* @throws \RuntimeException When none of the adapters are supported
|
||||
*/
|
||||
private function searchInDirectory($dir)
|
||||
{
|
||||
if (static::IGNORE_VCS_FILES === (static::IGNORE_VCS_FILES & $this->ignore)) {
|
||||
$this->exclude = array_merge($this->exclude, self::$vcsPatterns);
|
||||
}
|
||||
|
||||
if (static::IGNORE_DOT_FILES === (static::IGNORE_DOT_FILES & $this->ignore)) {
|
||||
$this->notPaths[] = '#(^|/)\..+(/|$)#';
|
||||
}
|
||||
|
||||
foreach ($this->adapters as $adapter) {
|
||||
if ($adapter['adapter']->isSupported()) {
|
||||
try {
|
||||
return $this
|
||||
->buildAdapter($adapter['adapter'])
|
||||
->searchInDirectory($dir);
|
||||
} catch (ExceptionInterface $e) {}
|
||||
}
|
||||
}
|
||||
|
||||
throw new \RuntimeException('No supported adapter found.');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param AdapterInterface $adapter
|
||||
*
|
||||
* @return AdapterInterface
|
||||
*/
|
||||
private function buildAdapter(AdapterInterface $adapter)
|
||||
{
|
||||
return $adapter
|
||||
->setFollowLinks($this->followLinks)
|
||||
->setDepths($this->depths)
|
||||
->setMode($this->mode)
|
||||
->setExclude($this->exclude)
|
||||
->setNames($this->names)
|
||||
->setNotNames($this->notNames)
|
||||
->setContains($this->contains)
|
||||
->setNotContains($this->notContains)
|
||||
->setSizes($this->sizes)
|
||||
->setDates($this->dates)
|
||||
->setFilters($this->filters)
|
||||
->setSort($this->sort)
|
||||
->setPath($this->paths)
|
||||
->setNotPath($this->notPaths)
|
||||
->ignoreUnreadableDirs($this->ignoreUnreadableDirs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unselects all adapters.
|
||||
*/
|
||||
private function resetAdapterSelection()
|
||||
{
|
||||
$this->adapters = array_map(function (array $properties) {
|
||||
$properties['selected'] = false;
|
||||
|
||||
return $properties;
|
||||
}, $this->adapters);
|
||||
}
|
||||
}
|
103
vendor/symfony/finder/Symfony/Component/Finder/Glob.php
vendored
Normal file
103
vendor/symfony/finder/Symfony/Component/Finder/Glob.php
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder;
|
||||
|
||||
/**
|
||||
* Glob matches globbing patterns against text.
|
||||
*
|
||||
* if match_glob("foo.*", "foo.bar") echo "matched\n";
|
||||
*
|
||||
* // prints foo.bar and foo.baz
|
||||
* $regex = glob_to_regex("foo.*");
|
||||
* for (array('foo.bar', 'foo.baz', 'foo', 'bar') as $t)
|
||||
* {
|
||||
* if (/$regex/) echo "matched: $car\n";
|
||||
* }
|
||||
*
|
||||
* Glob implements glob(3) style matching that can be used to match
|
||||
* against text, rather than fetching names from a filesystem.
|
||||
*
|
||||
* Based on the Perl Text::Glob module.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com> PHP port
|
||||
* @author Richard Clamp <richardc@unixbeard.net> Perl version
|
||||
* @copyright 2004-2005 Fabien Potencier <fabien@symfony.com>
|
||||
* @copyright 2002 Richard Clamp <richardc@unixbeard.net>
|
||||
*/
|
||||
class Glob
|
||||
{
|
||||
/**
|
||||
* Returns a regexp which is the equivalent of the glob pattern.
|
||||
*
|
||||
* @param string $glob The glob pattern
|
||||
* @param Boolean $strictLeadingDot
|
||||
* @param Boolean $strictWildcardSlash
|
||||
*
|
||||
* @return string regex The regexp
|
||||
*/
|
||||
public static function toRegex($glob, $strictLeadingDot = true, $strictWildcardSlash = true)
|
||||
{
|
||||
$firstByte = true;
|
||||
$escaping = false;
|
||||
$inCurlies = 0;
|
||||
$regex = '';
|
||||
$sizeGlob = strlen($glob);
|
||||
for ($i = 0; $i < $sizeGlob; $i++) {
|
||||
$car = $glob[$i];
|
||||
if ($firstByte) {
|
||||
if ($strictLeadingDot && '.' !== $car) {
|
||||
$regex .= '(?=[^\.])';
|
||||
}
|
||||
|
||||
$firstByte = false;
|
||||
}
|
||||
|
||||
if ('/' === $car) {
|
||||
$firstByte = true;
|
||||
}
|
||||
|
||||
if ('.' === $car || '(' === $car || ')' === $car || '|' === $car || '+' === $car || '^' === $car || '$' === $car) {
|
||||
$regex .= "\\$car";
|
||||
} elseif ('*' === $car) {
|
||||
$regex .= $escaping ? '\\*' : ($strictWildcardSlash ? '[^/]*' : '.*');
|
||||
} elseif ('?' === $car) {
|
||||
$regex .= $escaping ? '\\?' : ($strictWildcardSlash ? '[^/]' : '.');
|
||||
} elseif ('{' === $car) {
|
||||
$regex .= $escaping ? '\\{' : '(';
|
||||
if (!$escaping) {
|
||||
++$inCurlies;
|
||||
}
|
||||
} elseif ('}' === $car && $inCurlies) {
|
||||
$regex .= $escaping ? '}' : ')';
|
||||
if (!$escaping) {
|
||||
--$inCurlies;
|
||||
}
|
||||
} elseif (',' === $car && $inCurlies) {
|
||||
$regex .= $escaping ? ',' : '|';
|
||||
} elseif ('\\' === $car) {
|
||||
if ($escaping) {
|
||||
$regex .= '\\\\';
|
||||
$escaping = false;
|
||||
} else {
|
||||
$escaping = true;
|
||||
}
|
||||
|
||||
continue;
|
||||
} else {
|
||||
$regex .= $car;
|
||||
}
|
||||
$escaping = false;
|
||||
}
|
||||
|
||||
return '#^'.$regex.'$#';
|
||||
}
|
||||
}
|
63
vendor/symfony/finder/Symfony/Component/Finder/Iterator/CustomFilterIterator.php
vendored
Normal file
63
vendor/symfony/finder/Symfony/Component/Finder/Iterator/CustomFilterIterator.php
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
/**
|
||||
* CustomFilterIterator filters files by applying anonymous functions.
|
||||
*
|
||||
* The anonymous function receives a \SplFileInfo and must return false
|
||||
* to remove files.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class CustomFilterIterator extends FilterIterator
|
||||
{
|
||||
private $filters = array();
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param \Iterator $iterator The Iterator to filter
|
||||
* @param array $filters An array of PHP callbacks
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function __construct(\Iterator $iterator, array $filters)
|
||||
{
|
||||
foreach ($filters as $filter) {
|
||||
if (!is_callable($filter)) {
|
||||
throw new \InvalidArgumentException('Invalid PHP callback.');
|
||||
}
|
||||
}
|
||||
$this->filters = $filters;
|
||||
|
||||
parent::__construct($iterator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return Boolean true if the value should be kept, false otherwise
|
||||
*/
|
||||
public function accept()
|
||||
{
|
||||
$fileinfo = $this->current();
|
||||
|
||||
foreach ($this->filters as $filter) {
|
||||
if (false === call_user_func($filter, $fileinfo)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
60
vendor/symfony/finder/Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php
vendored
Normal file
60
vendor/symfony/finder/Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Comparator\DateComparator;
|
||||
|
||||
/**
|
||||
* DateRangeFilterIterator filters out files that are not in the given date range (last modified dates).
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class DateRangeFilterIterator extends FilterIterator
|
||||
{
|
||||
private $comparators = array();
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param \Iterator $iterator The Iterator to filter
|
||||
* @param DateComparator[] $comparators An array of DateComparator instances
|
||||
*/
|
||||
public function __construct(\Iterator $iterator, array $comparators)
|
||||
{
|
||||
$this->comparators = $comparators;
|
||||
|
||||
parent::__construct($iterator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return Boolean true if the value should be kept, false otherwise
|
||||
*/
|
||||
public function accept()
|
||||
{
|
||||
$fileinfo = $this->current();
|
||||
|
||||
if (!$fileinfo->isFile()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$filedate = $fileinfo->getMTime();
|
||||
foreach ($this->comparators as $compare) {
|
||||
if (!$compare->test($filedate)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
47
vendor/symfony/finder/Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php
vendored
Normal file
47
vendor/symfony/finder/Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
/**
|
||||
* DepthRangeFilterIterator limits the directory depth.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class DepthRangeFilterIterator extends FilterIterator
|
||||
{
|
||||
private $minDepth = 0;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param \RecursiveIteratorIterator $iterator The Iterator to filter
|
||||
* @param int $minDepth The min depth
|
||||
* @param int $maxDepth The max depth
|
||||
*/
|
||||
public function __construct(\RecursiveIteratorIterator $iterator, $minDepth = 0, $maxDepth = PHP_INT_MAX)
|
||||
{
|
||||
$this->minDepth = $minDepth;
|
||||
$iterator->setMaxDepth(PHP_INT_MAX === $maxDepth ? -1 : $maxDepth);
|
||||
|
||||
parent::__construct($iterator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return Boolean true if the value should be kept, false otherwise
|
||||
*/
|
||||
public function accept()
|
||||
{
|
||||
return $this->getInnerIterator()->getDepth() >= $this->minDepth;
|
||||
}
|
||||
}
|
56
vendor/symfony/finder/Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php
vendored
Normal file
56
vendor/symfony/finder/Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
/**
|
||||
* ExcludeDirectoryFilterIterator filters out directories.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class ExcludeDirectoryFilterIterator extends FilterIterator
|
||||
{
|
||||
private $patterns;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param \Iterator $iterator The Iterator to filter
|
||||
* @param array $directories An array of directories to exclude
|
||||
*/
|
||||
public function __construct(\Iterator $iterator, array $directories)
|
||||
{
|
||||
$this->patterns = array();
|
||||
foreach ($directories as $directory) {
|
||||
$this->patterns[] = '#(^|/)'.preg_quote($directory, '#').'(/|$)#';
|
||||
}
|
||||
|
||||
parent::__construct($iterator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return Boolean true if the value should be kept, false otherwise
|
||||
*/
|
||||
public function accept()
|
||||
{
|
||||
$path = $this->isDir() ? $this->current()->getRelativePathname() : $this->current()->getRelativePath();
|
||||
$path = strtr($path, '\\', '/');
|
||||
foreach ($this->patterns as $pattern) {
|
||||
if (preg_match($pattern, $path)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
131
vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilePathsIterator.php
vendored
Normal file
131
vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilePathsIterator.php
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\SplFileInfo;
|
||||
|
||||
/**
|
||||
* Iterate over shell command result.
|
||||
*
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class FilePathsIterator extends \ArrayIterator
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $baseDir;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $baseDirLength;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $subPath;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $subPathname;
|
||||
|
||||
/**
|
||||
* @var SplFileInfo
|
||||
*/
|
||||
private $current;
|
||||
|
||||
/**
|
||||
* @param array $paths List of paths returned by shell command
|
||||
* @param string $baseDir Base dir for relative path building
|
||||
*/
|
||||
public function __construct(array $paths, $baseDir)
|
||||
{
|
||||
$this->baseDir = $baseDir;
|
||||
$this->baseDirLength = strlen($baseDir);
|
||||
|
||||
parent::__construct($paths);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($name, array $arguments)
|
||||
{
|
||||
return call_user_func_array(array($this->current(), $name), $arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an instance of SplFileInfo with support for relative paths.
|
||||
*
|
||||
* @return SplFileInfo File information
|
||||
*/
|
||||
public function current()
|
||||
{
|
||||
return $this->current;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function key()
|
||||
{
|
||||
return $this->current->getPathname();
|
||||
}
|
||||
|
||||
public function next()
|
||||
{
|
||||
parent::next();
|
||||
$this->buildProperties();
|
||||
}
|
||||
|
||||
public function rewind()
|
||||
{
|
||||
parent::rewind();
|
||||
$this->buildProperties();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getSubPath()
|
||||
{
|
||||
return $this->subPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getSubPathname()
|
||||
{
|
||||
return $this->subPathname;
|
||||
}
|
||||
|
||||
private function buildProperties()
|
||||
{
|
||||
$absolutePath = parent::current();
|
||||
|
||||
if ($this->baseDir === substr($absolutePath, 0, $this->baseDirLength)) {
|
||||
$this->subPathname = ltrim(substr($absolutePath, $this->baseDirLength), '/\\');
|
||||
$dir = dirname($this->subPathname);
|
||||
$this->subPath = '.' === $dir ? '' : $dir;
|
||||
} else {
|
||||
$this->subPath = $this->subPathname = '';
|
||||
}
|
||||
|
||||
$this->current = new SplFileInfo(parent::current(), $this->subPath, $this->subPathname);
|
||||
}
|
||||
}
|
55
vendor/symfony/finder/Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php
vendored
Normal file
55
vendor/symfony/finder/Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
/**
|
||||
* FileTypeFilterIterator only keeps files, directories, or both.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class FileTypeFilterIterator extends FilterIterator
|
||||
{
|
||||
const ONLY_FILES = 1;
|
||||
const ONLY_DIRECTORIES = 2;
|
||||
|
||||
private $mode;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param \Iterator $iterator The Iterator to filter
|
||||
* @param integer $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES)
|
||||
*/
|
||||
public function __construct(\Iterator $iterator, $mode)
|
||||
{
|
||||
$this->mode = $mode;
|
||||
|
||||
parent::__construct($iterator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return Boolean true if the value should be kept, false otherwise
|
||||
*/
|
||||
public function accept()
|
||||
{
|
||||
$fileinfo = $this->current();
|
||||
if (self::ONLY_DIRECTORIES === (self::ONLY_DIRECTORIES & $this->mode) && $fileinfo->isFile()) {
|
||||
return false;
|
||||
} elseif (self::ONLY_FILES === (self::ONLY_FILES & $this->mode) && $fileinfo->isDir()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
76
vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php
vendored
Normal file
76
vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
/**
|
||||
* FilecontentFilterIterator filters files by their contents using patterns (regexps or strings).
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Włodzimierz Gajda <gajdaw@gajdaw.pl>
|
||||
*/
|
||||
class FilecontentFilterIterator extends MultiplePcreFilterIterator
|
||||
{
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return Boolean true if the value should be kept, false otherwise
|
||||
*/
|
||||
public function accept()
|
||||
{
|
||||
if (!$this->matchRegexps && !$this->noMatchRegexps) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$fileinfo = $this->current();
|
||||
|
||||
if ($fileinfo->isDir() || !$fileinfo->isReadable()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$content = $fileinfo->getContents();
|
||||
if (!$content) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// should at least not match one rule to exclude
|
||||
foreach ($this->noMatchRegexps as $regex) {
|
||||
if (preg_match($regex, $content)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// should at least match one rule
|
||||
$match = true;
|
||||
if ($this->matchRegexps) {
|
||||
$match = false;
|
||||
foreach ($this->matchRegexps as $regex) {
|
||||
if (preg_match($regex, $content)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $match;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts string to regexp if necessary.
|
||||
*
|
||||
* @param string $str Pattern: string or regexp
|
||||
*
|
||||
* @return string regexp corresponding to a given string or regexp
|
||||
*/
|
||||
protected function toRegex($str)
|
||||
{
|
||||
return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/';
|
||||
}
|
||||
}
|
68
vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilenameFilterIterator.php
vendored
Normal file
68
vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilenameFilterIterator.php
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Expression\Expression;
|
||||
|
||||
/**
|
||||
* FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string).
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class FilenameFilterIterator extends MultiplePcreFilterIterator
|
||||
{
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return Boolean true if the value should be kept, false otherwise
|
||||
*/
|
||||
public function accept()
|
||||
{
|
||||
$filename = $this->current()->getFilename();
|
||||
|
||||
// should at least not match one rule to exclude
|
||||
foreach ($this->noMatchRegexps as $regex) {
|
||||
if (preg_match($regex, $filename)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// should at least match one rule
|
||||
$match = true;
|
||||
if ($this->matchRegexps) {
|
||||
$match = false;
|
||||
foreach ($this->matchRegexps as $regex) {
|
||||
if (preg_match($regex, $filename)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $match;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts glob to regexp.
|
||||
*
|
||||
* PCRE patterns are left unchanged.
|
||||
* Glob strings are transformed with Glob::toRegex().
|
||||
*
|
||||
* @param string $str Pattern: glob or regexp
|
||||
*
|
||||
* @return string regexp corresponding to a given glob or regexp
|
||||
*/
|
||||
protected function toRegex($str)
|
||||
{
|
||||
return Expression::create($str)->getRegex()->render();
|
||||
}
|
||||
}
|
49
vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilterIterator.php
vendored
Normal file
49
vendor/symfony/finder/Symfony/Component/Finder/Iterator/FilterIterator.php
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
/**
|
||||
* This iterator just overrides the rewind method in order to correct a PHP bug.
|
||||
*
|
||||
* @see https://bugs.php.net/bug.php?id=49104
|
||||
*
|
||||
* @author Alex Bogomazov
|
||||
*/
|
||||
abstract class FilterIterator extends \FilterIterator
|
||||
{
|
||||
/**
|
||||
* This is a workaround for the problem with \FilterIterator leaving inner \FilesystemIterator in wrong state after
|
||||
* rewind in some cases.
|
||||
*
|
||||
* @see FilterIterator::rewind()
|
||||
*/
|
||||
public function rewind()
|
||||
{
|
||||
$iterator = $this;
|
||||
while ($iterator instanceof \OuterIterator) {
|
||||
$innerIterator = $iterator->getInnerIterator();
|
||||
|
||||
if ($innerIterator instanceof RecursiveDirectoryIterator) {
|
||||
if ($innerIterator->isRewindable()) {
|
||||
$innerIterator->next();
|
||||
$innerIterator->rewind();
|
||||
}
|
||||
} elseif ($iterator->getInnerIterator() instanceof \FilesystemIterator) {
|
||||
$iterator->getInnerIterator()->next();
|
||||
$iterator->getInnerIterator()->rewind();
|
||||
}
|
||||
$iterator = $iterator->getInnerIterator();
|
||||
}
|
||||
|
||||
parent::rewind();
|
||||
}
|
||||
}
|
68
vendor/symfony/finder/Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php
vendored
Normal file
68
vendor/symfony/finder/Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Expression\Expression;
|
||||
|
||||
/**
|
||||
* MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings).
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
abstract class MultiplePcreFilterIterator extends FilterIterator
|
||||
{
|
||||
protected $matchRegexps;
|
||||
protected $noMatchRegexps;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param \Iterator $iterator The Iterator to filter
|
||||
* @param array $matchPatterns An array of patterns that need to match
|
||||
* @param array $noMatchPatterns An array of patterns that need to not match
|
||||
*/
|
||||
public function __construct(\Iterator $iterator, array $matchPatterns, array $noMatchPatterns)
|
||||
{
|
||||
$this->matchRegexps = array();
|
||||
foreach ($matchPatterns as $pattern) {
|
||||
$this->matchRegexps[] = $this->toRegex($pattern);
|
||||
}
|
||||
|
||||
$this->noMatchRegexps = array();
|
||||
foreach ($noMatchPatterns as $pattern) {
|
||||
$this->noMatchRegexps[] = $this->toRegex($pattern);
|
||||
}
|
||||
|
||||
parent::__construct($iterator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the string is a regex.
|
||||
*
|
||||
* @param string $str
|
||||
*
|
||||
* @return Boolean Whether the given string is a regex
|
||||
*/
|
||||
protected function isRegex($str)
|
||||
{
|
||||
return Expression::create($str)->isRegex();
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts string into regexp.
|
||||
*
|
||||
* @param string $str Pattern
|
||||
*
|
||||
* @return string regexp corresponding to a given string
|
||||
*/
|
||||
abstract protected function toRegex($str);
|
||||
}
|
75
vendor/symfony/finder/Symfony/Component/Finder/Iterator/PathFilterIterator.php
vendored
Normal file
75
vendor/symfony/finder/Symfony/Component/Finder/Iterator/PathFilterIterator.php
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
/**
|
||||
* PathFilterIterator filters files by path patterns (e.g. some/special/dir).
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Włodzimierz Gajda <gajdaw@gajdaw.pl>
|
||||
*/
|
||||
class PathFilterIterator extends MultiplePcreFilterIterator
|
||||
{
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return Boolean true if the value should be kept, false otherwise
|
||||
*/
|
||||
public function accept()
|
||||
{
|
||||
$filename = $this->current()->getRelativePathname();
|
||||
|
||||
if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
|
||||
$filename = strtr($filename, '\\', '/');
|
||||
}
|
||||
|
||||
// should at least not match one rule to exclude
|
||||
foreach ($this->noMatchRegexps as $regex) {
|
||||
if (preg_match($regex, $filename)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// should at least match one rule
|
||||
$match = true;
|
||||
if ($this->matchRegexps) {
|
||||
$match = false;
|
||||
foreach ($this->matchRegexps as $regex) {
|
||||
if (preg_match($regex, $filename)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $match;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts strings to regexp.
|
||||
*
|
||||
* PCRE patterns are left unchanged.
|
||||
*
|
||||
* Default conversion:
|
||||
* 'lorem/ipsum/dolor' ==> 'lorem\/ipsum\/dolor/'
|
||||
*
|
||||
* Use only / as directory separator (on Windows also).
|
||||
*
|
||||
* @param string $str Pattern: regexp or dirname.
|
||||
*
|
||||
* @return string regexp corresponding to a given string or regexp
|
||||
*/
|
||||
protected function toRegex($str)
|
||||
{
|
||||
return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/';
|
||||
}
|
||||
}
|
119
vendor/symfony/finder/Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.php
vendored
Normal file
119
vendor/symfony/finder/Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.php
vendored
Normal file
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Exception\AccessDeniedException;
|
||||
use Symfony\Component\Finder\SplFileInfo;
|
||||
|
||||
/**
|
||||
* Extends the \RecursiveDirectoryIterator to support relative paths
|
||||
*
|
||||
* @author Victor Berchet <victor@suumit.com>
|
||||
*/
|
||||
class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
|
||||
{
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
private $ignoreUnreadableDirs;
|
||||
|
||||
/**
|
||||
* @var Boolean
|
||||
*/
|
||||
private $rewindable;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $path
|
||||
* @param int $flags
|
||||
* @param boolean $ignoreUnreadableDirs
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function __construct($path, $flags, $ignoreUnreadableDirs = false)
|
||||
{
|
||||
if ($flags & (self::CURRENT_AS_PATHNAME | self::CURRENT_AS_SELF)) {
|
||||
throw new \RuntimeException('This iterator only support returning current as fileinfo.');
|
||||
}
|
||||
|
||||
parent::__construct($path, $flags);
|
||||
$this->ignoreUnreadableDirs = $ignoreUnreadableDirs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an instance of SplFileInfo with support for relative paths
|
||||
*
|
||||
* @return SplFileInfo File information
|
||||
*/
|
||||
public function current()
|
||||
{
|
||||
return new SplFileInfo(parent::current()->getPathname(), $this->getSubPath(), $this->getSubPathname());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \RecursiveIterator
|
||||
*
|
||||
* @throws AccessDeniedException
|
||||
*/
|
||||
public function getChildren()
|
||||
{
|
||||
try {
|
||||
return parent::getChildren();
|
||||
} catch (\UnexpectedValueException $e) {
|
||||
if ($this->ignoreUnreadableDirs) {
|
||||
// If directory is unreadable and finder is set to ignore it, a fake empty content is returned.
|
||||
return new \RecursiveArrayIterator(array());
|
||||
} else {
|
||||
throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Do nothing for non rewindable stream
|
||||
*/
|
||||
public function rewind()
|
||||
{
|
||||
if (false === $this->isRewindable()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// @see https://bugs.php.net/bug.php?id=49104
|
||||
parent::next();
|
||||
|
||||
parent::rewind();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the stream is rewindable.
|
||||
*
|
||||
* @return Boolean true when the stream is rewindable, false otherwise
|
||||
*/
|
||||
public function isRewindable()
|
||||
{
|
||||
if (null !== $this->rewindable) {
|
||||
return $this->rewindable;
|
||||
}
|
||||
|
||||
if (false !== $stream = @opendir($this->getPath())) {
|
||||
$infos = stream_get_meta_data($stream);
|
||||
closedir($stream);
|
||||
|
||||
if ($infos['seekable']) {
|
||||
return $this->rewindable = true;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->rewindable = false;
|
||||
}
|
||||
}
|
59
vendor/symfony/finder/Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php
vendored
Normal file
59
vendor/symfony/finder/Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Comparator\NumberComparator;
|
||||
|
||||
/**
|
||||
* SizeRangeFilterIterator filters out files that are not in the given size range.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class SizeRangeFilterIterator extends FilterIterator
|
||||
{
|
||||
private $comparators = array();
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param \Iterator $iterator The Iterator to filter
|
||||
* @param NumberComparator[] $comparators An array of NumberComparator instances
|
||||
*/
|
||||
public function __construct(\Iterator $iterator, array $comparators)
|
||||
{
|
||||
$this->comparators = $comparators;
|
||||
|
||||
parent::__construct($iterator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the iterator values.
|
||||
*
|
||||
* @return Boolean true if the value should be kept, false otherwise
|
||||
*/
|
||||
public function accept()
|
||||
{
|
||||
$fileinfo = $this->current();
|
||||
if (!$fileinfo->isFile()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$filesize = $fileinfo->getSize();
|
||||
foreach ($this->comparators as $compare) {
|
||||
if (!$compare->test($filesize)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
82
vendor/symfony/finder/Symfony/Component/Finder/Iterator/SortableIterator.php
vendored
Normal file
82
vendor/symfony/finder/Symfony/Component/Finder/Iterator/SortableIterator.php
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Iterator;
|
||||
|
||||
/**
|
||||
* SortableIterator applies a sort on a given Iterator.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class SortableIterator implements \IteratorAggregate
|
||||
{
|
||||
const SORT_BY_NAME = 1;
|
||||
const SORT_BY_TYPE = 2;
|
||||
const SORT_BY_ACCESSED_TIME = 3;
|
||||
const SORT_BY_CHANGED_TIME = 4;
|
||||
const SORT_BY_MODIFIED_TIME = 5;
|
||||
|
||||
private $iterator;
|
||||
private $sort;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param \Traversable $iterator The Iterator to filter
|
||||
* @param integer|callback $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback)
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function __construct(\Traversable $iterator, $sort)
|
||||
{
|
||||
$this->iterator = $iterator;
|
||||
|
||||
if (self::SORT_BY_NAME === $sort) {
|
||||
$this->sort = function ($a, $b) {
|
||||
return strcmp($a->getRealpath(), $b->getRealpath());
|
||||
};
|
||||
} elseif (self::SORT_BY_TYPE === $sort) {
|
||||
$this->sort = function ($a, $b) {
|
||||
if ($a->isDir() && $b->isFile()) {
|
||||
return -1;
|
||||
} elseif ($a->isFile() && $b->isDir()) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return strcmp($a->getRealpath(), $b->getRealpath());
|
||||
};
|
||||
} elseif (self::SORT_BY_ACCESSED_TIME === $sort) {
|
||||
$this->sort = function ($a, $b) {
|
||||
return ($a->getATime() > $b->getATime());
|
||||
};
|
||||
} elseif (self::SORT_BY_CHANGED_TIME === $sort) {
|
||||
$this->sort = function ($a, $b) {
|
||||
return ($a->getCTime() > $b->getCTime());
|
||||
};
|
||||
} elseif (self::SORT_BY_MODIFIED_TIME === $sort) {
|
||||
$this->sort = function ($a, $b) {
|
||||
return ($a->getMTime() > $b->getMTime());
|
||||
};
|
||||
} elseif (is_callable($sort)) {
|
||||
$this->sort = $sort;
|
||||
} else {
|
||||
throw new \InvalidArgumentException('The SortableIterator takes a PHP callback or a valid built-in sort algorithm as an argument.');
|
||||
}
|
||||
}
|
||||
|
||||
public function getIterator()
|
||||
{
|
||||
$array = iterator_to_array($this->iterator, true);
|
||||
uasort($array, $this->sort);
|
||||
|
||||
return new \ArrayIterator($array);
|
||||
}
|
||||
}
|
19
vendor/symfony/finder/Symfony/Component/Finder/LICENSE
vendored
Normal file
19
vendor/symfony/finder/Symfony/Component/Finder/LICENSE
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
Copyright (c) 2004-2013 Fabien Potencier
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
41
vendor/symfony/finder/Symfony/Component/Finder/README.md
vendored
Normal file
41
vendor/symfony/finder/Symfony/Component/Finder/README.md
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
Finder Component
|
||||
================
|
||||
|
||||
Finder finds files and directories via an intuitive fluent interface.
|
||||
|
||||
use Symfony\Component\Finder\Finder;
|
||||
|
||||
$finder = new Finder();
|
||||
|
||||
$iterator = $finder
|
||||
->files()
|
||||
->name('*.php')
|
||||
->depth(0)
|
||||
->size('>= 1K')
|
||||
->in(__DIR__);
|
||||
|
||||
foreach ($iterator as $file) {
|
||||
print $file->getRealpath()."\n";
|
||||
}
|
||||
|
||||
But you can also use it to find files stored remotely like in this example where
|
||||
we are looking for files on Amazon S3:
|
||||
|
||||
$s3 = new \Zend_Service_Amazon_S3($key, $secret);
|
||||
$s3->registerStreamWrapper("s3");
|
||||
|
||||
$finder = new Finder();
|
||||
$finder->name('photos*')->size('< 100K')->date('since 1 hour ago');
|
||||
foreach ($finder->in('s3://bucket-name') as $file) {
|
||||
print $file->getFilename()."\n";
|
||||
}
|
||||
|
||||
Resources
|
||||
---------
|
||||
|
||||
You can run the unit tests with the following command:
|
||||
|
||||
$ cd path/to/Symfony/Component/Finder/
|
||||
$ composer.phar install --dev
|
||||
$ phpunit
|
||||
|
296
vendor/symfony/finder/Symfony/Component/Finder/Shell/Command.php
vendored
Normal file
296
vendor/symfony/finder/Symfony/Component/Finder/Shell/Command.php
vendored
Normal file
@@ -0,0 +1,296 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Shell;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class Command
|
||||
{
|
||||
/**
|
||||
* @var Command|null
|
||||
*/
|
||||
private $parent;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $bits;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $labels;
|
||||
|
||||
/**
|
||||
* @var \Closure|null
|
||||
*/
|
||||
private $errorHandler;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param Command $parent Parent command
|
||||
*/
|
||||
public function __construct(Command $parent = null)
|
||||
{
|
||||
$this->parent = $parent;
|
||||
$this->bits = array();
|
||||
$this->labels = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns command as string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->join();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new Command instance.
|
||||
*
|
||||
* @param Command $parent Parent command
|
||||
*
|
||||
* @return Command New Command instance
|
||||
*/
|
||||
public static function create(Command $parent = null)
|
||||
{
|
||||
return new self($parent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Escapes special chars from input.
|
||||
*
|
||||
* @param string $input A string to escape
|
||||
*
|
||||
* @return string The escaped string
|
||||
*/
|
||||
public static function escape($input)
|
||||
{
|
||||
return escapeshellcmd($input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Quotes input.
|
||||
*
|
||||
* @param string $input An argument string
|
||||
*
|
||||
* @return string The quoted string
|
||||
*/
|
||||
public static function quote($input)
|
||||
{
|
||||
return escapeshellarg($input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends a string or a Command instance.
|
||||
*
|
||||
* @param string|Command $bit
|
||||
*
|
||||
* @return Command The current Command instance
|
||||
*/
|
||||
public function add($bit)
|
||||
{
|
||||
$this->bits[] = $bit;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepends a string or a command instance.
|
||||
*
|
||||
* @param string|Command $bit
|
||||
*
|
||||
* @return Command The current Command instance
|
||||
*/
|
||||
public function top($bit)
|
||||
{
|
||||
array_unshift($this->bits, $bit);
|
||||
|
||||
foreach ($this->labels as $label => $index) {
|
||||
$this->labels[$label] += 1;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends an argument, will be quoted.
|
||||
*
|
||||
* @param string $arg
|
||||
*
|
||||
* @return Command The current Command instance
|
||||
*/
|
||||
public function arg($arg)
|
||||
{
|
||||
$this->bits[] = self::quote($arg);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends escaped special command chars.
|
||||
*
|
||||
* @param string $esc
|
||||
*
|
||||
* @return Command The current Command instance
|
||||
*/
|
||||
public function cmd($esc)
|
||||
{
|
||||
$this->bits[] = self::escape($esc);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts a labeled command to feed later.
|
||||
*
|
||||
* @param string $label The unique label
|
||||
*
|
||||
* @return Command The current Command instance
|
||||
*
|
||||
* @throws \RuntimeException If label already exists
|
||||
*/
|
||||
public function ins($label)
|
||||
{
|
||||
if (isset($this->labels[$label])) {
|
||||
throw new \RuntimeException(sprintf('Label "%s" already exists.', $label));
|
||||
}
|
||||
|
||||
$this->bits[] = self::create($this);
|
||||
$this->labels[$label] = count($this->bits)-1;
|
||||
|
||||
return $this->bits[$this->labels[$label]];
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a previously labeled command.
|
||||
*
|
||||
* @param string $label
|
||||
*
|
||||
* @return Command The labeled command
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function get($label)
|
||||
{
|
||||
if (!isset($this->labels[$label])) {
|
||||
throw new \RuntimeException(sprintf('Label "%s" does not exist.', $label));
|
||||
}
|
||||
|
||||
return $this->bits[$this->labels[$label]];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns parent command (if any).
|
||||
*
|
||||
* @return Command Parent command
|
||||
*
|
||||
* @throws \RuntimeException If command has no parent
|
||||
*/
|
||||
public function end()
|
||||
{
|
||||
if (null === $this->parent) {
|
||||
throw new \RuntimeException('Calling end on root command doesn\'t make sense.');
|
||||
}
|
||||
|
||||
return $this->parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Counts bits stored in command.
|
||||
*
|
||||
* @return int The bits count
|
||||
*/
|
||||
public function length()
|
||||
{
|
||||
return count($this->bits);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Closure $errorHandler
|
||||
*
|
||||
* @return Command
|
||||
*/
|
||||
public function setErrorHandler(\Closure $errorHandler)
|
||||
{
|
||||
$this->errorHandler = $errorHandler;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return callable|null
|
||||
*/
|
||||
public function getErrorHandler()
|
||||
{
|
||||
return $this->errorHandler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes current command.
|
||||
*
|
||||
* @return array The command result
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
if (null === $this->errorHandler) {
|
||||
exec($this->join(), $output);
|
||||
} else {
|
||||
$process = proc_open($this->join(), array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')), $pipes);
|
||||
$output = preg_split('~(\r\n|\r|\n)~', stream_get_contents($pipes[1]), -1, PREG_SPLIT_NO_EMPTY);
|
||||
|
||||
if ($error = stream_get_contents($pipes[2])) {
|
||||
call_user_func($this->errorHandler, $error);
|
||||
}
|
||||
|
||||
proc_close($process);
|
||||
}
|
||||
|
||||
return $output ?: array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Joins bits.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function join()
|
||||
{
|
||||
return implode(' ', array_filter(
|
||||
array_map(function($bit) {
|
||||
return $bit instanceof Command ? $bit->join() : ($bit ?: null);
|
||||
}, $this->bits),
|
||||
function($bit) { return null !== $bit; }
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert a string or a Command instance before the bit at given position $index (index starts from 0).
|
||||
*
|
||||
* @param string|Command $bit
|
||||
* @param integer $index
|
||||
*
|
||||
* @return Command The current Command instance
|
||||
*/
|
||||
public function addAtIndex($bit, $index)
|
||||
{
|
||||
array_splice($this->bits, $index, 0, $bit);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
95
vendor/symfony/finder/Symfony/Component/Finder/Shell/Shell.php
vendored
Normal file
95
vendor/symfony/finder/Symfony/Component/Finder/Shell/Shell.php
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Shell;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class Shell
|
||||
{
|
||||
const TYPE_UNIX = 1;
|
||||
const TYPE_DARWIN = 2;
|
||||
const TYPE_CYGWIN = 3;
|
||||
const TYPE_WINDOWS = 4;
|
||||
const TYPE_BSD = 5;
|
||||
|
||||
/**
|
||||
* @var string|null
|
||||
*/
|
||||
private $type;
|
||||
|
||||
/**
|
||||
* Returns guessed OS type.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
if (null === $this->type) {
|
||||
$this->type = $this->guessType();
|
||||
}
|
||||
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if a command is available.
|
||||
*
|
||||
* @param string $command
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function testCommand($command)
|
||||
{
|
||||
if (self::TYPE_WINDOWS === $this->type) {
|
||||
// todo: find a way to test if windows command exists
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!function_exists('exec')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// todo: find a better way (command could not be available)
|
||||
exec('command -v '.$command, $output, $code);
|
||||
|
||||
return 0 === $code && count($output) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Guesses OS type.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
private function guessType()
|
||||
{
|
||||
$os = strtolower(PHP_OS);
|
||||
|
||||
if (false !== strpos($os, 'cygwin')) {
|
||||
return self::TYPE_CYGWIN;
|
||||
}
|
||||
|
||||
if (false !== strpos($os, 'darwin')) {
|
||||
return self::TYPE_DARWIN;
|
||||
}
|
||||
|
||||
if (false !== strpos($os, 'bsd')) {
|
||||
return self::TYPE_BSD;
|
||||
}
|
||||
|
||||
if (0 === strpos($os, 'win')) {
|
||||
return self::TYPE_WINDOWS;
|
||||
}
|
||||
|
||||
return self::TYPE_UNIX;
|
||||
}
|
||||
}
|
77
vendor/symfony/finder/Symfony/Component/Finder/SplFileInfo.php
vendored
Normal file
77
vendor/symfony/finder/Symfony/Component/Finder/SplFileInfo.php
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder;
|
||||
|
||||
/**
|
||||
* Extends \SplFileInfo to support relative paths
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class SplFileInfo extends \SplFileInfo
|
||||
{
|
||||
private $relativePath;
|
||||
private $relativePathname;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $file The file name
|
||||
* @param string $relativePath The relative path
|
||||
* @param string $relativePathname The relative path name
|
||||
*/
|
||||
public function __construct($file, $relativePath, $relativePathname)
|
||||
{
|
||||
parent::__construct($file);
|
||||
$this->relativePath = $relativePath;
|
||||
$this->relativePathname = $relativePathname;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the relative path
|
||||
*
|
||||
* @return string the relative path
|
||||
*/
|
||||
public function getRelativePath()
|
||||
{
|
||||
return $this->relativePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the relative path name
|
||||
*
|
||||
* @return string the relative path name
|
||||
*/
|
||||
public function getRelativePathname()
|
||||
{
|
||||
return $this->relativePathname;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the contents of the file
|
||||
*
|
||||
* @return string the contents of the file
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function getContents()
|
||||
{
|
||||
$level = error_reporting(0);
|
||||
$content = file_get_contents($this->getPathname());
|
||||
error_reporting($level);
|
||||
if (false === $content) {
|
||||
$error = error_get_last();
|
||||
throw new \RuntimeException($error['message']);
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
}
|
64
vendor/symfony/finder/Symfony/Component/Finder/Tests/Comparator/ComparatorTest.php
vendored
Normal file
64
vendor/symfony/finder/Symfony/Component/Finder/Tests/Comparator/ComparatorTest.php
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Comparator;
|
||||
|
||||
use Symfony\Component\Finder\Comparator\Comparator;
|
||||
|
||||
class ComparatorTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function testGetSetOperator()
|
||||
{
|
||||
$comparator = new Comparator();
|
||||
try {
|
||||
$comparator->setOperator('foo');
|
||||
$this->fail('->setOperator() throws an \InvalidArgumentException if the operator is not valid.');
|
||||
} catch (\Exception $e) {
|
||||
$this->assertInstanceOf('InvalidArgumentException', $e, '->setOperator() throws an \InvalidArgumentException if the operator is not valid.');
|
||||
}
|
||||
|
||||
$comparator = new Comparator();
|
||||
$comparator->setOperator('>');
|
||||
$this->assertEquals('>', $comparator->getOperator(), '->getOperator() returns the current operator');
|
||||
}
|
||||
|
||||
public function testGetSetTarget()
|
||||
{
|
||||
$comparator = new Comparator();
|
||||
$comparator->setTarget(8);
|
||||
$this->assertEquals(8, $comparator->getTarget(), '->getTarget() returns the target');
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getTestData
|
||||
*/
|
||||
public function testTest($operator, $target, $match, $noMatch)
|
||||
{
|
||||
$c = new Comparator();
|
||||
$c->setOperator($operator);
|
||||
$c->setTarget($target);
|
||||
|
||||
foreach ($match as $m) {
|
||||
$this->assertTrue($c->test($m), '->test() tests a string against the expression');
|
||||
}
|
||||
|
||||
foreach ($noMatch as $m) {
|
||||
$this->assertFalse($c->test($m), '->test() tests a string against the expression');
|
||||
}
|
||||
}
|
||||
|
||||
public function getTestData()
|
||||
{
|
||||
return array(
|
||||
array('<', '1000', array('500', '999'), array('1000', '1500')),
|
||||
);
|
||||
}
|
||||
}
|
64
vendor/symfony/finder/Symfony/Component/Finder/Tests/Comparator/DateComparatorTest.php
vendored
Normal file
64
vendor/symfony/finder/Symfony/Component/Finder/Tests/Comparator/DateComparatorTest.php
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Comparator;
|
||||
|
||||
use Symfony\Component\Finder\Comparator\DateComparator;
|
||||
|
||||
class DateComparatorTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function testConstructor()
|
||||
{
|
||||
try {
|
||||
new DateComparator('foobar');
|
||||
$this->fail('__construct() throws an \InvalidArgumentException if the test expression is not valid.');
|
||||
} catch (\Exception $e) {
|
||||
$this->assertInstanceOf('InvalidArgumentException', $e, '__construct() throws an \InvalidArgumentException if the test expression is not valid.');
|
||||
}
|
||||
|
||||
try {
|
||||
new DateComparator('');
|
||||
$this->fail('__construct() throws an \InvalidArgumentException if the test expression is not valid.');
|
||||
} catch (\Exception $e) {
|
||||
$this->assertInstanceOf('InvalidArgumentException', $e, '__construct() throws an \InvalidArgumentException if the test expression is not valid.');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getTestData
|
||||
*/
|
||||
public function testTest($test, $match, $noMatch)
|
||||
{
|
||||
$c = new DateComparator($test);
|
||||
|
||||
foreach ($match as $m) {
|
||||
$this->assertTrue($c->test($m), '->test() tests a string against the expression');
|
||||
}
|
||||
|
||||
foreach ($noMatch as $m) {
|
||||
$this->assertFalse($c->test($m), '->test() tests a string against the expression');
|
||||
}
|
||||
}
|
||||
|
||||
public function getTestData()
|
||||
{
|
||||
return array(
|
||||
array('< 2005-10-10', array(strtotime('2005-10-09')), array(strtotime('2005-10-15'))),
|
||||
array('until 2005-10-10', array(strtotime('2005-10-09')), array(strtotime('2005-10-15'))),
|
||||
array('before 2005-10-10', array(strtotime('2005-10-09')), array(strtotime('2005-10-15'))),
|
||||
array('> 2005-10-10', array(strtotime('2005-10-15')), array(strtotime('2005-10-09'))),
|
||||
array('after 2005-10-10', array(strtotime('2005-10-15')), array(strtotime('2005-10-09'))),
|
||||
array('since 2005-10-10', array(strtotime('2005-10-15')), array(strtotime('2005-10-09'))),
|
||||
array('!= 2005-10-10', array(strtotime('2005-10-11')), array(strtotime('2005-10-10'))),
|
||||
);
|
||||
|
||||
}
|
||||
}
|
109
vendor/symfony/finder/Symfony/Component/Finder/Tests/Comparator/NumberComparatorTest.php
vendored
Normal file
109
vendor/symfony/finder/Symfony/Component/Finder/Tests/Comparator/NumberComparatorTest.php
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Comparator;
|
||||
|
||||
use Symfony\Component\Finder\Comparator\NumberComparator;
|
||||
|
||||
class NumberComparatorTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
|
||||
/**
|
||||
* @dataProvider getConstructorTestData
|
||||
*/
|
||||
public function testConstructor($successes, $failures)
|
||||
{
|
||||
foreach ($successes as $s) {
|
||||
new NumberComparator($s);
|
||||
}
|
||||
|
||||
foreach ($failures as $f) {
|
||||
try {
|
||||
new NumberComparator($f);
|
||||
$this->fail('__construct() throws an \InvalidArgumentException if the test expression is not valid.');
|
||||
} catch (\Exception $e) {
|
||||
$this->assertInstanceOf('InvalidArgumentException', $e, '__construct() throws an \InvalidArgumentException if the test expression is not valid.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getTestData
|
||||
*/
|
||||
public function testTest($test, $match, $noMatch)
|
||||
{
|
||||
$c = new NumberComparator($test);
|
||||
|
||||
foreach ($match as $m) {
|
||||
$this->assertTrue($c->test($m), '->test() tests a string against the expression');
|
||||
}
|
||||
|
||||
foreach ($noMatch as $m) {
|
||||
$this->assertFalse($c->test($m), '->test() tests a string against the expression');
|
||||
}
|
||||
}
|
||||
|
||||
public function getTestData()
|
||||
{
|
||||
return array(
|
||||
array('< 1000', array('500', '999'), array('1000', '1500')),
|
||||
|
||||
array('< 1K', array('500', '999'), array('1000', '1500')),
|
||||
array('<1k', array('500', '999'), array('1000', '1500')),
|
||||
array(' < 1 K ', array('500', '999'), array('1000', '1500')),
|
||||
array('<= 1K', array('1000'), array('1001')),
|
||||
array('> 1K', array('1001'), array('1000')),
|
||||
array('>= 1K', array('1000'), array('999')),
|
||||
|
||||
array('< 1KI', array('500', '1023'), array('1024', '1500')),
|
||||
array('<= 1KI', array('1024'), array('1025')),
|
||||
array('> 1KI', array('1025'), array('1024')),
|
||||
array('>= 1KI', array('1024'), array('1023')),
|
||||
|
||||
array('1KI', array('1024'), array('1023', '1025')),
|
||||
array('==1KI', array('1024'), array('1023', '1025')),
|
||||
|
||||
array('==1m', array('1000000'), array('999999', '1000001')),
|
||||
array('==1mi', array(1024*1024), array(1024*1024-1, 1024*1024+1)),
|
||||
|
||||
array('==1g', array('1000000000'), array('999999999', '1000000001')),
|
||||
array('==1gi', array(1024*1024*1024), array(1024*1024*1024-1, 1024*1024*1024+1)),
|
||||
|
||||
array('!= 1000', array('500', '999'), array('1000')),
|
||||
);
|
||||
}
|
||||
|
||||
public function getConstructorTestData()
|
||||
{
|
||||
return array(
|
||||
array(
|
||||
array(
|
||||
'1', '0',
|
||||
'3.5', '33.55', '123.456', '123456.78',
|
||||
'.1', '.123',
|
||||
'.0', '0.0',
|
||||
'1.', '0.', '123.',
|
||||
'==1', '!=1', '<1', '>1', '<=1', '>=1',
|
||||
'==1k', '==1ki', '==1m', '==1mi', '==1g', '==1gi',
|
||||
'1k', '1ki', '1m', '1mi', '1g', '1gi',
|
||||
),
|
||||
array(
|
||||
false, null, '',
|
||||
' ', 'foobar',
|
||||
'=1', '===1',
|
||||
'0 . 1', '123 .45', '234. 567',
|
||||
'..', '.0.', '0.1.2',
|
||||
)
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
}
|
68
vendor/symfony/finder/Symfony/Component/Finder/Tests/Expression/ExpressionTest.php
vendored
Normal file
68
vendor/symfony/finder/Symfony/Component/Finder/Tests/Expression/ExpressionTest.php
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests;
|
||||
|
||||
use Symfony\Component\Finder\Expression\Expression;
|
||||
|
||||
class ExpressionTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getTypeGuesserData
|
||||
*/
|
||||
public function testTypeGuesser($expr, $type)
|
||||
{
|
||||
$this->assertEquals($type, Expression::create($expr)->getType());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getCaseSensitiveData
|
||||
*/
|
||||
public function testCaseSensitive($expr, $isCaseSensitive)
|
||||
{
|
||||
$this->assertEquals($isCaseSensitive, Expression::create($expr)->isCaseSensitive());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getRegexRenderingData
|
||||
*/
|
||||
public function testRegexRendering($expr, $body)
|
||||
{
|
||||
$this->assertEquals($body, Expression::create($expr)->renderPattern());
|
||||
}
|
||||
|
||||
public function getTypeGuesserData()
|
||||
{
|
||||
return array(
|
||||
array('{foo}', Expression::TYPE_REGEX),
|
||||
array('/foo/', Expression::TYPE_REGEX),
|
||||
array('foo', Expression::TYPE_GLOB),
|
||||
array('foo*', Expression::TYPE_GLOB),
|
||||
);
|
||||
}
|
||||
|
||||
public function getCaseSensitiveData()
|
||||
{
|
||||
return array(
|
||||
array('{foo}m', true),
|
||||
array('/foo/i', false),
|
||||
array('foo*', true),
|
||||
);
|
||||
}
|
||||
|
||||
public function getRegexRenderingData()
|
||||
{
|
||||
return array(
|
||||
array('{foo}m', 'foo'),
|
||||
array('/foo/i', 'foo'),
|
||||
);
|
||||
}
|
||||
}
|
47
vendor/symfony/finder/Symfony/Component/Finder/Tests/Expression/GlobTest.php
vendored
Normal file
47
vendor/symfony/finder/Symfony/Component/Finder/Tests/Expression/GlobTest.php
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests;
|
||||
|
||||
use Symfony\Component\Finder\Expression\Expression;
|
||||
|
||||
class GlobTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getToRegexData
|
||||
*/
|
||||
public function testGlobToRegex($glob, $match, $noMatch)
|
||||
{
|
||||
foreach ($match as $m) {
|
||||
$this->assertRegExp(Expression::create($glob)->getRegex()->render(), $m, '::toRegex() converts a glob to a regexp');
|
||||
}
|
||||
|
||||
foreach ($noMatch as $m) {
|
||||
$this->assertNotRegExp(Expression::create($glob)->getRegex()->render(), $m, '::toRegex() converts a glob to a regexp');
|
||||
}
|
||||
}
|
||||
|
||||
public function getToRegexData()
|
||||
{
|
||||
return array(
|
||||
array('', array(''), array('f', '/')),
|
||||
array('*', array('foo'), array('foo/', '/foo')),
|
||||
array('foo.*', array('foo.php', 'foo.a', 'foo.'), array('fooo.php', 'foo.php/foo')),
|
||||
array('fo?', array('foo', 'fot'), array('fooo', 'ffoo', 'fo/')),
|
||||
array('fo{o,t}', array('foo', 'fot'), array('fob', 'fo/')),
|
||||
array('foo(bar|foo)', array('foo(bar|foo)'), array('foobar', 'foofoo')),
|
||||
array('foo,bar', array('foo,bar'), array('foo', 'bar')),
|
||||
array('fo{o,\\,}', array('foo', 'fo,'), array()),
|
||||
array('fo{o,\\\\}', array('foo', 'fo\\'), array()),
|
||||
array('/foo', array('/foo'), array('foo')),
|
||||
);
|
||||
}
|
||||
}
|
143
vendor/symfony/finder/Symfony/Component/Finder/Tests/Expression/RegexTest.php
vendored
Normal file
143
vendor/symfony/finder/Symfony/Component/Finder/Tests/Expression/RegexTest.php
vendored
Normal file
@@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests;
|
||||
|
||||
use Symfony\Component\Finder\Expression\Expression;
|
||||
|
||||
class RegexTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getHasFlagsData
|
||||
*/
|
||||
public function testHasFlags($regex, $start, $end)
|
||||
{
|
||||
$expr = new Expression($regex);
|
||||
|
||||
$this->assertEquals($start, $expr->getRegex()->hasStartFlag());
|
||||
$this->assertEquals($end, $expr->getRegex()->hasEndFlag());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getHasJokersData
|
||||
*/
|
||||
public function testHasJokers($regex, $start, $end)
|
||||
{
|
||||
$expr = new Expression($regex);
|
||||
|
||||
$this->assertEquals($start, $expr->getRegex()->hasStartJoker());
|
||||
$this->assertEquals($end, $expr->getRegex()->hasEndJoker());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getSetFlagsData
|
||||
*/
|
||||
public function testSetFlags($regex, $start, $end, $expected)
|
||||
{
|
||||
$expr = new Expression($regex);
|
||||
$expr->getRegex()->setStartFlag($start)->setEndFlag($end);
|
||||
|
||||
$this->assertEquals($expected, $expr->render());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getSetJokersData
|
||||
*/
|
||||
public function testSetJokers($regex, $start, $end, $expected)
|
||||
{
|
||||
$expr = new Expression($regex);
|
||||
$expr->getRegex()->setStartJoker($start)->setEndJoker($end);
|
||||
|
||||
$this->assertEquals($expected, $expr->render());
|
||||
}
|
||||
|
||||
public function testOptions()
|
||||
{
|
||||
$expr = new Expression('~abc~is');
|
||||
$expr->getRegex()->removeOption('i')->addOption('m');
|
||||
|
||||
$this->assertEquals('~abc~sm', $expr->render());
|
||||
}
|
||||
|
||||
public function testMixFlagsAndJokers()
|
||||
{
|
||||
$expr = new Expression('~^.*abc.*$~is');
|
||||
|
||||
$expr->getRegex()->setStartFlag(false)->setEndFlag(false)->setStartJoker(false)->setEndJoker(false);
|
||||
$this->assertEquals('~abc~is', $expr->render());
|
||||
|
||||
$expr->getRegex()->setStartFlag(true)->setEndFlag(true)->setStartJoker(true)->setEndJoker(true);
|
||||
$this->assertEquals('~^.*abc.*$~is', $expr->render());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getReplaceJokersTestData
|
||||
*/
|
||||
public function testReplaceJokers($regex, $expected)
|
||||
{
|
||||
$expr = new Expression($regex);
|
||||
$expr = $expr->getRegex()->replaceJokers('@');
|
||||
|
||||
$this->assertEquals($expected, $expr->renderPattern());
|
||||
}
|
||||
|
||||
public function getHasFlagsData()
|
||||
{
|
||||
return array(
|
||||
array('~^abc~', true, false),
|
||||
array('~abc$~', false, true),
|
||||
array('~abc~', false, false),
|
||||
array('~^abc$~', true, true),
|
||||
array('~^abc\\$~', true, false),
|
||||
);
|
||||
}
|
||||
|
||||
public function getHasJokersData()
|
||||
{
|
||||
return array(
|
||||
array('~.*abc~', true, false),
|
||||
array('~abc.*~', false, true),
|
||||
array('~abc~', false, false),
|
||||
array('~.*abc.*~', true, true),
|
||||
array('~.*abc\\.*~', true, false),
|
||||
);
|
||||
}
|
||||
|
||||
public function getSetFlagsData()
|
||||
{
|
||||
return array(
|
||||
array('~abc~', true, false, '~^abc~'),
|
||||
array('~abc~', false, true, '~abc$~'),
|
||||
array('~abc~', false, false, '~abc~'),
|
||||
array('~abc~', true, true, '~^abc$~'),
|
||||
);
|
||||
}
|
||||
|
||||
public function getSetJokersData()
|
||||
{
|
||||
return array(
|
||||
array('~abc~', true, false, '~.*abc~'),
|
||||
array('~abc~', false, true, '~abc.*~'),
|
||||
array('~abc~', false, false, '~abc~'),
|
||||
array('~abc~', true, true, '~.*abc.*~'),
|
||||
);
|
||||
}
|
||||
|
||||
public function getReplaceJokersTestData()
|
||||
{
|
||||
return array(
|
||||
array('~.abc~', '@abc'),
|
||||
array('~\\.abc~', '\\.abc'),
|
||||
array('~\\\\.abc~', '\\\\@abc'),
|
||||
array('~\\\\\\.abc~', '\\\\\\.abc'),
|
||||
);
|
||||
}
|
||||
}
|
57
vendor/symfony/finder/Symfony/Component/Finder/Tests/FakeAdapter/DummyAdapter.php
vendored
Normal file
57
vendor/symfony/finder/Symfony/Component/Finder/Tests/FakeAdapter/DummyAdapter.php
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\FakeAdapter;
|
||||
|
||||
use Symfony\Component\Finder\Adapter\AbstractAdapter;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class DummyAdapter extends AbstractAdapter
|
||||
{
|
||||
/**
|
||||
* @var \Iterator
|
||||
*/
|
||||
private $iterator;
|
||||
|
||||
/**
|
||||
* @param \Iterator $iterator
|
||||
*/
|
||||
public function __construct(\Iterator $iterator)
|
||||
{
|
||||
$this->iterator = $iterator;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function searchInDirectory($dir)
|
||||
{
|
||||
return $this->iterator;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'yes';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function canBeUsed()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
45
vendor/symfony/finder/Symfony/Component/Finder/Tests/FakeAdapter/FailingAdapter.php
vendored
Normal file
45
vendor/symfony/finder/Symfony/Component/Finder/Tests/FakeAdapter/FailingAdapter.php
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\FakeAdapter;
|
||||
|
||||
use Symfony\Component\Finder\Adapter\AbstractAdapter;
|
||||
use Symfony\Component\Finder\Exception\AdapterFailureException;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class FailingAdapter extends AbstractAdapter
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function searchInDirectory($dir)
|
||||
{
|
||||
throw new AdapterFailureException($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'failing';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function canBeUsed()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
57
vendor/symfony/finder/Symfony/Component/Finder/Tests/FakeAdapter/NamedAdapter.php
vendored
Normal file
57
vendor/symfony/finder/Symfony/Component/Finder/Tests/FakeAdapter/NamedAdapter.php
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\FakeAdapter;
|
||||
|
||||
use Symfony\Component\Finder\Adapter\AbstractAdapter;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class NamedAdapter extends AbstractAdapter
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $name;
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*/
|
||||
public function __construct($name)
|
||||
{
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function searchInDirectory($dir)
|
||||
{
|
||||
return new \ArrayIterator(array());
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function canBeUsed()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
44
vendor/symfony/finder/Symfony/Component/Finder/Tests/FakeAdapter/UnsupportedAdapter.php
vendored
Normal file
44
vendor/symfony/finder/Symfony/Component/Finder/Tests/FakeAdapter/UnsupportedAdapter.php
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\FakeAdapter;
|
||||
|
||||
use Symfony\Component\Finder\Adapter\AbstractAdapter;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class UnsupportedAdapter extends AbstractAdapter
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function searchInDirectory($dir)
|
||||
{
|
||||
return new \ArrayIterator(array());
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return 'unsupported';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function canBeUsed()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
842
vendor/symfony/finder/Symfony/Component/Finder/Tests/FinderTest.php
vendored
Normal file
842
vendor/symfony/finder/Symfony/Component/Finder/Tests/FinderTest.php
vendored
Normal file
@@ -0,0 +1,842 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests;
|
||||
|
||||
use Symfony\Component\Finder\Finder;
|
||||
use Symfony\Component\Finder\Adapter;
|
||||
use Symfony\Component\Finder\Tests\FakeAdapter;
|
||||
|
||||
class FinderTest extends Iterator\RealIteratorTestCase
|
||||
{
|
||||
|
||||
public function testCreate()
|
||||
{
|
||||
$this->assertInstanceOf('Symfony\Component\Finder\Finder', Finder::create());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testDirectories($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->directories());
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'toto')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->directories();
|
||||
$finder->files();
|
||||
$finder->directories();
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'toto')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testFiles($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->files());
|
||||
$this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php', 'test.py', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->files();
|
||||
$finder->directories();
|
||||
$finder->files();
|
||||
$this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php', 'test.py', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testDepth($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->depth('< 1'));
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->depth('<= 0'));
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->depth('>= 1'));
|
||||
$this->assertIterator($this->toAbsolute(array('foo/bar.tmp')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->depth('< 1')->depth('>= 1');
|
||||
$this->assertIterator(array(), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testName($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->name('*.php'));
|
||||
$this->assertIterator($this->toAbsolute(array('test.php')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->name('test.ph*');
|
||||
$finder->name('test.py');
|
||||
$this->assertIterator($this->toAbsolute(array('test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->name('~^test~i');
|
||||
$this->assertIterator($this->toAbsolute(array('test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->name('~\\.php$~i');
|
||||
$this->assertIterator($this->toAbsolute(array('test.php')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->name('test.p{hp,y}');
|
||||
$this->assertIterator($this->toAbsolute(array('test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testNotName($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->notName('*.php'));
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->notName('*.php');
|
||||
$finder->notName('*.py');
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->name('test.ph*');
|
||||
$finder->name('test.py');
|
||||
$finder->notName('*.php');
|
||||
$finder->notName('*.py');
|
||||
$this->assertIterator(array(), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->name('test.ph*');
|
||||
$finder->name('test.py');
|
||||
$finder->notName('*.p{hp,y}');
|
||||
$this->assertIterator(array(), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getRegexNameTestData
|
||||
*
|
||||
* @group regexName
|
||||
*/
|
||||
public function testRegexName($adapter, $regex)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->name($regex);
|
||||
$this->assertIterator($this->toAbsolute(array('test.py', 'test.php')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testSize($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->files()->size('< 1K')->size('> 500'));
|
||||
$this->assertIterator($this->toAbsolute(array('test.php')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testDate($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->files()->date('until last month'));
|
||||
$this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testExclude($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->exclude('foo'));
|
||||
$this->assertIterator($this->toAbsolute(array('test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testIgnoreVCS($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->ignoreVCS(false)->ignoreDotFiles(false));
|
||||
$this->assertIterator($this->toAbsolute(array('.git', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->ignoreVCS(false)->ignoreVCS(false)->ignoreDotFiles(false);
|
||||
$this->assertIterator($this->toAbsolute(array('.git', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->ignoreVCS(true)->ignoreDotFiles(false));
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testIgnoreDotFiles($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->ignoreDotFiles(false)->ignoreVCS(false));
|
||||
$this->assertIterator($this->toAbsolute(array('.git', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->ignoreDotFiles(false)->ignoreDotFiles(false)->ignoreVCS(false);
|
||||
$this->assertIterator($this->toAbsolute(array('.git', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->ignoreDotFiles(true)->ignoreVCS(false));
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testSortByName($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->sortByName());
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'foo bar', 'foo/bar.tmp', 'test.php', 'test.py', 'toto')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testSortByType($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->sortByType());
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'foo bar', 'toto', 'foo/bar.tmp', 'test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testSortByAccessedTime($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->sortByAccessedTime());
|
||||
$this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php', 'toto', 'test.py', 'foo', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testSortByChangedTime($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->sortByChangedTime());
|
||||
$this->assertIterator($this->toAbsolute(array('toto', 'test.py', 'test.php', 'foo/bar.tmp', 'foo', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testSortByModifiedTime($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->sortByModifiedTime());
|
||||
$this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php', 'toto', 'test.py', 'foo', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testSort($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->sort(function (\SplFileInfo $a, \SplFileInfo $b) { return strcmp($a->getRealpath(), $b->getRealpath()); }));
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'foo bar', 'foo/bar.tmp', 'test.php', 'test.py', 'toto')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testFilter($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->filter(function (\SplFileInfo $f) { return preg_match('/test/', $f) > 0; }));
|
||||
$this->assertIterator($this->toAbsolute(array('test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testFollowLinks($adapter)
|
||||
{
|
||||
if ('\\' == DIRECTORY_SEPARATOR) {
|
||||
return;
|
||||
}
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertSame($finder, $finder->followLinks());
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testIn($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
try {
|
||||
$finder->in('foobar');
|
||||
$this->fail('->in() throws a \InvalidArgumentException if the directory does not exist');
|
||||
} catch (\Exception $e) {
|
||||
$this->assertInstanceOf('InvalidArgumentException', $e, '->in() throws a \InvalidArgumentException if the directory does not exist');
|
||||
}
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$iterator = $finder->files()->name('*.php')->depth('< 1')->in(array(self::$tmpDir, __DIR__))->getIterator();
|
||||
|
||||
$this->assertIterator(array(self::$tmpDir.DIRECTORY_SEPARATOR.'test.php', __DIR__.DIRECTORY_SEPARATOR.'FinderTest.php'), $iterator);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testInWithGlob($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->in(array(__DIR__.'/Fixtures/*/B/C', __DIR__.'/Fixtures/*/*/B/C'))->getIterator();
|
||||
|
||||
$this->assertIterator($this->toAbsoluteFixtures(array('A/B/C/abc.dat', 'copy/A/B/C/abc.dat.copy')), $finder);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
* @expectedException \InvalidArgumentException
|
||||
*/
|
||||
public function testInWithNonDirectoryGlob($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->in(__DIR__.'/Fixtures/A/a*');
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testGetIterator($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
try {
|
||||
$finder->getIterator();
|
||||
$this->fail('->getIterator() throws a \LogicException if the in() method has not been called');
|
||||
} catch (\Exception $e) {
|
||||
$this->assertInstanceOf('LogicException', $e, '->getIterator() throws a \LogicException if the in() method has not been called');
|
||||
}
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$dirs = array();
|
||||
foreach ($finder->directories()->in(self::$tmpDir) as $dir) {
|
||||
$dirs[] = (string) $dir;
|
||||
}
|
||||
|
||||
$expected = $this->toAbsolute(array('foo', 'toto'));
|
||||
|
||||
sort($dirs);
|
||||
sort($expected);
|
||||
|
||||
$this->assertEquals($expected, $dirs, 'implements the \IteratorAggregate interface');
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$this->assertEquals(2, iterator_count($finder->directories()->in(self::$tmpDir)), 'implements the \IteratorAggregate interface');
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$a = iterator_to_array($finder->directories()->in(self::$tmpDir));
|
||||
$a = array_values(array_map(function ($a) { return (string) $a; }, $a));
|
||||
sort($a);
|
||||
$this->assertEquals($expected, $a, 'implements the \IteratorAggregate interface');
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testRelativePath($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter)->in(self::$tmpDir);
|
||||
|
||||
$paths = array();
|
||||
|
||||
foreach ($finder as $file) {
|
||||
$paths[] = $file->getRelativePath();
|
||||
}
|
||||
|
||||
$ref = array("", "", "", "", "foo", "");
|
||||
|
||||
sort($ref);
|
||||
sort($paths);
|
||||
|
||||
$this->assertEquals($ref, $paths);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testRelativePathname($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter)->in(self::$tmpDir)->sortByName();
|
||||
|
||||
$paths = array();
|
||||
|
||||
foreach ($finder as $file) {
|
||||
$paths[] = $file->getRelativePathname();
|
||||
}
|
||||
|
||||
$ref = array("test.php", "toto", "test.py", "foo", "foo".DIRECTORY_SEPARATOR."bar.tmp", "foo bar");
|
||||
|
||||
sort($paths);
|
||||
sort($ref);
|
||||
|
||||
$this->assertEquals($ref, $paths);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testAppendWithAFinder($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->files()->in(self::$tmpDir.DIRECTORY_SEPARATOR.'foo');
|
||||
|
||||
$finder1 = $this->buildFinder($adapter);
|
||||
$finder1->directories()->in(self::$tmpDir);
|
||||
|
||||
$finder = $finder->append($finder1);
|
||||
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'toto')), $finder->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testAppendWithAnArray($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->files()->in(self::$tmpDir.DIRECTORY_SEPARATOR.'foo');
|
||||
|
||||
$finder->append($this->toAbsolute(array('foo', 'toto')));
|
||||
|
||||
$this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'toto')), $finder->getIterator());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testAppendReturnsAFinder($adapter)
|
||||
{
|
||||
$this->assertInstanceOf('Symfony\\Component\\Finder\\Finder', $this->buildFinder($adapter)->append(array()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testAppendDoesNotRequireIn($adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->in(self::$tmpDir.DIRECTORY_SEPARATOR.'foo');
|
||||
|
||||
$finder1 = Finder::create()->append($finder);
|
||||
|
||||
$this->assertIterator(iterator_to_array($finder->getIterator()), $finder1->getIterator());
|
||||
}
|
||||
|
||||
public function testCountDirectories()
|
||||
{
|
||||
$directory = Finder::create()->directories()->in(self::$tmpDir);
|
||||
$i = 0;
|
||||
|
||||
foreach ($directory as $dir) {
|
||||
$i++;
|
||||
}
|
||||
|
||||
$this->assertCount($i, $directory);
|
||||
}
|
||||
|
||||
public function testCountFiles()
|
||||
{
|
||||
$files = Finder::create()->files()->in(__DIR__.DIRECTORY_SEPARATOR.'Fixtures');
|
||||
$i = 0;
|
||||
|
||||
foreach ($files as $file) {
|
||||
$i++;
|
||||
}
|
||||
|
||||
$this->assertCount($i, $files);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \LogicException
|
||||
*/
|
||||
public function testCountWithoutIn()
|
||||
{
|
||||
$finder = Finder::create()->files();
|
||||
count($finder);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getContainsTestData
|
||||
* @group grep
|
||||
*/
|
||||
public function testContains($adapter, $matchPatterns, $noMatchPatterns, $expected)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->in(__DIR__.DIRECTORY_SEPARATOR.'Fixtures')
|
||||
->name('*.txt')->sortByName()
|
||||
->contains($matchPatterns)
|
||||
->notContains($noMatchPatterns);
|
||||
|
||||
$this->assertIterator($this->toAbsoluteFixtures($expected), $finder);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testContainsOnDirectory(Adapter\AdapterInterface $adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->in(__DIR__)
|
||||
->directories()
|
||||
->name('Fixtures')
|
||||
->contains('abc');
|
||||
$this->assertIterator(array(), $finder);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testNotContainsOnDirectory(Adapter\AdapterInterface $adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->in(__DIR__)
|
||||
->directories()
|
||||
->name('Fixtures')
|
||||
->notContains('abc');
|
||||
$this->assertIterator(array(), $finder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Searching in multiple locations involves AppendIterator which does an unnecessary rewind which leaves FilterIterator
|
||||
* with inner FilesystemIterator in an invalid state.
|
||||
*
|
||||
* @see https://bugs.php.net/bug.php?id=49104
|
||||
*
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testMultipleLocations(Adapter\AdapterInterface $adapter)
|
||||
{
|
||||
$locations = array(
|
||||
self::$tmpDir.'/',
|
||||
self::$tmpDir.'/toto/',
|
||||
);
|
||||
|
||||
// it is expected that there are test.py test.php in the tmpDir
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->in($locations)->depth('< 1')->name('test.php');
|
||||
|
||||
$this->assertEquals(1, count($finder));
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterator keys must be the file pathname.
|
||||
*
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testIteratorKeys(Adapter\AdapterInterface $adapter)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter)->in(self::$tmpDir);
|
||||
foreach ($finder as $key => $file) {
|
||||
$this->assertEquals($file->getPathname(), $key);
|
||||
}
|
||||
}
|
||||
|
||||
public function testAdaptersOrdering()
|
||||
{
|
||||
$finder = Finder::create()
|
||||
->removeAdapters()
|
||||
->addAdapter(new FakeAdapter\NamedAdapter('a'), 0)
|
||||
->addAdapter(new FakeAdapter\NamedAdapter('b'), -50)
|
||||
->addAdapter(new FakeAdapter\NamedAdapter('c'), 50)
|
||||
->addAdapter(new FakeAdapter\NamedAdapter('d'), -25)
|
||||
->addAdapter(new FakeAdapter\NamedAdapter('e'), 25);
|
||||
|
||||
$this->assertEquals(
|
||||
array('c', 'e', 'a', 'd', 'b'),
|
||||
array_map(function(Adapter\AdapterInterface $adapter) {
|
||||
return $adapter->getName();
|
||||
}, $finder->getAdapters())
|
||||
);
|
||||
}
|
||||
|
||||
public function testAdaptersChaining()
|
||||
{
|
||||
$iterator = new \ArrayIterator(array());
|
||||
$filenames = $this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto'));
|
||||
foreach ($filenames as $file) {
|
||||
$iterator->append(new \Symfony\Component\Finder\SplFileInfo($file, null, null));
|
||||
}
|
||||
|
||||
$finder = Finder::create()
|
||||
->removeAdapters()
|
||||
->addAdapter(new FakeAdapter\UnsupportedAdapter(), 3)
|
||||
->addAdapter(new FakeAdapter\FailingAdapter(), 2)
|
||||
->addAdapter(new FakeAdapter\DummyAdapter($iterator), 1);
|
||||
|
||||
$this->assertIterator($filenames, $finder->in(sys_get_temp_dir())->getIterator());
|
||||
}
|
||||
|
||||
public function getAdaptersTestData()
|
||||
{
|
||||
return array_map(
|
||||
function ($adapter) { return array($adapter); },
|
||||
$this->getValidAdapters()
|
||||
);
|
||||
}
|
||||
|
||||
public function getContainsTestData()
|
||||
{
|
||||
$tests = array(
|
||||
array('', '', array()),
|
||||
array('foo', 'bar', array()),
|
||||
array('', 'foobar', array('dolor.txt', 'ipsum.txt', 'lorem.txt')),
|
||||
array('lorem ipsum dolor sit amet', 'foobar', array('lorem.txt')),
|
||||
array('sit', 'bar', array('dolor.txt', 'ipsum.txt', 'lorem.txt')),
|
||||
array('dolor sit amet', '@^L@m', array('dolor.txt', 'ipsum.txt')),
|
||||
array('/^lorem ipsum dolor sit amet$/m', 'foobar', array('lorem.txt')),
|
||||
array('lorem', 'foobar', array('lorem.txt')),
|
||||
array('', 'lorem', array('dolor.txt', 'ipsum.txt')),
|
||||
array('ipsum dolor sit amet', '/^IPSUM/m', array('lorem.txt')),
|
||||
);
|
||||
|
||||
return $this->buildTestData($tests);
|
||||
}
|
||||
|
||||
public function getRegexNameTestData()
|
||||
{
|
||||
$tests = array(
|
||||
array('~.+\\.p.+~i'),
|
||||
array('~t.*s~i'),
|
||||
);
|
||||
|
||||
return $this->buildTestData($tests);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getTestPathData
|
||||
*/
|
||||
public function testPath(Adapter\AdapterInterface $adapter, $matchPatterns, $noMatchPatterns, array $expected)
|
||||
{
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->in(__DIR__.DIRECTORY_SEPARATOR.'Fixtures')
|
||||
->path($matchPatterns)
|
||||
->notPath($noMatchPatterns);
|
||||
|
||||
$this->assertIterator($this->toAbsoluteFixtures($expected), $finder);
|
||||
}
|
||||
|
||||
public function testAdapterSelection()
|
||||
{
|
||||
// test that by default, PhpAdapter is selected
|
||||
$adapters = Finder::create()->getAdapters();
|
||||
$this->assertTrue($adapters[0] instanceof Adapter\PhpAdapter);
|
||||
|
||||
// test another adapter selection
|
||||
$adapters = Finder::create()->setAdapter('gnu_find')->getAdapters();
|
||||
$this->assertTrue($adapters[0] instanceof Adapter\GnuFindAdapter);
|
||||
|
||||
// test that useBestAdapter method removes selection
|
||||
$adapters = Finder::create()->useBestAdapter()->getAdapters();
|
||||
$this->assertFalse($adapters[0] instanceof Adapter\PhpAdapter);
|
||||
}
|
||||
|
||||
public function getTestPathData()
|
||||
{
|
||||
$tests = array(
|
||||
array('', '', array()),
|
||||
array('/^A\/B\/C/', '/C$/',
|
||||
array('A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat')
|
||||
),
|
||||
array('/^A\/B/', 'foobar',
|
||||
array(
|
||||
'A'.DIRECTORY_SEPARATOR.'B',
|
||||
'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C',
|
||||
'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'ab.dat',
|
||||
'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat',
|
||||
)
|
||||
),
|
||||
array('A/B/C', 'foobar',
|
||||
array(
|
||||
'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C',
|
||||
'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat',
|
||||
'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C',
|
||||
'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat.copy',
|
||||
)
|
||||
),
|
||||
array('A/B', 'foobar',
|
||||
array(
|
||||
//dirs
|
||||
'A'.DIRECTORY_SEPARATOR.'B',
|
||||
'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C',
|
||||
'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B',
|
||||
'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C',
|
||||
//files
|
||||
'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'ab.dat',
|
||||
'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat',
|
||||
'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'ab.dat.copy',
|
||||
'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat.copy',
|
||||
)
|
||||
),
|
||||
array('/^with space\//', 'foobar',
|
||||
array(
|
||||
'with space'.DIRECTORY_SEPARATOR.'foo.txt',
|
||||
)
|
||||
),
|
||||
);
|
||||
|
||||
return $this->buildTestData($tests);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testAccessDeniedException(Adapter\AdapterInterface $adapter)
|
||||
{
|
||||
if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
|
||||
$this->markTestSkipped('chmod is not supported on windows');
|
||||
}
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->files()->in(self::$tmpDir);
|
||||
|
||||
// make 'foo' directory non-readable
|
||||
chmod(self::$tmpDir.DIRECTORY_SEPARATOR.'foo', 0333);
|
||||
|
||||
try {
|
||||
$this->assertIterator($this->toAbsolute(array('foo bar', 'test.php', 'test.py')), $finder->getIterator());
|
||||
$this->fail('Finder should throw an exception when opening a non-readable directory.');
|
||||
} catch (\Exception $e) {
|
||||
$this->assertEquals('Symfony\\Component\\Finder\\Exception\\AccessDeniedException', get_class($e));
|
||||
}
|
||||
|
||||
// restore original permissions
|
||||
chmod(self::$tmpDir.DIRECTORY_SEPARATOR.'foo', 0777);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAdaptersTestData
|
||||
*/
|
||||
public function testIgnoredAccessDeniedException(Adapter\AdapterInterface $adapter)
|
||||
{
|
||||
if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
|
||||
$this->markTestSkipped('chmod is not supported on windows');
|
||||
}
|
||||
|
||||
$finder = $this->buildFinder($adapter);
|
||||
$finder->files()->ignoreUnreadableDirs()->in(self::$tmpDir);
|
||||
|
||||
// make 'foo' directory non-readable
|
||||
chmod(self::$tmpDir.DIRECTORY_SEPARATOR.'foo', 0333);
|
||||
|
||||
$this->assertIterator($this->toAbsolute(array('foo bar', 'test.php', 'test.py')), $finder->getIterator());
|
||||
|
||||
// restore original permissions
|
||||
chmod(self::$tmpDir.DIRECTORY_SEPARATOR.'foo', 0777);
|
||||
}
|
||||
|
||||
private function buildTestData(array $tests)
|
||||
{
|
||||
$data = array();
|
||||
foreach ($this->getValidAdapters() as $adapter) {
|
||||
foreach ($tests as $test) {
|
||||
$data[] = array_merge(array($adapter), $test);
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
private function buildFinder(Adapter\AdapterInterface $adapter)
|
||||
{
|
||||
return Finder::create()
|
||||
->removeAdapters()
|
||||
->addAdapter($adapter);
|
||||
}
|
||||
|
||||
private function getValidAdapters()
|
||||
{
|
||||
return array_filter(
|
||||
array(
|
||||
new Adapter\BsdFindAdapter(),
|
||||
new Adapter\GnuFindAdapter(),
|
||||
new Adapter\PhpAdapter()
|
||||
),
|
||||
function (Adapter\AdapterInterface $adapter) {
|
||||
return $adapter->isSupported();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Searching in multiple locations with sub directories involves
|
||||
* AppendIterator which does an unnecessary rewind which leaves
|
||||
* FilterIterator with inner FilesystemIterator in an ivalid state.
|
||||
*
|
||||
* @see https://bugs.php.net/bug.php?id=49104
|
||||
*/
|
||||
public function testMultipleLocationsWithSubDirectories()
|
||||
{
|
||||
$locations = array(
|
||||
__DIR__.'/Fixtures/one',
|
||||
self::$tmpDir.DIRECTORY_SEPARATOR.'toto',
|
||||
);
|
||||
|
||||
$finder = new Finder();
|
||||
$finder->in($locations)->depth('< 10')->name('*.neon');
|
||||
|
||||
$expected = array(
|
||||
__DIR__.'/Fixtures/one'.DIRECTORY_SEPARATOR.'b'.DIRECTORY_SEPARATOR.'c.neon',
|
||||
__DIR__.'/Fixtures/one'.DIRECTORY_SEPARATOR.'b'.DIRECTORY_SEPARATOR.'d.neon',
|
||||
);
|
||||
|
||||
$this->assertIterator($expected, $finder);
|
||||
$this->assertIteratorInForeach($expected, $finder);
|
||||
}
|
||||
|
||||
public function testNonSeekableStream()
|
||||
{
|
||||
try {
|
||||
$i = Finder::create()->in('ftp://ftp.mozilla.org/')->depth(0)->getIterator();
|
||||
} catch (\UnexpectedValueException $e) {
|
||||
$this->markTestSkipped(sprintf('Unsupported stream "%s".', 'ftp'));
|
||||
}
|
||||
|
||||
$contains = array(
|
||||
'ftp://ftp.mozilla.org'.DIRECTORY_SEPARATOR.'README',
|
||||
'ftp://ftp.mozilla.org'.DIRECTORY_SEPARATOR.'index.html',
|
||||
'ftp://ftp.mozilla.org'.DIRECTORY_SEPARATOR.'pub',
|
||||
);
|
||||
|
||||
$this->assertIteratorInForeach($contains, $i);
|
||||
}
|
||||
}
|
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/A/B/C/abc.dat
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/A/B/C/abc.dat
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/A/B/ab.dat
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/A/B/ab.dat
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/A/a.dat
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/A/a.dat
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/copy/A/B/C/abc.dat.copy
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/copy/A/B/C/abc.dat.copy
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/copy/A/B/ab.dat.copy
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/copy/A/B/ab.dat.copy
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/copy/A/a.dat.copy
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/copy/A/a.dat.copy
vendored
Normal file
2
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/dolor.txt
vendored
Normal file
2
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/dolor.txt
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
dolor sit amet
|
||||
DOLOR SIT AMET
|
2
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/ipsum.txt
vendored
Normal file
2
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/ipsum.txt
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
ipsum dolor sit amet
|
||||
IPSUM DOLOR SIT AMET
|
2
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/lorem.txt
vendored
Normal file
2
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/lorem.txt
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
lorem ipsum dolor sit amet
|
||||
LOREM IPSUM DOLOR SIT AMET
|
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/one/a
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/one/a
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/one/b/c.neon
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/one/b/c.neon
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/one/b/d.neon
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/one/b/d.neon
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/with space/foo.txt
vendored
Normal file
0
vendor/symfony/finder/Symfony/Component/Finder/Tests/Fixtures/with space/foo.txt
vendored
Normal file
46
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/CustomFilterIteratorTest.php
vendored
Normal file
46
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/CustomFilterIteratorTest.php
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\CustomFilterIterator;
|
||||
|
||||
class CustomFilterIteratorTest extends IteratorTestCase
|
||||
{
|
||||
/**
|
||||
* @expectedException \InvalidArgumentException
|
||||
*/
|
||||
public function testWithInvalidFilter()
|
||||
{
|
||||
new CustomFilterIterator(new Iterator(), array('foo'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAcceptData
|
||||
*/
|
||||
public function testAccept($filters, $expected)
|
||||
{
|
||||
$inner = new Iterator(array('test.php', 'test.py', 'foo.php'));
|
||||
|
||||
$iterator = new CustomFilterIterator($inner, $filters);
|
||||
|
||||
$this->assertIterator($expected, $iterator);
|
||||
}
|
||||
|
||||
public function getAcceptData()
|
||||
{
|
||||
return array(
|
||||
array(array(function (\SplFileInfo $fileinfo) { return false; }), array()),
|
||||
array(array(function (\SplFileInfo $fileinfo) { return preg_match('/^test/', $fileinfo) > 0; }), array('test.php', 'test.py')),
|
||||
array(array('is_dir'), array()),
|
||||
);
|
||||
}
|
||||
}
|
74
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/DateRangeFilterIteratorTest.php
vendored
Normal file
74
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/DateRangeFilterIteratorTest.php
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\DateRangeFilterIterator;
|
||||
use Symfony\Component\Finder\Comparator\DateComparator;
|
||||
|
||||
class DateRangeFilterIteratorTest extends RealIteratorTestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getAcceptData
|
||||
*/
|
||||
public function testAccept($size, $expected)
|
||||
{
|
||||
$inner = new Iterator(self::$files);
|
||||
|
||||
$iterator = new DateRangeFilterIterator($inner, $size);
|
||||
|
||||
$this->assertIterator($expected, $iterator);
|
||||
}
|
||||
|
||||
public function getAcceptData()
|
||||
{
|
||||
$since20YearsAgo = array(
|
||||
'.git',
|
||||
'test.py',
|
||||
'foo',
|
||||
'foo/bar.tmp',
|
||||
'test.php',
|
||||
'toto',
|
||||
'.bar',
|
||||
'.foo',
|
||||
'.foo/.bar',
|
||||
'foo bar',
|
||||
'.foo/bar',
|
||||
);
|
||||
|
||||
$since2MonthsAgo = array(
|
||||
'.git',
|
||||
'test.py',
|
||||
'foo',
|
||||
'toto',
|
||||
'.bar',
|
||||
'.foo',
|
||||
'.foo/.bar',
|
||||
'foo bar',
|
||||
'.foo/bar',
|
||||
);
|
||||
|
||||
$untilLastMonth = array(
|
||||
'.git',
|
||||
'foo',
|
||||
'foo/bar.tmp',
|
||||
'test.php',
|
||||
'toto',
|
||||
'.foo',
|
||||
);
|
||||
|
||||
return array(
|
||||
array(array(new DateComparator('since 20 years ago')), $this->toAbsolute($since20YearsAgo)),
|
||||
array(array(new DateComparator('since 2 months ago')), $this->toAbsolute($since2MonthsAgo)),
|
||||
array(array(new DateComparator('until last month')), $this->toAbsolute($untilLastMonth)),
|
||||
);
|
||||
}
|
||||
}
|
81
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/DepthRangeFilterIteratorTest.php
vendored
Normal file
81
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/DepthRangeFilterIteratorTest.php
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\DepthRangeFilterIterator;
|
||||
|
||||
class DepthRangeFilterIteratorTest extends RealIteratorTestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getAcceptData
|
||||
*/
|
||||
public function testAccept($minDepth, $maxDepth, $expected)
|
||||
{
|
||||
$inner = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->toAbsolute(), \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST);
|
||||
|
||||
$iterator = new DepthRangeFilterIterator($inner, $minDepth, $maxDepth);
|
||||
|
||||
$actual = array_keys(iterator_to_array($iterator));
|
||||
sort($expected);
|
||||
sort($actual);
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
public function getAcceptData()
|
||||
{
|
||||
$lessThan1 = array(
|
||||
'.git',
|
||||
'test.py',
|
||||
'foo',
|
||||
'test.php',
|
||||
'toto',
|
||||
'.foo',
|
||||
'.bar',
|
||||
'foo bar',
|
||||
);
|
||||
|
||||
$lessThanOrEqualTo1 = array(
|
||||
'.git',
|
||||
'test.py',
|
||||
'foo',
|
||||
'foo/bar.tmp',
|
||||
'test.php',
|
||||
'toto',
|
||||
'.foo',
|
||||
'.foo/.bar',
|
||||
'.bar',
|
||||
'foo bar',
|
||||
'.foo/bar',
|
||||
);
|
||||
|
||||
$graterThanOrEqualTo1 = array(
|
||||
'foo/bar.tmp',
|
||||
'.foo/.bar',
|
||||
'.foo/bar',
|
||||
);
|
||||
|
||||
$equalTo1 = array(
|
||||
'foo/bar.tmp',
|
||||
'.foo/.bar',
|
||||
'.foo/bar',
|
||||
);
|
||||
|
||||
return array(
|
||||
array(0, 0, $this->toAbsolute($lessThan1)),
|
||||
array(0, 1, $this->toAbsolute($lessThanOrEqualTo1)),
|
||||
array(2, PHP_INT_MAX, array()),
|
||||
array(1, PHP_INT_MAX, $this->toAbsolute($graterThanOrEqualTo1)),
|
||||
array(1, 1, $this->toAbsolute($equalTo1)),
|
||||
);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator;
|
||||
use Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator;
|
||||
|
||||
class ExcludeDirectoryFilterIteratorTest extends RealIteratorTestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getAcceptData
|
||||
*/
|
||||
public function testAccept($directories, $expected)
|
||||
{
|
||||
$inner = new \RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->toAbsolute(), \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST);
|
||||
|
||||
$iterator = new ExcludeDirectoryFilterIterator($inner, $directories);
|
||||
|
||||
$this->assertIterator($expected, $iterator);
|
||||
}
|
||||
|
||||
public function getAcceptData()
|
||||
{
|
||||
$foo = array(
|
||||
'.bar',
|
||||
'.foo',
|
||||
'.foo/.bar',
|
||||
'.foo/bar',
|
||||
'.git',
|
||||
'test.py',
|
||||
'test.php',
|
||||
'toto',
|
||||
'foo bar'
|
||||
);
|
||||
|
||||
$fo = array(
|
||||
'.bar',
|
||||
'.foo',
|
||||
'.foo/.bar',
|
||||
'.foo/bar',
|
||||
'.git',
|
||||
'test.py',
|
||||
'foo',
|
||||
'foo/bar.tmp',
|
||||
'test.php',
|
||||
'toto',
|
||||
'foo bar'
|
||||
);
|
||||
|
||||
return array(
|
||||
array(array('foo'), $this->toAbsolute($foo)),
|
||||
array(array('fo'), $this->toAbsolute($fo)),
|
||||
);
|
||||
}
|
||||
|
||||
}
|
66
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/FilePathsIteratorTest.php
vendored
Normal file
66
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/FilePathsIteratorTest.php
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\FilePathsIterator;
|
||||
|
||||
class FilePathsIteratorTest extends RealIteratorTestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getSubPathData
|
||||
*/
|
||||
public function testSubPath($baseDir, array $paths, array $subPaths, array $subPathnames)
|
||||
{
|
||||
$iterator = new FilePathsIterator($paths, $baseDir);
|
||||
|
||||
foreach ($iterator as $index => $file) {
|
||||
$this->assertEquals($paths[$index], $file->getPathname());
|
||||
$this->assertEquals($subPaths[$index], $iterator->getSubPath());
|
||||
$this->assertEquals($subPathnames[$index], $iterator->getSubPathname());
|
||||
}
|
||||
}
|
||||
|
||||
public function getSubPathData()
|
||||
{
|
||||
$tmpDir = sys_get_temp_dir().'/symfony2_finder';
|
||||
|
||||
return array(
|
||||
array(
|
||||
$tmpDir,
|
||||
array( // paths
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'.git' => $tmpDir.DIRECTORY_SEPARATOR.'.git',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'test.py' => $tmpDir.DIRECTORY_SEPARATOR.'test.py',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'foo' => $tmpDir.DIRECTORY_SEPARATOR.'foo',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'bar.tmp' => $tmpDir.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'bar.tmp',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'test.php' => $tmpDir.DIRECTORY_SEPARATOR.'test.php',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'toto' => $tmpDir.DIRECTORY_SEPARATOR.'toto'
|
||||
),
|
||||
array( // subPaths
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'.git' => '',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'test.py' => '',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'foo' => '',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'bar.tmp' => 'foo',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'test.php' => '',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'toto' => ''
|
||||
),
|
||||
array( // subPathnames
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'.git' => '.git',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'test.py' => 'test.py',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'foo' => 'foo',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'bar.tmp' => 'foo'.DIRECTORY_SEPARATOR.'bar.tmp',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'test.php' => 'test.php',
|
||||
$tmpDir.DIRECTORY_SEPARATOR.'toto' => 'toto'
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
72
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/FileTypeFilterIteratorTest.php
vendored
Normal file
72
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/FileTypeFilterIteratorTest.php
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\FileTypeFilterIterator;
|
||||
|
||||
class FileTypeFilterIteratorTest extends RealIteratorTestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getAcceptData
|
||||
*/
|
||||
public function testAccept($mode, $expected)
|
||||
{
|
||||
$inner = new InnerTypeIterator(self::$files);
|
||||
|
||||
$iterator = new FileTypeFilterIterator($inner, $mode);
|
||||
|
||||
$this->assertIterator($expected, $iterator);
|
||||
}
|
||||
|
||||
public function getAcceptData()
|
||||
{
|
||||
$onlyFiles = array(
|
||||
'test.py',
|
||||
'foo/bar.tmp',
|
||||
'test.php',
|
||||
'.bar',
|
||||
'.foo/.bar',
|
||||
'.foo/bar',
|
||||
'foo bar',
|
||||
);
|
||||
|
||||
$onlyDirectories = array(
|
||||
'.git',
|
||||
'foo',
|
||||
'toto',
|
||||
'.foo',
|
||||
);
|
||||
|
||||
return array(
|
||||
array(FileTypeFilterIterator::ONLY_FILES, $this->toAbsolute($onlyFiles)),
|
||||
array(FileTypeFilterIterator::ONLY_DIRECTORIES, $this->toAbsolute($onlyDirectories)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class InnerTypeIterator extends \ArrayIterator
|
||||
{
|
||||
public function current()
|
||||
{
|
||||
return new \SplFileInfo(parent::current());
|
||||
}
|
||||
|
||||
public function isFile()
|
||||
{
|
||||
return $this->current()->isFile();
|
||||
}
|
||||
|
||||
public function isDir()
|
||||
{
|
||||
return $this->current()->isDir();
|
||||
}
|
||||
}
|
89
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/FilecontentFilterIteratorTest.php
vendored
Normal file
89
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/FilecontentFilterIteratorTest.php
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\FilecontentFilterIterator;
|
||||
use Symfony\Component\Finder\Tests\Iterator\MockSplFileInfo;
|
||||
use Symfony\Component\Finder\Tests\Iterator\MockFileListIterator;
|
||||
|
||||
class FilecontentFilterIteratorTest extends IteratorTestCase
|
||||
{
|
||||
|
||||
public function testAccept()
|
||||
{
|
||||
$inner = new MockFileListIterator(array('test.txt'));
|
||||
$iterator = new FilecontentFilterIterator($inner, array(), array());
|
||||
$this->assertIterator(array('test.txt'), $iterator);
|
||||
}
|
||||
|
||||
public function testDirectory()
|
||||
{
|
||||
$inner = new MockFileListIterator(array('directory'));
|
||||
$iterator = new FilecontentFilterIterator($inner, array('directory'), array());
|
||||
$this->assertIterator(array(), $iterator);
|
||||
}
|
||||
|
||||
public function testUnreadableFile()
|
||||
{
|
||||
$inner = new MockFileListIterator(array('file r-'));
|
||||
$iterator = new FilecontentFilterIterator($inner, array('file r-'), array());
|
||||
$this->assertIterator(array(), $iterator);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getTestFilterData
|
||||
*/
|
||||
public function testFilter(\Iterator $inner, array $matchPatterns, array $noMatchPatterns, array $resultArray)
|
||||
{
|
||||
$iterator = new FilecontentFilterIterator($inner, $matchPatterns, $noMatchPatterns);
|
||||
$this->assertIterator($resultArray, $iterator);
|
||||
}
|
||||
|
||||
public function getTestFilterData()
|
||||
{
|
||||
$inner = new MockFileListIterator();
|
||||
|
||||
$inner[] = new MockSplFileInfo(array(
|
||||
'name' => 'a.txt',
|
||||
'contents' => 'Lorem ipsum...',
|
||||
'type' => 'file',
|
||||
'mode' => 'r+')
|
||||
);
|
||||
|
||||
$inner[] = new MockSplFileInfo(array(
|
||||
'name' => 'b.yml',
|
||||
'contents' => 'dolor sit...',
|
||||
'type' => 'file',
|
||||
'mode' => 'r+')
|
||||
);
|
||||
|
||||
$inner[] = new MockSplFileInfo(array(
|
||||
'name' => 'some/other/dir/third.php',
|
||||
'contents' => 'amet...',
|
||||
'type' => 'file',
|
||||
'mode' => 'r+')
|
||||
);
|
||||
|
||||
$inner[] = new MockSplFileInfo(array(
|
||||
'name' => 'unreadable-file.txt',
|
||||
'contents' => false,
|
||||
'type' => 'file',
|
||||
'mode' => 'r+')
|
||||
);
|
||||
|
||||
return array(
|
||||
array($inner, array('.'), array(), array('a.txt', 'b.yml', 'some/other/dir/third.php')),
|
||||
array($inner, array('ipsum'), array(), array('a.txt')),
|
||||
array($inner, array('i', 'amet'), array('Lorem', 'amet'), array('b.yml')),
|
||||
);
|
||||
}
|
||||
}
|
54
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/FilenameFilterIteratorTest.php
vendored
Normal file
54
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/FilenameFilterIteratorTest.php
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\FilenameFilterIterator;
|
||||
|
||||
class FilenameFilterIteratorTest extends IteratorTestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getAcceptData
|
||||
*/
|
||||
public function testAccept($matchPatterns, $noMatchPatterns, $expected)
|
||||
{
|
||||
$inner = new InnerNameIterator(array('test.php', 'test.py', 'foo.php'));
|
||||
|
||||
$iterator = new FilenameFilterIterator($inner, $matchPatterns, $noMatchPatterns);
|
||||
|
||||
$this->assertIterator($expected, $iterator);
|
||||
}
|
||||
|
||||
public function getAcceptData()
|
||||
{
|
||||
return array(
|
||||
array(array('test.*'), array(), array('test.php', 'test.py')),
|
||||
array(array(), array('test.*'), array('foo.php')),
|
||||
array(array('*.php'), array('test.*'), array('foo.php')),
|
||||
array(array('*.php', '*.py'), array('foo.*'), array('test.php', 'test.py')),
|
||||
array(array('/\.php$/'), array(), array('test.php', 'foo.php')),
|
||||
array(array(), array('/\.php$/'), array('test.py')),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class InnerNameIterator extends \ArrayIterator
|
||||
{
|
||||
public function current()
|
||||
{
|
||||
return new \SplFileInfo(parent::current());
|
||||
}
|
||||
|
||||
public function getFilename()
|
||||
{
|
||||
return parent::current();
|
||||
}
|
||||
}
|
50
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/FilterIteratorTest.php
vendored
Normal file
50
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/FilterIteratorTest.php
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
/**
|
||||
* @author Alex Bogomazov
|
||||
*/
|
||||
class FilterIteratorTest extends RealIteratorTestCase
|
||||
{
|
||||
public function testFilterFilesystemIterators()
|
||||
{
|
||||
$i = new \FilesystemIterator($this->toAbsolute());
|
||||
|
||||
// it is expected that there are test.py test.php in the tmpDir
|
||||
$i = $this->getMockForAbstractClass('Symfony\Component\Finder\Iterator\FilterIterator', array($i));
|
||||
$i->expects($this->any())
|
||||
->method('accept')
|
||||
->will($this->returnCallback(function () use ($i) {
|
||||
return (bool) preg_match('/\.php/', (string) $i->current());
|
||||
})
|
||||
);
|
||||
|
||||
$c = 0;
|
||||
foreach ($i as $item) {
|
||||
$c++;
|
||||
}
|
||||
|
||||
$this->assertEquals(1, $c);
|
||||
|
||||
$i->rewind();
|
||||
|
||||
$c = 0;
|
||||
foreach ($i as $item) {
|
||||
$c++;
|
||||
}
|
||||
|
||||
// This would fail with \FilterIterator but works with Symfony\Component\Finder\Iterator\FilterIterator
|
||||
// see https://bugs.php.net/bug.php?id=49104
|
||||
$this->assertEquals(1, $c);
|
||||
}
|
||||
}
|
56
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/Iterator.php
vendored
Normal file
56
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/Iterator.php
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
class Iterator implements \Iterator
|
||||
{
|
||||
protected $values;
|
||||
|
||||
public function __construct(array $values = array())
|
||||
{
|
||||
$this->values = array();
|
||||
foreach ($values as $value) {
|
||||
$this->attach(new \SplFileInfo($value));
|
||||
}
|
||||
$this->rewind();
|
||||
}
|
||||
|
||||
public function attach(\SplFileInfo $fileinfo)
|
||||
{
|
||||
$this->values[] = $fileinfo;
|
||||
}
|
||||
|
||||
public function rewind()
|
||||
{
|
||||
reset($this->values);
|
||||
}
|
||||
|
||||
public function valid()
|
||||
{
|
||||
return false !== $this->current();
|
||||
}
|
||||
|
||||
public function next()
|
||||
{
|
||||
next($this->values);
|
||||
}
|
||||
|
||||
public function current()
|
||||
{
|
||||
return current($this->values);
|
||||
}
|
||||
|
||||
public function key()
|
||||
{
|
||||
return key($this->values);
|
||||
}
|
||||
}
|
73
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/IteratorTestCase.php
vendored
Normal file
73
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/IteratorTestCase.php
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
abstract class IteratorTestCase extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
protected function assertIterator($expected, \Traversable $iterator)
|
||||
{
|
||||
// set iterator_to_array $use_key to false to avoid values merge
|
||||
// this made FinderTest::testAppendWithAnArray() failed with GnuFinderAdapter
|
||||
$values = array_map(function (\SplFileInfo $fileinfo) { return str_replace('/', DIRECTORY_SEPARATOR, $fileinfo->getPathname()); }, iterator_to_array($iterator, false));
|
||||
|
||||
$expected = array_map(function ($path) { return str_replace('/', DIRECTORY_SEPARATOR, $path); }, $expected);
|
||||
|
||||
sort($values);
|
||||
sort($expected);
|
||||
|
||||
$this->assertEquals($expected, array_values($values));
|
||||
}
|
||||
|
||||
protected function assertOrderedIterator($expected, \Traversable $iterator)
|
||||
{
|
||||
$values = array_map(function (\SplFileInfo $fileinfo) { return $fileinfo->getPathname(); }, iterator_to_array($iterator));
|
||||
|
||||
$this->assertEquals($expected, array_values($values));
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as IteratorTestCase::assertIterator with foreach usage
|
||||
*
|
||||
* @param array $expected
|
||||
* @param \Traversable $iterator
|
||||
*/
|
||||
protected function assertIteratorInForeach($expected, \Traversable $iterator)
|
||||
{
|
||||
$values = array();
|
||||
foreach ($iterator as $file) {
|
||||
$this->assertInstanceOf('Symfony\\Component\\Finder\\SplFileInfo', $file);
|
||||
$values[] = $file->getPathname();
|
||||
}
|
||||
|
||||
sort($values);
|
||||
sort($expected);
|
||||
|
||||
$this->assertEquals($expected, array_values($values));
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as IteratorTestCase::assertOrderedIterator with foreach usage
|
||||
*
|
||||
* @param array $expected
|
||||
* @param \Traversable $iterator
|
||||
*/
|
||||
protected function assertOrderedIteratorInForeach($expected, \Traversable $iterator)
|
||||
{
|
||||
$values = array();
|
||||
foreach ($iterator as $file) {
|
||||
$this->assertInstanceOf('Symfony\\Component\\Finder\\SplFileInfo', $file);
|
||||
$values[] = $file->getPathname();
|
||||
}
|
||||
|
||||
$this->assertEquals($expected, array_values($values));
|
||||
}
|
||||
}
|
21
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/MockFileListIterator.php
vendored
Normal file
21
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/MockFileListIterator.php
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
class MockFileListIterator extends \ArrayIterator
|
||||
{
|
||||
public function __construct(array $filesArray = array())
|
||||
{
|
||||
$files = array_map(function($file){ return new MockSplFileInfo($file); }, $filesArray);
|
||||
parent::__construct($files);
|
||||
}
|
||||
}
|
134
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/MockSplFileInfo.php
vendored
Normal file
134
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/MockSplFileInfo.php
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
class MockSplFileInfo extends \SplFileInfo
|
||||
{
|
||||
const TYPE_DIRECTORY = 1;
|
||||
const TYPE_FILE = 2;
|
||||
const TYPE_UNKNOWN = 3;
|
||||
|
||||
private $contents = null;
|
||||
private $mode = null;
|
||||
private $type = null;
|
||||
private $relativePath = null;
|
||||
private $relativePathname = null;
|
||||
|
||||
public function __construct($param)
|
||||
{
|
||||
if (is_string($param)) {
|
||||
parent::__construct($param);
|
||||
} elseif (is_array($param)) {
|
||||
$defaults = array(
|
||||
'name' => 'file.txt',
|
||||
'contents' => null,
|
||||
'mode' => null,
|
||||
'type' => null,
|
||||
'relativePath' => null,
|
||||
'relativePathname' => null,
|
||||
);
|
||||
$defaults = array_merge($defaults, $param);
|
||||
parent::__construct($defaults['name']);
|
||||
$this->setContents($defaults['contents']);
|
||||
$this->setMode($defaults['mode']);
|
||||
$this->setType($defaults['type']);
|
||||
$this->setRelativePath($defaults['relativePath']);
|
||||
$this->setRelativePathname($defaults['relativePathname']);
|
||||
} else {
|
||||
throw new \RuntimeException(sprintf('Incorrect parameter "%s"', $param));
|
||||
}
|
||||
}
|
||||
|
||||
public function isFile()
|
||||
{
|
||||
if ($this->type === null) {
|
||||
return preg_match('/file/', $this->getFilename());
|
||||
};
|
||||
|
||||
return self::TYPE_FILE === $this->type;
|
||||
}
|
||||
|
||||
public function isDir()
|
||||
{
|
||||
if ($this->type === null) {
|
||||
return preg_match('/directory/', $this->getFilename());
|
||||
}
|
||||
|
||||
return self::TYPE_DIRECTORY === $this->type;
|
||||
}
|
||||
|
||||
public function isReadable()
|
||||
{
|
||||
if ($this->mode === null) {
|
||||
return preg_match('/r\+/', $this->getFilename());
|
||||
}
|
||||
|
||||
return preg_match('/r\+/', $this->mode);
|
||||
}
|
||||
|
||||
public function getContents()
|
||||
{
|
||||
return $this->contents;
|
||||
}
|
||||
|
||||
public function setContents($contents)
|
||||
{
|
||||
$this->contents = $contents;
|
||||
}
|
||||
|
||||
public function setMode($mode)
|
||||
{
|
||||
$this->mode = $mode;
|
||||
}
|
||||
|
||||
public function setType($type)
|
||||
{
|
||||
if (is_string($type)) {
|
||||
switch ($type) {
|
||||
case 'directory':
|
||||
$this->type = self::TYPE_DIRECTORY;
|
||||
case 'd':
|
||||
$this->type = self::TYPE_DIRECTORY;
|
||||
break;
|
||||
case 'file':
|
||||
$this->type = self::TYPE_FILE;
|
||||
case 'f':
|
||||
$this->type = self::TYPE_FILE;
|
||||
break;
|
||||
default:
|
||||
$this->type = self::TYPE_UNKNOWN;
|
||||
}
|
||||
} else {
|
||||
$this->type = $type;
|
||||
}
|
||||
}
|
||||
|
||||
public function setRelativePath($relativePath)
|
||||
{
|
||||
$this->relativePath = $relativePath;
|
||||
}
|
||||
|
||||
public function setRelativePathname($relativePathname)
|
||||
{
|
||||
$this->relativePathname = $relativePathname;
|
||||
}
|
||||
|
||||
public function getRelativePath()
|
||||
{
|
||||
return $this->relativePath;
|
||||
}
|
||||
|
||||
public function getRelativePathname()
|
||||
{
|
||||
return $this->relativePathname;
|
||||
}
|
||||
}
|
67
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/MultiplePcreFilterIteratorTest.php
vendored
Normal file
67
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/MultiplePcreFilterIteratorTest.php
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\MultiplePcreFilterIterator;
|
||||
|
||||
class MultiplePcreFilterIteratorTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getIsRegexFixtures
|
||||
*/
|
||||
public function testIsRegex($string, $isRegex, $message)
|
||||
{
|
||||
$testIterator = new TestMultiplePcreFilterIterator();
|
||||
$this->assertEquals($isRegex, $testIterator->isRegex($string), $message);
|
||||
}
|
||||
|
||||
public function getIsRegexFixtures()
|
||||
{
|
||||
return array(
|
||||
array('foo', false, 'string'),
|
||||
array(' foo ', false, '" " is not a valid delimiter'),
|
||||
array('\\foo\\', false, '"\\" is not a valid delimiter'),
|
||||
array('afooa', false, '"a" is not a valid delimiter'),
|
||||
array('//', false, 'the pattern should contain at least 1 character'),
|
||||
array('/a/', true, 'valid regex'),
|
||||
array('/foo/', true, 'valid regex'),
|
||||
array('/foo/i', true, 'valid regex with a single modifier'),
|
||||
array('/foo/imsxu', true, 'valid regex with multiple modifiers'),
|
||||
array('#foo#', true, '"#" is a valid delimiter'),
|
||||
array('{foo}', true, '"{,}" is a valid delimiter pair'),
|
||||
array('*foo.*', false, '"*" is not considered as a valid delimiter'),
|
||||
array('?foo.?', false, '"?" is not considered as a valid delimiter'),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class TestMultiplePcreFilterIterator extends MultiplePcreFilterIterator
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
public function accept()
|
||||
{
|
||||
throw new \BadFunctionCallException('Not implemented');
|
||||
}
|
||||
|
||||
public function isRegex($str)
|
||||
{
|
||||
return parent::isRegex($str);
|
||||
}
|
||||
|
||||
public function toRegex($str)
|
||||
{
|
||||
throw new \BadFunctionCallException('Not implemented');
|
||||
}
|
||||
}
|
85
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/PathFilterIteratorTest.php
vendored
Normal file
85
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/PathFilterIteratorTest.php
vendored
Normal file
@@ -0,0 +1,85 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\PathFilterIterator;
|
||||
|
||||
class PathFilterIteratorTest extends IteratorTestCase
|
||||
{
|
||||
|
||||
/**
|
||||
* @dataProvider getTestFilterData
|
||||
*/
|
||||
public function testFilter(\Iterator $inner, array $matchPatterns, array $noMatchPatterns, array $resultArray)
|
||||
{
|
||||
$iterator = new PathFilterIterator($inner, $matchPatterns, $noMatchPatterns);
|
||||
$this->assertIterator($resultArray, $iterator);
|
||||
}
|
||||
|
||||
public function getTestFilterData()
|
||||
{
|
||||
$inner = new MockFileListIterator();
|
||||
|
||||
//PATH: A/B/C/abc.dat
|
||||
$inner[] = new MockSplFileInfo(array(
|
||||
'name' => 'abc.dat',
|
||||
'relativePathname' => 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat',
|
||||
));
|
||||
|
||||
//PATH: A/B/ab.dat
|
||||
$inner[] = new MockSplFileInfo(array(
|
||||
'name' => 'ab.dat',
|
||||
'relativePathname' => 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'ab.dat',
|
||||
));
|
||||
|
||||
//PATH: A/a.dat
|
||||
$inner[] = new MockSplFileInfo(array(
|
||||
'name' => 'a.dat',
|
||||
'relativePathname' => 'A'.DIRECTORY_SEPARATOR.'a.dat',
|
||||
));
|
||||
|
||||
//PATH: copy/A/B/C/abc.dat.copy
|
||||
$inner[] = new MockSplFileInfo(array(
|
||||
'name' => 'abc.dat.copy',
|
||||
'relativePathname' => 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat',
|
||||
));
|
||||
|
||||
//PATH: copy/A/B/ab.dat.copy
|
||||
$inner[] = new MockSplFileInfo(array(
|
||||
'name' => 'ab.dat.copy',
|
||||
'relativePathname' => 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'ab.dat',
|
||||
));
|
||||
|
||||
//PATH: copy/A/a.dat.copy
|
||||
$inner[] = new MockSplFileInfo(array(
|
||||
'name' => 'a.dat.copy',
|
||||
'relativePathname' => 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'a.dat',
|
||||
));
|
||||
|
||||
return array(
|
||||
array($inner, array('/^A/'), array(), array('abc.dat', 'ab.dat', 'a.dat')),
|
||||
array($inner, array('/^A\/B/'), array(), array('abc.dat', 'ab.dat')),
|
||||
array($inner, array('/^A\/B\/C/'), array(), array('abc.dat')),
|
||||
array($inner, array('/A\/B\/C/'), array(), array('abc.dat', 'abc.dat.copy')),
|
||||
|
||||
array($inner, array('A'), array(), array('abc.dat', 'ab.dat', 'a.dat', 'abc.dat.copy', 'ab.dat.copy', 'a.dat.copy')),
|
||||
array($inner, array('A/B'), array(), array('abc.dat', 'ab.dat', 'abc.dat.copy', 'ab.dat.copy')),
|
||||
array($inner, array('A/B/C'), array(), array('abc.dat', 'abc.dat.copy')),
|
||||
|
||||
array($inner, array('copy/A'), array(), array('abc.dat.copy', 'ab.dat.copy', 'a.dat.copy')),
|
||||
array($inner, array('copy/A/B'), array(), array('abc.dat.copy', 'ab.dat.copy')),
|
||||
array($inner, array('copy/A/B/C'), array(), array('abc.dat.copy')),
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
}
|
107
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/RealIteratorTestCase.php
vendored
Normal file
107
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/RealIteratorTestCase.php
vendored
Normal file
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
abstract class RealIteratorTestCase extends IteratorTestCase
|
||||
{
|
||||
|
||||
protected static $tmpDir;
|
||||
protected static $files;
|
||||
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
self::$tmpDir = realpath(sys_get_temp_dir()).DIRECTORY_SEPARATOR.'symfony2_finder';
|
||||
|
||||
self::$files = array(
|
||||
'.git/',
|
||||
'.foo/',
|
||||
'.foo/.bar',
|
||||
'.foo/bar',
|
||||
'.bar',
|
||||
'test.py',
|
||||
'foo/',
|
||||
'foo/bar.tmp',
|
||||
'test.php',
|
||||
'toto/',
|
||||
'foo bar'
|
||||
);
|
||||
|
||||
self::$files = self::toAbsolute(self::$files);
|
||||
|
||||
if (is_dir(self::$tmpDir)) {
|
||||
self::tearDownAfterClass();
|
||||
} else {
|
||||
mkdir(self::$tmpDir);
|
||||
}
|
||||
|
||||
foreach (self::$files as $file) {
|
||||
if (DIRECTORY_SEPARATOR === $file[strlen($file) - 1]) {
|
||||
mkdir($file);
|
||||
} else {
|
||||
touch($file);
|
||||
}
|
||||
}
|
||||
|
||||
file_put_contents(self::toAbsolute('test.php'), str_repeat(' ', 800));
|
||||
file_put_contents(self::toAbsolute('test.py'), str_repeat(' ', 2000));
|
||||
|
||||
touch(self::toAbsolute('foo/bar.tmp'), strtotime('2005-10-15'));
|
||||
touch(self::toAbsolute('test.php'), strtotime('2005-10-15'));
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass()
|
||||
{
|
||||
foreach (array_reverse(self::$files) as $file) {
|
||||
if (DIRECTORY_SEPARATOR === $file[strlen($file) - 1]) {
|
||||
@rmdir($file);
|
||||
} else {
|
||||
@unlink($file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected static function toAbsolute($files = null)
|
||||
{
|
||||
/*
|
||||
* Without the call to setUpBeforeClass() property can be null.
|
||||
*/
|
||||
if (!self::$tmpDir) {
|
||||
self::$tmpDir = realpath(sys_get_temp_dir()).DIRECTORY_SEPARATOR.'symfony2_finder';
|
||||
}
|
||||
|
||||
if (is_array($files)) {
|
||||
$f = array();
|
||||
foreach ($files as $file) {
|
||||
$f[] = self::$tmpDir.DIRECTORY_SEPARATOR.str_replace('/', DIRECTORY_SEPARATOR, $file);
|
||||
}
|
||||
|
||||
return $f;
|
||||
}
|
||||
|
||||
if (is_string($files)) {
|
||||
return self::$tmpDir.DIRECTORY_SEPARATOR.str_replace('/', DIRECTORY_SEPARATOR, $files);
|
||||
}
|
||||
|
||||
return self::$tmpDir;
|
||||
}
|
||||
|
||||
protected static function toAbsoluteFixtures($files)
|
||||
{
|
||||
$f = array();
|
||||
foreach ($files as $file) {
|
||||
$f[] = realpath(__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.$file);
|
||||
}
|
||||
|
||||
return $f;
|
||||
}
|
||||
|
||||
}
|
83
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/RecursiveDirectoryIteratorTest.php
vendored
Normal file
83
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/RecursiveDirectoryIteratorTest.php
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator;
|
||||
|
||||
class RecursiveDirectoryIteratorTest extends IteratorTestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getPaths
|
||||
*
|
||||
* @param string $path
|
||||
* @param Boolean $seekable
|
||||
* @param Boolean $supports
|
||||
* @param string $message
|
||||
*/
|
||||
public function testRewind($path, $seekable, $contains, $message = null)
|
||||
{
|
||||
try {
|
||||
$i = new RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS);
|
||||
} catch (\UnexpectedValueException $e) {
|
||||
$this->markTestSkipped(sprintf('Unsupported stream "%s".', $path));
|
||||
}
|
||||
|
||||
$i->rewind();
|
||||
|
||||
$this->assertTrue(true, $message);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getPaths
|
||||
*
|
||||
* @param string $path
|
||||
* @param Boolean $seekable
|
||||
* @param Boolean $supports
|
||||
* @param string $message
|
||||
*/
|
||||
public function testSeek($path, $seekable, $contains, $message = null)
|
||||
{
|
||||
try {
|
||||
$i = new RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::SKIP_DOTS);
|
||||
} catch (\UnexpectedValueException $e) {
|
||||
$this->markTestSkipped(sprintf('Unsupported stream "%s".', $path));
|
||||
}
|
||||
|
||||
$actual = array();
|
||||
|
||||
$i->seek(0);
|
||||
$actual[] = $i->getPathname();
|
||||
|
||||
$i->seek(1);
|
||||
$actual[] = $i->getPathname();
|
||||
|
||||
$i->seek(2);
|
||||
$actual[] = $i->getPathname();
|
||||
|
||||
$this->assertEquals($contains, $actual);
|
||||
}
|
||||
|
||||
public function getPaths()
|
||||
{
|
||||
$data = array();
|
||||
|
||||
// ftp
|
||||
$contains = array(
|
||||
'ftp://ftp.mozilla.org'.DIRECTORY_SEPARATOR.'README',
|
||||
'ftp://ftp.mozilla.org'.DIRECTORY_SEPARATOR.'index.html',
|
||||
'ftp://ftp.mozilla.org'.DIRECTORY_SEPARATOR.'pub',
|
||||
);
|
||||
$data[] = array('ftp://ftp.mozilla.org/', false, $contains);
|
||||
|
||||
return $data;
|
||||
}
|
||||
}
|
68
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/SizeRangeFilterIteratorTest.php
vendored
Normal file
68
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/SizeRangeFilterIteratorTest.php
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\SizeRangeFilterIterator;
|
||||
use Symfony\Component\Finder\Comparator\NumberComparator;
|
||||
|
||||
class SizeRangeFilterIteratorTest extends RealIteratorTestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider getAcceptData
|
||||
*/
|
||||
public function testAccept($size, $expected)
|
||||
{
|
||||
$inner = new InnerSizeIterator(self::$files);
|
||||
|
||||
$iterator = new SizeRangeFilterIterator($inner, $size);
|
||||
|
||||
$this->assertIterator($expected, $iterator);
|
||||
}
|
||||
|
||||
public function getAcceptData()
|
||||
{
|
||||
$lessThan1KGreaterThan05K = array(
|
||||
'.foo',
|
||||
'.git',
|
||||
'foo',
|
||||
'test.php',
|
||||
'toto',
|
||||
);
|
||||
|
||||
return array(
|
||||
array(array(new NumberComparator('< 1K'), new NumberComparator('> 0.5K')), $this->toAbsolute($lessThan1KGreaterThan05K)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class InnerSizeIterator extends \ArrayIterator
|
||||
{
|
||||
public function current()
|
||||
{
|
||||
return new \SplFileInfo(parent::current());
|
||||
}
|
||||
|
||||
public function getFilename()
|
||||
{
|
||||
return parent::current();
|
||||
}
|
||||
|
||||
public function isFile()
|
||||
{
|
||||
return $this->current()->isFile();
|
||||
}
|
||||
|
||||
public function getSize()
|
||||
{
|
||||
return $this->current()->getSize();
|
||||
}
|
||||
}
|
91
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/SortableIteratorTest.php
vendored
Normal file
91
vendor/symfony/finder/Symfony/Component/Finder/Tests/Iterator/SortableIteratorTest.php
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
||||
|
||||
use Symfony\Component\Finder\Iterator\SortableIterator;
|
||||
|
||||
class SortableIteratorTest extends RealIteratorTestCase
|
||||
{
|
||||
public function testConstructor()
|
||||
{
|
||||
try {
|
||||
new SortableIterator(new Iterator(array()), 'foobar');
|
||||
$this->fail('__construct() throws an \InvalidArgumentException exception if the mode is not valid');
|
||||
} catch (\Exception $e) {
|
||||
$this->assertInstanceOf('InvalidArgumentException', $e, '__construct() throws an \InvalidArgumentException exception if the mode is not valid');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getAcceptData
|
||||
*/
|
||||
public function testAccept($mode, $expected)
|
||||
{
|
||||
$inner = new Iterator(self::$files);
|
||||
|
||||
$iterator = new SortableIterator($inner, $mode);
|
||||
|
||||
$this->assertOrderedIterator($expected, $iterator);
|
||||
}
|
||||
|
||||
public function getAcceptData()
|
||||
{
|
||||
|
||||
$sortByName = array(
|
||||
'.bar',
|
||||
'.foo',
|
||||
'.foo/.bar',
|
||||
'.foo/bar',
|
||||
'.git',
|
||||
'foo',
|
||||
'foo bar',
|
||||
'foo/bar.tmp',
|
||||
'test.php',
|
||||
'test.py',
|
||||
'toto',
|
||||
);
|
||||
|
||||
$sortByType = array(
|
||||
'.foo',
|
||||
'.git',
|
||||
'foo',
|
||||
'toto',
|
||||
'.bar',
|
||||
'.foo/.bar',
|
||||
'.foo/bar',
|
||||
'foo bar',
|
||||
'foo/bar.tmp',
|
||||
'test.php',
|
||||
'test.py',
|
||||
);
|
||||
|
||||
$customComparison = array(
|
||||
'.bar',
|
||||
'.foo',
|
||||
'.foo/.bar',
|
||||
'.foo/bar',
|
||||
'.git',
|
||||
'foo',
|
||||
'foo bar',
|
||||
'foo/bar.tmp',
|
||||
'test.php',
|
||||
'test.py',
|
||||
'toto',
|
||||
);
|
||||
|
||||
return array(
|
||||
array(SortableIterator::SORT_BY_NAME, $this->toAbsolute($sortByName)),
|
||||
array(SortableIterator::SORT_BY_TYPE, $this->toAbsolute($sortByType)),
|
||||
array(function (\SplFileInfo $a, \SplFileInfo $b) { return strcmp($a->getRealpath(), $b->getRealpath()); }, $this->toAbsolute($customComparison)),
|
||||
);
|
||||
}
|
||||
}
|
31
vendor/symfony/finder/Symfony/Component/Finder/composer.json
vendored
Normal file
31
vendor/symfony/finder/Symfony/Component/Finder/composer.json
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"name": "symfony/finder",
|
||||
"type": "library",
|
||||
"description": "Symfony Finder Component",
|
||||
"keywords": [],
|
||||
"homepage": "http://symfony.com",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Fabien Potencier",
|
||||
"email": "fabien@symfony.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "http://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-0": { "Symfony\\Component\\Finder\\": "" }
|
||||
},
|
||||
"target-dir": "Symfony/Component/Finder",
|
||||
"minimum-stability": "dev",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.3-dev"
|
||||
}
|
||||
}
|
||||
}
|
29
vendor/symfony/finder/Symfony/Component/Finder/phpunit.xml.dist
vendored
Normal file
29
vendor/symfony/finder/Symfony/Component/Finder/phpunit.xml.dist
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<phpunit backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false"
|
||||
syntaxCheck="false"
|
||||
bootstrap="vendor/autoload.php"
|
||||
>
|
||||
<testsuites>
|
||||
<testsuite name="Symfony Finder Component Test Suite">
|
||||
<directory>./Tests/</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
|
||||
<filter>
|
||||
<whitelist>
|
||||
<directory>./</directory>
|
||||
<exclude>
|
||||
<directory>./Tests</directory>
|
||||
<directory>./vendor</directory>
|
||||
</exclude>
|
||||
</whitelist>
|
||||
</filter>
|
||||
</phpunit>
|
Reference in New Issue
Block a user