Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
4341658
Initial migration
annatisch Mar 20, 2026
bdc0650
Refactor
annatisch Mar 23, 2026
15c5f67
Update mock transport
annatisch Mar 23, 2026
884eea9
pylint
l0lawrence Mar 23, 2026
98e094a
adding accept sanitization to conftest
l0lawrence Mar 23, 2026
72fe218
pin new version of azure-core
l0lawrence Mar 24, 2026
4abbbb9
Merge branch 'main' into copilot-files-tsp-migration
l0lawrence Mar 25, 2026
cee5a02
regen
l0lawrence Mar 26, 2026
3656738
prpoject version
l0lawrence Mar 26, 2026
acf7f30
remove
l0lawrence Mar 26, 2026
1dc62f4
patch remove fix
l0lawrence Mar 26, 2026
3e9b4d8
fix client helpers
l0lawrence Mar 26, 2026
abe89f0
Merge branch 'main' into copilot-files-tsp-migration
l0lawrence Mar 27, 2026
0412403
regen
l0lawrence Mar 27, 2026
f317d77
pyproject
l0lawrence Mar 27, 2026
001090d
pylint
l0lawrence Mar 30, 2026
1e72640
remove redudant lines
l0lawrence Mar 30, 2026
d42cf34
tests all passing
l0lawrence Mar 30, 2026
2adbc21
pylint
l0lawrence Mar 30, 2026
871c35c
Merge branch 'main' of https://github.com/Azure/azure-sdk-for-python …
l0lawrence Mar 31, 2026
e101cbe
Merge branch 'main' into copilot-files-tsp-migration
l0lawrence Apr 1, 2026
d5df691
regen
l0lawrence Apr 1, 2026
a580c5c
pylint
l0lawrence Apr 3, 2026
2253b7b
regen
l0lawrence Apr 6, 2026
42213a5
Apply suggestion from @l0lawrence
l0lawrence Apr 6, 2026
29e2337
Apply suggestion from @l0lawrence
l0lawrence Apr 6, 2026
dc9ba6d
prproject
l0lawrence Apr 6, 2026
09f1182
Merge branch 'copilot-files-tsp-migration' of https://github.com/Azur…
l0lawrence Apr 6, 2026
0273df0
Apply suggestion from @l0lawrence
l0lawrence Apr 6, 2026
cfaa2d8
Merge branch 'main' into copilot-files-tsp-migration
l0lawrence Apr 13, 2026
e875494
regen w new config
l0lawrence Apr 14, 2026
f22102c
Fix pylint errors in azure-storage-file-share
l0lawrence Apr 14, 2026
9efa7e6
Fix model subclasses to call super().__init__ and remove models _patc…
l0lawrence Apr 16, 2026
a32ff8f
regen
l0lawrence Apr 16, 2026
ed8a579
mypy/pylint fix
l0lawrence Apr 16, 2026
d6ee7b8
regen
l0lawrence Apr 22, 2026
53d41f5
regen renamed a param
l0lawrence Apr 22, 2026
cfa946b
Align _shared upload helpers with azure-storage-blob TSP migration
l0lawrence Apr 27, 2026
3fad009
Fix FileProperty datetime fields: declare as str, not RFC7231 datetime
l0lawrence May 1, 2026
83c2a38
wip changes from running against azure cli
l0lawrence May 1, 2026
7e2d020
also patch here for backcompat
l0lawrence May 6, 2026
2e05f01
Merge branch 'main' into copilot-files-tsp-migration
l0lawrence May 6, 2026
ebe51e4
Merge branch 'main' into copilot-files-tsp-migration
l0lawrence May 13, 2026
57cf512
regen
l0lawrence May 13, 2026
273da74
Fix pylint: relocate disable comments in _models.py
l0lawrence May 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions sdk/storage/azure-storage-file-share/MANIFEST.in
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
include *.md
include azure/__init__.py
include azure/storage/__init__.py
include LICENSE
include azure/storage/fileshare/py.typed
recursive-include tests *.py
recursive-include samples *.py *.md
include azure/storage/fileshare/py.typed
include azure/__init__.py
include azure/storage/__init__.py
6 changes: 6 additions & 0 deletions sdk/storage/azure-storage-file-share/_metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"apiVersion": "2026-06-06",
"apiVersions": {
"Storage.File": "2026-06-06"
}
}
160 changes: 160 additions & 0 deletions sdk/storage/azure-storage-file-share/apiview-properties.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion sdk/storage/azure-storage-file-share/azure/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__path__ = __import__('pkgutil').extend_path(__path__, __name__) # type: ignore
__path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__path__ = __import__('pkgutil').extend_path(__path__, __name__) # type: ignore
__path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,52 +42,49 @@
ShareProtocolSettings,
ShareProtocols,
)
from ._generated.models import (
ShareAccessTier,
ShareRootSquash
)
from ._generated.models import ShareAccessTier, ShareRootSquash

