ab-openapi-python-generator 2.2.0__tar.gz → 2.2.1__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.1}/PKG-INFO +1 -1
  2. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/pyproject.toml +1 -1
  3. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/generate_data.py +1 -1
  4. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/client_generator.py +20 -26
  5. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/jinja_config.py +2 -1
  6. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/model_generator.py +1 -1
  7. ab_openapi_python_generator-2.2.1/tests/test_jinja_no_autoescape.py +10 -0
  8. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_openapi_30.py +1 -1
  9. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_openapi_31.py +1 -1
  10. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_openapi_31_completeness.py +3 -3
  11. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_openapi_31_coverage.py +2 -2
  12. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_openapi_31_schema_features.py +3 -3
  13. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_swagger_petstore_30.py +2 -2
  14. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_swagger_petstore_31.py +4 -4
  15. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/.envrc.example +0 -0
  16. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/.gitattributes +0 -0
  17. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/.github/dependabot.yml +0 -0
  18. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/.github/workflows/ci.yaml +0 -0
  19. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/.github/workflows/publish.yaml +0 -0
  20. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/.gitignore +0 -0
  21. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/.pre-commit-config.yaml +0 -0
  22. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/.vscode/launch.json +0 -0
  23. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/.vscode/tasks.json +0 -0
  24. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/LICENSE +0 -0
  25. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/Makefile +0 -0
  26. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/README.md +0 -0
  27. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/acknowledgements/index.md +0 -0
  28. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/css/custom.css +0 -0
  29. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/css/termynal.css +0 -0
  30. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/index.md +0 -0
  31. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/js/custom.js +0 -0
  32. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/js/termynal.js +0 -0
  33. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/openapi-definition.md +0 -0
  34. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/quick_start.md +0 -0
  35. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/references/index.md +0 -0
  36. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/references/module_usage.md +0 -0
  37. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/tutorial/advanced.md +0 -0
  38. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/tutorial/authentication.md +0 -0
  39. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/docs/tutorial/index.md +0 -0
  40. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/logo.png +0 -0
  41. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/__init__.py +0 -0
  42. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/__main__.py +0 -0
  43. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/common.py +0 -0
  44. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/__init__.py +0 -0
  45. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/__init__.py +0 -0
  46. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/common.py +0 -0
  47. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/exception_generator.py +0 -0
  48. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/generator.py +0 -0
  49. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/templates/alias_union.jinja2 +0 -0
  50. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/templates/async_client_httpx_pydantic_2.jinja2 +0 -0
  51. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/templates/discriminator_enum.jinja2 +0 -0
  52. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/templates/enum.jinja2 +0 -0
  53. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/templates/http_exception.jinja2 +0 -0
  54. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/templates/models.jinja2 +0 -0
  55. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/templates/models_pydantic_2.jinja2 +0 -0
  56. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/language_converters/python/templates/sync_client_httpx_pydantic_2.jinja2 +0 -0
  57. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/models.py +0 -0
  58. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/parsers/__init__.py +0 -0
  59. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/parsers/openapi_30.py +0 -0
  60. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/parsers/openapi_31.py +0 -0
  61. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/py.typed +0 -0
  62. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/src/ab_openapi_python_generator/version_detector.py +0 -0
  63. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/__init__.py +0 -0
  64. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/build_test_api/api.py +0 -0
  65. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/conftest.py +0 -0
  66. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_common_normalize_symbol.py +0 -0
  67. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/failing_api.json +0 -0
  68. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/gitea_issue_11.json +0 -0
  69. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/issue_117.json +0 -0
  70. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/issue_120.json +0 -0
  71. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/issue_17.json +0 -0
  72. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/issue_30_87.json +0 -0
  73. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/issue_51.json +0 -0
  74. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/issue_55.json +0 -0
  75. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/issue_71.json +0 -0
  76. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/issue_71_31.json +0 -0
  77. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/issue_illegal_character_in_operation_id.json +0 -0
  78. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/issue_keyword_parameter_name.json +0 -0
  79. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/openapi_gitea_converted.json +0 -0
  80. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/swagger_petstore_3_0_4.yaml +0 -0
  81. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/swagger_petstore_3_1.yaml +0 -0
  82. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/test_api.json +0 -0
  83. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_data/test_api_31.json +0 -0
  84. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_generate_data.py +0 -0
  85. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_generate_data_negative.py +0 -0
  86. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_generated_code.py +0 -0
  87. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_main.py +0 -0
  88. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_model_docstring.py +0 -0
  89. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_model_generator.py +0 -0
  90. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_model_generator_edges.py +0 -0
  91. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_service_generator.py +0 -0
  92. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_service_generator_edges.py +0 -0
  93. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/tests/test_version_detector_edges.py +0 -0
  94. {ab_openapi_python_generator-2.2.0 → ab_openapi_python_generator-2.2.1}/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.1
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ab-openapi-python-generator"
3
- version = "2.2.0"
3
+ version = "2.2.1"
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)
@@ -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."""