* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Filter for blacklisting and whitelisting of code coverage information. * * @since Class available since Release 1.0.0 */ class PHP_CodeCoverage_Filter { /** * Source files that are blacklisted. * * @var array */ private $blacklistedFiles = array(); /** * Source files that are whitelisted. * * @var array */ private $whitelistedFiles = array(); /** * Adds a directory to the blacklist (recursively). * * @param string $directory * @param string $suffix * @param string $prefix */ public function addDirectoryToBlacklist($directory, $suffix = '.php', $prefix = '') { $facade = new File_Iterator_Facade; $files = $facade->getFilesAsArray($directory, $suffix, $prefix); foreach ($files as $file) { $this->addFileToBlacklist($file); } } /** * Adds a file to the blacklist. * * @param string $filename */ public function addFileToBlacklist($filename) { $this->blacklistedFiles[realpath($filename)] = true; } /** * Adds files to the blacklist. * * @param array $files */ public function addFilesToBlacklist(array $files) { foreach ($files as $file) { $this->addFileToBlacklist($file); } } /** * Removes a directory from the blacklist (recursively). * * @param string $directory * @param string $suffix * @param string $prefix */ public function removeDirectoryFromBlacklist($directory, $suffix = '.php', $prefix = '') { $facade = new File_Iterator_Facade; $files = $facade->getFilesAsArray($directory, $suffix, $prefix); foreach ($files as $file) { $this->removeFileFromBlacklist($file); } } /** * Removes a file from the blacklist. * * @param string $filename */ public function removeFileFromBlacklist($filename) { $filename = realpath($filename); if (isset($this->blacklistedFiles[$filename])) { unset($this->blacklistedFiles[$filename]); } } /** * Adds a directory to the whitelist (recursively). * * @param string $directory * @param string $suffix * @param string $prefix */ public function addDirectoryToWhitelist($directory, $suffix = '.php', $prefix = '') { $facade = new File_Iterator_Facade; $files = $facade->getFilesAsArray($directory, $suffix, $prefix); foreach ($files as $file) { $this->addFileToWhitelist($file); } } /** * Adds a file to the whitelist. * * @param string $filename */ public function addFileToWhitelist($filename) { $this->whitelistedFiles[realpath($filename)] = true; } /** * Adds files to the whitelist. * * @param array $files */ public function addFilesToWhitelist(array $files) { foreach ($files as $file) { $this->addFileToWhitelist($file); } } /** * Removes a directory from the whitelist (recursively). * * @param string $directory * @param string $suffix * @param string $prefix */ public function removeDirectoryFromWhitelist($directory, $suffix = '.php', $prefix = '') { $facade = new File_Iterator_Facade; $files = $facade->getFilesAsArray($directory, $suffix, $prefix); foreach ($files as $file) { $this->removeFileFromWhitelist($file); } } /** * Removes a file from the whitelist. * * @param string $filename */ public function removeFileFromWhitelist($filename) { $filename = realpath($filename); if (isset($this->whitelistedFiles[$filename])) { unset($this->whitelistedFiles[$filename]); } } /** * Checks whether a filename is a real filename. * * @param string $filename * @return bool */ public function isFile($filename) { if ($filename == '-' || strpos($filename, 'vfs://') === 0 || strpos($filename, 'xdebug://debug-eval') !== false || strpos($filename, 'eval()\'d code') !== false || strpos($filename, 'runtime-created function') !== false || strpos($filename, 'runkit created function') !== false || strpos($filename, 'assert code') !== false || strpos($filename, 'regexp code') !== false) { return false; } return file_exists($filename); } /** * Checks whether or not a file is filtered. * * When the whitelist is empty (default), blacklisting is used. * When the whitelist is not empty, whitelisting is used. * * @param string $filename * @return bool * @throws PHP_CodeCoverage_Exception */ public function isFiltered($filename) { if (!$this->isFile($filename)) { return true; } $filename = realpath($filename); if (!empty($this->whitelistedFiles)) { return !isset($this->whitelistedFiles[$filename]); } return isset($this->blacklistedFiles[$filename]); } /** * Returns the list of blacklisted files. * * @return array */ public function getBlacklist() { return array_keys($this->blacklistedFiles); } /** * Returns the list of whitelisted files. * * @return array */ public function getWhitelist() { return array_keys($this->whitelistedFiles); } /** * Returns whether this filter has a whitelist. * * @return bool * @since Method available since Release 1.1.0 */ public function hasWhitelist() { return !empty($this->whitelistedFiles); } /** * Returns the blacklisted files. * * @return array * @since Method available since Release 2.0.0 */ public function getBlacklistedFiles() { return $this->blacklistedFiles; } /** * Sets the blacklisted files. * * @param array $blacklistedFiles * @since Method available since Release 2.0.0 */ public function setBlacklistedFiles($blacklistedFiles) { $this->blacklistedFiles = $blacklistedFiles; } /** * Returns the whitelisted files. * * @return array * @since Method available since Release 2.0.0 */ public function getWhitelistedFiles() { return $this->whitelistedFiles; } /** * Sets the whitelisted files. * * @param array $whitelistedFiles * @since Method available since Release 2.0.0 */ public function setWhitelistedFiles($whitelistedFiles) { $this->whitelistedFiles = $whitelistedFiles; } }