Skip to content

Commit

Permalink
Update the validation engine of filter-based rules
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
henriquemoody committed Feb 22, 2024
1 parent df378bf commit 692d317
Show file tree
Hide file tree
Showing 24 changed files with 34 additions and 53 deletions.
4 changes: 2 additions & 2 deletions library/Rules/Alnum.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions library/Rules/Alpha.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions library/Rules/Consonant.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
4 changes: 2 additions & 2 deletions library/Rules/Control.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions library/Rules/Digit.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
30 changes: 11 additions & 19 deletions library/Rules/AbstractFilterRule.php → library/Rules/Filter.php
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, mixed>
*/
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
Expand Down
4 changes: 2 additions & 2 deletions library/Rules/Graph.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
2 changes: 1 addition & 1 deletion library/Rules/Luhn.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
4 changes: 2 additions & 2 deletions library/Rules/Printable.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions library/Rules/Punct.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions library/Rules/Space.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions library/Rules/Vowel.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
4 changes: 2 additions & 2 deletions library/Rules/Xdigit.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
1 change: 0 additions & 1 deletion tests/unit/Rules/AlnumTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
use stdClass;

#[Group('rule')]
#[CoversClass(AbstractFilterRule::class)]
#[CoversClass(Alnum::class)]
final class AlnumTest extends RuleTestCase
{
Expand Down
1 change: 0 additions & 1 deletion tests/unit/Rules/AlphaTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
use stdClass;

#[Group('rule')]
#[CoversClass(AbstractFilterRule::class)]
#[CoversClass(Alpha::class)]
final class AlphaTest extends RuleTestCase
{
Expand Down
1 change: 0 additions & 1 deletion tests/unit/Rules/ConsonantTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
use stdClass;

#[Group('rule')]
#[CoversClass(AbstractFilterRule::class)]
#[CoversClass(Consonant::class)]
final class ConsonantTest extends RuleTestCase
{
Expand Down
1 change: 0 additions & 1 deletion tests/unit/Rules/ControlTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
use stdClass;

#[Group('rule')]
#[CoversClass(AbstractFilterRule::class)]
#[CoversClass(Control::class)]
final class ControlTest extends RuleTestCase
{
Expand Down
1 change: 0 additions & 1 deletion tests/unit/Rules/DigitTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
use Respect\Validation\Test\RuleTestCase;

#[Group('rule')]
#[CoversClass(AbstractFilterRule::class)]
#[CoversClass(Digit::class)]
final class DigitTest extends RuleTestCase
{
Expand Down
1 change: 0 additions & 1 deletion tests/unit/Rules/GraphTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
use Respect\Validation\Test\RuleTestCase;

#[Group('rule')]
#[CoversClass(AbstractFilterRule::class)]
#[CoversClass(Graph::class)]
final class GraphTest extends RuleTestCase
{
Expand Down
1 change: 0 additions & 1 deletion tests/unit/Rules/PrintableTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
use function chr;

#[Group('rule')]
#[CoversClass(AbstractFilterRule::class)]
#[CoversClass(Printable::class)]
final class PrintableTest extends RuleTestCase
{
Expand Down
1 change: 0 additions & 1 deletion tests/unit/Rules/PunctTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
use Respect\Validation\Test\RuleTestCase;

#[Group('rule')]
#[CoversClass(AbstractFilterRule::class)]
#[CoversClass(Punct::class)]
final class PunctTest extends RuleTestCase
{
Expand Down
1 change: 0 additions & 1 deletion tests/unit/Rules/SpaceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
use Respect\Validation\Test\RuleTestCase;

#[Group('rule')]
#[CoversClass(AbstractFilterRule::class)]
#[CoversClass(Space::class)]
final class SpaceTest extends RuleTestCase
{
Expand Down
1 change: 0 additions & 1 deletion tests/unit/Rules/VowelTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
use Respect\Validation\Test\RuleTestCase;

#[Group('rule')]
#[CoversClass(AbstractFilterRule::class)]
#[CoversClass(Vowel::class)]
final class VowelTest extends RuleTestCase
{
Expand Down
1 change: 0 additions & 1 deletion tests/unit/Rules/XdigitTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
use Respect\Validation\Test\RuleTestCase;

#[Group('rule')]
#[CoversClass(AbstractFilterRule::class)]
#[CoversClass(Xdigit::class)]
final class XdigitTest extends RuleTestCase
{
Expand Down

0 comments on commit 692d317

Please sign in to comment.