diff --git a/composer.json b/composer.json index 230c3ef..c98e6ea 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,8 @@ "php": ">=7.0.0", "laravel/framework": "~5.0", "phpdocumentor/reflection-docblock": "~2.0", - "mpociot/documentarian": "^0.2.0" + "mpociot/documentarian": "^0.2.0", + "fzaninotto/faker": "^1.6" }, "require-dev": { "phpunit/phpunit": "~5.0", diff --git a/src/Mpociot/ApiDoc/ApiDocGenerator.php b/src/Mpociot/ApiDoc/ApiDocGenerator.php index f6a475e..98ec1f1 100644 --- a/src/Mpociot/ApiDoc/ApiDocGenerator.php +++ b/src/Mpociot/ApiDoc/ApiDocGenerator.php @@ -2,6 +2,7 @@ namespace Mpociot\ApiDoc; +use Faker\Factory; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Routing\Route; use Illuminate\Support\Facades\App; @@ -38,6 +39,7 @@ class ApiDocGenerator 'required' => false, 'type' => 'string', 'default' => '', + 'value' => '', 'description' => [] ]; foreach ($rules as $rule) { @@ -128,6 +130,8 @@ class ApiDocGenerator */ protected function parseRule($rule, &$attributeData) { + $faker = Factory::create(); + $parsedRule = $this->parseStringRule($rule); $parsedRule[0] = $this->normalizeRule($parsedRule[0]); list($rule, $parameters) = $parsedRule; @@ -139,13 +143,16 @@ class ApiDocGenerator case 'accepted': $attributeData['required'] = true; $attributeData['type'] = 'boolean'; + $attributeData['value'] = $faker->url; break; case 'after': $attributeData['type'] = 'date'; $attributeData['description'][] = 'Must be a date after: `' . date(DATE_RFC850, strtotime($parameters[0])) . '`'; + $attributeData['value'] = date(DATE_RFC850, strtotime('+1 day',strtotime($parameters[0]))); break; case 'alpha': $attributeData['description'][] = 'Only alphabetic characters allowed'; + $attributeData['value'] = $faker->word; break; case 'alpha_dash': $attributeData['description'][] = 'Allowed: alpha-numeric characters, as well as dashes and underscores.'; @@ -155,9 +162,11 @@ class ApiDocGenerator break; case 'in': $attributeData['description'][] = $this->fancyImplode($parameters, ', ', ' or '); + $attributeData['value'] = $faker->randomElement($parameters); break; case 'not_in': $attributeData['description'][] = 'Not in: ' . $this->fancyImplode($parameters, ', ', ' or '); + $attributeData['value'] = $faker->word; break; case 'min': $attributeData['description'][] = 'Minimum: `' . $parameters[0] . '`'; @@ -168,10 +177,12 @@ class ApiDocGenerator case 'between': $attributeData['type'] = 'numeric'; $attributeData['description'][] = 'Between: `' . $parameters[0] . '` and `' . $parameters[1] . '`'; + $attributeData['value'] = $faker->numberBetween($parameters[0], $parameters[1]); break; case 'before': $attributeData['type'] = 'date'; $attributeData['description'][] = 'Must be a date preceding: `' . date(DATE_RFC850, strtotime($parameters[0])) . '`'; + $attributeData['value'] = date(DATE_RFC850, strtotime('-1 day',strtotime($parameters[0]))); break; case 'date_format': $attributeData['type'] = 'date'; @@ -183,17 +194,20 @@ class ApiDocGenerator case 'digits': $attributeData['type'] = 'numeric'; $attributeData['description'][] = 'Must have an exact length of `' . $parameters[0] . '`'; + $attributeData['value'] = $faker->randomNumber($parameters[0], true); break; case 'digits_between': $attributeData['type'] = 'numeric'; $attributeData['description'][] = 'Must have a length between `' . $parameters[0] . '` and `' . $parameters[1] . '`'; break; case 'image': + $attributeData['type'] = 'image'; $attributeData['description'][] = 'Must be an image (jpeg, png, bmp, gif, or svg)'; break; case 'json': $attributeData['type'] = 'string'; $attributeData['description'][] = 'Must be a valid JSON string.'; + $attributeData['value'] = json_encode(['foo','bar','baz']); break; case 'mimetypes': case 'mimes': @@ -225,29 +239,41 @@ class ApiDocGenerator break; case 'timezone': $attributeData['description'][] = 'Must be a valid timezone identifier'; + $attributeData['value'] = $faker->timezone; break; case 'exists': $attributeData['description'][] = 'Valid ' . Str::singular($parameters[0]) . ' ' . $parameters[1]; break; case 'active_url': $attributeData['type'] = 'url'; + $attributeData['value'] = $faker->url; break; case 'regex': $attributeData['type'] = 'string'; $attributeData['description'][] = 'Must match this regular expression: `' . $parameters[0] . '`'; break; case 'boolean': + $attributeData['value'] = $faker->boolean(); case 'array': + $attributeData['value'] = $faker->word; case 'date': + $attributeData['value'] = $faker->date(); case 'email': - case 'image': + $attributeData['value'] = $faker->safeEmail; case 'string': + $attributeData['value'] = $faker->word; case 'integer': + $attributeData['value'] = $faker->randomNumber(); case 'numeric': + $attributeData['value'] = $faker->randomNumber(); case 'url': + $attributeData['value'] = $faker->url; case 'ip': $attributeData['type'] = $rule; break; + default: + $attributeData['value'] = $faker->word; + break; } } diff --git a/src/resources/views/documentarian.blade.php b/src/resources/views/documentarian.blade.php index b9c37fe..8104ae0 100644 --- a/src/resources/views/documentarian.blade.php +++ b/src/resources/views/documentarian.blade.php @@ -33,7 +33,7 @@ Welcome to the generated API reference. curl "{{config('app.url')}}/{{$parsedRoute['uri']}}" \ -H "Accept: application/json"@if(count($parsedRoute['parameters'])) \ @foreach($parsedRoute['parameters'] as $attribute => $parameter) --d "{{$attribute}}"="dummy" \ +-d "{{$attribute}}"="{{$parameter['value']}}" \ @endforeach @endif diff --git a/tests/ApiDocGeneratorTest.php b/tests/ApiDocGeneratorTest.php index 0349ecc..cc416ce 100644 --- a/tests/ApiDocGeneratorTest.php +++ b/tests/ApiDocGeneratorTest.php @@ -76,14 +76,11 @@ class ApiDocGeneratorTest extends Orchestra\Testbench\TestCase $this->assertEquals( 'string', $attribute['type'] ); $this->assertCount( 0, $attribute['description'] ); break; - - case 'accepted': $this->assertTrue( $attribute['required'] ); $this->assertEquals( 'boolean', $attribute['type'] ); $this->assertCount( 0, $attribute['description'] ); break; - case 'active_url': $this->assertFalse( $attribute['required'] ); $this->assertEquals( 'url', $attribute['type'] );