Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-azure-storage-file-share for
openSUSE:Factory checked in at 2026-05-15 23:56:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-azure-storage-file-share (Old)
and /work/SRC/openSUSE:Factory/.python-azure-storage-file-share.new.1966
(New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-azure-storage-file-share"
Fri May 15 23:56:12 2026 rev:35 rq:1353390 version:12.25.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-azure-storage-file-share/python-azure-storage-file-share.changes
2026-05-05 17:58:15.506938707 +0200
+++
/work/SRC/openSUSE:Factory/.python-azure-storage-file-share.new.1966/python-azure-storage-file-share.changes
2026-05-15 23:58:13.936771877 +0200
@@ -1,0 +2,9 @@
+Fri May 15 09:41:20 UTC 2026 - John Paul Adrian Glaubitz
<[email protected]>
+
+- New upstream release
+ + Version 12.25.0
+ + For detailed information about changes see the
+ CHANGELOG.md file provided with this package
+- Remove temporary version override
+
+-------------------------------------------------------------------
Old:
----
azure_storage_file_share-12.25.0b1.tar.gz
New:
----
azure_storage_file_share-12.25.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-azure-storage-file-share.spec ++++++
--- /var/tmp/diff_new_pack.L3lKHT/_old 2026-05-15 23:58:15.020816501 +0200
+++ /var/tmp/diff_new_pack.L3lKHT/_new 2026-05-15 23:58:15.020816501 +0200
@@ -16,17 +16,15 @@
#
-%define realversion 12.25.0b1
-
%{?sle15_python_module_pythons}
Name: python-azure-storage-file-share
-Version: 12.25.0~b1
+Version: 12.25.0
Release: 0
Summary: Azure Storage File Share client library for Python
License: MIT
Group: Development/Languages/Python
URL: https://github.com/Azure/azure-sdk-for-python
-Source:
https://files.pythonhosted.org/packages/source/a/azure_storage_file_share/azure_storage_file_share-%{realversion}.tar.gz
+Source:
https://files.pythonhosted.org/packages/source/a/azure_storage_file_share/azure_storage_file_share-%{version}.tar.gz
BuildRequires: %{python_module azure-nspkg >= 3.0.0}
BuildRequires: %{python_module azure-storage-nspkg >= 3.0.0}
BuildRequires: %{python_module pip}
@@ -63,7 +61,7 @@
diagnostic share, and Dev/Test/Debug tools
%prep
-%setup -q -n azure_storage_file_share-%{realversion}
+%setup -q -n azure_storage_file_share-%{version}
%build
%pyproject_wheel
++++++ azure_storage_file_share-12.25.0b1.tar.gz ->
azure_storage_file_share-12.25.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_storage_file_share-12.25.0b1/CHANGELOG.md
new/azure_storage_file_share-12.25.0/CHANGELOG.md
--- old/azure_storage_file_share-12.25.0b1/CHANGELOG.md 2026-01-27
15:11:20.000000000 +0100
+++ new/azure_storage_file_share-12.25.0/CHANGELOG.md 2026-05-15
02:57:20.000000000 +0200
@@ -1,5 +1,29 @@
# Release History
+## 12.25.0 (2026-05-14)
+
+### Features Added
+- Stable release of features from 12.25.0b1
+
+### Bugs Fixed
+- Fixed various issues with configuring logging via `logging_enable` and
`logging_body` keywords on a per-request
+basis and with retries. Prior to this fix logging may have not behaved as
expected, especially on retries.
+- Fix a potential memory leak caused by improper exception handling that could
occur under rare circumstances.
+
+## 12.26.0b1 (2026-04-01)
+
+### Features Added
+- Added support for service version 2026-06-06.
+- Added support for the keyword `file_property_semantics` in `ShareClient`'s
`create_directory` and `DirectoryClient`'s
+`create_directory` APIs, which specifies permissions to be configured upon
directory creation.
+- Added support for the keyword `data` to `FileClient`'s `create_file` API,
which specifies the
+optional initial data to be uploaded (up to 4MB).
+- Added support for connection strings and `account_url`s to accept URLs with
`-ipv6` and `-dualstack` suffixes
+for `ShareClient`, `ShareDirectoryClient`, and `ShareFileClient`.
+
+### Other Changes
+- Consolidated the behavior of `max_concurrency=None` by defaulting to the
shared `DEFAULT_MAX_CONCURRENCY` constant.
+
## 12.25.0b1 (2026-01-27)
### Features Added
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_storage_file_share-12.25.0b1/PKG-INFO
new/azure_storage_file_share-12.25.0/PKG-INFO
--- old/azure_storage_file_share-12.25.0b1/PKG-INFO 2026-01-27
15:36:09.850140300 +0100
+++ new/azure_storage_file_share-12.25.0/PKG-INFO 2026-05-15
03:20:30.429763600 +0200
@@ -1,13 +1,13 @@
Metadata-Version: 2.4
Name: azure-storage-file-share
-Version: 12.25.0b1
+Version: 12.25.0
Summary: Microsoft Azure Azure File Share Storage Client Library for Python
Home-page:
https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/storage/azure-storage-file-share
Author: Microsoft Corporation
Author-email: [email protected]
License: MIT License
Keywords: azure,azure sdk
-Classifier: Development Status :: 4 - Beta
+Classifier: Development Status :: 5 - Production/Stable
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3
@@ -60,7 +60,7 @@
## Getting started
### Prerequisites
-* Python 3.9 or later is required to use this package. For more details,
please read our page on [Azure SDK for Python version support
policy](https://github.com/Azure/azure-sdk-for-python/wiki/Azure-SDKs-Python-version-support-policy).
+* Python 3.9 or later is required to use this package. For more details,
please read our page on [Azure SDK for Python version support
policy](https://github.com/Azure/azure-sdk-for-python/blob/main/doc/python_version_support_policy.md).
* You must have an [Azure subscription](https://azure.microsoft.com/free/) and
an
[Azure storage
account](https://learn.microsoft.com/azure/storage/common/storage-account-overview)
to use this package.
@@ -172,7 +172,7 @@
The Azure Storage File Share client library for Python allows you to interact
with each of these components through the
use of a dedicated client object.
-### Async Clients
+### Async Clients
This library includes a complete async API supported on Python 3.5+. To use
it, you must
first install an async transport, such as
[aiohttp](https://pypi.org/project/aiohttp/).
See
@@ -332,7 +332,7 @@
* __connection_timeout__ (int): The number of seconds the client will wait to
establish a connection to the server.
Defaults to 20 seconds.
* __read_timeout__ (int): The number of seconds the client will wait, between
consecutive read operations, for a
-response from the server. This is a socket level timeout and is not affected
by overall data size. Client-side read
+response from the server. This is a socket level timeout and is not affected
by overall data size. Client-side read
timeouts will be automatically retried. Defaults to 60 seconds.
* __transport__ (Any): User-provided transport to send the HTTP request.
@@ -437,6 +437,30 @@
# Release History
+## 12.25.0 (2026-05-14)
+
+### Features Added
+- Stable release of features from 12.25.0b1
+
+### Bugs Fixed
+- Fixed various issues with configuring logging via `logging_enable` and
`logging_body` keywords on a per-request
+basis and with retries. Prior to this fix logging may have not behaved as
expected, especially on retries.
+- Fix a potential memory leak caused by improper exception handling that could
occur under rare circumstances.
+
+## 12.26.0b1 (2026-04-01)
+
+### Features Added
+- Added support for service version 2026-06-06.
+- Added support for the keyword `file_property_semantics` in `ShareClient`'s
`create_directory` and `DirectoryClient`'s
+`create_directory` APIs, which specifies permissions to be configured upon
directory creation.
+- Added support for the keyword `data` to `FileClient`'s `create_file` API,
which specifies the
+optional initial data to be uploaded (up to 4MB).
+- Added support for connection strings and `account_url`s to accept URLs with
`-ipv6` and `-dualstack` suffixes
+for `ShareClient`, `ShareDirectoryClient`, and `ShareFileClient`.
+
+### Other Changes
+- Consolidated the behavior of `max_concurrency=None` by defaulting to the
shared `DEFAULT_MAX_CONCURRENCY` constant.
+
## 12.25.0b1 (2026-01-27)
### Features Added
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_storage_file_share-12.25.0b1/README.md
new/azure_storage_file_share-12.25.0/README.md
--- old/azure_storage_file_share-12.25.0b1/README.md 2026-01-27
15:11:20.000000000 +0100
+++ new/azure_storage_file_share-12.25.0/README.md 2026-05-15
02:57:20.000000000 +0200
@@ -17,7 +17,7 @@
## Getting started
### Prerequisites
-* Python 3.9 or later is required to use this package. For more details,
please read our page on [Azure SDK for Python version support
policy](https://github.com/Azure/azure-sdk-for-python/wiki/Azure-SDKs-Python-version-support-policy).
+* Python 3.9 or later is required to use this package. For more details,
please read our page on [Azure SDK for Python version support
policy](https://github.com/Azure/azure-sdk-for-python/blob/main/doc/python_version_support_policy.md).
* You must have an [Azure subscription](https://azure.microsoft.com/free/) and
an
[Azure storage
account](https://learn.microsoft.com/azure/storage/common/storage-account-overview)
to use this package.
@@ -129,7 +129,7 @@
The Azure Storage File Share client library for Python allows you to interact
with each of these components through the
use of a dedicated client object.
-### Async Clients
+### Async Clients
This library includes a complete async API supported on Python 3.5+. To use
it, you must
first install an async transport, such as
[aiohttp](https://pypi.org/project/aiohttp/).
See
@@ -289,7 +289,7 @@
* __connection_timeout__ (int): The number of seconds the client will wait to
establish a connection to the server.
Defaults to 20 seconds.
* __read_timeout__ (int): The number of seconds the client will wait, between
consecutive read operations, for a
-response from the server. This is a socket level timeout and is not affected
by overall data size. Client-side read
+response from the server. This is a socket level timeout and is not affected
by overall data size. Client-side read
timeouts will be automatically retried. Defaults to 60 seconds.
* __transport__ (Any): User-provided transport to send the HTTP request.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_download.py
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_download.py
--- old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_download.py
2026-01-27 15:11:20.000000000 +0100
+++ new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_download.py
2026-05-15 02:57:20.000000000 +0200
@@ -17,6 +17,7 @@
from azure.core.tracing.common import with_current_context
from ._shared.request_handlers import validate_and_format_range_headers
from ._shared.response_handlers import parse_length_from_content_range,
process_storage_error
+from ._shared.constants import DEFAULT_MAX_CONCURRENCY
if TYPE_CHECKING:
from ._generated.operations import FileOperations
@@ -217,7 +218,7 @@
start_range: Optional[int] = None,
end_range: Optional[int] = None,
validate_content: bool = None, # type: ignore [assignment]
- max_concurrency: int = 1,
+ max_concurrency: Optional[int] = None,
name: str = None, # type: ignore [assignment]
path: str = None, # type: ignore [assignment]
share: str = None, # type: ignore [assignment]
@@ -233,7 +234,7 @@
self._config = config
self._start_range = start_range
self._end_range = end_range
- self._max_concurrency = max_concurrency
+ self._max_concurrency = max_concurrency if max_concurrency is not None
else DEFAULT_MAX_CONCURRENCY
self._encoding = encoding
self._validate_content = validate_content
self._progress_hook = kwargs.pop('progress_hook', None)
@@ -398,7 +399,7 @@
return data.decode(self._encoding) # type: ignore [return-value]
return data
- def content_as_bytes(self, max_concurrency=1):
+ def content_as_bytes(self, max_concurrency=None):
"""DEPRECATED: Download the contents of this file.
This operation is blocking until all data is downloaded.
@@ -414,10 +415,10 @@
"content_as_bytes is deprecated, use readall instead",
DeprecationWarning
)
- self._max_concurrency = max_concurrency
+ self._max_concurrency = max_concurrency if max_concurrency is not None
else DEFAULT_MAX_CONCURRENCY
return self.readall()
- def content_as_text(self, max_concurrency=1, encoding="UTF-8"):
+ def content_as_text(self, max_concurrency=None, encoding="UTF-8"):
"""DEPRECATED: Download the contents of this file, and decode as text.
This operation is blocking until all data is downloaded.
@@ -435,7 +436,7 @@
"content_as_text is deprecated, use readall instead",
DeprecationWarning
)
- self._max_concurrency = max_concurrency
+ self._max_concurrency = max_concurrency if max_concurrency is not None
else DEFAULT_MAX_CONCURRENCY
self._encoding = encoding
return self.readall()
@@ -501,7 +502,7 @@
downloader.process_chunk(chunk)
return self.size
- def download_to_stream(self, stream, max_concurrency=1):
+ def download_to_stream(self, stream, max_concurrency=None):
"""DEPRECATED: Download the contents of this file to a stream.
This method is deprecated, use func:`readinto` instead.
@@ -519,6 +520,6 @@
"download_to_stream is deprecated, use readinto instead",
DeprecationWarning
)
- self._max_concurrency = max_concurrency
+ self._max_concurrency = max_concurrency if max_concurrency is not None
else DEFAULT_MAX_CONCURRENCY
self.readinto(stream)
return self.properties
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_file_client.py
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_file_client.py
---
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_file_client.py
2026-01-27 15:11:20.000000000 +0100
+++
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_file_client.py
2026-05-15 02:57:20.000000000 +0200
@@ -41,6 +41,7 @@
get_source_access_conditions
)
from ._shared.base_client import StorageAccountHostsMixin,
parse_connection_str, parse_query
+from ._shared.constants import DEFAULT_MAX_CONCURRENCY
from ._shared.request_handlers import add_metadata_headers, get_length
from ._shared.response_handlers import return_response_headers,
process_storage_error
from ._shared.uploads import IterStreamer, FileChunkUploader,
upload_data_chunks
@@ -594,7 +595,9 @@
"""
metadata = kwargs.pop('metadata', None)
content_settings = kwargs.pop('content_settings', None)
- max_concurrency = kwargs.pop('max_concurrency', 1)
+ max_concurrency = kwargs.pop('max_concurrency', None)
+ if max_concurrency is None:
+ max_concurrency = DEFAULT_MAX_CONCURRENCY
validate_content = kwargs.pop('validate_content', False)
progress_hook = kwargs.pop('progress_hook', None)
timeout = kwargs.pop('timeout', None)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_file_client.pyi
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_file_client.pyi
---
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_file_client.pyi
2026-01-27 15:11:20.000000000 +0100
+++
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_file_client.pyi
2026-05-15 02:57:20.000000000 +0200
@@ -150,7 +150,7 @@
metadata: Optional[Dict[str, str]] = None,
content_settings: Optional[ContentSettings] = None,
validate_content: bool = False,
- max_concurrency: int = 1,
+ max_concurrency: Optional[int] = None,
lease: Optional[Union[ShareLeaseClient, str]] = None,
progress_hook: Optional[Callable[[int, Optional[int]], None]] = None,
encoding: str = "UTF-8",
@@ -196,7 +196,7 @@
offset: Optional[int] = None,
length: Optional[int] = None,
*,
- max_concurrency: int = 1,
+ max_concurrency: Optional[int] = None,
validate_content: bool = False,
lease: Optional[Union[ShareLeaseClient, str]] = None,
progress_hook: Optional[Callable[[int, Optional[int]], None]] = None,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_shared/constants.py
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_shared/constants.py
---
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_shared/constants.py
2026-01-27 15:11:20.000000000 +0100
+++
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_shared/constants.py
2026-05-15 02:57:20.000000000 +0200
@@ -18,3 +18,5 @@
STORAGE_OAUTH_SCOPE = "https://storage.azure.com/.default"
SERVICE_HOST_BASE = "core.windows.net"
+
+DEFAULT_MAX_CONCURRENCY = 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_shared/policies.py
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_shared/policies.py
---
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_shared/policies.py
2026-01-27 15:11:20.000000000 +0100
+++
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_shared/policies.py
2026-05-15 02:57:20.000000000 +0200
@@ -188,7 +188,7 @@
class StorageLoggingPolicy(NetworkTraceLoggingPolicy):
"""A policy that logs HTTP request and response to the DEBUG logger.
- This accepts both global configuration, and per-request level with
"enable_http_logger"
+ This accepts both global configuration, and per-request level with
"logging_enable" and "logging_body"
"""
def __init__(self, logging_enable: bool = False, **kwargs) -> None:
@@ -198,9 +198,24 @@
def on_request(self, request: "PipelineRequest") -> None:
http_request = request.http_request
options = request.context.options
- self.logging_body = self.logging_body or options.pop("logging_body",
False)
- if options.pop("logging_enable", self.enable_http_logger):
- request.context["logging_enable"] = True
+
+ # Check if logging settings are already determined (from a previous
retry attempt)
+ if "logging_enable" not in request.context:
+ # First attempt - pop from options and store decision in context
+ # For logging_enable and logging_body, per-request setting will
override the global setting
+ logging_body = options.pop("logging_body", self.logging_body)
+ logging_enable = options.pop("logging_enable",
self.enable_http_logger)
+
+ # Only store in context if logging is enabled to avoid polluting
context
+ if logging_enable:
+ request.context["logging_enable"] = True
+ request.context["logging_body"] = logging_body
+ else:
+ # Retry attempt - use the settings stored in context from the
first attempt
+ logging_enable = request.context.get("logging_enable", False)
+ logging_body = request.context.get("logging_body", False)
+
+ if logging_enable:
if not _LOGGER.isEnabledFor(logging.DEBUG):
return
@@ -227,7 +242,7 @@
_LOGGER.debug(" %r: %r", header, value)
_LOGGER.debug("Request body:")
- if self.logging_body:
+ if logging_body:
_LOGGER.debug(str(http_request.body))
else:
# We don't want to log the binary data of a file upload.
@@ -236,7 +251,10 @@
_LOGGER.debug("Failed to log request: %r", err)
def on_response(self, request: "PipelineRequest", response:
"PipelineResponse") -> None:
- if response.context.pop("logging_enable", self.enable_http_logger):
+ # Logging settings should always be present in context if logging is
enabled
+ # Use .get() instead of .pop() to preserve context values for
potential retries
+ if response.context.get("logging_enable", False):
+ logging_body = response.context.get("logging_body", False)
if not _LOGGER.isEnabledFor(logging.DEBUG):
return
@@ -260,9 +278,9 @@
elif resp_content_type.startswith("image"):
_LOGGER.debug("Body contains image data.")
- if self.logging_body and resp_content_type.startswith("text"):
+ if logging_body and resp_content_type.startswith("text"):
_LOGGER.debug(response.http_response.text())
- elif self.logging_body:
+ elif logging_body:
try:
_LOGGER.debug(response.http_response.body())
except ValueError:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_shared/response_handlers.py
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_shared/response_handlers.py
---
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_shared/response_handlers.py
2026-01-27 15:11:20.000000000 +0100
+++
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_shared/response_handlers.py
2026-05-15 02:57:20.000000000 +0200
@@ -190,11 +190,15 @@
error.additional_info = additional_data
# error.args is what's surfaced on the traceback - show error message in
all cases
error.args = (error.message,)
+
try:
- # `from None` prevents us from double printing the exception
(suppresses generated layer error context)
- exec("raise error from None") # pylint: disable=exec-used # nosec
- except SyntaxError as exc:
- raise error from exc
+ # `from None` suppresses exception chaining to prevent double printing
the exception.
+ raise error from None
+ finally:
+ # Explicitly clears exception references to break circular references
+ # and allow immediate garbage collection.
+ error = None
+ storage_error = None
def parse_to_internal_user_delegation_key(service_user_delegation_key):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_version.py
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_version.py
--- old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/_version.py
2026-01-27 15:11:20.000000000 +0100
+++ new/azure_storage_file_share-12.25.0/azure/storage/fileshare/_version.py
2026-05-15 02:57:20.000000000 +0200
@@ -4,4 +4,4 @@
# license information.
# --------------------------------------------------------------------------
-VERSION = "12.25.0b1"
+VERSION = "12.25.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/aio/_download_async.py
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/aio/_download_async.py
---
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/aio/_download_async.py
2026-01-27 15:11:20.000000000 +0100
+++
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/aio/_download_async.py
2026-05-15 02:57:20.000000000 +0200
@@ -21,6 +21,7 @@
from .._download import _ChunkDownloader
from .._shared.request_handlers import validate_and_format_range_headers
from .._shared.response_handlers import parse_length_from_content_range,
process_storage_error
+from .._shared.constants import DEFAULT_MAX_CONCURRENCY
if TYPE_CHECKING:
from .._generated.aio.operations import FileOperations
@@ -178,7 +179,7 @@
start_range: Optional[int] = None,
end_range: Optional[int] = None,
validate_content: bool = None, # type: ignore [assignment]
- max_concurrency: int = 1,
+ max_concurrency: Optional[int] = None,
name: str = None, # type: ignore [assignment]
path: str = None, # type: ignore [assignment]
share: str = None, # type: ignore [assignment]
@@ -194,7 +195,7 @@
self._config = config
self._start_range = start_range
self._end_range = end_range
- self._max_concurrency = max_concurrency
+ self._max_concurrency = max_concurrency if max_concurrency is not None
else DEFAULT_MAX_CONCURRENCY
self._encoding = encoding
self._validate_content = validate_content
self._progress_hook = kwargs.pop('progress_hook', None)
@@ -358,7 +359,7 @@
return data.decode(self._encoding) # type: ignore [return-value]
return data
- async def content_as_bytes(self, max_concurrency=1):
+ async def content_as_bytes(self, max_concurrency=None):
"""DEPRECATED: Download the contents of this file.
This operation is blocking until all data is downloaded.
@@ -374,10 +375,10 @@
"content_as_bytes is deprecated, use readall instead",
DeprecationWarning
)
- self._max_concurrency = max_concurrency
+ self._max_concurrency = max_concurrency if max_concurrency is not None
else DEFAULT_MAX_CONCURRENCY
return await self.readall()
- async def content_as_text(self, max_concurrency=1, encoding="UTF-8"):
+ async def content_as_text(self, max_concurrency=None, encoding="UTF-8"):
"""DEPRECATED: Download the contents of this file, and decode as text.
This operation is blocking until all data is downloaded.
@@ -395,7 +396,7 @@
"content_as_text is deprecated, use readall instead",
DeprecationWarning
)
- self._max_concurrency = max_concurrency
+ self._max_concurrency = max_concurrency if max_concurrency is not None
else DEFAULT_MAX_CONCURRENCY
self._encoding = encoding
return await self.readall()
@@ -480,7 +481,7 @@
process_storage_error(error)
return self.size
- async def download_to_stream(self, stream, max_concurrency=1):
+ async def download_to_stream(self, stream, max_concurrency=None):
"""Download the contents of this file to a stream.
This method is deprecated, use func:`readinto` instead.
@@ -498,6 +499,6 @@
"download_to_stream is deprecated, use readinto instead",
DeprecationWarning
)
- self._max_concurrency = max_concurrency
+ self._max_concurrency = max_concurrency if max_concurrency is not None
else DEFAULT_MAX_CONCURRENCY
await self.readinto(stream)
return self.properties
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/aio/_file_client_async.py
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/aio/_file_client_async.py
---
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/aio/_file_client_async.py
2026-01-27 15:11:20.000000000 +0100
+++
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/aio/_file_client_async.py
2026-05-15 02:57:20.000000000 +0200
@@ -43,6 +43,7 @@
)
from .._shared.base_client import StorageAccountHostsMixin, parse_query
from .._shared.base_client_async import AsyncStorageAccountHostsMixin,
parse_connection_str
+from .._shared.constants import DEFAULT_MAX_CONCURRENCY
from .._shared.policies_async import ExponentialRetry
from .._shared.request_handlers import add_metadata_headers, get_length
from .._shared.response_handlers import process_storage_error,
return_response_headers
@@ -588,7 +589,9 @@
"""
metadata = kwargs.pop('metadata', None)
content_settings = kwargs.pop('content_settings', None)
- max_concurrency = kwargs.pop('max_concurrency', 1)
+ max_concurrency = kwargs.pop('max_concurrency', None)
+ if max_concurrency is None:
+ max_concurrency = DEFAULT_MAX_CONCURRENCY
validate_content = kwargs.pop('validate_content', False)
progress_hook = kwargs.pop('progress_hook', None)
timeout = kwargs.pop('timeout', None)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/aio/_file_client_async.pyi
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/aio/_file_client_async.pyi
---
old/azure_storage_file_share-12.25.0b1/azure/storage/fileshare/aio/_file_client_async.pyi
2026-01-27 15:11:20.000000000 +0100
+++
new/azure_storage_file_share-12.25.0/azure/storage/fileshare/aio/_file_client_async.pyi
2026-05-15 02:57:20.000000000 +0200
@@ -150,7 +150,7 @@
metadata: Optional[Dict[str, str]] = None,
content_settings: Optional[ContentSettings] = None,
validate_content: bool = False,
- max_concurrency: int = 1,
+ max_concurrency: Optional[int] = None,
lease: Optional[Union[ShareLeaseClient, str]] = None,
progress_hook: Optional[Callable[[int, Optional[int]],
Awaitable[None]]] = None,
encoding: str = "UTF-8",
@@ -196,7 +196,7 @@
offset: Optional[int] = None,
length: Optional[int] = None,
*,
- max_concurrency: int = 1,
+ max_concurrency: Optional[int] = None,
validate_content: bool = False,
lease: Optional[Union[ShareLeaseClient, str]] = None,
progress_hook: Optional[Callable[[int, Optional[int]],
Awaitable[None]]] = None,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/azure_storage_file_share.egg-info/PKG-INFO
new/azure_storage_file_share-12.25.0/azure_storage_file_share.egg-info/PKG-INFO
---
old/azure_storage_file_share-12.25.0b1/azure_storage_file_share.egg-info/PKG-INFO
2026-01-27 15:36:09.000000000 +0100
+++
new/azure_storage_file_share-12.25.0/azure_storage_file_share.egg-info/PKG-INFO
2026-05-15 03:20:30.000000000 +0200
@@ -1,13 +1,13 @@
Metadata-Version: 2.4
Name: azure-storage-file-share
-Version: 12.25.0b1
+Version: 12.25.0
Summary: Microsoft Azure Azure File Share Storage Client Library for Python
Home-page:
https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/storage/azure-storage-file-share
Author: Microsoft Corporation
Author-email: [email protected]
License: MIT License
Keywords: azure,azure sdk
-Classifier: Development Status :: 4 - Beta
+Classifier: Development Status :: 5 - Production/Stable
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3
@@ -60,7 +60,7 @@
## Getting started
### Prerequisites
-* Python 3.9 or later is required to use this package. For more details,
please read our page on [Azure SDK for Python version support
policy](https://github.com/Azure/azure-sdk-for-python/wiki/Azure-SDKs-Python-version-support-policy).
+* Python 3.9 or later is required to use this package. For more details,
please read our page on [Azure SDK for Python version support
policy](https://github.com/Azure/azure-sdk-for-python/blob/main/doc/python_version_support_policy.md).
* You must have an [Azure subscription](https://azure.microsoft.com/free/) and
an
[Azure storage
account](https://learn.microsoft.com/azure/storage/common/storage-account-overview)
to use this package.
@@ -172,7 +172,7 @@
The Azure Storage File Share client library for Python allows you to interact
with each of these components through the
use of a dedicated client object.
-### Async Clients
+### Async Clients
This library includes a complete async API supported on Python 3.5+. To use
it, you must
first install an async transport, such as
[aiohttp](https://pypi.org/project/aiohttp/).
See
@@ -332,7 +332,7 @@
* __connection_timeout__ (int): The number of seconds the client will wait to
establish a connection to the server.
Defaults to 20 seconds.
* __read_timeout__ (int): The number of seconds the client will wait, between
consecutive read operations, for a
-response from the server. This is a socket level timeout and is not affected
by overall data size. Client-side read
+response from the server. This is a socket level timeout and is not affected
by overall data size. Client-side read
timeouts will be automatically retried. Defaults to 60 seconds.
* __transport__ (Any): User-provided transport to send the HTTP request.
@@ -437,6 +437,30 @@
# Release History
+## 12.25.0 (2026-05-14)
+
+### Features Added
+- Stable release of features from 12.25.0b1
+
+### Bugs Fixed
+- Fixed various issues with configuring logging via `logging_enable` and
`logging_body` keywords on a per-request
+basis and with retries. Prior to this fix logging may have not behaved as
expected, especially on retries.
+- Fix a potential memory leak caused by improper exception handling that could
occur under rare circumstances.
+
+## 12.26.0b1 (2026-04-01)
+
+### Features Added
+- Added support for service version 2026-06-06.
+- Added support for the keyword `file_property_semantics` in `ShareClient`'s
`create_directory` and `DirectoryClient`'s
+`create_directory` APIs, which specifies permissions to be configured upon
directory creation.
+- Added support for the keyword `data` to `FileClient`'s `create_file` API,
which specifies the
+optional initial data to be uploaded (up to 4MB).
+- Added support for connection strings and `account_url`s to accept URLs with
`-ipv6` and `-dualstack` suffixes
+for `ShareClient`, `ShareDirectoryClient`, and `ShareFileClient`.
+
+### Other Changes
+- Consolidated the behavior of `max_concurrency=None` by defaulting to the
shared `DEFAULT_MAX_CONCURRENCY` constant.
+
## 12.25.0b1 (2026-01-27)
### Features Added
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_storage_file_share-12.25.0b1/pyproject.toml
new/azure_storage_file_share-12.25.0/pyproject.toml
--- old/azure_storage_file_share-12.25.0b1/pyproject.toml 2026-01-27
15:11:20.000000000 +0100
+++ new/azure_storage_file_share-12.25.0/pyproject.toml 2026-05-15
02:57:20.000000000 +0200
@@ -3,3 +3,7 @@
pyright = false
type_check_samples = true
black = false
+
+[tool.azure-sdk-conda]
+in_bundle = true
+bundle_name = "azure-storage"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/azure_storage_file_share-12.25.0b1/setup.py
new/azure_storage_file_share-12.25.0/setup.py
--- old/azure_storage_file_share-12.25.0b1/setup.py 2026-01-27
15:11:20.000000000 +0100
+++ new/azure_storage_file_share-12.25.0/setup.py 2026-05-15
02:57:20.000000000 +0200
@@ -45,7 +45,7 @@
url='https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/storage/azure-storage-file-share',
keywords="azure, azure sdk",
classifiers=[
- 'Development Status :: 4 - Beta',
+ 'Development Status :: 5 - Production/Stable',
'Programming Language :: Python',
'Programming Language :: Python :: 3 :: Only',
'Programming Language :: Python :: 3',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/tests/test_file.py
new/azure_storage_file_share-12.25.0/tests/test_file.py
--- old/azure_storage_file_share-12.25.0b1/tests/test_file.py 2026-01-27
15:11:20.000000000 +0100
+++ new/azure_storage_file_share-12.25.0/tests/test_file.py 2026-05-15
02:57:20.000000000 +0200
@@ -135,8 +135,8 @@
properties = file_client.get_file_properties()
while properties.copy.status != 'success':
count = count + 1
- if count > 10:
- self.fail('Timed out waiting for async copy to complete.')
+ if count > 15:
+ pytest.fail('Timed out waiting for async copy to complete.')
self.sleep(6)
properties = file_client.get_file_properties()
assert properties.copy.status == 'success'
@@ -4015,4 +4015,49 @@
result = file_client.download_file(decompress=False).readall()
assert result == compressed_data
+ @FileSharePreparer()
+ @recorded_by_proxy
+ def test_upload_file_with_none_max_concurrency(self, **kwargs):
+ storage_account_name = kwargs.pop("storage_account_name")
+ storage_account_key = kwargs.pop("storage_account_key")
+
+ self._setup(storage_account_name, storage_account_key)
+ file_name = self._get_file_reference()
+ file_client = ShareFileClient(
+ self.account_url(storage_account_name, "file"),
+ share_name=self.share_name,
+ file_path=file_name,
+ credential=storage_account_key.secret,
+ max_range_size=4 * 1024)
+
+ data = b"hello world"
+
+ # max_concurrency=None should not raise TypeError
+ file_client.upload_file(data, max_concurrency=None)
+
+ self.assertFileEqual(file_client, data)
+
+ @FileSharePreparer()
+ @recorded_by_proxy
+ def test_download_file_with_none_max_concurrency(self, **kwargs):
+ storage_account_name = kwargs.pop("storage_account_name")
+ storage_account_key = kwargs.pop("storage_account_key")
+
+ self._setup(storage_account_name, storage_account_key)
+ file_name = self._get_file_reference()
+ file_client = ShareFileClient(
+ self.account_url(storage_account_name, "file"),
+ share_name=self.share_name,
+ file_path=file_name,
+ credential=storage_account_key.secret,
+ max_range_size=4 * 1024)
+
+ data = b"hello world"
+ file_client.upload_file(data)
+
+ # max_concurrency=None should not raise TypeError
+ content = file_client.download_file(max_concurrency=None).readall()
+
+ assert content == data
+
#
------------------------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/azure_storage_file_share-12.25.0b1/tests/test_file_async.py
new/azure_storage_file_share-12.25.0/tests/test_file_async.py
--- old/azure_storage_file_share-12.25.0b1/tests/test_file_async.py
2026-01-27 15:11:20.000000000 +0100
+++ new/azure_storage_file_share-12.25.0/tests/test_file_async.py
2026-05-15 02:57:20.000000000 +0200
@@ -150,8 +150,8 @@
properties = await file_client.get_file_properties()
while properties.copy.status != 'success':
count = count + 1
- if count > 10:
- self.fail('Timed out waiting for async copy to complete.')
+ if count > 15:
+ pytest.fail('Timed out waiting for async copy to complete.')
self.sleep(6)
properties = await file_client.get_file_properties()
assert properties.copy.status == 'success'
@@ -4141,3 +4141,50 @@
result = await (await
file_client.download_file(decompress=False)).readall()
assert result == compressed_data
+
+ @FileSharePreparer()
+ @recorded_by_proxy_async
+ async def test_upload_file_with_none_max_concurrency(self, **kwargs):
+ storage_account_name = kwargs.pop("storage_account_name")
+ storage_account_key = kwargs.pop("storage_account_key")
+
+ self._setup(storage_account_name, storage_account_key)
+ await self._setup_share(storage_account_name, storage_account_key)
+ file_name = self._get_file_reference()
+ file_client = ShareFileClient(
+ self.account_url(storage_account_name, "file"),
+ share_name=self.share_name,
+ file_path=file_name,
+ credential=storage_account_key.secret,
+ max_range_size=4 * 1024)
+
+ data = b"hello world"
+
+ # max_concurrency=None should not raise TypeError
+ await file_client.upload_file(data, max_concurrency=None)
+
+ await self.assertFileEqual(file_client, data)
+
+ @FileSharePreparer()
+ @recorded_by_proxy_async
+ async def test_download_file_with_none_max_concurrency(self, **kwargs):
+ storage_account_name = kwargs.pop("storage_account_name")
+ storage_account_key = kwargs.pop("storage_account_key")
+
+ self._setup(storage_account_name, storage_account_key)
+ await self._setup_share(storage_account_name, storage_account_key)
+ file_name = self._get_file_reference()
+ file_client = ShareFileClient(
+ self.account_url(storage_account_name, "file"),
+ share_name=self.share_name,
+ file_path=file_name,
+ credential=storage_account_key.secret,
+ max_range_size=4 * 1024)
+
+ data = b"hello world"
+ await file_client.upload_file(data)
+
+ # max_concurrency=None should not raise TypeError
+ content = await (await
file_client.download_file(max_concurrency=None)).readall()
+
+ assert content == data