ab-openapi-python-generator 2.2.0__tar.gz → 2.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/PKG-INFO +1 -1
  2. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/tutorial/index.md +4 -4
  3. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/pyproject.toml +1 -1
  4. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/generate_data.py +1 -1
  5. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/client_generator.py +20 -26
  6. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/jinja_config.py +2 -1
  7. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/model_generator.py +1 -1
  8. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/templates/async_client_httpx_pydantic_2.jinja2 +5 -5
  9. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/templates/sync_client_httpx_pydantic_2.jinja2 +5 -5
  10. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/models.py +0 -15
  11. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_generated_code.py +3 -3
  12. ab_openapi_python_generator-2.2.2/tests/test_jinja_no_autoescape.py +10 -0
  13. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_openapi_30.py +1 -1
  14. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_openapi_31.py +1 -1
  15. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_openapi_31_completeness.py +3 -3
  16. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_openapi_31_coverage.py +2 -2
  17. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_openapi_31_schema_features.py +3 -3
  18. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_swagger_petstore_30.py +2 -2
  19. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_swagger_petstore_31.py +4 -4
  20. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/.envrc.example +0 -0
  21. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/.gitattributes +0 -0
  22. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/.github/dependabot.yml +0 -0
  23. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/.github/workflows/ci.yaml +0 -0
  24. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/.github/workflows/publish.yaml +0 -0
  25. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/.gitignore +0 -0
  26. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/.pre-commit-config.yaml +0 -0
  27. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/.vscode/launch.json +0 -0
  28. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/.vscode/tasks.json +0 -0
  29. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/LICENSE +0 -0
  30. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/Makefile +0 -0
  31. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/README.md +0 -0
  32. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/acknowledgements/index.md +0 -0
  33. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/css/custom.css +0 -0
  34. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/css/termynal.css +0 -0
  35. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/index.md +0 -0
  36. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/js/custom.js +0 -0
  37. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/js/termynal.js +0 -0
  38. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/openapi-definition.md +0 -0
  39. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/quick_start.md +0 -0
  40. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/references/index.md +0 -0
  41. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/references/module_usage.md +0 -0
  42. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/tutorial/advanced.md +0 -0
  43. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/docs/tutorial/authentication.md +0 -0
  44. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/logo.png +0 -0
  45. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/__init__.py +0 -0
  46. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/__main__.py +0 -0
  47. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/common.py +0 -0
  48. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/__init__.py +0 -0
  49. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/__init__.py +0 -0
  50. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/common.py +0 -0
  51. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/exception_generator.py +0 -0
  52. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/generator.py +0 -0
  53. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/templates/alias_union.jinja2 +0 -0
  54. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/templates/discriminator_enum.jinja2 +0 -0
  55. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/templates/enum.jinja2 +0 -0
  56. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/templates/http_exception.jinja2 +0 -0
  57. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/templates/models.jinja2 +0 -0
  58. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/language_converters/python/templates/models_pydantic_2.jinja2 +0 -0
  59. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/parsers/__init__.py +0 -0
  60. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/parsers/openapi_30.py +0 -0
  61. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/parsers/openapi_31.py +0 -0
  62. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/py.typed +0 -0
  63. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/src/ab_openapi_python_generator/version_detector.py +0 -0
  64. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/__init__.py +0 -0
  65. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/build_test_api/api.py +0 -0
  66. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/conftest.py +0 -0
  67. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_common_normalize_symbol.py +0 -0
  68. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/failing_api.json +0 -0
  69. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/gitea_issue_11.json +0 -0
  70. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/issue_117.json +0 -0
  71. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/issue_120.json +0 -0
  72. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/issue_17.json +0 -0
  73. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/issue_30_87.json +0 -0
  74. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/issue_51.json +0 -0
  75. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/issue_55.json +0 -0
  76. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/issue_71.json +0 -0
  77. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/issue_71_31.json +0 -0
  78. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/issue_illegal_character_in_operation_id.json +0 -0
  79. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/issue_keyword_parameter_name.json +0 -0
  80. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/openapi_gitea_converted.json +0 -0
  81. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/swagger_petstore_3_0_4.yaml +0 -0
  82. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/swagger_petstore_3_1.yaml +0 -0
  83. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/test_api.json +0 -0
  84. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_data/test_api_31.json +0 -0
  85. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_generate_data.py +0 -0
  86. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_generate_data_negative.py +0 -0
  87. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_main.py +0 -0
  88. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_model_docstring.py +0 -0
  89. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_model_generator.py +0 -0
  90. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_model_generator_edges.py +0 -0
  91. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_service_generator.py +0 -0
  92. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_service_generator_edges.py +0 -0
  93. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tests/test_version_detector_edges.py +0 -0
  94. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.2}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ab-openapi-python-generator
