Add file option to generateschema (#7130)

This commit is contained in:
Thorsten 2020-02-12 20:35:54 +01:00 committed by GitHub
parent 4137ef41ef
commit f81ca78642
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 2 deletions

View File

@ -30,7 +30,7 @@ into the commonly used YAML-based OpenAPI format.
If your schema is static, you can use the `generateschema` management command: If your schema is static, you can use the `generateschema` management command:
```bash ```bash
./manage.py generateschema > openapi-schema.yml ./manage.py generateschema --file openapi-schema.yml
``` ```
Once you've generated a schema in this way you can annotate it with any Once you've generated a schema in this way you can annotate it with any

View File

@ -25,6 +25,7 @@ class Command(BaseCommand):
parser.add_argument('--format', dest="format", choices=['openapi', 'openapi-json'], default='openapi', type=str) parser.add_argument('--format', dest="format", choices=['openapi', 'openapi-json'], default='openapi', type=str)
parser.add_argument('--urlconf', dest="urlconf", default=None, type=str) parser.add_argument('--urlconf', dest="urlconf", default=None, type=str)
parser.add_argument('--generator_class', dest="generator_class", default=None, type=str) parser.add_argument('--generator_class', dest="generator_class", default=None, type=str)
parser.add_argument('--file', dest="file", default=None, type=str)
def handle(self, *args, **options): def handle(self, *args, **options):
if options['generator_class']: if options['generator_class']:
@ -40,7 +41,12 @@ class Command(BaseCommand):
schema = generator.get_schema(request=None, public=True) schema = generator.get_schema(request=None, public=True)
renderer = self.get_renderer(options['format']) renderer = self.get_renderer(options['format'])
output = renderer.render(schema, renderer_context={}) output = renderer.render(schema, renderer_context={})
self.stdout.write(output.decode())
if options['file']:
with open(options['file'], 'wb') as f:
f.write(output)
else:
self.stdout.write(output.decode())
def get_renderer(self, format): def get_renderer(self, format):
if self.get_mode() == COREAPI_MODE: if self.get_mode() == COREAPI_MODE:

View File

@ -1,4 +1,6 @@
import io import io
import os
import tempfile
import pytest import pytest
from django.conf.urls import url from django.conf.urls import url
@ -73,6 +75,21 @@ class GenerateSchemaTests(TestCase):
out_json = yaml.safe_load(self.out.getvalue()) out_json = yaml.safe_load(self.out.getvalue())
assert out_json == CustomSchemaGenerator.SCHEMA assert out_json == CustomSchemaGenerator.SCHEMA
def test_writes_schema_to_file_on_parameter(self):
fd, path = tempfile.mkstemp()
try:
call_command('generateschema', '--file={}'.format(path), stdout=self.out)
# nothing on stdout
assert not self.out.getvalue()
call_command('generateschema', stdout=self.out)
expected_out = self.out.getvalue()
# file output identical to stdout output
with os.fdopen(fd) as fh:
assert expected_out and fh.read() == expected_out
finally:
os.remove(path)
@pytest.mark.skipif(yaml is None, reason='PyYAML is required.') @pytest.mark.skipif(yaml is None, reason='PyYAML is required.')
@override_settings(REST_FRAMEWORK={'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema'}) @override_settings(REST_FRAMEWORK={'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.AutoSchema'})
def test_coreapi_renders_default_schema_with_custom_title_url_and_description(self): def test_coreapi_renders_default_schema_with_custom_title_url_and_description(self):