Skip to content

Commit 2d59dc2

Browse files
committed
added in testing files for tables and started playing around with testing generated code
1 parent fc6860e commit 2d59dc2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+9921
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# -------------------------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# Licensed under the MIT License. See License.txt in the project root for
4+
# license information.
5+
# --------------------------------------------------------------------------
6+
# pylint: disable=unused-argument
7+
8+
from azure.core.exceptions import ResourceExistsError
9+
10+
from ._shared.models import StorageErrorCode
11+
from ._models import QueueProperties
12+
13+
14+
def deserialize_metadata(response, obj, headers):
15+
raw_metadata = {k: v for k, v in response.headers.items() if k.startswith("x-ms-meta-")}
16+
return {k[10:]: v for k, v in raw_metadata.items()}
17+
18+
19+
def deserialize_queue_properties(response, obj, headers):
20+
metadata = deserialize_metadata(response, obj, headers)
21+
queue_properties = QueueProperties(
22+
metadata=metadata,
23+
**headers
24+
)
25+
return queue_properties
26+
27+
28+
def deserialize_queue_creation(response, obj, headers):
29+
if response.status_code == 204:
30+
error_code = StorageErrorCode.queue_already_exists
31+
error = ResourceExistsError(
32+
message="Queue already exists\nRequestId:{}\nTime:{}\nErrorCode:{}".format(
33+
headers['x-ms-request-id'],
34+
headers['Date'],
35+
error_code
36+
),
37+
response=response)
38+
error.error_code = error_code
39+
error.additional_info = {}
40+
raise error
41+
return headers
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
# -------------------------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# Licensed under the MIT License. See License.txt in the project root for
4+
# license information.
5+
# --------------------------------------------------------------------------
6+
# pylint: disable=unused-argument
7+
8+
from base64 import b64encode, b64decode
9+
10+
import sys
11+
import six
12+
from azure.core.exceptions import DecodeError
13+
14+
from ._shared.encryption import decrypt_queue_message, encrypt_queue_message
15+
16+
17+
class MessageEncodePolicy(object):
18+
19+
def __init__(self):
20+
self.require_encryption = False
21+
self.key_encryption_key = None
22+
self.resolver = None
23+
24+
def __call__(self, content):
25+
if content:
26+
content = self.encode(content)
27+
if self.key_encryption_key is not None:
28+
content = encrypt_queue_message(content, self.key_encryption_key)
29+
return content
30+
31+
def configure(self, require_encryption, key_encryption_key, resolver):
32+
self.require_encryption = require_encryption
33+
self.key_encryption_key = key_encryption_key
34+
self.resolver = resolver
35+
if self.require_encryption and not self.key_encryption_key:
36+
raise ValueError("Encryption required but no key was provided.")
37+
38+
def encode(self, content):
39+
raise NotImplementedError("Must be implemented by child class.")
40+
41+
42+
class MessageDecodePolicy(object):
43+
44+
def __init__(self):
45+
self.require_encryption = False
46+
self.key_encryption_key = None
47+
self.resolver = None
48+
49+
def __call__(self, response, obj, headers):
50+
for message in obj:
51+
if message.message_text in [None, "", b""]:
52+
continue
53+
content = message.message_text
54+
if (self.key_encryption_key is not None) or (self.resolver is not None):
55+
content = decrypt_queue_message(
56+
content, response,
57+
self.require_encryption,
58+
self.key_encryption_key,
59+
self.resolver)
60+
message.message_text = self.decode(content, response)
61+
return obj
62+
63+
def configure(self, require_encryption, key_encryption_key, resolver):
64+
self.require_encryption = require_encryption
65+
self.key_encryption_key = key_encryption_key
66+
self.resolver = resolver
67+
68+
def decode(self, content, response):
69+
raise NotImplementedError("Must be implemented by child class.")
70+
71+
72+
class TextBase64EncodePolicy(MessageEncodePolicy):
73+
"""Base 64 message encoding policy for text messages.
74+
75+
Encodes text (unicode) messages to base 64. If the input content
76+
is not text, a TypeError will be raised. Input text must support UTF-8.
77+
"""
78+
79+
def encode(self, content):
80+
if not isinstance(content, six.text_type):
81+
raise TypeError("Message content must be text for base 64 encoding.")
82+
return b64encode(content.encode('utf-8')).decode('utf-8')
83+
84+
85+
class TextBase64DecodePolicy(MessageDecodePolicy):
86+
"""Message decoding policy for base 64-encoded messages into text.
87+
88+
Decodes base64-encoded messages to text (unicode). If the input content
89+
is not valid base 64, a DecodeError will be raised. Message data must
90+
support UTF-8.
91+
"""
92+
93+
def decode(self, content, response):
94+
try:
95+
return b64decode(content.encode('utf-8')).decode('utf-8')
96+
except (ValueError, TypeError) as error:
97+
# ValueError for Python 3, TypeError for Python 2
98+
raise DecodeError(
99+
message="Message content is not valid base 64.",
100+
response=response,
101+
error=error)
102+
103+
104+
class BinaryBase64EncodePolicy(MessageEncodePolicy):
105+
"""Base 64 message encoding policy for binary messages.
106+
107+
Encodes binary messages to base 64. If the input content
108+
is not bytes, a TypeError will be raised.
109+
"""
110+
111+
def encode(self, content):
112+
if not isinstance(content, six.binary_type):
113+
raise TypeError("Message content must be bytes for base 64 encoding.")
114+
return b64encode(content).decode('utf-8')
115+
116+
117+
class BinaryBase64DecodePolicy(MessageDecodePolicy):
118+
"""Message decoding policy for base 64-encoded messages into bytes.
119+
120+
Decodes base64-encoded messages to bytes. If the input content
121+
is not valid base 64, a DecodeError will be raised.
122+
"""
123+
124+
def decode(self, content, response):
125+
try:
126+
return b64decode(content.encode('utf-8'))
127+
except (ValueError, TypeError) as error:
128+
# ValueError for Python 3, TypeError for Python 2
129+
raise DecodeError(
130+
message="Message content is not valid base 64.",
131+
response=response,
132+
error=error)
133+
134+
135+
class NoEncodePolicy(MessageEncodePolicy):
136+
"""Bypass any message content encoding."""
137+
138+
def encode(self, content):
139+
if isinstance(content, six.binary_type) and sys.version_info > (3,):
140+
raise TypeError(
141+
"Message content must not be bytes. Use the BinaryBase64EncodePolicy to send bytes."
142+
)
143+
return content
144+
145+
146+
class NoDecodePolicy(MessageDecodePolicy):
147+
"""Bypass any message content decoding."""
148+
149+
def decode(self, content, response):
150+
return content
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# -------------------------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# Licensed under the MIT License. See License.txt in the project root for
4+
# license information.
5+
# --------------------------------------------------------------------------
6+
7+
import base64
8+
import hashlib
9+
import hmac
10+
11+
try:
12+
from urllib.parse import quote, unquote
13+
except ImportError:
14+
from urllib2 import quote, unquote # type: ignore
15+
16+
import six
17+
18+
19+
def url_quote(url):
20+
return quote(url)
21+
22+
23+
def url_unquote(url):
24+
return unquote(url)
25+
26+
27+
def encode_base64(data):
28+
if isinstance(data, six.text_type):
29+
data = data.encode('utf-8')
30+
encoded = base64.b64encode(data)
31+
return encoded.decode('utf-8')
32+
33+
34+
def decode_base64_to_bytes(data):
35+
if isinstance(data, six.text_type):
36+
data = data.encode('utf-8')
37+
return base64.b64decode(data)
38+
39+
40+
def decode_base64_to_text(data):
41+
decoded_bytes = decode_base64_to_bytes(data)
42+
return decoded_bytes.decode('utf-8')
43+
44+
45+
def sign_string(key, string_to_sign, key_is_base64=True):
46+
if key_is_base64:
47+
key = decode_base64_to_bytes(key)
48+
else:
49+
if isinstance(key, six.text_type):
50+
key = key.encode('utf-8')
51+
if isinstance(string_to_sign, six.text_type):
52+
string_to_sign = string_to_sign.encode('utf-8')
53+
signed_hmac_sha256 = hmac.HMAC(key, string_to_sign, hashlib.sha256)
54+
digest = signed_hmac_sha256.digest()
55+
encoded_digest = encode_base64(digest)
56+
return encoded_digest
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# -------------------------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# Licensed under the MIT License. See License.txt in the project root for
4+
# license information.
5+
# --------------------------------------------------------------------------
6+
7+
import base64
8+
import hashlib
9+
import hmac
10+
import sys
11+
from io import (SEEK_SET)
12+
13+
from dateutil.tz import tzutc
14+
15+
from ._error import (
16+
_ERROR_VALUE_SHOULD_BE_BYTES_OR_STREAM,
17+
_ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAM,
18+
)
19+
from .models import (
20+
_unicode_type,
21+
)
22+
23+
if sys.version_info < (3,):
24+
def _str(value):
25+
if isinstance(value, unicode):
26+
return value.encode('utf-8')
27+
28+
return str(value)
29+
else:
30+
_str = str
31+
32+
33+
def _to_str(value):
34+
return _str(value) if value is not None else None
35+
36+
37+
def _int_to_str(value):
38+
return str(int(value)) if value is not None else None
39+
40+
41+
def _bool_to_str(value):
42+
if value is None:
43+
return None
44+
45+
if isinstance(value, bool):
46+
if value:
47+
return 'true'
48+
else:
49+
return 'false'
50+
51+
return str(value)
52+
53+
54+
def _to_utc_datetime(value):
55+
return value.strftime('%Y-%m-%dT%H:%M:%SZ')
56+
57+
58+
def _datetime_to_utc_string(value):
59+
# Azure expects the date value passed in to be UTC.
60+
# Azure will always return values as UTC.
61+
# If a date is passed in without timezone info, it is assumed to be UTC.
62+
if value is None:
63+
return None
64+
65+
if value.tzinfo:
66+
value = value.astimezone(tzutc())
67+
68+
return value.strftime('%a, %d %b %Y %H:%M:%S GMT')
69+
70+
71+
def _encode_base64(data):
72+
if isinstance(data, _unicode_type):
73+
data = data.encode('utf-8')
74+
encoded = base64.b64encode(data)
75+
return encoded.decode('utf-8')
76+
77+
78+
def _decode_base64_to_bytes(data):
79+
if isinstance(data, _unicode_type):
80+
data = data.encode('utf-8')
81+
return base64.b64decode(data)
82+
83+
84+
def _decode_base64_to_text(data):
85+
decoded_bytes = _decode_base64_to_bytes(data)
86+
return decoded_bytes.decode('utf-8')
87+
88+
89+
def _sign_string(key, string_to_sign, key_is_base64=True):
90+
if key_is_base64:
91+
key = _decode_base64_to_bytes(key)
92+
else:
93+
if isinstance(key, _unicode_type):
94+
key = key.encode('utf-8')
95+
if isinstance(string_to_sign, _unicode_type):
96+
string_to_sign = string_to_sign.encode('utf-8')
97+
signed_hmac_sha256 = hmac.HMAC(key, string_to_sign, hashlib.sha256)
98+
digest = signed_hmac_sha256.digest()
99+
encoded_digest = _encode_base64(digest)
100+
return encoded_digest
101+
102+
103+
def _get_content_md5(data):
104+
md5 = hashlib.md5()
105+
if isinstance(data, bytes):
106+
md5.update(data)
107+
elif hasattr(data, 'read'):
108+
pos = 0
109+
try:
110+
pos = data.tell()
111+
except:
112+
pass
113+
for chunk in iter(lambda: data.read(4096), b""):
114+
md5.update(chunk)
115+
try:
116+
data.seek(pos, SEEK_SET)
117+
except (AttributeError, IOError):
118+
raise ValueError(_ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAM.format('data'))
119+
else:
120+
raise ValueError(_ERROR_VALUE_SHOULD_BE_BYTES_OR_STREAM.format('data'))
121+
122+
return base64.b64encode(md5.digest()).decode('utf-8')
123+
124+
125+
def _lower(text):
126+
return text.lower()

0 commit comments

Comments
 (0)