diff --git a/src-dev/CodeGen/CodeGenerator.php b/src-dev/CodeGen/CodeGenerator.php new file mode 100644 index 00000000..69007f32 --- /dev/null +++ b/src-dev/CodeGen/CodeGenerator.php @@ -0,0 +1,17 @@ + + */ + +declare(strict_types=1); + +namespace Respect\Dev\CodeGen; + +interface CodeGenerator +{ + /** @return array filename => content */ + public function generate(): array; +} diff --git a/src-dev/CodeGen/Config.php b/src-dev/CodeGen/Config.php new file mode 100644 index 00000000..af3a8864 --- /dev/null +++ b/src-dev/CodeGen/Config.php @@ -0,0 +1,23 @@ + + */ + +declare(strict_types=1); + +namespace Respect\Dev\CodeGen; + +final readonly class Config +{ + public function __construct( + public string $sourceDir, + public string $sourceNamespace, + public string $outputDir, + public string $outputNamespace, + public OutputFormatter $outputFormatter = new OutputFormatter(), + ) { + } +} diff --git a/src-dev/CodeGen/MethodBuilder.php b/src-dev/CodeGen/FluentBuilder/MethodBuilder.php similarity index 95% rename from src-dev/CodeGen/MethodBuilder.php rename to src-dev/CodeGen/FluentBuilder/MethodBuilder.php index 6f3fdfe0..72da8578 100644 --- a/src-dev/CodeGen/MethodBuilder.php +++ b/src-dev/CodeGen/FluentBuilder/MethodBuilder.php @@ -8,7 +8,7 @@ declare(strict_types=1); -namespace Respect\Dev\CodeGen; +namespace Respect\Dev\CodeGen\FluentBuilder; use Nette\PhpGenerator\Method; use Nette\PhpGenerator\PhpNamespace; @@ -41,13 +41,13 @@ final class MethodBuilder public function build( PhpNamespace $namespace, - ReflectionClass $validatorReflection, + ReflectionClass $nodeReflection, string $returnType, string|null $prefix = null, bool $static = false, ReflectionParameter|null $prefixParameter = null, ): Method { - $originalName = $validatorReflection->getShortName(); + $originalName = $nodeReflection->getShortName(); $name = $prefix ? $prefix . ucfirst($originalName) : lcfirst($originalName); $method = new Method($name); @@ -61,7 +61,7 @@ final class MethodBuilder $this->addPrefixParameter($method, $prefixParameter); } - $constructor = $validatorReflection->getConstructor(); + $constructor = $nodeReflection->getConstructor(); if ($constructor === null) { return $method; } diff --git a/src-dev/CodeGen/Attributes/Mixin.php b/src-dev/CodeGen/FluentBuilder/Mixin.php similarity index 93% rename from src-dev/CodeGen/Attributes/Mixin.php rename to src-dev/CodeGen/FluentBuilder/Mixin.php index 35586492..0e211711 100644 --- a/src-dev/CodeGen/Attributes/Mixin.php +++ b/src-dev/CodeGen/FluentBuilder/Mixin.php @@ -8,7 +8,7 @@ declare(strict_types=1); -namespace Respect\Dev\CodeGen\Attributes; +namespace Respect\Dev\CodeGen\FluentBuilder; use Attribute; diff --git a/src-dev/CodeGen/MixinGenerator.php b/src-dev/CodeGen/FluentBuilder/MixinGenerator.php similarity index 66% rename from src-dev/CodeGen/MixinGenerator.php rename to src-dev/CodeGen/FluentBuilder/MixinGenerator.php index dfb3c956..3f605873 100644 --- a/src-dev/CodeGen/MixinGenerator.php +++ b/src-dev/CodeGen/FluentBuilder/MixinGenerator.php @@ -8,42 +8,39 @@ declare(strict_types=1); -namespace Respect\Dev\CodeGen; +namespace Respect\Dev\CodeGen\FluentBuilder; -use DirectoryIterator; use Nette\PhpGenerator\PhpNamespace; use Nette\PhpGenerator\Printer; use ReflectionClass; use ReflectionParameter; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\CodeGenerator; +use Respect\Dev\CodeGen\Config; +use Respect\Dev\CodeGen\InterfaceConfig; +use Respect\Dev\CodeGen\NamespaceScanner; use function file_get_contents; use function in_array; use function is_file; use function is_readable; use function ksort; -use function sprintf; -final class MixinGenerator +final class MixinGenerator implements CodeGenerator { /** @param array $interfaces */ public function __construct( - private readonly string $sourceDir, - private readonly string $sourceNamespace, - private readonly string $outputDir, - private readonly string $outputNamespace, - private readonly array $interfaces, + private readonly Config $config, private readonly MethodBuilder $methodBuilder = new MethodBuilder(), - private readonly OutputFormatter $outputFormatter = new OutputFormatter(), + private readonly array $interfaces = [], ) { } /** @return array filename => content */ public function generate(): array { - $validators = $this->scanValidators(); - $prefixes = $this->discoverPrefixes($validators); - $filters = $this->discoverFilters($validators); + $nodes = NamespaceScanner::scan($this->config->sourceDir, $this->config->sourceNamespace); + $prefixes = $this->discoverPrefixes($nodes); + $filters = $this->discoverFilters($nodes); $files = []; @@ -52,12 +49,12 @@ final class MixinGenerator foreach ($prefixes as $prefix) { $interfaceName = $prefix['name'] . $interfaceConfig->suffix; - $prefixInterfaceNames[] = $this->outputNamespace . '\\' . $interfaceName; + $prefixInterfaceNames[] = $this->config->outputNamespace . '\\' . $interfaceName; $this->generateInterface( $interfaceName, $interfaceConfig, - $validators, + $nodes, $filters, $prefix, $files, @@ -67,7 +64,7 @@ final class MixinGenerator $this->generateRootInterface( $interfaceConfig, $prefixInterfaceNames, - $validators, + $nodes, $filters, $files, ); @@ -76,41 +73,16 @@ final class MixinGenerator return $files; } - /** @return array */ - private function scanValidators(): array - { - $validators = []; - - foreach (new DirectoryIterator($this->sourceDir) as $file) { - if (!$file->isFile()) { - continue; - } - - $className = $this->sourceNamespace . '\\' . $file->getBasename('.php'); - $reflection = new ReflectionClass($className); - - if ($reflection->isAbstract()) { - continue; - } - - $validators[$reflection->getShortName()] = $reflection; - } - - ksort($validators); - - return $validators; - } - /** - * @param array $validators + * @param array $nodes * * @return array */ - private function discoverPrefixes(array $validators): array + private function discoverPrefixes(array $nodes): array { $prefixes = []; - foreach ($validators as $reflection) { + foreach ($nodes as $reflection) { $attributes = $reflection->getAttributes(Mixin::class); if ($attributes === []) { continue; @@ -121,14 +93,13 @@ final class MixinGenerator continue; } + $constructor = $reflection->getConstructor(); $prefixParameter = null; - if ($mixin->prefixParameter) { - $constructor = $reflection->getConstructor(); - if ($constructor !== null) { - $params = $constructor->getParameters(); - if ($params !== []) { - $prefixParameter = $params[0]; - } + + if ($mixin->prefixParameter && $constructor !== null) { + $parameters = $constructor->getParameters(); + if ($parameters !== []) { + $prefixParameter = $parameters[0]; } } @@ -146,15 +117,15 @@ final class MixinGenerator } /** - * @param array $validators + * @param array $nodes * * @return array */ - private function discoverFilters(array $validators): array + private function discoverFilters(array $nodes): array { $filters = []; - foreach ($validators as $name => $reflection) { + foreach ($nodes as $name => $reflection) { $attributes = $reflection->getAttributes(Mixin::class); if ($attributes === []) { continue; @@ -167,7 +138,7 @@ final class MixinGenerator } /** - * @param array $validators + * @param array $nodes * @param array $filters * @param array{name: string, prefix: string, requireInclusion: bool, prefixParameter: ?ReflectionParameter} $prefix * @param array $files @@ -175,15 +146,15 @@ final class MixinGenerator private function generateInterface( string $interfaceName, InterfaceConfig $config, - array $validators, + array $nodes, array $filters, array $prefix, array &$files, ): void { - $namespace = new PhpNamespace($this->outputNamespace); + $namespace = new PhpNamespace($this->config->outputNamespace); $interface = $namespace->addInterface($interfaceName); - foreach ($validators as $name => $reflection) { + foreach ($nodes as $name => $reflection) { $mixin = $filters[$name] ?? null; if ($prefix['requireInclusion']) { @@ -211,27 +182,29 @@ final class MixinGenerator /** * @param array $prefixInterfaceNames - * @param array $validators + * @param array $nodes * @param array $filters * @param array $files */ private function generateRootInterface( InterfaceConfig $config, array $prefixInterfaceNames, - array $validators, + array $nodes, array $filters, array &$files, ): void { $interfaceName = $config->suffix; - $namespace = new PhpNamespace($this->outputNamespace); + $namespace = new PhpNamespace($this->config->outputNamespace); $interface = $namespace->addInterface($interfaceName); foreach ($config->rootExtends as $extend) { + $namespace->addUse($extend); $interface->addExtend($extend); } - foreach ($prefixInterfaceNames as $prefixInterface) { - $interface->addExtend($prefixInterface); + foreach ($prefixInterfaceNames as $prefixInterfaceName) { + $namespace->addUse($prefixInterfaceName); + $interface->addExtend($prefixInterfaceName); } if ($config->rootComment !== null) { @@ -242,7 +215,7 @@ final class MixinGenerator $namespace->addUse($use); } - foreach ($validators as $reflection) { + foreach ($nodes as $reflection) { $method = $this->methodBuilder->build( $namespace, $reflection, @@ -260,16 +233,17 @@ final class MixinGenerator /** @param array $files */ private function addFile(string $interfaceName, PhpNamespace $namespace, array &$files): void { + $filename = $this->config->outputDir . '/' . $interfaceName . '.php'; + $printer = new Printer(); $printer->wrapLength = 300; - $filename = sprintf('%s/%s.php', $this->outputDir, $interfaceName); $existingContent = ''; if (is_file($filename) && is_readable($filename)) { $existingContent = file_get_contents($filename) ?: ''; } - $formattedContent = $this->outputFormatter->format( + $formattedContent = $this->config->outputFormatter->format( $printer->printNamespace($namespace), $existingContent, ); diff --git a/src-dev/CodeGen/FluentBuilder/PrefixMapGenerator.php b/src-dev/CodeGen/FluentBuilder/PrefixMapGenerator.php new file mode 100644 index 00000000..a91a9c63 --- /dev/null +++ b/src-dev/CodeGen/FluentBuilder/PrefixMapGenerator.php @@ -0,0 +1,160 @@ + + */ + +declare(strict_types=1); + +namespace Respect\Dev\CodeGen\FluentBuilder; + +use Nette\PhpGenerator\PhpNamespace; +use Nette\PhpGenerator\Printer; +use ReflectionClass; +use Respect\Dev\CodeGen\CodeGenerator; +use Respect\Dev\CodeGen\Config; +use Respect\Dev\CodeGen\NamespaceScanner; + +use function array_keys; +use function ctype_upper; +use function file_get_contents; +use function is_file; +use function is_readable; +use function ksort; +use function lcfirst; +use function str_starts_with; +use function strlen; +use function uksort; + +final class PrefixMapGenerator implements CodeGenerator +{ + public function __construct( + private readonly Config $config, + private readonly string $outputClassName, + ) { + } + + /** @return array filename => content */ + public function generate(): array + { + $nodes = NamespaceScanner::scan($this->config->sourceDir, $this->config->sourceNamespace); + $prefixes = $this->discoverPrefixes($nodes); + $composable = $this->buildComposable($nodes, $prefixes); + $composableWithArgument = $this->buildComposableWithArgument($prefixes); + + $namespace = new PhpNamespace($this->config->outputNamespace); + $class = $namespace->addClass($this->outputClassName); + $class->setFinal(); + + $class->addConstant('COMPOSABLE', $composable)->setPublic()->setType('array'); + $class->addConstant('COMPOSABLE_WITH_ARGUMENT', $composableWithArgument)->setPublic()->setType('array'); + + $printer = new Printer(); + $printer->wrapLength = 300; + + $outputFile = $this->config->outputDir . '/' . $this->outputClassName . '.php'; + + $existingContent = ''; + if (is_file($outputFile) && is_readable($outputFile)) { + $existingContent = file_get_contents($outputFile) ?: ''; + } + + $formattedContent = $this->config->outputFormatter->format( + $printer->printNamespace($namespace), + $existingContent, + ); + + return [$outputFile => $formattedContent]; + } + + /** + * @param array $nodes + * + * @return array + */ + private function discoverPrefixes(array $nodes): array + { + $prefixes = []; + + foreach ($nodes as $reflection) { + $attributes = $reflection->getAttributes(Mixin::class); + if ($attributes === []) { + continue; + } + + $mixin = $attributes[0]->newInstance(); + if ($mixin->prefix === null) { + continue; + } + + $prefixes[$mixin->prefix] = [ + 'prefix' => $mixin->prefix, + 'prefixParameter' => $mixin->prefixParameter, + ]; + } + + ksort($prefixes); + + return $prefixes; + } + + /** + * @param array $nodes + * @param array $prefixes + * + * @return array + */ + private function buildComposable(array $nodes, array $prefixes): array + { + $composable = []; + + foreach (array_keys($prefixes) as $prefix) { + $composable[$prefix] = true; + + foreach (array_keys($nodes) as $name) { + $lcName = lcfirst($name); + if ($lcName === $prefix) { + continue; + } + + if (!str_starts_with($lcName, $prefix)) { + continue; + } + + if (!ctype_upper($lcName[strlen($prefix)])) { + continue; + } + + $composable[$lcName] = true; + } + } + + uksort($composable, static fn(string $a, string $b): int => strlen($b) <=> strlen($a) ?: $a <=> $b); + + return $composable; + } + + /** + * @param array $prefixes + * + * @return array + */ + private function buildComposableWithArgument(array $prefixes): array + { + $composableWithArgument = []; + + foreach ($prefixes as $prefix => $info) { + if (!$info['prefixParameter']) { + continue; + } + + $composableWithArgument[$prefix] = true; + } + + ksort($composableWithArgument); + + return $composableWithArgument; + } +} diff --git a/src-dev/CodeGen/NamespaceScanner.php b/src-dev/CodeGen/NamespaceScanner.php new file mode 100644 index 00000000..5f9066aa --- /dev/null +++ b/src-dev/CodeGen/NamespaceScanner.php @@ -0,0 +1,44 @@ + + */ + +declare(strict_types=1); + +namespace Respect\Dev\CodeGen; + +use DirectoryIterator; +use ReflectionClass; + +use function ksort; + +final class NamespaceScanner +{ + /** @return array */ + public static function scan(string $directory, string $namespace): array + { + $nodes = []; + + foreach (new DirectoryIterator($directory) as $file) { + if (!$file->isFile()) { + continue; + } + + $className = $namespace . '\\' . $file->getBasename('.php'); + $reflection = new ReflectionClass($className); + + if ($reflection->isAbstract()) { + continue; + } + + $nodes[$reflection->getShortName()] = $reflection; + } + + ksort($nodes); + + return $nodes; + } +} diff --git a/src-dev/CodeGen/OutputFormatter.php b/src-dev/CodeGen/OutputFormatter.php index 9b4d4870..9b9066ce 100644 --- a/src-dev/CodeGen/OutputFormatter.php +++ b/src-dev/CodeGen/OutputFormatter.php @@ -27,7 +27,7 @@ final class OutputFormatter $existingHeader = $matches[0] ?? ''; $replacements = [ - '/\n\n\t(public|\/\*\*)/m' => PHP_EOL . ' $1', + '/\n\n\t(public|private|\/\*\*)/m' => PHP_EOL . ' $1', '/\t/m' => ' ', '/\?([a-zA-Z]+) \$/' => '$1|null $', '/\/\*\*\n +\* (.+)\n +\*\//m' => '/** $1 */', diff --git a/src-dev/Commands/LintMixinCommand.php b/src-dev/Commands/LintMixinCommand.php index 46a09562..d9c6828d 100644 --- a/src-dev/Commands/LintMixinCommand.php +++ b/src-dev/Commands/LintMixinCommand.php @@ -11,9 +11,11 @@ declare(strict_types=1); namespace Respect\Dev\Commands; +use Respect\Dev\CodeGen\Config; +use Respect\Dev\CodeGen\FluentBuilder\MethodBuilder; +use Respect\Dev\CodeGen\FluentBuilder\MixinGenerator; +use Respect\Dev\CodeGen\FluentBuilder\PrefixMapGenerator; use Respect\Dev\CodeGen\InterfaceConfig; -use Respect\Dev\CodeGen\MethodBuilder; -use Respect\Dev\CodeGen\MixinGenerator; use Respect\Dev\Differ\ConsoleDiffer; use Respect\Dev\Differ\Item; use Respect\Validation\Mixins\Chain; @@ -58,11 +60,15 @@ final class LintMixinCommand extends Command { $srcDir = dirname(__DIR__, 2) . '/src'; - $generator = new MixinGenerator( + $config = new Config( sourceDir: $srcDir . '/Validators', sourceNamespace: 'Respect\\Validation\\Validators', outputDir: $srcDir . '/Mixins', outputNamespace: 'Respect\\Validation\\Mixins', + ); + + $generator = new MixinGenerator( + config: $config, methodBuilder: new MethodBuilder( excludedTypePrefixes: ['Sokil', 'Egulias'], excludedTypeNames: ['finfo'], @@ -83,7 +89,12 @@ final class LintMixinCommand extends Command ], ); - $files = $generator->generate(); + $prefixMapGenerator = new PrefixMapGenerator( + config: $config, + outputClassName: 'PrefixMap', + ); + + $files = $generator->generate() + $prefixMapGenerator->generate(); $updatableFiles = []; foreach ($files as $filename => $content) { diff --git a/src/Mixins/PrefixMap.php b/src/Mixins/PrefixMap.php new file mode 100644 index 00000000..d27356be --- /dev/null +++ b/src/Mixins/PrefixMap.php @@ -0,0 +1,33 @@ + + */ + +declare(strict_types=1); + +namespace Respect\Validation\Mixins; + +final class PrefixMap +{ + public const array COMPOSABLE = [ + 'propertyOptional' => true, + 'propertyExists' => true, + 'keyOptional' => true, + 'keyExists' => true, + 'property' => true, + 'undefOr' => true, + 'keySet' => true, + 'length' => true, + 'nullOr' => true, + 'allOf' => true, + 'all' => true, + 'key' => true, + 'max' => true, + 'min' => true, + 'not' => true, + ]; + public const array COMPOSABLE_WITH_ARGUMENT = ['key' => true, 'property' => true]; +} diff --git a/src/Transformers/Prefix.php b/src/Transformers/Prefix.php index b04e8f46..d6205bb8 100644 --- a/src/Transformers/Prefix.php +++ b/src/Transformers/Prefix.php @@ -11,6 +11,8 @@ declare(strict_types=1); namespace Respect\Validation\Transformers; +use Respect\Validation\Mixins\PrefixMap; + use function array_keys; use function array_slice; use function implode; @@ -19,31 +21,6 @@ use function sprintf; final class Prefix implements Transformer { - private const array RULES_THAT_PREFIX_OR_STAND_ALONE = [ - 'all' => true, - 'allOf' => true, - 'emoji' => true, - 'key' => true, - 'keyExists' => true, - 'keyOptional' => true, - 'keySet' => true, - 'length' => true, - 'max' => true, - 'maxAge' => true, - 'min' => true, - 'minAge' => true, - 'not' => true, - 'nullOr' => true, - 'property' => true, - 'propertyExists' => true, - 'propertyOptional' => true, - 'undefOr' => true, - ]; - private const array RULES_THAT_USE_SUFFIX_AS_ARGUMENT = [ - 'key' => true, - 'property' => true, - ]; - private static string|null $regex = null; public function transform(ValidatorSpec $validatorSpec): ValidatorSpec @@ -53,38 +30,42 @@ final class Prefix implements Transformer return $validatorSpec; } - if (!isset(self::RULES_THAT_USE_SUFFIX_AS_ARGUMENT[$matches['name']])) { + if (!isset(PrefixMap::COMPOSABLE_WITH_ARGUMENT[$matches['prefix']])) { return new ValidatorSpec( - $matches['rest'], + $matches['suffix'], $validatorSpec->arguments, - new ValidatorSpec($matches['name']), + new ValidatorSpec($matches['prefix']), ); } return new ValidatorSpec( - $matches['rest'], + $matches['suffix'], array_slice($validatorSpec->arguments, 1), - new ValidatorSpec($matches['name'], [$validatorSpec->arguments[0]]), + new ValidatorSpec($matches['prefix'], [$validatorSpec->arguments[0]]), ); } - /** @return array{}|array{name: string, rest: string} */ + /** @return array{}|array{prefix: string, suffix: string} */ private function match(ValidatorSpec $validatorSpec): array { - if ($validatorSpec->wrapper !== null || isset(self::RULES_THAT_PREFIX_OR_STAND_ALONE[$validatorSpec->name])) { + if ($validatorSpec->wrapper !== null || isset(PrefixMap::COMPOSABLE[$validatorSpec->name])) { return []; } preg_match(self::getRegex(), $validatorSpec->name, $matches); - return $matches; + if ($matches === []) { + return []; + } + + return ['prefix' => $matches['prefix'], 'suffix' => $matches['suffix']]; } private static function getRegex(): string { return self::$regex ?? self::$regex = sprintf( - '/^(?%s)(?.+)$/', - implode('|', array_keys(self::RULES_THAT_PREFIX_OR_STAND_ALONE)), + '/^(?%s)(?.+)$/', + implode('|', array_keys(PrefixMap::COMPOSABLE)), ); } } diff --git a/src/Validators/All.php b/src/Validators/All.php index 4fff00f1..6a7d728b 100644 --- a/src/Validators/All.php +++ b/src/Validators/All.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Helpers\CanEvaluateShortCircuit; use Respect\Validation\Message\Template; use Respect\Validation\Path; diff --git a/src/Validators/Attributes.php b/src/Validators/Attributes.php index 36873c49..78ff9058 100644 --- a/src/Validators/Attributes.php +++ b/src/Validators/Attributes.php @@ -17,7 +17,7 @@ use ReflectionAttribute; use ReflectionClass; use ReflectionObject; use ReflectionProperty; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Id; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/Between.php b/src/Validators/Between.php index c3ffac4c..7ef768e2 100644 --- a/src/Validators/Between.php +++ b/src/Validators/Between.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Helpers\CanCompareValues; use Respect\Validation\Message\Template; diff --git a/src/Validators/BetweenExclusive.php b/src/Validators/BetweenExclusive.php index bf828f66..41ee5221 100644 --- a/src/Validators/BetweenExclusive.php +++ b/src/Validators/BetweenExclusive.php @@ -12,7 +12,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Helpers\CanCompareValues; use Respect\Validation\Message\Template; diff --git a/src/Validators/Blank.php b/src/Validators/Blank.php index 3e7e988e..067864ce 100644 --- a/src/Validators/Blank.php +++ b/src/Validators/Blank.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/Equals.php b/src/Validators/Equals.php index 1fae4f1a..d998f5df 100644 --- a/src/Validators/Equals.php +++ b/src/Validators/Equals.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/Equivalent.php b/src/Validators/Equivalent.php index 506312a5..fc3cf624 100644 --- a/src/Validators/Equivalent.php +++ b/src/Validators/Equivalent.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Comparison; diff --git a/src/Validators/Even.php b/src/Validators/Even.php index 7e26b97f..5208abf9 100644 --- a/src/Validators/Even.php +++ b/src/Validators/Even.php @@ -18,7 +18,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; diff --git a/src/Validators/Exists.php b/src/Validators/Exists.php index aec08391..dee5bab9 100644 --- a/src/Validators/Exists.php +++ b/src/Validators/Exists.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; use SplFileInfo; diff --git a/src/Validators/Factor.php b/src/Validators/Factor.php index 0ea328bc..bfdcdcac 100644 --- a/src/Validators/Factor.php +++ b/src/Validators/Factor.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/Finite.php b/src/Validators/Finite.php index 4016a639..9c917861 100644 --- a/src/Validators/Finite.php +++ b/src/Validators/Finite.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; diff --git a/src/Validators/Formatted.php b/src/Validators/Formatted.php index e47e9c1e..23696da5 100644 --- a/src/Validators/Formatted.php +++ b/src/Validators/Formatted.php @@ -11,7 +11,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\StringFormatter\Formatter; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/GreaterThan.php b/src/Validators/GreaterThan.php index d3065fac..cafa657b 100644 --- a/src/Validators/GreaterThan.php +++ b/src/Validators/GreaterThan.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Comparison; diff --git a/src/Validators/GreaterThanOrEqual.php b/src/Validators/GreaterThanOrEqual.php index 979787cc..0d273fc2 100644 --- a/src/Validators/GreaterThanOrEqual.php +++ b/src/Validators/GreaterThanOrEqual.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Comparison; diff --git a/src/Validators/Identical.php b/src/Validators/Identical.php index 3296a770..25380531 100644 --- a/src/Validators/Identical.php +++ b/src/Validators/Identical.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/In.php b/src/Validators/In.php index 97e45d5b..53d46d9b 100644 --- a/src/Validators/In.php +++ b/src/Validators/In.php @@ -16,7 +16,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/Infinite.php b/src/Validators/Infinite.php index 599025c8..34bcc67c 100644 --- a/src/Validators/Infinite.php +++ b/src/Validators/Infinite.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; diff --git a/src/Validators/Key.php b/src/Validators/Key.php index 7fbc0c20..f7ac017c 100644 --- a/src/Validators/Key.php +++ b/src/Validators/Key.php @@ -16,7 +16,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Path; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/KeyExists.php b/src/Validators/KeyExists.php index 9be18330..c8e0a73a 100644 --- a/src/Validators/KeyExists.php +++ b/src/Validators/KeyExists.php @@ -13,7 +13,7 @@ namespace Respect\Validation\Validators; use ArrayAccess; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Path; use Respect\Validation\Result; diff --git a/src/Validators/KeyOptional.php b/src/Validators/KeyOptional.php index 6822bf48..3bd94596 100644 --- a/src/Validators/KeyOptional.php +++ b/src/Validators/KeyOptional.php @@ -13,7 +13,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Result; use Respect\Validation\Validator; use Respect\Validation\Validators\Core\KeyRelated; diff --git a/src/Validators/KeySet.php b/src/Validators/KeySet.php index 9e25c435..499a6623 100644 --- a/src/Validators/KeySet.php +++ b/src/Validators/KeySet.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Helpers\CanEvaluateShortCircuit; use Respect\Validation\Message\Template; diff --git a/src/Validators/Length.php b/src/Validators/Length.php index 0f594c72..feafa0ee 100644 --- a/src/Validators/Length.php +++ b/src/Validators/Length.php @@ -20,7 +20,7 @@ namespace Respect\Validation\Validators; use Attribute; use Countable as PhpCountable; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/LessThan.php b/src/Validators/LessThan.php index afe61bfa..eb2039b6 100644 --- a/src/Validators/LessThan.php +++ b/src/Validators/LessThan.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Comparison; diff --git a/src/Validators/LessThanOrEqual.php b/src/Validators/LessThanOrEqual.php index 1d50b4a7..7734befb 100644 --- a/src/Validators/LessThanOrEqual.php +++ b/src/Validators/LessThanOrEqual.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Comparison; diff --git a/src/Validators/Max.php b/src/Validators/Max.php index 6f1ed353..9d89607b 100644 --- a/src/Validators/Max.php +++ b/src/Validators/Max.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validators\Core\FilteredArray; diff --git a/src/Validators/Min.php b/src/Validators/Min.php index f246e86d..9083b43c 100644 --- a/src/Validators/Min.php +++ b/src/Validators/Min.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validators\Core\FilteredArray; diff --git a/src/Validators/Multiple.php b/src/Validators/Multiple.php index c7986ad7..e780ff80 100644 --- a/src/Validators/Multiple.php +++ b/src/Validators/Multiple.php @@ -17,7 +17,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/Named.php b/src/Validators/Named.php index bf2f2d34..db58b9dc 100644 --- a/src/Validators/Named.php +++ b/src/Validators/Named.php @@ -12,7 +12,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Name; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/Not.php b/src/Validators/Not.php index 84ff7177..1026bb6c 100644 --- a/src/Validators/Not.php +++ b/src/Validators/Not.php @@ -18,7 +18,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/NullOr.php b/src/Validators/NullOr.php index 24584ce3..9b02f150 100644 --- a/src/Validators/NullOr.php +++ b/src/Validators/NullOr.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/Odd.php b/src/Validators/Odd.php index 6d6735c9..bc0331fd 100644 --- a/src/Validators/Odd.php +++ b/src/Validators/Odd.php @@ -17,7 +17,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; diff --git a/src/Validators/Positive.php b/src/Validators/Positive.php index ddc687dc..748180d6 100644 --- a/src/Validators/Positive.php +++ b/src/Validators/Positive.php @@ -15,7 +15,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; diff --git a/src/Validators/Property.php b/src/Validators/Property.php index 58d3d79a..023ab0e7 100644 --- a/src/Validators/Property.php +++ b/src/Validators/Property.php @@ -19,7 +19,7 @@ namespace Respect\Validation\Validators; use Attribute; use ReflectionClass; use ReflectionObject; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Path; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/PropertyExists.php b/src/Validators/PropertyExists.php index 856ea0f8..efa55c00 100644 --- a/src/Validators/PropertyExists.php +++ b/src/Validators/PropertyExists.php @@ -14,7 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; use ReflectionClass; use ReflectionObject; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Message\Template; use Respect\Validation\Path; use Respect\Validation\Result; diff --git a/src/Validators/PropertyOptional.php b/src/Validators/PropertyOptional.php index 932f6cd2..56ed4f54 100644 --- a/src/Validators/PropertyOptional.php +++ b/src/Validators/PropertyOptional.php @@ -13,7 +13,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/Templated.php b/src/Validators/Templated.php index d647690a..4e02ff84 100644 --- a/src/Validators/Templated.php +++ b/src/Validators/Templated.php @@ -12,7 +12,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Result; use Respect\Validation\Validator; diff --git a/src/Validators/Undef.php b/src/Validators/Undef.php index 3b004539..2ea85a48 100644 --- a/src/Validators/Undef.php +++ b/src/Validators/Undef.php @@ -16,7 +16,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Helpers\CanValidateUndefined; use Respect\Validation\Message\Template; use Respect\Validation\Result; diff --git a/src/Validators/UndefOr.php b/src/Validators/UndefOr.php index 6cbfe825..576fd2de 100644 --- a/src/Validators/UndefOr.php +++ b/src/Validators/UndefOr.php @@ -13,7 +13,7 @@ declare(strict_types=1); namespace Respect\Validation\Validators; use Attribute; -use Respect\Dev\CodeGen\Attributes\Mixin; +use Respect\Dev\CodeGen\FluentBuilder\Mixin; use Respect\Validation\Helpers\CanValidateUndefined; use Respect\Validation\Message\Template; use Respect\Validation\Result; diff --git a/tests/unit/Transformers/PrefixTest.php b/tests/unit/Transformers/PrefixTest.php index 30119238..9fedb4d5 100644 --- a/tests/unit/Transformers/PrefixTest.php +++ b/tests/unit/Transformers/PrefixTest.php @@ -91,9 +91,7 @@ final class PrefixTest extends TestCase 'keySet' => ['keySet'], 'length' => ['length'], 'max' => ['max'], - 'maxAge' => ['maxAge'], 'min' => ['min'], - 'minAge' => ['minAge'], 'not' => ['not'], 'undef' => ['undef'], 'property' => ['property'],