DarkaOnLine/SwaggerLume

View on GitHub
src/Generator.php

Summary

Maintainability
A
2 hrs
Test Coverage
C
76%
<?php

namespace SwaggerLume;

use Illuminate\Support\Facades\File;
use OpenApi\Annotations\Server;
use OpenApi\Generator as OpenApiGenerator;
use OpenApi\Util;
use Symfony\Component\Yaml\Dumper as YamlDumper;
use Symfony\Component\Yaml\Yaml;

class Generator
{
    public static function generateDocs()
    {
        $appDir = config('swagger-lume.paths.annotations');
        $docDir = config('swagger-lume.paths.docs');
        if (! File::exists($docDir) || is_writable($docDir)) {
            // delete all existing documentation
            if (File::exists($docDir)) {
                File::deleteDirectory($docDir);
            }

            self::defineConstants(config('swagger-lume.constants') ?: []);

            File::makeDirectory($docDir);
            $excludeDirs = config('swagger-lume.paths.excludes');

            if (version_compare(config('swagger-lume.swagger_version'), '3.0', '>=')) {
                $generator = new OpenApiGenerator();
                $finder = Util::finder($appDir, $excludeDirs);
                $swagger = $generator->generate($finder);
            } else {
                $swagger = \Swagger\scan($appDir, ['exclude' => $excludeDirs]);
            }

            if (config('swagger-lume.paths.base') !== null) {
                if (version_compare(config('swagger-lume.swagger_version'), '3.0', '>=')) {
                    $swagger->servers = [
                        new Server(['url' => config('swagger-lume.paths.base')]),
                    ];
                } else {
                    $swagger->basePath = config('swagger-lume.paths.base');
                }
            }

            $filename = sprintf('%s/%s', $docDir, config('swagger-lume.paths.docs_json'));
            $swagger->saveAs($filename);

            $security = new SecurityDefinitions();
            $security->generate($filename);

            self::makeYamlCopy($filename);
        }
    }

    protected static function defineConstants(array $constants)
    {
        if (! empty($constants)) {
            foreach ($constants as $key => $value) {
                defined($key) || define($key, $value);
            }
        }
    }

    protected static function makeYamlCopy($filename)
    {
        if (config('swagger-lume.generate_yaml_copy')) {
            $path = sprintf('%s/%s', config('swagger-lume.paths.docs'), config('swagger-lume.paths.docs_yaml'));
            $yamlContent = (new YamlDumper(2))->dump(
                json_decode(file_get_contents($filename), true),
                20,
                0,
                Yaml::DUMP_OBJECT_AS_MAP ^ Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE
            );

            file_put_contents($path, $yamlContent);
        }
    }
}