Skip to content

Commit 3372a74

Browse files
[Storage] [Typing] [Blob] Misc files (_serialize.py, _deserialize.py, _download.py) (#33613)
1 parent ae195c2 commit 3372a74

File tree

6 files changed

+229
-196
lines changed

6 files changed

+229
-196
lines changed

sdk/storage/azure-storage-blob/azure/storage/blob/_deserialize.py

Lines changed: 62 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
# license information.
55
# --------------------------------------------------------------------------
66

7-
from typing import (
8-
Dict, List, Optional, Tuple, Union,
9-
TYPE_CHECKING
10-
)
7+
from typing import Any, Dict, List, Optional, Tuple, TYPE_CHECKING
118
from urllib.parse import unquote
129
from xml.etree.ElementTree import Element
1310

@@ -25,24 +22,31 @@
2522
ObjectReplicationPolicy,
2623
ObjectReplicationRule,
2724
RetentionPolicy,
28-
StaticWebsite,
25+
StaticWebsite
2926
)
3027
from ._shared.models import get_enum_value
3128
from ._shared.response_handlers import deserialize_metadata
3229

3330
if TYPE_CHECKING:
34-
from ._generated.models import BlobTag, PageList
35-
31+
from azure.core.pipeline import PipelineResponse
32+
from ._generated.models import (
33+
BlobItemInternal,
34+
BlobTags,
35+
PageList,
36+
StorageServiceProperties,
37+
StorageServiceStats,
38+
)
39+
from ._shared.models import LocationMode
3640

37-
def deserialize_pipeline_response_into_cls(cls_method, response, obj, headers):
41+
def deserialize_pipeline_response_into_cls(cls_method, response: "PipelineResponse", obj: Any, headers: Dict[str, Any]):
3842
try:
3943
deserialized_response = response.http_response
4044
except AttributeError:
4145
deserialized_response = response
4246
return cls_method(deserialized_response, obj, headers)
4347

4448

