|
@@ -57,7 +57,7 @@ class GetFromFormRequest extends Strategy
|
|
|
$bodyParametersFromFormRequest = $this->getBodyParametersFromValidationRules(
|
|
|
$this->getRouteValidationRules($formRequest),
|
|
|
$this->getCustomParameterData($formRequest)
|
|
|
- );
|
|
|
+ );
|
|
|
|
|
|
return $bodyParametersFromFormRequest;
|
|
|
}
|
|
@@ -92,7 +92,7 @@ class GetFromFormRequest extends Strategy
|
|
|
return call_user_func_array([$formRequest, 'bodyParameters'], []);
|
|
|
}
|
|
|
|
|
|
- c::warn("No bodyParameters() method found in ".get_class($formRequest)." Scribe will only be able to extract basic information from the rules() method.");
|
|
|
+ c::warn("No bodyParameters() method found in " . get_class($formRequest) . " Scribe will only be able to extract basic information from the rules() method.");
|
|
|
|
|
|
return [];
|
|
|
}
|
|
@@ -107,7 +107,7 @@ class GetFromFormRequest extends Strategy
|
|
|
if (count($customParameterData) && !isset($customParameterData[$parameter])) {
|
|
|
c::debug("No data found for parameter '$parameter' from your bodyParameters() method. Add an entry for '$parameter' so you can add description and example.");
|
|
|
}
|
|
|
- $parameterInfo = $customParameterData[$parameter] ?? [];
|
|
|
+ $userSpecifiedParameterInfo = $customParameterData[$parameter] ?? [];
|
|
|
|
|
|
$parameterData = [
|
|
|
'required' => false,
|
|
@@ -115,16 +115,28 @@ class GetFromFormRequest extends Strategy
|
|
|
'value' => self::$MISSING_VALUE,
|
|
|
'description' => '',
|
|
|
];
|
|
|
+
|
|
|
+ // Make sure the user-specified example overwrites others.
|
|
|
+ if (isset($userSpecifiedParameterInfo['example'])) {
|
|
|
+ $parameterData['value'] = $userSpecifiedParameterInfo['example'];
|
|
|
+ }
|
|
|
+
|
|
|
foreach ($ruleset as $rule) {
|
|
|
$this->parseRule($rule, $parameterData);
|
|
|
}
|
|
|
|
|
|
+ // Set autogenerated examples if none was supplied.
|
|
|
+ // Each rule returns a 'setter' function, so we can lazily evaluate the last one only if we need it.
|
|
|
+ if ($parameterData['value'] === self::$MISSING_VALUE && isset($parameterData['setter'])) {
|
|
|
+ $parameterData['value'] = $parameterData['setter']();
|
|
|
+ }
|
|
|
+
|
|
|
// Make sure the user-specified description comes first.
|
|
|
- $businessDescription = $parameterInfo['description'] ?? '';
|
|
|
+ $userSpecifiedDescription = $userSpecifiedParameterInfo['description'] ?? '';
|
|
|
$validationDescription = trim($parameterData['description'] ?: '');
|
|
|
- $fullDescription = trim($businessDescription . ' ' .trim($validationDescription));
|
|
|
+ $fullDescription = trim($userSpecifiedDescription . ' ' . trim($validationDescription));
|
|
|
// Let's have our sentences end with full stops, like civilized people.🙂
|
|
|
- $parameterData['description'] = $fullDescription ? rtrim($fullDescription, '.').'.' : $fullDescription;
|
|
|
+ $parameterData['description'] = $fullDescription ? rtrim($fullDescription, '.') . '.' : $fullDescription;
|
|
|
|
|
|
// Set default values for type
|
|
|
if (is_null($parameterData['type'])) {
|
|
@@ -135,13 +147,8 @@ class GetFromFormRequest extends Strategy
|
|
|
$parameterData['value'] = $this->generateDummyValue($parameterData['type']);
|
|
|
}
|
|
|
|
|
|
- // Make sure the user-specified example overwrites others.
|
|
|
- if (isset($parameterInfo['example'])) {
|
|
|
- $parameterData['value'] = $parameterInfo['example'];
|
|
|
- }
|
|
|
-
|
|
|
if (!is_null($parameterData['value']) && $parameterData['value'] !== self::$MISSING_VALUE) {
|
|
|
- // Cast is important since values had been cast to string when serializing the validator
|
|
|
+ // The cast is important since values may have been cast to string in the validator
|
|
|
$parameterData['value'] = $this->castToType($parameterData['value'], $parameterData['type']);
|
|
|
}
|
|
|
|
|
@@ -184,7 +191,7 @@ class GetFromFormRequest extends Strategy
|
|
|
|
|
|
// Now this will return the complete ruleset.
|
|
|
// Nested array parameters will be present, with '*' replaced by '0'
|
|
|
- $newRules = Validator::make($values, $rules)->getRules();
|
|
|
+ $newRules = Validator::make($values, $rules)->getRules();
|
|
|
|
|
|
// Transform the key names back from 'ids.0' to 'ids.*'
|
|
|
return collect($newRules)->mapWithKeys(function ($val, $paramName) use ($rules) {
|
|
@@ -222,28 +229,42 @@ class GetFromFormRequest extends Strategy
|
|
|
*/
|
|
|
case 'bool':
|
|
|
case 'boolean':
|
|
|
- $parameterData['value'] = Arr::random([true, false]);
|
|
|
+ $parameterData['setter'] = function () {
|
|
|
+ return Arr::random([true, false]);
|
|
|
+ };
|
|
|
$parameterData['type'] = 'boolean';
|
|
|
break;
|
|
|
case 'string':
|
|
|
- $parameterData['value'] = $this->generateDummyValue('string');
|
|
|
+ $parameterData['setter'] = function () {
|
|
|
+ return $this->generateDummyValue('string');
|
|
|
+ };
|
|
|
$parameterData['type'] = 'string';
|
|
|
break;
|
|
|
case 'int':
|
|
|
case 'integer':
|
|
|
- $parameterData['value'] = $this->generateDummyValue('integer');
|
|
|
+ $parameterData['setter'] = function () {
|
|
|
+ return $this->generateDummyValue('integer');
|
|
|
+ };
|
|
|
$parameterData['type'] = 'integer';
|
|
|
break;
|
|
|
case 'numeric':
|
|
|
- $parameterData['value'] = $this->generateDummyValue('number');
|
|
|
+ $parameterData['setter'] = function () {
|
|
|
+ return $this->generateDummyValue('number');
|
|
|
+ };
|
|
|
$parameterData['type'] = 'number';
|
|
|
break;
|
|
|
case 'array':
|
|
|
- $parameterData['value'] = [$this->generateDummyValue('string')];
|
|
|
+ $parameterData['setter'] = function () {
|
|
|
+ return [$this->generateDummyValue('string')];
|
|
|
+ };
|
|
|
$parameterData['type'] = $rule;
|
|
|
break;
|
|
|
case 'file':
|
|
|
$parameterData['type'] = 'file';
|
|
|
+ $parameterData['description'] .= 'The value must be a file.';
|
|
|
+ $parameterData['setter'] = function () {
|
|
|
+ return $this->generateDummyValue('file');
|
|
|
+ };
|
|
|
break;
|
|
|
|
|
|
/**
|
|
@@ -252,39 +273,53 @@ class GetFromFormRequest extends Strategy
|
|
|
case 'timezone':
|
|
|
// Laravel's message merely says "The value must be a valid zone"
|
|
|
$parameterData['description'] .= "The value must be a valid time zone, such as <code>Africa/Accra</code>. ";
|
|
|
- $parameterData['value'] = $this->getFaker()->timezone;
|
|
|
+ $parameterData['setter'] = function () {
|
|
|
+ return $this->getFaker()->timezone;
|
|
|
+ };
|
|
|
break;
|
|
|
case 'email':
|
|
|
- $parameterData['description'] .= d::getDescription($rule).' ';
|
|
|
- $parameterData['value'] = $this->getFaker()->safeEmail;
|
|
|
+ $parameterData['description'] .= d::getDescription($rule) . ' ';
|
|
|
+ $parameterData['setter'] = function () {
|
|
|
+ return $this->getFaker()->safeEmail;
|
|
|
+ };
|
|
|
$parameterData['type'] = 'string';
|
|
|
break;
|
|
|
case 'url':
|
|
|
- $parameterData['value'] = $this->getFaker()->url;
|
|
|
+ $parameterData['setter'] = function () {
|
|
|
+ return $this->getFaker()->url;
|
|
|
+ };
|
|
|
$parameterData['type'] = 'string';
|
|
|
// Laravel's message is "The value format is invalid". Ugh.🤮
|
|
|
$parameterData['description'] .= "The value must be a valid URL. ";
|
|
|
break;
|
|
|
case 'ip':
|
|
|
- $parameterData['description'] .= d::getDescription($rule).' ';
|
|
|
- $parameterData['value'] = $this->getFaker()->ipv4;
|
|
|
+ $parameterData['description'] .= d::getDescription($rule) . ' ';
|
|
|
$parameterData['type'] = 'string';
|
|
|
+ $parameterData['setter'] = function () {
|
|
|
+ return $this->getFaker()->ipv4;
|
|
|
+ };
|
|
|
break;
|
|
|
case 'json':
|
|
|
$parameterData['type'] = 'string';
|
|
|
- $parameterData['description'] .= d::getDescription($rule).' ';
|
|
|
- $parameterData['value'] = json_encode([$this->getFaker()->word, $this->getFaker()->word,]);
|
|
|
+ $parameterData['description'] .= d::getDescription($rule) . ' ';
|
|
|
+ $parameterData['setter'] = function () {
|
|
|
+ return json_encode([$this->getFaker()->word, $this->getFaker()->word,]);
|
|
|
+ };
|
|
|
break;
|
|
|
case 'date':
|
|
|
$parameterData['type'] = 'string';
|
|
|
- $parameterData['description'] .= d::getDescription($rule).' ';
|
|
|
- $parameterData['value'] = date(\DateTime::ISO8601, time());
|
|
|
+ $parameterData['description'] .= d::getDescription($rule) . ' ';
|
|
|
+ $parameterData['setter'] = function () {
|
|
|
+ return date(\DateTime::ISO8601, time());
|
|
|
+ };
|
|
|
break;
|
|
|
case 'date_format':
|
|
|
$parameterData['type'] = 'string';
|
|
|
// Laravel description here is "The value must match the format Y-m-d". Not descriptive enough.
|
|
|
$parameterData['description'] .= "The value must be a valid date in the format {$arguments[0]} ";
|
|
|
- $parameterData['value'] = date($arguments[0], time());
|
|
|
+ $parameterData['setter'] = function () use ($arguments) {
|
|
|
+ return date($arguments[0], time());
|
|
|
+ };
|
|
|
break;
|
|
|
|
|
|
/**
|
|
@@ -295,17 +330,17 @@ class GetFromFormRequest extends Strategy
|
|
|
case 'min':
|
|
|
$parameterData['type'] = $parameterData['type'] ?: 'number';
|
|
|
$parameterData['description'] .= Description::getDescription($rule, [':min' => $arguments[0]], 'numeric').' ';
|
|
|
- $parameterData['value'] = $this->getFaker()->numberBetween($arguments[0]);
|
|
|
+ $parameterData['setter'] = function () { return $this->getFaker()->numberBetween($arguments[0]); };
|
|
|
break;
|
|
|
case 'max':
|
|
|
$parameterData['type'] = $parameterData['type'] ?: 'number';
|
|
|
$parameterData['description'] .= Description::getDescription($rule, [':max' => $arguments[0]], 'numeric').' ';
|
|
|
- $parameterData['value'] = $this->getFaker()->numberBetween(0, $arguments[0]);
|
|
|
+ $parameterData['setter'] = function () { return $this->getFaker()->numberBetween(0, $arguments[0]); };
|
|
|
break;
|
|
|
case 'between':
|
|
|
$parameterData['type'] = $parameterData['type'] ?: 'number';
|
|
|
$parameterData['description'] .= Description::getDescription($rule, [':min' => $arguments[0], ':max' => $arguments[1]], 'numeric').' ';
|
|
|
- $parameterData['value'] = $this->getFaker()->numberBetween($arguments[0], $arguments[1]);
|
|
|
+ $parameterData['setter'] = function () { return $this->getFaker()->numberBetween($arguments[0], $arguments[1]); };
|
|
|
break;*/
|
|
|
|
|
|
/**
|
|
@@ -313,7 +348,7 @@ class GetFromFormRequest extends Strategy
|
|
|
*/
|
|
|
case 'image':
|
|
|
$parameterData['type'] = 'file';
|
|
|
- $parameterData['description'] .= d::getDescription($rule).' ';
|
|
|
+ $parameterData['description'] .= d::getDescription($rule) . ' ';
|
|
|
break;
|
|
|
|
|
|
/**
|
|
@@ -321,9 +356,11 @@ class GetFromFormRequest extends Strategy
|
|
|
*/
|
|
|
case 'in':
|
|
|
// Not using the rule description here because it only says "The attribute is invalid"
|
|
|
- $description = 'The value must be one of '. w::getListOfValuesAsFriendlyHtmlString($arguments);
|
|
|
- $parameterData['description'] .= $description.' ';
|
|
|
- $parameterData['value'] = Arr::random($arguments);
|
|
|
+ $description = 'The value must be one of ' . w::getListOfValuesAsFriendlyHtmlString($arguments);
|
|
|
+ $parameterData['description'] .= $description . ' ';
|
|
|
+ $parameterData['setter'] = function () use ($arguments) {
|
|
|
+ return Arr::random($arguments);
|
|
|
+ };
|
|
|
break;
|
|
|
|
|
|
default:
|