Skip to content

Commit

Permalink
Merge pull request #1 from moufmouf/1.0
Browse files Browse the repository at this point in the history
Fixing empty namespace detection.
  • Loading branch information
moufmouf committed May 22, 2017
2 parents aa8e227 + d6cbb2a commit 2b11a7c
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 22 deletions.
4 changes: 4 additions & 0 deletions .scrutinizer.yml
Expand Up @@ -2,3 +2,7 @@ build:
environment:
php:
version: 5.5
checks:
php:
code_rating: true
duplication: true
57 changes: 38 additions & 19 deletions src/ClassNameMapper.php
Expand Up @@ -29,6 +29,9 @@ class ClassNameMapper
public function registerPsr0Namespace($namespace, $path) {
// A namespace always ends with a \
$namespace = trim($namespace, '\\').'\\';
if ($namespace === '\\') {
$namespace = '';
}

if (!is_array($path)) {
$path = [$path];
Expand All @@ -54,6 +57,9 @@ public function registerPsr0Namespace($namespace, $path) {
public function registerPsr4Namespace($namespace, $path) {
// A namespace always ends with a \
$namespace = trim($namespace, '\\').'\\';
if ($namespace === '\\') {
$namespace = '';
}

if (!is_array($path)) {
$path = [$path];
Expand Down Expand Up @@ -227,18 +233,28 @@ public function getPossibleFileNames($className) {
$namespace = $result['namespace'];
$directory = $result['directory'];

if (strpos($className, $namespace) === 0) {
if ($namespace === '') {
$tmpClassName = $className;
$fileName = '';
$fileNamespace = '';
if ($lastNsPos = strripos($tmpClassName, '\\')) {
$namespace = substr($tmpClassName, 0, $lastNsPos);
$tmpClassName = substr($tmpClassName, $lastNsPos + 1);
$fileName = str_replace('\\', '/', $namespace) . '/';
}
$fileName .= str_replace('_', '/', $tmpClassName) . '.php';

$fileName = str_replace('\\', '/', $namespace) . '/' . str_replace('_', '/', $tmpClassName) . '.php';
$possibleFileNames[] = $directory.$fileName;
} else {
if (strpos($className, $namespace) === 0) {
$tmpClassName = $className;
$fileName = '';
if ($lastNsPos = strripos($tmpClassName, '\\')) {
$namespace = substr($tmpClassName, 0, $lastNsPos);
$tmpClassName = substr($tmpClassName, $lastNsPos + 1);
$fileName = str_replace('\\', '/', $namespace) . '/';
}
$fileName .= str_replace('_', '/', $tmpClassName) . '.php';

$possibleFileNames[] = $directory.$fileName;
}
}
}

Expand All @@ -248,21 +264,24 @@ public function getPossibleFileNames($className) {
$namespace = $result['namespace'];
$directory = $result['directory'];

if (strpos($className, $namespace) === 0) {
$shortenedClassName = substr($className, strlen($namespace));

$fileName = '';
$fileNamespace = '';
if ($lastNsPos = strripos($shortenedClassName, '\\')) {
$namespace = substr($shortenedClassName, 0, $lastNsPos);
$shortenedClassName = substr($shortenedClassName, $lastNsPos + 1);
$fileName = str_replace('\\', '/', $namespace) . '/' . $shortenedClassName;
} else {
$fileName = $shortenedClassName;
}
$fileName .= '.php';

if ($namespace === '') {
$fileName = str_replace('\\', '/', $className) . '.php';
$possibleFileNames[] = $directory.$fileName;
} else {
if (strpos($className, $namespace) === 0) {
$shortenedClassName = substr($className, strlen($namespace));

if ($lastNsPos = strripos($shortenedClassName, '\\')) {
$namespace = substr($shortenedClassName, 0, $lastNsPos);
$shortenedClassName = substr($shortenedClassName, $lastNsPos + 1);
$fileName = str_replace('\\', '/', $namespace) . '/' . $shortenedClassName;
} else {
$fileName = $shortenedClassName;
}
$fileName .= '.php';

$possibleFileNames[] = $directory . $fileName;
}
}
}

Expand Down
37 changes: 34 additions & 3 deletions tests/ClassNameMapperTest.php
Expand Up @@ -5,10 +5,35 @@
class ClassNameMapperTest extends \PHPUnit_Framework_TestCase
{
public function testGetPossibleFiles() {
$mapper = ClassNameMapper::createFromComposerFile(__DIR__.'/../composer.json');
$possibleFiles = $mapper->getPossibleFileNames('Mouf\\Composer\\Foo\\Bar');
$mapper = ClassNameMapper::createFromComposerFile(__DIR__.'/Fixtures/test_autoload.json');
$possibleFiles = $mapper->getPossibleFileNames('Foo\\Bar\\Baz');

$this->assertEquals([ 'src/Foo/Bar/Baz.php', 'src2/Bar/Baz.php' ], $possibleFiles);

$possibleFiles = $mapper->getPossibleFileNames('Foo\\Bar');

$this->assertEquals([ 'src/Foo/Bar.php', 'src2/Bar.php' ], $possibleFiles);

}

public function testUseAutoloadDev() {
$mapper = ClassNameMapper::createFromComposerFile(__DIR__.'/Fixtures/test_autoload.json', null, true);
$possibleFiles = $mapper->getPossibleFileNames('Foo\\Bar\\Baz');

$this->assertEquals([ 'src/Foo/Bar/Baz.php', 'tests/Foo/Bar/Baz.php', 'src2/Bar/Baz.php', 'tests2/Bar/Baz.php' ], $possibleFiles);

}

public function testGetPossibleFilesFromEmptyPsrAutoload() {
$mapper = ClassNameMapper::createFromComposerFile(__DIR__.'/Fixtures/empty_autoload.json');
$possibleFiles = $mapper->getPossibleFileNames('Foo\\Bar');

$this->assertEquals([ 'src/Foo/Bar.php', 'src2/Foo/Bar.php' ], $possibleFiles);

$possibleFiles = $mapper->getPossibleFileNames('Foo_Zip\\Bar_Baz');

$this->assertEquals([ 'src/Foo_Zip/Bar/Baz.php', 'src2/Foo_Zip/Bar_Baz.php' ], $possibleFiles);

$this->assertEquals([ 'src/Foo/Bar.php' ], $possibleFiles);
}

public function testGetManagedNamespaces() {
Expand All @@ -18,4 +43,10 @@ public function testGetManagedNamespaces() {
$this->assertEquals([ 'Mouf\\Composer\\' ], $namespaces);
}

public function testGetManagedNamespacesFromEmptyPsrAutoload() {
$mapper = ClassNameMapper::createFromComposerFile(__DIR__.'/Fixtures/empty_autoload.json');
$namespaces = $mapper->getManagedNamespaces();

$this->assertEquals([ '' ], $namespaces);
}
}
10 changes: 10 additions & 0 deletions tests/Fixtures/empty_autoload.json
@@ -0,0 +1,10 @@
{
"autoload" : {
"psr-0" : {
"" : "src/"
},
"psr-4" : {
"" : "src2/"
}
}
}
19 changes: 19 additions & 0 deletions tests/Fixtures/test_autoload.json
@@ -0,0 +1,19 @@
{
"autoload" : {
"psr-0" : {
"Foo" : "src/"
},
"psr-4" : {
"Foo\\" : "src2/"
}
},
"autoload-dev" : {
"psr-0" : {
"Foo" : "tests/"
},
"psr-4" : {
"Foo\\" : "tests2/"
}
}

}

0 comments on commit 2b11a7c

Please sign in to comment.