3
- Version: 2.2.0
3
+ Version: 2.2.2
4
4
  Summary: Openapi Python Generator
5
5
  Project-URL: Homepage, https://github.com/auth-broker/openapi-python-generator
6
6
  Project-URL: Repository, https://github.com/auth-broker/openapi-python-generator
@@ -788,7 +788,7 @@ only sync (for __requests__) or only async (for __aiohttp__) services.
788
788
  ``` py
789
789
  ...
790
790
  async def async_root__get() -> RootResponse:
791
- base_path = APIConfig().base_path
791
+ base_url = APIConfig().base_url
792
792
  path = f"/"
793
793
  headers = {
794
794
  "Content-Type": "application/json",
@@ -797,7 +797,7 @@ only sync (for __requests__) or only async (for __aiohttp__) services.
797
797
  }
798
798
  query_params = {}
799
799
 
800
- with httpx.AsyncClient(base_url=base_path) as client:
800
+ with httpx.AsyncClient(base_url=base_url) as client:
801
801
  response = await client.request(
802
802
  method="get",
803
803
  url=path,
@@ -815,7 +815,7 @@ only sync (for __requests__) or only async (for __aiohttp__) services.
815
815
  ``` py
816
816
  ...
817
817
  def root__get() -> RootResponse:
818
- base_path = APIConfig().base_path
818
+ base_url = APIConfig().base_url
819
819
  path = f"/"
820
820
  headers = {
821
821
  "Content-Type": "application/json",
@@ -824,7 +824,7 @@ only sync (for __requests__) or only async (for __aiohttp__) services.
824
824
  }
825
825
  query_params = {}
826
826
 
