[feature/extension-manager] Add filename prefix matching in extension finder

PHPBB3-10323
This commit is contained in:
Nils Adermann 2011-08-22 02:17:00 -04:00
parent 60ad0e21b5
commit f6632fcfd0
2 changed files with 62 additions and 5 deletions

View file

@ -50,8 +50,10 @@ class phpbb_extension_finder
$this->query = array( $this->query = array(
'default_path' => false, 'default_path' => false,
'default_suffix' => false, 'default_suffix' => false,
'default_prefix' => false,
'default_directory' => false, 'default_directory' => false,
'suffix' => false, 'suffix' => false,
'prefix' => false,
'directory' => false, 'directory' => false,
); );
@ -76,7 +78,7 @@ class phpbb_extension_finder
* Automatically sets the default_suffix if its value does not differ from * Automatically sets the default_suffix if its value does not differ from
* the current suffix. * the current suffix.
* *
* @param string $default_path A filename suffix * @param string $suffix A filename suffix
* @return phpbb_extension_finder This object for chaining calls * @return phpbb_extension_finder This object for chaining calls
*/ */
public function suffix($suffix) public function suffix($suffix)
@ -102,6 +104,38 @@ class phpbb_extension_finder
return $this; return $this;
} }
/**
* Sets a prefix all files found in extensions must match
*
* Automatically sets the default_prefix if its value does not differ from
* the current prefix.
*
* @param string $prefix A filename prefix
* @return phpbb_extension_finder This object for chaining calls
*/
public function prefix($prefix)
{
if ($this->query['default_prefix'] === $this->query['prefix'])
{
$this->query['default_prefix'] = $prefix;
}
$this->query['prefix'] = $prefix;
return $this;
}
/**
* Sets a prefix all files found in the default path must match
*
* @param string $default_prefix A filename prefix
* @return phpbb_extension_finder This object for chaining calls
*/
public function default_prefix($default_prefix)
{
$this->query['default_prefix'] = $default_prefix;
return $this;
}
/** /**
* Sets a directory all files found in extensions must be contained in * Sets a directory all files found in extensions must be contained in
* *
@ -202,16 +236,18 @@ class phpbb_extension_finder
if ($name === '/') if ($name === '/')
{ {
$prefix = $this->query['default_path']; $location = $this->query['default_path'];
$name = ''; $name = '';
$suffix = $this->query['default_suffix']; $suffix = $this->query['default_suffix'];
$prefix = $this->query['default_prefix'];
$directory = $this->query['default_directory']; $directory = $this->query['default_directory'];
} }
else else
{ {
$prefix = 'ext/'; $location = 'ext/';
$name .= '/'; $name .= '/';
$suffix = $this->query['suffix']; $suffix = $this->query['suffix'];
$prefix = $this->query['prefix'];
$directory = $this->query['directory']; $directory = $this->query['directory'];
} }
@ -226,10 +262,11 @@ class phpbb_extension_finder
{ {
$relative_path = $iterator->getInnerIterator()->getSubPathname(); $relative_path = $iterator->getInnerIterator()->getSubPathname();
if ((!$suffix || substr($relative_path, -strlen($suffix)) == $suffix) && if ((!$suffix || substr($relative_path, -strlen($suffix)) === $suffix) &&
(!$prefix || substr($file_info->getFilename(), 0, strlen($prefix)) === $prefix) &&
(!$directory || preg_match($directory_pattern, DIRECTORY_SEPARATOR . $relative_path))) (!$directory || preg_match($directory_pattern, DIRECTORY_SEPARATOR . $relative_path)))
{ {
$files[] = str_replace(DIRECTORY_SEPARATOR, '/', $prefix . $name . $relative_path); $files[] = str_replace(DIRECTORY_SEPARATOR, '/', $location . $name . $relative_path);
} }
} }
} }

View file

@ -55,6 +55,24 @@ class phpbb_extension_finder_test extends phpbb_test_case
); );
} }
public function test_prefix_get_classes()
{
$classes = $this->finder
->default_path('includes/default/')
->prefix('hidden_')
->default_prefix('')
->get_classes();
sort($classes);
$this->assertEquals(
array(
'phpbb_default_implementation',
'phpbb_ext_bar_my_hidden_class',
),
$classes
);
}
public function test_directory_get_classes() public function test_directory_get_classes()
{ {
$classes = $this->finder $classes = $this->finder
@ -109,8 +127,10 @@ class phpbb_extension_finder_test extends phpbb_test_case
$query = array( $query = array(
'default_path' => 'includes/foo', 'default_path' => 'includes/foo',
'default_suffix' => false, 'default_suffix' => false,
'default_prefix' => false,
'default_directory' => 'bar', 'default_directory' => 'bar',
'suffix' => false, 'suffix' => false,
'prefix' => false,
'directory' => false, 'directory' => false,
); );