Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-azure-core for
openSUSE:Factory checked in at 2024-02-11 15:46:00
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-azure-core (Old)
and /work/SRC/openSUSE:Factory/.python-azure-core.new.1815 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-azure-core"
Sun Feb 11 15:46:00 2024 rev:47 rq:1145587 version:1.30.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-azure-core/python-azure-core.changes
2024-01-24 19:06:27.649939306 +0100
+++
/work/SRC/openSUSE:Factory/.python-azure-core.new.1815/python-azure-core.changes
2024-02-11 15:46:01.443645595 +0100
@@ -1,0 +2,8 @@
+Wed Feb 7 09:36:55 UTC 2024 - John Paul Adrian Glaubitz
<[email protected]>
+
+- New upstream release
+ + Version 1.30.0
+ + For detailed information about changes see the
+ CHANGELOG.md file provided with this package
+
+-------------------------------------------------------------------
Old:
----
azure-core-1.29.7.tar.gz
New:
----
azure-core-1.30.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-azure-core.spec ++++++
--- /var/tmp/diff_new_pack.zquS64/_old 2024-02-11 15:46:01.963664292 +0100
+++ /var/tmp/diff_new_pack.zquS64/_new 2024-02-11 15:46:01.963664292 +0100
@@ -21,7 +21,7 @@
%define skip_python2 1
%endif
Name: python-azure-core
-Version: 1.29.7
+Version: 1.30.0
Release: 0
Summary: Microsoft Azure Core Library for Python
License: MIT
++++++ azure-core-1.29.7.tar.gz -> azure-core-1.30.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure-core-1.29.7/CHANGELOG.md
new/azure-core-1.30.0/CHANGELOG.md
--- old/azure-core-1.29.7/CHANGELOG.md 2024-01-18 16:39:24.000000000 +0100
+++ new/azure-core-1.30.0/CHANGELOG.md 2024-01-31 22:55:17.000000000 +0100
@@ -1,5 +1,12 @@
# Release History
+## 1.30.0 (2024-02-01)
+
+### Features Added
+
+- Support tuple input for file values to `azure.core.rest.HttpRequest` #33948
+- Support tuple input to `files` with duplicate field names
`azure.core.rest.HttpRequest` #34021
+
## 1.29.7 (2024-01-18)
### Other Changes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure-core-1.29.7/PKG-INFO
new/azure-core-1.30.0/PKG-INFO
--- old/azure-core-1.29.7/PKG-INFO 2024-01-18 16:40:05.470854300 +0100
+++ new/azure-core-1.30.0/PKG-INFO 2024-01-31 22:56:05.936185100 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: azure-core
-Version: 1.29.7
+Version: 1.30.0
Summary: Microsoft Azure Core Library for Python
Home-page:
https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/core/azure-core
Author: Microsoft Corporation
@@ -286,6 +286,13 @@
# Release History
+## 1.30.0 (2024-02-01)
+
+### Features Added
+
+- Support tuple input for file values to `azure.core.rest.HttpRequest` #33948
+- Support tuple input to `files` with duplicate field names
`azure.core.rest.HttpRequest` #34021
+
## 1.29.7 (2024-01-18)
### Other Changes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure-core-1.29.7/azure/core/_version.py
new/azure-core-1.30.0/azure/core/_version.py
--- old/azure-core-1.29.7/azure/core/_version.py 2024-01-18
16:39:24.000000000 +0100
+++ new/azure-core-1.30.0/azure/core/_version.py 2024-01-31
22:55:17.000000000 +0100
@@ -9,4 +9,4 @@
# regenerated.
# --------------------------------------------------------------------------
-VERSION = "1.29.7"
+VERSION = "1.30.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure-core-1.29.7/azure/core/pipeline/transport/_aiohttp.py
new/azure-core-1.30.0/azure/core/pipeline/transport/_aiohttp.py
--- old/azure-core-1.29.7/azure/core/pipeline/transport/_aiohttp.py
2024-01-18 16:39:24.000000000 +0100
+++ new/azure-core-1.30.0/azure/core/pipeline/transport/_aiohttp.py
2024-01-31 22:55:17.000000000 +0100
@@ -56,7 +56,7 @@
from ._base import HttpRequest
from ._base_async import AsyncHttpTransport, AsyncHttpResponse,
_ResponseStopIteration
-from ...utils._pipeline_transport_rest_shared import _aiohttp_body_helper
+from ...utils._pipeline_transport_rest_shared import _aiohttp_body_helper,
get_file_items
from .._tools import is_rest as _is_rest
from .._tools_async import (
handle_no_stream_rest_response as _handle_no_stream_rest_response,
@@ -180,7 +180,7 @@
"""
if request.files:
form_data = aiohttp.FormData(request.data or {})
- for form_file, data in request.files.items():
+ for form_file, data in get_file_items(request.files):
content_type = data[2] if len(data) > 2 else None
try:
form_data.add_field(form_file, data[1], filename=data[0],
content_type=content_type)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure-core-1.29.7/azure/core/pipeline/transport/_base.py
new/azure-core-1.30.0/azure/core/pipeline/transport/_base.py
--- old/azure-core-1.29.7/azure/core/pipeline/transport/_base.py
2024-01-18 16:39:24.000000000 +0100
+++ new/azure-core-1.30.0/azure/core/pipeline/transport/_base.py
2024-01-31 22:55:17.000000000 +0100
@@ -76,6 +76,7 @@
if TYPE_CHECKING:
# We need a transport to define a pipeline, this "if" avoid a circular
import
from azure.core.pipeline import Pipeline
+ from azure.core.rest._helpers import FileContent
_LOGGER = logging.getLogger(__name__)
@@ -249,7 +250,7 @@
self.data = value
@staticmethod
- def _format_data(data: Union[str, IO]) -> Union[Tuple[None, str],
Tuple[Optional[str], IO, str]]:
+ def _format_data(data: Union[str, IO]) -> Union[Tuple[Optional[str], str],
Tuple[Optional[str], FileContent, str]]:
"""Format field data according to whether it is a stream or
a string for a form-data request.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure-core-1.29.7/azure/core/rest/_helpers.py
new/azure-core-1.30.0/azure/core/rest/_helpers.py
--- old/azure-core-1.29.7/azure/core/rest/_helpers.py 2024-01-18
16:39:24.000000000 +0100
+++ new/azure-core-1.30.0/azure/core/rest/_helpers.py 2024-01-31
22:55:17.000000000 +0100
@@ -52,6 +52,7 @@
_prepare_multipart_body_helper,
_serialize_request,
_format_data_helper,
+ get_file_items,
)
if TYPE_CHECKING:
@@ -66,7 +67,15 @@
ParamsType = Mapping[str, Union[PrimitiveData, Sequence[PrimitiveData]]]
FileContent = Union[str, bytes, IO[str], IO[bytes]]
-FileType = Tuple[Optional[str], FileContent]
+
+FileType = Union[
+ # file (or bytes)
+ FileContent,
+ # (filename, file (or bytes))
+ Tuple[Optional[str], FileContent],
+ # (filename, file (or bytes), content_type)
+ Tuple[Optional[str], FileContent, Optional[str]],
+]
FilesType = Union[Mapping[str, FileType], Sequence[Tuple[str, FileType]]]
@@ -104,9 +113,9 @@
return default_headers, body
-def set_multipart_body(files):
- formatted_files = {f: _format_data_helper(d) for f, d in files.items() if
d is not None}
- return {}, formatted_files
+def set_multipart_body(files: FilesType):
+ formatted_files = [(f, _format_data_helper(d)) for f, d in
get_file_items(files) if d is not None]
+ return {}, dict(formatted_files) if isinstance(files, Mapping) else
formatted_files
def set_xml_body(content):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure-core-1.29.7/azure/core/utils/_pipeline_transport_rest_shared.py
new/azure-core-1.30.0/azure/core/utils/_pipeline_transport_rest_shared.py
--- old/azure-core-1.29.7/azure/core/utils/_pipeline_transport_rest_shared.py
2024-01-18 16:39:24.000000000 +0100
+++ new/azure-core-1.30.0/azure/core/utils/_pipeline_transport_rest_shared.py
2024-01-31 22:55:17.000000000 +0100
@@ -5,6 +5,7 @@
# license information.
# --------------------------------------------------------------------------
from __future__ import absolute_import
+from collections.abc import Mapping
from io import BytesIO
from email.message import Message
@@ -50,6 +51,7 @@
from azure.core.pipeline.transport._base import (
_HttpResponseBase as PipelineTransportHttpResponseBase,
)
+ from azure.core.rest._helpers import FilesType, FileType, FileContent
binary_type = str
@@ -333,7 +335,7 @@
return responses
-def _format_data_helper(data: Union[str, IO]) -> Union[Tuple[None, str],
Tuple[Optional[str], IO, str]]:
+def _format_data_helper(data: "FileType") -> Union[Tuple[Optional[str], str],
Tuple[Optional[str], "FileContent", str]]:
"""Helper for _format_data.
Format field data according to whether it is a stream or
@@ -344,16 +346,34 @@
:rtype: tuple[str, IO, str] or tuple[None, str]
:return: A tuple of (data name, data IO, "application/octet-stream") or
(None, data str)
"""
- if hasattr(data, "read"):
- data = cast(IO, data)
- data_name = None
- try:
- if data.name[0] != "<" and data.name[-1] != ">":
- data_name = os.path.basename(data.name)
- except (AttributeError, TypeError):
- pass
- return (data_name, data, "application/octet-stream")
- return (None, cast(str, data))
+ content_type: Optional[str] = None
+ filename: Optional[str] = None
+ if isinstance(data, tuple):
+ if len(data) == 2:
+ # Filename and file bytes are included
+ filename, file_bytes = cast(Tuple[Optional[str], "FileContent"],
data)
+ elif len(data) == 3:
+ # Filename, file object, and content_type are included
+ filename, file_bytes, content_type = cast(Tuple[Optional[str],
"FileContent", str], data)
+ else:
+ raise ValueError(
+ "Unexpected data format. Expected file, or tuple of (filename,
file_bytes) or "
+ "(filename, file_bytes, content_type)."
+ )
+ else:
+ # here we just get the file content
+ if hasattr(data, "read"):
+ data = cast(IO, data)
+ try:
+ if data.name[0] != "<" and data.name[-1] != ">":
+ filename = os.path.basename(data.name)
+ except (AttributeError, TypeError):
+ pass
+ content_type = "application/octet-stream"
+ file_bytes = data
+ if content_type:
+ return (filename, file_bytes, content_type)
+ return (filename, cast(str, file_bytes))
def _aiohttp_body_helper(
@@ -390,3 +410,11 @@
response._decompressed_content = True
return response._content
return response._content
+
+
+def get_file_items(files: "FilesType") -> Sequence[Tuple[str, "FileType"]]:
+ if isinstance(files, Mapping):
+ # casting because ItemsView technically isn't a Sequence, even
+ # though realistically it is ordered python 3.7 and after
+ return cast(Sequence[Tuple[str, "FileType"]], files.items())
+ return files
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure-core-1.29.7/azure_core.egg-info/PKG-INFO
new/azure-core-1.30.0/azure_core.egg-info/PKG-INFO
--- old/azure-core-1.29.7/azure_core.egg-info/PKG-INFO 2024-01-18
16:40:05.000000000 +0100
+++ new/azure-core-1.30.0/azure_core.egg-info/PKG-INFO 2024-01-31
22:56:05.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: azure-core
-Version: 1.29.7
+Version: 1.30.0
Summary: Microsoft Azure Core Library for Python
Home-page:
https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/core/azure-core
Author: Microsoft Corporation
@@ -286,6 +286,13 @@
# Release History
+## 1.30.0 (2024-02-01)
+
+### Features Added
+
+- Support tuple input for file values to `azure.core.rest.HttpRequest` #33948
+- Support tuple input to `files` with duplicate field names
`azure.core.rest.HttpRequest` #34021
+
## 1.29.7 (2024-01-18)
### Other Changes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure-core-1.29.7/tests/async_tests/test_rest_http_request_async.py
new/azure-core-1.30.0/tests/async_tests/test_rest_http_request_async.py
--- old/azure-core-1.29.7/tests/async_tests/test_rest_http_request_async.py
2024-01-18 16:39:24.000000000 +0100
+++ new/azure-core-1.30.0/tests/async_tests/test_rest_http_request_async.py
2024-01-31 22:55:17.000000000 +0100
@@ -9,6 +9,7 @@
import pytest
from azure.core.rest import HttpRequest
import collections.abc
+from utils import NamedIo
@pytest.fixture
@@ -94,3 +95,40 @@
await assert_aiterator_body(request, b"test 123")
# in this case, request._data is what we end up passing to the requests
transport
assert isinstance(request._data, collections.abc.AsyncIterable)
+
+
[email protected]
+async def test_multipart_tuple_input_multiple_same_name(client):
+ request = HttpRequest(
+ "POST",
+ url="/multipart/tuple-input-multiple-same-name",
+ files=[
+ ("file", ("firstFileName", NamedIo("firstFile"), "image/pdf")),
+ ("file", ("secondFileName", NamedIo("secondFile"), "image/png")),
+ ],
+ )
+ (await client.send_request(request)).raise_for_status()
+
+
[email protected]
+async def
test_multipart_tuple_input_multiple_same_name_with_tuple_file_value(client):
+ request = HttpRequest(
+ "POST",
+ url="/multipart/tuple-input-multiple-same-name-with-tuple-file-value",
+ files=[("images", ("foo.png", NamedIo("notMyName.pdf"), "image/png")),
("images", NamedIo("foo.png"))],
+ )
+ (await client.send_request(request)).raise_for_status()
+
+
[email protected]
+async def test_data_and_file_input_same_name(client):
+ request = HttpRequest(
+ "POST",
+ url="/multipart/data-and-file-input-same-name",
+ data={"message": "Hello, world!"},
+ files=[
+ ("file", ("firstFileName", NamedIo("firstFile"), "image/pdf")),
+ ("file", ("secondFileName", NamedIo("secondFile"), "image/png")),
+ ],
+ )
+ (await client.send_request(request)).raise_for_status()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure-core-1.29.7/tests/test_rest_http_request.py
new/azure-core-1.30.0/tests/test_rest_http_request.py
--- old/azure-core-1.29.7/tests/test_rest_http_request.py 2024-01-18
16:39:24.000000000 +0100
+++ new/azure-core-1.30.0/tests/test_rest_http_request.py 2024-01-31
22:55:17.000000000 +0100
@@ -23,6 +23,7 @@
from azure.core.pipeline._tools import is_rest
from rest_client import MockRestClient
from azure.core import PipelineClient
+from utils import NamedIo
@pytest.fixture
@@ -515,29 +516,95 @@
HttpRequest(method="PUT", url="http://www.example.com",
content=data_stream) # ensure we can make this HttpRequest
-# NOTE: For files, we don't allow list of tuples yet, just dict. Will
uncomment when we add this capability
-# def test_multipart_multiple_files_single_input_content():
-# files = [
-# ("file", io.BytesIO(b"<file content 1>")),
-# ("file", io.BytesIO(b"<file content 2>")),
-# ]
-# request = HttpRequest("POST", url="http://example.org", files=files)
-# assert request.headers == {
-# "Content-Length": "271",
-# "Content-Type": "multipart/form-data; boundary=+++",
-# }
-# assert request.content == b"".join(
-# [
-# b"--+++\r\n",
-# b'Content-Disposition: form-data; name="file";
filename="upload"\r\n',
-# b"Content-Type: application/octet-stream\r\n",
-# b"\r\n",
-# b"<file content 1>\r\n",
-# b"--+++\r\n",
-# b'Content-Disposition: form-data; name="file";
filename="upload"\r\n',
-# b"Content-Type: application/octet-stream\r\n",
-# b"\r\n",
-# b"<file content 2>\r\n",
-# b"--+++--\r\n",
-# ]
-# )
[email protected]
+def filebytes():
+ file_path = os.path.join(os.path.dirname(__file__), "./conftest.py")
+ return open(file_path, "rb")
+
+
+def test_multipart_bytes(filebytes):
+ request = HttpRequest("POST", url="http://example.org", files={"file":
filebytes})
+
+ assert request.content == {"file": ("conftest.py", filebytes,
"application/octet-stream")}
+
+
+def test_multipart_filename_and_bytes(filebytes):
+ files = ("specifiedFileName", filebytes)
+ request = HttpRequest("POST", url="http://example.org", files={"file":
files})
+
+ assert request.content == {"file": ("specifiedFileName", filebytes)}
+
+
+def test_multipart_filename_and_bytes_and_content_type(filebytes):
+ files = ("specifiedFileName", filebytes, "application/json")
+ request = HttpRequest("POST", url="http://example.org", files={"file":
files})
+
+ assert request.content == {"file": ("specifiedFileName", filebytes,
"application/json")}
+
+
+def test_multipart_incorrect_tuple_entry(filebytes):
+ files = ("specifiedFileName", filebytes, "application/json", "extra")
+ with pytest.raises(ValueError):
+ HttpRequest("POST", url="http://example.org", files={"file": files})
+
+
+def test_multipart_tuple_input_single(filebytes):
+ request = HttpRequest("POST", url="http://example.org", files=[("file",
filebytes)])
+
+ assert request.content == [("file", ("conftest.py", filebytes,
"application/octet-stream"))]
+
+
+def test_multipart_tuple_input_multiple(filebytes):
+ request = HttpRequest("POST", url="http://example.org", files=[("file",
filebytes), ("file2", filebytes)])
+
+ assert request.content == [
+ ("file", ("conftest.py", filebytes, "application/octet-stream")),
+ ("file2", ("conftest.py", filebytes, "application/octet-stream")),
+ ]
+
+
+def
test_multipart_tuple_input_multiple_with_filename_and_content_type(filebytes):
+ request = HttpRequest(
+ "POST",
+ url="http://example.org",
+ files=[("file", ("first file", filebytes, "image/pdf")), ("file2",
("second file", filebytes, "image/png"))],
+ )
+
+ assert request.content == [
+ ("file", ("first file", filebytes, "image/pdf")),
+ ("file2", ("second file", filebytes, "image/png")),
+ ]
+
+
+def test_multipart_tuple_input_multiple_same_name(client):
+ request = HttpRequest(
+ "POST",
+ url="/multipart/tuple-input-multiple-same-name",
+ files=[
+ ("file", ("firstFileName", NamedIo("firstFile"), "image/pdf")),
+ ("file", ("secondFileName", NamedIo("secondFile"), "image/png")),
+ ],
+ )
+ client.send_request(request).raise_for_status()
+
+
+def
test_multipart_tuple_input_multiple_same_name_with_tuple_file_value(client):
+ request = HttpRequest(
+ "POST",
+ url="/multipart/tuple-input-multiple-same-name-with-tuple-file-value",
+ files=[("images", ("foo.png", NamedIo("notMyName.pdf"), "image/png")),
("images", NamedIo("foo.png"))],
+ )
+ client.send_request(request).raise_for_status()
+
+
+def test_data_and_file_input_same_name(client):
+ request = HttpRequest(
+ "POST",
+ url="/multipart/data-and-file-input-same-name",
+ data={"message": "Hello, world!"},
+ files=[
+ ("file", ("firstFileName", NamedIo("firstFile"), "image/pdf")),
+ ("file", ("secondFileName", NamedIo("secondFile"), "image/png")),
+ ],
+ )
+ client.send_request(request).raise_for_status()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure-core-1.29.7/tests/testserver_tests/coretestserver/coretestserver/test_routes/multipart.py
new/azure-core-1.30.0/tests/testserver_tests/coretestserver/coretestserver/test_routes/multipart.py
---
old/azure-core-1.29.7/tests/testserver_tests/coretestserver/coretestserver/test_routes/multipart.py
2024-01-18 16:39:24.000000000 +0100
+++
new/azure-core-1.30.0/tests/testserver_tests/coretestserver/coretestserver/test_routes/multipart.py
2024-01-31 22:55:17.000000000 +0100
@@ -4,7 +4,6 @@
# Licensed under the MIT License. See LICENSE.txt in the project root for
# license information.
# -------------------------------------------------------------------------
-from copy import copy
from flask import (
Response,
Blueprint,
@@ -147,3 +146,50 @@
body_as_str.encode("ascii"),
content_type="multipart/mixed;
boundary=batchresponse_66925647-d0cb-4109-b6d3-28efe3e1e5ed",
)
+
+
+@multipart_api.route("/tuple-input-multiple-same-name", methods=["POST"])
+def tuple_input_multiple_same_name():
+ assert_with_message("content type", multipart_header_start,
request.content_type[: len(multipart_header_start)])
+
+ files = request.files.getlist("file")
+ assert_with_message("num files", 2, len(files))
+
+ file1 = files[0]
+ assert_with_message("file content type", "image/pdf", file1.content_type)
+ assert_with_message("filename", "firstFileName", file1.filename)
+
+ file2 = files[1]
+ assert_with_message("file content type", "image/png", file2.content_type)
+ assert_with_message("filename", "secondFileName", file2.filename)
+ return Response(status=200)
+
+
+@multipart_api.route("/tuple-input-multiple-same-name-with-tuple-file-value",
methods=["POST"])
+def test_input_multiple_same_name_with_tuple_file_value():
+ assert_with_message("content type", multipart_header_start,
request.content_type[: len(multipart_header_start)])
+
+ images = request.files.getlist("images")
+ assert_with_message("num images", 2, len(images))
+
+ tuple_image = images[0]
+ assert_with_message("image content type", "image/png",
tuple_image.content_type)
+ assert_with_message("filename", "foo.png", tuple_image.filename)
+
+ single_image = images[1]
+ assert_with_message("file content type", "application/octet-stream",
single_image.content_type)
+ assert_with_message("filename", "foo.png", single_image.filename)
+ return Response(status=200)
+
+
+@multipart_api.route("/data-and-file-input-same-name", methods=["POST"])
+def data_and_file_input_same_name():
+ assert_with_message("content type", multipart_header_start,
request.content_type[: len(multipart_header_start)])
+
+ # use call to this function to check files
+ tuple_input_multiple_same_name()
+
+ assert_with_message("data items num", 1, len(request.form.keys()))
+ assert_with_message("message", "Hello, world!", request.form["message"])
+
+ return Response(status=200)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure-core-1.29.7/tests/utils.py
new/azure-core-1.30.0/tests/utils.py
--- old/azure-core-1.29.7/tests/utils.py 2024-01-18 16:39:24.000000000
+0100
+++ new/azure-core-1.30.0/tests/utils.py 2024-01-31 22:55:17.000000000
+0100
@@ -5,6 +5,7 @@
# -------------------------------------------------------------------------
import pytest
import types
+import io
############################## LISTS USED TO PARAMETERIZE TESTS
##############################
from azure.core.rest import HttpRequest as RestHttpRequest
@@ -172,3 +173,9 @@
if not attr in vars(old_response):
with pytest.raises(AttributeError):
setattr(response, attr, "new_value")
+
+
+class NamedIo(io.BytesIO):
+ def __init__(self, name: str, *args, **kwargs):
+ super(NamedIo, self).__init__(*args, **kwargs)
+ self.name = name