-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #59 from programmatordev/1.x
1.x
- Loading branch information
Showing
37 changed files
with
676 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
# DateTime | ||
|
||
Validates that a given value is a valid datetime in a specific format. | ||
|
||
```php | ||
DateTime( | ||
string $format = 'Y-m-d H:i:s', | ||
?string $message = null | ||
); | ||
``` | ||
|
||
## Basic Usage | ||
|
||
```php | ||
// default "Y-m-d H:i:s" | ||
Validator::dateTime()->validate('2024-01-01 00:00:00'); // true | ||
Validator::dateTime()->validate('2024-01-01'); // false | ||
|
||
// validate date | ||
Validator::dateTime(format: 'Y-m-d')->validate('2024-01-01'); // true | ||
Validator::dateTime(format: 'Y-m-d')->validate('2024-01-35'); // false | ||
|
||
// validate time | ||
Validator::dateTime(format: 'H:i:s')->validate('21:00:00'); // true | ||
Validator::dateTime(format: 'H:i:s')->validate('35:00:00'); // false | ||
``` | ||
|
||
> [!NOTE] | ||
> An `UnexpectedValueException` will be thrown when the input value is not a `string` or an object implementing `\Stringable`. | ||
## Options | ||
|
||
### `format` | ||
|
||
type: `string` default: `Y-m-d H:i:s` | ||
|
||
Format of the datetime to be validated. | ||
Check all formatting options [here](https://www.php.net/manual/en/datetimeimmutable.createfromformat.php). | ||
|
||
### `message` | ||
|
||
type: `?string` default: `The {{ name }} value is not a valid datetime.` | ||
|
||
Message that will be shown when the input value is not a valid datetime. | ||
|
||
The following parameters are available: | ||
|
||
| Parameter | Description | | ||
|----------------|---------------------------| | ||
| `{{ value }}` | The current invalid value | | ||
| `{{ name }}` | Name of the invalid value | | ||
| `{{ format }}` | The datetime format | | ||
|
||
## Changelog | ||
|
||
- `0.8.0` Created |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
# PasswordStrength | ||
|
||
Validates that the given password has reached the minimum strength required by the constraint. | ||
The strength is calculated by measuring the entropy of the password (in bits) based on its length and the number of unique characters. | ||
|
||
```php | ||
PasswordStrength( | ||
string $minStrength = 'medium', | ||
?string $message = null | ||
); | ||
``` | ||
|
||
## Basic Usage | ||
|
||
```php | ||
Validator::passwordStrength()->validate('password'); // false | ||
Validator::passwordStrength()->validate('i8Kq*MBob~2W"=p'); // true | ||
Validator::passwordStrength(minStrength: 'very-strong')->validate('i8Kq*MBob~2W"=p'); // false | ||
``` | ||
|
||
> [!NOTE] | ||
> An `UnexpectedValueException` will be thrown when a `minStrength` option is invalid. | ||
> [!NOTE] | ||
> An `UnexpectedValueException` will be thrown when the input value is not a `string`. | ||
## Options | ||
|
||
### `minStrength` | ||
|
||
type: `string` default: `medium` | ||
|
||
Sets the minimum strength of the password in entropy bits. | ||
The entropy is calculated using the formula [here](https://www.pleacher.com/mp/mlessons/algebra/entropy.html). | ||
|
||
Available options are: | ||
|
||
- `weak` entropy between `64` and `79` bits. | ||
- `medium` entropy between `80` and `95` bits. | ||
- `strong` entropy between `96` and `127` bits. | ||
- `very-strong` entropy greater than `128` bits. | ||
|
||
All measurements less than `64` bits will fail. | ||
|
||
### `message` | ||
|
||
type: `?string` default: `The password strength is not strong enough.` | ||
|
||
Message that will be shown when the password is not strong enough. | ||
|
||
The following parameters are available: | ||
|
||
| Parameter | Description | | ||
|---------------------|---------------------------| | ||
| `{{ name }}` | Name of the invalid value | | ||
| `{{ minStrength }}` | Selected minimum strength | | ||
|
||
## Changelog | ||
|
||
- `0.8.0` Created |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
# Regex | ||
|
||
Validates that a given regular expression pattern is valid. | ||
|
||
```php | ||
Regex( | ||
string $pattern, | ||
bool $match = true, | ||
?callable $normalizer = null, | ||
?string $message = null | ||
); | ||
``` | ||
|
||
## Basic Usage | ||
|
||
```php | ||
Validator::regex('/[a-z]/')->validate('abc'); // true | ||
Validator::regex('/[a-z]/')->validate('123'); // false | ||
|
||
// if match is false, assert that the pattern does not match | ||
// in this case, assert that the value does not contain any lowercase letters | ||
Validator::regex('/[a-z]/', match: false)->validate('abc'); // false | ||
Validator::regex('/[a-z]/', match: false)->validate('123'); // true | ||
``` | ||
|
||
> [!NOTE] | ||
> An `UnexpectedValueException` will be thrown if the `pattern` is not a valid regular expression. | ||
> [!NOTE] | ||
> An `UnexpectedValueException` will be thrown when the input value is not a `string` or an object implementing `\Stringable`. | ||
## Options | ||
|
||
### `pattern` | ||
|
||
type: `string` `required` | ||
|
||
Regular expression pattern to be matched against. | ||
|
||
### `match` | ||
|
||
type: `bool` default: `true` | ||
|
||
- `true` the validation will pass if the given input value matches the regular expression pattern. | ||
- `false` the validation will pass if the given input value *does not* match the regular expression pattern. | ||
|
||
### `normalizer` | ||
|
||
type: `callable` default: `null` | ||
|
||
Allows to define a `callable` that will be applied to the value before checking if it is valid. | ||
|
||
For example, use `trim`, or pass your own function, to not evaluate whitespaces at the end of a string: | ||
|
||
```php | ||
// allow all chars except whitespaces | ||
Validator::length(pattern: '/^\S*$/')->validate('abc '); // false | ||
|
||
Validator::length(pattern: '/^\S*$/', normalizer: 'trim')->validate('abc '); // true | ||
Validator::length(pattern: '/^\S*$/', normalizer: fn($value) => trim($value))->validate('abc '); // true | ||
``` | ||
|
||
### `message` | ||
|
||
type: `?string` default: `The {{ name }} value is not valid.` | ||
|
||
Message that will be shown when the input value does not match the regular expression pattern. | ||
|
||
The following parameters are available: | ||
|
||
| Parameter | Description | | ||
|-----------------|---------------------------| | ||
| `{{ value }}` | The current invalid value | | ||
| `{{ name }}` | Name of the invalid value | | ||
| `{{ pattern }}` | The given pattern | | ||
|
||
## Changelog | ||
|
||
- `0.8.0` Created |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
<?php | ||
|
||
namespace ProgrammatorDev\Validator\Exception; | ||
|
||
class DateTimeException extends ValidationException {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
<?php | ||
|
||
namespace ProgrammatorDev\Validator\Exception; | ||
|
||
class PasswordStrengthException extends ValidationException {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
<?php | ||
|
||
namespace ProgrammatorDev\Validator\Exception; | ||
|
||
class RegexException extends ValidationException {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
<?php | ||
|
||
namespace ProgrammatorDev\Validator\Rule; | ||
|
||
use ProgrammatorDev\Validator\Exception\DateTimeException; | ||
use ProgrammatorDev\Validator\Exception\UnexpectedTypeException; | ||
|
||
class DateTime extends AbstractRule implements RuleInterface | ||
{ | ||
private string $message = 'The {{ name }} value is not a valid datetime.'; | ||
|
||
public function __construct( | ||
private readonly string $format = 'Y-m-d H:i:s', | ||
?string $message = null | ||
) | ||
{ | ||
$this->message = $message ?? $this->message; | ||
} | ||
|
||
public function assert(mixed $value, ?string $name = null): void | ||
{ | ||
if (!\is_scalar($value) && !$value instanceof \Stringable) { | ||
throw new UnexpectedTypeException('string|\Stringable', get_debug_type($value)); | ||
} | ||
|
||
$value = (string) $value; | ||
|
||
\DateTimeImmutable::createFromFormat($this->format, $value); | ||
|
||
$errors = \DateTimeImmutable::getLastErrors(); | ||
|
||
if ($errors !== false && ($errors['error_count'] > 0 || $errors['warning_count'] > 0)) { | ||
throw new DateTimeException( | ||
message: $this->message, | ||
parameters: [ | ||
'name' => $name, | ||
'value' => $value, | ||
'format' => $this->format | ||
] | ||
); | ||
} | ||
} | ||
} |
Oops, something went wrong.