Git Product home page Git Product logo

scribe's Introduction

Scribe

Latest Stable Version Total Downloads


v4 is out now! Featuring subgroups, easier sorting, and an automated upgrade command.

Scribe helps you generate API documentation for humans from your Laravel/Lumen/Dingo codebase. See a live example at demo.scribe.knuckles.wtf.

Features

  • Useful output:
    • Pretty single-page HTML doc, with human-friendly text, code samples, and in-browser API tester ("Try It Out")
    • Generates Postman collection and OpenAPI spec
  • Smarts. Scribe can:
    • extract request parameter details from FormRequests or validation rules
    • safely call API endpoints to get sample responses
    • generate sample responses from Eloquent API Resources or Transformers
  • Customisable to different levels:
    • Customise the UI by adjusting text, ordering, examples, or change the UI itself
    • Add custom strategies to adjust how data is extracted
    • Statically define extra endpoints or information that isn't in your codebase

👋 Scribe helps you generate docs automatically, but if you really want to make friendly, maintainable and testable API docs, there's some more things you need to know. So I made a course for you.🤗

Documentation

Check out the documentation at scribe.knuckles.wtf/laravel.

If you're coming from mpociot/laravel-apidoc-generator, first migrate to v3, then to v4.

Contributing

Contributing is easy! See our contribution guide.

scribe's People

Contributors

adamiecradek avatar ajcastro avatar badmike avatar bram-pkg avatar ewerkema avatar ezra-obiwale avatar gabrielpeixoto avatar georgimorozov avatar golonix avatar grinry avatar hendrikbl avatar icarojerry avatar james2doyle avatar lloricode avatar lucasmichot avatar marnulombard avatar missaelanda avatar mooseh avatar mpociot avatar ncatanchin avatar phanan avatar robbieaverill avatar rudiedirkx avatar sangnguyenplus avatar scopeynz avatar sempixel avatar shalvah avatar urbsny avatar yannikfirre avatar zolotov88 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

scribe's Issues

CSP Nonce support

  • I've read the documentation and I can't find details on how to achieve this.

Is there any way we could introduce CSP nonce support? I'm specifically referring to the inline scripts in the head and at the end of body,

Of course for now i can simply add them to the generated index.blade.php file, but i have a feeling i will forget to do this at some point.

scribe/images: Directory not empty

vagrant@homestead:~/boutone/nova2$ php artisan scribe:generate
🔊 info Processed route: [GET] docs.json
🔊 info Processed route: [GET] api/user
🔊 info Writing source Markdown files to: resources/docs
🔊 info Wrote source Markdown files to: resources/docs
🔊 info Generating API HTML code

   ErrorException 

  rmdir(/home/vagrant/boutone/nova2/public/vendor/scribe/images): Directory not empty

  at vendor/league/flysystem/src/Adapter/Local.php:429
    425|     protected function deleteFileInfoObject(SplFileInfo $file)
    426|     {
    427|         switch ($file->getType()) {
    428|             case 'dir':
  > 429|                 rmdir($file->getRealPath());
    430|                 break;
    431|             case 'link':
    432|                 unlink($file->getPathname());
    433|                 break;

      +22 vendor frames 
  23  artisan:37
      Illuminate\Foundation\Console\Kernel::handle()
  • Version 1.0@beta
  • Laravel 7 + Laravel Nova 3.6
  • Type laravel (on type mode all fine)

Docs generated but with error above

Models created by factory are deleted before calling the resource

What happened?
This is is what I assume is the problem, I could be wrong. Apologies if that's the case.

Some endpoints of ours have a model which creates multiple relations with the use of factories.
In our case we have an application which belongs to a stage. Which then again belong to a job.
So in our application factory we create a stage if one is not defined.
And in the stage factory we create a job if one is not defined.

The creation of the items are working perfectly but once the model (the application) hits our resource the job doesn't exist anymore. The stage does still exist and works perfectly.

Example code:

Application Factory

$factory->define(Application::class, function (Faker $faker, $params) {
    if (isset($params['stage_id'])) {
        $stage = Stage::findOrFail($params['stage_id']);
    } else {
        $stage = factory(Stage::class)->create();
    }

    $stage->job // exist just as needed!

    return [
        // Attributes
    ];
});

Stage Factory

$factory->define(Stage::class, function (Faker $faker, $params) {
    if (isset($params['job_id'])) {
        $job = Job::with('company.jobsite')->findOrFail($params['job_id']);
    } else {
        $job = factory(Job::class)->create();
    }

    $job // Job exist perfectly fine

    return [
        // Attributes
    ];
});

Resource

class Application extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request): array
    {
         $this->stage // exist just as expected.
         $this->stage->job_id // also exist and has the ID that was provided in the factory
         $this->stage->job // does not exist. We use this relation on many places so we are pretty sure it's not the relation
         Job::where('id', $this->stage->job_id)->first() // + this also returns null
    }
}

This is the docblock on the controller (if you'd need that information):

    /**
     * Retrieve an application
     *
     * @header X-Application-Access-Token {access_token}
     * @apiResource \App\Http\Resources\Content\Application
     * @apiResourceModel \App\Models\Application
     *
     * @param integer $id
     * @return \App\Http\Resources\Content\Application
     */

So it looks like the job has already been removed before I could make use of it.

My environment:

  • PHP version: 7.4.7
  • Framework (Laravel/Lumen) and version: Laravel v7.16.1
  • Scribe Version: v1.1.0

My Scribe config (minus the comments):

Config
<?php

return [
    'type' => 'laravel',

    'static' => [
        'output_path' => 'public/docs',
    ],

    'laravel' => [
        'add_routes' => true,
        'docs_url' => '/docs',
        'middleware' => [],
    ],

    'auth' => [
        'enabled' => true,
        'in' => 'bearer',
        'name' => 'Authorization',
        'use_value' => env('SCRIBE_AUTH_KEY'),
        'extra_info' => 'extra info.',
    ],

    'intro_text' => 'intro',

    'example_languages' => [
        'bash',
        'javascript',
        'php',
    ],

    'base_url' => env('API_URL'),

    'title' => null,

    'postman' => [
        'enabled' => false,
        'base_url' => null,
        'description' => null,
        'auth' => null,
    ],

    'default_group' => 'Endpoints',

    'logo' => 'app/img/logo-docs.svg',

    'router' => 'laravel',

    'routes' => [
        [
            'match' => [
                'domains' => [
                    env('API_SUBDOMAIN', 'api') . '.' . env('APP_TLD')
                ],

                'prefixes' => [
                    'content/v1/*',
                ],

                'versions' => ['v1'],
            ],

            'include' => [
                // 'users.index', 'healthcheck*'
            ],

            'exclude' => [
                // '/health', 'admin.*'
            ],

            'apply' => [

                'headers' => [
                    'Content-Type' => 'application/json',
                    'Accept' => 'application/json',
                ],

                'response_calls' => [
                    'methods' => [],

                    'config' => [
                        'app.env' => 'local',
                        // 'app.debug' => false,
                    ],

                    'cookies' => [
                        // 'name' => 'value'
                    ],

                    'queryParams' => [
                        // 'key' => 'value',
                    ],

                    'bodyParams' => [
                        // 'key' => 'value',
                    ],

                    'fileParams' => [
                        // 'key' => '/home/me/image.png',
                    ],
                ],
            ],
        ],
    ],

    'fractal' => [
        'serializer' => null,
    ],

    'faker_seed' => null,

    'strategies' => [
        'metadata' => [
            \Knuckles\Scribe\Extracting\Strategies\Metadata\GetFromDocBlocks::class,
        ],
        'urlParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\UrlParameters\GetFromUrlParamTag::class,
        ],
        'queryParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\QueryParameters\GetFromQueryParamTag::class,
        ],
        'headers' => [
            \Knuckles\Scribe\Extracting\Strategies\Headers\GetFromRouteRules::class,
            \Knuckles\Scribe\Extracting\Strategies\Headers\GetFromHeaderTag::class,
        ],
        'bodyParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromFormRequest::class,
            \Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromBodyParamTag::class,
        ],
        'responses' => [
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseTransformerTags::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseResponseTag::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseResponseFileTag::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseApiResourceTags::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\ResponseCalls::class,
        ],
        'responseFields' => [
            \Knuckles\Scribe\Extracting\Strategies\ResponseFields\GetFromResponseFieldTag::class,
        ],
    ],
    'routeMatcher' => \Knuckles\Scribe\Matching\RouteMatcher::class,
];

Getting wierd error after migrating from laravel-api-generator

I am getting this error when I try to generate using
php artisan scribe:generate

  Undefined index: OPTIONS (View: E:\laragon\www\app\vendor\knuckleswtf\scribe\resources\views\components\badges\http-method.blade.php)

  at E:\laragon\www\app\vendor\knuckleswtf\scribe\src/../resources/views//components/badges/http-method.blade.php:2
    1| @component('scribe::components.badges.base', [
  > 2|     'colour' => \Knuckles\Scribe\Tools\WritingUtils::$httpMethodToCssColour[$method],
    3|     'text' => $method,
    4|     ])
    5| @endcomponent
    6| 

  1   E:\laragon\www\app\vendor\knuckleswtf\scribe\src/../resources/views//components/badges/http-method.blade.php:2
      Illuminate\Foundation\Bootstrap\HandleExceptions::handleError("Undefined index: OPTIONS", "E:\laragon\www\app\storage\framework\views\0f7694f5ee174ac314e61576
041c973175b99694.php")

  2   E:\laragon\www\app\vendor\knuckleswtf\scribe\src/../resources/views//partials/endpoint.blade.php:38
      Illuminate\View\Factory::renderComponent()

Any idea why I am getting this error? I tried troubleshooting but didn't help.

Thanks.

Can't generate docs

Expected Behavior

Running php artisan scribe:generate should generate docs folder in public/

Actual Behavior

The output of the command is
image
And no docs folder is generated. I migrated from Laravel API Documentation Generator The config file contains the same as apidoc.php. Using Laravel API Documentation Generator cause no problems at all with the same anotations. I found it strange that returning the array of parsed routes in GenerateDocumentation@processRoutes at the third iteration (in my case ) generates the docs successfully. Also what are those numbers 368, 276 ?

Code

/**
 * Class RefreshTokenController
 * @package App\Http\Controllers\V1\Auth
 * @group Authentication
 */
class RefreshTokenController extends Controller

/**
     * Refresh token.
     *
     * @header Authorization Bearer {token}
     * @param  \Illuminate\Http\Request  $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
/**
 * Class LogoutController
 * @package App\Http\Controllers\V1\Auth
 * @group Authentication
 */
class LogoutController extends Controller

/**
     * Log out and blacklist token
     *
     * @authenticated
     * @header Authorization Bearer {token}
     * @param  \Illuminate\Http\Request  $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function __invoke(Request $request)
/**
 * Class LoginController
 * @package App\Http\Controllers\V1\Auth
 * @group Authentication
 */
class LoginController extends Controller
{
    /**
     * Get Authentication Token
     *
     *
     * @bodyParam code_login string Scanned login code. * Not required if email and password are present
     * @bodyParam email string The email of the user. * Required if code_login is not passed
     * @bodyParam password string The password for the user. * Required if code_login is not passed
     * @param Request $request
     * @return \Symfony\Component\HttpFoundation\Response
     */

Specifications

  • PHP: 7.4
  • Laravel version: 7.11
  • Scribe: ^1.0@beta
  • Platform: MacOS 10.15.4

ErrorException : Undefined offset: 1

When running php artisan scribe:generate

I get the next error;

ErrorException  : Undefined offset: 1

  at /home/--/--/--/--/vendor/knuckleswtf/scribe/src/Writing/Writer.php:409
    405|             array_shift($lastTimesWeModifiedTheseFiles);
    406|             array_shift($lastTimesWeModifiedTheseFiles);
    407|             $this->lastTimesWeModifiedTheseFiles = collect($lastTimesWeModifiedTheseFiles)
    408|                 ->mapWithKeys(function ($line) {
  > 409|                     [$filePath, $mtime] = explode("=", $line);
    410|                     return [$filePath => $mtime];
    411|                 })->toArray();
    412|         }
    413|     }

My environment:

  • PHP version: 7.2
  • Laravel version: 6.0.4
  • Scribe Version 1.0.3

My Scribe config (minus the comments):