45-
def deserialize_blob_properties(response, obj, headers):
49+
def deserialize_blob_properties(response: "PipelineResponse", obj: Any, headers: Dict[str, Any]) -> BlobProperties:
4650
blob_properties = BlobProperties(
4751
metadata=deserialize_metadata(response, obj, headers),
4852
object_replication_source_properties=deserialize_ors_policies(response.http_response.headers),
@@ -56,7 +60,7 @@ def deserialize_blob_properties(response, obj, headers):
5660
return blob_properties
5761

5862

59-
def deserialize_ors_policies(policy_dictionary):
63+
def deserialize_ors_policies(policy_dictionary: Optional[Dict[str, str]]) -> Optional[List[ObjectReplicationPolicy]]:
6064

6165
if policy_dictionary is None:
6266
return None
@@ -66,7 +70,7 @@ def deserialize_ors_policies(policy_dictionary):
6670
or_policy_status_headers = {key: val for key, val in policy_dictionary.items()
6771
if 'or-' in key and key != 'x-ms-or-policy-id'}
6872

69-
parsed_result = {}
73+
parsed_result: Dict[str, List[ObjectReplicationRule]] = {}
7074

7175
for key, val in or_policy_status_headers.items():
7276
# list blobs gives or-policy_rule and get blob properties gives x-ms-or-policy_rule
@@ -83,13 +87,21 @@ def deserialize_ors_policies(policy_dictionary):
8387
return result_list
8488

8589

86-
def deserialize_blob_stream(response, obj, headers):
90+
def deserialize_blob_stream(
91+
response: "PipelineResponse",
92+
obj: Any,
93+
headers: Dict[str, Any]
94+
) -> Tuple["LocationMode", Any]:
8795
blob_properties = deserialize_blob_properties(response, obj, headers)
8896
obj.properties = blob_properties
8997
return response.http_response.location_mode, obj
9098

9199

92-
def deserialize_container_properties(response, obj, headers):
100+
def deserialize_container_properties(
101+
response: "PipelineResponse",
102+
obj: Any,
103+
headers: Dict[str, Any]
104+
) -> ContainerProperties:
93105
metadata = deserialize_metadata(response, obj, headers)
94106
container_properties = ContainerProperties(
95107
metadata=metadata,
@@ -98,45 +110,50 @@ def deserialize_container_properties(response, obj, headers):
98110
return container_properties
99111

100112

101-
def get_page_ranges_result(ranges):
102-
# type: (PageList) -> Tuple[List[Dict[str, int]], List[Dict[str, int]]]
103-
page_range = [] # type: ignore
104-
clear_range = [] # type: List
113+
def get_page_ranges_result(ranges: "PageList") -> Tuple[List[Dict[str, int]], List[Dict[str, int]]]:
114+
page_range = []
115+
clear_range: List = []
105116
if ranges.page_range:
106-
page_range = [{'start': b.start, 'end': b.end} for b in ranges.page_range] # type: ignore
117+
page_range = [{'start': b.start, 'end': b.end} for b in ranges.page_range]
107118
if ranges.clear_range:
108119
clear_range = [{'start': b.start, 'end': b.end} for b in ranges.clear_range]
109-
return page_range, clear_range # type: ignore
120+
return page_range, clear_range
110121

111122

112-
# Deserialize a ServiceStats objects into a dict.
113-
def service_stats_deserialize(generated):
123+
def service_stats_deserialize(generated: "StorageServiceStats") -> Dict[str, Any]:
124+
status = None
125+
last_sync_time = None
126+
if generated.geo_replication is not None:
127+
status = generated.geo_replication.status
128+
last_sync_time = generated.geo_replication.last_sync_time
114129
return {
115130
'geo_replication': {
116-
'status': generated.geo_replication.status,
117-
'last_sync_time': generated.geo_replication.last_sync_time,
131+
'status': status,
132+
'last_sync_time': last_sync_time
118133
}
119134
}
120135

121-
# Deserialize a ServiceProperties objects into a dict.
122-
def service_properties_deserialize(generated):
136+
def service_properties_deserialize(generated: "StorageServiceProperties") -> Dict[str, Any]:
137+
cors_list = None
138+
if generated.cors is not None:
139+
cors_list = [CorsRule._from_generated(cors) for cors in generated.cors] # pylint: disable=protected-access
123140
return {
124141
'analytics_logging': BlobAnalyticsLogging._from_generated(generated.logging), # pylint: disable=protected-access
125142
'hour_metrics': Metrics._from_generated(generated.hour_metrics), # pylint: disable=protected-access
126143
'minute_metrics': Metrics._from_generated(generated.minute_metrics), # pylint: disable=protected-access
127-
'cors': [CorsRule._from_generated(cors) for cors in generated.cors], # pylint: disable=protected-access
144+
'cors': cors_list,
128145
'target_version': generated.default_service_version, # pylint: disable=protected-access
129146
'delete_retention_policy': RetentionPolicy._from_generated(generated.delete_retention_policy), # pylint: disable=protected-access
130147
'static_website': StaticWebsite._from_generated(generated.static_website), # pylint: disable=protected-access
131148
}
132149

133150

134-
def get_blob_properties_from_generated_code(generated):
151+
def get_blob_properties_from_generated_code(generated: "BlobItemInternal") -> BlobProperties:
135152
blob = BlobProperties()
136-
if generated.name.encoded:
153+
if generated.name.encoded and generated.name.content is not None:
137154
blob.name = unquote(generated.name.content)
138155
else:
139-
blob.name = generated.name.content
156+
blob.name = generated.name.content #type: ignore
140157
blob_type = get_enum_value(generated.properties.blob_type)
141158
blob.blob_type = BlobType(blob_type) if blob_type else None
142159
blob.etag = generated.properties.etag
@@ -172,38 +189,45 @@ def get_blob_properties_from_generated_code(generated):
172189
blob.has_versions_only = generated.has_versions_only
173190
return blob
174191

175-
def parse_tags(generated_tags: Optional[List["BlobTag"]]) -> Union[Dict[str, str], None]:
192+
def parse_tags(generated_tags: Optional["BlobTags"]) -> Optional[Dict[str, str]]:
176193
"""Deserialize a list of BlobTag objects into a dict.
177194
178-
:param Optional[List[BlobTag]] generated_tags:
195+
:param Optional[BlobTags] generated_tags:
179196
A list containing the BlobTag objects from generated code.
180197
:returns: A dictionary of the BlobTag objects.
181-
:rtype: Dict[str, str] or None
198+
:rtype: Optional[Dict[str, str]]
182199
"""
183200
if generated_tags:
184201
tag_dict = {t.key: t.value for t in generated_tags.blob_tag_set}
185202
return tag_dict
186203
return None
187204

188205

189-
def load_single_xml_node(element: Element, name: str) -> Union[Element, None]:
206+
def load_single_xml_node(element: Element, name: str) -> Optional[Element]:
190207
return element.find(name)
191208

192209

193-
def load_many_xml_nodes(element: Element, name: str, wrapper: Element = None) -> List[Union[Element, None]]:
210+
def load_many_xml_nodes(
211+
element: Element,
212+
name: str,
213+
wrapper: Optional[str] = None
214+
) -> List[Optional[Element]]:
215+
found_element: Optional[Element] = element
194216
if wrapper:
195-
element = load_single_xml_node(element, wrapper)
196-
return list(element.findall(name))
217+
found_element = load_single_xml_node(element, wrapper)
218+
if found_element is None:
219+
return []
220+
return list(found_element.findall(name))
197221

198222

199-
def load_xml_string(element: Element, name: str) -> str:
223+
def load_xml_string(element: Element, name: str) -> Optional[str]:
200224
node = element.find(name)
201225
if node is None or not node.text:
202226
return None
203227
return node.text
204228

205229

206-
def load_xml_int(element: Element, name: str) -> int:
230+
def load_xml_int(element: Element, name: str) -> Optional[int]:
207231
node = element.find(name)
208232
if node is None or not node.text:
209233
return None

0 commit comments

Comments
 (0)