Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Modelerfour version: 4.15.400

- Updated minimum `azure-core` version to 1.8.0 #747
- Updated minimum `msrest` version to 0.6.18 #747
- Support for `multipart/form-data` #746

**Bug fixes**

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ AutoRest needs the below config to pick this up as a plug-in - see https://githu
pass-thru:
- model-deduplicator
- subset-reducer
version: 3.0.6302
version: ~3.0.6306
use-extension:
"@autorest/modelerfour": "4.15.400"
"@autorest/modelerfour": 4.15.407

modelerfour:
group-parameters: true
Expand Down
1 change: 1 addition & 0 deletions autorest/codegen/models/code_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ def _lro_initial_function(operation: LROOperation) -> Operation:
description="",
url=operation.url,
method=operation.method,
multipart=operation.multipart,
api_versions=operation.api_versions,
parameters=operation.parameters.parameters,
requests=operation.requests,
Expand Down
2 changes: 2 additions & 0 deletions autorest/codegen/models/lro_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def __init__(
description: str,
url: str,
method: str,
multipart: bool,
api_versions: Set[str],
requests: List[SchemaRequest],
summary: Optional[str] = None,
Expand All @@ -40,6 +41,7 @@ def __init__(
description,
url,
method,
multipart,
api_versions,
requests,
summary,
Expand Down
3 changes: 2 additions & 1 deletion autorest/codegen/models/lro_paging_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ def __init__(
description: str,
url: str,
method: str,
multipart: bool,
api_versions: Set[str],
requests: List[SchemaRequest],
summary: Optional[str] = None,
Expand All @@ -36,6 +37,7 @@ def __init__(
description,
url,
method,
multipart,
api_versions,
requests,
summary,
Expand All @@ -55,4 +57,3 @@ def imports(self, code_model, async_mode: bool) -> FileImport:
file_import = lro_imports
file_import.merge(paging_imports)
return file_import

3 changes: 3 additions & 0 deletions autorest/codegen/models/operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ def __init__(
description: str,
url: str,
method: str,
multipart: bool,
api_versions: Set[str],
requests: List[SchemaRequest],
summary: Optional[str] = None,
Expand All @@ -115,6 +116,7 @@ def __init__(
self.description = description
self.url = url
self.method = method
self.multipart = multipart
self.api_versions = api_versions
self.requests = requests
self.summary = summary
Expand Down Expand Up @@ -387,6 +389,7 @@ def from_yaml(cls, yaml_data: Dict[str, Any]) -> "Operation":
description=yaml_data["language"]["python"]["description"],
url=first_request["protocol"]["http"]["path"],
method=first_request["protocol"]["http"]["method"],
multipart=first_request["protocol"]["http"].get("multipart", False),
api_versions=set(value_dict["version"] for value_dict in yaml_data["apiVersions"]),
requests=[SchemaRequest.from_yaml(yaml) for yaml in yaml_data["requests"]],
summary=yaml_data["language"]["python"].get("summary"),
Expand Down
2 changes: 2 additions & 0 deletions autorest/codegen/models/paging_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def __init__(
description: str,
url: str,
method: str,
multipart: bool,
api_versions: Set[str],
requests: List[SchemaRequest],
summary: Optional[str] = None,
Expand All @@ -42,6 +43,7 @@ def __init__(
description,
url,
method,
multipart,
api_versions,
requests,
summary,
Expand Down
1 change: 1 addition & 0 deletions autorest/codegen/models/parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class ParameterStyle(Enum):
json = "json"
binary = "binary"
xml = "xml"
multipart = "multipart"


class Parameter(BaseModel): # pylint: disable=too-many-instance-attributes
Expand Down
8 changes: 4 additions & 4 deletions autorest/codegen/models/parameter_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,11 @@ def has_body(self) -> bool:
return self.has_any_location(ParameterLocation.Body)

@property
def body(self) -> Parameter:
def body(self) -> List[Parameter]:
if not self.has_body:
raise ValueError(f"Can't get body parameter")
# Should we check if there is two body? Modeler role right?
return self.get_from_location(ParameterLocation.Body)[0]
return self.get_from_location(ParameterLocation.Body)

@property
def path(self) -> List[Parameter]:
Expand Down Expand Up @@ -140,5 +140,5 @@ def build_flattened_object(self) -> str:
for param in parameters if param.target_property_name
]
)
object_schema = cast(ObjectSchema, self.body.schema)
return f"{self.body.serialized_name} = models.{object_schema.name}({parameter_string})"
object_schema = cast(ObjectSchema, self.body[0].schema)
return f"{self.body[0].serialized_name} = models.{object_schema.name}({parameter_string})"
56 changes: 34 additions & 22 deletions autorest/codegen/templates/operation_tools.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -123,49 +123,61 @@ if {{ header_parameter.full_serialized_name }} is not None:
header_parameters['Accept'] = '{{ operation.accept_content_type }}'
{% endif %}{% endmacro %}
{# helper for stream body params #}
{% macro stream_body_params(operation) %}body_content_kwargs['stream_content'] = {{ operation.parameters.body.serialized_name }}{% endmacro %}
{% macro stream_body_params(operation) %}body_content_kwargs['stream_content'] = {{ operation.parameters.body[0].serialized_name }}{% endmacro %}
{# helper for non-stream body params with schema #}
{% macro non_stream_body_params(operation, send_xml, request_as_xml) %}
{% set ser_ctxt = operation.parameters.body.schema.xml_serialization_ctxt() if send_xml else None %}
{% set ser_ctxt = operation.parameters.body[0].schema.xml_serialization_ctxt() if send_xml else None %}
{% if ser_ctxt %}
serialization_ctxt = {'xml': {{ "{" }}{{ ser_ctxt }}{{ "}}" }}
{% endif %}
{% if operation.parameters.body.required %}
body_content = self._serialize.body({{ operation.parameters.body.serialized_name }}, '{{ operation.parameters.body.schema.serialization_type }}'{{ request_as_xml }}{{ ", serialization_ctxt=serialization_ctxt" if ser_ctxt else "" }})
{% if operation.parameters.body[0].required %}
body_content = self._serialize.body({{ operation.parameters.body[0].serialized_name }}, '{{ operation.parameters.body[0].schema.serialization_type }}'{{ request_as_xml }}{{ ", serialization_ctxt=serialization_ctxt" if ser_ctxt else "" }})
{% else %}
if {{ operation.parameters.body.serialized_name }} is not None:
body_content = self._serialize.body({{ operation.parameters.body.serialized_name }}, '{{ operation.parameters.body.schema.serialization_type }}'{{ request_as_xml }}{{ ", serialization_ctxt=serialization_ctxt" if ser_ctxt else "" }})
if {{ operation.parameters.body[0].serialized_name }} is not None:
body_content = self._serialize.body({{ operation.parameters.body[0].serialized_name }}, '{{ operation.parameters.body[0].schema.serialization_type }}'{{ request_as_xml }}{{ ", serialization_ctxt=serialization_ctxt" if ser_ctxt else "" }})
else:
body_content = None
{% endif %}
body_content_kwargs['content'] = body_content{% endmacro %}
{# write body parameters #}
{% macro body_parameters(operation, http_verb=None) %}
{% set send_xml = "xml" if operation.parameters.has_body and "xml" in operation.request_content_type %}
{% set request_as_xml = ", is_xml=True" if send_xml else "" %}
{% if operation.parameters.has_body %}
{% set body_content_kwargs_signature = "" %}
{% set form_content_kwarg_signature = "" %}
{% if operation.multipart %}
{% set form_content_kwarg_signature = ", form_content=_form_content" %}
# Construct form data
_form_content = {
{% for param in operation.parameters.body %}
'{{ param.rest_api_name }}': {{ param.serialized_name }},
{% endfor %}
}
{% else %}
{% set send_xml = "xml" if operation.parameters.has_body and "xml" in operation.request_content_type %}
{% set request_as_xml = ", is_xml=True" if send_xml else "" %}
{% if operation.parameters.has_body %}
{% set body_content_kwargs_signature = ", **body_content_kwargs" %}
body_content_kwargs = {} # type: Dict[str, Any]
{% if (operation.requests | length) == 1 %}
{% if operation.requests[0].is_stream_request %}
{% if (operation.requests | length) == 1 %}
{% if operation.requests[0].is_stream_request %}
{{ stream_body_params(operation) }}
{% elif operation.requests[0].body_parameter_has_schema %}
{% elif operation.requests[0].body_parameter_has_schema %}
{{ non_stream_body_params(operation, send_xml, request_as_xml) }}
{% endif %}
{% else %}
{% for request in operation.requests %}
{% endif %}
{% else %}
{% for request in operation.requests %}
{{ "el" if not loop.first }}if header_parameters['Content-Type'].split(";")[0] in {{ request.pre_semicolon_media_types }}:
{% if request.is_stream_request %}
{% if request.is_stream_request %}
{{ stream_body_params(operation)|indent }}
{% elif request.body_parameter_has_schema %}
{% elif request.body_parameter_has_schema %}
{{ non_stream_body_params(request, send_xml, request_as_xml)|indent }}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
else:
raise ValueError(
"The content_type '{}' is not one of the allowed values: "
"{{ operation.requests | map(attribute="media_types") | sum(start = []) | unique | list }}".format(header_parameters['Content-Type'])
)
{% endif %}
{% endif %}
{% endif %}
request = self._client.{{ http_verb if http_verb else operation.method }}(url, query_parameters, header_parameters, **body_content_kwargs)
{% else %}
request = self._client.{{ http_verb if http_verb else operation.method }}(url, query_parameters, header_parameters){% endif %}{% endmacro %}
request = self._client.{{ http_verb if http_verb else operation.method }}(url, query_parameters, header_parameters{{ form_content_kwarg_signature }}{{ body_content_kwargs_signature }}){% endmacro %}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
},
"devDependencies": {
"@autorest/autorest": "^3.0.0",
"@microsoft.azure/autorest.testserver": "^2.10.55"
"@microsoft.azure/autorest.testserver": "^2.10.56"
},
"files": [
"autorest/**/*.py",
Expand Down
2 changes: 1 addition & 1 deletion tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
'AcceptanceTests/BodyDictionary': 'body-dictionary.json',
'AcceptanceTests/BodyFile': 'body-file.json',
'AcceptanceTests/Constants': 'constants.json',
# 'AcceptanceTests/BodyFormData': 'body-formdata.json',
'AcceptanceTests/BodyFormData': 'body-formdata.json',
'AcceptanceTests/BodyInteger': 'body-integer.json',
'AcceptanceTests/BodyNumber': 'body-number.json',
'AcceptanceTests/BodyString': 'body-string.json',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,6 @@ async def put_positive_duration(
body_content = self._serialize.body(duration_body, 'duration')
body_content_kwargs['content'] = body_content
request = self._client.put(url, query_parameters, header_parameters, **body_content_kwargs)

pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
response = pipeline_response.http_response

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,6 @@ def put_positive_duration(
body_content = self._serialize.body(duration_body, 'duration')
body_content_kwargs['content'] = body_content
request = self._client.put(url, query_parameters, header_parameters, **body_content_kwargs)

pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
response = pipeline_response.http_response

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,6 @@ async def post_required(
body_content = self._serialize.body(_body, 'int')
body_content_kwargs['content'] = body_content
request = self._client.post(url, query_parameters, header_parameters, **body_content_kwargs)

pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
response = pipeline_response.http_response

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ def post_required(
body_content = self._serialize.body(_body, 'int')
body_content_kwargs['content'] = body_content
request = self._client.post(url, query_parameters, header_parameters, **body_content_kwargs)

pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
response = pipeline_response.http_response

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ async def _put_async_retry_succeeded_initial(
body_content = None
body_content_kwargs['content'] = body_content
request = self._client.put(url, query_parameters, header_parameters, **body_content_kwargs)

pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
response = pipeline_response.http_response

Expand Down Expand Up @@ -185,7 +184,6 @@ async def _put201_creating_succeeded200_initial(
body_content = None
body_content_kwargs['content'] = body_content
request = self._client.put(url, query_parameters, header_parameters, **body_content_kwargs)

pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
response = pipeline_response.http_response

Expand Down Expand Up @@ -293,7 +291,6 @@ async def _post202_retry200_initial(
body_content = None
body_content_kwargs['content'] = body_content
request = self._client.post(url, query_parameters, header_parameters, **body_content_kwargs)

pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
response = pipeline_response.http_response

Expand Down Expand Up @@ -394,7 +391,6 @@ async def _post_async_retry_succeeded_initial(
body_content = None
body_content_kwargs['content'] = body_content
request = self._client.post(url, query_parameters, header_parameters, **body_content_kwargs)

pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
response = pipeline_response.http_response

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ async def _put201_creating_succeeded200_initial(
body_content = None
body_content_kwargs['content'] = body_content
request = self._client.put(url, query_parameters, header_parameters, **body_content_kwargs)

pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
response = pipeline_response.http_response

Expand Down Expand Up @@ -179,7 +178,6 @@ async def _put_async_relative_retry_succeeded_initial(
body_content = None
body_content_kwargs['content'] = body_content
request = self._client.put(url, query_parameters, header_parameters, **body_content_kwargs)

pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
response = pipeline_response.http_response

Expand Down Expand Up @@ -565,7 +563,6 @@ async def _post202_retry200_initial(
body_content = None
body_content_kwargs['content'] = body_content
request = self._client.post(url, query_parameters, header_parameters, **body_content_kwargs)

pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
response = pipeline_response.http_response

Expand Down Expand Up @@ -665,7 +662,6 @@ async def _post_async_relative_retry_succeeded_initial(
body_content = None
body_content_kwargs['content'] = body_content
request = self._client.post(url, query_parameters, header_parameters, **body_content_kwargs)

pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
response = pipeline_response.http_response

Expand Down
Loading