Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generator NG #714

Merged
merged 31 commits into from
Feb 21, 2022
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
9e36101
Generator NG
jirikuncar Feb 3, 2022
837441e
api parameters
jirikuncar Feb 3, 2022
5e6599b
http headers and smaller diff
jirikuncar Feb 4, 2022
9896b12
less diff
jirikuncar Feb 4, 2022
f930590
form params
jirikuncar Feb 4, 2022
a6a8de0
consistent new lines at the eof
jirikuncar Feb 4, 2022
7d587da
comments
jirikuncar Feb 4, 2022
d32d9e8
Merge remote-tracking branch 'origin/master' into jirikuncar/generato…
jirikuncar Feb 6, 2022
0077840
collection_format
jirikuncar Feb 7, 2022
81f3122
validation
jirikuncar Feb 7, 2022
7491b9a
collection_format
jirikuncar Feb 7, 2022
e48b1c9
attribute validation
jirikuncar Feb 7, 2022
e03751b
Merge remote-tracking branch 'origin/master' into jirikuncar/generato…
jirikuncar Feb 7, 2022
5f22e56
remove at
jirikuncar Feb 7, 2022
9d06e04
remove duplicate
jirikuncar Feb 7, 2022
35cabb6
better comments
jirikuncar Feb 7, 2022
2f1355b
better comments
jirikuncar Feb 7, 2022
85e2e6a
private setters
jirikuncar Feb 7, 2022
fa4e9e8
enum
jirikuncar Feb 7, 2022
22fdad8
setter
jirikuncar Feb 7, 2022
cf89c33
setter
jirikuncar Feb 7, 2022
e181276
use pip to install
jirikuncar Feb 7, 2022
cdef510
Merge branch 'master' into jirikuncar/generator-ng
jirikuncar Feb 10, 2022
cd29dd9
Merge branch 'master' into jirikuncar/generator-ng
jirikuncar Feb 10, 2022
8549e8d
Merge remote-tracking branch 'origin/master' into jirikuncar/generato…
jirikuncar Feb 16, 2022
cca4bca
use python always
jirikuncar Feb 17, 2022
cc97366
Merge remote-tracking branch 'origin/master' into jirikuncar/generato…
jirikuncar Feb 17, 2022
a21cd45
split generation
jirikuncar Feb 17, 2022
a8078c5
simplified pre-commit configuration
jirikuncar Feb 17, 2022
4d0023e
Merge remote-tracking branch 'origin/master' into jirikuncar/generato…
jirikuncar Feb 18, 2022
f810551
Merge branch 'master' into jirikuncar/generator-ng
jirikuncar Feb 21, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
33 changes: 0 additions & 33 deletions .generator/openapitools.json

This file was deleted.

185 changes: 185 additions & 0 deletions .generator/poetry.lock

Large diffs are not rendered by default.

19 changes: 19 additions & 0 deletions .generator/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[tool.poetry]
name = "generator"
version = "0.1.0"
description = ""
authors = ["Jiri Kuncar <[email protected]>"]
license = "Apache-2.0"

[tool.poetry.dependencies]
python = "^3.9"
click = "8.0.1"
PyYAML = "6.0"
jsonref = "0.2"
jinja2 = "3.0.3"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
jirikuncar marked this conversation as resolved.
Show resolved Hide resolved
build-backend = "poetry.core.masonry.api"
Empty file.
3 changes: 3 additions & 0 deletions .generator/src/generator/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from .cli import cli

cli()
96 changes: 96 additions & 0 deletions .generator/src/generator/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import json
import pathlib

import click
from jinja2 import Environment, FileSystemLoader, Template

from . import openapi
from . import formatter


@click.command()
@click.option(
"-i",
"--input",
type=click.Path(
exists=True, file_okay=True, dir_okay=False, path_type=pathlib.Path
),
)
@click.option(
"-o",
"--output",
type=click.Path(path_type=pathlib.Path),
)
def cli(input, output):
"""
Generate a Ruby code snippet from OpenAPI specification.
"""
spec = openapi.load(input)

version = input.parent.name
with (input.parent.parent.parent / "config" / f"{version}.json").open() as fp:
config = json.load(fp)

env = Environment(
loader=FileSystemLoader(str(pathlib.Path(__file__).parent / "templates"))
)

env.filters["accept_headers"] = openapi.accept_headers
env.filters["attribute_name"] = formatter.attribute_name
env.filters["block_comment"] = formatter.block_comment
env.filters["camel_case"] = formatter.camel_case
env.filters["collection_format"] = openapi.collection_format
env.filters["format_server"] = openapi.format_server
env.filters["format_value"] = formatter.format_value
env.filters["parameter_schema"] = openapi.parameter_schema
env.filters["parameters"] = openapi.parameters
env.filters["return_type"] = openapi.return_type
env.filters["snake_case"] = formatter.snake_case

env.globals["config"] = config
env.globals["enumerate"] = enumerate
env.globals["version"] = version
env.globals["openapi"] = spec
env.globals["get_name"] = openapi.get_name
env.globals["get_type_for_attribute"] = openapi.get_type_for_attribute
env.globals["get_type_for_parameter"] = openapi.get_type_for_parameter

api_j2 = env.get_template("api.j2")
model_j2 = env.get_template("model.j2")
package_j2 = env.get_template("package.j2")

extra_files = {
"api_client.rb": env.get_template("api_client.j2"),
"api_error.rb": env.get_template("api_error.j2"),
"configuration.rb": env.get_template("configuration.j2"),
}

apis = openapi.apis(spec)
models = openapi.models(spec)

package = output / config["gemNameInExamples"] / f"{version}.rb"
package.parent.mkdir(parents=True, exist_ok=True)
with package.open("w") as fp:
fp.write(package_j2.render(apis=apis, models=models))

gem_path = output / config["gemName"]
gem_path.mkdir(parents=True, exist_ok=True)

for name, template in extra_files.items():
filename = gem_path / name
with filename.open("w") as fp:
fp.write(template.render(apis=apis, models=models))

for name, model in models.items():
filename = formatter.snake_case(name) + ".rb"
model_path = gem_path / "models" / filename
model_path.parent.mkdir(parents=True, exist_ok=True)
with model_path.open("w") as fp:
fp.write(model_j2.render(name=name, model=model))

for name, operations in apis.items():
filename = formatter.snake_case(name) + "_api.rb"
api_path = gem_path / "api" / filename
api_path.parent.mkdir(parents=True, exist_ok=True)
with api_path.open("w") as fp:
fp.write(api_j2.render(name=name, operations=operations))
Loading