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.
Files changed (42) hide show
  1. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/PKG-INFO +1 -1
  2. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/pyproject.toml +1 -1
  3. pydantic_openapi_generator-2.9.0/src/pydantic_openapi_generator/config/custom_kwarg.py +63 -0
  4. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/generator_config.py +18 -0
  5. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/utils.py +12 -5
  6. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/client_generator.py +53 -4
  7. {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
  8. {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
  9. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/models.py +9 -0
  10. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/.gitignore +0 -0
  11. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/LICENSE +0 -0
  12. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/README.md +0 -0
  13. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/__init__.py +0 -0
  14. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/__main__.py +0 -0
  15. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/common.py +0 -0
  16. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/__init__.py +0 -0
  17. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/base_parameter.py +0 -0
  18. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/class_var_parameter.py +0 -0
  19. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/function_parameter.py +0 -0
  20. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/kwarg_parameter.py +0 -0
  21. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/loader.py +0 -0
  22. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/parameter_source.py +0 -0
  23. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/config/parameter_union.py +0 -0
  24. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/generate_data.py +0 -0
  25. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/__init__.py +0 -0
  26. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/__init__.py +0 -0
  27. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/common.py +0 -0
  28. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/exception_generator.py +0 -0
  29. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/generator.py +0 -0
  30. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/jinja_config.py +0 -0
  31. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/model_generator.py +0 -0
  32. {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
  33. {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
  34. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/templates/enum.jinja2 +0 -0
  35. {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
  36. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/language_converters/python/templates/models.jinja2 +0 -0
  37. {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
  38. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/parsers/__init__.py +0 -0
  39. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/parsers/openapi_30.py +0 -0
  40. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/parsers/openapi_31.py +0 -0
  41. {pydantic_openapi_generator-2.7.0 → pydantic_openapi_generator-2.9.0}/src/pydantic_openapi_generator/py.typed +0 -0
  42. {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.7.0
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pydantic-openapi-generator"
3
- version = "2.7.0"
3
+ version = "2.9.0"
4
4
  description = "Openapi Python Generator"
5
5
  authors = [
6
6
  { name = "Marco Müllner", email = "muellnermarco@gmail.com" },
@@ -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 type_converter(param.param_schema, required).converted_type
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
- def _method_signature(parameters: List[GeneratedParameter], body_param: Optional[str]) -> str:
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
- all_params = path_params + query_params + header_params
810
- params = _method_signature(all_params, _body_signature_param(op) if body_param is not None else None)
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 all_params}
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