Skip to content

Commit

Permalink
Merge pull request #324 from ytoml/disable-timestamp
Browse files Browse the repository at this point in the history
Add `--disable-timestamp`
  • Loading branch information
koxudaxi committed Feb 15, 2023
2 parents a774314 + 95867a7 commit e1667f6
Show file tree
Hide file tree
Showing 5 changed files with 229 additions and 4 deletions.
13 changes: 9 additions & 4 deletions fastapi_code_generator/__main__.py
Expand Up @@ -46,6 +46,7 @@ def main(
custom_visitors: Optional[List[Path]] = typer.Option(
None, "--custom-visitor", "-c"
),
disable_timestamp: bool = typer.Option(False, "--disable-timestamp"),
) -> None:
input_name: str = input_file.name
input_text: str = input_file.read()
Expand All @@ -61,6 +62,7 @@ def main(
template_dir,
model_path,
enum_field_as_literal,
disable_timestamp=disable_timestamp,
)
return generate_code(
input_name,
Expand All @@ -69,6 +71,7 @@ def main(
template_dir,
model_path,
custom_visitors=custom_visitors,
disable_timestamp=disable_timestamp,
)


Expand All @@ -90,6 +93,7 @@ def generate_code(
model_path: Optional[Path] = None,
enum_field_as_literal: Optional[str] = None,
custom_visitors: Optional[List[Path]] = [],
disable_timestamp: bool = False,
) -> None:
if not model_path:
model_path = MODEL_PATH
Expand Down Expand Up @@ -148,8 +152,9 @@ def generate_code(
timestamp = datetime.now(timezone.utc).replace(microsecond=0).isoformat()
header = f"""\
# generated by fastapi-codegen:
# filename: {Path(input_name).name}
# timestamp: {timestamp}"""
# filename: {Path(input_name).name}"""
if not disable_timestamp:
header += f"\n# timestamp: {timestamp}"

for path, code in results.items():
with output_dir.joinpath(path.with_suffix(".py")).open("wt") as file:
Expand All @@ -160,8 +165,8 @@ def generate_code(
header = f'''\
# generated by fastapi-codegen:
# filename: {{filename}}'''
# if not disable_timestamp:
header += f'\n# timestamp: {timestamp}'
if not disable_timestamp:
header += f'\n# timestamp: {timestamp}'

for path, body_and_filename in modules.items():
body, filename = body_and_filename
Expand Down
51 changes: 51 additions & 0 deletions tests/data/expected/openapi/disable_timestamp/simple/main.py
@@ -0,0 +1,51 @@
# generated by fastapi-codegen:
# filename: simple.yaml

from __future__ import annotations

from typing import Optional, Union

from fastapi import FastAPI, Path

from .models import Error, Pets

app = FastAPI(
version='1.0.0',
title='Swagger Petstore',
license={'name': 'MIT'},
description='This description is for testing\nmulti-line\ndescription\n',
servers=[{'url': 'http://petstore.swagger.io/v1'}],
)


@app.get(
'/pets', response_model=Pets, responses={'default': {'model': Error}}, tags=['pets']
)
def list_pets(limit: Optional[int] = None) -> Union[Pets, Error]:
"""
List all pets
"""
pass


@app.post(
'/pets', response_model=None, responses={'default': {'model': Error}}, tags=['pets']
)
def create_pets() -> Union[None, Error]:
"""
Create a pet
"""
pass


@app.get(
'/pets/{pet_id}',
response_model=Pets,
responses={'default': {'model': Error}},
tags=['pets'],
)
def show_pet_by_id(pet_id: str = Path(..., alias='petId')) -> Union[Pets, Error]:
"""
Info for a specific pet
"""
pass
23 changes: 23 additions & 0 deletions tests/data/expected/openapi/disable_timestamp/simple/models.py
@@ -0,0 +1,23 @@
# generated by fastapi-codegen:
# filename: simple.yaml

from __future__ import annotations

from typing import List, Optional

from pydantic import BaseModel, Field


class Pet(BaseModel):
id: int
name: str
tag: Optional[str] = None


class Pets(BaseModel):
__root__: List[Pet] = Field(..., description='list of pet')


class Error(BaseModel):
code: int
message: str
121 changes: 121 additions & 0 deletions tests/data/openapi/disable_timestamp/simple.yaml
@@ -0,0 +1,121 @@
openapi: "3.0.0"
info:
version: 1.0.0
title: Swagger Petstore
license:
name: MIT
description: |
This description is for testing
multi-line
description
servers:
- url: http://petstore.swagger.io/v1
paths:
/pets:
get:
summary: List all pets
operationId: listPets
tags:
- pets
parameters:
- name: limit
in: query
description: How many items to return at one time (max 100)
required: false
schema:
type: integer
format: int32
responses:
"200":
description: A paged array of pets
headers:
x-next:
description: A link to the next page of responses
schema:
type: string
content:
application/json:
schema:
$ref: "#/components/schemas/Pets"
default:
description: unexpected error
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
x-amazon-apigateway-integration:
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${PythonVersionFunction.Arn}/invocations
passthroughBehavior: when_no_templates
httpMethod: POST
type: aws_proxy
post:
summary: Create a pet
operationId: createPets
tags:
- pets
responses:
"201":
description: Null response
default:
description: unexpected error
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
/pets/{petId}:
get:
summary: Info for a specific pet
operationId: showPetById
tags:
- pets
parameters:
- name: petId
in: path
required: true
description: The id of the pet to retrieve
schema:
type: string
responses:
"200":
description: Expected response to a valid request
content:
application/json:
schema:
$ref: "#/components/schemas/Pets"
default:
description: unexpected error
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
components:
schemas:
Pet:
required:
- id
- name
properties:
id:
type: integer
format: int64
name:
type: string
tag:
type: string
Pets:
type: array
description: list of pet
items:
$ref: "#/components/schemas/Pet"
Error:
required:
- code
- message
properties:
code:
type: integer
format: int32
message:
type: string
25 changes: 25 additions & 0 deletions tests/test_generate.py
Expand Up @@ -10,6 +10,7 @@
OPEN_API_DEFAULT_TEMPLATE_DIR_NAME = Path('openapi') / 'default_template'
OPEN_API_SECURITY_TEMPLATE_DIR_NAME = Path('openapi') / 'custom_template_security'
OPEN_API_REMOTE_REF_DIR_NAME = Path('openapi') / 'remote_ref'
OPEN_API_DISABLE_TIMESTAMP_DIR_NAME = Path('openapi') / 'disable_timestamp'

DATA_DIR = Path(__file__).parent / 'data'

Expand Down Expand Up @@ -86,3 +87,27 @@ def test_generate_remote_ref(mocker):
assert [f.name for f in output_files] == [f.name for f in expected_files]
for output_file, expected_file in zip(output_files, expected_files):
assert output_file.read_text() == expected_file.read_text()


@pytest.mark.parametrize(
"oas_file", (DATA_DIR / OPEN_API_DISABLE_TIMESTAMP_DIR_NAME).glob("*.yaml")
)
@freeze_time("2020-06-19")
def test_disable_timestamp(oas_file):
with TemporaryDirectory() as tmp_dir:
output_dir = Path(tmp_dir) / oas_file.stem
generate_code(
input_name=oas_file.name,
input_text=oas_file.read_text(),
output_dir=output_dir,
template_dir=None,
disable_timestamp=True,
)
expected_dir = (
EXPECTED_DIR / OPEN_API_DISABLE_TIMESTAMP_DIR_NAME / oas_file.stem
)
output_files = sorted(list(output_dir.glob('*')))
expected_files = sorted(list(expected_dir.glob('*')))
assert [f.name for f in output_files] == [f.name for f in expected_files]
for output_file, expected_file in zip(output_files, expected_files):
assert output_file.read_text() == expected_file.read_text()

0 comments on commit e1667f6

Please sign in to comment.