diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d4757ce..f3207344 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Read autoload-dev psr-4 namespaces for gacela make commands. - Cache default resolved gacela class. +- Allow optional project namespace on class name finder rules. ### 0.26.0 #### 2022-10-01 diff --git a/src/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithModulePrefix.php b/src/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithModulePrefix.php index f57da024..1ea336be 100644 --- a/src/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithModulePrefix.php +++ b/src/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithModulePrefix.php @@ -10,9 +10,17 @@ final class FinderRuleWithModulePrefix implements FinderRuleInterface { public function buildClassCandidate(string $projectNamespace, string $resolvableType, ClassInfo $classInfo): string { + if ($projectNamespace !== '') { + return sprintf( + '\\%s\\%s\\%s', + trim($projectNamespace, '\\'), + $classInfo->getModuleName(), + $classInfo->getModuleName() . $resolvableType + ); + } + return sprintf( - '\\%s\\%s\\%s', - trim($projectNamespace, '\\'), + '\\%s\\%s', $classInfo->getModuleName(), $classInfo->getModuleName() . $resolvableType ); diff --git a/src/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithoutModulePrefix.php b/src/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithoutModulePrefix.php index b332a163..227f882f 100644 --- a/src/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithoutModulePrefix.php +++ b/src/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithoutModulePrefix.php @@ -10,9 +10,17 @@ final class FinderRuleWithoutModulePrefix implements FinderRuleInterface { public function buildClassCandidate(string $projectNamespace, string $resolvableType, ClassInfo $classInfo): string { + if ($projectNamespace !== '') { + return sprintf( + '\\%s\\%s\\%s', + trim($projectNamespace, '\\'), + $classInfo->getModuleName(), + $resolvableType + ); + } + return sprintf( - '\\%s\\%s\\%s', - trim($projectNamespace, '\\'), + '\\%s\\%s', $classInfo->getModuleName(), $resolvableType ); diff --git a/tests/Unit/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithModulePrefixTest.php b/tests/Unit/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithModulePrefixTest.php new file mode 100644 index 00000000..6d3865b8 --- /dev/null +++ b/tests/Unit/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithModulePrefixTest.php @@ -0,0 +1,41 @@ +rule = new FinderRuleWithModulePrefix(); + } + + public function test_build_without_project_namespace(): void + { + $projectNamespace = ''; + $resolvableType = 'Factory'; + $classInfo = ClassInfo::from($this); + + $actual = $this->rule->buildClassCandidate($projectNamespace, $resolvableType, $classInfo); + + self::assertSame('\Rule\RuleFactory', $actual); + } + + public function test_build_with_project_namespace(): void + { + $projectNamespace = 'App'; + $resolvableType = 'Factory'; + $classInfo = ClassInfo::from($this); + + $actual = $this->rule->buildClassCandidate($projectNamespace, $resolvableType, $classInfo); + + self::assertSame('\App\Rule\RuleFactory', $actual); + } +} diff --git a/tests/Unit/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithoutModulePrefixTest.php b/tests/Unit/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithoutModulePrefixTest.php new file mode 100644 index 00000000..b89044af --- /dev/null +++ b/tests/Unit/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithoutModulePrefixTest.php @@ -0,0 +1,41 @@ +rule = new FinderRuleWithoutModulePrefix(); + } + + public function test_build_without_project_namespace(): void + { + $projectNamespace = ''; + $resolvableType = 'Factory'; + $classInfo = ClassInfo::from($this); + + $actual = $this->rule->buildClassCandidate($projectNamespace, $resolvableType, $classInfo); + + self::assertSame('\Rule\Factory', $actual); + } + + public function test_build_with_project_namespace(): void + { + $projectNamespace = 'App'; + $resolvableType = 'Factory'; + $classInfo = ClassInfo::from($this); + + $actual = $this->rule->buildClassCandidate($projectNamespace, $resolvableType, $classInfo); + + self::assertSame('\App\Rule\Factory', $actual); + } +}