Skip to content

Commit

Permalink
feat: add support to 'sometimes' rule
Browse files Browse the repository at this point in the history
  • Loading branch information
max13fr authored Feb 25, 2025
1 parent 1e84624 commit a99fda6
Showing 1 changed file with 42 additions and 34 deletions.
76 changes: 42 additions & 34 deletions src/Extracting/ParsesValidationRules.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public function getParametersFromValidationRules(array $validationRules, array $
$parameterData = [
'name' => $parameter,
'required' => false,
'sometimes' => false,
'type' => null,
'example' => self::$MISSING_VALUE,
'description' => $description,
Expand Down Expand Up @@ -266,19 +267,26 @@ protected function parseRule($rule, array &$parameterData, bool $independentOnly
}

switch ($rule) {
case 'sometimes':
$parameterData['sometimes'] = true;
break;
case 'required':
$parameterData['required'] = true;
if (!$parameterData['sometimes']) {
$parameterData['required'] = true;
}
break;
case 'accepted':
$parameterData['required'] = true;
if (!$parameterData['sometimes']) {
$parameterData['required'] = true;
}
$parameterData['type'] = 'boolean';
$parameterData['description'] .= ' Must be accepted.';
$parameterData['setter'] = fn() => true;
break;

/*
* Primitive types. No description should be added
*/
/*
* Primitive types. No description should be added
*/
case 'bool':
case 'boolean':
$parameterData['setter'] = function () {
Expand Down Expand Up @@ -319,9 +327,9 @@ protected function parseRule($rule, array &$parameterData, bool $independentOnly
};
break;

/**
* Special string types
*/
/**
* Special string types
*/
case 'alpha':
$parameterData['description'] .= " Must contain only letters.";
$parameterData['setter'] = function () {
Expand Down Expand Up @@ -418,9 +426,9 @@ protected function parseRule($rule, array &$parameterData, bool $independentOnly
$parameterData['setter'] = fn() => $this->getFaker()->regexify($arguments[0]);;
break;

/**
* Special number types.
*/
/**
* Special number types.
*/
case 'digits':
$parameterData['description'] .= ' ' . $this->getDescription($rule, [':digits' => $arguments[0]]);
$parameterData['setter'] = fn() => $this->getFaker()->numerify(str_repeat("#", $arguments[0]));
Expand All @@ -432,39 +440,39 @@ protected function parseRule($rule, array &$parameterData, bool $independentOnly
$parameterData['type'] = 'string';
break;

/**
* These rules can apply to numbers, strings, arrays or files
*/
/**
* These rules can apply to numbers, strings, arrays or files
*/
case 'size':
$parameterData['description'] .= ' ' . $this->getDescription(
$rule, [':size' => $arguments[0]], $this->getLaravelValidationBaseTypeMapping($parameterData['type'])
);
$rule, [':size' => $arguments[0]], $this->getLaravelValidationBaseTypeMapping($parameterData['type'])
);
$parameterData['setter'] = $this->getDummyValueGenerator($parameterData['type'], ['size' => $arguments[0]]);
break;
case 'min':
$parameterData['description'] .= ' ' . $this->getDescription(
$rule, [':min' => $arguments[0]], $this->getLaravelValidationBaseTypeMapping($parameterData['type'])
);
$rule, [':min' => $arguments[0]], $this->getLaravelValidationBaseTypeMapping($parameterData['type'])
);
$parameterData['setter'] = $this->getDummyDataGeneratorBetween($parameterData['type'], floatval($arguments[0]), fieldName: $parameterData['name']);
break;
case 'max':
$parameterData['description'] .= ' ' . $this->getDescription(
$rule, [':max' => $arguments[0]], $this->getLaravelValidationBaseTypeMapping($parameterData['type'])
);
$rule, [':max' => $arguments[0]], $this->getLaravelValidationBaseTypeMapping($parameterData['type'])
);
$max = min($arguments[0], 25);
$parameterData['setter'] = $this->getDummyDataGeneratorBetween($parameterData['type'], 1, $max, $parameterData['name']);
break;
case 'between':
$parameterData['description'] .= ' ' . $this->getDescription(
$rule, [':min' => $arguments[0], ':max' => $arguments[1]], $this->getLaravelValidationBaseTypeMapping($parameterData['type'])
);
$rule, [':min' => $arguments[0], ':max' => $arguments[1]], $this->getLaravelValidationBaseTypeMapping($parameterData['type'])
);
// Avoid exponentially complex operations by using the minimum length
$parameterData['setter'] = $this->getDummyDataGeneratorBetween($parameterData['type'], floatval($arguments[0]), floatval($arguments[0]) + 1, $parameterData['name']);
break;

/**
* Special file types.
*/
/**
* Special file types.
*/
case 'image':
$parameterData['type'] = 'file';
$parameterData['description'] .= ' ' . $this->getDescription($rule) . ' ';
Expand All @@ -474,19 +482,19 @@ protected function parseRule($rule, array &$parameterData, bool $independentOnly
};
break;

/**
* Other rules.
*/
/**
* Other rules.
*/
case 'in':
$parameterData['enumValues'] = $arguments;
$parameterData['setter'] = function () use ($arguments) {
return Arr::random($arguments);
};
break;

/**
* These rules only add a description. Generating valid examples is too complex.
*/
/**
* These rules only add a description. Generating valid examples is too complex.
*/
case 'not_in':
$parameterData['description'] .= ' Must not be one of ' . w::getListOfValuesAsFriendlyHtmlString($arguments) . ' ';
break;
Expand Down Expand Up @@ -590,9 +598,9 @@ protected function getParameterExample(array $parameterData)
if (isset($parameterData['setter'])) {
return $parameterData['setter']();
} else {
return $parameterData['required']
? $this->generateDummyValue($parameterData['type'])
: null;
return $parameterData['required']
? $this->generateDummyValue($parameterData['type'])
: null;
}
} else if (!is_null($parameterData['example']) && $parameterData['example'] !== self::$MISSING_VALUE) {
if($parameterData['example'] === 'No-example' && !$parameterData['required']){
Expand Down

0 comments on commit a99fda6

Please sign in to comment.