Upstream nette/utils state of the touched files before bb71d240dd

This commit is contained in:
upstream committed 2026-09-04 09:22:41 +02:00
1 parent 4cded8d046
commit 5361db9bd4
2 files changed
+8 -32

No files matched your search

+8 -13
View File
@@ -137,9 +137,7 @@ class Validators
*/ */
public static function is(mixed $value, string $expected): bool public static function is(mixed $value, string $expected): bool
{ {
$items = explode('|', $expected); foreach (explode('|', $expected) as $item) {
for ($i = 0, $count = count($items); $i < $count; $i++) {
$item = $items[$i];
if (str_ends_with($item, '[]')) { if (str_ends_with($item, '[]')) {
if (is_iterable($value) && self::everyIs($value, substr($item, 0, -2))) { if (is_iterable($value) && self::everyIs($value, substr($item, 0, -2))) {
return true; return true;
@@ -154,16 +152,7 @@ class Validators
} }
[$type] = $item = explode(':', $item, 2); [$type] = $item = explode(':', $item, 2);
if ($type === 'pattern') { if (isset(static::$validators[$type])) {
// A pattern may contain pipes, so the rest belongs to it and must not be
// split into further validators.
$pattern = implode('|', array_merge(array_slice($item, 1), array_slice($items, $i + 1)));
if (Strings::match($value, '~^(?:' . $pattern . ')$~D')) {
return true;
}
break;
} elseif (isset(static::$validators[$type])) {
try { try {
if (!static::$validators[$type]($value)) { if (!static::$validators[$type]($value)) {
continue; continue;
@@ -171,6 +160,12 @@ class Validators
} catch (\TypeError) { } catch (\TypeError) {
continue; continue;
} }
} elseif ($type === 'pattern') {
if (Strings::match($value, '|^' . ($item[1] ?? '') . '$|D')) {
return true;
}
continue;
} elseif (!$value instanceof $type) { } elseif (!$value instanceof $type) {
continue; continue;
} }
-19
View File
@@ -259,25 +259,6 @@ test('validates string against a regular expression pattern', function () {
}); });
test('allows pipe inside a regular expression pattern', function () {
// grouped alternation, https://github.com/nette/utils/issues/206
Assert::true(Validators::is('a', 'pattern:(a|b)'));
Assert::true(Validators::is('b', 'pattern:(a|b)'));
Assert::false(Validators::is('c', 'pattern:(a|b)'));
// bare alternation must no longer throw and is anchored as a whole
Assert::true(Validators::is('a', 'pattern:a|b'));
Assert::true(Validators::is('b', 'pattern:a|b'));
Assert::false(Validators::is('c', 'pattern:a|b'));
Assert::false(Validators::is('ab', 'pattern:a|b'));
// a pattern combined with other validators
Assert::true(Validators::is(5, 'int|pattern:(a|b)'));
Assert::true(Validators::is('a', 'int|pattern:(a|b)'));
Assert::false(Validators::is('c', 'int|pattern:(a|b)'));
});
test('ensures alphanumeric string meets minimum length', function () { test('ensures alphanumeric string meets minimum length', function () {
Assert::false(Validators::is('', 'alnum')); Assert::false(Validators::is('', 'alnum'));
Assert::false(Validators::is('a-1', 'alnum')); Assert::false(Validators::is('a-1', 'alnum'));