__version__ = VERSION


__all__ = [
'AccessPolicy',
'AccountSasPermissions',
'ContentSettings',
'CorsRule',
'DirectoryProperties',
'ExponentialRetry',
'FileProperties',
'FileSasPermissions',
'generate_account_sas',
'generate_file_sas',
'generate_share_sas',
'Handle',
'LinearRetry',
'LocationMode',
'Metrics',
'NfsEncryptionInTransit',
'NTFSAttributes',
'ResourceTypes',
'RetentionPolicy',
'Services',
'ShareAccessTier',
'ShareClient',
'ShareDirectoryClient',
'ShareFileClient',
'ShareLeaseClient',
'ShareNfsSettings',
'ShareProperties',
'ShareProtocolSettings',
'ShareProtocols',
'ShareRootSquash',
'ShareSasPermissions',
'ShareServiceClient',
'ShareSmbSettings',
'SmbEncryptionInTransit',
'SmbMultichannel',
'StorageErrorCode',
'UserDelegationKey'
"AccessPolicy",
"AccountSasPermissions",
"ContentSettings",
"CorsRule",
"DirectoryProperties",
"ExponentialRetry",
"FileProperties",
"FileSasPermissions",
"generate_account_sas",
"generate_file_sas",
"generate_share_sas",
"Handle",
"LinearRetry",
"LocationMode",
"Metrics",
"NfsEncryptionInTransit",
"NTFSAttributes",
"ResourceTypes",
"RetentionPolicy",
"Services",
"ShareAccessTier",
"ShareClient",
"ShareDirectoryClient",
"ShareFileClient",
"ShareLeaseClient",
"ShareNfsSettings",
"ShareProperties",
"ShareProtocolSettings",
"ShareProtocols",
"ShareRootSquash",
"ShareSasPermissions",
"ShareServiceClient",
"ShareSmbSettings",
"SmbEncryptionInTransit",
"SmbMultichannel",
"StorageErrorCode",
"UserDelegationKey",
]


Expand All @@ -96,12 +93,10 @@
# to prevent it from showing in intellisense/docs but we handle it here to prevent
# breaking any existing code which may have imported it.
def __getattr__(name):
if name == 'HandleItem':
if name == "HandleItem":
from ._generated.models import HandleItem
warnings.warn(
"HandleItem is deprecated and should not be used. Use Handle instead.",
DeprecationWarning
)

warnings.warn("HandleItem is deprecated and should not be used. Use Handle instead.", DeprecationWarning)
return HandleItem

raise AttributeError(f"module 'azure.storage.fileshare' has no attribute {name}")
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# --------------------------------------------------------------------------_
from typing import (
Any, cast, Dict, List, Optional, Tuple,
TYPE_CHECKING
)
from typing import Any, cast, Dict, List, Optional, Tuple, TYPE_CHECKING

from ._generated.models import ShareFileRangeList
from ._models import DirectoryProperties, FileProperties, ShareProperties
Expand All @@ -19,67 +16,89 @@

def deserialize_share_properties(response: "PipelineResponse", obj: Any, headers: Dict[str, Any]) -> ShareProperties:
metadata = deserialize_metadata(response, obj, headers)
share_properties = ShareProperties(
metadata=metadata,
**headers
)
share_properties = ShareProperties(metadata=metadata, **headers)
return share_properties


