diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php new file mode 100644 index 00000000..636c9ae9 --- /dev/null +++ b/.php-cs-fixer.dist.php @@ -0,0 +1,60 @@ +files() + ->in(__DIR__ . '/src') + ->in(__DIR__ . '/tests'); + +return (new Config()) + ->setFinder($finder) + ->setRules([ + '@PSR12' => true, + 'array_syntax' => ['syntax' => 'short'], + 'braces' => [ + 'allow_single_line_closure' => true, + 'allow_single_line_anonymous_class_with_empty_body' => true, + ], + 'concat_space' => ['spacing' => 'one'], + 'declare_strict_types' => true, + 'function_typehint_space' => true, + 'list_syntax' => ['syntax' => 'short'], + 'no_empty_phpdoc' => true, + 'no_empty_statement' => true, + 'no_leading_namespace_whitespace' => true, + 'no_trailing_comma_in_singleline_array' => true, + 'no_whitespace_before_comma_in_array' => true, + 'no_unused_imports' => true, + 'normalize_index_brace' => true, + 'ordered_imports' => [ + 'imports_order' => [ + 'class', + 'function', + 'const', + ], + 'sort_algorithm' => 'alpha', + ], + 'php_unit_method_casing' => ['case' => 'snake_case'], + 'phpdoc_add_missing_param_annotation' => true, + 'phpdoc_annotation_without_dot' => true, + 'phpdoc_indent' => true, + 'phpdoc_line_span' => ['const' => 'single', 'property' => 'single', 'method' => 'multi'], + 'phpdoc_order' => true, + 'phpdoc_scalar' => true, + 'phpdoc_separation' => true, + 'phpdoc_summary' => true, + 'phpdoc_trim' => true, + 'phpdoc_types' => true, + 'phpdoc_var_annotation_correct_order' => true, + 'phpdoc_var_without_name' => true, + 'single_quote' => true, + 'trailing_comma_in_multiline' => [ + 'elements' => ['arrays'], + ], + 'trim_array_spaces' => true, + 'void_return' => true, + ]); \ No newline at end of file diff --git a/.php_cs.dist b/.php_cs.dist deleted file mode 100644 index 914219b9..00000000 --- a/.php_cs.dist +++ /dev/null @@ -1,45 +0,0 @@ -files() - ->in(__DIR__ . '/src') - ->in(__DIR__ . '/tests'); - -return PhpCsFixer\Config::create() - ->setFinder($finder) - ->setRules([ - '@PSR12' => true, - 'array_syntax' => ['syntax' => 'short'], - 'compact_nullable_typehint' => true, - 'concat_space' => ['spacing' => 'one'], - 'declare_strict_types' => true, - 'final_class' => true, - 'function_typehint_space' => true, - 'header_comment' => ['header' => ''], - 'list_syntax' => ['syntax' => 'short'], - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_leading_namespace_whitespace' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_whitespace_before_comma_in_array' => true, - 'no_unused_imports' => true, - 'normalize_index_brace' => true, - 'php_unit_method_casing' => ['case' => 'snake_case'], - 'phpdoc_add_missing_param_annotation' => true, - 'phpdoc_annotation_without_dot' => true, - 'phpdoc_indent' => true, - 'phpdoc_line_span' => ['const' => 'single', 'property' => 'single', 'method' => 'multi'], - 'phpdoc_order' => true, - 'phpdoc_scalar' => true, - 'phpdoc_separation' => true, - 'phpdoc_summary' => true, - 'phpdoc_trim' => true, - 'phpdoc_types' => true, - 'phpdoc_var_annotation_correct_order' => true, - 'phpdoc_var_without_name' => true, - 'single_trait_insert_per_statement' => true, - 'single_quote' => true, - 'trailing_comma_in_multiline_array' => true, - 'trim_array_spaces' => true, - 'void_return' => true, - ]); diff --git a/composer.lock b/composer.lock index f0462766..efee064d 100644 --- a/composer.lock +++ b/composer.lock @@ -1832,16 +1832,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.10.5", + "version": "v4.11.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4432ba399e47c66624bc73c8c0f811e5c109576f" + "reference": "fe14cf3672a149364fb66dfe11bf6549af899f94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4432ba399e47c66624bc73c8c0f811e5c109576f", - "reference": "4432ba399e47c66624bc73c8c0f811e5c109576f", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/fe14cf3672a149364fb66dfe11bf6549af899f94", + "reference": "fe14cf3672a149364fb66dfe11bf6549af899f94", "shasum": "" }, "require": { @@ -1882,9 +1882,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.5" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.11.0" }, - "time": "2021-05-03T19:11:20+00:00" + "time": "2021-07-03T13:36:55+00:00" }, { "name": "openlss/lib-array2xml", diff --git a/src/CodeGenerator/Domain/CommandArgumentsParser.php b/src/CodeGenerator/Domain/CommandArgumentsParser.php index 6b300c75..5c1c67d6 100644 --- a/src/CodeGenerator/Domain/CommandArgumentsParser.php +++ b/src/CodeGenerator/Domain/CommandArgumentsParser.php @@ -42,6 +42,7 @@ public function parse(string $desiredNamespace): CommandArguments foreach ($allPsr4Combinations as $psr4Combination) { $psr4Key = $psr4Combination . '\\'; + if (isset($psr4[$psr4Key])) { return $this->foundPsr4($psr4Key, $psr4[$psr4Key], $desiredNamespace); } @@ -80,8 +81,8 @@ private function allPossiblePsr4Combinations(string $desiredNamespace): array private function foundPsr4(string $psr4Key, string $psr4Value, string $desiredNamespace): CommandArguments { - $rootDir = substr($psr4Value, 0, -1); - $rootNamespace = substr($psr4Key, 0, -1); + $rootDir = mb_substr($psr4Value, 0, -1); + $rootNamespace = mb_substr($psr4Key, 0, -1); $targetDirectory = str_replace(['/', $rootNamespace, '\\'], ['\\', $rootDir, '/'], $desiredNamespace); $namespace = str_replace([$rootDir, '/'], [$rootNamespace, '\\'], $targetDirectory); diff --git a/src/CodeGenerator/Domain/FilenameSanitizer.php b/src/CodeGenerator/Domain/FilenameSanitizer.php index fedda54c..8c0a93c6 100644 --- a/src/CodeGenerator/Domain/FilenameSanitizer.php +++ b/src/CodeGenerator/Domain/FilenameSanitizer.php @@ -28,6 +28,7 @@ public static function expectedFilenames(string $glue = ', '): string public function sanitize(string $filename): string { $percents = []; + foreach (self::EXPECTED_FILENAMES as $expected) { $percents[$expected] = similar_text($expected, $filename, $percent); } diff --git a/src/Framework/AbstractConfig.php b/src/Framework/AbstractConfig.php index 5e3e6d85..20a716e1 100644 --- a/src/Framework/AbstractConfig.php +++ b/src/Framework/AbstractConfig.php @@ -11,7 +11,7 @@ abstract class AbstractConfig use ConfigResolverAwareTrait; /** - * @param mixed $default + * @param null|mixed $default * * @throws ConfigException * diff --git a/src/Framework/AbstractFacade.php b/src/Framework/AbstractFacade.php index 08244e5a..ca0702d0 100644 --- a/src/Framework/AbstractFacade.php +++ b/src/Framework/AbstractFacade.php @@ -12,7 +12,7 @@ abstract class AbstractFacade protected function getFactory(): AbstractFactory { - if ($this->factory === null) { + if (null === $this->factory) { $this->factory = $this->resolveFactory(); } diff --git a/src/Framework/ClassResolver/AbstractClassResolver.php b/src/Framework/ClassResolver/AbstractClassResolver.php index aac935f7..44be74db 100644 --- a/src/Framework/ClassResolver/AbstractClassResolver.php +++ b/src/Framework/ClassResolver/AbstractClassResolver.php @@ -8,20 +8,16 @@ abstract class AbstractClassResolver { - /** @var array */ + /** @var array */ protected static array $cachedInstances = []; - protected static ?ClassResolverFactory $classResolverFactory = null; protected static ?ClassNameFinderInterface $classNameFinder = null; - protected ?ClassInfo $classInfo = null; abstract public function resolve(object $callerClass): ?object; - abstract protected function getResolvableType(): string; - /** - * @return mixed|null + * @return null|mixed */ public function doResolve(object $callerClass) { @@ -34,7 +30,7 @@ public function doResolve(object $callerClass) $resolvedClassName = $this->findClassName(); - if ($resolvedClassName === null) { + if (null === $resolvedClassName) { return null; } @@ -48,6 +44,15 @@ public function setCallerObject(object $callerClass): void $this->classInfo = new ClassInfo($callerClass); } + public function getClassInfo(): ClassInfo + { + assert($this->classInfo instanceof ClassInfo); + + return $this->classInfo; + } + + abstract protected function getResolvableType(): string; + private function getCacheKey(): string { assert($this->classInfo instanceof ClassInfo); @@ -65,7 +70,7 @@ private function findClassName(): ?string private function getClassNameFinder(): ClassNameFinderInterface { - if (static::$classNameFinder === null) { + if (null === static::$classNameFinder) { static::$classNameFinder = $this->getClassResolverFactory()->createClassNameFinder(); } @@ -74,22 +79,15 @@ private function getClassNameFinder(): ClassNameFinderInterface private function getClassResolverFactory(): ClassResolverFactory { - if (static::$classResolverFactory === null) { + if (null === static::$classResolverFactory) { static::$classResolverFactory = new ClassResolverFactory(); } return static::$classResolverFactory; } - public function getClassInfo(): ClassInfo - { - assert($this->classInfo instanceof ClassInfo); - - return $this->classInfo; - } - /** - * @return object|null + * @return null|object */ private function createInstance(string $resolvedClassName) { diff --git a/src/Framework/ClassResolver/Config/ConfigResolver.php b/src/Framework/ClassResolver/Config/ConfigResolver.php index 554856d9..cd963d86 100644 --- a/src/Framework/ClassResolver/Config/ConfigResolver.php +++ b/src/Framework/ClassResolver/Config/ConfigResolver.php @@ -17,7 +17,7 @@ public function resolve(object $callerClass): AbstractConfig /** @var ?AbstractConfig $resolved */ $resolved = $this->doResolve($callerClass); - if ($resolved === null) { + if (null === $resolved) { throw new ConfigNotFoundException($this->getClassInfo()); } diff --git a/src/Framework/ClassResolver/DependencyProvider/DependencyProviderResolver.php b/src/Framework/ClassResolver/DependencyProvider/DependencyProviderResolver.php index ff187c09..5f76e5e5 100644 --- a/src/Framework/ClassResolver/DependencyProvider/DependencyProviderResolver.php +++ b/src/Framework/ClassResolver/DependencyProvider/DependencyProviderResolver.php @@ -17,7 +17,7 @@ public function resolve(object $callerClass): AbstractDependencyProvider /** @var ?AbstractDependencyProvider $resolved */ $resolved = $this->doResolve($callerClass); - if ($resolved === null) { + if (null === $resolved) { throw new DependencyProviderNotFoundException($this->getClassInfo()); } diff --git a/src/Framework/ClassResolver/Factory/FactoryResolver.php b/src/Framework/ClassResolver/Factory/FactoryResolver.php index 59f3b9b0..b0a8b779 100644 --- a/src/Framework/ClassResolver/Factory/FactoryResolver.php +++ b/src/Framework/ClassResolver/Factory/FactoryResolver.php @@ -21,7 +21,7 @@ public function resolve(object $callerClass): AbstractFactory /** @var ?AbstractFactory $resolved */ $resolved = $this->doResolve($callerClass); - if ($resolved === null) { + if (null === $resolved) { throw new FactoryNotFoundException($this->getClassInfo()); } diff --git a/src/Framework/Config.php b/src/Framework/Config.php index f3cd9c32..d746fa97 100644 --- a/src/Framework/Config.php +++ b/src/Framework/Config.php @@ -20,14 +20,13 @@ final class Config private static string $applicationRootDir = ''; - /** @var array */ private static array $config = []; private static ?self $instance = null; public static function getInstance(): self { - if (self::$instance === null) { + if (null === self::$instance) { self::$instance = new self(); } @@ -35,7 +34,7 @@ public static function getInstance(): self } /** - * @param mixed|null $default + * @param null|mixed $default * * @throws ConfigException * @@ -47,7 +46,7 @@ public static function get(string $key, $default = null) self::init(); } - if ($default !== null && !self::hasValue($key)) { + if (null !== $default && !self::hasValue($key)) { return $default; } @@ -67,6 +66,7 @@ public static function init(): void foreach (self::scanAllConfigFiles() as $filename) { $fileNameOrDir = self::fullPath($filename); + if (is_dir($fileNameOrDir)) { /** @var array{0:string} $fileInfo */ foreach (self::createRecursiveIterator($fileNameOrDir) as $fileInfo) { @@ -84,6 +84,25 @@ public static function init(): void self::$config = array_merge(...$configs); } + public static function getApplicationRootDir(): string + { + if (empty(self::$applicationRootDir)) { + self::$applicationRootDir = getcwd() ?: ''; + } + + return self::$applicationRootDir; + } + + public static function setApplicationRootDir(string $dir): void + { + self::$applicationRootDir = $dir; + } + + public static function hasValue(string $key): bool + { + return isset(self::$config[$key]); + } + /** * @throws ConfigException * @@ -92,6 +111,7 @@ public static function init(): void private static function scanAllConfigFiles(): array { $configDir = self::getApplicationRootDir() . '/config/'; + if (!is_dir($configDir)) { throw ConfigException::configDirNotFound(self::getApplicationRootDir()); } @@ -101,21 +121,7 @@ private static function scanAllConfigFiles(): array ['..', '.', self::CONFIG_LOCAL_FILENAME] ); - return array_map(static fn ($p) => (string)$p, $paths); - } - - public static function getApplicationRootDir(): string - { - if (empty(self::$applicationRootDir)) { - self::$applicationRootDir = getcwd() ?: ''; - } - - return self::$applicationRootDir; - } - - public static function setApplicationRootDir(string $dir): void - { - self::$applicationRootDir = $dir; + return array_map(static fn ($p) => (string) $p, $paths); } private static function fullPath(string $fileNameOrDir): string @@ -134,22 +140,18 @@ private static function createRecursiveIterator(string $path): RegexIterator private static function isPhpFile(string $path): bool { - return is_file($path) && pathinfo($path, PATHINFO_EXTENSION) === 'php'; + return is_file($path) && 'php' === pathinfo($path, PATHINFO_EXTENSION); } private static function readConfigFromFile(string $file): array { if (file_exists($file)) { - /** @var array|null $content */ + /** @var null|array $content */ $content = include $file; + return is_array($content) ? $content : []; } return []; } - - public static function hasValue(string $key): bool - { - return isset(self::$config[$key]); - } } diff --git a/src/Framework/ConfigResolverAwareTrait.php b/src/Framework/ConfigResolverAwareTrait.php index 597707fb..439fc954 100644 --- a/src/Framework/ConfigResolverAwareTrait.php +++ b/src/Framework/ConfigResolverAwareTrait.php @@ -13,7 +13,7 @@ trait ConfigResolverAwareTrait protected function getConfig(): AbstractConfig { - if ($this->config === null) { + if (null === $this->config) { $this->config = $this->resolveConfig(); } @@ -26,6 +26,7 @@ protected function getConfig(): AbstractConfig private function resolveConfig(): AbstractConfig { $resolver = new ConfigResolver(); + return $resolver->resolve($this); } } diff --git a/src/Framework/Container/Container.php b/src/Framework/Container/Container.php index cc53b0e0..9e9f6db9 100644 --- a/src/Framework/Container/Container.php +++ b/src/Framework/Container/Container.php @@ -19,9 +19,6 @@ public function getLocator(): Locator return Locator::getInstance(); } - /** - * @param mixed $service - */ public function set(string $id, $service): void { $this->services[$id] = $service; diff --git a/src/Framework/Container/Locator.php b/src/Framework/Container/Locator.php index 5097e292..04d61433 100644 --- a/src/Framework/Container/Locator.php +++ b/src/Framework/Container/Locator.php @@ -15,7 +15,7 @@ final class Locator public static function getInstance(): self { - if (self::$instance === null) { + if (null === self::$instance) { self::$instance = new self(); } @@ -76,7 +76,7 @@ private function newInstance(string $className) private function isInterface(string $className): bool { - return false !== strpos($className, self::INTERFACE_SUFFIX); + return false !== mb_strpos($className, self::INTERFACE_SUFFIX); } private function getConcreteClassFromInterface(string $interface): string diff --git a/src/Framework/Exception/Backtrace.php b/src/Framework/Exception/Backtrace.php index effbbe2d..e275ffae 100644 --- a/src/Framework/Exception/Backtrace.php +++ b/src/Framework/Exception/Backtrace.php @@ -19,6 +19,7 @@ public static function get(): string private function __construct() { $backtraceCollection = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + foreach ($backtraceCollection as $backtrace) { $this->backtrace .= $this->getTraceLine($backtrace) . PHP_EOL; } @@ -27,7 +28,7 @@ private function __construct() private function getTraceLine(array $backtrace): string { if (isset($backtrace['file'])) { - return ((string)$backtrace['file']) . ':' . ((string)$backtrace['line']); + return ((string) $backtrace['file']) . ':' . ((string) $backtrace['line']); } return $this->getTraceLineFromTestCase($backtrace); @@ -35,8 +36,8 @@ private function getTraceLine(array $backtrace): string private function getTraceLineFromTestCase(array $backtrace): string { - return ((string)$backtrace['class']) - . ((string)$backtrace['type']) - . ((string)$backtrace['function']); + return ((string) $backtrace['class']) + . ((string) $backtrace['type']) + . ((string) $backtrace['function']); } } diff --git a/tests/Integration/Framework/UsingConfig/LocalConfig/Config.php b/tests/Integration/Framework/UsingConfig/LocalConfig/Config.php index 8efcf7bc..e4e45778 100644 --- a/tests/Integration/Framework/UsingConfig/LocalConfig/Config.php +++ b/tests/Integration/Framework/UsingConfig/LocalConfig/Config.php @@ -11,10 +11,10 @@ final class Config extends AbstractConfig public function getArrayConfig(): array { return [ - 'config' => (int)$this->get('config'), - 'config_local' => (int)$this->get('config_local'), - 'override' => (int)$this->get('override'), - 'subfolder' => (int)$this->get('subfolder'), + 'config' => (int) $this->get('config'), + 'config_local' => (int) $this->get('config_local'), + 'override' => (int) $this->get('override'), + 'subfolder' => (int) $this->get('subfolder'), ]; } } diff --git a/tests/Unit/CodeGenerator/Domain/FilenameSanitizerTest.php b/tests/Unit/CodeGenerator/Domain/FilenameSanitizerTest.php index a766bd6c..f986a083 100644 --- a/tests/Unit/CodeGenerator/Domain/FilenameSanitizerTest.php +++ b/tests/Unit/CodeGenerator/Domain/FilenameSanitizerTest.php @@ -44,9 +44,13 @@ public function test_facade(string $filename): void public function providerFacade(): iterable { yield ['faca']; + yield ['facad']; + yield ['facade']; + yield ['Facade']; + yield ['cade']; } @@ -64,10 +68,15 @@ public function test_factory(string $filename): void public function providerFactory(): iterable { yield ['fact']; + yield ['facto']; + yield ['factor']; + yield ['factory']; + yield ['Factory']; + yield ['tory']; }