pydantic-openapi-generator 2.7.0__tar.gz → 2.9.0__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.
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/PKG-INFO +1 -1
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/pyproject.toml +1 -1
- pydantic_openapi_generator-2.9.0/src/pydantic_openapi_generator/config/custom_kwarg.py +63 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/generator_config.py +18 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/utils.py +12 -5
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/client_generator.py +53 -4
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/templates/async_client_httpx_pydantic_2.jinja2 +9 -4
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/templates/sync_client_httpx_pydantic_2.jinja2 +9 -4
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/models.py +9 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/.gitignore +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/LICENSE +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/README.md +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/__init__.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/__main__.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/common.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/__init__.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/base_parameter.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/class_var_parameter.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/function_parameter.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/kwarg_parameter.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/loader.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/parameter_source.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/parameter_union.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/generate_data.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/__init__.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/__init__.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/common.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/exception_generator.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/generator.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/jinja_config.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/model_generator.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/templates/alias_union.jinja2 +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/templates/discriminator_enum.jinja2 +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/templates/enum.jinja2 +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/templates/http_exception.jinja2 +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/templates/models.jinja2 +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/templates/models_pydantic_2.jinja2 +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/parsers/__init__.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/parsers/openapi_30.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/parsers/openapi_31.py +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/py.typed +0 -0
- {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/version_detector.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: pydantic-openapi-generator
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.9.0
|
|
4
4
|
Summary: Openapi Python Generator
|
|
5
5
|
Project-URL: Homepage, https://github.com/mattcoulter7/pydantic-openapi-generator
|
|
6
6
|
Project-URL: Repository, https://github.com/mattcoulter7/pydantic-openapi-generator
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from typing import Annotated, Literal, Optional, Union
|
|
2
|
+
|
|
3
|
+
from openapi_pydantic.v3.v3_0 import Reference as Reference30
|
|
4
|
+
from openapi_pydantic.v3.v3_0 import Schema as Schema30
|
|
5
|
+
from openapi_pydantic.v3.v3_1 import Reference as Reference31
|
|
6
|
+
from openapi_pydantic.v3.v3_1 import Schema as Schema31
|
|
7
|
+
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
|
8
|
+
|
|
9
|
+
from pydantic_openapi_generator.config.utils import literal_default, optional_type, schema_type_hint
|
|
10
|
+
from pydantic_openapi_generator.language_converters.python import common
|
|
11
|
+
from pydantic_openapi_generator.models import GeneratedCustomKwarg
|
|
12
|
+
|
|
13
|
+
SchemaDefinition = Union[Schema30, Schema31, Reference30, Reference31]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CustomKwargExistsCondition(BaseModel):
|
|
17
|
+
model_config = ConfigDict(extra="forbid")
|
|
18
|
+
|
|
19
|
+
type: Literal["exists"]
|
|
20
|
+
ref: str
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
CustomKwargCondition = Annotated[CustomKwargExistsCondition, Field(discriminator="type")]
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class CustomKwargConfiguration(BaseModel):
|
|
27
|
+
model_config = ConfigDict(extra="forbid", populate_by_name=True)
|
|
28
|
+
|
|
29
|
+
kwarg: str
|
|
30
|
+
required: bool = True
|
|
31
|
+
schema_: SchemaDefinition = Field(alias="schema")
|
|
32
|
+
condition: Optional[CustomKwargCondition] = None
|
|
33
|
+
|
|
34
|
+
@model_validator(mode="after")
|
|
35
|
+
def validate_supported_schema(self) -> "CustomKwargConfiguration":
|
|
36
|
+
if schema_type_hint(self.schema_, required=True) == "Any":
|
|
37
|
+
raise ValueError("custom_kwargs schema must define a supported OpenAPI schema")
|
|
38
|
+
|
|
39
|
+
return self
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def code_name(self) -> str:
|
|
43
|
+
return common.normalize_symbol(self.kwarg)
|
|
44
|
+
|
|
45
|
+
def resolve_custom_kwarg(self) -> GeneratedCustomKwarg:
|
|
46
|
+
default = literal_default(self.schema_)
|
|
47
|
+
|
|
48
|
+
if self.required:
|
|
49
|
+
type_hint = schema_type_hint(self.schema_, required=True)
|
|
50
|
+
rendered_default = None
|
|
51
|
+
elif default is not None:
|
|
52
|
+
type_hint = schema_type_hint(self.schema_, required=True)
|
|
53
|
+
rendered_default = default
|
|
54
|
+
else:
|
|
55
|
+
type_hint = optional_type(schema_type_hint(self.schema_, required=True))
|
|
56
|
+
rendered_default = "None"
|
|
57
|
+
|
|
58
|
+
return GeneratedCustomKwarg(
|
|
59
|
+
code_name=self.code_name,
|
|
60
|
+
type_hint=type_hint,
|
|
61
|
+
required=self.required,
|
|
62
|
+
default=rendered_default,
|
|
63
|
+
)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
|
2
2
|
|
|
3
3
|
from pydantic_openapi_generator.config.base_parameter import BaseArgumentConfiguration
|
|
4
|
+
from pydantic_openapi_generator.config.custom_kwarg import CustomKwargConfiguration
|
|
4
5
|
from pydantic_openapi_generator.config.kwarg_parameter import KwargArgumentConfiguration
|
|
5
6
|
from pydantic_openapi_generator.config.parameter_union import ArgumentConfiguration
|
|
6
7
|
|
|
@@ -9,6 +10,7 @@ class PydanticOpenAPIGeneratorConfig(BaseModel):
|
|
|
9
10
|
model_config = ConfigDict(extra="forbid")
|
|
10
11
|
|
|
11
12
|
parameters: list[ArgumentConfiguration] = Field(default_factory=list)
|
|
13
|
+
custom_kwargs: list[CustomKwargConfiguration] = Field(default_factory=list)
|
|
12
14
|
|
|
13
15
|
def parameter_configuration_for(self, parameter_name: str) -> BaseArgumentConfiguration:
|
|
14
16
|
configured = self.parameters_by_name().get(parameter_name)
|
|
@@ -31,3 +33,19 @@ class PydanticOpenAPIGeneratorConfig(BaseModel):
|
|
|
31
33
|
raise ValueError(f"Duplicate parameter configuration for: {duplicate_list}")
|
|
32
34
|
|
|
33
35
|
return self
|
|
36
|
+
|
|
37
|
+
@model_validator(mode="after")
|
|
38
|
+
def validate_unique_custom_kwarg_names(self) -> "PydanticOpenAPIGeneratorConfig":
|
|
39
|
+
names: set[str] = set()
|
|
40
|
+
duplicates: set[str] = set()
|
|
41
|
+
for custom_kwarg in self.custom_kwargs:
|
|
42
|
+
code_name = custom_kwarg.code_name
|
|
43
|
+
if code_name in names:
|
|
44
|
+
duplicates.add(code_name)
|
|
45
|
+
names.add(code_name)
|
|
46
|
+
|
|
47
|
+
if duplicates:
|
|
48
|
+
duplicate_list = ", ".join(sorted(duplicates))
|
|
49
|
+
raise ValueError(f"Duplicate custom kwarg configuration for: {duplicate_list}")
|
|
50
|
+
|
|
51
|
+
return self
|
|
@@ -14,6 +14,7 @@ from pydantic_openapi_generator.language_converters.python.model_generator impor
|
|
|
14
14
|
)
|
|
15
15
|
|
|
16
16
|
Parameter = Union[Parameter30, Parameter31]
|
|
17
|
+
SchemaDefinition = Union[Schema30, Schema31, Reference30, Reference31]
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
def lower_code_name(value: str) -> str:
|
|
@@ -34,14 +35,20 @@ def optional_type(type_hint: str) -> str:
|
|
|
34
35
|
|
|
35
36
|
|
|
36
37
|
def parameter_type_hint(param: Parameter, required: bool) -> str:
|
|
37
|
-
if isinstance(param.param_schema, (Schema30, Schema31)):
|
|
38
|
-
return
|
|
39
|
-
if isinstance(param.param_schema, (Reference30, Reference31)):
|
|
40
|
-
model_name = common.normalize_symbol(param.param_schema.ref.split("/")[-1])
|
|
41
|
-
return model_name if required else f"Optional[{model_name}]"
|
|
38
|
+
if isinstance(param.param_schema, (Schema30, Schema31, Reference30, Reference31)):
|
|
39
|
+
return schema_type_hint(param.param_schema, required=required)
|
|
42
40
|
return "Any"
|
|
43
41
|
|
|
44
42
|
|
|
43
|
+
def schema_type_hint(schema: SchemaDefinition, *, required: bool) -> str:
|
|
44
|
+
if isinstance(schema, (Schema30, Schema31)):
|
|
45
|
+
return type_converter(schema, required).converted_type
|
|
46
|
+
if isinstance(schema, (Reference30, Reference31)):
|
|
47
|
+
model_name = common.normalize_symbol(schema.ref.split("/")[-1])
|
|
48
|
+
return model_name if required else f"Optional[{model_name}]"
|
|
49
|
+
raise ValueError(f"Unsupported schema type: {type(schema)!r}")
|
|
50
|
+
|
|
51
|
+
|
|
45
52
|
def parameter_base_type_hint(param: Parameter) -> str:
|
|
46
53
|
return parameter_type_hint(param, True)
|
|
47
54
|
|
|
@@ -39,6 +39,7 @@ from openapi_pydantic.v3.v3_1 import (
|
|
|
39
39
|
from openapi_pydantic.v3.v3_1.parameter import Parameter as Parameter31
|
|
40
40
|
|
|
41
41
|
from pydantic_openapi_generator.common import PydanticVersion
|
|
42
|
+
from pydantic_openapi_generator.config.custom_kwarg import CustomKwargConfiguration
|
|
42
43
|
from pydantic_openapi_generator.config.generator_config import (
|
|
43
44
|
PydanticOpenAPIGeneratorConfig,
|
|
44
45
|
)
|
|
@@ -53,6 +54,7 @@ from pydantic_openapi_generator.language_converters.python.model_generator impor
|
|
|
53
54
|
type_converter,
|
|
54
55
|
)
|
|
55
56
|
from pydantic_openapi_generator.models import (
|
|
57
|
+
GeneratedCustomKwarg,
|
|
56
58
|
GeneratedParameter,
|
|
57
59
|
LibraryConfig,
|
|
58
60
|
Model,
|
|
@@ -309,7 +311,10 @@ def _resolve_parameter(
|
|
|
309
311
|
return config.parameter_configuration_for(param.name).resolve_parameter(param)
|
|
310
312
|
|
|
311
313
|
|
|
312
|
-
|
|
314
|
+
SignatureParameter = Union[GeneratedParameter, GeneratedCustomKwarg]
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def _method_signature(parameters: List[SignatureParameter], body_param: Optional[str]) -> str:
|
|
313
318
|
required_params: List[str] = []
|
|
314
319
|
default_params: List[str] = []
|
|
315
320
|
|
|
@@ -361,6 +366,42 @@ def _parameter_dict_items(parameters: List[GeneratedParameter]) -> List[str]:
|
|
|
361
366
|
return [f"{p.wire_name!r}: {p.value_expression}" for p in parameters]
|
|
362
367
|
|
|
363
368
|
|
|
369
|
+
def _custom_kwarg_applies(
|
|
370
|
+
custom_kwarg: CustomKwargConfiguration,
|
|
371
|
+
parameters: List[GeneratedParameter],
|
|
372
|
+
) -> bool:
|
|
373
|
+
condition = custom_kwarg.condition
|
|
374
|
+
if condition is None:
|
|
375
|
+
return True
|
|
376
|
+
|
|
377
|
+
if condition.type == "exists":
|
|
378
|
+
ref = common.normalize_symbol(condition.ref)
|
|
379
|
+
return any(parameter.code_name == ref for parameter in parameters)
|
|
380
|
+
|
|
381
|
+
return False
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
def resolve_custom_kwargs(
|
|
385
|
+
configured_custom_kwargs: List[CustomKwargConfiguration],
|
|
386
|
+
parameters: List[GeneratedParameter],
|
|
387
|
+
) -> List[GeneratedCustomKwarg]:
|
|
388
|
+
custom_kwargs = [
|
|
389
|
+
custom_kwarg.resolve_custom_kwarg()
|
|
390
|
+
for custom_kwarg in configured_custom_kwargs
|
|
391
|
+
if _custom_kwarg_applies(custom_kwarg, parameters)
|
|
392
|
+
]
|
|
393
|
+
|
|
394
|
+
parameter_code_names = {parameter.code_name for parameter in parameters}
|
|
395
|
+
collisions = sorted(
|
|
396
|
+
custom_kwarg.code_name for custom_kwarg in custom_kwargs if custom_kwarg.code_name in parameter_code_names
|
|
397
|
+
)
|
|
398
|
+
if collisions:
|
|
399
|
+
collision_list = ", ".join(collisions)
|
|
400
|
+
raise ValueError(f"Custom kwarg collides with generated API parameter code_name: {collision_list}")
|
|
401
|
+
|
|
402
|
+
return custom_kwargs
|
|
403
|
+
|
|
404
|
+
|
|
364
405
|
def _resolved_path_name(path_name: str, path_params: List[GeneratedParameter]) -> str:
|
|
365
406
|
resolved = path_name
|
|
366
407
|
for parameter in path_params:
|
|
@@ -806,26 +847,34 @@ def generate_clients(
|
|
|
806
847
|
path_params = generate_operation_parameters(op, generator_config, "path")
|
|
807
848
|
query_params = generate_operation_parameters(op, generator_config, "query")
|
|
808
849
|
header_params = generate_operation_parameters(op, generator_config, "header")
|
|
809
|
-
|
|
810
|
-
|
|
850
|
+
api_params = path_params + query_params + header_params
|
|
851
|
+
custom_kwargs = resolve_custom_kwargs(generator_config.custom_kwargs, api_params)
|
|
852
|
+
signature_params: List[SignatureParameter] = api_params + custom_kwargs
|
|
853
|
+
call_kwargs = [param.code_name for param in signature_params]
|
|
854
|
+
params = _method_signature(signature_params, _body_signature_param(op) if body_param is not None else None)
|
|
811
855
|
path_name = _resolved_path_name(path_name, path_params)
|
|
812
856
|
|
|
813
857
|
placeholder_names = [m.group(1) for m in re.finditer(r"\{([^}/]+)\}", path_name)]
|
|
814
|
-
existing_param_names = {p.code_name for p in
|
|
858
|
+
existing_param_names = {p.code_name for p in signature_params}
|
|
815
859
|
for ph in placeholder_names:
|
|
816
860
|
norm_ph = common.normalize_symbol(ph)
|
|
817
861
|
if norm_ph not in existing_param_names and norm_ph:
|
|
818
862
|
params = f"{norm_ph}: Any, " + params
|
|
863
|
+
call_kwargs.insert(0, norm_ph)
|
|
864
|
+
if body_param is not None:
|
|
865
|
+
call_kwargs.append("data")
|
|
819
866
|
|
|
820
867
|
operation_id = generate_operation_id(op, http_operation, path_name)
|
|
821
868
|
return_type = generate_return_type(op)
|
|
822
869
|
|
|
823
870
|
so = ServiceOperation(
|
|
824
871
|
params=params,
|
|
872
|
+
call_kwargs=call_kwargs,
|
|
825
873
|
operation_id=operation_id,
|
|
826
874
|
path_params=path_params,
|
|
827
875
|
query_params=query_params,
|
|
828
876
|
header_params=header_params,
|
|
877
|
+
custom_kwargs=custom_kwargs,
|
|
829
878
|
return_type=return_type,
|
|
830
879
|
operation=op,
|
|
831
880
|
pathItem=path_obj,
|
|
@@ -27,7 +27,7 @@ class AsyncClient(BaseModel):
|
|
|
27
27
|
{{ field.code_name }}: {{ field.field_type_hint }}{% if field.field_default is not none %} = {{ field.field_default }}{% endif %}{{ "\n" }}
|
|
28
28
|
{% endfor %}
|
|
29
29
|
|
|
30
|
-
async def get_access_token(self) -> Optional[str]:
|
|
30
|
+
async def get_access_token(self, **kwargs: Any) -> Optional[str]:
|
|
31
31
|
{% if env_token_name is not none %}
|
|
32
32
|
try:
|
|
33
33
|
return os.environ["{{ env_token_name }}"]
|
|
@@ -48,7 +48,7 @@ class AsyncClient(BaseModel):
|
|
|
48
48
|
{% endif %}
|
|
49
49
|
|
|
50
50
|
{% for function in client_functions %}
|
|
51
|
-
async def {{ function.getter_name }}(self) -> {{ function.base_type_hint }}:
|
|
51
|
+
async def {{ function.getter_name }}(self, **kwargs: Any) -> {{ function.base_type_hint }}:
|
|
52
52
|
raise NotImplementedError
|
|
53
53
|
|
|
54
54
|
{% endfor %}
|
|
@@ -59,6 +59,11 @@ AsyncGenerator[str | {% if op.sse_data_handler and op.sse_data_handler.type %}{%
|
|
|
59
59
|
{{ op.return_type.return_type_hint or "None" }}
|
|
60
60
|
{%- endif -%}:
|
|
61
61
|
base_url = self.base_url
|
|
62
|
+
_request_kwargs = {
|
|
63
|
+
{% for kwarg in op.call_kwargs %}
|
|
64
|
+
"{{ kwarg }}": {{ kwarg }},
|
|
65
|
+
{% endfor %}
|
|
66
|
+
}
|
|
62
67
|
{% for param in op.path_params + op.query_params + op.header_params %}
|
|
63
68
|
{% if param.source == "ClassVar" %}
|
|
64
69
|
{% if param.is_secret %}
|
|
@@ -67,7 +72,7 @@ AsyncGenerator[str | {% if op.sse_data_handler and op.sse_data_handler.type %}{%
|
|
|
67
72
|
{{ param.local_name }} = {{ param.code_name }} if {{ param.code_name }} is not None else self.{{ param.code_name }}
|
|
68
73
|
{% endif %}
|
|
69
74
|
{% elif param.source == "Function" %}
|
|
70
|
-
{{ param.local_name }} = {{ param.code_name }} if {{ param.code_name }} is not None else await self.{{ param.getter_name }}()
|
|
75
|
+
{{ param.local_name }} = {{ param.code_name }} if {{ param.code_name }} is not None else await self.{{ param.getter_name }}(**_request_kwargs)
|
|
71
76
|
{% endif %}
|
|
72
77
|
{% endfor %}
|
|
73
78
|
path = f"{{ op.path_name }}"
|
|
@@ -89,7 +94,7 @@ AsyncGenerator[str | {% if op.sse_data_handler and op.sse_data_handler.type %}{%
|
|
|
89
94
|
}
|
|
90
95
|
headers = {k: v for (k, v) in headers.items() if v is not None}
|
|
91
96
|
|
|
92
|
-
_token = await self.get_access_token()
|
|
97
|
+
_token = await self.get_access_token(**_request_kwargs)
|
|
93
98
|
if _token:
|
|
94
99
|
headers["Authorization"] = f"Bearer {_token}"
|
|
95
100
|
|
|
@@ -27,7 +27,7 @@ class SyncClient(BaseModel):
|
|
|
27
27
|
{{ field.code_name }}: {{ field.field_type_hint }}{% if field.field_default is not none %} = {{ field.field_default }}{% endif %}{{ "\n" }}
|
|
28
28
|
{% endfor %}
|
|
29
29
|
|
|
30
|
-
def get_access_token(self) -> Optional[str]:
|
|
30
|
+
def get_access_token(self, **kwargs: Any) -> Optional[str]:
|
|
31
31
|
{% if env_token_name is not none %}
|
|
32
32
|
try:
|
|
33
33
|
return os.environ["{{ env_token_name }}"]
|
|
@@ -48,7 +48,7 @@ class SyncClient(BaseModel):
|
|
|
48
48
|
{% endif %}
|
|
49
49
|
|
|
50
50
|
{% for function in client_functions %}
|
|
51
|
-
def {{ function.getter_name }}(self) -> {{ function.base_type_hint }}:
|
|
51
|
+
def {{ function.getter_name }}(self, **kwargs: Any) -> {{ function.base_type_hint }}:
|
|
52
52
|
raise NotImplementedError
|
|
53
53
|
|
|
54
54
|
{% endfor %}
|
|
@@ -59,6 +59,11 @@ Generator[str | {% if op.sse_data_handler and op.sse_data_handler.type %}{% if o
|
|
|
59
59
|
{{ op.return_type.return_type_hint or "None" }}
|
|
60
60
|
{%- endif -%}:
|
|
61
61
|
base_url = self.base_url
|
|
62
|
+
_request_kwargs = {
|
|
63
|
+
{% for kwarg in op.call_kwargs %}
|
|
64
|
+
"{{ kwarg }}": {{ kwarg }},
|
|
65
|
+
{% endfor %}
|
|
66
|
+
}
|
|
62
67
|
{% for param in op.path_params + op.query_params + op.header_params %}
|
|
63
68
|
{% if param.source == "ClassVar" %}
|
|
64
69
|
{% if param.is_secret %}
|
|
@@ -67,7 +72,7 @@ Generator[str | {% if op.sse_data_handler and op.sse_data_handler.type %}{% if o
|
|
|
67
72
|
{{ param.local_name }} = {{ param.code_name }} if {{ param.code_name }} is not None else self.{{ param.code_name }}
|
|
68
73
|
{% endif %}
|
|
69
74
|
{% elif param.source == "Function" %}
|
|
70
|
-
{{ param.local_name }} = {{ param.code_name }} if {{ param.code_name }} is not None else self.{{ param.getter_name }}()
|
|
75
|
+
{{ param.local_name }} = {{ param.code_name }} if {{ param.code_name }} is not None else self.{{ param.getter_name }}(**_request_kwargs)
|
|
71
76
|
{% endif %}
|
|
72
77
|
{% endfor %}
|
|
73
78
|
path = f"{{ op.path_name }}"
|
|
@@ -89,7 +94,7 @@ Generator[str | {% if op.sse_data_handler and op.sse_data_handler.type %}{% if o
|
|
|
89
94
|
}
|
|
90
95
|
headers = {k: v for (k, v) in headers.items() if v is not None}
|
|
91
96
|
|
|
92
|
-
_token = self.get_access_token()
|
|
97
|
+
_token = self.get_access_token(**_request_kwargs)
|
|
93
98
|
if _token:
|
|
94
99
|
headers["Authorization"] = f"Bearer {_token}"
|
|
95
100
|
|
|
@@ -93,12 +93,21 @@ class GeneratedParameter(BaseModel):
|
|
|
93
93
|
value_expression: Optional[str] = None
|
|
94
94
|
|
|
95
95
|
|
|
96
|
+
class GeneratedCustomKwarg(BaseModel):
|
|
97
|
+
code_name: str
|
|
98
|
+
type_hint: str
|
|
99
|
+
required: bool
|
|
100
|
+
default: Optional[str] = None
|
|
101
|
+
|
|
102
|
+
|
|
96
103
|
class ServiceOperation(BaseModel):
|
|
97
104
|
params: str
|
|
105
|
+
call_kwargs: List[str] = Field(default_factory=list)
|
|
98
106
|
operation_id: str
|
|
99
107
|
path_params: List[GeneratedParameter] = Field(default_factory=list)
|
|
100
108
|
query_params: List[GeneratedParameter]
|
|
101
109
|
header_params: List[GeneratedParameter]
|
|
110
|
+
custom_kwargs: List[GeneratedCustomKwarg] = Field(default_factory=list)
|
|
102
111
|
return_type: OpReturnType
|
|
103
112
|
operation: Operation
|
|
104
113
|
pathItem: PathItem
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|