Skip to content

Commit 5473149

Browse files
committed
Support for returning ClassInfo for namespace in ClassInfoList - Close #46
1 parent ecbe189 commit 5473149

File tree

3 files changed

+140
-0
lines changed

3 files changed

+140
-0
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
},
3131
"require-dev": {
3232
"laminas/laminas-filter": "^2.9",
33+
"open-code-modeling/php-filter": "^0.1.1",
3334
"phpspec/prophecy-phpunit": "^2.0",
3435
"phpstan/phpstan": "^0.12.33",
3536
"phpstan/phpstan-strict-rules": "^0.12.4",

src/Package/ClassInfoList.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,16 @@ public function classInfoForFilename(string $filename): ClassInfo
7474
\sprintf('No class info found for filename "%s". Check your namespace configuration.', $filename)
7575
);
7676
}
77+
78+
public function classInfoForNamespace(string $namespace): ClassInfo
79+
{
80+
foreach ($this->list as $classInfo) {
81+
if (\strpos($namespace, $classInfo->getPackagePrefix()) === 0) {
82+
return $classInfo;
83+
}
84+
}
85+
throw new RuntimeException(
86+
\sprintf('No class info found for namespace "%s". Check your namespace configuration.', $namespace)
87+
);
88+
}
7789
}

tests/Package/ClassInfoListTest.php

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
<?php
2+
3+
/**
4+
* @see https://github.com/open-code-modeling/php-code-ast for the canonical source repository
5+
* @copyright https://github.com/open-code-modeling/php-code-ast/blob/master/COPYRIGHT.md
6+
* @license https://github.com/open-code-modeling/php-code-ast/blob/master/LICENSE.md MIT License
7+
*/
8+
9+
declare(strict_types=1);
10+
11+
namespace OpenCodeModelingTest\CodeAst\Package;
12+
13+
use OpenCodeModeling\CodeAst\Exception\RuntimeException;
14+
use OpenCodeModeling\CodeAst\Package\ClassInfoList;
15+
use OpenCodeModeling\CodeAst\Package\Psr4Info;
16+
use OpenCodeModeling\Filter\FilterFactory;
17+
use PHPUnit\Framework\TestCase;
18+
19+
final class ClassInfoListTest extends TestCase
20+
{
21+
/**
22+
* @var ClassInfoList
23+
*/
24+
private $classInfoList;
25+
26+
public function setUp(): void
27+
{
28+
$this->classInfoList = new ClassInfoList(
29+
new Psr4Info(
30+
'tmp/',
31+
'Acme',
32+
FilterFactory::directoryToNamespaceFilter(),
33+
FilterFactory::namespaceToDirectoryFilter(),
34+
),
35+
new Psr4Info(
36+
'src/',
37+
'MyApp',
38+
FilterFactory::directoryToNamespaceFilter(),
39+
FilterFactory::namespaceToDirectoryFilter(),
40+
),
41+
new Psr4Info(
42+
'lib/',
43+
'MyLibrary',
44+
FilterFactory::directoryToNamespaceFilter(),
45+
FilterFactory::namespaceToDirectoryFilter(),
46+
),
47+
);
48+
}
49+
50+
/**
51+
* @test
52+
*/
53+
public function it_returns_class_info_for_path(): void
54+
{
55+
$classInfo = $this->classInfoList->classInfoForPath('tmp/');
56+
$this->assertSame('tmp', $classInfo->getSourceFolder());
57+
58+
$classInfo = $this->classInfoList->classInfoForPath('src/');
59+
$this->assertSame('src', $classInfo->getSourceFolder());
60+
61+
$classInfo = $this->classInfoList->classInfoForPath('lib/');
62+
$this->assertSame('lib', $classInfo->getSourceFolder());
63+
}
64+
65+
/**
66+
* @test
67+
*/
68+
public function it_throws_exception_if_class_info_for_path_was_not_found(): void
69+
{
70+
$this->expectException(RuntimeException::class);
71+
$this->classInfoList->classInfoForPath('unknown/');
72+
}
73+
74+
/**
75+
* @test
76+
*/
77+
public function it_returns_class_info_for_filename(): void
78+
{
79+
$classInfo = $this->classInfoList->classInfoForFilename('tmp/Order.php');
80+
$this->assertSame('tmp', $classInfo->getSourceFolder());
81+
82+
$classInfo = $this->classInfoList->classInfoForFilename('src/Order.php');
83+
$this->assertSame('src', $classInfo->getSourceFolder());
84+
85+
$classInfo = $this->classInfoList->classInfoForFilename('lib/Order.php');
86+
$this->assertSame('lib', $classInfo->getSourceFolder());
87+
}
88+
89+
/**
90+
* @test
91+
*/
92+
public function it_throws_exception_if_class_info_for_filename_was_not_found(): void
93+
{
94+
$this->expectException(RuntimeException::class);
95+
$this->classInfoList->classInfoForFilename('Unknown/Order.php');
96+
}
97+
98+
/**
99+
* @test
100+
*/
101+
public function it_returns_class_info_for_namespace(): void
102+
{
103+
$classInfo = $this->classInfoList->classInfoForNamespace('Acme');
104+
$this->assertSame('tmp', $classInfo->getSourceFolder());
105+
$classInfo = $this->classInfoList->classInfoForNamespace('Acme\\Service\\OrderService');
106+
$this->assertSame('tmp', $classInfo->getSourceFolder());
107+
108+
$classInfo = $this->classInfoList->classInfoForNamespace('MyApp');
109+
$this->assertSame('src', $classInfo->getSourceFolder());
110+
$classInfo = $this->classInfoList->classInfoForNamespace('MyApp\\Service\\OrderService');
111+
$this->assertSame('src', $classInfo->getSourceFolder());
112+
113+
$classInfo = $this->classInfoList->classInfoForNamespace('MyLibrary');
114+
$this->assertSame('lib', $classInfo->getSourceFolder());
115+
$classInfo = $this->classInfoList->classInfoForNamespace('MyLibrary\\Service\\OrderService');
116+
$this->assertSame('lib', $classInfo->getSourceFolder());
117+
}
118+
119+
/**
120+
* @test
121+
*/
122+
public function it_throws_exception_if_class_info_for_namespace_was_not_found(): void
123+
{
124+
$this->expectException(RuntimeException::class);
125+
$this->classInfoList->classInfoForNamespace('Unknown');
126+
}
127+
}

0 commit comments

Comments
 (0)