827
- with httpx.Client(base_url=base_path) as client:
827
+ with httpx.Client(base_url=base_url) as client:
828
828
  response = client.request(
829
829
  method="get",
830
830
  url=path,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ab-openapi-python-generator"
3
- version = "2.2.0"
3
+ version = "2.2.2"
4
4
  description = "Openapi Python Generator"
5
5
  authors = [
6
6
  { name = "Marco Müllner", email = "muellnermarco@gmail.com" },
@@ -125,7 +125,7 @@ def write_data(data: ConversionResult, output: Union[str, Path], formatter: Form
125
125
  Creates:
126
126
  - models/ (and models/__init__.py)
127
127
  - clients/ (and clients/__init__.py)
128
- - exceptions.py (package root, if present)
128
+ - exceptions (package root/__init__.py)
129
129
  - __init__.py (package root)
130
130
  """
131
131
  out = Path(output)
@@ -363,34 +363,28 @@ def generate_clients(
363
363
  def _generate_service_operation(
364
364
  op: Operation, path_obj: PathItem, path_name: str, http_operation: str, async_type: bool
365
365
  ) -> ServiceOperation:
366
- try:
367
- path_level_params = []
368
- if hasattr(path_obj, "parameters") and path_obj.parameters is not None:
369
- path_level_params = [p for p in path_obj.parameters if p is not None]
370
- if path_level_params:
371
- existing_names = set()
372
- if op.parameters is not None:
373
- for p in op.parameters:
374
- if isinstance(p, (Parameter30, Parameter31)):
375
- existing_names.add(p.name)
376
- for p in path_level_params:
377
- if isinstance(p, (Parameter30, Parameter31)) and p.name not in existing_names:
378
- if op.parameters is None:
379
- op.parameters = [] # type: ignore
380
- op.parameters.append(p) # type: ignore
381
- except Exception:
382
- pass
366
+ path_level_params = []
367
+ if hasattr(path_obj, "parameters") and path_obj.parameters is not None:
368
+ path_level_params = [p for p in path_obj.parameters if p is not None]
369
+ if path_level_params:
370
+ existing_names = set()
371
+ if op.parameters is not None:
372
+ for p in op.parameters:
373
+ if isinstance(p, (Parameter30, Parameter31)):
374
+ existing_names.add(p.name)
375
+ for p in path_level_params:
376
+ if isinstance(p, (Parameter30, Parameter31)) and p.name not in existing_names:
377
+ if op.parameters is None:
378
+ op.parameters = [] # type: ignore
379
+ op.parameters.append(p) # type: ignore
383
380
 
384
381
  params = generate_params(op)
385
- try:
386
- placeholder_names = [m.group(1) for m in re.finditer(r"\{([^}/]+)\}", path_name)]
387
- existing_param_names = {p.split(":")[0].strip() for p in params.split(",") if ":" in p}
388
- for ph in placeholder_names:
389
- norm_ph = common.normalize_symbol(ph)
390
- if norm_ph not in existing_param_names and norm_ph:
391
- params = f"{norm_ph}: Any, " + params
392
- except Exception:
393
- pass
382
+ placeholder_names = [m.group(1) for m in re.finditer(r"\{([^}/]+)\}", path_name)]
383
+ existing_param_names = {p.split(":")[0].strip() for p in params.split(",") if ":" in p}
384
+ for ph in placeholder_names:
385
+ norm_ph = common.normalize_symbol(ph)
386
+ if norm_ph not in existing_param_names and norm_ph:
387
+ params = f"{norm_ph}: Any, " + params
394
388
 
395
389
  operation_id = generate_operation_id(op, http_operation, path_name)
396
390
  query_params = generate_query_params(op)
@@ -28,8 +28,9 @@ def create_jinja_env():
28
28
  if custom_template_path is not None
29
29
  else FileSystemLoader(TEMPLATE_PATH)
30
30
  ),
31
- autoescape=True,
31
+ autoescape=False,
32
32
  trim_blocks=True,
33
+ lstrip_blocks=True,
33
34
  )
34
35
 
35
36
  environment.filters["normalize_symbol"] = common.normalize_symbol
@@ -266,7 +266,7 @@ def _discover_discriminated_unions(
266
266
  register_union(schema_name, schema)
267
267
 
268
268
  # 2) inline/property discriminated unions
269
- for parent_name, parent_schema in components.schemas.items():
269
+ for _parent_name, parent_schema in components.schemas.items():
270
270
  props = getattr(parent_schema, "properties", None) or {}
271
271
  for prop_name, prop_schema in props.items():
272
272
  disc = getattr(prop_schema, "discriminator", None)
@@ -3,17 +3,17 @@
3
3
  from typing import Any, Dict, Optional, Union
4
4
 
5
5
  import httpx
6
- from pydantic import BaseModel
6
+ from pydantic import BaseModel, HttpUrl
7
7
 
8
8
  from ..models import *
9
- {% set _base_path = servers[0].url if servers|length > 0 else "/" %}
9
+ {% set _base_url = servers[0].url if servers|length > 0 else "/" %}
10
10
  from ..exceptions import HTTPException
11
11
 
12
12
 
13
13
  class AsyncClient(BaseModel):
14
14
  model_config = {"validate_assignment": True}
15
15
 
16
- base_path: str = "{{ _base_path }}"
16
+ base_url: str = "{{ _base_url }}"
17
17
  verify: Union[bool, str] = True
18
18
  {% if env_token_name is none %}
19
19
  access_token: Optional[str] = None
@@ -41,7 +41,7 @@ class AsyncClient(BaseModel):
41
41
 
42
42
  {% for op in operations %}
43
43
  async def {{ op.operation_id }}(self{% if op.params %}, {{ op.params }}{% endif %}) -> Any:
44
- base_path = self.base_path
44
+ base_url = self.base_url
45
45
  path = f"{{ op.path_name }}"
46
46
 
47
47
  headers = {
@@ -57,7 +57,7 @@ class AsyncClient(BaseModel):
57
57
  }
58
58
  query_params = {k: v for (k, v) in query_params.items() if v is not None}
59
59
 
60
- async with httpx.AsyncClient(base_url=base_path, verify=self.verify) as client:
60
+ async with httpx.AsyncClient(base_url=base_url, verify=self.verify) as client:
61
61
  response = await client.request(
62
62
  "{{ op.method }}",
63
63
  httpx.URL(path),
@@ -3,17 +3,17 @@
3
3
  from typing import Any, Dict, Optional, Union
4
4
 
5
5
  import httpx
6
- from pydantic import BaseModel
6
+ from pydantic import BaseModel, HttpUrl
7
7
 
8
8
  from ..models import *
9
- {% set _base_path = servers[0].url if servers|length > 0 else "/" %}
9
+ {% set _base_url = servers[0].url if servers|length > 0 else "/" %}
10
10
  from ..exceptions import HTTPException
11
11
 
12
12
 
13
13
  class SyncClient(BaseModel):
14
14
  model_config = {"validate_assignment": True}
15
15
 
16
- base_path: str = "{{ _base_path }}"
16
+ base_url: str = "{{ _base_url }}"
17
17
  verify: Union[bool, str] = True
18
18
  {% if env_token_name is none %}
19
19
  access_token: Optional[str] = None
@@ -41,7 +41,7 @@ class SyncClient(BaseModel):
41
41
 
42
42
  {% for op in operations %}
43
43
  def {{ op.operation_id }}(self{% if op.params %}, {{ op.params }}{% endif %}) -> Any:
44
- base_path = self.base_path
44
+ base_url = self.base_url
45
45
  path = f"{{ op.path_name }}"
46
46
 
47
47
  headers = {
@@ -57,7 +57,7 @@ class SyncClient(BaseModel):
57
57
  }
58
58
  query_params = {k: v for (k, v) in query_params.items() if v is not None}
59
59
 
60
- with httpx.Client(base_url=base_path, verify=self.verify) as client:
60
+ with httpx.Client(base_url=base_url, verify=self.verify) as client:
61
61
  response = client.request(
62
62
  "{{ op.method }}",
63
63
  httpx.URL(path),
@@ -80,21 +80,6 @@ class Model(BaseModel):
80
80
  properties: List[Property] = []
81
81
 
82
82
 
83
- class Service(BaseModel):
84
- file_name: str
85
- operations: List[ServiceOperation]
86
- content: str
87
- async_client: Optional[bool] = False
88
- library_import: str
89
- use_orjson: bool = False
90
-
91
-
92
- class APIConfig(BaseModel):
93
- file_name: str
94
- base_url: str
95
- content: str
96
-
97
-
98
83
  class ConversionResult(BaseModel):
99
84
  models: List[Model] = Field(default_factory=list)
100
85
  clients: List[Model] = Field(default_factory=list)
@@ -131,10 +131,10 @@ def test_generate_code(
131
131
 
132
132
  # Get the base URL from the API config
133
133
  if custom_ip is not None:
134
- api_config_instance.base_path = custom_ip
134
+ api_config_instance.base_url = custom_ip
135
135
  base_url = custom_ip
136
136
  else:
137
- base_url = api_config_instance.base_path
137
+ base_url = api_config_instance.base_url
138
138
 
139
139
  # Ensure base_url doesn't have trailing slash for consistent URL construction
140
140
  base_url = base_url.rstrip("/")
@@ -431,7 +431,7 @@ async def _run_service_tests_aiohttp(
431
431
  port = sockets[0].getsockname()[1]
432
432
 
433
433
  base_url = f"{scheme}://{host}:{port}"
434
- api_config_instance.base_path = base_url
434
+ api_config_instance.base_url = base_url
435
435
 
436
436
  try:
437
437
  # Call async generated functions
@@ -0,0 +1,10 @@
1
+ def test_jinja_no_autoescape():
2
+ from ab_openapi_python_generator.language_converters.python.jinja_config import (
3
+ create_jinja_env,
4
+ )
5
+
6
+ env = create_jinja_env()
7
+ template = env.from_string("{{ s }}")
8
+ out = template.render(s="'scope' : scope,")
9
+ assert "'" not in out
10
+ assert out == "'scope' : scope,"
@@ -190,7 +190,7 @@ class TestOpenAPI30:
190
190
  assert (output_dir / "__init__.py").exists()
191
191
  assert (output_dir / "models").exists()
192
192
  assert (output_dir / "services").exists()
193
- assert (output_dir / "api_config.py").exists()
193
+ assert (output_dir / "exceptions").exists()
194
194
 
195
195
  # Check model structure
196
196
  assert (output_dir / "models" / "__init__.py").exists()
@@ -242,7 +242,7 @@ class TestOpenAPI31:
242
242
  assert (output_dir / "__init__.py").exists()
243
243
  assert (output_dir / "models").exists()
244
244
  assert (output_dir / "services").exists()
245
- assert (output_dir / "api_config.py").exists()
245
+ assert (output_dir / "exceptions").exists()
246
246
 
247
247
  # Check model structure
248
248
  assert (output_dir / "models" / "__init__.py").exists()
@@ -356,8 +356,8 @@ class TestOpenAPI31Completeness:
356
356
  # Verify basic structure
357
357
  assert (temp_path / "__init__.py").exists()
358
358
  assert (temp_path / "models").exists()
359
- assert (temp_path / "services").exists()
360
- assert (temp_path / "api_config.py").exists()
359
+ assert (temp_path / "clients").exists()
360
+ assert (temp_path / "exceptions").exists()
361
361
 
362
362
  # Verify library-specific imports in services
363
363
  services_dir = temp_path / "services"
@@ -538,7 +538,7 @@ class TestOpenAPI31Completeness:
538
538
  # Verify files exist
539
539
  assert (temp_path / "__init__.py").exists()
540
540
  assert (temp_path / "models").exists()
541
- assert (temp_path / "services").exists()
541
+ assert (temp_path / "clients").exists()
542
542
 
543
543
  # Check for orjson usage if enabled
544
544
  if use_orjson:
@@ -327,8 +327,8 @@ class TestOpenAPI31SupportedFeatures:
327
327
 
328
328
  # Verify files exist
329
329
  assert (temp_path / "models").exists()
330
- assert (temp_path / "services").exists()
331
- assert (temp_path / "api_config.py").exists()
330
+ assert (temp_path / "clients").exists()
331
+ assert (temp_path / "exceptions").exists()
332
332
 
333
333
  # Check that the code compiles
334
334
  models_dir = temp_path / "models"
@@ -394,9 +394,9 @@ class TestOpenAPI31SchemaFeatures:
394
394
  )
395
395
 
396
396
  # Verify files are generated
397
- assert (temp_path / "models.py").exists()
398
- assert (temp_path / "services" / "general_service.py").exists()
399
- assert (temp_path / "api_config.py").exists()
397
+ assert (temp_path / "models").exists()
398
+ assert (temp_path / "clients").exists()
399
+ assert (temp_path / "exceptions").exists()
400
400
 
401
401
  # Verify the generated code compiles
402
402
  models_content = (temp_path / "models.py").read_text()
@@ -129,7 +129,7 @@ class TestSwaggerPetstore30:
129
129
  assert (output_dir / "__init__.py").exists()
130
130
  assert (output_dir / "models").exists()
131
131
  assert (output_dir / "services").exists()
132
- assert (output_dir / "api_config.py").exists()
132
+ assert (output_dir / "exceptions").exists()
133
133
 
134
134
  # Check model files
135
135
  models_dir = output_dir / "models"
@@ -169,7 +169,7 @@ class TestSwaggerPetstore30:
169
169
 
170
170
  # Basic validation that output was created
171
171
  assert output_dir.exists()
172
- assert (output_dir / "api_config.py").exists()
172
+ assert (output_dir / "exceptions").exists()
173
173
 
174
174
  def test_petstore_30_model_generation(self, petstore_30_spec):
175
175
  """Test that model generation works correctly for Petstore 3.0."""
@@ -148,8 +148,8 @@ class TestSwaggerPetstore31:
148
148
  # Check that files were generated
149
149
  assert (output_dir / "__init__.py").exists()
150
150
  assert (output_dir / "models").exists()
151
- assert (output_dir / "services").exists()
152
- assert (output_dir / "api_config.py").exists()
151
+ assert (output_dir / "clients").exists()
152
+ assert (output_dir / "exceptions").exists()
153
153
 
154
154
  # Check model files
155
155
  models_dir = output_dir / "models"
@@ -189,7 +189,7 @@ class TestSwaggerPetstore31:
189
189
 
190
190
  # Basic validation that output was created
191
191
  assert output_dir.exists()
192
- assert (output_dir / "api_config.py").exists()
192
+ assert (output_dir / "exceptions").exists()
193
193
 
194
194
  @pytest.mark.parametrize("use_orjson", [True, False])
195
195
  def test_petstore_31_with_orjson_options(self, petstore_31_spec_path, use_orjson):
@@ -207,7 +207,7 @@ class TestSwaggerPetstore31:
207
207
 
208
208
  # Basic validation that output was created
209
209
  assert output_dir.exists()
210
- assert (output_dir / "api_config.py").exists()
210
+ assert (output_dir / "exceptions").exists()
211
211
 
212
212
  def test_petstore_31_uuid_parameters(self, petstore_31_spec):
213
213
  """Test that UUID parameters in Petstore 3.1 are handled correctly."""