Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 88

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 218

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 219

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 220
PK!4˵Shell/Shell.phpnu[ * * 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 */ 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; } } PK!5KShell/Command.phpnu[ * * 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 */ class Command { /** * @var Command|null */ private $parent; /** * @var array */ private $bits = array(); /** * @var array */ private $labels = array(); /** * @var \Closure|null */ private $errorHandler; /** * Constructor. * * @param Command|null $parent Parent command */ public function __construct(Command $parent = null) { $this->parent = $parent; } /** * Returns command as string. * * @return string */ public function __toString() { return $this->join(); } /** * Creates a new Command instance. * * @param Command|null $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 \Closure|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; } } PK!59SplFileInfo.phpnu[ * * 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 */ 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; } } PK!%uMPPautoloader.phpnu[ * * 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 */ 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; } } PK!7 Exception/ExceptionInterface.phpnu[ * * 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 */ interface ExceptionInterface { /** * @return \Symfony\Component\Finder\Adapter\AdapterInterface */ public function getAdapter(); } PK!cWޫ#Exception/AccessDeniedException.phpnu[ * * 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 */ class AccessDeniedException extends \UnexpectedValueException { } PK!>@%Exception/AdapterFailureException.phpnu[ * * 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 */ 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; } } PK!P+Exception/OperationNotPermitedException.phpnu[ * * 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 */ class OperationNotPermitedException extends AdapterFailureException { } PK! Comparator/DateComparator.phpnu[ * * 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 */ 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); } } PK!|Fz  Comparator/Comparator.phpnu[ * * 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 */ 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; } } PK!P  Comparator/NumberComparator.phpnu[ * * 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 PHP port * @author Richard Clamp Perl version * * @copyright 2004-2005 Fabien Potencier * @copyright 2002 Richard Clamp * * @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] : '=='); } } PK!g@Mb b Glob.phpnu[ * * 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 PHP port * @author Richard Clamp Perl version * @copyright 2004-2005 Fabien Potencier * @copyright 2002 Richard Clamp */ 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.'$#'; } } PK!dVV Finder.phpnu[ * * 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 * * @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); } } PK!ils_%Iterator/DepthRangeFilterIterator.phpnu[ * * 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 */ 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; } } PK!ɔ Iterator/FilePathsIterator.phpnu[ * * 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 */ 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); } } PK!,GIterator/FilterIterator.phpnu[ * * 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(); } } PK!ʽ&Iterator/FilecontentFilterIterator.phpnu[ * * 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 * @author Włodzimierz Gajda */ 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, '/').'/'; } } PK! 'Iterator/MultiplePcreFilterIterator.phpnu[ * * 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 */ abstract class MultiplePcreFilterIterator extends FilterIterator { protected $matchRegexps = array(); protected $noMatchRegexps = array(); /** * 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) { foreach ($matchPatterns as $pattern) { $this->matchRegexps[] = $this->toRegex($pattern); } 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); } PK!z"!Iterator/CustomFilterIterator.phpnu[ * * 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 */ 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; } } PK!{^ǽ#Iterator/FilenameFilterIterator.phpnu[ * * 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 */ 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(); } } PK!d+Iterator/ExcludeDirectoryFilterIterator.phpnu[ * * 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 */ class ExcludeDirectoryFilterIterator extends FilterIterator { private $patterns = array(); /** * Constructor. * * @param \Iterator $iterator The Iterator to filter * @param array $directories An array of directories to exclude */ public function __construct(\Iterator $iterator, array $directories) { 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; } } PK!xP$Iterator/SizeRangeFilterIterator.phpnu[ * * 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 */ 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; } } PK! U$Iterator/DateRangeFilterIterator.phpnu[ * * 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 */ 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; } } PK!n bb#Iterator/FileTypeFilterIterator.phpnu[ * * 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 */ 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; } } PK!j Iterator/SortableIterator.phpnu[ * * 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 */ 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); } } PK!)Iterator/PathFilterIterator.phpnu[ * * 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 * @author Włodzimierz Gajda */ 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, '/').'/'; } } PK!6s 'Iterator/RecursiveDirectoryIterator.phpnu[ * * 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 */ 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; } } PK! & & Expression/Expression.phpnu[ * * 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 */ 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 can\'t be transformed to glob.'); } return $this->value; } /** * @return Regex */ public function getRegex() { return self::TYPE_REGEX === $this->value->getType() ? $this->value : $this->value->toRegex(); } } PK!"HHExpression/ValueInterface.phpnu[ * * 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 */ 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); } PK!EExpression/Glob.phpnu[ * * 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 */ 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.'$'); } } PK!(Expression/Regex.phpnu[ * * 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 */ 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 === '}') || ($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; } } PK!9!2{ { Adapter/PhpAdapter.phpnu[ * * 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 */ 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; } } PK! Adapter/AdapterInterface.phpnu[ * * 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 */ 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(); } PK!kA Adapter/BsdFindAdapter.phpnu[ * * 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 */ 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('{}') ; } } } PK!}] Adapter/GnuFindAdapter.phpnu[ * * 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 */ 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('{}') ; } } } PK!QJ))Adapter/AbstractFindAdapter.phpnu[ * * 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 */ 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); } PK! Adapter/AbstractAdapter.phpnu[ * * 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 */ 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(); } PK!!Tests/Fixtures/with space/foo.txtnu[PK!Tests/Fixtures/A/B/C/abc.datnu[PK!Tests/Fixtures/A/B/ab.datnu[PK!Tests/Fixtures/A/a.datnu[PK!Tests/Fixtures/one/anu[PK!Tests/Fixtures/one/b/d.neonnu[PK!Tests/Fixtures/one/b/c.neonnu[PK!o5|Tests/Fixtures/dolor.txtnu[dolor sit amet DOLOR SIT AMETPK!'))Tests/Fixtures/ipsum.txtnu[ipsum dolor sit amet IPSUM DOLOR SIT AMETPK!55Tests/Fixtures/lorem.txtnu[lorem ipsum dolor sit amet LOREM IPSUM DOLOR SIT AMETPK! Tests/Fixtures/copy/A/a.dat.copynu[PK!&Tests/Fixtures/copy/A/B/C/abc.dat.copynu[PK!#Tests/Fixtures/copy/A/B/ab.dat.copynu[PK!˟ׄ 'Tests/Comparator/DateComparatorTest.phpnu[ * * 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'))), ); } } PK!W.//)Tests/Comparator/NumberComparatorTest.phpnu[ * * 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', ) ), ); } } PK!Ŗ#Tests/Comparator/ComparatorTest.phpnu[ * * 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')), ); } } PK!6GmwmwTests/FinderTest.phpnu[ * * 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; 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->assertCount(1, $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->assertInstanceOf('Symfony\\Component\\Finder\\Exception\\AccessDeniedException', $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 invalid 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); } } PK!+드4 4 'Tests/Iterator/RealIteratorTestCase.phpnu[ * * 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; } } PK!:@ (Tests/Iterator/FilePathsIteratorTest.phpnu[ * * 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' ), ), ); } } PK!qbe 0Tests/Iterator/FilecontentFilterIteratorTest.phpnu[ * * 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; 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')), ); } } PK!YbkMM-Tests/Iterator/FileTypeFilterIteratorTest.phpnu[ * * 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(); } } PK!Ŋ1Tests/Iterator/RecursiveDirectoryIteratorTest.phpnu[ * * 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 array $contains * @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 array $contains * @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; } } PK!4/aa5Tests/Iterator/ExcludeDirectoryFilterIteratorTest.phpnu[ * * 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)), ); } } PK!nI )Tests/Iterator/PathFilterIteratorTest.phpnu[ * * 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')), ); } } PK!++1Tests/Iterator/MultiplePcreFilterIteratorTest.phpnu[ * * 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'); } } PK!7Wa a 'Tests/Iterator/SortableIteratorTest.phpnu[ * * 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)), ); } } PK!7-Tests/Iterator/FilenameFilterIteratorTest.phpnu[ * * 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(); } } PK!߫+Tests/Iterator/CustomFilterIteratorTest.phpnu[ * * 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()), ); } } PK!o "Tests/Iterator/MockSplFileInfo.phpnu[ * * 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; } } PK!Zo*))/Tests/Iterator/DepthRangeFilterIteratorTest.phpnu[ * * 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)), ); } } PK!STests/Iterator/Iterator.phpnu[ * * 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 = array(); public function __construct(array $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); } } PK!F.Tests/Iterator/SizeRangeFilterIteratorTest.phpnu[ * * 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(); } } PK!-66%Tests/Iterator/FilterIteratorTest.phpnu[ * * 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); } } PK!{)\o o #Tests/Iterator/IteratorTestCase.phpnu[ * * 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)); } } PK![+(('Tests/Iterator/MockFileListIterator.phpnu[ * * 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); } } PK!(g==.Tests/Iterator/DateRangeFilterIteratorTest.phpnu[ * * 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)), ); } } PK!|ߐ#Tests/Expression/ExpressionTest.phpnu[ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Finder\Tests\Expression; 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'), ); } } PK!9]Tests/Expression/RegexTest.phpnu[ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Finder\Tests\Expression; 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'), ); } } PK!7uttTests/Expression/GlobTest.phpnu[ * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Finder\Tests\Expression; 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')), ); } } PK!`2"Tests/FakeAdapter/NamedAdapter.phpnu[ * * 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 */ 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; } } PK!I"Tests/FakeAdapter/DummyAdapter.phpnu[ * * 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 */ 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; } } PK!/00(Tests/FakeAdapter/UnsupportedAdapter.phpnu[ * * 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 */ 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; } } PK!mm$Tests/FakeAdapter/FailingAdapter.phpnu[ * * 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 */ 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; } } PK!55phpunit.xml.distnu[ ./Tests/ ./ ./Tests ./vendor PK!4˵Shell/Shell.phpnu[PK!5KShell/Command.phpnu[PK!59 SplFileInfo.phpnu[PK!%uMPP'autoloader.phpnu[PK!99*r)Exception/ShellCommandFailureException.phpnu[PK!7 .Exception/ExceptionInterface.phpnu[PK!cWޫ#D0Exception/AccessDeniedException.phpnu[PK!>@%B2Exception/AdapterFailureException.phpnu[PK!P+7Exception/OperationNotPermitedException.phpnu[PK! 9Comparator/DateComparator.phpnu[PK!|Fz  ?Comparator/Comparator.phpnu[PK!P  oGComparator/NumberComparator.phpnu[PK!g@Mb b QGlob.phpnu[PK!dVV w^Finder.phpnu[PK!ils_%Iterator/DepthRangeFilterIterator.phpnu[PK!ɔ պIterator/FilePathsIterator.phpnu[PK!,GIterator/FilterIterator.phpnu[PK!ʽ&Iterator/FilecontentFilterIterator.phpnu[PK! 'Iterator/MultiplePcreFilterIterator.phpnu[PK!z"!Iterator/CustomFilterIterator.phpnu[PK!{^ǽ#1Iterator/FilenameFilterIterator.phpnu[PK!d+AIterator/ExcludeDirectoryFilterIterator.phpnu[PK!xP$8Iterator/SizeRangeFilterIterator.phpnu[PK! U$1Iterator/DateRangeFilterIterator.phpnu[PK!n bb#:Iterator/FileTypeFilterIterator.phpnu[PK!j Iterator/SortableIterator.phpnu[PK!)- Iterator/PathFilterIterator.phpnu[PK!6s '$Iterator/RecursiveDirectoryIterator.phpnu[PK! & & bExpression/Expression.phpnu[PK!"HH(Expression/ValueInterface.phpnu[PK!Ef-Expression/Glob.phpnu[PK!(;Expression/Regex.phpnu[PK!9!2{ { TAdapter/PhpAdapter.phpnu[PK! _Adapter/AdapterInterface.phpnu[PK!kA kAdapter/BsdFindAdapter.phpnu[PK!}] vAdapter/GnuFindAdapter.phpnu[PK!QJ))$Adapter/AbstractFindAdapter.phpnu[PK!  Adapter/AbstractAdapter.phpnu[PK!!\Tests/Fixtures/with space/foo.txtnu[PK!Tests/Fixtures/A/B/C/abc.datnu[PK!Tests/Fixtures/A/B/ab.datnu[PK!BTests/Fixtures/A/a.datnu[PK!Tests/Fixtures/one/anu[PK!Tests/Fixtures/one/b/d.neonnu[PK!Tests/Fixtures/one/b/c.neonnu[PK!o5|bTests/Fixtures/dolor.txtnu[PK!'))Tests/Fixtures/ipsum.txtnu[PK!558Tests/Fixtures/lorem.txtnu[PK! Tests/Fixtures/copy/A/a.dat.copynu[PK!&Tests/Fixtures/copy/A/B/C/abc.dat.copynu[PK!#[Tests/Fixtures/copy/A/B/ab.dat.copynu[PK!˟ׄ 'Tests/Comparator/DateComparatorTest.phpnu[PK!W.//)Tests/Comparator/NumberComparatorTest.phpnu[PK!Ŗ#Tests/Comparator/ComparatorTest.phpnu[PK!6GmwmwTests/FinderTest.phpnu[PK!+드4 4 '[Tests/Iterator/RealIteratorTestCase.phpnu[PK!:@ (6gTests/Iterator/FilePathsIteratorTest.phpnu[PK!qbe 0urTests/Iterator/FilecontentFilterIteratorTest.phpnu[PK!YbkMM-p}Tests/Iterator/FileTypeFilterIteratorTest.phpnu[PK!Ŋ1Tests/Iterator/RecursiveDirectoryIteratorTest.phpnu[PK!4/aa5Tests/Iterator/ExcludeDirectoryFilterIteratorTest.phpnu[PK!nI )˓Tests/Iterator/PathFilterIteratorTest.phpnu[PK!++1Tests/Iterator/MultiplePcreFilterIteratorTest.phpnu[PK!7Wa a 'Tests/Iterator/SortableIteratorTest.phpnu[PK!7-\Tests/Iterator/FilenameFilterIteratorTest.phpnu[PK!߫+Tests/Iterator/CustomFilterIteratorTest.phpnu[PK!o "Tests/Iterator/MockSplFileInfo.phpnu[PK!Zo*))/ Tests/Iterator/DepthRangeFilterIteratorTest.phpnu[PK!STests/Iterator/Iterator.phpnu[PK!F.Tests/Iterator/SizeRangeFilterIteratorTest.phpnu[PK!-66%NTests/Iterator/FilterIteratorTest.phpnu[PK!{)\o o #Tests/Iterator/IteratorTestCase.phpnu[PK![+(('Tests/Iterator/MockFileListIterator.phpnu[PK!(g==.Tests/Iterator/DateRangeFilterIteratorTest.phpnu[PK!|ߐ#Tests/Expression/ExpressionTest.phpnu[PK!9]Tests/Expression/RegexTest.phpnu[PK!7uttTests/Expression/GlobTest.phpnu[PK!`2"HTests/FakeAdapter/NamedAdapter.phpnu[PK!I"tTests/FakeAdapter/DummyAdapter.phpnu[PK!/00(Tests/FakeAdapter/UnsupportedAdapter.phpnu[PK!mm$:#Tests/FakeAdapter/FailingAdapter.phpnu[PK!55&phpunit.xml.distnu[PKRRp*