Autoloader: fix loading app clases located in lib/

This commit is contained in:
Robin Appelman 2013-05-08 00:50:33 +02:00
parent e21a3a1a23
commit 71fc4a2cf4
2 changed files with 23 additions and 15 deletions

View File

@ -78,14 +78,15 @@ class Autoloader {
} elseif (strpos($class, 'OC\\') === 0) {
$paths[] = strtolower(str_replace('\\', '/', substr($class, 3)) . '.php');
} elseif (strpos($class, 'OCP\\') === 0) {
$paths[] = 'public/' . strtolower(str_replace('\\', '/', substr($class, 3)) . '.php');
$paths[] = 'public/' . strtolower(str_replace('\\', '/', substr($class, 4)) . '.php');
} elseif (strpos($class, 'OCA\\') === 0) {
list(, $app, $rest) = explode('\\', $class, 3);
$app = strtolower($app);
foreach (\OC::$APPSROOTS as $appDir) {
list(, $app,) = explode('\\', $class);
if (stream_resolve_include_path($appDir['path'] . '/' . strtolower($app))) {
$paths[] = $appDir['path'] . '/' . strtolower(str_replace('\\', '/', substr($class, 4)) . '.php');
if (stream_resolve_include_path($appDir['path'] . '/' . $app)) {
$paths[] = $appDir['path'] . '/' . $app . '/' . strtolower(str_replace('\\', '/', $rest) . '.php');
// If not found in the root of the app directory, insert '/lib' after app id and try again.
$paths[] = $appDir['path'] . '/lib/' . strtolower(str_replace('\\', '/', substr($class, 4)) . '.php');
$paths[] = $appDir['path'] . '/' . $app . '/lib/' . strtolower(str_replace('\\', '/', $rest) . '.php');
}
}
} elseif (strpos($class, 'Test_') === 0) {

View File

@ -45,23 +45,30 @@ class AutoLoader extends \PHPUnit_Framework_TestCase {
$this->assertEquals(array('foo/Foo/Bar.php'), $this->loader->findClass('Foo_Bar'));
}
public function loadTestNamespace() {
$this->assertEquals(array('test/foo/bar.php'), $this->loader->findClass('Test\Foo\Bar'));
public function testLoadTestNamespace() {
$this->assertEquals(array('tests/lib/foo/bar.php'), $this->loader->findClass('Test\Foo\Bar'));
}
public function loadTest() {
$this->assertEquals(array('test/foo/bar.php'), $this->loader->findClass('Test_Foo_Bar'));
public function testLoadTest() {
$this->assertEquals(array('tests/lib/foo/bar.php'), $this->loader->findClass('Test_Foo_Bar'));
}
public function loadCoreNamespace() {
$this->assertEquals(array('lib/foo/bar.php'), $this->loader->findClass('OC\Foo\Bar'));
public function testLoadCoreNamespace() {
$this->assertEquals(array('foo/bar.php'), $this->loader->findClass('OC\Foo\Bar'));
}
public function loadCore() {
$this->assertEquals(array('lib/legacy/foo/bar.php', 'lib/foo/bar.php'), $this->loader->findClass('OC_Foo_Bar'));
public function testLoadCore() {
$this->assertEquals(array('legacy/foo/bar.php', 'foo/bar.php'), $this->loader->findClass('OC_Foo_Bar'));
}
public function loadPublicNamespace() {
$this->assertEquals(array('lib/public/foo/bar.php'), $this->loader->findClass('OCP\Foo\Bar'));
public function testLoadPublicNamespace() {
$this->assertEquals(array('public/foo/bar.php'), $this->loader->findClass('OCP\Foo\Bar'));
}
public function testLoadAppNamespace() {
$result = $this->loader->findClass('OCA\Files\Foobar');
$this->assertEquals(2, count($result));
$this->assertStringEndsWith('apps/files/foobar.php', $result[0]);
$this->assertStringEndsWith('apps/files/lib/foobar.php', $result[1]);
}
}