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

ValeriyMenshikov / restcodegen / 18804220065

25 Oct 2025 02:15PM UTC coverage: 64.531%. First build
18804220065

Pull #7

github

web-flow
Merge 443f98cb9 into 43edde1f5
Pull Request #7: Closes #5

20 of 34 new or added lines in 9 files covered. (58.82%)

433 of 671 relevant lines covered (64.53%)

1.94 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
×
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: str | 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)
×
NEW
43
        create_and_write_file(file_path=file_path.parent.parent / "__init__.py", text="# coding: utf-8")
×
44

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

63
    def _gen_models(self) -> None:
×
64
        LOGGER.info(f"Generate models for service: {self.openapi_spec.service_name}")
×
NEW
65
        file_path = self.BASE_PATH / name_to_snake(self.openapi_spec.service_name) / "models" / "api_models.py"
×
66
        create_and_write_file(file_path=file_path)
×
NEW
67
        create_and_write_file(file_path=file_path.parent / "__init__.py", text="# coding: utf-8")
×
68
        header_path_template = self.templates_dir / "header.jinja2"
×
69
        generate(
×
70
            json.dumps(self.openapi_spec.openapi_spec),
71
            output=file_path,
72
            snake_case_field=True,
73
            output_model_type=DataModelType.PydanticV2BaseModel,
74
            reuse_model=True,
75
            field_constraints=True,
76
            custom_file_header_path=header_path_template,
77
            capitalise_enum_members=True,
78
            encoding="utf-8",
79
        )
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