• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ValeriyMenshikov / restcodegen / 15833827515

23 Jun 2025 07:57PM UTC coverage: 64.627%. First build
15833827515

Pull #1

github

web-flow
Merge 3dd73feae into 92ba04ef7
Pull Request #1: Manual refactor

260 of 293 new or added lines in 12 files covered. (88.74%)

433 of 670 relevant lines covered (64.63%)

0.65 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/restcodegen/generator/rest_codegen.py
1
import json
×
2
from pathlib import Path
×
3

4
from datamodel_code_generator import DataModelType, generate
×
5

6
from restcodegen.generator.base import BaseTemplateGenerator
×
7
from restcodegen.generator.log import LOGGER
×
NEW
8
from restcodegen.generator.parser import Parser
×
9
from restcodegen.generator.utils import (
×
10
    create_and_write_file,
11
    name_to_snake,
12
)
13

14

15
class RESTClientGenerator(BaseTemplateGenerator):
×
16
    BASE_PATH = Path(".") / "clients" / "http"
×
17

18
    def __init__(
×
19
        self,
20
        openapi_spec: Parser,
21
        templates_dir: Path | None = None,
22
        async_mode: bool = False,
23
    ) -> None:
24
        super().__init__(templates_dir=templates_dir)
×
25
        self.openapi_spec = openapi_spec
×
26
        self.async_mode = async_mode
×
27

28
    def generate(self) -> None:
×
29
        self._gen_clients()
×
30
        self._gen_init_apis()
×
31
        self._gen_models()
×
32

33
    def _gen_init_apis(self) -> None:
×
34
        LOGGER.info("Generate __init__.py for apis")
×
35
        rendered_code = self.env.get_template("apis_init.jinja2").render(
×
36
            api_names=self.openapi_spec.apis,
37
            service_name=self.openapi_spec.service_name,
38
            version=self.version,
39
        )
40
        file_name = f"{name_to_snake(self.openapi_spec.service_name)}/__init__.py"
×
41
        file_path = self.BASE_PATH / file_name
×
42
        create_and_write_file(file_path=file_path, text=rendered_code)
×
43
        create_and_write_file(
×
44
            file_path=file_path.parent.parent / "__init__.py", text="# coding: utf-8"
45
        )
46

47
    def _gen_clients(self) -> None:
×
48
        for tag in self.openapi_spec.apis:
×
49
            LOGGER.info(f"Generate REST client for tag: {tag}")
×
50
            handlers = self.openapi_spec.handlers_by_tag(tag)
×
51
            models = self.openapi_spec.models_by_tag(tag)
×
52
            rendered_code = self.env.get_template("api_client.jinja2").render(
×
53
                async_mode=self.async_mode,
54
                models=models,
55
                data_list=handlers,
56
                api_name=tag,
57
                service_name=self.openapi_spec.service_name,
58
                version=self.version,
59
            )
60
            file_name = f"{name_to_snake(tag)}_api.py"
×
61
            file_path = (
×
62
                self.BASE_PATH
63
                / name_to_snake(self.openapi_spec.service_name)
64
                / "apis"
65
                / file_name
66
            )
67
            create_and_write_file(file_path=file_path, text=rendered_code)
×
68
            create_and_write_file(
×
69
                file_path=file_path.parent / "__init__.py", text="# coding: utf-8"
70
            )
71

72
    def _gen_models(self) -> None:
×
73
        LOGGER.info(f"Generate models for service: {self.openapi_spec.service_name}")
×
74
        file_path = (
×
75
            self.BASE_PATH
76
            / name_to_snake(self.openapi_spec.service_name)
77
            / "models"
78
            / "api_models.py"
79
        )
80
        create_and_write_file(file_path=file_path)
×
81
        create_and_write_file(
×
82
            file_path=file_path.parent / "__init__.py", text="# coding: utf-8"
83
        )
84
        header_path_template = self.templates_dir / "header.jinja2"
×
85
        generate(
×
86
            json.dumps(self.openapi_spec.openapi_spec),
87
            output=file_path,
88
            snake_case_field=True,
89
            output_model_type=DataModelType.PydanticV2BaseModel,
90
            reuse_model=True,
91
            field_constraints=True,
92
            custom_file_header_path=header_path_template,
93
            capitalise_enum_members=True,
94
            encoding="utf-8",
95
        )
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc