From 5c3cfb55605a5b6a6a6720497f101a801c26ece7 Mon Sep 17 00:00:00 2001 From: Chemaclass Date: Wed, 12 Oct 2022 13:58:50 +0200 Subject: [PATCH 1/2] Allow optional project namespace on class name finder rules --- CHANGELOG.md | 1 + .../Rule/FinderRuleWithModulePrefix.php | 12 ++++++++++-- .../Rule/FinderRuleWithoutModulePrefix.php | 12 ++++++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) 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 ); From 144e57e9f90bf4d2e6cc35b8a358e2810131dea7 Mon Sep 17 00:00:00 2001 From: Chemaclass Date: Wed, 12 Oct 2022 14:18:25 +0200 Subject: [PATCH 2/2] Add unit tests for ClassNameFinder rules --- .../Rule/FinderRuleWithModulePrefixTest.php | 41 +++++++++++++++++++ .../FinderRuleWithoutModulePrefixTest.php | 41 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 tests/Unit/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithModulePrefixTest.php create mode 100644 tests/Unit/Framework/ClassResolver/ClassNameFinder/Rule/FinderRuleWithoutModulePrefixTest.php 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); + } +}