From f730cac78cb6dfa2f9522d257d8f86f32289081e Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 21 Jun 2022 12:36:53 -0700 Subject: [PATCH 1/7] hide maxpagesize --- autorest/preprocess/__init__.py | 20 ++++- .../aio/operations/_operations.py | 66 ++++++++++++++++ .../operations/_operations.py | 79 +++++++++++++++++++ 3 files changed, 162 insertions(+), 3 deletions(-) diff --git a/autorest/preprocess/__init__.py b/autorest/preprocess/__init__.py index ba0010c5b4a..4c9675b0a45 100644 --- a/autorest/preprocess/__init__.py +++ b/autorest/preprocess/__init__.py @@ -12,6 +12,14 @@ from .. import YamlUpdatePlugin +def _remove_paging_maxpagesize(yaml_data: Dict[str, Any]) -> None: + # we don't expose maxpagesize for version tolerant generation + # users should be passing this into `by_page` + yaml_data["parameters"] = [ + p for p in yaml_data.get("parameters", []) + if p["restApiName"].lower() not in ["maxpagesize", "$maxpagesize"] + ] + def update_description( description: Optional[str], default_description: str = "" ) -> str: @@ -22,7 +30,6 @@ def update_description( description += "." return description - def update_operation_group_class_name( yaml_data: Dict[str, Any], class_name: str ) -> str: @@ -85,6 +92,10 @@ def update_paging_response(yaml_data: Dict[str, Any]) -> None: class PreProcessPlugin(YamlUpdatePlugin): """Add Python naming information.""" + @property + def version_tolerant(self) -> bool: + return bool(self._autorestapi.get_boolean_value("version-tolerant", True)) + def get_operation_updater( self, yaml_data: Dict[str, Any] ) -> Callable[[Dict[str, Any]], None]: @@ -164,15 +175,18 @@ def update_paging_operation(self, yaml_data: Dict[str, Any]) -> None: if yaml_data.get("nextOperation") else yaml_data["responses"][0] ) - # if we're in version tolerant, hide the paging model - if self._autorestapi.get_boolean_value("version-tolerant"): + if self.version_tolerant: + # if we're in version tolerant, hide the paging model returned_response_object["type"]["isPublic"] = False + _remove_paging_maxpagesize(yaml_data) item_type = next( p["type"]["elementType"] for p in returned_response_object["type"]["properties"] if p["restApiName"] == yaml_data["itemName"] ) if yaml_data.get("nextOperation"): + if self.version_tolerant: + _remove_paging_maxpagesize(yaml_data["nextOperation"]) yaml_data["nextOperation"]["groupName"] = pad_reserved_words( yaml_data["nextOperation"]["groupName"], PadType.OPERATION_GROUP ) diff --git a/test/azure/version-tolerant/Expected/AcceptanceTests/PagingVersionTolerant/pagingversiontolerant/aio/operations/_operations.py b/test/azure/version-tolerant/Expected/AcceptanceTests/PagingVersionTolerant/pagingversiontolerant/aio/operations/_operations.py index 44997ec7d2a..fa6c7a3645c 100644 --- a/test/azure/version-tolerant/Expected/AcceptanceTests/PagingVersionTolerant/pagingversiontolerant/aio/operations/_operations.py +++ b/test/azure/version-tolerant/Expected/AcceptanceTests/PagingVersionTolerant/pagingversiontolerant/aio/operations/_operations.py @@ -48,6 +48,7 @@ build_paging_next_fragment_request, build_paging_next_fragment_with_grouping_request, build_paging_next_operation_with_query_params_request, + build_paging_page_with_max_page_size_request, ) if sys.version_info >= (3, 9): @@ -571,6 +572,71 @@ async def get_next(next_link=None): return AsyncItemPaged(get_next, extract_data) + @distributed_trace + def page_with_max_page_size(self, **kwargs: Any) -> AsyncIterable[JSON]: + """Paging with max page size. We don't want to. + + :return: An iterator like instance of JSON object + :rtype: ~azure.core.async_paging.AsyncItemPaged[JSON] + :raises ~azure.core.exceptions.HttpResponseError: + + Example: + .. code-block:: python + + # response body for status code(s): 200 + response == { + "properties": { + "id": 0, # Optional. + "name": "str" # Optional. + } + } + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls = kwargs.pop("cls", None) # type: ClsType[JSON] + + error_map = {401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError} + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + request = build_paging_page_with_max_page_size_request( + headers=_headers, + params=_params, + ) + request.url = self._client.format_url(request.url) # type: ignore + + else: + request = HttpRequest("GET", next_link) + request.url = self._client.format_url(request.url) # type: ignore + + return request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = deserialized["values"] + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.get("nextLink", None), AsyncList(list_of_elem) + + async def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run( # type: ignore # pylint: disable=protected-access + request, stream=False, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + @distributed_trace def get_odata_multiple_pages( self, diff --git a/test/azure/version-tolerant/Expected/AcceptanceTests/PagingVersionTolerant/pagingversiontolerant/operations/_operations.py b/test/azure/version-tolerant/Expected/AcceptanceTests/PagingVersionTolerant/pagingversiontolerant/operations/_operations.py index 94c43df57c7..fb52c1c9ac7 100644 --- a/test/azure/version-tolerant/Expected/AcceptanceTests/PagingVersionTolerant/pagingversiontolerant/operations/_operations.py +++ b/test/azure/version-tolerant/Expected/AcceptanceTests/PagingVersionTolerant/pagingversiontolerant/operations/_operations.py @@ -176,6 +176,20 @@ def build_paging_duplicate_params_request(*, filter: Optional[str] = None, **kwa return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) +def build_paging_page_with_max_page_size_request(**kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/paging/maxPageSize" + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, headers=_headers, **kwargs) + + def build_paging_get_odata_multiple_pages_request( *, client_request_id: Optional[str] = None, maxresults: Optional[int] = None, timeout: int = 30, **kwargs: Any ) -> HttpRequest: @@ -948,6 +962,71 @@ def get_next(next_link=None): return ItemPaged(get_next, extract_data) + @distributed_trace + def page_with_max_page_size(self, **kwargs: Any) -> Iterable[JSON]: + """Paging with max page size. We don't want to. + + :return: An iterator like instance of JSON object + :rtype: ~azure.core.paging.ItemPaged[JSON] + :raises ~azure.core.exceptions.HttpResponseError: + + Example: + .. code-block:: python + + # response body for status code(s): 200 + response == { + "properties": { + "id": 0, # Optional. + "name": "str" # Optional. + } + } + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls = kwargs.pop("cls", None) # type: ClsType[JSON] + + error_map = {401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError} + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + request = build_paging_page_with_max_page_size_request( + headers=_headers, + params=_params, + ) + request.url = self._client.format_url(request.url) # type: ignore + + else: + request = HttpRequest("GET", next_link) + request.url = self._client.format_url(request.url) # type: ignore + + return request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = deserialized["values"] + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.get("nextLink", None), iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run( # type: ignore # pylint: disable=protected-access + request, stream=False, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + @distributed_trace def get_odata_multiple_pages( self, From 83b223da00d365bcb045d64e076e12cdb31dc555 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 21 Jun 2022 12:46:20 -0700 Subject: [PATCH 2/7] add maxpagesize tests --- test/azure/legacy/AcceptanceTests/test_zzz.py | 1 + .../aio/operations/_paging_operations.py | 70 +++++++++++++++ .../paging/operations/_paging_operations.py | 88 +++++++++++++++++++ .../AcceptanceTests/test_paging.py | 3 + 4 files changed, 162 insertions(+) diff --git a/test/azure/legacy/AcceptanceTests/test_zzz.py b/test/azure/legacy/AcceptanceTests/test_zzz.py index 76900bb6cf8..fe7465b4e32 100644 --- a/test/azure/legacy/AcceptanceTests/test_zzz.py +++ b/test/azure/legacy/AcceptanceTests/test_zzz.py @@ -41,6 +41,7 @@ def test_ensure_coverage(self): # Add tests that wont be supported due to the nature of Python here not_supported = { "LROPatchInlineCompleteIgnoreHeaders": 1, + "PagingDontSendMaxPageSize": 1, # we're still sending maxpagesize in legacy } # Please add missing features or failing tests here diff --git a/test/azure/legacy/Expected/AcceptanceTests/Paging/paging/aio/operations/_paging_operations.py b/test/azure/legacy/Expected/AcceptanceTests/Paging/paging/aio/operations/_paging_operations.py index 85161525528..f70f461bb04 100644 --- a/test/azure/legacy/Expected/AcceptanceTests/Paging/paging/aio/operations/_paging_operations.py +++ b/test/azure/legacy/Expected/AcceptanceTests/Paging/paging/aio/operations/_paging_operations.py @@ -49,6 +49,7 @@ build_next_fragment_request, build_next_fragment_with_grouping_request, build_next_operation_with_query_params_request, + build_page_with_max_page_size_request, ) T = TypeVar("T") @@ -572,6 +573,75 @@ async def get_next(next_link=None): duplicate_params.metadata = {"url": "/paging/multiple/duplicateParams/1"} # type: ignore + @distributed_trace + def page_with_max_page_size(self, maxpagesize: str = "5", **kwargs: Any) -> AsyncIterable["_models.Product"]: + """Paging with max page size. We don't want to. + + :param maxpagesize: Max page size query param. Don't send. Known values are "5" and None. + Default value is "5". + :type maxpagesize: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: An iterator like instance of either Product or the result of cls(response) + :rtype: ~azure.core.async_paging.AsyncItemPaged[~paging.models.Product] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls = kwargs.pop("cls", None) # type: ClsType[_models.ProductResult] + + error_map = {401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError} + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + request = build_page_with_max_page_size_request( + maxpagesize=maxpagesize, + template_url=self.page_with_max_page_size.metadata["url"], + headers=_headers, + params=_params, + ) + request = _convert_request(request) + request.url = self._client.format_url(request.url) # type: ignore + + else: + + request = build_page_with_max_page_size_request( + template_url=next_link, + headers=_headers, + params=_params, + ) + request = _convert_request(request) + request.url = self._client.format_url(request.url) # type: ignore + request.method = "GET" + return request + + async def extract_data(pipeline_response): + deserialized = self._deserialize("ProductResult", pipeline_response) + list_of_elem = deserialized.values + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run( # type: ignore # pylint: disable=protected-access + request, stream=False, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + page_with_max_page_size.metadata = {"url": "/paging/maxPageSize"} # type: ignore + @distributed_trace def get_odata_multiple_pages( self, diff --git a/test/azure/legacy/Expected/AcceptanceTests/Paging/paging/operations/_paging_operations.py b/test/azure/legacy/Expected/AcceptanceTests/Paging/paging/operations/_paging_operations.py index 41ca73eb5b4..4da5d3e0ef6 100644 --- a/test/azure/legacy/Expected/AcceptanceTests/Paging/paging/operations/_paging_operations.py +++ b/test/azure/legacy/Expected/AcceptanceTests/Paging/paging/operations/_paging_operations.py @@ -171,6 +171,25 @@ def build_duplicate_params_request(*, filter: Optional[str] = None, **kwargs: An return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) +def build_page_with_max_page_size_request(*, maxpagesize: str = "5", **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = kwargs.pop("template_url", "/paging/maxPageSize") + + # Construct parameters + if maxpagesize is not None: + _params["$maxpagesize"] = _SERIALIZER.query("maxpagesize", maxpagesize, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + def build_get_odata_multiple_pages_request( *, client_request_id: Optional[str] = None, maxresults: Optional[int] = None, timeout: int = 30, **kwargs: Any ) -> HttpRequest: @@ -946,6 +965,75 @@ def get_next(next_link=None): duplicate_params.metadata = {"url": "/paging/multiple/duplicateParams/1"} # type: ignore + @distributed_trace + def page_with_max_page_size(self, maxpagesize: str = "5", **kwargs: Any) -> Iterable["_models.Product"]: + """Paging with max page size. We don't want to. + + :param maxpagesize: Max page size query param. Don't send. Known values are "5" and None. + Default value is "5". + :type maxpagesize: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: An iterator like instance of either Product or the result of cls(response) + :rtype: ~azure.core.paging.ItemPaged[~paging.models.Product] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls = kwargs.pop("cls", None) # type: ClsType[_models.ProductResult] + + error_map = {401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError} + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + request = build_page_with_max_page_size_request( + maxpagesize=maxpagesize, + template_url=self.page_with_max_page_size.metadata["url"], + headers=_headers, + params=_params, + ) + request = _convert_request(request) + request.url = self._client.format_url(request.url) # type: ignore + + else: + + request = build_page_with_max_page_size_request( + template_url=next_link, + headers=_headers, + params=_params, + ) + request = _convert_request(request) + request.url = self._client.format_url(request.url) # type: ignore + request.method = "GET" + return request + + def extract_data(pipeline_response): + deserialized = self._deserialize("ProductResult", pipeline_response) + list_of_elem = deserialized.values + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link or None, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run( # type: ignore # pylint: disable=protected-access + request, stream=False, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + page_with_max_page_size.metadata = {"url": "/paging/maxPageSize"} # type: ignore + @distributed_trace def get_odata_multiple_pages( self, diff --git a/test/azure/version-tolerant/AcceptanceTests/test_paging.py b/test/azure/version-tolerant/AcceptanceTests/test_paging.py index 5ffac65c6c0..bc7d2280515 100644 --- a/test/azure/version-tolerant/AcceptanceTests/test_paging.py +++ b/test/azure/version-tolerant/AcceptanceTests/test_paging.py @@ -170,3 +170,6 @@ def test_duplicate_params(client): assert len(pages) == 1 assert pages[0]["properties"]["id"] == 1 assert pages[0]["properties"]["name"] == "Product" + +def test_dont_send_maxpagesize(client): + list(client.paging.page_with_max_page_size()) From 986de8f9b25aa48c15d43899dc3c59586c0b6c5a Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 21 Jun 2022 12:54:47 -0700 Subject: [PATCH 3/7] black --- autorest/preprocess/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/autorest/preprocess/__init__.py b/autorest/preprocess/__init__.py index 4c9675b0a45..30125b4777d 100644 --- a/autorest/preprocess/__init__.py +++ b/autorest/preprocess/__init__.py @@ -16,10 +16,12 @@ def _remove_paging_maxpagesize(yaml_data: Dict[str, Any]) -> None: # we don't expose maxpagesize for version tolerant generation # users should be passing this into `by_page` yaml_data["parameters"] = [ - p for p in yaml_data.get("parameters", []) + p + for p in yaml_data.get("parameters", []) if p["restApiName"].lower() not in ["maxpagesize", "$maxpagesize"] ] + def update_description( description: Optional[str], default_description: str = "" ) -> str: @@ -30,6 +32,7 @@ def update_description( description += "." return description + def update_operation_group_class_name( yaml_data: Dict[str, Any], class_name: str ) -> str: From ba4163bb5e357edda6dba4ef8ed96feb6b6daaed Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Wed, 22 Jun 2022 11:09:39 -0700 Subject: [PATCH 4/7] bump testserver version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eae0be054e8..b40063b095d 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@autorest/system-requirements": "~1.0.0" }, "devDependencies": { - "@microsoft.azure/autorest.testserver": "^3.3.29" + "@microsoft.azure/autorest.testserver": "^3.3.31" }, "files": [ "autorest/**/*.py", From 39cac479e9b90dd484ca6787f06375bbc60fe996 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Wed, 22 Jun 2022 11:16:05 -0700 Subject: [PATCH 5/7] bump changelog --- ChangeLog.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index a20875958ae..bd1d5ac2286 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,21 @@ # Release History +### 2022-06-24 - 6.0.0 + +| Library | Min Version | +| ----------------------------------------------------------------------- | ----------- | +| `@autorest/core` | `3.8.1` | +| `@autorest/modelerfour` | `4.23.5` | +| `azure-core` dep of generated code | `1.24.0` | +| `isodate` dep of generated code | `1.24.0` | +| `msrest` dep of generated code (If generating legacy code) | `0.7.1` | +| `azure-mgmt-core` dep of generated code (If generating mgmt plane code) | `1.3.0` | + +**Breaking Changes** + +- Don't generate paging variables `maxpagesize` for DPG generations. Users should pass in `maxpagesize` to the `by_page` method of their +pager #1320 + ### 2022-06-17 - 6.0.0-rc.1 | Library | Min Version | From ab61a584a38f7b7ae66b43b65e8055b2c20639a9 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Wed, 22 Jun 2022 15:00:27 -0700 Subject: [PATCH 6/7] regen --- .../aio/operations/_paging_operations.py | 69 +++++++++++++++ .../operations/_paging_operations.py | 87 +++++++++++++++++++ .../aio/operations/_operations.py | 70 +++++++++++++++ .../operations/_operations.py | 83 ++++++++++++++++++ 4 files changed, 309 insertions(+) diff --git a/test/azure/legacy/Expected/AcceptanceTests/CustomPollerPager/custompollerpager/aio/operations/_paging_operations.py b/test/azure/legacy/Expected/AcceptanceTests/CustomPollerPager/custompollerpager/aio/operations/_paging_operations.py index 9def3c95f30..a6c67cfa2fc 100644 --- a/test/azure/legacy/Expected/AcceptanceTests/CustomPollerPager/custompollerpager/aio/operations/_paging_operations.py +++ b/test/azure/legacy/Expected/AcceptanceTests/CustomPollerPager/custompollerpager/aio/operations/_paging_operations.py @@ -53,6 +53,7 @@ build_next_fragment_request, build_next_fragment_with_grouping_request, build_next_operation_with_query_params_request, + build_page_with_max_page_size_request, build_replace_api_version_request, ) @@ -564,6 +565,74 @@ async def get_next(next_link=None): duplicate_params.metadata = {"url": "/paging/multiple/duplicateParams/1"} # type: ignore + @distributed_trace + def page_with_max_page_size(self, maxpagesize: str = "5", **kwargs: Any) -> AsyncIterable["_models.Product"]: + """Paging with max page size. We don't want to. + + :param maxpagesize: Max page size query param. Don't send. Known values are "5" and None. + Default value is "5". + :type maxpagesize: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: An iterator like instance of either Product or the result of cls(response) + :rtype: ~azure.core.async_paging.AsyncItemPaged[~custompollerpager.models.Product] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls = kwargs.pop("cls", None) # type: ClsType[_models.ProductResult] + + error_map = {401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError} + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + request = build_page_with_max_page_size_request( + maxpagesize=maxpagesize, + template_url=self.page_with_max_page_size.metadata["url"], + headers=_headers, + params=_params, + ) + request = _convert_request(request) + request.url = self._client.format_url(request.url) # type: ignore + + else: + # make call to next link with the client's api-version + _parsed_next_link = urlparse(next_link) + _next_request_params = case_insensitive_dict(parse_qs(_parsed_next_link.query)) + _next_request_params["api-version"] = self._config.api_version + request = HttpRequest("GET", urljoin(next_link, _parsed_next_link.path), params=_next_request_params) + request = _convert_request(request) + request.url = self._client.format_url(request.url) # type: ignore + request.method = "GET" + return request + + async def extract_data(pipeline_response): + deserialized = self._deserialize("ProductResult", pipeline_response) + list_of_elem = deserialized.values + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link or None, AsyncList(list_of_elem) + + async def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run( # type: ignore # pylint: disable=protected-access + request, stream=False, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response, error_format=ARMErrorFormat) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + + page_with_max_page_size.metadata = {"url": "/paging/maxPageSize"} # type: ignore + @distributed_trace def get_odata_multiple_pages( self, diff --git a/test/azure/legacy/Expected/AcceptanceTests/CustomPollerPager/custompollerpager/operations/_paging_operations.py b/test/azure/legacy/Expected/AcceptanceTests/CustomPollerPager/custompollerpager/operations/_paging_operations.py index 01bc882c82b..4c555728e08 100644 --- a/test/azure/legacy/Expected/AcceptanceTests/CustomPollerPager/custompollerpager/operations/_paging_operations.py +++ b/test/azure/legacy/Expected/AcceptanceTests/CustomPollerPager/custompollerpager/operations/_paging_operations.py @@ -174,6 +174,25 @@ def build_duplicate_params_request(*, filter: Optional[str] = None, **kwargs: An return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) +def build_page_with_max_page_size_request(*, maxpagesize: str = "5", **kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = kwargs.pop("template_url", "/paging/maxPageSize") + + # Construct parameters + if maxpagesize is not None: + _params["$maxpagesize"] = _SERIALIZER.query("maxpagesize", maxpagesize, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + def build_get_odata_multiple_pages_request( *, client_request_id: Optional[str] = None, maxresults: Optional[int] = None, timeout: int = 30, **kwargs: Any ) -> HttpRequest: @@ -974,6 +993,74 @@ def get_next(next_link=None): duplicate_params.metadata = {"url": "/paging/multiple/duplicateParams/1"} # type: ignore + @distributed_trace + def page_with_max_page_size(self, maxpagesize: str = "5", **kwargs: Any) -> Iterable["_models.Product"]: + """Paging with max page size. We don't want to. + + :param maxpagesize: Max page size query param. Don't send. Known values are "5" and None. + Default value is "5". + :type maxpagesize: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: An iterator like instance of either Product or the result of cls(response) + :rtype: ~azure.core.paging.ItemPaged[~custompollerpager.models.Product] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls = kwargs.pop("cls", None) # type: ClsType[_models.ProductResult] + + error_map = {401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError} + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + request = build_page_with_max_page_size_request( + maxpagesize=maxpagesize, + template_url=self.page_with_max_page_size.metadata["url"], + headers=_headers, + params=_params, + ) + request = _convert_request(request) + request.url = self._client.format_url(request.url) # type: ignore + + else: + # make call to next link with the client's api-version + _parsed_next_link = urlparse(next_link) + _next_request_params = case_insensitive_dict(parse_qs(_parsed_next_link.query)) + _next_request_params["api-version"] = self._config.api_version + request = HttpRequest("GET", urljoin(next_link, _parsed_next_link.path), params=_next_request_params) + request = _convert_request(request) + request.url = self._client.format_url(request.url) # type: ignore + request.method = "GET" + return request + + def extract_data(pipeline_response): + deserialized = self._deserialize("ProductResult", pipeline_response) + list_of_elem = deserialized.values + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.next_link or None, iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run( # type: ignore # pylint: disable=protected-access + request, stream=False, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response, error_format=ARMErrorFormat) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + + page_with_max_page_size.metadata = {"url": "/paging/maxPageSize"} # type: ignore + @distributed_trace def get_odata_multiple_pages( self, diff --git a/test/azure/version-tolerant/Expected/AcceptanceTests/CustomPollerPagerVersionTolerant/custompollerpagerversiontolerant/aio/operations/_operations.py b/test/azure/version-tolerant/Expected/AcceptanceTests/CustomPollerPagerVersionTolerant/custompollerpagerversiontolerant/aio/operations/_operations.py index 163474cd428..2aae62d7260 100644 --- a/test/azure/version-tolerant/Expected/AcceptanceTests/CustomPollerPagerVersionTolerant/custompollerpagerversiontolerant/aio/operations/_operations.py +++ b/test/azure/version-tolerant/Expected/AcceptanceTests/CustomPollerPagerVersionTolerant/custompollerpagerversiontolerant/aio/operations/_operations.py @@ -52,6 +52,7 @@ build_paging_next_fragment_request, build_paging_next_fragment_with_grouping_request, build_paging_next_operation_with_query_params_request, + build_paging_page_with_max_page_size_request, build_paging_replace_api_version_request, ) @@ -600,6 +601,75 @@ async def get_next(next_link=None): return AsyncItemPaged(get_next, extract_data) + @distributed_trace + def page_with_max_page_size(self, **kwargs: Any) -> AsyncIterable[JSON]: + """Paging with max page size. We don't want to. + + :return: An iterator like instance of JSON object + :rtype: ~azure.core.async_paging.AsyncItemPaged[JSON] + :raises ~azure.core.exceptions.HttpResponseError: + + Example: + .. code-block:: python + + # response body for status code(s): 200 + response == { + "properties": { + "id": 0, # Optional. + "name": "str" # Optional. + } + } + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls = kwargs.pop("cls", None) # type: ClsType[JSON] + + error_map = {401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError} + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + request = build_paging_page_with_max_page_size_request( + headers=_headers, + params=_params, + ) + request.url = self._client.format_url(request.url) # type: ignore + + else: + # make call to next link with the client's api-version + _parsed_next_link = urlparse(next_link) + _next_request_params = case_insensitive_dict(parse_qs(_parsed_next_link.query)) + _next_request_params["api-version"] = self._config.api_version + request = HttpRequest("GET", urljoin(next_link, _parsed_next_link.path), params=_next_request_params) + request.url = self._client.format_url(request.url) # type: ignore + + return request + + async def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = deserialized["values"] + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.get("nextLink", None), AsyncList(list_of_elem) + + async def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = await self._client._pipeline.run( # type: ignore # pylint: disable=protected-access + request, stream=False, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response, error_format=ARMErrorFormat) + + return pipeline_response + + return AsyncItemPaged(get_next, extract_data) + @distributed_trace def get_odata_multiple_pages( self, diff --git a/test/azure/version-tolerant/Expected/AcceptanceTests/CustomPollerPagerVersionTolerant/custompollerpagerversiontolerant/operations/_operations.py b/test/azure/version-tolerant/Expected/AcceptanceTests/CustomPollerPagerVersionTolerant/custompollerpagerversiontolerant/operations/_operations.py index c8c735ed34d..1251aac919f 100644 --- a/test/azure/version-tolerant/Expected/AcceptanceTests/CustomPollerPagerVersionTolerant/custompollerpagerversiontolerant/operations/_operations.py +++ b/test/azure/version-tolerant/Expected/AcceptanceTests/CustomPollerPagerVersionTolerant/custompollerpagerversiontolerant/operations/_operations.py @@ -179,6 +179,20 @@ def build_paging_duplicate_params_request(*, filter: Optional[str] = None, **kwa return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) +def build_paging_page_with_max_page_size_request(**kwargs: Any) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/paging/maxPageSize" + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, headers=_headers, **kwargs) + + def build_paging_get_odata_multiple_pages_request( *, client_request_id: Optional[str] = None, maxresults: Optional[int] = None, timeout: int = 30, **kwargs: Any ) -> HttpRequest: @@ -1013,6 +1027,75 @@ def get_next(next_link=None): return ItemPaged(get_next, extract_data) + @distributed_trace + def page_with_max_page_size(self, **kwargs: Any) -> Iterable[JSON]: + """Paging with max page size. We don't want to. + + :return: An iterator like instance of JSON object + :rtype: ~azure.core.paging.ItemPaged[JSON] + :raises ~azure.core.exceptions.HttpResponseError: + + Example: + .. code-block:: python + + # response body for status code(s): 200 + response == { + "properties": { + "id": 0, # Optional. + "name": "str" # Optional. + } + } + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls = kwargs.pop("cls", None) # type: ClsType[JSON] + + error_map = {401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError} + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + request = build_paging_page_with_max_page_size_request( + headers=_headers, + params=_params, + ) + request.url = self._client.format_url(request.url) # type: ignore + + else: + # make call to next link with the client's api-version + _parsed_next_link = urlparse(next_link) + _next_request_params = case_insensitive_dict(parse_qs(_parsed_next_link.query)) + _next_request_params["api-version"] = self._config.api_version + request = HttpRequest("GET", urljoin(next_link, _parsed_next_link.path), params=_next_request_params) + request.url = self._client.format_url(request.url) # type: ignore + + return request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = deserialized["values"] + if cls: + list_of_elem = cls(list_of_elem) + return deserialized.get("nextLink", None), iter(list_of_elem) + + def get_next(next_link=None): + request = prepare_request(next_link) + + pipeline_response = self._client._pipeline.run( # type: ignore # pylint: disable=protected-access + request, stream=False, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response, error_format=ARMErrorFormat) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + @distributed_trace def get_odata_multiple_pages( self, From a5b3ffdd436e24089e362eda59db3e301b88c63c Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Wed, 22 Jun 2022 15:02:44 -0700 Subject: [PATCH 7/7] update changelog --- ChangeLog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index f39a9ce0774..54754bbecdc 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -7,7 +7,7 @@ | `@autorest/core` | `3.8.1` | | `@autorest/modelerfour` | `4.23.5` | | `azure-core` dep of generated code | `1.24.0` | -| `isodate` dep of generated code | `1.24.0` | +| `isodate` dep of generated code | `0.6.1` | | `msrest` dep of generated code (If generating legacy code) | `0.7.1` | | `azure-mgmt-core` dep of generated code (If generating mgmt plane code) | `1.3.0` |