return [

    'type' => 'laravel',

    'static' => [
        'output_path' => 'public/docs',
    ],

    'laravel' => [
        'add_routes' => true,
        'docs_url' => '/doc',
        'middleware' => [],
    ],
    'auth' => [
        'enabled' => true,
        'in' => 'bearer',
        'name' => 'token',
        'use_value' => env('SCRIBE_AUTH_KEY'),
        'extra_info' => 'You can retrieve your token by visiting your dashboard and clicking <b>Generate API token</b>.',
    ],

    'intro_text' => ''

    ,
    'example_languages' => [
        'bash',
        'javascript',
        'php',
        'python'
    ],
    'base_url' => null,
    'title' => 'S-Api',
    'postman' => [
        'enabled' => true,
        'description' => 'Sender api documentation.',
        'auth' => [
            'enabled' => true,
            'in' => 'query',
            'name' => 'apiKey',
            'use_value' => env('SCRIBE_API_KEY'),
            'extra_info' => 'You can retrieve your key by going to settings and clicking <b>Generate API key</b>.',
        ],
    ],
    'default_group' => 'MISC',
    'logo' => '/images/logo.png',
    'router' => 'laravel',
    'routes' => [
        [
            'match' => [
                'domains' => ['*'],
                'prefixes' => ['*'],
                'versions' => ['v1'],
            ],
            'include' => [
                // 'users.index', 'healthcheck*'
            ],
            'exclude' => [
            ],
            'apply' => [

                'headers' => [
                    'Content-Type' => 'application/json',
                    'Accept' => 'application/json',
                    'Authorization' => 'Bearer'. $token ,
                ],
                'response_calls' => [

                    'methods' => [''],
                    'config' => [
                        'app.env' => 'documentation',
                        `'app.debug'` => true,
                    ],

                    'cookies' => [
                        // 'name' => 'value'
                    ],
                    'queryParams' => [
                        // 'key' => 'value',
                    ],
                    'bodyParams' => [
                        // 'key' => 'value',
                    ],
                    'fileParams' => [
                        // 'key' => '/home/me/image.png',
                    ],
                ],
            ],
        ],
    ],
    'fractal' => [
        'serializer' => null,
    ],
    'faker_seed' => 1234,
    'strategies' => [
        'metadata' => [
            \Knuckles\Scribe\Extracting\Strategies\Metadata\GetFromDocBlocks::class,
//            App\Docs\Strategies\DocStrategy::class,
            App\Docs\Strategies\MethodsInTitle::class,
        ],
        'urlParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\UrlParameters\GetFromUrlParamTag::class,
        ],
        'queryParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\QueryParameters\GetFromQueryParamTag::class,
//            \App\Docs\Strategies\AddPaginationParameters::class,
        ],
        'headers' => [
            \Knuckles\Scribe\Extracting\Strategies\Headers\GetFromRouteRules::class,
            \Knuckles\Scribe\Extracting\Strategies\Headers\GetFromHeaderTag::class,
        ],
        'bodyParameters' => [
//            App\Docs\Strategies\DocStrategy::class,
            \Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromFormRequest::class,
            \Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromBodyParamTag::class,
        ],
        'responses' => [
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseTransformerTags::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseResponseTag::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseResponseFileTag::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseApiResourceTags::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\ResponseCalls::class,
            App\Docs\Strategies\AddJsonSuccess::class,
        ],
        'responseFields' => [
            \Knuckles\Scribe\Extracting\Strategies\ResponseFields\GetFromResponseFieldTag::class,
        ],
    ],
    'routeMatcher' => \Knuckles\Scribe\Matching\RouteMatcher::class,
];
`

Incorrect Headers on Response Calls

  • I've read the documentation and I can't find details on how to achieve this.

I've been looking at the ResponseCalls for automated documentation on some projects I'm working on. Mostly, they seem to work but I've come across a weird error where it seems that headers are not getting set?

Example that's generated:

curl -X POST
"http://iam.localhost/api/1/auth/register"
-H "Content-Type: application/json"
-H "Accept: application/json"
-H "Authorization: Bearer {token}"
-H "asdasd: asdasd"
-d '{"first_name":"Joe","last_name":"Bloggs","email":"[email protected]","password":"supersecret"}'

When running scribe:generate I dumped the headers on that request

^ Illuminate\Support\Collection^ {#2862
#items: array:5 [
"host" => "iam.localhost"
"user-agent" => "Symfony"
"accept" => "text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8"
"accept-language" => "en-us,en;q=0.5"
"accept-charset" => "ISO-8859-1,utf-8;q=0.7,*;q=0.7"
]
}

However running the example from the Postman Collection that's generated works due to postman putting in the Content-Length.

^ Illuminate\Support\Collection {#1147
#items: array:13 [
"accept-encoding" => "gzip"
"x-real-ip" => "172.22.0.1"
"x-forwarded-server" => "1206b265bdde"
"x-forwarded-proto" => "http"
"x-forwarded-port" => "80"
"x-forwarded-host" => "iam.localhost"
"x-forwarded-for" => "172.22.0.1"
"content-type" => "application/json"
"cache-control" => "no-cache"
"authorization" => "Bearer SOMETOKEN"
"accept" => "/"
"content-length" => "127"
"host" => "iam.localhost"
]
}

There is no Auth header or Content-Length headers in the request so the request from scribe:generate is failing.

I've set the headers in the scribe config

            'headers' => [
                'Content-Type' => 'application/json',
                'Accept' => 'application/json',
                'Authorization' => 'Bearer {token}',
            ],

Am I missing something fundamental here or is this not the desired behaviour? I've read through the docs and from what I can understand this should work?

Include raw in request.url?

Hi,

I'm using Insomnia, and when I import collection.json the urls to the endpoints are empty.

Importing to Postman, exporting from there and importing again to Insomnia makes be believe that this could be fixed by adding raw to the export:

"item": [
{
  "name": "/myendpoint",
  "request": {
    "url": {
      **"raw": "https://example.com/myendpoint",**
      "protocol": "https",
      "host": "example.com",
      "path": "/myendpoint",
      "query": []
    },
}
]

Should this be added, to conform to the way Postman exports its endpoints?

Call to undefined method printQueryParamsAsString()

when i run compass:generate, I am getting the below error.

Facade\Ignition\Exceptions\ViewException 

  Call to undefined method Knuckles\Scribe\Tools\Utils::printQueryParamsAsString() (View: resources/views/vendor/scribe/partials/example-requests/bash.blade.php)

Response Code 201 instead of 200

When generating a response with a factory using @apiResource, @apiResourceCollection, and @apiResourceModel the response code shown in the documentation is 201 Created even if it's clearly a GET method and nothing is beeing created.

From the example page:
image

I'm guessing it has something to do with the factory creating the object, so 201 Created kinda makes sense. But in the end it's still not correct.

Load relations not working

What happened?
I'm trying to create the documentation for a listing endpoint where the returned collection models should also load some relations, here the doc block:

/**
 * My model - index
 * bla bla, bla bla bla bla, bla.
 *
 * @group My Group
 * @queryParam XXX required description. Example: "XXX"
 * @queryParam YYY description. Example: "YYY"
 * @apiResourceCollection \My\Resource\Collection
 * @apiResourceModel \My\Resource\Model paginate=10 states=docs with=rel1,rel2,rel3
 *
 * @param \Illuminate\Http\Request $request
 *
 * @return \My\Resources\Collection
 */
public function index(Request $request) {
  // MY CODE
}

I expect something like:

{
  "data": [
    [{
      "param": "xxx", 
      "param": "yyy", 
      "rel1": {
        "rel_param": "zzz"
      },
      "rel2": {
        "rel_param": "zzz"
      },
    }],
    // THE OTHER RESULTS
  ]
}

but in the generated documentation I only see:

{
  "data": [
    [{
      "param": "xxx", 
      "param": "yyy"
    }],
    // THE OTHER RESULTS
  ]
}

My environment:

  • PHP version: 7.4.7
  • Laravel version: 6.18.20
  • Scribe Version: 1.1.0

My Scribe config:

return [
    'type' => 'laravel',
    'static' => [
        'output_path' => 'public/docs',
    ],
    'laravel' => [
        'add_routes' => false,
        'docs_url' => '/docs',
        'middleware' => [],
    ],
    'auth' => [
        'enabled' => true,
        'in' => 'bearer',
        'name' => 'Authorization',
        'use_value' => env('SCRIBE_AUTH_KEY'),
        'extra_info' => 'You can retrieve your token by visiting your dashboard and clicking <b>Generate API token</b>.',
    ],
    'intro_text' => <<<'INTRO'
Welcome to DAPL API documentation!

<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile), and you can switch the programming language of the examples with the tabs in the top right (or from the nav menu at the top left on mobile).</aside>
INTRO
    ,
    'example_languages' => [
        'javascript',
        'php',
        'bash'
    ],
    'base_url' => env('APP_AUTH_URL'),
    'title' => null,
    'postman' => [
        'enabled' => true,
        'base_url' => null,
        'description' => null,
        'auth' => null,
    ],
    'default_group' => 'api',
    'logo' => resource_path('assets/logo.png'),
    'router' => 'laravel',
    'routes' => [
        [
            'match' => [
                'domains' => ['*'],
                'prefixes' => [
                    'api/*',
                ],
                'versions' => ['v1'],
            ],
            'include' => [],
            'exclude' => [],
            'apply' => [
                'headers' => [
                    'Content-Type' => 'application/json',
                    'Accept' => 'application/json',
                ],
                'response_calls' => [
                    'methods' => ['GET'],
                    'config' => [
                        'app.env' => 'testing',
                        'app.debug' => false,
                    ],
                    'cookies' => [],
                    'queryParams' => [],
                    'bodyParams' => [],
                    'fileParams' => [],
                ],
            ],
        ],
    ],
    'fractal' => [
        'serializer' => null,
    ],
    'faker_seed' => null,
    'strategies' => [
        'metadata' => [
            \Knuckles\Scribe\Extracting\Strategies\Metadata\GetFromDocBlocks::class,
        ],
        'urlParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\UrlParameters\GetFromUrlParamTag::class,
        ],
        'queryParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\QueryParameters\GetFromQueryParamTag::class
        ],
        'headers' => [
            \Knuckles\Scribe\Extracting\Strategies\Headers\GetFromRouteRules::class,
            \Knuckles\Scribe\Extracting\Strategies\Headers\GetFromHeaderTag::class,
        ],
        'bodyParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromFormRequest::class,
            \Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromBodyParamTag::class,
        ],
        'responses' => [
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseTransformerTags::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseResponseTag::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseResponseFileTag::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseApiResourceTags::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\ResponseCalls::class,
        ],
        'responseFields' => [
            \Knuckles\Scribe\Extracting\Strategies\ResponseFields\GetFromResponseFieldTag::class,
        ],
    ],
    'routeMatcher' => \Knuckles\Scribe\Matching\RouteMatcher::class,
];

Feature Request: Add automatic detection of Laravel validators

Auto-detection of Laravel validators for generation of @bodyParam

Scenario

I have a JSON API which allows an external user to POST lots of data to my server. All the incoming data I validate using the Laravel Validator. An example of my controller's contents is as follows:

$validator = Validator::make(
    $postbody,
        [
            'parameter1'  => ['required', 'numeric', ...],
            'parameter2'  => ['required', 'numeric', ...],
        ]
    );
    if ($validator->fails()) {
        return response()->json($validator->errors(), 400);
    } else {
        //Validation passed
    }

These parameters are currently documented as follows:

/**
 * @group Endpoint Group
 * 
 * Some Title
 * @bodyParam parameter1 number required Some kind of description. Example: 12356
 * @bodyParam parameter2 number required Some kind of description. Example: 12356
 */

Feature Request

Please add automatic detection of these Validator rules so that body parameters do not need to be manually specified. The user can then enter manual descriptions via the @bodyParam should they wish to do so otherwise the auto-generated validation rules can be used instead.

Mongodb Transaction Error

i m using mongodb in my project. So when ı generate php artisan scribe:generate, i get this error:
mongodb_transaction
How can i solve this error ? Is there any setting to disable mongodb connection? or to override startDbTransaction() that is trait method ?

Docs not generating

Hi, I've read all the docs, followed the steps and things appear to be working but when I run the generate command, nothing is generated. I see a list like this:

Screenshot 2020-06-23 at 14 07 47

But nothing is generated. I've tried various settings and nothing changes. Any ideas? Please excuse me if I'm missing something obvious..

Can't install on Laravel 7

Hi there,

I would like to give this package a try, however i can't seem to get it working on Laravel 7.

  • Laravel: 7.11.0
  • Php: 7.4.4

Packages

"require": {
        "php": "^7.2.5",
        "bugsnag/bugsnag-laravel": "^2.18",
        "doctrine/dbal": "^2.10",
        "fideloper/proxy": "^4.2",
        "fruitcake/laravel-cors": "^1.0",
        "guzzlehttp/guzzle": "^6.3",
        "laravel/framework": "^7.0",
        "laravel/sanctum": "^2.2",
        "laravel/tinker": "^2.0",
        "lorisleiva/laravel-deployer": "^0.3.2"
    },
    "require-dev": {
        "barryvdh/laravel-ide-helper": "^2.7",
        "facade/ignition": "^2.0",
        "fzaninotto/faker": "^1.9.1",
        "knuckleswtf/scribe": "dev-master",
        "laravel/homestead": "^10.7",
        "mockery/mockery": "^1.3.1",
        "nunomaduro/collision": "^4.1",
        "phpunit/phpunit": "^8.5"
    },

console log

composer require --dev knuckleswtf/scribe              
Using version dev-master for knuckleswtf/scribe
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Conclusion: install mnapoli/front-yaml 1.6.0
    - Conclusion: remove symfony/routing v5.0.8
    - Conclusion: don't install symfony/routing v5.0.8
    - symfony/yaml 2.7.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 2.8.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 3.0.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 3.1.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 3.2.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 3.3.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 3.4.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 4.0.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 4.1.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 4.2.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 4.3.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.0-BETA2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.12 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.13 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.14 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.15 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.16 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.17 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.18 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.19 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.20 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.21 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.22 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.23 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.24 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.25 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.26 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.27 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.28 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.29 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.30 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.31 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.32 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.33 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.34 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.35 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.36 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.37 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.38 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.39 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.40 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.41 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.42 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.43 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.44 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.45 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.46 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.47 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.48 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.49 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.50 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.51 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.7.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.12 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.13 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.14 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.15 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.16 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.17 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.18 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.19 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.20 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.21 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.22 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.23 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.24 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.25 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.26 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.27 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.28 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.29 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.30 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.31 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.32 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.33 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.34 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.35 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.36 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.37 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.38 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.39 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.40 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.41 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.42 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.43 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.44 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.45 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.46 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.47 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.48 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.49 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.50 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.52 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.8.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.0.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.0.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.0.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.0.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.0.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.0.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.0.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.0.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.0.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.0.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.0.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.0-RC1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.1.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.0-RC1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.0-RC2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.12 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.13 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.14 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.2.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.0-RC1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.12 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.13 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.14 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.15 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.16 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.17 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.18 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.3.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.0-BETA2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.0-BETA3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.0-BETA4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.0-RC1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.0-RC2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.12 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.13 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.14 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.15 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.16 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.17 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.18 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.19 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.20 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.21 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.22 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.23 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.24 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.25 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.26 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.27 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.28 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.29 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.30 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.31 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.32 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.33 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.34 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.35 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.36 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.37 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.38 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.39 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.40 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v3.4.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.0-BETA2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.0-BETA3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.0-BETA4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.0-RC1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.0-RC2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.12 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.13 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.14 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.15 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.0.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.0-BETA2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.0-BETA3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.12 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.1.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.0-BETA2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.0-RC1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.12 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.2.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.0-BETA2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.0-RC1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v4.3.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 2.1.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 2.2.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 2.3.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 2.4.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 2.5.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml 2.6.x-dev conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.12 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.13 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.1.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.2.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.2.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.2.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.2.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.2.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.2.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.2.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.2.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.2.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.2.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.2.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.2.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.12 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.13 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.14 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.15 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.16 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.17 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.18 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.19 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.20 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.21 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.22 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.23 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.24 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.25 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.26 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.27 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.28 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.29 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.30 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.31 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.32 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.33 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.34 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.35 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.36 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.37 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.38 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.39 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.40 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.41 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.42 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.3.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.0-BETA2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.0-RC1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.4.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.0-BETA2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.0-RC1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.12 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.5.9 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.0 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.0-BETA1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.0-BETA2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.1 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.10 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.11 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.12 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.13 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.2 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.3 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.4 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.5 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.6 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.7 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.8 conflicts with symfony/routing[v5.0.8].
    - symfony/yaml v2.6.9 conflicts with symfony/routing[v5.0.8].
    - Installation request for symfony/routing (locked at v5.0.8) -> satisfiable by symfony/routing[v5.0.8].
    - Installation request for knuckleswtf/scribe dev-master -> satisfiable by knuckleswtf/scribe[dev-master].
    - Conclusion: don't install symfony/yaml v5.0.8|install symfony/yaml 2.1.x-dev|install symfony/yaml 2.2.x-dev|install symfony/yaml 2.3.x-dev|install symfony/yaml 2.4.x-dev|install symfony/yaml 2.5.x-dev|install symfony/yaml 2.6.x-dev|install symfony/yaml 2.7.x-dev|install symfony/yaml 2.8.x-dev|install symfony/yaml 3.0.x-dev|install symfony/yaml 3.1.x-dev|install symfony/yaml 3.2.x-dev|install symfony/yaml 3.3.x-dev|install symfony/yaml 3.4.x-dev|install symfony/yaml 4.0.x-dev|install symfony/yaml 4.1.x-dev|install symfony/yaml 4.2.x-dev|install symfony/yaml 4.3.x-dev|install symfony/yaml v2.1.0|install symfony/yaml v2.1.1|install symfony/yaml v2.1.10|install symfony/yaml v2.1.11|install symfony/yaml v2.1.12|install symfony/yaml v2.1.13|install symfony/yaml v2.1.2|install symfony/yaml v2.1.3|install symfony/yaml v2.1.4|install symfony/yaml v2.1.5|install symfony/yaml v2.1.6|install symfony/yaml v2.1.7|install symfony/yaml v2.1.8|install symfony/yaml v2.1.9|install symfony/yaml v2.2.0|install symfony/yaml v2.2.1|install symfony/yaml v2.2.10|install symfony/yaml v2.2.11|install symfony/yaml v2.2.2|install symfony/yaml v2.2.3|install symfony/yaml v2.2.4|install symfony/yaml v2.2.5|install symfony/yaml v2.2.6|install symfony/yaml v2.2.7|install symfony/yaml v2.2.8|install symfony/yaml v2.2.9|install symfony/yaml v2.3.0|install symfony/yaml v2.3.1|install symfony/yaml v2.3.10|install symfony/yaml v2.3.11|install symfony/yaml v2.3.12|install symfony/yaml v2.3.13|install symfony/yaml v2.3.14|install symfony/yaml v2.3.15|install symfony/yaml v2.3.16|install symfony/yaml v2.3.17|install symfony/yaml v2.3.18|install symfony/yaml v2.3.19|install symfony/yaml v2.3.2|install symfony/yaml v2.3.20|install symfony/yaml v2.3.21|install symfony/yaml v2.3.22|install symfony/yaml v2.3.23|install symfony/yaml v2.3.24|install symfony/yaml v2.3.25|install symfony/yaml v2.3.26|install symfony/yaml v2.3.27|install symfony/yaml v2.3.28|install symfony/yaml v2.3.29|install symfony/yaml v2.3.3|install symfony/yaml v2.3.30|install symfony/yaml v2.3.31|install symfony/yaml v2.3.32|install symfony/yaml v2.3.33|install symfony/yaml v2.3.34|install symfony/yaml v2.3.35|install symfony/yaml v2.3.36|install symfony/yaml v2.3.37|install symfony/yaml v2.3.38|install symfony/yaml v2.3.39|install symfony/yaml v2.3.4|install symfony/yaml v2.3.40|install symfony/yaml v2.3.41|install symfony/yaml v2.3.42|install symfony/yaml v2.3.5|install symfony/yaml v2.3.6|install symfony/yaml v2.3.7|install symfony/yaml v2.3.8|install symfony/yaml v2.3.9|install symfony/yaml v2.4.0|install symfony/yaml v2.4.0-BETA1|install symfony/yaml v2.4.0-BETA2|install symfony/yaml v2.4.0-RC1|install symfony/yaml v2.4.1|install symfony/yaml v2.4.10|install symfony/yaml v2.4.2|install symfony/yaml v2.4.3|install symfony/yaml v2.4.4|install symfony/yaml v2.4.5|install symfony/yaml v2.4.6|install symfony/yaml v2.4.7|install symfony/yaml v2.4.8|install symfony/yaml v2.4.9|install symfony/yaml v2.5.0|install symfony/yaml v2.5.0-BETA1|install symfony/yaml v2.5.0-BETA2|install symfony/yaml v2.5.0-RC1|install symfony/yaml v2.5.1|install symfony/yaml v2.5.10|install symfony/yaml v2.5.11|install symfony/yaml v2.5.12|install symfony/yaml v2.5.2|install symfony/yaml v2.5.3|install symfony/yaml v2.5.4|install symfony/yaml v2.5.5|install symfony/yaml v2.5.6|install symfony/yaml v2.5.7|install symfony/yaml v2.5.8|install symfony/yaml v2.5.9|install symfony/yaml v2.6.0|install symfony/yaml v2.6.0-BETA1|install symfony/yaml v2.6.0-BETA2|install symfony/yaml v2.6.1|install symfony/yaml v2.6.10|install symfony/yaml v2.6.11|install symfony/yaml v2.6.12|install symfony/yaml v2.6.13|install symfony/yaml v2.6.2|install symfony/yaml v2.6.3|install symfony/yaml v2.6.4|install symfony/yaml v2.6.5|install symfony/yaml v2.6.6|install symfony/yaml v2.6.7|install symfony/yaml v2.6.8|install symfony/yaml v2.6.9|install symfony/yaml v2.7.0|install symfony/yaml v2.7.0-BETA1|install symfony/yaml v2.7.0-BETA2|install symfony/yaml v2.7.1|install symfony/yaml v2.7.10|install symfony/yaml v2.7.11|install symfony/yaml v2.7.12|install symfony/yaml v2.7.13|install symfony/yaml v2.7.14|install symfony/yaml v2.7.15|install symfony/yaml v2.7.16|install symfony/yaml v2.7.17|install symfony/yaml v2.7.18|install symfony/yaml v2.7.19|install symfony/yaml v2.7.2|install symfony/yaml v2.7.20|install symfony/yaml v2.7.21|install symfony/yaml v2.7.22|install symfony/yaml v2.7.23|install symfony/yaml v2.7.24|install symfony/yaml v2.7.25|install symfony/yaml v2.7.26|install symfony/yaml v2.7.27|install symfony/yaml v2.7.28|install symfony/yaml v2.7.29|install symfony/yaml v2.7.3|install symfony/yaml v2.7.30|install symfony/yaml v2.7.31|install symfony/yaml v2.7.32|install symfony/yaml v2.7.33|install symfony/yaml v2.7.34|install symfony/yaml v2.7.35|install symfony/yaml v2.7.36|install symfony/yaml v2.7.37|install symfony/yaml v2.7.38|install symfony/yaml v2.7.39|install symfony/yaml v2.7.4|install symfony/yaml v2.7.40|install symfony/yaml v2.7.41|install symfony/yaml v2.7.42|install symfony/yaml v2.7.43|install symfony/yaml v2.7.44|install symfony/yaml v2.7.45|install symfony/yaml v2.7.46|install symfony/yaml v2.7.47|install symfony/yaml v2.7.48|install symfony/yaml v2.7.49|install symfony/yaml v2.7.5|install symfony/yaml v2.7.50|install symfony/yaml v2.7.51|install symfony/yaml v2.7.6|install symfony/yaml v2.7.7|install symfony/yaml v2.7.8|install symfony/yaml v2.7.9|install symfony/yaml v2.8.0|install symfony/yaml v2.8.0-BETA1|install symfony/yaml v2.8.1|install symfony/yaml v2.8.10|install symfony/yaml v2.8.11|install symfony/yaml v2.8.12|install symfony/yaml v2.8.13|install symfony/yaml v2.8.14|install symfony/yaml v2.8.15|install symfony/yaml v2.8.16|install symfony/yaml v2.8.17|install symfony/yaml v2.8.18|install symfony/yaml v2.8.19|install symfony/yaml v2.8.2|install symfony/yaml v2.8.20|install symfony/yaml v2.8.21|install symfony/yaml v2.8.22|install symfony/yaml v2.8.23|install symfony/yaml v2.8.24|install symfony/yaml v2.8.25|install symfony/yaml v2.8.26|install symfony/yaml v2.8.27|install symfony/yaml v2.8.28|install symfony/yaml v2.8.29|install symfony/yaml v2.8.3|install symfony/yaml v2.8.30|install symfony/yaml v2.8.31|install symfony/yaml v2.8.32|install symfony/yaml v2.8.33|install symfony/yaml v2.8.34|install symfony/yaml v2.8.35|install symfony/yaml v2.8.36|install symfony/yaml v2.8.37|install symfony/yaml v2.8.38|install symfony/yaml v2.8.39|install symfony/yaml v2.8.4|install symfony/yaml v2.8.40|install symfony/yaml v2.8.41|install symfony/yaml v2.8.42|install symfony/yaml v2.8.43|install symfony/yaml v2.8.44|install symfony/yaml v2.8.45|install symfony/yaml v2.8.46|install symfony/yaml v2.8.47|install symfony/yaml v2.8.48|install symfony/yaml v2.8.49|install symfony/yaml v2.8.5|install symfony/yaml v2.8.50|install symfony/yaml v2.8.52|install symfony/yaml v2.8.6|install symfony/yaml v2.8.7|install symfony/yaml v2.8.8|install symfony/yaml v2.8.9|install symfony/yaml v3.0.0|install symfony/yaml v3.0.0-BETA1|install symfony/yaml v3.0.1|install symfony/yaml v3.0.2|install symfony/yaml v3.0.3|install symfony/yaml v3.0.4|install symfony/yaml v3.0.5|install symfony/yaml v3.0.6|install symfony/yaml v3.0.7|install symfony/yaml v3.0.8|install symfony/yaml v3.0.9|install symfony/yaml v3.1.0|install symfony/yaml v3.1.0-BETA1|install symfony/yaml v3.1.0-RC1|install symfony/yaml v3.1.1|install symfony/yaml v3.1.10|install symfony/yaml v3.1.2|install symfony/yaml v3.1.3|install symfony/yaml v3.1.4|install symfony/yaml v3.1.5|install symfony/yaml v3.1.6|install symfony/yaml v3.1.7|install symfony/yaml v3.1.8|install symfony/yaml v3.1.9|install symfony/yaml v3.2.0|install symfony/yaml v3.2.0-BETA1|install symfony/yaml v3.2.0-RC1|install symfony/yaml v3.2.0-RC2|install symfony/yaml v3.2.1|install symfony/yaml v3.2.10|install symfony/yaml v3.2.11|install symfony/yaml v3.2.12|install symfony/yaml v3.2.13|install symfony/yaml v3.2.14|install symfony/yaml v3.2.2|install symfony/yaml v3.2.3|install symfony/yaml v3.2.4|install symfony/yaml v3.2.5|install symfony/yaml v3.2.6|install symfony/yaml v3.2.7|install symfony/yaml v3.2.8|install symfony/yaml v3.2.9|install symfony/yaml v3.3.0|install symfony/yaml v3.3.0-BETA1|install symfony/yaml v3.3.0-RC1|install symfony/yaml v3.3.1|install symfony/yaml v3.3.10|install symfony/yaml v3.3.11|install symfony/yaml v3.3.12|install symfony/yaml v3.3.13|install symfony/yaml v3.3.14|install symfony/yaml v3.3.15|install symfony/yaml v3.3.16|install symfony/yaml v3.3.17|install symfony/yaml v3.3.18|install symfony/yaml v3.3.2|install symfony/yaml v3.3.3|install symfony/yaml v3.3.4|install symfony/yaml v3.3.5|install symfony/yaml v3.3.6|install symfony/yaml v3.3.7|install symfony/yaml v3.3.8|install symfony/yaml v3.3.9|install symfony/yaml v3.4.0|install symfony/yaml v3.4.0-BETA1|install symfony/yaml v3.4.0-BETA2|install symfony/yaml v3.4.0-BETA3|install symfony/yaml v3.4.0-BETA4|install symfony/yaml v3.4.0-RC1|install symfony/yaml v3.4.0-RC2|install symfony/yaml v3.4.1|install symfony/yaml v3.4.10|install symfony/yaml v3.4.11|install symfony/yaml v3.4.12|install symfony/yaml v3.4.13|install symfony/yaml v3.4.14|install symfony/yaml v3.4.15|install symfony/yaml v3.4.16|install symfony/yaml v3.4.17|install symfony/yaml v3.4.18|install symfony/yaml v3.4.19|install symfony/yaml v3.4.2|install symfony/yaml v3.4.20|install symfony/yaml v3.4.21|install symfony/yaml v3.4.22|install symfony/yaml v3.4.23|install symfony/yaml v3.4.24|install symfony/yaml v3.4.25|install symfony/yaml v3.4.26|install symfony/yaml v3.4.27|install symfony/yaml v3.4.28|install symfony/yaml v3.4.29|install symfony/yaml v3.4.3|install symfony/yaml v3.4.30|install symfony/yaml v3.4.31|install symfony/yaml v3.4.32|install symfony/yaml v3.4.33|install symfony/yaml v3.4.34|install symfony/yaml v3.4.35|install symfony/yaml v3.4.36|install symfony/yaml v3.4.37|install symfony/yaml v3.4.38|install symfony/yaml v3.4.39|install symfony/yaml v3.4.4|install symfony/yaml v3.4.40|install symfony/yaml v3.4.5|install symfony/yaml v3.4.6|install symfony/yaml v3.4.7|install symfony/yaml v3.4.8|install symfony/yaml v3.4.9|install symfony/yaml v4.0.0|install symfony/yaml v4.0.0-BETA1|install symfony/yaml v4.0.0-BETA2|install symfony/yaml v4.0.0-BETA3|install symfony/yaml v4.0.0-BETA4|install symfony/yaml v4.0.0-RC1|install symfony/yaml v4.0.0-RC2|install symfony/yaml v4.0.1|install symfony/yaml v4.0.10|install symfony/yaml v4.0.11|install symfony/yaml v4.0.12|install symfony/yaml v4.0.13|install symfony/yaml v4.0.14|install symfony/yaml v4.0.15|install symfony/yaml v4.0.2|install symfony/yaml v4.0.3|install symfony/yaml v4.0.4|install symfony/yaml v4.0.5|install symfony/yaml v4.0.6|install symfony/yaml v4.0.7|install symfony/yaml v4.0.8|install symfony/yaml v4.0.9|install symfony/yaml v4.1.0|install symfony/yaml v4.1.0-BETA1|install symfony/yaml v4.1.0-BETA2|install symfony/yaml v4.1.0-BETA3|install symfony/yaml v4.1.1|install symfony/yaml v4.1.10|install symfony/yaml v4.1.11|install symfony/yaml v4.1.12|install symfony/yaml v4.1.2|install symfony/yaml v4.1.3|install symfony/yaml v4.1.4|install symfony/yaml v4.1.5|install symfony/yaml v4.1.6|install symfony/yaml v4.1.7|install symfony/yaml v4.1.8|install symfony/yaml v4.1.9|install symfony/yaml v4.2.0|install symfony/yaml v4.2.0-BETA1|install symfony/yaml v4.2.0-BETA2|install symfony/yaml v4.2.0-RC1|install symfony/yaml v4.2.1|install symfony/yaml v4.2.10|install symfony/yaml v4.2.11|install symfony/yaml v4.2.12|install symfony/yaml v4.2.2|install symfony/yaml v4.2.3|install symfony/yaml v4.2.4|install symfony/yaml v4.2.5|install symfony/yaml v4.2.6|install symfony/yaml v4.2.7|install symfony/yaml v4.2.8|install symfony/yaml v4.2.9|install symfony/yaml v4.3.0|install symfony/yaml v4.3.0-BETA1|install symfony/yaml v4.3.0-BETA2|install symfony/yaml v4.3.0-RC1|install symfony/yaml v4.3.1|install symfony/yaml v4.3.10|install symfony/yaml v4.3.11|install symfony/yaml v4.3.2|install symfony/yaml v4.3.3|install symfony/yaml v4.3.4|install symfony/yaml v4.3.5|install symfony/yaml v4.3.6|install symfony/yaml v4.3.7|install symfony/yaml v4.3.8|install symfony/yaml v4.3.9
    - Conclusion: remove symfony/yaml v5.0.8|install symfony/yaml 2.1.x-dev|install symfony/yaml 2.2.x-dev|install symfony/yaml 2.3.x-dev|install symfony/yaml 2.4.x-dev|install symfony/yaml 2.5.x-dev|install symfony/yaml 2.6.x-dev|install symfony/yaml 2.7.x-dev|install symfony/yaml 2.8.x-dev|install symfony/yaml 3.0.x-dev|install symfony/yaml 3.1.x-dev|install symfony/yaml 3.2.x-dev|install symfony/yaml 3.3.x-dev|install symfony/yaml 3.4.x-dev|install symfony/yaml 4.0.x-dev|install symfony/yaml 4.1.x-dev|install symfony/yaml 4.2.x-dev|install symfony/yaml 4.3.x-dev|install symfony/yaml v2.1.0|install symfony/yaml v2.1.1|install symfony/yaml v2.1.10|install symfony/yaml v2.1.11|install symfony/yaml v2.1.12|install symfony/yaml v2.1.13|install symfony/yaml v2.1.2|install symfony/yaml v2.1.3|install symfony/yaml v2.1.4|install symfony/yaml v2.1.5|install symfony/yaml v2.1.6|install symfony/yaml v2.1.7|install symfony/yaml v2.1.8|install symfony/yaml v2.1.9|install symfony/yaml v2.2.0|install symfony/yaml v2.2.1|install symfony/yaml v2.2.10|install symfony/yaml v2.2.11|install symfony/yaml v2.2.2|install symfony/yaml v2.2.3|install symfony/yaml v2.2.4|install symfony/yaml v2.2.5|install symfony/yaml v2.2.6|install symfony/yaml v2.2.7|install symfony/yaml v2.2.8|install symfony/yaml v2.2.9|install symfony/yaml v2.3.0|install symfony/yaml v2.3.1|install symfony/yaml v2.3.10|install symfony/yaml v2.3.11|install symfony/yaml v2.3.12|install symfony/yaml v2.3.13|install symfony/yaml v2.3.14|install symfony/yaml v2.3.15|install symfony/yaml v2.3.16|install symfony/yaml v2.3.17|install symfony/yaml v2.3.18|install symfony/yaml v2.3.19|install symfony/yaml v2.3.2|install symfony/yaml v2.3.20|install symfony/yaml v2.3.21|install symfony/yaml v2.3.22|install symfony/yaml v2.3.23|install symfony/yaml v2.3.24|install symfony/yaml v2.3.25|install symfony/yaml v2.3.26|install symfony/yaml v2.3.27|install symfony/yaml v2.3.28|install symfony/yaml v2.3.29|install symfony/yaml v2.3.3|install symfony/yaml v2.3.30|install symfony/yaml v2.3.31|install symfony/yaml v2.3.32|install symfony/yaml v2.3.33|install symfony/yaml v2.3.34|install symfony/yaml v2.3.35|install symfony/yaml v2.3.36|install symfony/yaml v2.3.37|install symfony/yaml v2.3.38|install symfony/yaml v2.3.39|install symfony/yaml v2.3.4|install symfony/yaml v2.3.40|install symfony/yaml v2.3.41|install symfony/yaml v2.3.42|install symfony/yaml v2.3.5|install symfony/yaml v2.3.6|install symfony/yaml v2.3.7|install symfony/yaml v2.3.8|install symfony/yaml v2.3.9|install symfony/yaml v2.4.0|install symfony/yaml v2.4.0-BETA1|install symfony/yaml v2.4.0-BETA2|install symfony/yaml v2.4.0-RC1|install symfony/yaml v2.4.1|install symfony/yaml v2.4.10|install symfony/yaml v2.4.2|install symfony/yaml v2.4.3|install symfony/yaml v2.4.4|install symfony/yaml v2.4.5|install symfony/yaml v2.4.6|install symfony/yaml v2.4.7|install symfony/yaml v2.4.8|install symfony/yaml v2.4.9|install symfony/yaml v2.5.0|install symfony/yaml v2.5.0-BETA1|install symfony/yaml v2.5.0-BETA2|install symfony/yaml v2.5.0-RC1|install symfony/yaml v2.5.1|install symfony/yaml v2.5.10|install symfony/yaml v2.5.11|install symfony/yaml v2.5.12|install symfony/yaml v2.5.2|install symfony/yaml v2.5.3|install symfony/yaml v2.5.4|install symfony/yaml v2.5.5|install symfony/yaml v2.5.6|install symfony/yaml v2.5.7|install symfony/yaml v2.5.8|install symfony/yaml v2.5.9|install symfony/yaml v2.6.0|install symfony/yaml v2.6.0-BETA1|install symfony/yaml v2.6.0-BETA2|install symfony/yaml v2.6.1|install symfony/yaml v2.6.10|install symfony/yaml v2.6.11|install symfony/yaml v2.6.12|install symfony/yaml v2.6.13|install symfony/yaml v2.6.2|install symfony/yaml v2.6.3|install symfony/yaml v2.6.4|install symfony/yaml v2.6.5|install symfony/yaml v2.6.6|install symfony/yaml v2.6.7|install symfony/yaml v2.6.8|install symfony/yaml v2.6.9|install symfony/yaml v2.7.0|install symfony/yaml v2.7.0-BETA1|install symfony/yaml v2.7.0-BETA2|install symfony/yaml v2.7.1|install symfony/yaml v2.7.10|install symfony/yaml v2.7.11|install symfony/yaml v2.7.12|install symfony/yaml v2.7.13|install symfony/yaml v2.7.14|install symfony/yaml v2.7.15|install symfony/yaml v2.7.16|install symfony/yaml v2.7.17|install symfony/yaml v2.7.18|install symfony/yaml v2.7.19|install symfony/yaml v2.7.2|install symfony/yaml v2.7.20|install symfony/yaml v2.7.21|install symfony/yaml v2.7.22|install symfony/yaml v2.7.23|install symfony/yaml v2.7.24|install symfony/yaml v2.7.25|install symfony/yaml v2.7.26|install symfony/yaml v2.7.27|install symfony/yaml v2.7.28|install symfony/yaml v2.7.29|install symfony/yaml v2.7.3|install symfony/yaml v2.7.30|install symfony/yaml v2.7.31|install symfony/yaml v2.7.32|install symfony/yaml v2.7.33|install symfony/yaml v2.7.34|install symfony/yaml v2.7.35|install symfony/yaml v2.7.36|install symfony/yaml v2.7.37|install symfony/yaml v2.7.38|install symfony/yaml v2.7.39|install symfony/yaml v2.7.4|install symfony/yaml v2.7.40|install symfony/yaml v2.7.41|install symfony/yaml v2.7.42|install symfony/yaml v2.7.43|install symfony/yaml v2.7.44|install symfony/yaml v2.7.45|install symfony/yaml v2.7.46|install symfony/yaml v2.7.47|install symfony/yaml v2.7.48|install symfony/yaml v2.7.49|install symfony/yaml v2.7.5|install symfony/yaml v2.7.50|install symfony/yaml v2.7.51|install symfony/yaml v2.7.6|install symfony/yaml v2.7.7|install symfony/yaml v2.7.8|install symfony/yaml v2.7.9|install symfony/yaml v2.8.0|install symfony/yaml v2.8.0-BETA1|install symfony/yaml v2.8.1|install symfony/yaml v2.8.10|install symfony/yaml v2.8.11|install symfony/yaml v2.8.12|install symfony/yaml v2.8.13|install symfony/yaml v2.8.14|install symfony/yaml v2.8.15|install symfony/yaml v2.8.16|install symfony/yaml v2.8.17|install symfony/yaml v2.8.18|install symfony/yaml v2.8.19|install symfony/yaml v2.8.2|install symfony/yaml v2.8.20|install symfony/yaml v2.8.21|install symfony/yaml v2.8.22|install symfony/yaml v2.8.23|install symfony/yaml v2.8.24|install symfony/yaml v2.8.25|install symfony/yaml v2.8.26|install symfony/yaml v2.8.27|install symfony/yaml v2.8.28|install symfony/yaml v2.8.29|install symfony/yaml v2.8.3|install symfony/yaml v2.8.30|install symfony/yaml v2.8.31|install symfony/yaml v2.8.32|install symfony/yaml v2.8.33|install symfony/yaml v2.8.34|install symfony/yaml v2.8.35|install symfony/yaml v2.8.36|install symfony/yaml v2.8.37|install symfony/yaml v2.8.38|install symfony/yaml v2.8.39|install symfony/yaml v2.8.4|install symfony/yaml v2.8.40|install symfony/yaml v2.8.41|install symfony/yaml v2.8.42|install symfony/yaml v2.8.43|install symfony/yaml v2.8.44|install symfony/yaml v2.8.45|install symfony/yaml v2.8.46|install symfony/yaml v2.8.47|install symfony/yaml v2.8.48|install symfony/yaml v2.8.49|install symfony/yaml v2.8.5|install symfony/yaml v2.8.50|install symfony/yaml v2.8.52|install symfony/yaml v2.8.6|install symfony/yaml v2.8.7|install symfony/yaml v2.8.8|install symfony/yaml v2.8.9|install symfony/yaml v3.0.0|install symfony/yaml v3.0.0-BETA1|install symfony/yaml v3.0.1|install symfony/yaml v3.0.2|install symfony/yaml v3.0.3|install symfony/yaml v3.0.4|install symfony/yaml v3.0.5|install symfony/yaml v3.0.6|install symfony/yaml v3.0.7|install symfony/yaml v3.0.8|install symfony/yaml v3.0.9|install symfony/yaml v3.1.0|install symfony/yaml v3.1.0-BETA1|install symfony/yaml v3.1.0-RC1|install symfony/yaml v3.1.1|install symfony/yaml v3.1.10|install symfony/yaml v3.1.2|install symfony/yaml v3.1.3|install symfony/yaml v3.1.4|install symfony/yaml v3.1.5|install symfony/yaml v3.1.6|install symfony/yaml v3.1.7|install symfony/yaml v3.1.8|install symfony/yaml v3.1.9|install symfony/yaml v3.2.0|install symfony/yaml v3.2.0-BETA1|install symfony/yaml v3.2.0-RC1|install symfony/yaml v3.2.0-RC2|install symfony/yaml v3.2.1|install symfony/yaml v3.2.10|install symfony/yaml v3.2.11|install symfony/yaml v3.2.12|install symfony/yaml v3.2.13|install symfony/yaml v3.2.14|install symfony/yaml v3.2.2|install symfony/yaml v3.2.3|install symfony/yaml v3.2.4|install symfony/yaml v3.2.5|install symfony/yaml v3.2.6|install symfony/yaml v3.2.7|install symfony/yaml v3.2.8|install symfony/yaml v3.2.9|install symfony/yaml v3.3.0|install symfony/yaml v3.3.0-BETA1|install symfony/yaml v3.3.0-RC1|install symfony/yaml v3.3.1|install symfony/yaml v3.3.10|install symfony/yaml v3.3.11|install symfony/yaml v3.3.12|install symfony/yaml v3.3.13|install symfony/yaml v3.3.14|install symfony/yaml v3.3.15|install symfony/yaml v3.3.16|install symfony/yaml v3.3.17|install symfony/yaml v3.3.18|install symfony/yaml v3.3.2|install symfony/yaml v3.3.3|install symfony/yaml v3.3.4|install symfony/yaml v3.3.5|install symfony/yaml v3.3.6|install symfony/yaml v3.3.7|install symfony/yaml v3.3.8|install symfony/yaml v3.3.9|install symfony/yaml v3.4.0|install symfony/yaml v3.4.0-BETA1|install symfony/yaml v3.4.0-BETA2|install symfony/yaml v3.4.0-BETA3|install symfony/yaml v3.4.0-BETA4|install symfony/yaml v3.4.0-RC1|install symfony/yaml v3.4.0-RC2|install symfony/yaml v3.4.1|install symfony/yaml v3.4.10|install symfony/yaml v3.4.11|install symfony/yaml v3.4.12|install symfony/yaml v3.4.13|install symfony/yaml v3.4.14|install symfony/yaml v3.4.15|install symfony/yaml v3.4.16|install symfony/yaml v3.4.17|install symfony/yaml v3.4.18|install symfony/yaml v3.4.19|install symfony/yaml v3.4.2|install symfony/yaml v3.4.20|install symfony/yaml v3.4.21|install symfony/yaml v3.4.22|install symfony/yaml v3.4.23|install symfony/yaml v3.4.24|install symfony/yaml v3.4.25|install symfony/yaml v3.4.26|install symfony/yaml v3.4.27|install symfony/yaml v3.4.28|install symfony/yaml v3.4.29|install symfony/yaml v3.4.3|install symfony/yaml v3.4.30|install symfony/yaml v3.4.31|install symfony/yaml v3.4.32|install symfony/yaml v3.4.33|install symfony/yaml v3.4.34|install symfony/yaml v3.4.35|install symfony/yaml v3.4.36|install symfony/yaml v3.4.37|install symfony/yaml v3.4.38|install symfony/yaml v3.4.39|install symfony/yaml v3.4.4|install symfony/yaml v3.4.40|install symfony/yaml v3.4.5|install symfony/yaml v3.4.6|install symfony/yaml v3.4.7|install symfony/yaml v3.4.8|install symfony/yaml v3.4.9|install symfony/yaml v4.0.0|install symfony/yaml v4.0.0-BETA1|install symfony/yaml v4.0.0-BETA2|install symfony/yaml v4.0.0-BETA3|install symfony/yaml v4.0.0-BETA4|install symfony/yaml v4.0.0-RC1|install symfony/yaml v4.0.0-RC2|install symfony/yaml v4.0.1|install symfony/yaml v4.0.10|install symfony/yaml v4.0.11|install symfony/yaml v4.0.12|install symfony/yaml v4.0.13|install symfony/yaml v4.0.14|install symfony/yaml v4.0.15|install symfony/yaml v4.0.2|install symfony/yaml v4.0.3|install symfony/yaml v4.0.4|install symfony/yaml v4.0.5|install symfony/yaml v4.0.6|install symfony/yaml v4.0.7|install symfony/yaml v4.0.8|install symfony/yaml v4.0.9|install symfony/yaml v4.1.0|install symfony/yaml v4.1.0-BETA1|install symfony/yaml v4.1.0-BETA2|install symfony/yaml v4.1.0-BETA3|install symfony/yaml v4.1.1|install symfony/yaml v4.1.10|install symfony/yaml v4.1.11|install symfony/yaml v4.1.12|install symfony/yaml v4.1.2|install symfony/yaml v4.1.3|install symfony/yaml v4.1.4|install symfony/yaml v4.1.5|install symfony/yaml v4.1.6|install symfony/yaml v4.1.7|install symfony/yaml v4.1.8|install symfony/yaml v4.1.9|install symfony/yaml v4.2.0|install symfony/yaml v4.2.0-BETA1|install symfony/yaml v4.2.0-BETA2|install symfony/yaml v4.2.0-RC1|install symfony/yaml v4.2.1|install symfony/yaml v4.2.10|install symfony/yaml v4.2.11|install symfony/yaml v4.2.12|install symfony/yaml v4.2.2|install symfony/yaml v4.2.3|install symfony/yaml v4.2.4|install symfony/yaml v4.2.5|install symfony/yaml v4.2.6|install symfony/yaml v4.2.7|install symfony/yaml v4.2.8|install symfony/yaml v4.2.9|install symfony/yaml v4.3.0|install symfony/yaml v4.3.0-BETA1|install symfony/yaml v4.3.0-BETA2|install symfony/yaml v4.3.0-RC1|install symfony/yaml v4.3.1|install symfony/yaml v4.3.10|install symfony/yaml v4.3.11|install symfony/yaml v4.3.2|install symfony/yaml v4.3.3|install symfony/yaml v4.3.4|install symfony/yaml v4.3.5|install symfony/yaml v4.3.6|install symfony/yaml v4.3.7|install symfony/yaml v4.3.8|install symfony/yaml v4.3.9
    - mnapoli/front-yaml 1.6.0 requires symfony/yaml ~2.1|^3.0|^4.0 -> satisfiable by symfony/yaml[2.1.x-dev, 2.2.x-dev, 2.3.x-dev, 2.4.x-dev, 2.5.x-dev, 2.6.x-dev, 2.7.x-dev, 2.8.x-dev, 3.0.x-dev, 3.1.x-dev, 3.2.x-dev, 3.3.x-dev, 3.4.x-dev, 4.0.x-dev, 4.1.x-dev, 4.2.x-dev, 4.3.x-dev, 4.4.x-dev, v2.1.0, v2.1.1, v2.1.10, v2.1.11, v2.1.12, v2.1.13, v2.1.2, v2.1.3, v2.1.4, v2.1.5, v2.1.6, v2.1.7, v2.1.8, v2.1.9, v2.2.0, v2.2.1, v2.2.10, v2.2.11, v2.2.2, v2.2.3, v2.2.4, v2.2.5, v2.2.6, v2.2.7, v2.2.8, v2.2.9, v2.3.0, v2.3.1, v2.3.10, v2.3.11, v2.3.12, v2.3.13, v2.3.14, v2.3.15, v2.3.16, v2.3.17, v2.3.18, v2.3.19, v2.3.2, v2.3.20, v2.3.21, v2.3.22, v2.3.23, v2.3.24, v2.3.25, v2.3.26, v2.3.27, v2.3.28, v2.3.29, v2.3.3, v2.3.30, v2.3.31, v2.3.32, v2.3.33, v2.3.34, v2.3.35, v2.3.36, v2.3.37, v2.3.38, v2.3.39, v2.3.4, v2.3.40, v2.3.41, v2.3.42, v2.3.5, v2.3.6, v2.3.7, v2.3.8, v2.3.9, v2.4.0, v2.4.0-BETA1, v2.4.0-BETA2, v2.4.0-RC1, v2.4.1, v2.4.10, v2.4.2, v2.4.3, v2.4.4, v2.4.5, v2.4.6, v2.4.7, v2.4.8, v2.4.9, v2.5.0, v2.5.0-BETA1, v2.5.0-BETA2, v2.5.0-RC1, v2.5.1, v2.5.10, v2.5.11, v2.5.12, v2.5.2, v2.5.3, v2.5.4, v2.5.5, v2.5.6, v2.5.7, v2.5.8, v2.5.9, v2.6.0, v2.6.0-BETA1, v2.6.0-BETA2, v2.6.1, v2.6.10, v2.6.11, v2.6.12, v2.6.13, v2.6.2, v2.6.3, v2.6.4, v2.6.5, v2.6.6, v2.6.7, v2.6.8, v2.6.9, v2.7.0, v2.7.0-BETA1, v2.7.0-BETA2, v2.7.1, v2.7.10, v2.7.11, v2.7.12, v2.7.13, v2.7.14, v2.7.15, v2.7.16, v2.7.17, v2.7.18, v2.7.19, v2.7.2, v2.7.20, v2.7.21, v2.7.22, v2.7.23, v2.7.24, v2.7.25, v2.7.26, v2.7.27, v2.7.28, v2.7.29, v2.7.3, v2.7.30, v2.7.31, v2.7.32, v2.7.33, v2.7.34, v2.7.35, v2.7.36, v2.7.37, v2.7.38, v2.7.39, v2.7.4, v2.7.40, v2.7.41, v2.7.42, v2.7.43, v2.7.44, v2.7.45, v2.7.46, v2.7.47, v2.7.48, v2.7.49, v2.7.5, v2.7.50, v2.7.51, v2.7.6, v2.7.7, v2.7.8, v2.7.9, v2.8.0, v2.8.0-BETA1, v2.8.1, v2.8.10, v2.8.11, v2.8.12, v2.8.13, v2.8.14, v2.8.15, v2.8.16, v2.8.17, v2.8.18, v2.8.19, v2.8.2, v2.8.20, v2.8.21, v2.8.22, v2.8.23, v2.8.24, v2.8.25, v2.8.26, v2.8.27, v2.8.28, v2.8.29, v2.8.3, v2.8.30, v2.8.31, v2.8.32, v2.8.33, v2.8.34, v2.8.35, v2.8.36, v2.8.37, v2.8.38, v2.8.39, v2.8.4, v2.8.40, v2.8.41, v2.8.42, v2.8.43, v2.8.44, v2.8.45, v2.8.46, v2.8.47, v2.8.48, v2.8.49, v2.8.5, v2.8.50, v2.8.52, v2.8.6, v2.8.7, v2.8.8, v2.8.9, v3.0.0, v3.0.0-BETA1, v3.0.1, v3.0.2, v3.0.3, v3.0.4, v3.0.5, v3.0.6, v3.0.7, v3.0.8, v3.0.9, v3.1.0, v3.1.0-BETA1, v3.1.0-RC1, v3.1.1, v3.1.10, v3.1.2, v3.1.3, v3.1.4, v3.1.5, v3.1.6, v3.1.7, v3.1.8, v3.1.9, v3.2.0, v3.2.0-BETA1, v3.2.0-RC1, v3.2.0-RC2, v3.2.1, v3.2.10, v3.2.11, v3.2.12, v3.2.13, v3.2.14, v3.2.2, v3.2.3, v3.2.4, v3.2.5, v3.2.6, v3.2.7, v3.2.8, v3.2.9, v3.3.0, v3.3.0-BETA1, v3.3.0-RC1, v3.3.1, v3.3.10, v3.3.11, v3.3.12, v3.3.13, v3.3.14, v3.3.15, v3.3.16, v3.3.17, v3.3.18, v3.3.2, v3.3.3, v3.3.4, v3.3.5, v3.3.6, v3.3.7, v3.3.8, v3.3.9, v3.4.0, v3.4.0-BETA1, v3.4.0-BETA2, v3.4.0-BETA3, v3.4.0-BETA4, v3.4.0-RC1, v3.4.0-RC2, v3.4.1, v3.4.10, v3.4.11, v3.4.12, v3.4.13, v3.4.14, v3.4.15, v3.4.16, v3.4.17, v3.4.18, v3.4.19, v3.4.2, v3.4.20, v3.4.21, v3.4.22, v3.4.23, v3.4.24, v3.4.25, v3.4.26, v3.4.27, v3.4.28, v3.4.29, v3.4.3, v3.4.30, v3.4.31, v3.4.32, v3.4.33, v3.4.34, v3.4.35, v3.4.36, v3.4.37, v3.4.38, v3.4.39, v3.4.4, v3.4.40, v3.4.5, v3.4.6, v3.4.7, v3.4.8, v3.4.9, v4.0.0, v4.0.0-BETA1, v4.0.0-BETA2, v4.0.0-BETA3, v4.0.0-BETA4, v4.0.0-RC1, v4.0.0-RC2, v4.0.1, v4.0.10, v4.0.11, v4.0.12, v4.0.13, v4.0.14, v4.0.15, v4.0.2, v4.0.3, v4.0.4, v4.0.5, v4.0.6, v4.0.7, v4.0.8, v4.0.9, v4.1.0, v4.1.0-BETA1, v4.1.0-BETA2, v4.1.0-BETA3, v4.1.1, v4.1.10, v4.1.11, v4.1.12, v4.1.2, v4.1.3, v4.1.4, v4.1.5, v4.1.6, v4.1.7, v4.1.8, v4.1.9, v4.2.0, v4.2.0-BETA1, v4.2.0-BETA2, v4.2.0-RC1, v4.2.1, v4.2.10, v4.2.11, v4.2.12, v4.2.2, v4.2.3, v4.2.4, v4.2.5, v4.2.6, v4.2.7, v4.2.8, v4.2.9, v4.3.0, v4.3.0-BETA1, v4.3.0-BETA2, v4.3.0-RC1, v4.3.1, v4.3.10, v4.3.11, v4.3.2, v4.3.3, v4.3.4, v4.3.5, v4.3.6, v4.3.7, v4.3.8, v4.3.9, v4.4.0, v4.4.0-BETA1, v4.4.0-BETA2, v4.4.0-RC1, v4.4.1, v4.4.2, v4.4.3, v4.4.4, v4.4.5, v4.4.6, v4.4.7, v4.4.8].
    - Can only install one of: symfony/yaml[4.4.x-dev, v5.0.8].
    - Can only install one of: symfony/yaml[v4.4.0, v5.0.8].
    - Can only install one of: symfony/yaml[v4.4.0-BETA1, v5.0.8].
    - Can only install one of: symfony/yaml[v4.4.0-BETA2, v5.0.8].
    - Can only install one of: symfony/yaml[v4.4.0-RC1, v5.0.8].
    - Can only install one of: symfony/yaml[v4.4.1, v5.0.8].
    - Can only install one of: symfony/yaml[v4.4.2, v5.0.8].
    - Can only install one of: symfony/yaml[v4.4.3, v5.0.8].
    - Can only install one of: symfony/yaml[v4.4.4, v5.0.8].
    - Can only install one of: symfony/yaml[v4.4.5, v5.0.8].
    - Can only install one of: symfony/yaml[v4.4.6, v5.0.8].
    - Can only install one of: symfony/yaml[v4.4.7, v5.0.8].
    - Can only install one of: symfony/yaml[v4.4.8, v5.0.8].
    - Installation request for symfony/yaml (locked at v5.0.8) -> satisfiable by symfony/yaml[v5.0.8].


Installation failed, reverting ./composer.json to its original content.

Scribe is now out of beta! 🎉

Yay, we're now at v1! Thank you to everyone who took the time to test the beta, provide feedback and send in contributions. Happy documenting!

Ok so you basically have stolen this package...?

At first I was surprised that Marcel has abandoned his original package. But now see his comment: https://twitter.com/PovilasKorop/status/1270590112217399297

Just curious, was that your plan from the beginning? Contribute to his package and then declare that as your own, taking over?

I'm very confused by such behavior in open-source community.

I've tried Scribe and it works well, but abandoning the original package without asking the owner? Seriously?

[Feature request] Config item in scribe.php for CSS

Hi,

If it's possible i suggest to create a variable into scribe.php for internal css for documentation.
It can be :

$internalcss = <<< CSS
<style>
.params{
  font-weight:bold;
}
</style>
CSS;

This feature will create some freedom in css formating, that is missing.

Best Regards, keep up the good work.

FatalThrowableError?

Hello everyone,

I have migrated from laravel-apidoc-generator and I am having some problems to generate the docs with this package.

Am I doing something wrong?

When trying to generate the docs with php artisan scribe:generate I am getting the following error:

 Symfony\Component\Debug\Exception\FatalThrowableError  : Argument 1 passed to Knuckles\Scribe\Tools\DocumentationConfig::__construct() must be of the type array, null given, called in C:\laragon\www\LEI-API-Frontend\vendor\knuckleswtf\scribe\src\Commands\GenerateDocumentation.php on line 204

  at C:\laragon\www\LEI-API-Frontend\vendor\knuckleswtf\scribe\src\Tools\DocumentationConfig.php:9
     5| class DocumentationConfig
     6| {
     7|     private $data;
     8|
  >  9|     public function __construct(array $config = [])
    10|     {
    11|         $this->data = $config;
    12|     }
    13|

  Exception trace:

  1   Knuckles\Scribe\Tools\DocumentationConfig::__construct()
      C:\laragon\www\LEI-API-Frontend\vendor\knuckleswtf\scribe\src\Commands\GenerateDocumentation.php:204

  2   Knuckles\Scribe\Commands\GenerateDocumentation::bootstrap()
      C:\laragon\www\LEI-API-Frontend\vendor\knuckleswtf\scribe\src\Commands\GenerateDocumentation.php:62

  Please use the argument -v to see more details.
 Symfony\Component\Debug\Exception\FatalThrowableError  : Argument 1 passed to Knuckles\Scribe\Tools\DocumentationConfig::__construct() must be of the type array, null given, called in C:\laragon\www\LEI-API-Frontend\vendor\knuckleswtf\scribe\src\Commands\GenerateDocumentation.php on line 204

  at C:\laragon\www\LEI-API-Frontend\vendor\knuckleswtf\scribe\src\Tools\DocumentationConfig.php:9
     5| class DocumentationConfig
     6| {
     7|     private $data;
     8|
  >  9|     public function __construct(array $config = [])
    10|     {
    11|         $this->data = $config;
    12|     }
    13|

  Exception trace:

  1   Knuckles\Scribe\Tools\DocumentationConfig::__construct()
      C:\laragon\www\LEI-API-Frontend\vendor\knuckleswtf\scribe\src\Commands\GenerateDocumentation.php:204

  2   Knuckles\Scribe\Commands\GenerateDocumentation::bootstrap()
      C:\laragon\www\LEI-API-Frontend\vendor\knuckleswtf\scribe\src\Commands\GenerateDocumentation.php:62

  3   Knuckles\Scribe\Commands\GenerateDocumentation::handle(Object(Knuckles\Scribe\Matching\RouteMatcher))
      C:\laragon\www\LEI-API-Frontend\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:32

  4   call_user_func_array()
      C:\laragon\www\LEI-API-Frontend\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:32

  5   Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
      C:\laragon\www\LEI-API-Frontend\vendor\laravel\framework\src\Illuminate\Container\Util.php:36

  6   Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
      C:\laragon\www\LEI-API-Frontend\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:90

  7   Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Object(Closure))
      C:\laragon\www\LEI-API-Frontend\vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:34

  8   Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), [])
      C:\laragon\www\LEI-API-Frontend\vendor\laravel\framework\src\Illuminate\Container\Container.php:590

  9   Illuminate\Container\Container::call()
      C:\laragon\www\LEI-API-Frontend\vendor\laravel\framework\src\Illuminate\Console\Command.php:134

  10  Illuminate\Console\Command::execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
      C:\laragon\www\LEI-API-Frontend\vendor\symfony\console\Command\Command.php:255

  11  Symfony\Component\Console\Command\Command::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
      C:\laragon\www\LEI-API-Frontend\vendor\laravel\framework\src\Illuminate\Console\Command.php:121

  12  Illuminate\Console\Command::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      C:\laragon\www\LEI-API-Frontend\vendor\symfony\console\Application.php:1000

  13  Symfony\Component\Console\Application::doRunCommand(Object(Knuckles\Scribe\Commands\GenerateDocumentation), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      C:\laragon\www\LEI-API-Frontend\vendor\symfony\console\Application.php:271

  14  Symfony\Component\Console\Application::doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      C:\laragon\www\LEI-API-Frontend\vendor\symfony\console\Application.php:147

  15  Symfony\Component\Console\Application::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      C:\laragon\www\LEI-API-Frontend\vendor\laravel\framework\src\Illuminate\Console\Application.php:93

  16  Illuminate\Console\Application::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      C:\laragon\www\LEI-API-Frontend\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php:131

  17  Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      C:\laragon\www\LEI-API-Frontend\artisan:37

How to describe endpoints provided by vendor package?

Is it possible to customize the description of endpoints provided by a third party package?

I would like to add my own metadata to routes provided by packages such as laravel/passport or laravel/sanctum, without editing the actual files in the vendor/ folder.

How do I generate sub-groups for endpoints?

Hello! I'm wondering if it's possible to generate sub-groups for endpoints. For example: I'have and "admin" path, and for that will be different subgroups so my endpoint structure looks like this:

  • front
    • sub 1
    • sub 2
  • admin
    • categories
    • posts

Edit: also I'm wondering if this can be applied to generated postman collection

  • I've read the documentation and I can't find details on how to achieve this.

Postman collection namings

Hey guys,

first of all, awesome package, works great.

I have a question about naming function in Postman collection that is generated.

Let's have a look at example below:

/**
     * Index
     * Get paginated list of items.
     * @param Request $request
     * @return JsonResponse
     * @authenticated
     * @apiResourceCollection App\Http\Resources\Actor\ActorCollection
     * @apiResourceModel App\Models\Actor paginate=10
     */

In this example name should be "Index" and description should be "Get paginated list of items.".

In generated documentation this is properly shown, but in Postman, i get name like this: "IndexGet paginated list of items."

Did you intend to make it like that or i am doing something wrong ?

Thanks in advance,
Nikola Dzakovic

I'm unable to install: migrating from mpociot/laravel-apidoc-generator

What happened?

  1. Removed apidoc
  2. Composer install of scibe
  3. Error

Using version ^1.0@beta for knuckleswtf/scribe
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

Problem 1
- Installation request for nunomaduro/collision (locked at v2.1.1, required as ^2.0) -> satisfiable by nunomaduro/collision[v2.1.1].
- knuckleswtf/scribe 1.0.0-beta requires nunomaduro/collision ^3.0|^4.0 -> satisfiable by nunomaduro/collision[v4.x-dev].
- knuckleswtf/scribe 1.0.0-beta2 requires nunomaduro/collision ^3.0|^4.0 -> satisfiable by nunomaduro/collision[v4.x-dev].
- knuckleswtf/scribe 1.0.0-beta3 requires nunomaduro/collision ^3.0|^4.0 -> satisfiable by nunomaduro/collision[v4.x-dev].
- Conclusion: don't install nunomaduro/collision v4.x-dev
- Installation request for knuckleswtf/scribe ^1.0@beta -> satisfiable by knuckleswtf/scribe[1.0.0-beta, 1.0.0-beta2, 1.0.0-beta3].

Installation failed, reverting ./composer.json to its original content.

My environment:

  • PHP version: PHP 7.3.1
  • Laravel version: Laravel Framework 6.18.15
  • Scribe Version: na

This is my composer.json

{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": [
        "framework",
        "laravel"
    ],
    "license": "MIT",
    "require": {
        "php": "^7.1.3",
        "barryvdh/laravel-dompdf": "^0.8.5",
        "facade/ignition": "^1.13",
        "fideloper/proxy": "^4.0",
        "fruitcake/laravel-cors": "^1.0",
        "guzzlehttp/guzzle": "~6.0",
        "itsgoingd/clockwork": "^4.0",
        "laravel/framework": "^6.0",
        "laravel/tinker": "^1.0",
        "maatwebsite/excel": "^3.1",
        "mpdf/mpdf": "^8.0",
        "simplesoftwareio/simple-qrcode": "^2.0"
    },
    "require-dev": {
        "barryvdh/laravel-debugbar": "^3.2",
        "beyondcode/laravel-dump-server": "^1.0",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "krlove/eloquent-model-generator": "^1.3",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^2.0",
        "phpunit/phpunit": "^7.5"
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "sort-packages": true
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "minimum-stability": "dev",
    "prefer-stable": true,
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    }
}


Cannot document @header of particular endpoint inside of Controller

Hello! thank you for this amazing component!

What happened?
Into my Lumen app I have this docblock inside of my controller

     /**
     * My endpoint description
     *
     * @header Authorization Bearer {token}
     * @group Auth
     * @responseFile 200 responses/my-response.json

When I run php artisan scribe:generate all works like a charm, but into the generated docs it doesn't show the additional header of my endpoint:

image

My environment:

  • PHP version: 7.3.18
  • Lumen version:7.1.2
  • Scribe Version: 1.0.0-beta4

My Scribe config (minus the comments)

<?php

return [
    'type' => 'static',

    'static' => [
        'output_path' => 'public/docs',
    ],

    'laravel' => [
        'add_routes' => true,
        'url' => '/docs',
        'middleware' => [],
    ],

    'auth' => [
        'enabled' => true,
        'in' => 'bearer',
        'name' => 'Authorization',
        'use_value' => env('SCRIBE_AUTH_KEY'),
        'extra_info' => 'You can retrieve your token by visiting your dashboard and clicking <b>Generate API token</b>.',
    ],
    
    'intro_text' => <<<INTRO
Welcome to our API documentation!

<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile), and you can switch the programming language of the examples with the tabs in the top right (or from the nav menu at the top left on mobile).</aside>
INTRO
    ,

    'example_languages' => [
        'bash',
        'javascript',
    ],

    'base_url' => null,
    
    'title' => null,

    'postman' => [
        'enabled' => true,
        'description' => null,
        'auth' => null,
    ],

    'default_group' => 'Endpoints',
    
    'logo' => false,
    
    'router' => 'laravel',
    
    'routes' => [
        [
            'match' => [
                'domains' => ['*'],
                'prefixes' => ['*'],
                'versions' => ['v1'],
            ],

            'include' => [
                // 'users.index', 'healthcheck*'
            ],

            'exclude' => [
                // '/health', 'admin.*'
            ],

            'apply' => [
                'headers' => [
                    'Content-Type' => 'application/json',
                    'Accept' => 'application/json',
                ],

                'response_calls' => [
                    'methods' => ['GET'],
                    'config' => [
                        'app.env' => 'documentation',
                        // 'app.debug' => false,
                    ],
                    'cookies' => [
                        // 'name' => 'value'
                    ],
                    'queryParams' => [
                        // 'key' => 'value',
                    ],
                    'bodyParams' => [
                        // 'key' => 'value',
                    ],
                    'fileParams' => [
                        // 'key' => '/home/me/image.png',
                    ],
                ],
            ],
        ],
    ],
    
    'fractal' => [
        'serializer' => null,
    ],

    'faker_seed' => null,

    'strategies' => [
        'metadata' => [
            \Knuckles\Scribe\Extracting\Strategies\Metadata\GetFromDocBlocks::class,
        ],
        'urlParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\UrlParameters\GetFromUrlParamTag::class,
        ],
        'queryParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\QueryParameters\GetFromQueryParamTag::class,
        ],
        'headers' => [
            \Knuckles\Scribe\Extracting\Strategies\Headers\GetFromRouteRules::class,
        ],
        'bodyParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromFormRequest::class,
            \Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromBodyParamTag::class,
        ],
        'responses' => [
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseTransformerTags::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseResponseTag::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseResponseFileTag::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseApiResourceTags::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\ResponseCalls::class,
        ],
        'responseFields' => [
            \Knuckles\Scribe\Extracting\Strategies\ResponseFields\GetFromResponseFieldTag::class,
        ],
    ],

    'routeMatcher' => \Knuckles\Scribe\Matching\RouteMatcher::class,
];

Config key mismatch in laravel routes

The route configuration is looking for config key scribe.laravel.docs_url

$prefix = config('scribe.laravel.docs_url', '/docs');

However, the default configuration file defines it as scribe.laravel.url

'url' => '/docs',

I did not submit a PR as unsure of which option you would prefer to go ahead with!


Thanks for all the hard work on the new package! :) After some initial hurdles, I just got my docs building this morning and ❤️ the design improvements. Jumping in to take advantage of the feature enhancements now. 🥳

php artisan scribe:generate doesn't generate updated documentation.

I'm using Lumen 7,

I've this on my login method,

/**
* Customer Info
* Get current customer's info
*
*
* @authenticated
* @group Customer
* @response {
* "data": {
* "id": 3,
* "name": "Tina Luettgen",
* "email": "[email protected]",
* "mobile": "1-396-427-6971",
* "email_verified_at": "2019-05-05 11:26:54",
* "mobile_verified_at": "2019-05-05 11:26:54",
* "avatar": "default.jpg",
* "created_at": "2019-05-05 11:26:54",
* "updated_at": "2019-05-05 11:26:54"
* },
* "status": 200
* }
*/

But when try to run php artisan scribe:generate it just generate default documentation with annotation not taking any effect.

Generated Docs

Stuck on PHP 7.4

Hi Shalva!, the command php artisan scribe:generate is stuck when has php 7.4 version,

Thanks for you work!

DB transactions with multiple connections

Strategies that utilize database transactions do not work correctly with multiple database connections configured. It always uses the default connection:

DatabaseTransactionHelpers.php

app('db')->beginTransaction();

I started adding support for multiple connections in my fork. It simply gets the connection from the model type and passes it to the startDbTransaction and endDbTransaction function.

I'm not sure though how to do it in ResponseCalls.php since I don't know any way to get the utilized connection from the route itself. One way could be simply iterating over all connections and starting and ending transactions for all connections. But if there is a better method I'd prefer that :D

Let me know what you think and if i missed anything.

Laravel type doesn't work

When using the 'laravel' type, there are some issues;

  • Writer paths have errors in them, so generating doesn't work
  • Config laravel.url should be laravel.docs_url

I'm going for the static type for now, as soon as I have some extra time I can make a PR.

How do I...?

Is there anyway to customize markdown files(api documentation output) customization setting? or how can i customize all api endpoint parameters preview on api documentation files as bottom ?

Parameter Type Description
parameter_1 integer description.....
parameter_2 string description.....

Markdown with HTML is not working right

Hi there,

Creating documentation using html dont render in document generated, uses html like plain text.
Is there any configuration for support html ?

example :

/**
     * @group PHC Specialists
     * List All Specialists. 
     *  
     * List all specialists / {PT: Especialistas} in PHC. 
     * PHC Table: dr
     * <aside class="notice">We mean it; you really should.😕</aside>
*/

Renders :
List all specialists / {PT: Especialistas} in PHC. PHC Table: dr <aside class="notice">We mean it; you really should.😕</aside>

Unable to disable postman queries

I've set the

'enabled' => false,

In the scribe.php and reg'd, however its still producing postman examples. Any way to turn this off?

How to join @apiResource and @responseFile?

Hi,
I would like to join both answers together in one unique example response, any suggestions on how to achieve this result?

Here screenshot on how it looks like, when generating a response from @responseFile .json and from factory with @apiResource

example-response

Thanks for this great tool.

Lumen publish views

I've read the documentation regarding the customization of the index.blade.php and I can't find details on how to achieve a similar result in Lumen.

I tried to replicate the file structure but when I generate the docs, it defaults to the original version. Is there something I'm missing?

@response fails with queryparameters.

The response documentation is rendered as null when you have a null value in your example response.
{
“test” : null
}

It also seems that URL’s as values are not correctly interpreted. It looks to be failing on slashes and question marks.

FormRequests that use Auth::user().

  • I've read the documentation and I can't find details on how to achieve this.

Our application uses Laravel Sanctum for authentication for native apps. Our auth process involves handling OAuth on the native clients, and then they send us the access tokens provided by, say, Facebook. When they use Socialite on our API to load the user, using the access token the clients send us.

From here, we create a user and then use Sanctum to create a Bearer token. This all happens via the POST /tokens call.

Now, the issue I'm having is we need to document authenticated routes. One of our routes is to create reports against other users using POST /reports. Some of our validation needs to check and make sure the provided user property is not the same as the authenticated user, as we don't want users filing reports against themselves. The rule for this is as follows:

'user' => [
  'required',
  Rule::exists('users', 'id')->whereNot('id', Auth::user()->id)
]

I am using the @authenticated annotation on our TokensController, as explained here.

The auth configuration is as follows:

'auth' => [
    'enabled' => true,
    'in' => 'bearer',
    'name' => 'token',
    'use_value' => env('SCRIBE_AUTH_KEY'),
    'extra_info' => '',
]

My assumption is the Bearer token should be defined using SCRIBE_AUTH_KEY. However, since we will be generating documentation during CI/CD, there is not an active database that contains data where we can define a static SCRIBE_AUTH_KEY.

With this current process above, as is, and I run php artisan scribe:generate, I get the following error:

❯ art scribe:generate --env docs --verbose
🔊 info Processed route: [POST] tokens
🚸 warning Skipping route: [POST] reports - Exception encountered.

   ErrorException

  Trying to get property 'id' of non-object

  at app/Http/Requests/ReportsCreateRequest.php:22
    18|         return [
    19|             'user' => [
    20|                 'bail',
    21|                 'required',
  > 22|                 Rule::exists('users', 'id')->whereNot('id', Auth::user()->id),
    23|             ],
    24|             'photo' => [
    25|                 'bail',
    26|                 'sometimes',

  1   app/Http/Requests/ReportsCreateRequest.php:22
      Illuminate\Foundation\Bootstrap\HandleExceptions::handleError("Trying to get property 'id' of non-object", "/Users/andrew/Developer/sayallo/api/app/Http/Requests/ReportsCreateRequest.php", [])

  2   vendor/knuckleswtf/scribe/src/Extracting/Strategies/BodyParameters/GetFromFormRequest.php:84
      App\Http\Requests\ReportsCreateRequest::rules()

  3   vendor/knuckleswtf/scribe/src/Extracting/Strategies/BodyParameters/GetFromFormRequest.php:84
      call_user_func_array([])

  4   vendor/knuckleswtf/scribe/src/Extracting/Strategies/BodyParameters/GetFromFormRequest.php:60
      Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromFormRequest::getRouteValidationRules(Object(App\Http\Requests\ReportsCreateRequest))

  5   vendor/knuckleswtf/scribe/src/Extracting/Strategies/BodyParameters/GetFromFormRequest.php:32
      Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromFormRequest::getBodyParametersFromFormRequest(Object(ReflectionMethod))

  6   vendor/knuckleswtf/scribe/src/Extracting/Generator.php:203
      Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromFormRequest::__invoke(Object(Illuminate\Routing\Route), Object(ReflectionClass), Object(ReflectionMethod), [])

  7   vendor/knuckleswtf/scribe/src/Extracting/Generator.php:136
      Knuckles\Scribe\Extracting\Generator::iterateThroughStrategies("bodyParameters")

  8   vendor/knuckleswtf/scribe/src/Extracting/Generator.php:85
      Knuckles\Scribe\Extracting\Generator::fetchBodyParameters(Object(ReflectionClass), Object(ReflectionMethod), Object(Illuminate\Routing\Route), [])

  9   vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php:118
      Knuckles\Scribe\Extracting\Generator::processRoute(Object(Illuminate\Routing\Route), [])

  10  vendor/knuckleswtf/scribe/src/Commands/GenerateDocumentation.php:73
      Knuckles\Scribe\Commands\GenerateDocumentation::processRoutes()

  11  vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:33
      Knuckles\Scribe\Commands\GenerateDocumentation::handle(Object(Knuckles\Scribe\Matching\RouteMatcher))

  12  vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:33
      call_user_func_array()

  13  vendor/laravel/framework/src/Illuminate/Container/Util.php:36
      Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()

  14  vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:91
      Illuminate\Container\Util::unwrapIfClosure(Object(Closure))

  15  vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:35
      Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Object(Closure))

  16  vendor/laravel/framework/src/Illuminate/Container/Container.php:592
      Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), [])

  17  vendor/laravel/framework/src/Illuminate/Console/Command.php:134
      Illuminate\Container\Container::call()

  18  vendor/symfony/console/Command/Command.php:255
      Illuminate\Console\Command::execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))

  19  vendor/laravel/framework/src/Illuminate/Console/Command.php:121
      Symfony\Component\Console\Command\Command::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))

  20  vendor/symfony/console/Application.php:912
      Illuminate\Console\Command::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

  21  vendor/symfony/console/Application.php:264
      Symfony\Component\Console\Application::doRunCommand(Object(Knuckles\Scribe\Commands\GenerateDocumentation), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

  22  vendor/symfony/console/Application.php:140
      Symfony\Component\Console\Application::doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

  23  vendor/laravel/framework/src/Illuminate/Console/Application.php:93
      Symfony\Component\Console\Application::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

  24  vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:129
      Illuminate\Console\Application::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

  25  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

Is there something special we need to be doing when doing response calls? It appears this is happening because the FormRequest is processed before an actual API call is made; therefore using a Middleware to create a fake user and force authentication won't work.

scribe:generate doesn't overwrite the existing markdown files

What happened?

  1. I set my configuration to 'type' => 'laravel',
  2. Then I ran php artisan scribe:generate
  3. The files in the resources/docs/groups are not updated, removing the file and generating again creates the correct file

My environment:

  • PHP version: 7.4
  • Framework (Laravel/Lumen) and version: Laravel 7 latest
  • Scribe Version: 1.3.0

Feedback Thread: Let me hear your thoughts

Hi guys,

Just checking in with the community. If you've got a moment to spare, what's your experience with Scribe been like so far? What do you like? What don't you like? What do you think needs to be better?

Regex in annotations make trouble generating example requests

  • I've read the documentation and I can't find details on how to achieve this.

I have two example routes, which have some regex to specify allowed values:

 $router->get('objects/{locale:[A-Z]{2}}',  ['uses' => 'ObjectController@showLocaleObjects']);
 $router->get('objects/{id:[0-9]+}',  ['uses' => 'ObjectController@showObject']);

The API works fine, but the docs are not getting generated with correct example values.

One of the controller functions:

public function showLocaleObjects($locale, Request $request)
{
    return response()->json(Object::where('locale', 'LIKE', '%' . $locale . '%')->get());
}

The annotations:

/**
* GET locale objects
* 
* This endpoint gets specified locale objects.
* 
* @urlParam locale required ISO 3166-1-alpha-2 code. Example: FR
* 
*/

With regex: http://localhost/api/v1/objects/1
Without regex: http://localhost/api/v1/objects/FR (like specified in the Example)

Am i missing something?

Routes are getting skipped with an Exception

Hi there,

some of my routes are getting skipped while generating with the following error:

Exception ErrorException encountered : strpos() expects parameter 1 to be string, object given

Am I missing something in the config?

Thank you in advance

HEAD Routes break generation

What happened?

  1. Using the out-of-the-box configuration with minor alterations
  2. When we run php artisan scribe:generate
  3. We get an error during generation of the example-requests

Screenshots and stack traces:

In 3666cec63a5bc7f130fc7f39cdbc92fbb87d6d5c.php line 2:

  Undefined offset: 0 (View: /web/html/vendor/knuckleswtf/scribe/resources/views/partials/example-requests/bash.blade.php) (View:
   /web/html/vendor/knuckleswtf/scribe/resources/views/partials/example-requests/bash.blade.php)

TL;SR; Already found the cause of the bug! It just needs fixing :) Click Here or scroll to Additional Info

My environment:

  • PHP version: 7.3.14
  • Framework (Laravel/Lumen) and version: Lumen v6.3.5 (74d61ebf4f022a874bcea560054a2a2050d0e75d)
  • Scribe Version: 1.1.0 (42d034f)

My Scribe config (minus the comments):

return [
    'static' => [
        'output_path' => 'public/docs',
    ],
    'laravel' => [
        'add_routes' => true,
        'docs_url' => '/docs',
        'middleware' => [],
    ],
    'auth' => [
        'enabled' => true,
        'in' => 'bearer',
        'name' => 'bearer',
        'use_value' => null,
        'extra_info' => 'JWT Tokens are App Specific.',
    ],
    'intro_text' => 'api intro',
    'example_languages' => [
        'bash',
        'javascript',
        'php'
    ],
    'base_url' => null,
    'title' => 'XEDI API Documentation',
    'postman' => [
        'enabled' => true,
        'base_url' => null,
        'description' => null,
        'auth' => null,
    ],
    'default_group' => 'Misc',
    'logo' =>  null,
    'router' => 'laravel',
    'routes' => [
        [
            'match' => [
                'domains' => ['*'],
                'prefixes' => ['*'],
                'versions' => ['v1'],
            ],
            'include' => [],
            'exclude' => [
                'status.*', 'version'
            ],
            'apply' => [
                'headers' => [
                    'Content-Type' => 'application/json',
                    'Accept' => 'application/json',
                    'Authorization' => 'Bearer {token}',
                ],
                'response_calls' => [
                    'methods' => ['GET', 'POST', 'PUT'],
                    'config' => [
                        'app.env' => 'localhost',
                    ],
                    'cookies' => [],
                    'queryParams' => [],
                    'bodyParams' => [],
                    'fileParams' => [],
                ],
            ],
        ],
    ],
    'fractal' => [
        'serializer' => null,
    ],
    'faker_seed' => null,
    'strategies' => [
        'metadata' => [
            \Knuckles\Scribe\Extracting\Strategies\Metadata\GetFromDocBlocks::class,
        ],
        'urlParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\UrlParameters\GetFromUrlParamTag::class,
        ],
        'queryParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\QueryParameters\GetFromQueryParamTag::class,
        ],
        'headers' => [
            \Knuckles\Scribe\Extracting\Strategies\Headers\GetFromRouteRules::class,
            \Knuckles\Scribe\Extracting\Strategies\Headers\GetFromHeaderTag::class,
        ],
        'bodyParameters' => [
            \Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromFormRequest::class,
            \Knuckles\Scribe\Extracting\Strategies\BodyParameters\GetFromBodyParamTag::class,
        ],
        'responses' => [
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseTransformerTags::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseResponseTag::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseResponseFileTag::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\UseApiResourceTags::class,
            \Knuckles\Scribe\Extracting\Strategies\Responses\ResponseCalls::class,
        ],
        'responseFields' => [
            \Knuckles\Scribe\Extracting\Strategies\ResponseFields\GetFromResponseFieldTag::class,
        ],
    ],
    'routeMatcher' => \Knuckles\Scribe\Matching\RouteMatcher::class,
];

Additional info:

  • Debugging of the partial that throws the error reveals a route with an empty methods array.
  • Debugging of the RouteMatcher reveals that all routes have entries in the methods array.
  • Placing a try/catch around the render call responsible for triggering the error reveals the route without the method. It's a HEAD route. The method has been lost somewhere.
  • Tracing the call stack back to the GenerateCommand leads us to Line 118 and $generator->processRoute() as the point where the method is "lost".
  • On stepping into the Knuckles\Scribe\Extracting\Generator source code, the getMethods method is observed.
    /**
     * @param Route $route
     *
     * @return mixed
     */
    public function getMethods(Route $route)
    {
        return array_diff($route->methods(), ['HEAD']);
    }

Because HEAD is the only method in the methods array, it is striped out. We are using the HEAD verb in our API in accordance to its semantic purpose.

Proposed Fixes

  1. Remove the use of array_diff. The addition of the HEAD verb is Laravel's doing and therefore they should fix that.
  2. Add a defensive check to make sure that there is always one value in the methods array.

Thoughts?

TIA

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.