From 692d317cbe29f7aabae9e40364d90a4fd6100e49 Mon Sep 17 00:00:00 2001 From: Henrique Moody Date: Mon, 12 Feb 2024 20:05:00 +0100 Subject: [PATCH] Update the validation engine of filter-based rules While I migrate them, I also renamed "AbstractFilterRule" to "Filter" because that's a much simpler name, and I would like to stop having "Abstract" and "Interfaces" as part of the name of the classes. Signed-off-by: Henrique Moody --- library/Rules/Alnum.php | 4 +-- library/Rules/Alpha.php | 4 +-- library/Rules/Consonant.php | 4 +-- library/Rules/Control.php | 4 +-- library/Rules/Digit.php | 4 +-- .../{AbstractFilterRule.php => Filter.php} | 30 +++++++------------ library/Rules/Graph.php | 4 +-- library/Rules/Luhn.php | 2 +- library/Rules/Printable.php | 4 +-- library/Rules/Punct.php | 4 +-- library/Rules/Space.php | 4 +-- library/Rules/Vowel.php | 4 +-- library/Rules/Xdigit.php | 4 +-- tests/unit/Rules/AlnumTest.php | 1 - tests/unit/Rules/AlphaTest.php | 1 - tests/unit/Rules/ConsonantTest.php | 1 - tests/unit/Rules/ControlTest.php | 1 - tests/unit/Rules/DigitTest.php | 1 - tests/unit/Rules/GraphTest.php | 1 - tests/unit/Rules/PrintableTest.php | 1 - tests/unit/Rules/PunctTest.php | 1 - tests/unit/Rules/SpaceTest.php | 1 - tests/unit/Rules/VowelTest.php | 1 - tests/unit/Rules/XdigitTest.php | 1 - 24 files changed, 34 insertions(+), 53 deletions(-) rename library/Rules/{AbstractFilterRule.php => Filter.php} (54%) diff --git a/library/Rules/Alnum.php b/library/Rules/Alnum.php index 1820a44dc..a1fd3c2c5 100644 --- a/library/Rules/Alnum.php +++ b/library/Rules/Alnum.php @@ -23,9 +23,9 @@ '{{name}} must not contain letters (a-z), digits (0-9) or {{additionalChars}}', self::TEMPLATE_EXTRA, )] -final class Alnum extends AbstractFilterRule +final class Alnum extends Filter { - protected function validateFilteredInput(string $input): bool + protected function isValid(string $input): bool { return ctype_alnum($input); } diff --git a/library/Rules/Alpha.php b/library/Rules/Alpha.php index 17c4abf06..38c4a15ab 100644 --- a/library/Rules/Alpha.php +++ b/library/Rules/Alpha.php @@ -23,9 +23,9 @@ '{{name}} must not contain letters (a-z) or {{additionalChars}}', self::TEMPLATE_EXTRA, )] -final class Alpha extends AbstractFilterRule +final class Alpha extends Filter { - protected function validateFilteredInput(string $input): bool + protected function isValid(string $input): bool { return ctype_alpha($input); } diff --git a/library/Rules/Consonant.php b/library/Rules/Consonant.php index 3f02ea98c..4893cc195 100644 --- a/library/Rules/Consonant.php +++ b/library/Rules/Consonant.php @@ -23,9 +23,9 @@ '{{name}} must not contain consonants or {{additionalChars}}', self::TEMPLATE_EXTRA, )] -final class Consonant extends AbstractFilterRule +final class Consonant extends Filter { - protected function validateFilteredInput(string $input): bool + protected function isValid(string $input): bool { return preg_match('/^(\s|[b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z])*$/', $input) > 0; } diff --git a/library/Rules/Control.php b/library/Rules/Control.php index f74568a5f..0cf29e398 100644 --- a/library/Rules/Control.php +++ b/library/Rules/Control.php @@ -23,9 +23,9 @@ '{{name}} must not contain control characters or {{additionalChars}}', self::TEMPLATE_EXTRA, )] -final class Control extends AbstractFilterRule +final class Control extends Filter { - protected function validateFilteredInput(string $input): bool + protected function isValid(string $input): bool { return ctype_cntrl($input); } diff --git a/library/Rules/Digit.php b/library/Rules/Digit.php index 3296fe4c2..20aae08a6 100644 --- a/library/Rules/Digit.php +++ b/library/Rules/Digit.php @@ -23,9 +23,9 @@ '{{name}} must not contain digits (0-9) and {{additionalChars}}', self::TEMPLATE_EXTRA, )] -final class Digit extends AbstractFilterRule +final class Digit extends Filter { - protected function validateFilteredInput(string $input): bool + protected function isValid(string $input): bool { return ctype_digit($input); } diff --git a/library/Rules/AbstractFilterRule.php b/library/Rules/Filter.php similarity index 54% rename from library/Rules/AbstractFilterRule.php rename to library/Rules/Filter.php index 0befc37f0..41909325c 100644 --- a/library/Rules/AbstractFilterRule.php +++ b/library/Rules/Filter.php @@ -9,51 +9,43 @@ namespace Respect\Validation\Rules; +use Respect\Validation\Result; + use function implode; use function is_scalar; use function str_replace; use function str_split; -abstract class AbstractFilterRule extends AbstractRule +abstract class Filter extends Standard { public const TEMPLATE_EXTRA = '__extra__'; private readonly string $additionalChars; - abstract protected function validateFilteredInput(string $input): bool; + abstract protected function isValid(string $input): bool; public function __construct(string ...$additionalChars) { $this->additionalChars = implode($additionalChars); } - public function validate(mixed $input): bool + public function evaluate(mixed $input): Result { + $template = $this->additionalChars ? self::TEMPLATE_EXTRA : self::TEMPLATE_STANDARD; + $parameters = $this->additionalChars ? ['additionalChars' => $this->additionalChars] : []; if (!is_scalar($input)) { - return false; + return Result::failed($input, $this, $template)->withParameters($parameters); } $stringInput = (string) $input; if ($stringInput === '') { - return false; + return Result::failed($input, $this, $template)->withParameters($parameters); } $filteredInput = $this->filter($stringInput); + $isValid = $filteredInput === '' || $this->isValid($filteredInput); - return $filteredInput === '' || $this->validateFilteredInput($filteredInput); - } - - /** - * @return array - */ - public function getParams(): array - { - return ['additionalChars' => $this->additionalChars]; - } - - protected function getStandardTemplate(mixed $input): string - { - return $this->additionalChars ? self::TEMPLATE_EXTRA : self::TEMPLATE_STANDARD; + return new Result($isValid, $input, $this, $template, $parameters); } private function filter(string $input): string diff --git a/library/Rules/Graph.php b/library/Rules/Graph.php index f3363fff6..a470c54f8 100644 --- a/library/Rules/Graph.php +++ b/library/Rules/Graph.php @@ -23,9 +23,9 @@ '{{name}} must not contain graphical characters or {{additionalChars}}', self::TEMPLATE_EXTRA, )] -final class Graph extends AbstractFilterRule +final class Graph extends Filter { - protected function validateFilteredInput(string $input): bool + protected function isValid(string $input): bool { return ctype_graph($input); } diff --git a/library/Rules/Luhn.php b/library/Rules/Luhn.php index 4c66b65a0..e439a88c3 100644 --- a/library/Rules/Luhn.php +++ b/library/Rules/Luhn.php @@ -26,7 +26,7 @@ final class Luhn extends Simple { public function validate(mixed $input): bool { - if (!(new Digit())->validate($input)) { + if (!(new Digit())->evaluate($input)->isValid) { return false; } diff --git a/library/Rules/Printable.php b/library/Rules/Printable.php index 8eea86df5..de2a38633 100644 --- a/library/Rules/Printable.php +++ b/library/Rules/Printable.php @@ -23,9 +23,9 @@ '{{name}} must not contain printable characters or {{additionalChars}}', self::TEMPLATE_EXTRA, )] -final class Printable extends AbstractFilterRule +final class Printable extends Filter { - protected function validateFilteredInput(string $input): bool + protected function isValid(string $input): bool { return ctype_print($input); } diff --git a/library/Rules/Punct.php b/library/Rules/Punct.php index 0d0e9b779..3f3515336 100644 --- a/library/Rules/Punct.php +++ b/library/Rules/Punct.php @@ -23,9 +23,9 @@ '{{name}} must not contain punctuation characters or {{additionalChars}}', self::TEMPLATE_EXTRA, )] -final class Punct extends AbstractFilterRule +final class Punct extends Filter { - protected function validateFilteredInput(string $input): bool + protected function isValid(string $input): bool { return ctype_punct($input); } diff --git a/library/Rules/Space.php b/library/Rules/Space.php index 50ed91c8f..aa6dacabb 100644 --- a/library/Rules/Space.php +++ b/library/Rules/Space.php @@ -23,9 +23,9 @@ '{{name}} must not contain space characters or {{additionalChars}}', self::TEMPLATE_EXTRA, )] -final class Space extends AbstractFilterRule +final class Space extends Filter { - protected function validateFilteredInput(string $input): bool + protected function isValid(string $input): bool { return ctype_space($input); } diff --git a/library/Rules/Vowel.php b/library/Rules/Vowel.php index 7e903bb56..be1c4929c 100644 --- a/library/Rules/Vowel.php +++ b/library/Rules/Vowel.php @@ -23,9 +23,9 @@ '{{name}} must not contain vowels or {{additionalChars}}', self::TEMPLATE_EXTRA, )] -final class Vowel extends AbstractFilterRule +final class Vowel extends Filter { - protected function validateFilteredInput(string $input): bool + protected function isValid(string $input): bool { return preg_match('/^[aeiouAEIOU]+$/', $input) > 0; } diff --git a/library/Rules/Xdigit.php b/library/Rules/Xdigit.php index 53bd4279e..55c6c308b 100644 --- a/library/Rules/Xdigit.php +++ b/library/Rules/Xdigit.php @@ -23,9 +23,9 @@ '{{name}} must not contain hexadecimal digits or {{additionalChars}}', self::TEMPLATE_EXTRA, )] -final class Xdigit extends AbstractFilterRule +final class Xdigit extends Filter { - protected function validateFilteredInput(string $input): bool + protected function isValid(string $input): bool { return ctype_xdigit($input); } diff --git a/tests/unit/Rules/AlnumTest.php b/tests/unit/Rules/AlnumTest.php index a3db6495e..0d3829d99 100644 --- a/tests/unit/Rules/AlnumTest.php +++ b/tests/unit/Rules/AlnumTest.php @@ -15,7 +15,6 @@ use stdClass; #[Group('rule')] -#[CoversClass(AbstractFilterRule::class)] #[CoversClass(Alnum::class)] final class AlnumTest extends RuleTestCase { diff --git a/tests/unit/Rules/AlphaTest.php b/tests/unit/Rules/AlphaTest.php index 2a4d720e2..443b0a000 100644 --- a/tests/unit/Rules/AlphaTest.php +++ b/tests/unit/Rules/AlphaTest.php @@ -15,7 +15,6 @@ use stdClass; #[Group('rule')] -#[CoversClass(AbstractFilterRule::class)] #[CoversClass(Alpha::class)] final class AlphaTest extends RuleTestCase { diff --git a/tests/unit/Rules/ConsonantTest.php b/tests/unit/Rules/ConsonantTest.php index 0daa6d096..5ed192647 100644 --- a/tests/unit/Rules/ConsonantTest.php +++ b/tests/unit/Rules/ConsonantTest.php @@ -15,7 +15,6 @@ use stdClass; #[Group('rule')] -#[CoversClass(AbstractFilterRule::class)] #[CoversClass(Consonant::class)] final class ConsonantTest extends RuleTestCase { diff --git a/tests/unit/Rules/ControlTest.php b/tests/unit/Rules/ControlTest.php index ca08eeed2..bc927c2fe 100644 --- a/tests/unit/Rules/ControlTest.php +++ b/tests/unit/Rules/ControlTest.php @@ -15,7 +15,6 @@ use stdClass; #[Group('rule')] -#[CoversClass(AbstractFilterRule::class)] #[CoversClass(Control::class)] final class ControlTest extends RuleTestCase { diff --git a/tests/unit/Rules/DigitTest.php b/tests/unit/Rules/DigitTest.php index fa07d69c4..f3c4bd9d9 100644 --- a/tests/unit/Rules/DigitTest.php +++ b/tests/unit/Rules/DigitTest.php @@ -14,7 +14,6 @@ use Respect\Validation\Test\RuleTestCase; #[Group('rule')] -#[CoversClass(AbstractFilterRule::class)] #[CoversClass(Digit::class)] final class DigitTest extends RuleTestCase { diff --git a/tests/unit/Rules/GraphTest.php b/tests/unit/Rules/GraphTest.php index b894f4912..97199fd42 100644 --- a/tests/unit/Rules/GraphTest.php +++ b/tests/unit/Rules/GraphTest.php @@ -14,7 +14,6 @@ use Respect\Validation\Test\RuleTestCase; #[Group('rule')] -#[CoversClass(AbstractFilterRule::class)] #[CoversClass(Graph::class)] final class GraphTest extends RuleTestCase { diff --git a/tests/unit/Rules/PrintableTest.php b/tests/unit/Rules/PrintableTest.php index 96bb9deb2..a3bc8cd23 100644 --- a/tests/unit/Rules/PrintableTest.php +++ b/tests/unit/Rules/PrintableTest.php @@ -16,7 +16,6 @@ use function chr; #[Group('rule')] -#[CoversClass(AbstractFilterRule::class)] #[CoversClass(Printable::class)] final class PrintableTest extends RuleTestCase { diff --git a/tests/unit/Rules/PunctTest.php b/tests/unit/Rules/PunctTest.php index dfd9bba7f..5b724d58d 100644 --- a/tests/unit/Rules/PunctTest.php +++ b/tests/unit/Rules/PunctTest.php @@ -14,7 +14,6 @@ use Respect\Validation\Test\RuleTestCase; #[Group('rule')] -#[CoversClass(AbstractFilterRule::class)] #[CoversClass(Punct::class)] final class PunctTest extends RuleTestCase { diff --git a/tests/unit/Rules/SpaceTest.php b/tests/unit/Rules/SpaceTest.php index 50901e805..ea7014ee4 100644 --- a/tests/unit/Rules/SpaceTest.php +++ b/tests/unit/Rules/SpaceTest.php @@ -14,7 +14,6 @@ use Respect\Validation\Test\RuleTestCase; #[Group('rule')] -#[CoversClass(AbstractFilterRule::class)] #[CoversClass(Space::class)] final class SpaceTest extends RuleTestCase { diff --git a/tests/unit/Rules/VowelTest.php b/tests/unit/Rules/VowelTest.php index bad3be37b..078f53bd0 100644 --- a/tests/unit/Rules/VowelTest.php +++ b/tests/unit/Rules/VowelTest.php @@ -14,7 +14,6 @@ use Respect\Validation\Test\RuleTestCase; #[Group('rule')] -#[CoversClass(AbstractFilterRule::class)] #[CoversClass(Vowel::class)] final class VowelTest extends RuleTestCase { diff --git a/tests/unit/Rules/XdigitTest.php b/tests/unit/Rules/XdigitTest.php index 8e5a7a393..7db315ee6 100644 --- a/tests/unit/Rules/XdigitTest.php +++ b/tests/unit/Rules/XdigitTest.php @@ -14,7 +14,6 @@ use Respect\Validation\Test\RuleTestCase; #[Group('rule')] -#[CoversClass(AbstractFilterRule::class)] #[CoversClass(Xdigit::class)] final class XdigitTest extends RuleTestCase {