def deserialize_directory_properties(
response: "PipelineResponse",
obj: Any,
headers: Dict[str, Any]
response: "PipelineResponse", obj: Any, headers: Dict[str, Any]
) -> DirectoryProperties:
metadata = deserialize_metadata(response, obj, headers)
directory_properties = DirectoryProperties(
metadata=metadata,
**headers
)
directory_properties = DirectoryProperties(metadata=metadata, **headers)
return directory_properties


class _StreamWrapper:
"""Wraps a bytes iterator (sync or async) so that properties can be attached."""
Comment thread
l0lawrence marked this conversation as resolved.

def __init__(self, stream):
self._stream = stream
self.properties = None
self.response = None

def __iter__(self):
return iter(self._stream)

def __next__(self):
return next(self._stream)

def __aiter__(self):
return self._stream.__aiter__()

async def __anext__(self):
return await self._stream.__anext__()


def deserialize_file_properties(response: "PipelineResponse", obj: Any, headers: Dict[str, Any]) -> FileProperties:
metadata = deserialize_metadata(response, obj, headers)
file_properties = FileProperties(
metadata=metadata,
**headers
)
if 'Content-Range' in headers:
if 'x-ms-content-md5' in headers:
file_properties.content_settings.content_md5 = headers['x-ms-content-md5']
file_properties = FileProperties(metadata=metadata, **headers)
if "Content-Range" in headers:
if "x-ms-content-md5" in headers:
file_properties.content_settings.content_md5 = headers["x-ms-content-md5"]
else:
file_properties.content_settings.content_md5 = None
return file_properties


def deserialize_file_stream(
response: "PipelineResponse",
obj: Any,
headers: Dict[str, Any]
response: "PipelineResponse", obj: Any, headers: Dict[str, Any]
) -> Tuple["LocationMode", Any]:
file_properties = deserialize_file_properties(response, obj, headers)
# The new TypeSpec-generated download returns an iterator (from iter_bytes/iter_raw)
# instead of a response object with settable attributes. Wrap it.
if not hasattr(obj, "properties") or isinstance(obj, type(iter(b""))):
wrapped = _StreamWrapper(obj)
wrapped.properties = file_properties
try:
wrapped.response = response.http_response
except AttributeError:
pass
return response.http_response.location_mode, wrapped
obj.properties = file_properties
return response.http_response.location_mode, obj


# Extracts out file permission
def deserialize_permission(response: "PipelineResponse", obj: Any, headers: Dict[str, Any]) -> Optional[str]: # pylint: disable=unused-argument
def deserialize_permission( # pylint: disable=unused-argument
response: "PipelineResponse", obj: Any, headers: Dict[str, Any]
) -> Optional[str]:
return cast(Optional[str], obj.permission)


# Extracts out file permission key
def deserialize_permission_key(response: "PipelineResponse", obj: Any, headers: Dict[str, Any]) -> Optional[str]: # pylint: disable=unused-argument
def deserialize_permission_key( # pylint: disable=unused-argument
response: "PipelineResponse", obj: Any, headers: Dict[str, Any]
) -> Optional[str]:
if response is None or headers is None:
return None
return cast(Optional[str], headers.get('x-ms-file-permission-key', None))
return cast(Optional[str], headers.get("x-ms-file-permission-key", None))


def get_file_ranges_result(ranges: ShareFileRangeList) -> Tuple[List[Dict[str, int]], List[Dict[str, int]]]:
file_ranges = []
clear_ranges = []
if ranges.ranges:
file_ranges = [{'start': file_range.start, 'end': file_range.end} for file_range in ranges.ranges]
file_ranges = [{"start": file_range.start, "end": file_range.end} for file_range in ranges.ranges]
if ranges.clear_ranges:
clear_ranges = [{'start': clear_range.start, 'end': clear_range.end} for clear_range in ranges.clear_ranges]
clear_ranges = [{"start": clear_range.start, "end": clear_range.end} for clear_range in ranges.clear_ranges]
return file_ranges, clear_ranges
Loading
Loading