pyopenapi-gen 0.8.7__py3-none-any.whl → 0.9.0__py3-none-any.whl
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.
- pyopenapi_gen/__init__.py +2 -2
- pyopenapi_gen/context/CLAUDE.md +284 -0
- pyopenapi_gen/context/import_collector.py +8 -8
- pyopenapi_gen/core/CLAUDE.md +224 -0
- pyopenapi_gen/core/loader/operations/parser.py +1 -1
- pyopenapi_gen/core/parsing/cycle_helpers.py +1 -1
- pyopenapi_gen/core/parsing/keywords/properties_parser.py +4 -4
- pyopenapi_gen/core/parsing/schema_parser.py +4 -4
- pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py +1 -1
- pyopenapi_gen/core/writers/python_construct_renderer.py +2 -2
- pyopenapi_gen/emitters/CLAUDE.md +286 -0
- pyopenapi_gen/emitters/endpoints_emitter.py +1 -1
- pyopenapi_gen/generator/CLAUDE.md +352 -0
- pyopenapi_gen/helpers/CLAUDE.md +325 -0
- pyopenapi_gen/helpers/endpoint_utils.py +2 -2
- pyopenapi_gen/helpers/type_cleaner.py +1 -1
- pyopenapi_gen/helpers/type_resolution/composition_resolver.py +1 -1
- pyopenapi_gen/helpers/type_resolution/finalizer.py +1 -1
- pyopenapi_gen/types/CLAUDE.md +140 -0
- pyopenapi_gen/types/resolvers/schema_resolver.py +2 -2
- pyopenapi_gen/visit/CLAUDE.md +272 -0
- pyopenapi_gen/visit/endpoint/generators/docstring_generator.py +1 -1
- pyopenapi_gen/visit/endpoint/generators/signature_generator.py +1 -1
- pyopenapi_gen/visit/endpoint/processors/parameter_processor.py +1 -1
- {pyopenapi_gen-0.8.7.dist-info → pyopenapi_gen-0.9.0.dist-info}/METADATA +56 -40
- {pyopenapi_gen-0.8.7.dist-info → pyopenapi_gen-0.9.0.dist-info}/RECORD +49 -42
- {pyopenapi_gen-0.8.7.dist-info → pyopenapi_gen-0.9.0.dist-info}/WHEEL +1 -1
- pyopenapi_gen-0.9.0.dist-info/entry_points.txt +3 -0
- pyopenapi_gen-0.8.7.dist-info/entry_points.txt +0 -2
- {pyopenapi_gen-0.8.7.dist-info/licenses → pyopenapi_gen-0.9.0.dist-info}/LICENSE +0 -0
@@ -0,0 +1,272 @@
|
|
1
|
+
# visit/ - Code Generation Visitor Pattern
|
2
|
+
|
3
|
+
## Why This Folder?
|
4
|
+
Transform IR objects into Python code strings using visitor pattern. Each visitor specializes in generating one aspect of the client (models, endpoints, exceptions, etc.).
|
5
|
+
|
6
|
+
## Key Dependencies
|
7
|
+
- **Input**: `IRSpec`, `IRSchema`, `IROperation` from `../ir.py`
|
8
|
+
- **Output**: Python code strings for emitters
|
9
|
+
- **Services**: `UnifiedTypeService` from `../types/services/`
|
10
|
+
- **Context**: `RenderContext` from `../context/render_context.py`
|
11
|
+
|
12
|
+
## Essential Architecture
|
13
|
+
|
14
|
+
### 1. Visitor Pattern Hierarchy
|
15
|
+
```python
|
16
|
+
# visitor.py - Base visitor
|
17
|
+
class Visitor(Generic[tNode, tRet]):
|
18
|
+
def visit(self, node: tNode, context: RenderContext) -> tRet:
|
19
|
+
# Dispatch to specific visit methods
|
20
|
+
|
21
|
+
# Concrete visitors
|
22
|
+
class ModelVisitor(Visitor[IRSchema, str]):
|
23
|
+
def visit_schema(self, schema: IRSchema, context: RenderContext) -> str:
|
24
|
+
# Generate dataclass/enum code
|
25
|
+
```
|
26
|
+
|
27
|
+
### 2. Generators vs Visitors
|
28
|
+
- **Visitors**: High-level orchestration, traverse IR structure
|
29
|
+
- **Generators**: Low-level code generation, create specific code blocks
|
30
|
+
|
31
|
+
```python
|
32
|
+
# endpoint/endpoint_visitor.py
|
33
|
+
class EndpointVisitor:
|
34
|
+
def __init__(self):
|
35
|
+
self.signature_generator = SignatureGenerator()
|
36
|
+
self.request_generator = RequestGenerator()
|
37
|
+
self.response_generator = ResponseHandlerGenerator()
|
38
|
+
```
|
39
|
+
|
40
|
+
## Critical Components
|
41
|
+
|
42
|
+
### model/model_visitor.py
|
43
|
+
**Purpose**: Generate dataclass and enum code from schemas
|
44
|
+
```python
|
45
|
+
def visit_schema(self, schema: IRSchema, context: RenderContext) -> str:
|
46
|
+
if schema.enum:
|
47
|
+
return self.enum_generator.generate_enum(schema, context)
|
48
|
+
elif schema.type == "object":
|
49
|
+
return self.dataclass_generator.generate_dataclass(schema, context)
|
50
|
+
else:
|
51
|
+
return self.alias_generator.generate_alias(schema, context)
|
52
|
+
```
|
53
|
+
|
54
|
+
### endpoint/endpoint_visitor.py
|
55
|
+
**Purpose**: Generate async method code from operations
|
56
|
+
```python
|
57
|
+
def visit_operation(self, operation: IROperation, context: RenderContext) -> str:
|
58
|
+
# 1. Generate method signature
|
59
|
+
signature = self.signature_generator.generate(operation, context)
|
60
|
+
|
61
|
+
# 2. Generate request construction
|
62
|
+
request_code = self.request_generator.generate(operation, context)
|
63
|
+
|
64
|
+
# 3. Generate response handling
|
65
|
+
response_code = self.response_generator.generate(operation, context)
|
66
|
+
|
67
|
+
# 4. Combine into complete method
|
68
|
+
return self.combine_method_parts(signature, request_code, response_code)
|
69
|
+
```
|
70
|
+
|
71
|
+
### client_visitor.py
|
72
|
+
**Purpose**: Generate main client class with tag-grouped methods
|
73
|
+
```python
|
74
|
+
def visit_spec(self, spec: IRSpec, context: RenderContext) -> str:
|
75
|
+
# 1. Group operations by tag
|
76
|
+
operations_by_tag = self.group_operations_by_tag(spec.operations)
|
77
|
+
|
78
|
+
# 2. Generate client class
|
79
|
+
# 3. Generate tag-based property methods
|
80
|
+
# 4. Generate context manager methods
|
81
|
+
```
|
82
|
+
|
83
|
+
## Code Generation Patterns
|
84
|
+
|
85
|
+
### 1. Template-Based Generation
|
86
|
+
```python
|
87
|
+
# Use string templates for consistent formatting
|
88
|
+
METHOD_TEMPLATE = '''
|
89
|
+
async def {method_name}(self, {parameters}) -> {return_type}:
|
90
|
+
"""
|
91
|
+
{docstring}
|
92
|
+
"""
|
93
|
+
{body}
|
94
|
+
'''
|
95
|
+
|
96
|
+
# Fill template with generated content
|
97
|
+
method_code = METHOD_TEMPLATE.format(
|
98
|
+
method_name=operation.operation_id,
|
99
|
+
parameters=self.signature_generator.generate_parameters(operation),
|
100
|
+
return_type=self.get_return_type(operation),
|
101
|
+
docstring=self.docstring_generator.generate(operation),
|
102
|
+
body=self.generate_method_body(operation)
|
103
|
+
)
|
104
|
+
```
|
105
|
+
|
106
|
+
### 2. Type Resolution Integration
|
107
|
+
```python
|
108
|
+
# endpoint/generators/signature_generator.py
|
109
|
+
def generate_parameters(self, operation: IROperation, context: RenderContext) -> str:
|
110
|
+
params = []
|
111
|
+
for param in operation.parameters:
|
112
|
+
# Use unified type service for parameter types
|
113
|
+
param_type = self.type_service.resolve_schema_type(
|
114
|
+
param.schema, context, required=param.required
|
115
|
+
)
|
116
|
+
params.append(f"{param.name}: {param_type}")
|
117
|
+
return ", ".join(params)
|
118
|
+
```
|
119
|
+
|
120
|
+
### 3. Import Management
|
121
|
+
```python
|
122
|
+
# Always register imports when using complex types
|
123
|
+
def generate_dataclass(self, schema: IRSchema, context: RenderContext) -> str:
|
124
|
+
imports = []
|
125
|
+
|
126
|
+
for prop_name, prop_schema in schema.properties.items():
|
127
|
+
prop_type = self.type_service.resolve_schema_type(prop_schema, context)
|
128
|
+
|
129
|
+
# Type service handles import registration
|
130
|
+
# context.add_import() called internally
|
131
|
+
|
132
|
+
return dataclass_code
|
133
|
+
```
|
134
|
+
|
135
|
+
## Specialized Generators
|
136
|
+
|
137
|
+
### endpoint/generators/
|
138
|
+
**Purpose**: Generate specific parts of endpoint methods
|
139
|
+
|
140
|
+
#### docstring_generator.py
|
141
|
+
```python
|
142
|
+
def generate_docstring(self, operation: IROperation, context: RenderContext) -> str:
|
143
|
+
# Generate Google-style docstrings
|
144
|
+
# Include parameter descriptions
|
145
|
+
# Include return type information
|
146
|
+
# Include raises information
|
147
|
+
```
|
148
|
+
|
149
|
+
#### request_generator.py
|
150
|
+
```python
|
151
|
+
def generate_request_construction(self, operation: IROperation, context: RenderContext) -> str:
|
152
|
+
# Generate httpx.Request construction
|
153
|
+
# Handle query parameters, headers, body
|
154
|
+
# Apply authentication
|
155
|
+
```
|
156
|
+
|
157
|
+
#### response_handler_generator.py
|
158
|
+
```python
|
159
|
+
def generate_response_handling(self, operation: IROperation, context: RenderContext) -> str:
|
160
|
+
# Generate match/case for status codes
|
161
|
+
# Handle response deserialization
|
162
|
+
# Generate exception raising
|
163
|
+
```
|
164
|
+
|
165
|
+
## Dependencies on Other Systems
|
166
|
+
|
167
|
+
### From types/
|
168
|
+
- `UnifiedTypeService` for all type resolution
|
169
|
+
- Response unwrapping detection
|
170
|
+
- Forward reference handling
|
171
|
+
|
172
|
+
### From context/
|
173
|
+
- `RenderContext` for import management
|
174
|
+
- Template rendering utilities
|
175
|
+
- Path resolution
|
176
|
+
|
177
|
+
### To emitters/
|
178
|
+
- Visitors produce code strings
|
179
|
+
- Emitters organize code into files
|
180
|
+
|
181
|
+
## Testing Requirements
|
182
|
+
|
183
|
+
### Visitor Tests
|
184
|
+
```python
|
185
|
+
def test_model_visitor__dataclass_schema__generates_correct_code():
|
186
|
+
# Arrange
|
187
|
+
schema = IRSchema(type="object", properties={"name": {"type": "string"}})
|
188
|
+
context = RenderContext()
|
189
|
+
visitor = ModelVisitor()
|
190
|
+
|
191
|
+
# Act
|
192
|
+
code = visitor.visit_schema(schema, context)
|
193
|
+
|
194
|
+
# Assert
|
195
|
+
assert "@dataclass" in code
|
196
|
+
assert "name: str" in code
|
197
|
+
```
|
198
|
+
|
199
|
+
### Generator Tests
|
200
|
+
```python
|
201
|
+
def test_signature_generator__operation_with_params__generates_correct_signature():
|
202
|
+
# Test specific code generation components
|
203
|
+
operation = IROperation(parameters=[...])
|
204
|
+
generator = SignatureGenerator()
|
205
|
+
|
206
|
+
signature = generator.generate(operation, context)
|
207
|
+
|
208
|
+
# Verify parameter types, defaults, etc.
|
209
|
+
```
|
210
|
+
|
211
|
+
## Extension Points
|
212
|
+
|
213
|
+
### Adding New Visitors
|
214
|
+
```python
|
215
|
+
# Create new visitor for new code aspects
|
216
|
+
class CustomVisitor(Visitor[IRCustomNode, str]):
|
217
|
+
def visit_custom_node(self, node: IRCustomNode, context: RenderContext) -> str:
|
218
|
+
# Custom code generation logic
|
219
|
+
pass
|
220
|
+
```
|
221
|
+
|
222
|
+
### Adding New Generators
|
223
|
+
```python
|
224
|
+
# endpoint/generators/custom_generator.py
|
225
|
+
class CustomGenerator:
|
226
|
+
def __init__(self, type_service: UnifiedTypeService):
|
227
|
+
self.type_service = type_service
|
228
|
+
|
229
|
+
def generate(self, operation: IROperation, context: RenderContext) -> str:
|
230
|
+
# Custom code generation logic
|
231
|
+
pass
|
232
|
+
```
|
233
|
+
|
234
|
+
## Critical Implementation Details
|
235
|
+
|
236
|
+
### Error Handling in Visitors
|
237
|
+
```python
|
238
|
+
def visit_schema(self, schema: IRSchema, context: RenderContext) -> str:
|
239
|
+
try:
|
240
|
+
return self.generate_code(schema, context)
|
241
|
+
except Exception as e:
|
242
|
+
# Add context to errors
|
243
|
+
raise CodeGenerationError(f"Failed to generate code for schema {schema.name}: {e}")
|
244
|
+
```
|
245
|
+
|
246
|
+
### Context Management
|
247
|
+
```python
|
248
|
+
# Always use context for imports and state
|
249
|
+
def generate_method(self, operation: IROperation, context: RenderContext) -> str:
|
250
|
+
# Register imports
|
251
|
+
context.add_import("from typing import Optional")
|
252
|
+
|
253
|
+
# Use context for type resolution
|
254
|
+
return_type = self.type_service.resolve_operation_response_type(operation, context)
|
255
|
+
|
256
|
+
# Return code string
|
257
|
+
return method_code
|
258
|
+
```
|
259
|
+
|
260
|
+
### Code Formatting
|
261
|
+
```python
|
262
|
+
# Use consistent indentation and formatting
|
263
|
+
def format_method_body(self, lines: List[str]) -> str:
|
264
|
+
# Ensure proper indentation
|
265
|
+
formatted_lines = []
|
266
|
+
for line in lines:
|
267
|
+
if line.strip():
|
268
|
+
formatted_lines.append(f" {line}") # 4-space indent
|
269
|
+
else:
|
270
|
+
formatted_lines.append("")
|
271
|
+
return "\n".join(formatted_lines)
|
272
|
+
```
|
@@ -99,7 +99,7 @@ class EndpointDocstringGenerator:
|
|
99
99
|
for resp in error_codes:
|
100
100
|
# Using a generic HTTPError, specific error classes could be mapped later
|
101
101
|
code_to_raise = "HTTPError"
|
102
|
-
desc = f"{resp.status_code}: {resp.description.strip() if resp.description else
|
102
|
+
desc = f"{resp.status_code}: {resp.description.strip() if resp.description else 'HTTP error.'}"
|
103
103
|
raises.append((code_to_raise, desc))
|
104
104
|
else:
|
105
105
|
raises.append(("HTTPError", "If the server returns a non-2xx HTTP response."))
|
@@ -66,7 +66,7 @@ class EndpointMethodSignatureGenerator:
|
|
66
66
|
args = ["self"]
|
67
67
|
for p_orig in ordered_params:
|
68
68
|
p = p_orig.copy() # Work with a copy
|
69
|
-
arg_str = f"{NameSanitizer.sanitize_method_name(p[
|
69
|
+
arg_str = f"{NameSanitizer.sanitize_method_name(p['name'])}: {p['type']}" # Ensure param name is sanitized
|
70
70
|
if not p.get("required", False):
|
71
71
|
# Default value handling: if default is None, it should be ' = None'
|
72
72
|
# If default is a string, it should be ' = "default_value"'
|
@@ -123,7 +123,7 @@ class EndpointParameterProcessor:
|
|
123
123
|
param_details_map[body_specific_param_info["name"]] = body_specific_param_info
|
124
124
|
else:
|
125
125
|
logger.warning(
|
126
|
-
f"Request body parameter name '{body_specific_param_info[
|
126
|
+
f"Request body parameter name '{body_specific_param_info['name']}' "
|
127
127
|
f"for operation '{op.operation_id}'"
|
128
128
|
f"collides with an existing path/query/header parameter. Check OpenAPI spec."
|
129
129
|
)
|
@@ -1,19 +1,14 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.3
|
2
2
|
Name: pyopenapi-gen
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.9.0
|
4
4
|
Summary: Modern, async-first Python client generator for OpenAPI specifications with advanced cycle detection and unified type resolution
|
5
|
-
Project-URL: Homepage, https://github.com/your-org/pyopenapi-gen
|
6
|
-
Project-URL: Documentation, https://github.com/your-org/pyopenapi-gen/blob/main/README.md
|
7
|
-
Project-URL: Repository, https://github.com/your-org/pyopenapi-gen
|
8
|
-
Project-URL: Issues, https://github.com/your-org/pyopenapi-gen/issues
|
9
|
-
Project-URL: Changelog, https://github.com/your-org/pyopenapi-gen/blob/main/CHANGELOG.md
|
10
|
-
Project-URL: Bug Reports, https://github.com/your-org/pyopenapi-gen/issues
|
11
|
-
Project-URL: Source Code, https://github.com/your-org/pyopenapi-gen
|
12
|
-
Author-email: Mindhive Oy <contact@mindhive.fi>
|
13
|
-
Maintainer-email: Ville Venäläinen | Mindhive Oy <ville@mindhive.fi>
|
14
5
|
License: MIT
|
15
|
-
|
16
|
-
|
6
|
+
Keywords: openapi,swagger,client,generator,async,python,api,http,rest,type-safe,code-generation,enterprise
|
7
|
+
Author: Mindhive Oy
|
8
|
+
Author-email: contact@mindhive.fi
|
9
|
+
Maintainer: Ville Venäläinen | Mindhive Oy
|
10
|
+
Maintainer-email: ville@mindhive.fi
|
11
|
+
Requires-Python: >=3.12,<4.0.0
|
17
12
|
Classifier: Development Status :: 4 - Beta
|
18
13
|
Classifier: Environment :: Console
|
19
14
|
Classifier: Framework :: AsyncIO
|
@@ -21,39 +16,45 @@ Classifier: Intended Audience :: Developers
|
|
21
16
|
Classifier: License :: OSI Approved :: MIT License
|
22
17
|
Classifier: Natural Language :: English
|
23
18
|
Classifier: Operating System :: MacOS
|
24
|
-
Classifier: Operating System :: Microsoft :: Windows
|
25
19
|
Classifier: Operating System :: POSIX :: Linux
|
20
|
+
Classifier: Operating System :: Microsoft :: Windows
|
26
21
|
Classifier: Programming Language :: Python :: 3
|
27
|
-
Classifier: Programming Language :: Python :: 3 :: Only
|
28
22
|
Classifier: Programming Language :: Python :: 3.12
|
23
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
29
24
|
Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
|
30
25
|
Classifier: Topic :: Software Development :: Code Generators
|
31
26
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
32
27
|
Classifier: Topic :: System :: Networking
|
33
28
|
Classifier: Typing :: Typed
|
34
|
-
Requires-Python: <4.0.0,>=3.12
|
35
|
-
Requires-Dist: click<9.0.0,>=8.0.0
|
36
|
-
Requires-Dist: dataclass-wizard>=0.22.0
|
37
|
-
Requires-Dist: httpx>=0.24.0
|
38
|
-
Requires-Dist: openapi-core>=0.19
|
39
|
-
Requires-Dist: openapi-spec-validator>=0.7
|
40
|
-
Requires-Dist: pyyaml>=6.0
|
41
|
-
Requires-Dist: typer<0.14.0,>=0.12.0
|
42
29
|
Provides-Extra: dev
|
43
|
-
Requires-Dist:
|
44
|
-
Requires-Dist:
|
45
|
-
Requires-Dist:
|
46
|
-
Requires-Dist:
|
47
|
-
Requires-Dist:
|
48
|
-
Requires-Dist:
|
49
|
-
Requires-Dist:
|
50
|
-
Requires-Dist:
|
51
|
-
Requires-Dist:
|
52
|
-
Requires-Dist:
|
53
|
-
Requires-Dist:
|
54
|
-
Requires-Dist:
|
55
|
-
Requires-Dist:
|
56
|
-
Requires-Dist:
|
30
|
+
Requires-Dist: PyYAML (>=6.0)
|
31
|
+
Requires-Dist: bandit[toml] (>=1.7.0) ; extra == "dev"
|
32
|
+
Requires-Dist: black (>=23.0) ; extra == "dev"
|
33
|
+
Requires-Dist: click (>=8.0.0,<9.0.0)
|
34
|
+
Requires-Dist: dataclass-wizard (>=0.22.0)
|
35
|
+
Requires-Dist: dataclass-wizard (>=0.22.0) ; extra == "dev"
|
36
|
+
Requires-Dist: httpx (>=0.24.0)
|
37
|
+
Requires-Dist: httpx (>=0.24.0) ; extra == "dev"
|
38
|
+
Requires-Dist: mypy (>=1.7) ; extra == "dev"
|
39
|
+
Requires-Dist: openapi-core (>=0.19)
|
40
|
+
Requires-Dist: openapi-spec-validator (>=0.7)
|
41
|
+
Requires-Dist: pytest (>=7.0) ; extra == "dev"
|
42
|
+
Requires-Dist: pytest-asyncio (>=0.20.0) ; extra == "dev"
|
43
|
+
Requires-Dist: pytest-cov (>=4.0) ; extra == "dev"
|
44
|
+
Requires-Dist: pytest-timeout (>=2.1.0) ; extra == "dev"
|
45
|
+
Requires-Dist: pytest-xdist (>=3.0.0) ; extra == "dev"
|
46
|
+
Requires-Dist: ruff (>=0.4) ; extra == "dev"
|
47
|
+
Requires-Dist: safety (>=2.0.0) ; extra == "dev"
|
48
|
+
Requires-Dist: typer (>=0.12.0,<0.14.0)
|
49
|
+
Requires-Dist: types-pyyaml (>=6.0.12) ; extra == "dev"
|
50
|
+
Requires-Dist: types-toml (>=0.10.8) ; extra == "dev"
|
51
|
+
Project-URL: Bug Reports, https://github.com/your-org/pyopenapi-gen/issues
|
52
|
+
Project-URL: Changelog, https://github.com/your-org/pyopenapi-gen/blob/main/CHANGELOG.md
|
53
|
+
Project-URL: Documentation, https://github.com/your-org/pyopenapi-gen/blob/main/README.md
|
54
|
+
Project-URL: Homepage, https://github.com/your-org/pyopenapi-gen
|
55
|
+
Project-URL: Issues, https://github.com/your-org/pyopenapi-gen/issues
|
56
|
+
Project-URL: Repository, https://github.com/your-org/pyopenapi-gen
|
57
|
+
Project-URL: Source Code, https://github.com/your-org/pyopenapi-gen
|
57
58
|
Description-Content-Type: text/markdown
|
58
59
|
|
59
60
|
# PyOpenAPI Generator
|
@@ -99,7 +100,7 @@ poetry add pyopenapi-gen
|
|
99
100
|
|
100
101
|
### 1. Generate Your First Client
|
101
102
|
```bash
|
102
|
-
pyopenapi-gen
|
103
|
+
pyopenapi-gen openapi.yaml \
|
103
104
|
--project-root . \
|
104
105
|
--output-package my_api_client
|
105
106
|
```
|
@@ -127,7 +128,7 @@ asyncio.run(main())
|
|
127
128
|
|
128
129
|
### Standalone Client (Default)
|
129
130
|
```bash
|
130
|
-
pyopenapi-gen
|
131
|
+
pyopenapi-gen openapi.yaml \
|
131
132
|
--project-root . \
|
132
133
|
--output-package my_api_client
|
133
134
|
```
|
@@ -135,7 +136,7 @@ Creates self-contained client with embedded core dependencies.
|
|
135
136
|
|
136
137
|
### Shared Core (Multiple Clients)
|
137
138
|
```bash
|
138
|
-
pyopenapi-gen
|
139
|
+
pyopenapi-gen openapi.yaml \
|
139
140
|
--project-root . \
|
140
141
|
--output-package clients.api_client \
|
141
142
|
--core-package clients.core
|
@@ -358,6 +359,20 @@ make typecheck # Type checking with mypy
|
|
358
359
|
make security # Security scanning with Bandit
|
359
360
|
```
|
360
361
|
|
362
|
+
### Release Process
|
363
|
+
The project uses **automated semantic versioning** with conventional commits:
|
364
|
+
|
365
|
+
```bash
|
366
|
+
# Conventional commit format triggers automatic releases
|
367
|
+
git commit -m "feat(auth): add OAuth2 support" # → Minor version bump
|
368
|
+
git commit -m "fix(parser): resolve memory leak" # → Patch version bump
|
369
|
+
|
370
|
+
# Push to main triggers automatic PyPI release
|
371
|
+
git push origin main
|
372
|
+
```
|
373
|
+
|
374
|
+
All releases are automatically published to PyPI with generated changelogs. See [Release Management](CLAUDE.md#release-management--semantic-versioning) for complete details.
|
375
|
+
|
361
376
|
See our [Contributing Guide](CONTRIBUTING.md) for detailed information on:
|
362
377
|
- 📋 Development setup and workflow
|
363
378
|
- 🧪 Testing guidelines and standards
|
@@ -381,3 +396,4 @@ Generated clients are self-contained and can be distributed under any license co
|
|
381
396
|
---
|
382
397
|
|
383
398
|
**Made with ❤️ for the Python community**
|
399
|
+
|
@@ -1,28 +1,20 @@
|
|
1
|
-
pyopenapi_gen/__init__.py,sha256=
|
1
|
+
pyopenapi_gen/__init__.py,sha256=9DJOZ8R4qQ3tHN0XxuSOK0PWXBtbpjaNEJAgzfUVTeE,3016
|
2
2
|
pyopenapi_gen/__main__.py,sha256=4-SCaCNhBd7rtyRK58uoDbdl93J0KhUeajP_b0CPpLE,110
|
3
3
|
pyopenapi_gen/cli.py,sha256=_ewksNDaA5st3TJJMZJWgCZdBGOQp__tkMVqr_6U3vs,2339
|
4
|
-
pyopenapi_gen/
|
5
|
-
pyopenapi_gen/ir.py,sha256=OWQk53_iVi9JZxVeKRjagF0nhw57skkNPd-4jDsyD7M,7354
|
6
|
-
pyopenapi_gen/py.typed,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
|
4
|
+
pyopenapi_gen/context/CLAUDE.md,sha256=eUPvSY2ADQK21i52bWfzyBcDPVvvepErMiQrq6ndwlU,9004
|
7
5
|
pyopenapi_gen/context/file_manager.py,sha256=vpbRByO5SH6COdjb6C-pXkdSIRu7QFqrXxi69VLKBnM,1691
|
8
|
-
pyopenapi_gen/context/import_collector.py,sha256=
|
6
|
+
pyopenapi_gen/context/import_collector.py,sha256=rnOgR5-GsHs_oS1iUVbOF3tagcH5namNWvp7k44kugw,15262
|
9
7
|
pyopenapi_gen/context/render_context.py,sha256=AS08ha9WVjgRUsM1LFPjMCgrsHbczHH7c60Z5PbojhY,30320
|
8
|
+
pyopenapi_gen/core/CLAUDE.md,sha256=bz48K-PSrhxCq5ScmiLiU9kfpVVzSWRKOA9RdKk_pbg,6482
|
10
9
|
pyopenapi_gen/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
|
-
pyopenapi_gen/core/exceptions.py,sha256=KemyLDXl8pBgzxxV6ZhsGi7WjwKGooKU6Idy63eC2ko,553
|
12
|
-
pyopenapi_gen/core/http_transport.py,sha256=77ZOTyl0_CLuDtSCOVDQoxHDQBnclJgz6f3Hs6cy7hY,9675
|
13
|
-
pyopenapi_gen/core/pagination.py,sha256=aeDOKo-Lu8mcSDqv0TlPXV9Ul-Nca76ZuKhQHKlsMUs,2301
|
14
|
-
pyopenapi_gen/core/postprocess_manager.py,sha256=ky27ijbq6zEo43aqe-odz9CR3vFD_3XHhQR35XgMZo0,6879
|
15
|
-
pyopenapi_gen/core/schemas.py,sha256=FOE2e1vIl0vif_C34AehVznJG2W1hampPtJEfL80AxI,5535
|
16
|
-
pyopenapi_gen/core/streaming_helpers.py,sha256=XToNnm-EDAqiKh9ZS4GRxyastFkfSyNR0av-NDTZMPg,2706
|
17
|
-
pyopenapi_gen/core/telemetry.py,sha256=l6z972882MRzNOXU2leAvtnlYFLMSKKQ_oHz4qU5_n0,2225
|
18
|
-
pyopenapi_gen/core/utils.py,sha256=-J4lWP_X5jvPTYWkMvgIw4KGt6IKw29eHUAb_C89na4,14163
|
19
|
-
pyopenapi_gen/core/warning_collector.py,sha256=DYl9D7eZYs04mDU84KeonS-5-d0aM7hNqraXTex31ss,2799
|
20
10
|
pyopenapi_gen/core/auth/base.py,sha256=E2KUerA_mYv9D7xulUm-lenIxqZHqanjA4oRKpof2ZE,792
|
21
11
|
pyopenapi_gen/core/auth/plugins.py,sha256=bDWx4MTRFsCKp1i__BsQtZEvQPGU-NKI137-zoxmrgs,3465
|
12
|
+
pyopenapi_gen/core/exceptions.py,sha256=KemyLDXl8pBgzxxV6ZhsGi7WjwKGooKU6Idy63eC2ko,553
|
13
|
+
pyopenapi_gen/core/http_transport.py,sha256=77ZOTyl0_CLuDtSCOVDQoxHDQBnclJgz6f3Hs6cy7hY,9675
|
22
14
|
pyopenapi_gen/core/loader/__init__.py,sha256=bt-MQ35fbq-f1YnCcopPg53TuXCI9_7wcMzQZoWVpjU,391
|
23
15
|
pyopenapi_gen/core/loader/loader.py,sha256=bogAgDr2XvJWmMAFE006b3K_5AmC8eg2uj_TpYtLAfg,5591
|
24
16
|
pyopenapi_gen/core/loader/operations/__init__.py,sha256=7se21D-BOy7Qw6C9auJ9v6D3NCuRiDpRlhqxGq11fJs,366
|
25
|
-
pyopenapi_gen/core/loader/operations/parser.py,sha256=
|
17
|
+
pyopenapi_gen/core/loader/operations/parser.py,sha256=ai5iZZA2nicouC77iEvo8jKGXbHKbX_NcTy44lkwOVQ,6896
|
26
18
|
pyopenapi_gen/core/loader/operations/post_processor.py,sha256=3FZ5o59J2bSpZP-tNIec0A2hw095cC27GKqkhGrgHZA,2437
|
27
19
|
pyopenapi_gen/core/loader/operations/request_body.py,sha256=qz-wh014ejb1SGTuVRNODSXc95_iOLAjw05aDRhbXoo,3099
|
28
20
|
pyopenapi_gen/core/loader/parameters/__init__.py,sha256=p13oSibCRC5RCfsP6w7yD9MYs5TXcdI4WwPv7oGUYKk,284
|
@@ -31,16 +23,10 @@ pyopenapi_gen/core/loader/responses/__init__.py,sha256=6APWoH3IdNkgVmI0KsgZoZ6kn
|
|
31
23
|
pyopenapi_gen/core/loader/responses/parser.py,sha256=T0QXH_3c-Y6_S6DvveKHPfV_tID7qhBoX0nFtdLCa0A,3896
|
32
24
|
pyopenapi_gen/core/loader/schemas/__init__.py,sha256=rlhujYfw_IzWgzhVhYMJ3eIhE6C5Vi1Ylba-BHEVqOg,296
|
33
25
|
pyopenapi_gen/core/loader/schemas/extractor.py,sha256=7-lpDhs9W9wVhG1OCASdyft_V1kUH7NdP8D4x-raGjk,8364
|
26
|
+
pyopenapi_gen/core/pagination.py,sha256=aeDOKo-Lu8mcSDqv0TlPXV9Ul-Nca76ZuKhQHKlsMUs,2301
|
34
27
|
pyopenapi_gen/core/parsing/__init__.py,sha256=RJsIR6cHaNoI4tBcpMlAa0JsY64vsHb9sPxPg6rd8FQ,486
|
35
|
-
pyopenapi_gen/core/parsing/context.py,sha256=crn5oTkzEvnSzYdPuHBA_s72kmq0RKzXpyaqNh67k68,7947
|
36
|
-
pyopenapi_gen/core/parsing/cycle_helpers.py,sha256=SOviksYKXme5u7ULMXZNcTHSEPF6_Rs3nRbTuuNWVVs,5939
|
37
|
-
pyopenapi_gen/core/parsing/schema_finalizer.py,sha256=fsyuOenLJA3TndzYVETqKkSlo2Qz3TsD1YDtlbyOATQ,6839
|
38
|
-
pyopenapi_gen/core/parsing/schema_parser.py,sha256=kbh4YTSv9KVxyl4yR8EdOa-oLyE1QbOZWoP5liMC-8A,30502
|
39
|
-
pyopenapi_gen/core/parsing/unified_cycle_detection.py,sha256=3nplaCVh2dFwBPbmDc2kiU0SzTPXXktdQ5Rc0Q9Uu9s,10873
|
40
28
|
pyopenapi_gen/core/parsing/common/__init__.py,sha256=U3sHMO-l6S3Cm04CVOYmBCpqLEZvCylUI7yQfcTwxYU,27
|
41
|
-
pyopenapi_gen/core/parsing/common/type_parser.py,sha256=cK7xtxhoD43K2WjLP9TGip3As3akYeYW7L2XztXCecg,2562
|
42
29
|
pyopenapi_gen/core/parsing/common/ref_resolution/__init__.py,sha256=BZOSPQo8bongKYgA4w-KGNBCjfNKoe1mm91CrqNIaTk,150
|
43
|
-
pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py,sha256=y2RBVA0Kk1Vd23NBnKRdggn0tYADbTfaW3v0Ji5K5aE,3636
|
44
30
|
pyopenapi_gen/core/parsing/common/ref_resolution/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
45
31
|
pyopenapi_gen/core/parsing/common/ref_resolution/helpers/cyclic_properties.py,sha256=tsHnIdyznAxXz_yA9Ub1ONxi2GSYcVJwKogBkTm95jU,2160
|
46
32
|
pyopenapi_gen/core/parsing/common/ref_resolution/helpers/direct_cycle.py,sha256=UoqD9I7s-WwI50PlgwFmLhFQd3ai8YIJycfkQhq6QlI,1145
|
@@ -49,41 +35,61 @@ pyopenapi_gen/core/parsing/common/ref_resolution/helpers/list_response.py,sha256
|
|
49
35
|
pyopenapi_gen/core/parsing/common/ref_resolution/helpers/missing_ref.py,sha256=BsyO6eCNO9NDRmj-aWyQZ4DaXsqRtkc7KdIzUEyNKQ4,1843
|
50
36
|
pyopenapi_gen/core/parsing/common/ref_resolution/helpers/new_schema.py,sha256=MTaxiyqoPEaNFqF7tQHii3IH41M05wPKt6lBQi1SCDU,1625
|
51
37
|
pyopenapi_gen/core/parsing/common/ref_resolution/helpers/stripped_suffix.py,sha256=ukKU64ozHINPiVlHE9YBDz1Nq2i6Xh64jhoWSEqbK5c,1774
|
38
|
+
pyopenapi_gen/core/parsing/common/ref_resolution/resolve_schema_ref.py,sha256=y2RBVA0Kk1Vd23NBnKRdggn0tYADbTfaW3v0Ji5K5aE,3636
|
39
|
+
pyopenapi_gen/core/parsing/common/type_parser.py,sha256=cK7xtxhoD43K2WjLP9TGip3As3akYeYW7L2XztXCecg,2562
|
40
|
+
pyopenapi_gen/core/parsing/context.py,sha256=crn5oTkzEvnSzYdPuHBA_s72kmq0RKzXpyaqNh67k68,7947
|
41
|
+
pyopenapi_gen/core/parsing/cycle_helpers.py,sha256=nG5ysNavL_6lpnHWFUZR9qraBxqOzuNfI6NgSEa8a5M,5939
|
52
42
|
pyopenapi_gen/core/parsing/keywords/__init__.py,sha256=enTLacWXGXLIOjSJ3j7KNUDzU27Kq3Ww79sFElz02cM,27
|
53
43
|
pyopenapi_gen/core/parsing/keywords/all_of_parser.py,sha256=s0aav49R4LYAwfEimWa0ZuFwbNWkYpRAJmcmSVDsO-s,3594
|
54
44
|
pyopenapi_gen/core/parsing/keywords/any_of_parser.py,sha256=r9_0opPM75p0rPgdcRTBmae7Td3jPkJouuL_ksuFWtM,2856
|
55
45
|
pyopenapi_gen/core/parsing/keywords/array_items_parser.py,sha256=dIb3_VsEkqsR9W4rwXoTT9IW313TnH66sQzJL4K7EQQ,2645
|
56
46
|
pyopenapi_gen/core/parsing/keywords/one_of_parser.py,sha256=82SUPd0hk0QF4-hMr0QJmRSFa9nnJL8ncYmvgkIKKXs,2601
|
57
|
-
pyopenapi_gen/core/parsing/keywords/properties_parser.py,sha256=
|
47
|
+
pyopenapi_gen/core/parsing/keywords/properties_parser.py,sha256=bm248ApsNskFPQF4fXq7mT5oJf6FF9yAcdVLmK6el3E,4426
|
48
|
+
pyopenapi_gen/core/parsing/schema_finalizer.py,sha256=fsyuOenLJA3TndzYVETqKkSlo2Qz3TsD1YDtlbyOATQ,6839
|
49
|
+
pyopenapi_gen/core/parsing/schema_parser.py,sha256=qFdan2djgdRBtzVCLiDBooVqXgcuWy_JbzDGLTJpPeE,30502
|
58
50
|
pyopenapi_gen/core/parsing/transformers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
59
|
-
pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py,sha256=
|
51
|
+
pyopenapi_gen/core/parsing/transformers/inline_enum_extractor.py,sha256=hXuht-t0Syi5vPO8qn9GcjEpyDcZnfFVHVIlwfMa8L0,13461
|
60
52
|
pyopenapi_gen/core/parsing/transformers/inline_object_promoter.py,sha256=4njv5raMVtspL6DoU9mxabU3yhgXHLTEhR8KmI9YMoA,5083
|
53
|
+
pyopenapi_gen/core/parsing/unified_cycle_detection.py,sha256=3nplaCVh2dFwBPbmDc2kiU0SzTPXXktdQ5Rc0Q9Uu9s,10873
|
54
|
+
pyopenapi_gen/core/postprocess_manager.py,sha256=ky27ijbq6zEo43aqe-odz9CR3vFD_3XHhQR35XgMZo0,6879
|
55
|
+
pyopenapi_gen/core/schemas.py,sha256=FOE2e1vIl0vif_C34AehVznJG2W1hampPtJEfL80AxI,5535
|
56
|
+
pyopenapi_gen/core/streaming_helpers.py,sha256=XToNnm-EDAqiKh9ZS4GRxyastFkfSyNR0av-NDTZMPg,2706
|
57
|
+
pyopenapi_gen/core/telemetry.py,sha256=l6z972882MRzNOXU2leAvtnlYFLMSKKQ_oHz4qU5_n0,2225
|
58
|
+
pyopenapi_gen/core/utils.py,sha256=-J4lWP_X5jvPTYWkMvgIw4KGt6IKw29eHUAb_C89na4,14163
|
59
|
+
pyopenapi_gen/core/warning_collector.py,sha256=DYl9D7eZYs04mDU84KeonS-5-d0aM7hNqraXTex31ss,2799
|
61
60
|
pyopenapi_gen/core/writers/code_writer.py,sha256=uWH5tRFIdT3RHsRV1haWQxESwhwMoM2G_CxnKB8uP88,4776
|
62
61
|
pyopenapi_gen/core/writers/documentation_writer.py,sha256=Vce-_kD4XDm3HfZb_ibSEKAu2fbTZCzzdojn9TPgFhU,8706
|
63
62
|
pyopenapi_gen/core/writers/line_writer.py,sha256=uhysxO6bh_9POUQHhoqYI4_savfAgjH4EcwBdNrVtPc,7759
|
64
|
-
pyopenapi_gen/core/writers/python_construct_renderer.py,sha256=
|
63
|
+
pyopenapi_gen/core/writers/python_construct_renderer.py,sha256=H2-dbUoc0wgI5Ll2OiRIRkfaDVBG_rFB4j44NXvF7Fk,12602
|
65
64
|
pyopenapi_gen/core_package_template/README.md,sha256=8YP-MS0KxphRbCGBf7kV3dYIFLU9piOJ3IMm3K_0hcI,1488
|
66
65
|
pyopenapi_gen/emit/models_emitter.py,sha256=Ty5yHGzvBDYa_qQwbyPNRLWPnHaWR_KLh6pYxT7uePY,7193
|
66
|
+
pyopenapi_gen/emitters/CLAUDE.md,sha256=iZYEZq1a1h033rxuh97cMpsKUElv72ysvTm3-QQUvrs,9323
|
67
67
|
pyopenapi_gen/emitters/client_emitter.py,sha256=kmMVnG-wAOJm7TUm0xOQ5YnSJfYxz1SwtpiyoUCbcCA,1939
|
68
68
|
pyopenapi_gen/emitters/core_emitter.py,sha256=RcBsAYQ3ZKcWwtkzQmyHkL7VtDQjbIObFLXD9M_GdpI,8020
|
69
69
|
pyopenapi_gen/emitters/docs_emitter.py,sha256=aouKqhRdtVvYfGVsye_uqM80nONRy0SqN06cr1l3OgA,1137
|
70
|
-
pyopenapi_gen/emitters/endpoints_emitter.py,sha256=
|
70
|
+
pyopenapi_gen/emitters/endpoints_emitter.py,sha256=2VuJJF0hpzyN-TqY9XVLQtTJ-QgedZe5Vj8ITBGsJYE,9558
|
71
71
|
pyopenapi_gen/emitters/exceptions_emitter.py,sha256=qPTIPXDyqSUtpmBIp-V4ap1uMHUPmYziCSN62t7qcAE,1918
|
72
72
|
pyopenapi_gen/emitters/models_emitter.py,sha256=I3IKwtKVocD3UVrI7cINXI8NjLwUZqHuGgvS3hjWUJ8,22192
|
73
|
+
pyopenapi_gen/generator/CLAUDE.md,sha256=BS9KkmLvk2WD-Io-_apoWjGNeMU4q4LKy4UOxYF9WxM,10870
|
73
74
|
pyopenapi_gen/generator/client_generator.py,sha256=avYz5GCp7t6vRAFJCvXw0ipLQGX2QfgWtfOwr3QlOqY,28880
|
75
|
+
pyopenapi_gen/helpers/CLAUDE.md,sha256=GyIJ0grp4SkD3plAUzyycW4nTUZf9ewtvvsdAGkmIZw,10609
|
74
76
|
pyopenapi_gen/helpers/__init__.py,sha256=m4jSQ1sDH6CesIcqIl_kox4LcDFabGxBpSIWVwbHK0M,39
|
75
|
-
pyopenapi_gen/helpers/endpoint_utils.py,sha256=
|
76
|
-
pyopenapi_gen/helpers/type_cleaner.py,sha256=
|
77
|
+
pyopenapi_gen/helpers/endpoint_utils.py,sha256=bkRu6YddIPQQD3rZLbB8L5WYzG-2Bd_JgMbxMUYY2wY,22198
|
78
|
+
pyopenapi_gen/helpers/type_cleaner.py,sha256=PRBqeEUPyEKHwedB4RZPrEDxUJ6q_h5ANains0WHIwg,13613
|
77
79
|
pyopenapi_gen/helpers/type_helper.py,sha256=uWLmJ25FHnqPf0-Pqakk4-lJ4xr5VBOF6gQP26KBAms,4276
|
78
|
-
pyopenapi_gen/helpers/url_utils.py,sha256=IflBiOcCzLrOvC5P25y12pk88Zu3X071hq4bCeDDxK0,340
|
79
80
|
pyopenapi_gen/helpers/type_resolution/__init__.py,sha256=TbaQZp7jvBiYgmuzuG8Wp56xZq32xEKtpunHqZVG1VA,85
|
80
81
|
pyopenapi_gen/helpers/type_resolution/array_resolver.py,sha256=dFppBtA6CxmiWAMR6rwGnQPv4AibL3nxtzw1LbeXVn4,2023
|
81
|
-
pyopenapi_gen/helpers/type_resolution/composition_resolver.py,sha256=
|
82
|
-
pyopenapi_gen/helpers/type_resolution/finalizer.py,sha256=
|
82
|
+
pyopenapi_gen/helpers/type_resolution/composition_resolver.py,sha256=wq6CRGxGgOKK470ln5Tpk9SzHtMuwB22TXHsRLtUFyw,3015
|
83
|
+
pyopenapi_gen/helpers/type_resolution/finalizer.py,sha256=_BcOBmOvadhBTUAvIc0Ak8FNxFw1uYL4rkKWtU68_m4,4332
|
83
84
|
pyopenapi_gen/helpers/type_resolution/named_resolver.py,sha256=akHVthcD7cp9lHI-TCeABMacwQ2Z1gGp8zMGNsI_b5A,9403
|
84
85
|
pyopenapi_gen/helpers/type_resolution/object_resolver.py,sha256=jayEjBr4evzIVMMAPc7g_gKb6BShFbAXG1oHMgskOcI,12373
|
85
86
|
pyopenapi_gen/helpers/type_resolution/primitive_resolver.py,sha256=qTshZaye5ohibVfcJYCzh4v3CAshguMGWPt2FgvQeNM,1960
|
86
87
|
pyopenapi_gen/helpers/type_resolution/resolver.py,sha256=qQY6wAitBluA-tofiyJ67Gxx8ol1W528zDWd9izYN5s,1982
|
88
|
+
pyopenapi_gen/helpers/url_utils.py,sha256=IflBiOcCzLrOvC5P25y12pk88Zu3X071hq4bCeDDxK0,340
|
89
|
+
pyopenapi_gen/http_types.py,sha256=EMMYZBt8PNVZKPFu77TQija-JI-nOKyXvpiQP9-VSWE,467
|
90
|
+
pyopenapi_gen/ir.py,sha256=OWQk53_iVi9JZxVeKRjagF0nhw57skkNPd-4jDsyD7M,7354
|
91
|
+
pyopenapi_gen/py.typed,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
|
92
|
+
pyopenapi_gen/types/CLAUDE.md,sha256=xRYlHdLhw3QGIfIlWqPt9pewRs736H1YCzwmslKtzZc,4255
|
87
93
|
pyopenapi_gen/types/__init__.py,sha256=Tv4xouOXp1CeOcnhDdh_wWF9PBHAeZmCeVPSm71kouI,359
|
88
94
|
pyopenapi_gen/types/contracts/__init__.py,sha256=qf5kJbbZ8TuH79UQSHBvjE1odKfNJrt5NrBEmurFlSU,358
|
89
95
|
pyopenapi_gen/types/contracts/protocols.py,sha256=eyjsrvHQv1viNON9itrHO5TA-PtWUZERdK3aPO_3uXM,2887
|
@@ -91,34 +97,35 @@ pyopenapi_gen/types/contracts/types.py,sha256=-Qvbx3N_14AaN-1BeyocrvsjiwXPn_eWQh
|
|
91
97
|
pyopenapi_gen/types/resolvers/__init__.py,sha256=_5kA49RvyOTyXgt0GbbOfHJcdQw2zHxvU9af8GGyNWc,295
|
92
98
|
pyopenapi_gen/types/resolvers/reference_resolver.py,sha256=qnaZeLmtyh4_NBMcKib58s6o5ycUJaattYt8F38_qIo,2053
|
93
99
|
pyopenapi_gen/types/resolvers/response_resolver.py,sha256=Kb1a2803lyoukoZy06ztPBlUw-A1lHiZ6NlJmsixxA8,6500
|
94
|
-
pyopenapi_gen/types/resolvers/schema_resolver.py,sha256=
|
100
|
+
pyopenapi_gen/types/resolvers/schema_resolver.py,sha256=R0N03MDLVzaFBQcrFOOTre1zqIg6APiWdHAT96ldgQ0,16898
|
95
101
|
pyopenapi_gen/types/services/__init__.py,sha256=inSUKmY_Vnuym6tC-AhvjCTj16GbkfxCGLESRr_uQPE,123
|
96
102
|
pyopenapi_gen/types/services/type_service.py,sha256=-LQj7oSx1mxb10Zi6DpawS8uyoUrUbnYhmUA0GuKZTc,4402
|
97
103
|
pyopenapi_gen/types/strategies/__init__.py,sha256=bju8_KEPNIow1-woMO-zJCgK_E0M6JnFq0NFsK1R4Ss,171
|
98
104
|
pyopenapi_gen/types/strategies/response_strategy.py,sha256=Y6E3O5xvCrJ2Y6IGn4BWlaGiQCC8Uk1a7BRJxfBkqrM,7387
|
105
|
+
pyopenapi_gen/visit/CLAUDE.md,sha256=Rq2e4S74TXv0ua2ZcCrO6cwCCccf3Yph44oVdj1yFPY,8297
|
99
106
|
pyopenapi_gen/visit/client_visitor.py,sha256=vpLCGF353XtBjfS7W69-1b1d79opTb1i6qBue6vSz5g,11152
|
100
107
|
pyopenapi_gen/visit/docs_visitor.py,sha256=hqgd4DAoy7T5Bap4mpH4R-nIZSyAWwFYmrIuNHM03Rg,1644
|
101
|
-
pyopenapi_gen/visit/exception_visitor.py,sha256=6gWkjEWMYM35_rBNCgB-xdE0RvYwbj49wytAorLHK9k,2097
|
102
|
-
pyopenapi_gen/visit/visitor.py,sha256=PANoV9zXMUrefr0pBLXIKkDOaTIjQ2hyL82cidVBCLU,3645
|
103
108
|
pyopenapi_gen/visit/endpoint/__init__.py,sha256=DftIZSWp6Z8jKWoJE2VGKL4G_5cqwFXe9v-PALMmsGk,73
|
104
109
|
pyopenapi_gen/visit/endpoint/endpoint_visitor.py,sha256=1aS0i2D_Y-979_7aBd0W6IS2UVO6wMujsMMw8Qt8PRE,3574
|
105
110
|
pyopenapi_gen/visit/endpoint/generators/__init__.py,sha256=-X-GYnJZ9twiEBr_U0obW8VuSoY6IJmYaxinn-seMzA,50
|
106
|
-
pyopenapi_gen/visit/endpoint/generators/docstring_generator.py,sha256=
|
111
|
+
pyopenapi_gen/visit/endpoint/generators/docstring_generator.py,sha256=U02qvuYtFElQNEtOHuTNXFl2NxUriIiuZMkmUsapOg4,5913
|
107
112
|
pyopenapi_gen/visit/endpoint/generators/endpoint_method_generator.py,sha256=wUJ4_gaA1gRrFCHYFCObBIankxGQu0MNqiOSoZOZmoA,4352
|
108
113
|
pyopenapi_gen/visit/endpoint/generators/request_generator.py,sha256=OnkrkRk39_BrK9ZDvyWqJYLz1mocD2zY7j70yIpS0J4,5374
|
109
114
|
pyopenapi_gen/visit/endpoint/generators/response_handler_generator.py,sha256=VuyYpUUQ3hIOwM0X_hrMk9qmQTC0P6xRQdC2HTTIyQw,22828
|
110
|
-
pyopenapi_gen/visit/endpoint/generators/signature_generator.py,sha256=
|
115
|
+
pyopenapi_gen/visit/endpoint/generators/signature_generator.py,sha256=VC9Q_exZMpUh46hn1JXaDRlgVm3Gb-D2v36h9SDF10k,4390
|
111
116
|
pyopenapi_gen/visit/endpoint/generators/url_args_generator.py,sha256=EsmNuVSkGfUqrmV7-1GiLPzdN86V5UqLfs1SVY0jsf0,9590
|
112
117
|
pyopenapi_gen/visit/endpoint/processors/__init__.py,sha256=_6RqpOdDuDheArqDBi3ykhsaetACny88WUuuAJvr_ME,29
|
113
118
|
pyopenapi_gen/visit/endpoint/processors/import_analyzer.py,sha256=tNmhgWwt-CjLE774TC8sPVH1-yaTKKm6JmfgBT2-iRk,3386
|
114
|
-
pyopenapi_gen/visit/endpoint/processors/parameter_processor.py,sha256=
|
119
|
+
pyopenapi_gen/visit/endpoint/processors/parameter_processor.py,sha256=BygP8yzSTrxfvNpEQIHERjd2NpEXDiwpCtmMseJKRq0,7700
|
120
|
+
pyopenapi_gen/visit/exception_visitor.py,sha256=6gWkjEWMYM35_rBNCgB-xdE0RvYwbj49wytAorLHK9k,2097
|
115
121
|
pyopenapi_gen/visit/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
116
122
|
pyopenapi_gen/visit/model/alias_generator.py,sha256=3iPFDjCXU0Vm59Hfp64jTDfHoUL8ouXTTfoEwiOVm4Q,3558
|
117
123
|
pyopenapi_gen/visit/model/dataclass_generator.py,sha256=WtcQNx6l2sxVyTlH1MdQ-UFYWVMsxQk5nyJr1Mk02iM,9999
|
118
124
|
pyopenapi_gen/visit/model/enum_generator.py,sha256=QWsD-IAxGOxKQuC6LLNUvbT8Ot3NWrLFsaYT0DI16DU,9670
|
119
125
|
pyopenapi_gen/visit/model/model_visitor.py,sha256=PZeQd7-dlxZf5gY10BW-DhswmAGF903NccV6L56mjoE,9439
|
120
|
-
pyopenapi_gen
|
121
|
-
pyopenapi_gen-0.
|
122
|
-
pyopenapi_gen-0.
|
123
|
-
pyopenapi_gen-0.
|
124
|
-
pyopenapi_gen-0.
|
126
|
+
pyopenapi_gen/visit/visitor.py,sha256=PANoV9zXMUrefr0pBLXIKkDOaTIjQ2hyL82cidVBCLU,3645
|
127
|
+
pyopenapi_gen-0.9.0.dist-info/LICENSE,sha256=UFAyTWKa4w10-QerlJaHJeep7G2gcwpf-JmvI2dS2Gc,1088
|
128
|
+
pyopenapi_gen-0.9.0.dist-info/METADATA,sha256=lEdvMAFw_H1a1rB4UWpJCbkODI-X1gugSlur1RyDiGY,14111
|
129
|
+
pyopenapi_gen-0.9.0.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
130
|
+
pyopenapi_gen-0.9.0.dist-info/entry_points.txt,sha256=yVJYlAQOD_pt6_tBmBPE9UiaSPiXtzzBDcS6lfKoKSo,55
|
131
|
+
pyopenapi_gen-0.9.0.dist-info/RECORD,,
|
File without changes
|