PHP 7.4 & PHP 8.0 → branche 2.x

2.x 2.0.0
Julien Rosset 2 years ago
parent caa254ab80
commit 0ef982f8b7

@ -7,19 +7,19 @@
"config": {
"sort-packages": true
},
"extra": {
"extra": {
"branch-alias": {
"dev-master": "3.x-dev"
"dev-master": "2.x-dev"
}
},
"minimum-stability": "stable",
"require": {
"php": "^8.1",
"symfony/console": "^6.1",
"php": "^7.4 || ^8.0.0",
"symfony/console": "^5.4",
"jrosset/betterphptoken": "^1.0",
"jrosset/collections": "^3.0",
"jrosset/extendedmonolog": "^2.0"
"jrosset/collections": "^2.3",
"jrosset/extendedmonolog": "^1.1"
},
"autoload": {
"psr-4": {

@ -2,7 +2,6 @@
namespace jrosset\CliProgram\Validation;
use Closure;
use jrosset\CliProgram\Validation\Validators\InvalidValueException;
use jrosset\CliProgram\Validation\Validators\IValidator;
use Stringable;
@ -96,31 +95,24 @@ trait TCommandWithValidation {
* @param mixed $default The default value (for InputArgument::OPTIONAL mode only)
* @param string $description The argument description
* @param IValidator|null $validator The validator or Null if none
* @param Closure|array|null $suggestedValues The function or list of suggested values when completing ; Null if none
*
* @return $this
*
* @throws InvalidArgumentException When argument mode is not valid
*/
public function addArgument (
string $name,
int $mode = null,
string $description = '',
mixed $default = null,
?IValidator $validator = null,
Closure|array|null $suggestedValues = null
): static {
string $name,
int $mode = null,
string $description = '',
$default = null,
?IValidator $validator = null
): self {
$default = static::treatStringableDefaultValue($default);
if ($validator !== null) {
$default = $validator->getValidDefault($default);
}
if ($suggestedValues !== null) {
parent::addArgument($name, $mode, $description, $default, $suggestedValues);
}
else {
parent::addArgument($name, $mode, $description, $default);
}
parent::addArgument($name, $mode, $description, $default);
return $this->setArgumentValidator($name, $validator);
}
/**
@ -133,7 +125,7 @@ trait TCommandWithValidation {
*
* @throws InvalidArgumentException If the {@see InputArgument} doesn't exist
*/
public function setArgumentValidator (string $name, ?IValidator $validator): static {
public function setArgumentValidator (string $name, ?IValidator $validator): self {
if (!$this->getDefinition()->hasArgument($name)) {
throw new InvalidArgumentException(sprintf('The "%s" argument does not exist', $name));
}
@ -169,32 +161,25 @@ trait TCommandWithValidation {
* @param string $description The argument description
* @param mixed $default The default value (must be null for InputOption::VALUE_NONE)
* @param IValidator|null $validator The validator or Null if none ; ignored if **$mode** = {@see InputOption::VALUE_NONE}
* @param Closure|array|null $suggestedValues The function or list of suggested values when completing ; Null if none
*
* @return $this
*
* @throws InvalidArgumentException When argument mode is not valid
*/
public function addOption (
string $name,
string|array|null $shortcut = null,
int $mode = null,
string $description = '',
mixed $default = null,
?IValidator $validator = null,
Closure|array|null $suggestedValues = null
): static {
string $name,
$shortcut = null,
int $mode = null,
string $description = '',
$default = null,
?IValidator $validator = null
): self {
$default = static::treatStringableDefaultValue($default);
if ($validator !== null) {
$default = $validator->getValidDefault($default);
}
if ($suggestedValues !== null) {
parent::addOption($name, $shortcut, $mode, $description, $default, $suggestedValues);
}
else {
parent::addOption($name, $shortcut, $mode, $description, $default);
}
parent::addOption($name, $shortcut, $mode, $description, $default);
return $this->setOptionValidator($name, $validator);
}
/**
@ -207,7 +192,7 @@ trait TCommandWithValidation {
*
* @throws InvalidArgumentException If the {@see InputOption} doesn't exist
*/
public function setOptionValidator (string $name, ?IValidator $validator): static {
public function setOptionValidator (string $name, ?IValidator $validator): self {
if (!$this->getDefinition()->hasOption($name)) {
throw new InvalidArgumentException(sprintf('The "--%s" option does not exist', $name));
}
@ -241,7 +226,7 @@ trait TCommandWithValidation {
*
* @return mixed The default value
*/
protected static function treatStringableDefaultValue (mixed $default): mixed {
protected static function treatStringableDefaultValue ($default) {
if ($default instanceof Stringable) {
return $default->__toString();
}

@ -20,7 +20,7 @@ abstract class AbstractDateTimeValidator extends BasedValidator {
/**
* @inheritDoc
*/
public function validate (mixed $value): bool {
public function validate ($value): bool {
$this->getInternalValidator()->setPattern($this->getPattern());
return parent::validate($value);
}

@ -33,7 +33,7 @@ abstract class BasedValidator implements IValidator {
/**
* @inheritDoc
*/
public function validate (mixed $value): bool {
public function validate ($value): bool {
return $this->internalValidator->validate($value);
}
}

@ -29,7 +29,7 @@ class DateTimeValidator extends AbstractDateTimeValidator {
/**
* @inheritDoc
*/
public function getValidDefault (mixed $default): string|bool|int|float|array {
public function getValidDefault ($default) {
if ($default instanceof DateTimeInterface) {
return $default->format('Y-m-d H:i:s');
}

@ -29,7 +29,7 @@ class DateValidator extends AbstractDateTimeValidator {
/**
* @inheritDoc
*/
public function getValidDefault (mixed $default): string|bool|int|float|array {
public function getValidDefault ($default) {
if ($default instanceof DateTimeInterface) {
return $default->format('Y-m-d');
}

@ -56,7 +56,7 @@ class DecimalValidator extends BasedValidator {
/**
* @inheritDoc
*/
public function validate (mixed $value): bool {
public function validate ($value): bool {
if (!parent::validate($value)) {
return false;
}

@ -1,62 +0,0 @@
<?php
namespace jrosset\CliProgram\Validation\Validators;
use jrosset\Collections\Collection;
use ReflectionEnum;
use ReflectionException;
use UnitEnum;
/**
* An argument/option value validator based on an enumeration
*
* @template TEnum of UnitEnum
* @template-implements IValidator<TEnum>
* @template-implements TInternalValueValidator<TEnum>
*/
class EnumValidator extends BasedValidator {
/**
* @var ReflectionEnum The enumeration
*/
private ReflectionEnum $enum;
/**
* Create a validator
*
* @param class-string<UnitEnum> $enumClass The enumeration class
*
* @throws ReflectionException If the enumeration class doesn't exist
*/
public function __construct (string $enumClass) {
$this->enum = new ReflectionEnum($enumClass);
$enumCases = new Collection();
foreach ($this->enum->getCases() as $enumCase) {
$enumCases->add($enumCase->getName());
}
parent::__construct(new ListValidator($enumCases));
}
/**
* @inheritDoc
*
* @throws ReflectionException
*/
public function getValidDefault (mixed $default): string|bool|int|float|array {
if ($default instanceof UnitEnum) {
$default = $default->name;
}
return $default;
}
/**
* @inheritDoc
*
* @throws ReflectionException
*/
public function getValue (): UnitEnum {
$enumCase = $this->getInternalValidator()->getValue();
return $this->enum->getCase($enumCase)->getValue();
}
}

@ -15,7 +15,7 @@ interface IValidator {
*
* @return string|bool|int|float|array The valid default value
*/
public function getValidDefault (mixed $default): string|bool|int|float|array;
public function getValidDefault ($default);
/**
* Validate a value
@ -24,7 +24,7 @@ interface IValidator {
*
* @return bool True if the value is valid, else False
*/
public function validate (mixed $value): bool;
public function validate ($value): bool;
/**
* Get the value, after it's validation
*

@ -50,7 +50,7 @@ class IntegerValidator extends BasedValidator {
/**
* @inheritDoc
*/
public function validate (mixed $value): bool {
public function validate ($value): bool {
if (!parent::validate($value)) {
return false;
}

@ -33,7 +33,7 @@ class ListValidator implements IValidator {
/**
* @inheritDoc
*/
public function validate (mixed $value): bool {
public function validate ($value): bool {
if ($this->getAllowedValues()->contains($value)) {
$this->setValue($value);
return true;

@ -32,7 +32,7 @@ class RegexValidator implements IValidator {
/**
* @inheritDoc
*/
public function validate (mixed $value): bool {
public function validate ($value): bool {
return preg_match($this->pattern, $value, $this->matches) === 1;
}
@ -71,7 +71,7 @@ class RegexValidator implements IValidator {
*
* @return string|null The capturing group or Null if not set
*/
public function getMatch (int|string $group): ?string {
public function getMatch ($group): ?string {
return $this->getMatches()[$group] ?? null;
}
/**
@ -81,7 +81,7 @@ class RegexValidator implements IValidator {
*
* @return bool True if the capturing group exists and is not null
*/
public function hasMatch (int|string $group): bool {
public function hasMatch ($group): bool {
return $this->getMatches()[$group] !== null;
}

@ -11,7 +11,7 @@ trait TIdenticalValidDefaultValidator {
/**
* @inheritDoc
*/
public function getValidDefault (mixed $default): string|bool|int|float|array {
public function getValidDefault ($default) {
return $default;
}
}

@ -32,7 +32,7 @@ trait TInternalValueValidator {
*
* @return $this
*/
protected function setValue ($value): static {
protected function setValue ($value): self {
$this->value = $value;
return $this;
}

@ -29,7 +29,7 @@ class TimeValidator extends AbstractDateTimeValidator {
/**
* @inheritDoc
*/
public function getValidDefault (mixed $default): string|bool|int|float|array {
public function getValidDefault ($default) {
if ($default instanceof DateTimeInterface) {
return $default->format('H:i:s');
}

@ -7,9 +7,7 @@ use DateTimeInterface;
use jrosset\CliProgram\Monolog\ConsoleOutputWithMonolog;
use jrosset\CliProgram\Validation\CommandWithValidation;
use jrosset\CliProgram\Validation\Validators\DateValidator;
use jrosset\CliProgram\Validation\Validators\EnumValidator;
use jrosset\CliProgram\Validation\Validators\IntegerValidator;
use jrosset\Tests\Lang;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
@ -42,14 +40,6 @@ class Hello extends CommandWithValidation {
new DateValidator()
);
$this->addOption(
'lang',
'l',
InputArgument::OPTIONAL,
'The lang',
Lang::English,
new EnumValidator(Lang::class)
);
$this->addOption(
'repeat',
'r',
@ -66,7 +56,7 @@ class Hello extends CommandWithValidation {
protected function execute (InputInterface $input, OutputInterface $output): int {
$output->writeln('Command : ' . __CLASS__, OutputInterface::VERBOSITY_DEBUG);
$text = $input->getOption('lang')->value;
$text = 'Hello';
$repeat = $input->getOption('repeat');
/** @var DateTimeInterface $day */

@ -1,9 +0,0 @@
<?php
namespace jrosset\Tests;
enum Lang: string {
case French = 'Bonjour';
case English = 'Good morning';
case American = 'Hello';
}
Loading…
Cancel
Save