Skip to content

Commit

Permalink
Support for multiple extensions in TypeNameMatchesFileNameSniff
Browse files Browse the repository at this point in the history
  • Loading branch information
klapuch authored and kukulich committed Feb 5, 2017
1 parent 19d9eb0 commit b4600b5
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 6 deletions.
15 changes: 12 additions & 3 deletions SlevomatCodingStandard/Sniffs/Files/FilepathNamespaceExtractor.php
Expand Up @@ -13,17 +13,25 @@ class FilepathNamespaceExtractor
/** @var bool[] dir(string) => true(bool) */
private $skipDirs;

/** @var string[] */
private $extensions;

/**
* @param string[] $rootNamespaces directory(string) => namespace
* @param string[] $skipDirs
* @param string[] $extensions index(integer) => extension
*/
public function __construct(
array $rootNamespaces,
array $skipDirs
array $skipDirs,
array $extensions
)
{
$this->rootNamespaces = $rootNamespaces;
$this->skipDirs = array_fill_keys($skipDirs, true);
$this->extensions = array_map(function (string $extension): string {
return strtolower($extension);
}, $extensions);
}

/**
Expand All @@ -32,7 +40,8 @@ public function __construct(
*/
public function getTypeNameFromProjectPath(string $path)
{
if (pathinfo($path, PATHINFO_EXTENSION) !== 'php') {
$extension = strtolower(pathinfo($path, PATHINFO_EXTENSION));
if (!in_array($extension, $this->extensions, true)) {
return null;
}

Expand Down Expand Up @@ -66,7 +75,7 @@ public function getTypeNameFromProjectPath(string $path)
return !isset($this->skipDirs[$pathPart]);
}));

return substr($typeName, 0, -strlen('.php'));
return substr($typeName, 0, -strlen('.' . $extension));
}

}
Expand Up @@ -13,6 +13,9 @@ class TypeNameMatchesFileNameSniff implements \PHP_CodeSniffer_Sniff
/** @var string[] path(string) => namespace */
public $rootNamespaces = [];

/** @var string[] index(integer) => extension */
public $extensions = ['php'];

/** @var string[] path(string) => namespace */
private $normalizedRootNamespaces;

Expand Down Expand Up @@ -84,7 +87,8 @@ private function getNamespaceExtractor(): FilepathNamespaceExtractor
if ($this->namespaceExtractor === null) {
$this->namespaceExtractor = new FilepathNamespaceExtractor(
$this->getRootNamespaces(),
$this->getSkipDirs()
$this->getSkipDirs(),
$this->extensions
);
}

Expand Down
37 changes: 35 additions & 2 deletions tests/Sniffs/Files/FilepathNamespaceExtractorTest.php
Expand Up @@ -16,46 +16,77 @@ public function dataGetTypeNameFromProjectPath(): array
[
$root . '/unknown',
null,
['php'],
],
[
$root . '/app',
null,
['php'],
],
[
$root . '/app/components',
null,
['php'],
],
[
$root . '/app/components.php',
'Slevomat\\components',
['php'],
],
[
$root . '/app/Foo/Foo.swift',
null,
['php'],
],
[
$root . '/app/Foo/Foo.php',
'Slevomat\\Foo\\Foo',
['php'],
],
[
$root . '/tests/UnitTestCase.php',
'Slevomat\\UnitTestCase',
['php'],
],
[
$root . '/app/model/Auth/DatabaseAuthenticator.php',
'Slevomat\\Auth\\DatabaseAuthenticator',
['php'],
],
[
$root . '/app/services/Delivery/Premise/AbstractPremiseImporter.php',
'Slevomat\\Delivery\\Premise\\AbstractPremiseImporter',
['php'],
],
[
$root . '/app/ui/Admin/Newsletter/CreatePresenter.php',
'Slevomat\\UI\\Admin\\Newsletter\\CreatePresenter',
['php'],
],
[
$root . '/tests/services/Delivery/Goods3rd/data/StatusEnum.php',
'Slevomat\\Delivery\\Goods3rd\\StatusEnum',
['php'],
],
[
$root . '/tests/services/Delivery/Goods3rd/data/StatusEnum.PHP',
'Slevomat\\Delivery\\Goods3rd\\StatusEnum',
['php'],
],
[
$root . '/tests/services/Delivery/Goods3rd/data/StatusEnum.php',
'Slevomat\\Delivery\\Goods3rd\\StatusEnum',
['PHP'],
],
[
$root . '/tests/services/Delivery/Goods3rd/data/StatusEnum.php',
'Slevomat\\Delivery\\Goods3rd\\StatusEnum',
['php', 'lsp'],
],
[
$root . '/app/Foo/FooTest.phpt',
'Slevomat\\Foo\\FooTest',
['php', 'phpt'],
],
];
}
Expand All @@ -64,16 +95,18 @@ public function dataGetTypeNameFromProjectPath(): array
* @dataProvider dataGetTypeNameFromProjectPath
* @param string $path
* @param string|null $expectedNamespace
* @param string[] $extensions
*/
public function testGetTypeNameFromProjectPath(string $path, string $expectedNamespace = null)
public function testGetTypeNameFromProjectPath(string $path, string $expectedNamespace = null, array $extensions)
{
$extractor = new FilepathNamespaceExtractor(
[
'app/ui' => 'Slevomat\\UI',
'app' => 'Slevomat',
'tests' => 'Slevomat',
],
['components', 'forms', 'model', 'models', 'services', 'stubs', 'data']
['components', 'forms', 'model', 'models', 'services', 'stubs', 'data'],
$extensions
);
$path = str_replace('/', DIRECTORY_SEPARATOR, $path);
$this->assertSame($expectedNamespace, $extractor->getTypeNameFromProjectPath($path));
Expand Down

0 comments on commit b4600b5

Please sign in to comment.