From d2c46d015be17544470b6b31357878ce21d9a910 Mon Sep 17 00:00:00 2001 From: Matthew Jones Date: Thu, 29 Jan 2015 12:13:53 -0500 Subject: [PATCH 01/10] Update azure package to 0.9.0 --- awx/lib/site-packages/README | 1 + awx/lib/site-packages/azure/__init__.py | 1904 +++---- awx/lib/site-packages/azure/azure.pyproj | 81 + awx/lib/site-packages/azure/http/__init__.py | 146 +- .../site-packages/azure/http/batchclient.py | 678 +-- .../site-packages/azure/http/httpclient.py | 474 +- .../azure/http/requestsclient.py | 74 + awx/lib/site-packages/azure/http/winhttp.py | 942 ++-- .../azure/servicebus/__init__.py | 1703 +++--- .../azure/servicebus/servicebusservice.py | 1925 +++---- .../azure/servicemanagement/__init__.py | 4696 +++++++++++------ .../schedulermanagementservice.py | 70 + .../servicebusmanagementservice.py | 647 ++- .../servicemanagementclient.py | 424 +- .../servicemanagementservice.py | 4054 ++++++++------ .../sqldatabasemanagementservice.py | 390 ++ .../websitemanagementservice.py | 256 + .../site-packages/azure/storage/__init__.py | 1814 ++++--- .../azure/storage/blobservice.py | 4403 ++++++++-------- .../azure/storage/cloudstorageaccount.py | 78 +- .../azure/storage/queueservice.py | 916 ++-- .../azure/storage/sharedaccesssignature.py | 461 +- .../azure/storage/storageclient.py | 304 +- .../azure/storage/tableservice.py | 982 ++-- 24 files changed, 15414 insertions(+), 12009 deletions(-) create mode 100644 awx/lib/site-packages/azure/azure.pyproj create mode 100644 awx/lib/site-packages/azure/http/requestsclient.py create mode 100644 awx/lib/site-packages/azure/servicemanagement/schedulermanagementservice.py create mode 100644 awx/lib/site-packages/azure/servicemanagement/sqldatabasemanagementservice.py create mode 100644 awx/lib/site-packages/azure/servicemanagement/websitemanagementservice.py diff --git a/awx/lib/site-packages/README b/awx/lib/site-packages/README index d0e4365ac3..0506812d4c 100644 --- a/awx/lib/site-packages/README +++ b/awx/lib/site-packages/README @@ -5,6 +5,7 @@ amqp==1.4.5 (amqp/*) ansi2html==1.0.6 (ansi2html/*) anyjson==0.3.3 (anyjson/*) argparse==1.2.1 (argparse.py, needed for Python 2.6 support) +azure==0.9.0 (azure/*) Babel==1.3 (babel/*, excluded bin/pybabel) billiard==3.3.0.16 (billiard/*, funtests/*, excluded _billiard.so) boto==2.34.0 (boto/*, excluded bin/asadmin, bin/bundle_image, bin/cfadmin, diff --git a/awx/lib/site-packages/azure/__init__.py b/awx/lib/site-packages/azure/__init__.py index d3228953f5..0e9250de04 100644 --- a/awx/lib/site-packages/azure/__init__.py +++ b/awx/lib/site-packages/azure/__init__.py @@ -1,905 +1,999 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -import ast -import base64 -import sys -import types -import warnings -if sys.version_info < (3,): - from urllib2 import quote as url_quote - from urllib2 import unquote as url_unquote - _strtype = basestring -else: - from urllib.parse import quote as url_quote - from urllib.parse import unquote as url_unquote - _strtype = str - -from datetime import datetime -from xml.dom import minidom -from xml.sax.saxutils import escape as xml_escape - -#-------------------------------------------------------------------------- -# constants - -__author__ = 'Microsoft Corp. ' -__version__ = '0.8.1' - -# Live ServiceClient URLs -BLOB_SERVICE_HOST_BASE = '.blob.core.windows.net' -QUEUE_SERVICE_HOST_BASE = '.queue.core.windows.net' -TABLE_SERVICE_HOST_BASE = '.table.core.windows.net' -SERVICE_BUS_HOST_BASE = '.servicebus.windows.net' -MANAGEMENT_HOST = 'management.core.windows.net' - -# Development ServiceClient URLs -DEV_BLOB_HOST = '127.0.0.1:10000' -DEV_QUEUE_HOST = '127.0.0.1:10001' -DEV_TABLE_HOST = '127.0.0.1:10002' - -# Default credentials for Development Storage Service -DEV_ACCOUNT_NAME = 'devstoreaccount1' -DEV_ACCOUNT_KEY = 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==' - -# All of our error messages -_ERROR_CANNOT_FIND_PARTITION_KEY = 'Cannot find partition key in request.' -_ERROR_CANNOT_FIND_ROW_KEY = 'Cannot find row key in request.' -_ERROR_INCORRECT_TABLE_IN_BATCH = \ - 'Table should be the same in a batch operations' -_ERROR_INCORRECT_PARTITION_KEY_IN_BATCH = \ - 'Partition Key should be the same in a batch operations' -_ERROR_DUPLICATE_ROW_KEY_IN_BATCH = \ - 'Row Keys should not be the same in a batch operations' -_ERROR_BATCH_COMMIT_FAIL = 'Batch Commit Fail' -_ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_DELETE = \ - 'Message is not peek locked and cannot be deleted.' -_ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_UNLOCK = \ - 'Message is not peek locked and cannot be unlocked.' -_ERROR_QUEUE_NOT_FOUND = 'Queue was not found' -_ERROR_TOPIC_NOT_FOUND = 'Topic was not found' -_ERROR_CONFLICT = 'Conflict ({0})' -_ERROR_NOT_FOUND = 'Not found ({0})' -_ERROR_UNKNOWN = 'Unknown error ({0})' -_ERROR_SERVICEBUS_MISSING_INFO = \ - 'You need to provide servicebus namespace, access key and Issuer' -_ERROR_STORAGE_MISSING_INFO = \ - 'You need to provide both account name and access key' -_ERROR_ACCESS_POLICY = \ - 'share_access_policy must be either SignedIdentifier or AccessPolicy ' + \ - 'instance' -_WARNING_VALUE_SHOULD_BE_BYTES = \ - 'Warning: {0} must be bytes data type. It will be converted ' + \ - 'automatically, with utf-8 text encoding.' -_ERROR_VALUE_SHOULD_BE_BYTES = '{0} should be of type bytes.' -_ERROR_VALUE_NONE = '{0} should not be None.' -_ERROR_VALUE_NEGATIVE = '{0} should not be negative.' -_ERROR_CANNOT_SERIALIZE_VALUE_TO_ENTITY = \ - 'Cannot serialize the specified value ({0}) to an entity. Please use ' + \ - 'an EntityProperty (which can specify custom types), int, str, bool, ' + \ - 'or datetime.' -_ERROR_PAGE_BLOB_SIZE_ALIGNMENT = \ - 'Invalid page blob size: {0}. ' + \ - 'The size must be aligned to a 512-byte boundary.' - -_USER_AGENT_STRING = 'pyazure/' + __version__ - -METADATA_NS = 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' - - -class WindowsAzureData(object): - - ''' This is the base of data class. - It is only used to check whether it is instance or not. ''' - pass - - -class WindowsAzureError(Exception): - - ''' WindowsAzure Excpetion base class. ''' - - def __init__(self, message): - super(WindowsAzureError, self).__init__(message) - - -class WindowsAzureConflictError(WindowsAzureError): - - '''Indicates that the resource could not be created because it already - exists''' - - def __init__(self, message): - super(WindowsAzureConflictError, self).__init__(message) - - -class WindowsAzureMissingResourceError(WindowsAzureError): - - '''Indicates that a request for a request for a resource (queue, table, - container, etc...) failed because the specified resource does not exist''' - - def __init__(self, message): - super(WindowsAzureMissingResourceError, self).__init__(message) - - -class WindowsAzureBatchOperationError(WindowsAzureError): - - '''Indicates that a batch operation failed''' - - def __init__(self, message, code): - super(WindowsAzureBatchOperationError, self).__init__(message) - self.code = code - - -class Feed(object): - pass - - -class _Base64String(str): - pass - - -class HeaderDict(dict): - - def __getitem__(self, index): - return super(HeaderDict, self).__getitem__(index.lower()) - - -def _encode_base64(data): - if isinstance(data, _unicode_type): - data = data.encode('utf-8') - encoded = base64.b64encode(data) - return encoded.decode('utf-8') - - -def _decode_base64_to_bytes(data): - if isinstance(data, _unicode_type): - data = data.encode('utf-8') - return base64.b64decode(data) - - -def _decode_base64_to_text(data): - decoded_bytes = _decode_base64_to_bytes(data) - return decoded_bytes.decode('utf-8') - - -def _get_readable_id(id_name, id_prefix_to_skip): - """simplified an id to be more friendly for us people""" - # id_name is in the form 'https://namespace.host.suffix/name' - # where name may contain a forward slash! - pos = id_name.find('//') - if pos != -1: - pos += 2 - if id_prefix_to_skip: - pos = id_name.find(id_prefix_to_skip, pos) - if pos != -1: - pos += len(id_prefix_to_skip) - pos = id_name.find('/', pos) - if pos != -1: - return id_name[pos + 1:] - return id_name - - -def _get_entry_properties(xmlstr, include_id, id_prefix_to_skip=None): - ''' get properties from entry xml ''' - xmldoc = minidom.parseString(xmlstr) - properties = {} - - for entry in _get_child_nodes(xmldoc, 'entry'): - etag = entry.getAttributeNS(METADATA_NS, 'etag') - if etag: - properties['etag'] = etag - for updated in _get_child_nodes(entry, 'updated'): - properties['updated'] = updated.firstChild.nodeValue - for name in _get_children_from_path(entry, 'author', 'name'): - if name.firstChild is not None: - properties['author'] = name.firstChild.nodeValue - - if include_id: - for id in _get_child_nodes(entry, 'id'): - properties['name'] = _get_readable_id( - id.firstChild.nodeValue, id_prefix_to_skip) - - return properties - - -def _get_first_child_node_value(parent_node, node_name): - xml_attrs = _get_child_nodes(parent_node, node_name) - if xml_attrs: - xml_attr = xml_attrs[0] - if xml_attr.firstChild: - value = xml_attr.firstChild.nodeValue - return value - - -def _get_child_nodes(node, tagName): - return [childNode for childNode in node.getElementsByTagName(tagName) - if childNode.parentNode == node] - - -def _get_children_from_path(node, *path): - '''descends through a hierarchy of nodes returning the list of children - at the inner most level. Only returns children who share a common parent, - not cousins.''' - cur = node - for index, child in enumerate(path): - if isinstance(child, _strtype): - next = _get_child_nodes(cur, child) - else: - next = _get_child_nodesNS(cur, *child) - if index == len(path) - 1: - return next - elif not next: - break - - cur = next[0] - return [] - - -def _get_child_nodesNS(node, ns, tagName): - return [childNode for childNode in node.getElementsByTagNameNS(ns, tagName) - if childNode.parentNode == node] - - -def _create_entry(entry_body): - ''' Adds common part of entry to a given entry body and return the whole - xml. ''' - updated_str = datetime.utcnow().isoformat() - if datetime.utcnow().utcoffset() is None: - updated_str += '+00:00' - - entry_start = ''' - -<updated>{updated}</updated><author><name /></author><id /> -<content type="application/xml"> - {body}</content></entry>''' - return entry_start.format(updated=updated_str, body=entry_body) - - -def _to_datetime(strtime): - return datetime.strptime(strtime, "%Y-%m-%dT%H:%M:%S.%f") - -_KNOWN_SERIALIZATION_XFORMS = { - 'include_apis': 'IncludeAPIs', - 'message_id': 'MessageId', - 'content_md5': 'Content-MD5', - 'last_modified': 'Last-Modified', - 'cache_control': 'Cache-Control', - 'account_admin_live_email_id': 'AccountAdminLiveEmailId', - 'service_admin_live_email_id': 'ServiceAdminLiveEmailId', - 'subscription_id': 'SubscriptionID', - 'fqdn': 'FQDN', - 'private_id': 'PrivateID', - 'os_virtual_hard_disk': 'OSVirtualHardDisk', - 'logical_disk_size_in_gb': 'LogicalDiskSizeInGB', - 'logical_size_in_gb': 'LogicalSizeInGB', - 'os': 'OS', - 'persistent_vm_downtime_info': 'PersistentVMDowntimeInfo', - 'copy_id': 'CopyId', - } - - -def _get_serialization_name(element_name): - """converts a Python name into a serializable name""" - known = _KNOWN_SERIALIZATION_XFORMS.get(element_name) - if known is not None: - return known - - if element_name.startswith('x_ms_'): - return element_name.replace('_', '-') - if element_name.endswith('_id'): - element_name = element_name.replace('_id', 'ID') - for name in ['content_', 'last_modified', 'if_', 'cache_control']: - if element_name.startswith(name): - element_name = element_name.replace('_', '-_') - - return ''.join(name.capitalize() for name in element_name.split('_')) - -if sys.version_info < (3,): - _unicode_type = unicode - - def _str(value): - if isinstance(value, unicode): - return value.encode('utf-8') - - return str(value) -else: - _str = str - _unicode_type = str - - -def _str_or_none(value): - if value is None: - return None - - return _str(value) - - -def _int_or_none(value): - if value is None: - return None - - return str(int(value)) - - -def _bool_or_none(value): - if value is None: - return None - - if isinstance(value, bool): - if value: - return 'true' - else: - return 'false' - - return str(value) - - -def _convert_class_to_xml(source, xml_prefix=True): - if source is None: - return '' - - xmlstr = '' - if xml_prefix: - xmlstr = '<?xml version="1.0" encoding="utf-8"?>' - - if isinstance(source, list): - for value in source: - xmlstr += _convert_class_to_xml(value, False) - elif isinstance(source, WindowsAzureData): - class_name = source.__class__.__name__ - xmlstr += '<' + class_name + '>' - for name, value in vars(source).items(): - if value is not None: - if isinstance(value, list) or \ - isinstance(value, WindowsAzureData): - xmlstr += _convert_class_to_xml(value, False) - else: - xmlstr += ('<' + _get_serialization_name(name) + '>' + - xml_escape(str(value)) + '</' + - _get_serialization_name(name) + '>') - xmlstr += '</' + class_name + '>' - return xmlstr - - -def _find_namespaces_from_child(parent, child, namespaces): - """Recursively searches from the parent to the child, - gathering all the applicable namespaces along the way""" - for cur_child in parent.childNodes: - if cur_child is child: - return True - if _find_namespaces_from_child(cur_child, child, namespaces): - # we are the parent node - for key in cur_child.attributes.keys(): - if key.startswith('xmlns:') or key == 'xmlns': - namespaces[key] = cur_child.attributes[key] - break - return False - - -def _find_namespaces(parent, child): - res = {} - for key in parent.documentElement.attributes.keys(): - if key.startswith('xmlns:') or key == 'xmlns': - res[key] = parent.documentElement.attributes[key] - _find_namespaces_from_child(parent, child, res) - return res - - -def _clone_node_with_namespaces(node_to_clone, original_doc): - clone = node_to_clone.cloneNode(True) - - for key, value in _find_namespaces(original_doc, node_to_clone).items(): - clone.attributes[key] = value - - return clone - - -def _convert_response_to_feeds(response, convert_func): - if response is None: - return None - - feeds = _list_of(Feed) - - x_ms_continuation = HeaderDict() - for name, value in response.headers: - if 'x-ms-continuation' in name: - x_ms_continuation[name[len('x-ms-continuation') + 1:]] = value - if x_ms_continuation: - setattr(feeds, 'x_ms_continuation', x_ms_continuation) - - xmldoc = minidom.parseString(response.body) - xml_entries = _get_children_from_path(xmldoc, 'feed', 'entry') - if not xml_entries: - # in some cases, response contains only entry but no feed - xml_entries = _get_children_from_path(xmldoc, 'entry') - for xml_entry in xml_entries: - new_node = _clone_node_with_namespaces(xml_entry, xmldoc) - feeds.append(convert_func(new_node.toxml('utf-8'))) - - return feeds - - -def _validate_type_bytes(param_name, param): - if not isinstance(param, bytes): - raise TypeError(_ERROR_VALUE_SHOULD_BE_BYTES.format(param_name)) - - -def _validate_not_none(param_name, param): - if param is None: - raise TypeError(_ERROR_VALUE_NONE.format(param_name)) - - -def _fill_list_of(xmldoc, element_type, xml_element_name): - xmlelements = _get_child_nodes(xmldoc, xml_element_name) - return [_parse_response_body_from_xml_node(xmlelement, element_type) \ - for xmlelement in xmlelements] - - -def _fill_scalar_list_of(xmldoc, element_type, parent_xml_element_name, - xml_element_name): - '''Converts an xml fragment into a list of scalar types. The parent xml - element contains a flat list of xml elements which are converted into the - specified scalar type and added to the list. - Example: - xmldoc= -<Endpoints> - <Endpoint>http://{storage-service-name}.blob.core.windows.net/</Endpoint> - <Endpoint>http://{storage-service-name}.queue.core.windows.net/</Endpoint> - <Endpoint>http://{storage-service-name}.table.core.windows.net/</Endpoint> -</Endpoints> - element_type=str - parent_xml_element_name='Endpoints' - xml_element_name='Endpoint' - ''' - xmlelements = _get_child_nodes(xmldoc, parent_xml_element_name) - if xmlelements: - xmlelements = _get_child_nodes(xmlelements[0], xml_element_name) - return [_get_node_value(xmlelement, element_type) \ - for xmlelement in xmlelements] - - -def _fill_dict(xmldoc, element_name): - xmlelements = _get_child_nodes(xmldoc, element_name) - if xmlelements: - return_obj = {} - for child in xmlelements[0].childNodes: - if child.firstChild: - return_obj[child.nodeName] = child.firstChild.nodeValue - return return_obj - - -def _fill_dict_of(xmldoc, parent_xml_element_name, pair_xml_element_name, - key_xml_element_name, value_xml_element_name): - '''Converts an xml fragment into a dictionary. The parent xml element - contains a list of xml elements where each element has a child element for - the key, and another for the value. - Example: - xmldoc= -<ExtendedProperties> - <ExtendedProperty> - <Name>Ext1</Name> - <Value>Val1</Value> - </ExtendedProperty> - <ExtendedProperty> - <Name>Ext2</Name> - <Value>Val2</Value> - </ExtendedProperty> -</ExtendedProperties> - element_type=str - parent_xml_element_name='ExtendedProperties' - pair_xml_element_name='ExtendedProperty' - key_xml_element_name='Name' - value_xml_element_name='Value' - ''' - return_obj = {} - - xmlelements = _get_child_nodes(xmldoc, parent_xml_element_name) - if xmlelements: - xmlelements = _get_child_nodes(xmlelements[0], pair_xml_element_name) - for pair in xmlelements: - keys = _get_child_nodes(pair, key_xml_element_name) - values = _get_child_nodes(pair, value_xml_element_name) - if keys and values: - key = keys[0].firstChild.nodeValue - value = values[0].firstChild.nodeValue - return_obj[key] = value - - return return_obj - - -def _fill_instance_child(xmldoc, element_name, return_type): - '''Converts a child of the current dom element to the specified type. - ''' - xmlelements = _get_child_nodes( - xmldoc, _get_serialization_name(element_name)) - - if not xmlelements: - return None - - return_obj = return_type() - _fill_data_to_return_object(xmlelements[0], return_obj) - - return return_obj - - -def _fill_instance_element(element, return_type): - """Converts a DOM element into the specified object""" - return _parse_response_body_from_xml_node(element, return_type) - - -def _fill_data_minidom(xmldoc, element_name, data_member): - xmlelements = _get_child_nodes( - xmldoc, _get_serialization_name(element_name)) - - if not xmlelements or not xmlelements[0].childNodes: - return None - - value = xmlelements[0].firstChild.nodeValue - - if data_member is None: - return value - elif isinstance(data_member, datetime): - return _to_datetime(value) - elif type(data_member) is bool: - return value.lower() != 'false' - else: - return type(data_member)(value) - - -def _get_node_value(xmlelement, data_type): - value = xmlelement.firstChild.nodeValue - if data_type is datetime: - return _to_datetime(value) - elif data_type is bool: - return value.lower() != 'false' - else: - return data_type(value) - - -def _get_request_body_bytes_only(param_name, param_value): - '''Validates the request body passed in and converts it to bytes - if our policy allows it.''' - if param_value is None: - return b'' - - if isinstance(param_value, bytes): - return param_value - - # Previous versions of the SDK allowed data types other than bytes to be - # passed in, and they would be auto-converted to bytes. We preserve this - # behavior when running under 2.7, but issue a warning. - # Python 3 support is new, so we reject anything that's not bytes. - if sys.version_info < (3,): - warnings.warn(_WARNING_VALUE_SHOULD_BE_BYTES.format(param_name)) - return _get_request_body(param_value) - - raise TypeError(_ERROR_VALUE_SHOULD_BE_BYTES.format(param_name)) - - -def _get_request_body(request_body): - '''Converts an object into a request body. If it's None - we'll return an empty string, if it's one of our objects it'll - convert it to XML and return it. Otherwise we just use the object - directly''' - if request_body is None: - return b'' - - if isinstance(request_body, WindowsAzureData): - request_body = _convert_class_to_xml(request_body) - - if isinstance(request_body, bytes): - return request_body - - if isinstance(request_body, _unicode_type): - return request_body.encode('utf-8') - - request_body = str(request_body) - if isinstance(request_body, _unicode_type): - return request_body.encode('utf-8') - - return request_body - - -def _parse_enum_results_list(response, return_type, resp_type, item_type): - """resp_body is the XML we received -resp_type is a string, such as Containers, -return_type is the type we're constructing, such as ContainerEnumResults -item_type is the type object of the item to be created, such as Container - -This function then returns a ContainerEnumResults object with the -containers member populated with the results. -""" - - # parsing something like: - # <EnumerationResults ... > - # <Queues> - # <Queue> - # <Something /> - # <SomethingElse /> - # </Queue> - # </Queues> - # </EnumerationResults> - respbody = response.body - return_obj = return_type() - doc = minidom.parseString(respbody) - - items = [] - for enum_results in _get_child_nodes(doc, 'EnumerationResults'): - # path is something like Queues, Queue - for child in _get_children_from_path(enum_results, - resp_type, - resp_type[:-1]): - items.append(_fill_instance_element(child, item_type)) - - for name, value in vars(return_obj).items(): - # queues, Queues, this is the list its self which we populated - # above - if name == resp_type.lower(): - # the list its self. - continue - value = _fill_data_minidom(enum_results, name, value) - if value is not None: - setattr(return_obj, name, value) - - setattr(return_obj, resp_type.lower(), items) - return return_obj - - -def _parse_simple_list(response, type, item_type, list_name): - respbody = response.body - res = type() - res_items = [] - doc = minidom.parseString(respbody) - type_name = type.__name__ - item_name = item_type.__name__ - for item in _get_children_from_path(doc, type_name, item_name): - res_items.append(_fill_instance_element(item, item_type)) - - setattr(res, list_name, res_items) - return res - - -def _parse_response(response, return_type): - ''' - Parse the HTTPResponse's body and fill all the data into a class of - return_type. - ''' - return _parse_response_body_from_xml_text(response.body, return_type) - - -def _fill_data_to_return_object(node, return_obj): - members = dict(vars(return_obj)) - for name, value in members.items(): - if isinstance(value, _list_of): - setattr(return_obj, - name, - _fill_list_of(node, - value.list_type, - value.xml_element_name)) - elif isinstance(value, _scalar_list_of): - setattr(return_obj, - name, - _fill_scalar_list_of(node, - value.list_type, - _get_serialization_name(name), - value.xml_element_name)) - elif isinstance(value, _dict_of): - setattr(return_obj, - name, - _fill_dict_of(node, - _get_serialization_name(name), - value.pair_xml_element_name, - value.key_xml_element_name, - value.value_xml_element_name)) - elif isinstance(value, WindowsAzureData): - setattr(return_obj, - name, - _fill_instance_child(node, name, value.__class__)) - elif isinstance(value, dict): - setattr(return_obj, - name, - _fill_dict(node, _get_serialization_name(name))) - elif isinstance(value, _Base64String): - value = _fill_data_minidom(node, name, '') - if value is not None: - value = _decode_base64_to_text(value) - # always set the attribute, so we don't end up returning an object - # with type _Base64String - setattr(return_obj, name, value) - else: - value = _fill_data_minidom(node, name, value) - if value is not None: - setattr(return_obj, name, value) - - -def _parse_response_body_from_xml_node(node, return_type): - ''' - parse the xml and fill all the data into a class of return_type - ''' - return_obj = return_type() - _fill_data_to_return_object(node, return_obj) - - return return_obj - - -def _parse_response_body_from_xml_text(respbody, return_type): - ''' - parse the xml and fill all the data into a class of return_type - ''' - doc = minidom.parseString(respbody) - return_obj = return_type() - for node in _get_child_nodes(doc, return_type.__name__): - _fill_data_to_return_object(node, return_obj) - - return return_obj - - -class _dict_of(dict): - - """a dict which carries with it the xml element names for key,val. - Used for deserializaion and construction of the lists""" - - def __init__(self, pair_xml_element_name, key_xml_element_name, - value_xml_element_name): - self.pair_xml_element_name = pair_xml_element_name - self.key_xml_element_name = key_xml_element_name - self.value_xml_element_name = value_xml_element_name - super(_dict_of, self).__init__() - - -class _list_of(list): - - """a list which carries with it the type that's expected to go in it. - Used for deserializaion and construction of the lists""" - - def __init__(self, list_type, xml_element_name=None): - self.list_type = list_type - if xml_element_name is None: - self.xml_element_name = list_type.__name__ - else: - self.xml_element_name = xml_element_name - super(_list_of, self).__init__() - - -class _scalar_list_of(list): - - """a list of scalar types which carries with it the type that's - expected to go in it along with its xml element name. - Used for deserializaion and construction of the lists""" - - def __init__(self, list_type, xml_element_name): - self.list_type = list_type - self.xml_element_name = xml_element_name - super(_scalar_list_of, self).__init__() - - -def _update_request_uri_query_local_storage(request, use_local_storage): - ''' create correct uri and query for the request ''' - uri, query = _update_request_uri_query(request) - if use_local_storage: - return '/' + DEV_ACCOUNT_NAME + uri, query - return uri, query - - -def _update_request_uri_query(request): - '''pulls the query string out of the URI and moves it into - the query portion of the request object. If there are already - query parameters on the request the parameters in the URI will - appear after the existing parameters''' - - if '?' in request.path: - request.path, _, query_string = request.path.partition('?') - if query_string: - query_params = query_string.split('&') - for query in query_params: - if '=' in query: - name, _, value = query.partition('=') - request.query.append((name, value)) - - request.path = url_quote(request.path, '/()$=\',') - - # add encoded queries to request.path. - if request.query: - request.path += '?' - for name, value in request.query: - if value is not None: - request.path += name + '=' + url_quote(value, '/()$=\',') + '&' - request.path = request.path[:-1] - - return request.path, request.query - - -def _dont_fail_on_exist(error): - ''' don't throw exception if the resource exists. - This is called by create_* APIs with fail_on_exist=False''' - if isinstance(error, WindowsAzureConflictError): - return False - else: - raise error - - -def _dont_fail_not_exist(error): - ''' don't throw exception if the resource doesn't exist. - This is called by create_* APIs with fail_on_exist=False''' - if isinstance(error, WindowsAzureMissingResourceError): - return False - else: - raise error - - -def _general_error_handler(http_error): - ''' Simple error handler for azure.''' - if http_error.status == 409: - raise WindowsAzureConflictError( - _ERROR_CONFLICT.format(str(http_error))) - elif http_error.status == 404: - raise WindowsAzureMissingResourceError( - _ERROR_NOT_FOUND.format(str(http_error))) - else: - if http_error.respbody is not None: - raise WindowsAzureError( - _ERROR_UNKNOWN.format(str(http_error)) + '\n' + \ - http_error.respbody.decode('utf-8')) - else: - raise WindowsAzureError(_ERROR_UNKNOWN.format(str(http_error))) - - -def _parse_response_for_dict(response): - ''' Extracts name-values from response header. Filter out the standard - http headers.''' - - if response is None: - return None - http_headers = ['server', 'date', 'location', 'host', - 'via', 'proxy-connection', 'connection'] - return_dict = HeaderDict() - if response.headers: - for name, value in response.headers: - if not name.lower() in http_headers: - return_dict[name] = value - - return return_dict - - -def _parse_response_for_dict_prefix(response, prefixes): - ''' Extracts name-values for names starting with prefix from response - header. Filter out the standard http headers.''' - - if response is None: - return None - return_dict = {} - orig_dict = _parse_response_for_dict(response) - if orig_dict: - for name, value in orig_dict.items(): - for prefix_value in prefixes: - if name.lower().startswith(prefix_value.lower()): - return_dict[name] = value - break - return return_dict - else: - return None - - -def _parse_response_for_dict_filter(response, filter): - ''' Extracts name-values for names in filter from response header. Filter - out the standard http headers.''' - if response is None: - return None - return_dict = {} - orig_dict = _parse_response_for_dict(response) - if orig_dict: - for name, value in orig_dict.items(): - if name.lower() in filter: - return_dict[name] = value - return return_dict - else: - return None +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +import ast +import base64 +import hashlib +import hmac +import sys +import types +import warnings +if sys.version_info < (3,): + from urllib2 import quote as url_quote + from urllib2 import unquote as url_unquote + _strtype = basestring +else: + from urllib.parse import quote as url_quote + from urllib.parse import unquote as url_unquote + _strtype = str + +from datetime import datetime +from xml.dom import minidom +from xml.sax.saxutils import escape as xml_escape + +#-------------------------------------------------------------------------- +# constants + +__author__ = 'Microsoft Corp. <ptvshelp@microsoft.com>' +__version__ = '0.9.0' + +# Live ServiceClient URLs +BLOB_SERVICE_HOST_BASE = '.blob.core.windows.net' +QUEUE_SERVICE_HOST_BASE = '.queue.core.windows.net' +TABLE_SERVICE_HOST_BASE = '.table.core.windows.net' +SERVICE_BUS_HOST_BASE = '.servicebus.windows.net' +MANAGEMENT_HOST = 'management.core.windows.net' + +# Development ServiceClient URLs +DEV_BLOB_HOST = '127.0.0.1:10000' +DEV_QUEUE_HOST = '127.0.0.1:10001' +DEV_TABLE_HOST = '127.0.0.1:10002' + +# Default credentials for Development Storage Service +DEV_ACCOUNT_NAME = 'devstoreaccount1' +DEV_ACCOUNT_KEY = 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==' + +# All of our error messages +_ERROR_CANNOT_FIND_PARTITION_KEY = 'Cannot find partition key in request.' +_ERROR_CANNOT_FIND_ROW_KEY = 'Cannot find row key in request.' +_ERROR_INCORRECT_TABLE_IN_BATCH = \ + 'Table should be the same in a batch operations' +_ERROR_INCORRECT_PARTITION_KEY_IN_BATCH = \ + 'Partition Key should be the same in a batch operations' +_ERROR_DUPLICATE_ROW_KEY_IN_BATCH = \ + 'Row Keys should not be the same in a batch operations' +_ERROR_BATCH_COMMIT_FAIL = 'Batch Commit Fail' +_ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_DELETE = \ + 'Message is not peek locked and cannot be deleted.' +_ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_UNLOCK = \ + 'Message is not peek locked and cannot be unlocked.' +_ERROR_QUEUE_NOT_FOUND = 'Queue was not found' +_ERROR_TOPIC_NOT_FOUND = 'Topic was not found' +_ERROR_CONFLICT = 'Conflict ({0})' +_ERROR_NOT_FOUND = 'Not found ({0})' +_ERROR_UNKNOWN = 'Unknown error ({0})' +_ERROR_SERVICEBUS_MISSING_INFO = \ + 'You need to provide servicebus namespace, access key and Issuer' +_ERROR_STORAGE_MISSING_INFO = \ + 'You need to provide both account name and access key' +_ERROR_ACCESS_POLICY = \ + 'share_access_policy must be either SignedIdentifier or AccessPolicy ' + \ + 'instance' +_WARNING_VALUE_SHOULD_BE_BYTES = \ + 'Warning: {0} must be bytes data type. It will be converted ' + \ + 'automatically, with utf-8 text encoding.' +_ERROR_VALUE_SHOULD_BE_BYTES = '{0} should be of type bytes.' +_ERROR_VALUE_NONE = '{0} should not be None.' +_ERROR_VALUE_NEGATIVE = '{0} should not be negative.' +_ERROR_CANNOT_SERIALIZE_VALUE_TO_ENTITY = \ + 'Cannot serialize the specified value ({0}) to an entity. Please use ' + \ + 'an EntityProperty (which can specify custom types), int, str, bool, ' + \ + 'or datetime.' +_ERROR_PAGE_BLOB_SIZE_ALIGNMENT = \ + 'Invalid page blob size: {0}. ' + \ + 'The size must be aligned to a 512-byte boundary.' + +_USER_AGENT_STRING = 'pyazure/' + __version__ + +METADATA_NS = 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' + + +class WindowsAzureData(object): + + ''' This is the base of data class. + It is only used to check whether it is instance or not. ''' + pass + +class WindowsAzureError(Exception): + + ''' WindowsAzure Exception base class. ''' + + def __init__(self, message): + super(WindowsAzureError, self).__init__(message) + + +class WindowsAzureConflictError(WindowsAzureError): + + '''Indicates that the resource could not be created because it already + exists''' + + def __init__(self, message): + super(WindowsAzureConflictError, self).__init__(message) + + +class WindowsAzureMissingResourceError(WindowsAzureError): + + '''Indicates that a request for a request for a resource (queue, table, + container, etc...) failed because the specified resource does not exist''' + + def __init__(self, message): + super(WindowsAzureMissingResourceError, self).__init__(message) + + +class WindowsAzureBatchOperationError(WindowsAzureError): + + '''Indicates that a batch operation failed''' + + def __init__(self, message, code): + super(WindowsAzureBatchOperationError, self).__init__(message) + self.code = code + + +class Feed(object): + pass + + +class _Base64String(str): + pass + + +class HeaderDict(dict): + + def __getitem__(self, index): + return super(HeaderDict, self).__getitem__(index.lower()) + + +def _encode_base64(data): + if isinstance(data, _unicode_type): + data = data.encode('utf-8') + encoded = base64.b64encode(data) + return encoded.decode('utf-8') + + +def _decode_base64_to_bytes(data): + if isinstance(data, _unicode_type): + data = data.encode('utf-8') + return base64.b64decode(data) + + +def _decode_base64_to_text(data): + decoded_bytes = _decode_base64_to_bytes(data) + return decoded_bytes.decode('utf-8') + + +def _get_readable_id(id_name, id_prefix_to_skip): + """simplified an id to be more friendly for us people""" + # id_name is in the form 'https://namespace.host.suffix/name' + # where name may contain a forward slash! + pos = id_name.find('//') + if pos != -1: + pos += 2 + if id_prefix_to_skip: + pos = id_name.find(id_prefix_to_skip, pos) + if pos != -1: + pos += len(id_prefix_to_skip) + pos = id_name.find('/', pos) + if pos != -1: + return id_name[pos + 1:] + return id_name + + +def _get_entry_properties_from_node(entry, include_id, id_prefix_to_skip=None, use_title_as_id=False): + ''' get properties from entry xml ''' + properties = {} + + etag = entry.getAttributeNS(METADATA_NS, 'etag') + if etag: + properties['etag'] = etag + for updated in _get_child_nodes(entry, 'updated'): + properties['updated'] = updated.firstChild.nodeValue + for name in _get_children_from_path(entry, 'author', 'name'): + if name.firstChild is not None: + properties['author'] = name.firstChild.nodeValue + + if include_id: + if use_title_as_id: + for title in _get_child_nodes(entry, 'title'): + properties['name'] = title.firstChild.nodeValue + else: + for id in _get_child_nodes(entry, 'id'): + properties['name'] = _get_readable_id( + id.firstChild.nodeValue, id_prefix_to_skip) + + return properties + + +def _get_entry_properties(xmlstr, include_id, id_prefix_to_skip=None): + ''' get properties from entry xml ''' + xmldoc = minidom.parseString(xmlstr) + properties = {} + + for entry in _get_child_nodes(xmldoc, 'entry'): + properties.update(_get_entry_properties_from_node(entry, include_id, id_prefix_to_skip)) + + return properties + + +def _get_first_child_node_value(parent_node, node_name): + xml_attrs = _get_child_nodes(parent_node, node_name) + if xml_attrs: + xml_attr = xml_attrs[0] + if xml_attr.firstChild: + value = xml_attr.firstChild.nodeValue + return value + + +def _get_child_nodes(node, tagName): + return [childNode for childNode in node.getElementsByTagName(tagName) + if childNode.parentNode == node] + + +def _get_children_from_path(node, *path): + '''descends through a hierarchy of nodes returning the list of children + at the inner most level. Only returns children who share a common parent, + not cousins.''' + cur = node + for index, child in enumerate(path): + if isinstance(child, _strtype): + next = _get_child_nodes(cur, child) + else: + next = _get_child_nodesNS(cur, *child) + if index == len(path) - 1: + return next + elif not next: + break + + cur = next[0] + return [] + + +def _get_child_nodesNS(node, ns, tagName): + return [childNode for childNode in node.getElementsByTagNameNS(ns, tagName) + if childNode.parentNode == node] + + +def _create_entry(entry_body): + ''' Adds common part of entry to a given entry body and return the whole + xml. ''' + updated_str = datetime.utcnow().isoformat() + if datetime.utcnow().utcoffset() is None: + updated_str += '+00:00' + + entry_start = '''<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom" > +<title /><updated>{updated}</updated><author><name /></author><id /> +<content type="application/xml"> + {body}</content></entry>''' + return entry_start.format(updated=updated_str, body=entry_body) + + +def _to_datetime(strtime): + return datetime.strptime(strtime, "%Y-%m-%dT%H:%M:%S.%f") + +_KNOWN_SERIALIZATION_XFORMS = { + 'include_apis': 'IncludeAPIs', + 'message_id': 'MessageId', + 'content_md5': 'Content-MD5', + 'last_modified': 'Last-Modified', + 'cache_control': 'Cache-Control', + 'account_admin_live_email_id': 'AccountAdminLiveEmailId', + 'service_admin_live_email_id': 'ServiceAdminLiveEmailId', + 'subscription_id': 'SubscriptionID', + 'fqdn': 'FQDN', + 'private_id': 'PrivateID', + 'os_virtual_hard_disk': 'OSVirtualHardDisk', + 'logical_disk_size_in_gb': 'LogicalDiskSizeInGB', + 'logical_size_in_gb': 'LogicalSizeInGB', + 'os': 'OS', + 'persistent_vm_downtime_info': 'PersistentVMDowntimeInfo', + 'copy_id': 'CopyId', + 'os_state': 'OSState', + 'vm_image': 'VMImage', + 'vm_images': 'VMImages', + 'os_disk_configuration': 'OSDiskConfiguration', + 'public_ips': 'PublicIPs', + 'public_ip': 'PublicIP', + 'supported_os': 'SupportedOS', + 'reserved_ip': 'ReservedIP', + 'reserved_ips': 'ReservedIPs', + 'aad_tenant_id': 'AADTenantID', + 'start_ip_address': 'StartIPAddress', + 'end_ip_address': 'EndIPAddress', + } + + +def _get_serialization_name(element_name): + """converts a Python name into a serializable name""" + known = _KNOWN_SERIALIZATION_XFORMS.get(element_name) + if known is not None: + return known + + if element_name.startswith('x_ms_'): + return element_name.replace('_', '-') + if element_name.endswith('_id'): + element_name = element_name.replace('_id', 'ID') + for name in ['content_', 'last_modified', 'if_', 'cache_control']: + if element_name.startswith(name): + element_name = element_name.replace('_', '-_') + + return ''.join(name.capitalize() for name in element_name.split('_')) + +if sys.version_info < (3,): + _unicode_type = unicode + + def _str(value): + if isinstance(value, unicode): + return value.encode('utf-8') + + return str(value) +else: + _str = str + _unicode_type = str + + +def _str_or_none(value): + if value is None: + return None + + return _str(value) + + +def _int_or_none(value): + if value is None: + return None + + return str(int(value)) + + +def _bool_or_none(value): + if value is None: + return None + + if isinstance(value, bool): + if value: + return 'true' + else: + return 'false' + + return str(value) + + +def _convert_class_to_xml(source, xml_prefix=True): + if source is None: + return '' + + xmlstr = '' + if xml_prefix: + xmlstr = '<?xml version="1.0" encoding="utf-8"?>' + + if isinstance(source, list): + for value in source: + xmlstr += _convert_class_to_xml(value, False) + elif isinstance(source, WindowsAzureData): + class_name = source.__class__.__name__ + xmlstr += '<' + class_name + '>' + for name, value in vars(source).items(): + if value is not None: + if isinstance(value, list) or \ + isinstance(value, WindowsAzureData): + xmlstr += _convert_class_to_xml(value, False) + else: + xmlstr += ('<' + _get_serialization_name(name) + '>' + + xml_escape(str(value)) + '</' + + _get_serialization_name(name) + '>') + xmlstr += '</' + class_name + '>' + return xmlstr + + +def _find_namespaces_from_child(parent, child, namespaces): + """Recursively searches from the parent to the child, + gathering all the applicable namespaces along the way""" + for cur_child in parent.childNodes: + if cur_child is child: + return True + if _find_namespaces_from_child(cur_child, child, namespaces): + # we are the parent node + for key in cur_child.attributes.keys(): + if key.startswith('xmlns:') or key == 'xmlns': + namespaces[key] = cur_child.attributes[key] + break + return False + + +def _find_namespaces(parent, child): + res = {} + for key in parent.documentElement.attributes.keys(): + if key.startswith('xmlns:') or key == 'xmlns': + res[key] = parent.documentElement.attributes[key] + _find_namespaces_from_child(parent, child, res) + return res + + +def _clone_node_with_namespaces(node_to_clone, original_doc): + clone = node_to_clone.cloneNode(True) + + for key, value in _find_namespaces(original_doc, node_to_clone).items(): + clone.attributes[key] = value + + return clone + + +def _convert_response_to_feeds(response, convert_func): + if response is None: + return None + + feeds = _list_of(Feed) + + x_ms_continuation = HeaderDict() + for name, value in response.headers: + if 'x-ms-continuation' in name: + x_ms_continuation[name[len('x-ms-continuation') + 1:]] = value + if x_ms_continuation: + setattr(feeds, 'x_ms_continuation', x_ms_continuation) + + xmldoc = minidom.parseString(response.body) + xml_entries = _get_children_from_path(xmldoc, 'feed', 'entry') + if not xml_entries: + # in some cases, response contains only entry but no feed + xml_entries = _get_children_from_path(xmldoc, 'entry') + for xml_entry in xml_entries: + new_node = _clone_node_with_namespaces(xml_entry, xmldoc) + feeds.append(convert_func(new_node.toxml('utf-8'))) + + return feeds + + +def _convert_xml_to_windows_azure_object(xmlstr, azure_type, include_id=True, use_title_as_id=True): + xmldoc = minidom.parseString(xmlstr) + return_obj = azure_type() + xml_name = azure_type._xml_name if hasattr(azure_type, '_xml_name') else azure_type.__name__ + + # Only one entry here + for xml_entry in _get_children_from_path(xmldoc, + 'entry'): + for node in _get_children_from_path(xml_entry, + 'content', + xml_name): + _fill_data_to_return_object(node, return_obj) + for name, value in _get_entry_properties_from_node(xml_entry, + include_id=include_id, + use_title_as_id=use_title_as_id).items(): + setattr(return_obj, name, value) + return return_obj + + +def _validate_type_bytes(param_name, param): + if not isinstance(param, bytes): + raise TypeError(_ERROR_VALUE_SHOULD_BE_BYTES.format(param_name)) + + +def _validate_not_none(param_name, param): + if param is None: + raise TypeError(_ERROR_VALUE_NONE.format(param_name)) + + +def _fill_list_of(xmldoc, element_type, xml_element_name): + xmlelements = _get_child_nodes(xmldoc, xml_element_name) + return [_parse_response_body_from_xml_node(xmlelement, element_type) \ + for xmlelement in xmlelements] + + +def _fill_scalar_list_of(xmldoc, element_type, parent_xml_element_name, + xml_element_name): + '''Converts an xml fragment into a list of scalar types. The parent xml + element contains a flat list of xml elements which are converted into the + specified scalar type and added to the list. + Example: + xmldoc= +<Endpoints> + <Endpoint>http://{storage-service-name}.blob.core.windows.net/</Endpoint> + <Endpoint>http://{storage-service-name}.queue.core.windows.net/</Endpoint> + <Endpoint>http://{storage-service-name}.table.core.windows.net/</Endpoint> +</Endpoints> + element_type=str + parent_xml_element_name='Endpoints' + xml_element_name='Endpoint' + ''' + xmlelements = _get_child_nodes(xmldoc, parent_xml_element_name) + if xmlelements: + xmlelements = _get_child_nodes(xmlelements[0], xml_element_name) + return [_get_node_value(xmlelement, element_type) \ + for xmlelement in xmlelements] + + +def _fill_dict(xmldoc, element_name): + xmlelements = _get_child_nodes(xmldoc, element_name) + if xmlelements: + return_obj = {} + for child in xmlelements[0].childNodes: + if child.firstChild: + return_obj[child.nodeName] = child.firstChild.nodeValue + return return_obj + + +def _fill_dict_of(xmldoc, parent_xml_element_name, pair_xml_element_name, + key_xml_element_name, value_xml_element_name): + '''Converts an xml fragment into a dictionary. The parent xml element + contains a list of xml elements where each element has a child element for + the key, and another for the value. + Example: + xmldoc= +<ExtendedProperties> + <ExtendedProperty> + <Name>Ext1</Name> + <Value>Val1</Value> + </ExtendedProperty> + <ExtendedProperty> + <Name>Ext2</Name> + <Value>Val2</Value> + </ExtendedProperty> +</ExtendedProperties> + element_type=str + parent_xml_element_name='ExtendedProperties' + pair_xml_element_name='ExtendedProperty' + key_xml_element_name='Name' + value_xml_element_name='Value' + ''' + return_obj = {} + + xmlelements = _get_child_nodes(xmldoc, parent_xml_element_name) + if xmlelements: + xmlelements = _get_child_nodes(xmlelements[0], pair_xml_element_name) + for pair in xmlelements: + keys = _get_child_nodes(pair, key_xml_element_name) + values = _get_child_nodes(pair, value_xml_element_name) + if keys and values: + key = keys[0].firstChild.nodeValue + value = values[0].firstChild.nodeValue + return_obj[key] = value + + return return_obj + + +def _fill_instance_child(xmldoc, element_name, return_type): + '''Converts a child of the current dom element to the specified type. + ''' + xmlelements = _get_child_nodes( + xmldoc, _get_serialization_name(element_name)) + + if not xmlelements: + return None + + return_obj = return_type() + _fill_data_to_return_object(xmlelements[0], return_obj) + + return return_obj + + +def _fill_instance_element(element, return_type): + """Converts a DOM element into the specified object""" + return _parse_response_body_from_xml_node(element, return_type) + + +def _fill_data_minidom(xmldoc, element_name, data_member): + xmlelements = _get_child_nodes( + xmldoc, _get_serialization_name(element_name)) + + if not xmlelements or not xmlelements[0].childNodes: + return None + + value = xmlelements[0].firstChild.nodeValue + + if data_member is None: + return value + elif isinstance(data_member, datetime): + return _to_datetime(value) + elif type(data_member) is bool: + return value.lower() != 'false' + else: + return type(data_member)(value) + + +def _get_node_value(xmlelement, data_type): + value = xmlelement.firstChild.nodeValue + if data_type is datetime: + return _to_datetime(value) + elif data_type is bool: + return value.lower() != 'false' + else: + return data_type(value) + + +def _get_request_body_bytes_only(param_name, param_value): + '''Validates the request body passed in and converts it to bytes + if our policy allows it.''' + if param_value is None: + return b'' + + if isinstance(param_value, bytes): + return param_value + + # Previous versions of the SDK allowed data types other than bytes to be + # passed in, and they would be auto-converted to bytes. We preserve this + # behavior when running under 2.7, but issue a warning. + # Python 3 support is new, so we reject anything that's not bytes. + if sys.version_info < (3,): + warnings.warn(_WARNING_VALUE_SHOULD_BE_BYTES.format(param_name)) + return _get_request_body(param_value) + + raise TypeError(_ERROR_VALUE_SHOULD_BE_BYTES.format(param_name)) + + +def _get_request_body(request_body): + '''Converts an object into a request body. If it's None + we'll return an empty string, if it's one of our objects it'll + convert it to XML and return it. Otherwise we just use the object + directly''' + if request_body is None: + return b'' + + if isinstance(request_body, WindowsAzureData): + request_body = _convert_class_to_xml(request_body) + + if isinstance(request_body, bytes): + return request_body + + if isinstance(request_body, _unicode_type): + return request_body.encode('utf-8') + + request_body = str(request_body) + if isinstance(request_body, _unicode_type): + return request_body.encode('utf-8') + + return request_body + + +def _parse_enum_results_list(response, return_type, resp_type, item_type): + """resp_body is the XML we received +resp_type is a string, such as Containers, +return_type is the type we're constructing, such as ContainerEnumResults +item_type is the type object of the item to be created, such as Container + +This function then returns a ContainerEnumResults object with the +containers member populated with the results. +""" + + # parsing something like: + # <EnumerationResults ... > + # <Queues> + # <Queue> + # <Something /> + # <SomethingElse /> + # </Queue> + # </Queues> + # </EnumerationResults> + respbody = response.body + return_obj = return_type() + doc = minidom.parseString(respbody) + + items = [] + for enum_results in _get_child_nodes(doc, 'EnumerationResults'): + # path is something like Queues, Queue + for child in _get_children_from_path(enum_results, + resp_type, + resp_type[:-1]): + items.append(_fill_instance_element(child, item_type)) + + for name, value in vars(return_obj).items(): + # queues, Queues, this is the list its self which we populated + # above + if name == resp_type.lower(): + # the list its self. + continue + value = _fill_data_minidom(enum_results, name, value) + if value is not None: + setattr(return_obj, name, value) + + setattr(return_obj, resp_type.lower(), items) + return return_obj + + +def _parse_simple_list(response, type, item_type, list_name): + respbody = response.body + res = type() + res_items = [] + doc = minidom.parseString(respbody) + type_name = type.__name__ + item_name = item_type.__name__ + for item in _get_children_from_path(doc, type_name, item_name): + res_items.append(_fill_instance_element(item, item_type)) + + setattr(res, list_name, res_items) + return res + + +def _parse_response(response, return_type): + ''' + Parse the HTTPResponse's body and fill all the data into a class of + return_type. + ''' + return _parse_response_body_from_xml_text(response.body, return_type) + +def _parse_service_resources_response(response, return_type): + ''' + Parse the HTTPResponse's body and fill all the data into a class of + return_type. + ''' + return _parse_response_body_from_service_resources_xml_text(response.body, return_type) + + +def _fill_data_to_return_object(node, return_obj): + members = dict(vars(return_obj)) + for name, value in members.items(): + if isinstance(value, _list_of): + setattr(return_obj, + name, + _fill_list_of(node, + value.list_type, + value.xml_element_name)) + elif isinstance(value, _scalar_list_of): + setattr(return_obj, + name, + _fill_scalar_list_of(node, + value.list_type, + _get_serialization_name(name), + value.xml_element_name)) + elif isinstance(value, _dict_of): + setattr(return_obj, + name, + _fill_dict_of(node, + _get_serialization_name(name), + value.pair_xml_element_name, + value.key_xml_element_name, + value.value_xml_element_name)) + elif isinstance(value, _xml_attribute): + real_value = None + if node.hasAttribute(value.xml_element_name): + real_value = node.getAttribute(value.xml_element_name) + if real_value is not None: + setattr(return_obj, name, real_value) + elif isinstance(value, WindowsAzureData): + setattr(return_obj, + name, + _fill_instance_child(node, name, value.__class__)) + elif isinstance(value, dict): + setattr(return_obj, + name, + _fill_dict(node, _get_serialization_name(name))) + elif isinstance(value, _Base64String): + value = _fill_data_minidom(node, name, '') + if value is not None: + value = _decode_base64_to_text(value) + # always set the attribute, so we don't end up returning an object + # with type _Base64String + setattr(return_obj, name, value) + else: + value = _fill_data_minidom(node, name, value) + if value is not None: + setattr(return_obj, name, value) + + +def _parse_response_body_from_xml_node(node, return_type): + ''' + parse the xml and fill all the data into a class of return_type + ''' + return_obj = return_type() + _fill_data_to_return_object(node, return_obj) + + return return_obj + + +def _parse_response_body_from_xml_text(respbody, return_type): + ''' + parse the xml and fill all the data into a class of return_type + ''' + doc = minidom.parseString(respbody) + return_obj = return_type() + xml_name = return_type._xml_name if hasattr(return_type, '_xml_name') else return_type.__name__ + for node in _get_child_nodes(doc, xml_name): + _fill_data_to_return_object(node, return_obj) + + return return_obj + +def _parse_response_body_from_service_resources_xml_text(respbody, return_type): + ''' + parse the xml and fill all the data into a class of return_type + ''' + doc = minidom.parseString(respbody) + return_obj = _list_of(return_type) + for node in _get_children_from_path(doc, "ServiceResources", "ServiceResource"): + local_obj = return_type() + _fill_data_to_return_object(node, local_obj) + return_obj.append(local_obj) + + return return_obj + +class _dict_of(dict): + + """a dict which carries with it the xml element names for key,val. + Used for deserializaion and construction of the lists""" + + def __init__(self, pair_xml_element_name, key_xml_element_name, + value_xml_element_name): + self.pair_xml_element_name = pair_xml_element_name + self.key_xml_element_name = key_xml_element_name + self.value_xml_element_name = value_xml_element_name + super(_dict_of, self).__init__() + + +class _list_of(list): + + """a list which carries with it the type that's expected to go in it. + Used for deserializaion and construction of the lists""" + + def __init__(self, list_type, xml_element_name=None): + self.list_type = list_type + if xml_element_name is None: + self.xml_element_name = list_type.__name__ + else: + self.xml_element_name = xml_element_name + super(_list_of, self).__init__() + + +class _scalar_list_of(list): + + """a list of scalar types which carries with it the type that's + expected to go in it along with its xml element name. + Used for deserializaion and construction of the lists""" + + def __init__(self, list_type, xml_element_name): + self.list_type = list_type + self.xml_element_name = xml_element_name + super(_scalar_list_of, self).__init__() + +class _xml_attribute: + + """a accessor to XML attributes + expected to go in it along with its xml element name. + Used for deserialization and construction""" + + def __init__(self, xml_element_name): + self.xml_element_name = xml_element_name + + +def _update_request_uri_query_local_storage(request, use_local_storage): + ''' create correct uri and query for the request ''' + uri, query = _update_request_uri_query(request) + if use_local_storage: + return '/' + DEV_ACCOUNT_NAME + uri, query + return uri, query + + +def _update_request_uri_query(request): + '''pulls the query string out of the URI and moves it into + the query portion of the request object. If there are already + query parameters on the request the parameters in the URI will + appear after the existing parameters''' + + if '?' in request.path: + request.path, _, query_string = request.path.partition('?') + if query_string: + query_params = query_string.split('&') + for query in query_params: + if '=' in query: + name, _, value = query.partition('=') + request.query.append((name, value)) + + request.path = url_quote(request.path, '/()$=\',') + + # add encoded queries to request.path. + if request.query: + request.path += '?' + for name, value in request.query: + if value is not None: + request.path += name + '=' + url_quote(value, '/()$=\',') + '&' + request.path = request.path[:-1] + + return request.path, request.query + + +def _dont_fail_on_exist(error): + ''' don't throw exception if the resource exists. + This is called by create_* APIs with fail_on_exist=False''' + if isinstance(error, WindowsAzureConflictError): + return False + else: + raise error + + +def _dont_fail_not_exist(error): + ''' don't throw exception if the resource doesn't exist. + This is called by create_* APIs with fail_on_exist=False''' + if isinstance(error, WindowsAzureMissingResourceError): + return False + else: + raise error + + +def _general_error_handler(http_error): + ''' Simple error handler for azure.''' + if http_error.status == 409: + raise WindowsAzureConflictError( + _ERROR_CONFLICT.format(str(http_error))) + elif http_error.status == 404: + raise WindowsAzureMissingResourceError( + _ERROR_NOT_FOUND.format(str(http_error))) + else: + if http_error.respbody is not None: + raise WindowsAzureError( + _ERROR_UNKNOWN.format(str(http_error)) + '\n' + \ + http_error.respbody.decode('utf-8')) + else: + raise WindowsAzureError(_ERROR_UNKNOWN.format(str(http_error))) + + +def _parse_response_for_dict(response): + ''' Extracts name-values from response header. Filter out the standard + http headers.''' + + if response is None: + return None + http_headers = ['server', 'date', 'location', 'host', + 'via', 'proxy-connection', 'connection'] + return_dict = HeaderDict() + if response.headers: + for name, value in response.headers: + if not name.lower() in http_headers: + return_dict[name] = value + + return return_dict + + +def _parse_response_for_dict_prefix(response, prefixes): + ''' Extracts name-values for names starting with prefix from response + header. Filter out the standard http headers.''' + + if response is None: + return None + return_dict = {} + orig_dict = _parse_response_for_dict(response) + if orig_dict: + for name, value in orig_dict.items(): + for prefix_value in prefixes: + if name.lower().startswith(prefix_value.lower()): + return_dict[name] = value + break + return return_dict + else: + return None + + +def _parse_response_for_dict_filter(response, filter): + ''' Extracts name-values for names in filter from response header. Filter + out the standard http headers.''' + if response is None: + return None + return_dict = {} + orig_dict = _parse_response_for_dict(response) + if orig_dict: + for name, value in orig_dict.items(): + if name.lower() in filter: + return_dict[name] = value + return return_dict + else: + return None + + +def _sign_string(key, string_to_sign, key_is_base64=True): + if key_is_base64: + key = _decode_base64_to_bytes(key) + else: + if isinstance(key, _unicode_type): + key = key.encode('utf-8') + if isinstance(string_to_sign, _unicode_type): + string_to_sign = string_to_sign.encode('utf-8') + signed_hmac_sha256 = hmac.HMAC(key, string_to_sign, hashlib.sha256) + digest = signed_hmac_sha256.digest() + encoded_digest = _encode_base64(digest) + return encoded_digest diff --git a/awx/lib/site-packages/azure/azure.pyproj b/awx/lib/site-packages/azure/azure.pyproj new file mode 100644 index 0000000000..bb79dc0229 --- /dev/null +++ b/awx/lib/site-packages/azure/azure.pyproj @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{25b2c65a-0553-4452-8907-8b5b17544e68}</ProjectGuid> + <ProjectHome> + </ProjectHome> + <StartupFile>storage\blobservice.py</StartupFile> + <SearchPath>..</SearchPath> + <WorkingDirectory>.</WorkingDirectory> + <OutputPath>.</OutputPath> + <Name>azure</Name> + <RootNamespace>azure</RootNamespace> + <IsWindowsApplication>False</IsWindowsApplication> + <LaunchProvider>Standard Python launcher</LaunchProvider> + <CommandLineArguments /> + <InterpreterPath /> + <InterpreterArguments /> + <InterpreterId>{2af0f10d-7135-4994-9156-5d01c9c11b7e}</InterpreterId> + <InterpreterVersion>2.7</InterpreterVersion> + <SccProjectName>SAK</SccProjectName> + <SccProvider>SAK</SccProvider> + <SccAuxPath>SAK</SccAuxPath> + <SccLocalPath>SAK</SccLocalPath> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> + <DebugSymbols>true</DebugSymbols> + <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)' == 'Release' "> + <DebugSymbols>true</DebugSymbols> + <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging> + </PropertyGroup> + <ItemGroup> + <Compile Include="http\batchclient.py" /> + <Compile Include="http\httpclient.py" /> + <Compile Include="http\requestsclient.py" /> + <Compile Include="http\winhttp.py" /> + <Compile Include="http\__init__.py" /> + <Compile Include="servicemanagement\schedulermanagementservice.py" /> + <Compile Include="servicemanagement\servicebusmanagementservice.py" /> + <Compile Include="servicemanagement\servicemanagementclient.py" /> + <Compile Include="servicemanagement\servicemanagementservice.py" /> + <Compile Include="servicemanagement\sqldatabasemanagementservice.py" /> + <Compile Include="servicemanagement\websitemanagementservice.py" /> + <Compile Include="servicemanagement\__init__.py" /> + <Compile Include="servicebus\servicebusservice.py" /> + <Compile Include="storage\blobservice.py" /> + <Compile Include="storage\queueservice.py" /> + <Compile Include="storage\cloudstorageaccount.py" /> + <Compile Include="storage\tableservice.py" /> + <Compile Include="storage\sharedaccesssignature.py" /> + <Compile Include="__init__.py" /> + <Compile Include="servicebus\__init__.py" /> + <Compile Include="storage\storageclient.py" /> + <Compile Include="storage\__init__.py" /> + </ItemGroup> + <ItemGroup> + <Folder Include="http" /> + <Folder Include="servicemanagement" /> + <Folder Include="servicebus" /> + <Folder Include="storage" /> + </ItemGroup> + <ItemGroup> + <InterpreterReference Include="{2af0f10d-7135-4994-9156-5d01c9c11b7e}\2.6" /> + <InterpreterReference Include="{2af0f10d-7135-4994-9156-5d01c9c11b7e}\2.7" /> + <InterpreterReference Include="{2af0f10d-7135-4994-9156-5d01c9c11b7e}\3.3" /> + <InterpreterReference Include="{2af0f10d-7135-4994-9156-5d01c9c11b7e}\3.4" /> + <InterpreterReference Include="{9a7a9026-48c1-4688-9d5d-e5699d47d074}\2.7" /> + <InterpreterReference Include="{9a7a9026-48c1-4688-9d5d-e5699d47d074}\3.3" /> + <InterpreterReference Include="{9a7a9026-48c1-4688-9d5d-e5699d47d074}\3.4" /> + </ItemGroup> + <PropertyGroup> + <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion> + <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> + <PtvsTargetsFile>$(VSToolsPath)\Python Tools\Microsoft.PythonTools.targets</PtvsTargetsFile> + </PropertyGroup> + <Import Condition="Exists($(PtvsTargetsFile))" Project="$(PtvsTargetsFile)" /> + <Import Condition="!Exists($(PtvsTargetsFile))" Project="$(MSBuildToolsPath)\Microsoft.Common.targets" /> +</Project> \ No newline at end of file diff --git a/awx/lib/site-packages/azure/http/__init__.py b/awx/lib/site-packages/azure/http/__init__.py index 3bc1e258db..680d5b5ad5 100644 --- a/awx/lib/site-packages/azure/http/__init__.py +++ b/awx/lib/site-packages/azure/http/__init__.py @@ -1,73 +1,73 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- - -HTTP_RESPONSE_NO_CONTENT = 204 - - -class HTTPError(Exception): - - ''' HTTP Exception when response status code >= 300 ''' - - def __init__(self, status, message, respheader, respbody): - '''Creates a new HTTPError with the specified status, message, - response headers and body''' - self.status = status - self.respheader = respheader - self.respbody = respbody - Exception.__init__(self, message) - - -class HTTPResponse(object): - - """Represents a response from an HTTP request. An HTTPResponse has the - following attributes: - - status: the status code of the response - message: the message - headers: the returned headers, as a list of (name, value) pairs - body: the body of the response - """ - - def __init__(self, status, message, headers, body): - self.status = status - self.message = message - self.headers = headers - self.body = body - - -class HTTPRequest(object): - - '''Represents an HTTP Request. An HTTP Request consists of the following - attributes: - - host: the host name to connect to - method: the method to use to connect (string such as GET, POST, PUT, etc.) - path: the uri fragment - query: query parameters specified as a list of (name, value) pairs - headers: header values specified as (name, value) pairs - body: the body of the request. - protocol_override: - specify to use this protocol instead of the global one stored in - _HTTPClient. - ''' - - def __init__(self): - self.host = '' - self.method = '' - self.path = '' - self.query = [] # list of (name, value) - self.headers = [] # list of (header name, header value) - self.body = '' - self.protocol_override = None +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- + +HTTP_RESPONSE_NO_CONTENT = 204 + + +class HTTPError(Exception): + + ''' HTTP Exception when response status code >= 300 ''' + + def __init__(self, status, message, respheader, respbody): + '''Creates a new HTTPError with the specified status, message, + response headers and body''' + self.status = status + self.respheader = respheader + self.respbody = respbody + Exception.__init__(self, message) + + +class HTTPResponse(object): + + """Represents a response from an HTTP request. An HTTPResponse has the + following attributes: + + status: the status code of the response + message: the message + headers: the returned headers, as a list of (name, value) pairs + body: the body of the response + """ + + def __init__(self, status, message, headers, body): + self.status = status + self.message = message + self.headers = headers + self.body = body + + +class HTTPRequest(object): + + '''Represents an HTTP Request. An HTTP Request consists of the following + attributes: + + host: the host name to connect to + method: the method to use to connect (string such as GET, POST, PUT, etc.) + path: the uri fragment + query: query parameters specified as a list of (name, value) pairs + headers: header values specified as (name, value) pairs + body: the body of the request. + protocol_override: + specify to use this protocol instead of the global one stored in + _HTTPClient. + ''' + + def __init__(self): + self.host = '' + self.method = '' + self.path = '' + self.query = [] # list of (name, value) + self.headers = [] # list of (header name, header value) + self.body = '' + self.protocol_override = None diff --git a/awx/lib/site-packages/azure/http/batchclient.py b/awx/lib/site-packages/azure/http/batchclient.py index 0e6d60d3bb..9bd3223e15 100644 --- a/awx/lib/site-packages/azure/http/batchclient.py +++ b/awx/lib/site-packages/azure/http/batchclient.py @@ -1,339 +1,339 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -import sys -import uuid - -from azure import ( - _update_request_uri_query, - WindowsAzureError, - WindowsAzureBatchOperationError, - _get_children_from_path, - url_unquote, - _ERROR_CANNOT_FIND_PARTITION_KEY, - _ERROR_CANNOT_FIND_ROW_KEY, - _ERROR_INCORRECT_TABLE_IN_BATCH, - _ERROR_INCORRECT_PARTITION_KEY_IN_BATCH, - _ERROR_DUPLICATE_ROW_KEY_IN_BATCH, - _ERROR_BATCH_COMMIT_FAIL, - ) -from azure.http import HTTPError, HTTPRequest, HTTPResponse -from azure.http.httpclient import _HTTPClient -from azure.storage import ( - _update_storage_table_header, - METADATA_NS, - _sign_storage_table_request, - ) -from xml.dom import minidom - -_DATASERVICES_NS = 'http://schemas.microsoft.com/ado/2007/08/dataservices' - -if sys.version_info < (3,): - def _new_boundary(): - return str(uuid.uuid1()) -else: - def _new_boundary(): - return str(uuid.uuid1()).encode('utf-8') - - -class _BatchClient(_HTTPClient): - - ''' - This is the class that is used for batch operation for storage table - service. It only supports one changeset. - ''' - - def __init__(self, service_instance, account_key, account_name, - protocol='http'): - _HTTPClient.__init__(self, service_instance, account_name=account_name, - account_key=account_key, protocol=protocol) - self.is_batch = False - self.batch_requests = [] - self.batch_table = '' - self.batch_partition_key = '' - self.batch_row_keys = [] - - def get_request_table(self, request): - ''' - Extracts table name from request.uri. The request.uri has either - "/mytable(...)" or "/mytable" format. - - request: the request to insert, update or delete entity - ''' - if '(' in request.path: - pos = request.path.find('(') - return request.path[1:pos] - else: - return request.path[1:] - - def get_request_partition_key(self, request): - ''' - Extracts PartitionKey from request.body if it is a POST request or from - request.path if it is not a POST request. Only insert operation request - is a POST request and the PartitionKey is in the request body. - - request: the request to insert, update or delete entity - ''' - if request.method == 'POST': - doc = minidom.parseString(request.body) - part_key = _get_children_from_path( - doc, 'entry', 'content', (METADATA_NS, 'properties'), - (_DATASERVICES_NS, 'PartitionKey')) - if not part_key: - raise WindowsAzureError(_ERROR_CANNOT_FIND_PARTITION_KEY) - return part_key[0].firstChild.nodeValue - else: - uri = url_unquote(request.path) - pos1 = uri.find('PartitionKey=\'') - pos2 = uri.find('\',', pos1) - if pos1 == -1 or pos2 == -1: - raise WindowsAzureError(_ERROR_CANNOT_FIND_PARTITION_KEY) - return uri[pos1 + len('PartitionKey=\''):pos2] - - def get_request_row_key(self, request): - ''' - Extracts RowKey from request.body if it is a POST request or from - request.path if it is not a POST request. Only insert operation request - is a POST request and the Rowkey is in the request body. - - request: the request to insert, update or delete entity - ''' - if request.method == 'POST': - doc = minidom.parseString(request.body) - row_key = _get_children_from_path( - doc, 'entry', 'content', (METADATA_NS, 'properties'), - (_DATASERVICES_NS, 'RowKey')) - if not row_key: - raise WindowsAzureError(_ERROR_CANNOT_FIND_ROW_KEY) - return row_key[0].firstChild.nodeValue - else: - uri = url_unquote(request.path) - pos1 = uri.find('RowKey=\'') - pos2 = uri.find('\')', pos1) - if pos1 == -1 or pos2 == -1: - raise WindowsAzureError(_ERROR_CANNOT_FIND_ROW_KEY) - row_key = uri[pos1 + len('RowKey=\''):pos2] - return row_key - - def validate_request_table(self, request): - ''' - Validates that all requests have the same table name. Set the table - name if it is the first request for the batch operation. - - request: the request to insert, update or delete entity - ''' - if self.batch_table: - if self.get_request_table(request) != self.batch_table: - raise WindowsAzureError(_ERROR_INCORRECT_TABLE_IN_BATCH) - else: - self.batch_table = self.get_request_table(request) - - def validate_request_partition_key(self, request): - ''' - Validates that all requests have the same PartitiionKey. Set the - PartitionKey if it is the first request for the batch operation. - - request: the request to insert, update or delete entity - ''' - if self.batch_partition_key: - if self.get_request_partition_key(request) != \ - self.batch_partition_key: - raise WindowsAzureError(_ERROR_INCORRECT_PARTITION_KEY_IN_BATCH) - else: - self.batch_partition_key = self.get_request_partition_key(request) - - def validate_request_row_key(self, request): - ''' - Validates that all requests have the different RowKey and adds RowKey - to existing RowKey list. - - request: the request to insert, update or delete entity - ''' - if self.batch_row_keys: - if self.get_request_row_key(request) in self.batch_row_keys: - raise WindowsAzureError(_ERROR_DUPLICATE_ROW_KEY_IN_BATCH) - else: - self.batch_row_keys.append(self.get_request_row_key(request)) - - def begin_batch(self): - ''' - Starts the batch operation. Intializes the batch variables - - is_batch: batch operation flag. - batch_table: the table name of the batch operation - batch_partition_key: the PartitionKey of the batch requests. - batch_row_keys: the RowKey list of adding requests. - batch_requests: the list of the requests. - ''' - self.is_batch = True - self.batch_table = '' - self.batch_partition_key = '' - self.batch_row_keys = [] - self.batch_requests = [] - - def insert_request_to_batch(self, request): - ''' - Adds request to batch operation. - - request: the request to insert, update or delete entity - ''' - self.validate_request_table(request) - self.validate_request_partition_key(request) - self.validate_request_row_key(request) - self.batch_requests.append(request) - - def commit_batch(self): - ''' Resets batch flag and commits the batch requests. ''' - if self.is_batch: - self.is_batch = False - self.commit_batch_requests() - - def commit_batch_requests(self): - ''' Commits the batch requests. ''' - - batch_boundary = b'batch_' + _new_boundary() - changeset_boundary = b'changeset_' + _new_boundary() - - # Commits batch only the requests list is not empty. - if self.batch_requests: - request = HTTPRequest() - request.method = 'POST' - request.host = self.batch_requests[0].host - request.path = '/$batch' - request.headers = [ - ('Content-Type', 'multipart/mixed; boundary=' + \ - batch_boundary.decode('utf-8')), - ('Accept', 'application/atom+xml,application/xml'), - ('Accept-Charset', 'UTF-8')] - - request.body = b'--' + batch_boundary + b'\n' - request.body += b'Content-Type: multipart/mixed; boundary=' - request.body += changeset_boundary + b'\n\n' - - content_id = 1 - - # Adds each request body to the POST data. - for batch_request in self.batch_requests: - request.body += b'--' + changeset_boundary + b'\n' - request.body += b'Content-Type: application/http\n' - request.body += b'Content-Transfer-Encoding: binary\n\n' - request.body += batch_request.method.encode('utf-8') - request.body += b' http://' - request.body += batch_request.host.encode('utf-8') - request.body += batch_request.path.encode('utf-8') - request.body += b' HTTP/1.1\n' - request.body += b'Content-ID: ' - request.body += str(content_id).encode('utf-8') + b'\n' - content_id += 1 - - # Add different headers for different type requests. - if not batch_request.method == 'DELETE': - request.body += \ - b'Content-Type: application/atom+xml;type=entry\n' - for name, value in batch_request.headers: - if name == 'If-Match': - request.body += name.encode('utf-8') + b': ' - request.body += value.encode('utf-8') + b'\n' - break - request.body += b'Content-Length: ' - request.body += str(len(batch_request.body)).encode('utf-8') - request.body += b'\n\n' - request.body += batch_request.body + b'\n' - else: - for name, value in batch_request.headers: - # If-Match should be already included in - # batch_request.headers, but in case it is missing, - # just add it. - if name == 'If-Match': - request.body += name.encode('utf-8') + b': ' - request.body += value.encode('utf-8') + b'\n\n' - break - else: - request.body += b'If-Match: *\n\n' - - request.body += b'--' + changeset_boundary + b'--' + b'\n' - request.body += b'--' + batch_boundary + b'--' - - request.path, request.query = _update_request_uri_query(request) - request.headers = _update_storage_table_header(request) - auth = _sign_storage_table_request(request, - self.account_name, - self.account_key) - request.headers.append(('Authorization', auth)) - - # Submit the whole request as batch request. - response = self.perform_request(request) - if response.status >= 300: - raise HTTPError(response.status, - _ERROR_BATCH_COMMIT_FAIL, - self.respheader, - response.body) - - # http://www.odata.org/documentation/odata-version-2-0/batch-processing/ - # The body of a ChangeSet response is either a response for all the - # successfully processed change request within the ChangeSet, - # formatted exactly as it would have appeared outside of a batch, - # or a single response indicating a failure of the entire ChangeSet. - responses = self._parse_batch_response(response.body) - if responses and responses[0].status >= 300: - self._report_batch_error(responses[0]) - - def cancel_batch(self): - ''' Resets the batch flag. ''' - self.is_batch = False - - def _parse_batch_response(self, body): - parts = body.split(b'--changesetresponse_') - - responses = [] - for part in parts: - httpLocation = part.find(b'HTTP/') - if httpLocation > 0: - response = self._parse_batch_response_part(part[httpLocation:]) - responses.append(response) - - return responses - - def _parse_batch_response_part(self, part): - lines = part.splitlines(); - - # First line is the HTTP status/reason - status, _, reason = lines[0].partition(b' ')[2].partition(b' ') - - # Followed by headers and body - headers = [] - body = b'' - isBody = False - for line in lines[1:]: - if line == b'' and not isBody: - isBody = True - elif isBody: - body += line - else: - headerName, _, headerVal = line.partition(b':') - headers.append((headerName.lower(), headerVal)) - - return HTTPResponse(int(status), reason.strip(), headers, body) - - def _report_batch_error(self, response): - xml = response.body.decode('utf-8') - doc = minidom.parseString(xml) - - n = _get_children_from_path(doc, (METADATA_NS, 'error'), 'code') - code = n[0].firstChild.nodeValue if n and n[0].firstChild else '' - - n = _get_children_from_path(doc, (METADATA_NS, 'error'), 'message') - message = n[0].firstChild.nodeValue if n and n[0].firstChild else xml - - raise WindowsAzureBatchOperationError(message, code) +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +import sys +import uuid + +from azure import ( + _update_request_uri_query, + WindowsAzureError, + WindowsAzureBatchOperationError, + _get_children_from_path, + url_unquote, + _ERROR_CANNOT_FIND_PARTITION_KEY, + _ERROR_CANNOT_FIND_ROW_KEY, + _ERROR_INCORRECT_TABLE_IN_BATCH, + _ERROR_INCORRECT_PARTITION_KEY_IN_BATCH, + _ERROR_DUPLICATE_ROW_KEY_IN_BATCH, + _ERROR_BATCH_COMMIT_FAIL, + ) +from azure.http import HTTPError, HTTPRequest, HTTPResponse +from azure.http.httpclient import _HTTPClient +from azure.storage import ( + _update_storage_table_header, + METADATA_NS, + _sign_storage_table_request, + ) +from xml.dom import minidom + +_DATASERVICES_NS = 'http://schemas.microsoft.com/ado/2007/08/dataservices' + +if sys.version_info < (3,): + def _new_boundary(): + return str(uuid.uuid1()) +else: + def _new_boundary(): + return str(uuid.uuid1()).encode('utf-8') + + +class _BatchClient(_HTTPClient): + + ''' + This is the class that is used for batch operation for storage table + service. It only supports one changeset. + ''' + + def __init__(self, service_instance, account_key, account_name, + protocol='http'): + _HTTPClient.__init__(self, service_instance, account_name=account_name, + account_key=account_key, protocol=protocol) + self.is_batch = False + self.batch_requests = [] + self.batch_table = '' + self.batch_partition_key = '' + self.batch_row_keys = [] + + def get_request_table(self, request): + ''' + Extracts table name from request.uri. The request.uri has either + "/mytable(...)" or "/mytable" format. + + request: the request to insert, update or delete entity + ''' + if '(' in request.path: + pos = request.path.find('(') + return request.path[1:pos] + else: + return request.path[1:] + + def get_request_partition_key(self, request): + ''' + Extracts PartitionKey from request.body if it is a POST request or from + request.path if it is not a POST request. Only insert operation request + is a POST request and the PartitionKey is in the request body. + + request: the request to insert, update or delete entity + ''' + if request.method == 'POST': + doc = minidom.parseString(request.body) + part_key = _get_children_from_path( + doc, 'entry', 'content', (METADATA_NS, 'properties'), + (_DATASERVICES_NS, 'PartitionKey')) + if not part_key: + raise WindowsAzureError(_ERROR_CANNOT_FIND_PARTITION_KEY) + return part_key[0].firstChild.nodeValue + else: + uri = url_unquote(request.path) + pos1 = uri.find('PartitionKey=\'') + pos2 = uri.find('\',', pos1) + if pos1 == -1 or pos2 == -1: + raise WindowsAzureError(_ERROR_CANNOT_FIND_PARTITION_KEY) + return uri[pos1 + len('PartitionKey=\''):pos2] + + def get_request_row_key(self, request): + ''' + Extracts RowKey from request.body if it is a POST request or from + request.path if it is not a POST request. Only insert operation request + is a POST request and the Rowkey is in the request body. + + request: the request to insert, update or delete entity + ''' + if request.method == 'POST': + doc = minidom.parseString(request.body) + row_key = _get_children_from_path( + doc, 'entry', 'content', (METADATA_NS, 'properties'), + (_DATASERVICES_NS, 'RowKey')) + if not row_key: + raise WindowsAzureError(_ERROR_CANNOT_FIND_ROW_KEY) + return row_key[0].firstChild.nodeValue + else: + uri = url_unquote(request.path) + pos1 = uri.find('RowKey=\'') + pos2 = uri.find('\')', pos1) + if pos1 == -1 or pos2 == -1: + raise WindowsAzureError(_ERROR_CANNOT_FIND_ROW_KEY) + row_key = uri[pos1 + len('RowKey=\''):pos2] + return row_key + + def validate_request_table(self, request): + ''' + Validates that all requests have the same table name. Set the table + name if it is the first request for the batch operation. + + request: the request to insert, update or delete entity + ''' + if self.batch_table: + if self.get_request_table(request) != self.batch_table: + raise WindowsAzureError(_ERROR_INCORRECT_TABLE_IN_BATCH) + else: + self.batch_table = self.get_request_table(request) + + def validate_request_partition_key(self, request): + ''' + Validates that all requests have the same PartitiionKey. Set the + PartitionKey if it is the first request for the batch operation. + + request: the request to insert, update or delete entity + ''' + if self.batch_partition_key: + if self.get_request_partition_key(request) != \ + self.batch_partition_key: + raise WindowsAzureError(_ERROR_INCORRECT_PARTITION_KEY_IN_BATCH) + else: + self.batch_partition_key = self.get_request_partition_key(request) + + def validate_request_row_key(self, request): + ''' + Validates that all requests have the different RowKey and adds RowKey + to existing RowKey list. + + request: the request to insert, update or delete entity + ''' + if self.batch_row_keys: + if self.get_request_row_key(request) in self.batch_row_keys: + raise WindowsAzureError(_ERROR_DUPLICATE_ROW_KEY_IN_BATCH) + else: + self.batch_row_keys.append(self.get_request_row_key(request)) + + def begin_batch(self): + ''' + Starts the batch operation. Intializes the batch variables + + is_batch: batch operation flag. + batch_table: the table name of the batch operation + batch_partition_key: the PartitionKey of the batch requests. + batch_row_keys: the RowKey list of adding requests. + batch_requests: the list of the requests. + ''' + self.is_batch = True + self.batch_table = '' + self.batch_partition_key = '' + self.batch_row_keys = [] + self.batch_requests = [] + + def insert_request_to_batch(self, request): + ''' + Adds request to batch operation. + + request: the request to insert, update or delete entity + ''' + self.validate_request_table(request) + self.validate_request_partition_key(request) + self.validate_request_row_key(request) + self.batch_requests.append(request) + + def commit_batch(self): + ''' Resets batch flag and commits the batch requests. ''' + if self.is_batch: + self.is_batch = False + self.commit_batch_requests() + + def commit_batch_requests(self): + ''' Commits the batch requests. ''' + + batch_boundary = b'batch_' + _new_boundary() + changeset_boundary = b'changeset_' + _new_boundary() + + # Commits batch only the requests list is not empty. + if self.batch_requests: + request = HTTPRequest() + request.method = 'POST' + request.host = self.batch_requests[0].host + request.path = '/$batch' + request.headers = [ + ('Content-Type', 'multipart/mixed; boundary=' + \ + batch_boundary.decode('utf-8')), + ('Accept', 'application/atom+xml,application/xml'), + ('Accept-Charset', 'UTF-8')] + + request.body = b'--' + batch_boundary + b'\n' + request.body += b'Content-Type: multipart/mixed; boundary=' + request.body += changeset_boundary + b'\n\n' + + content_id = 1 + + # Adds each request body to the POST data. + for batch_request in self.batch_requests: + request.body += b'--' + changeset_boundary + b'\n' + request.body += b'Content-Type: application/http\n' + request.body += b'Content-Transfer-Encoding: binary\n\n' + request.body += batch_request.method.encode('utf-8') + request.body += b' http://' + request.body += batch_request.host.encode('utf-8') + request.body += batch_request.path.encode('utf-8') + request.body += b' HTTP/1.1\n' + request.body += b'Content-ID: ' + request.body += str(content_id).encode('utf-8') + b'\n' + content_id += 1 + + # Add different headers for different type requests. + if not batch_request.method == 'DELETE': + request.body += \ + b'Content-Type: application/atom+xml;type=entry\n' + for name, value in batch_request.headers: + if name == 'If-Match': + request.body += name.encode('utf-8') + b': ' + request.body += value.encode('utf-8') + b'\n' + break + request.body += b'Content-Length: ' + request.body += str(len(batch_request.body)).encode('utf-8') + request.body += b'\n\n' + request.body += batch_request.body + b'\n' + else: + for name, value in batch_request.headers: + # If-Match should be already included in + # batch_request.headers, but in case it is missing, + # just add it. + if name == 'If-Match': + request.body += name.encode('utf-8') + b': ' + request.body += value.encode('utf-8') + b'\n\n' + break + else: + request.body += b'If-Match: *\n\n' + + request.body += b'--' + changeset_boundary + b'--' + b'\n' + request.body += b'--' + batch_boundary + b'--' + + request.path, request.query = _update_request_uri_query(request) + request.headers = _update_storage_table_header(request) + auth = _sign_storage_table_request(request, + self.account_name, + self.account_key) + request.headers.append(('Authorization', auth)) + + # Submit the whole request as batch request. + response = self.perform_request(request) + if response.status >= 300: + raise HTTPError(response.status, + _ERROR_BATCH_COMMIT_FAIL, + self.respheader, + response.body) + + # http://www.odata.org/documentation/odata-version-2-0/batch-processing/ + # The body of a ChangeSet response is either a response for all the + # successfully processed change request within the ChangeSet, + # formatted exactly as it would have appeared outside of a batch, + # or a single response indicating a failure of the entire ChangeSet. + responses = self._parse_batch_response(response.body) + if responses and responses[0].status >= 300: + self._report_batch_error(responses[0]) + + def cancel_batch(self): + ''' Resets the batch flag. ''' + self.is_batch = False + + def _parse_batch_response(self, body): + parts = body.split(b'--changesetresponse_') + + responses = [] + for part in parts: + httpLocation = part.find(b'HTTP/') + if httpLocation > 0: + response = self._parse_batch_response_part(part[httpLocation:]) + responses.append(response) + + return responses + + def _parse_batch_response_part(self, part): + lines = part.splitlines(); + + # First line is the HTTP status/reason + status, _, reason = lines[0].partition(b' ')[2].partition(b' ') + + # Followed by headers and body + headers = [] + body = b'' + isBody = False + for line in lines[1:]: + if line == b'' and not isBody: + isBody = True + elif isBody: + body += line + else: + headerName, _, headerVal = line.partition(b':') + headers.append((headerName.lower(), headerVal)) + + return HTTPResponse(int(status), reason.strip(), headers, body) + + def _report_batch_error(self, response): + xml = response.body.decode('utf-8') + doc = minidom.parseString(xml) + + n = _get_children_from_path(doc, (METADATA_NS, 'error'), 'code') + code = n[0].firstChild.nodeValue if n and n[0].firstChild else '' + + n = _get_children_from_path(doc, (METADATA_NS, 'error'), 'message') + message = n[0].firstChild.nodeValue if n and n[0].firstChild else xml + + raise WindowsAzureBatchOperationError(message, code) diff --git a/awx/lib/site-packages/azure/http/httpclient.py b/awx/lib/site-packages/azure/http/httpclient.py index 662d60e92c..1bdeb73102 100644 --- a/awx/lib/site-packages/azure/http/httpclient.py +++ b/awx/lib/site-packages/azure/http/httpclient.py @@ -1,223 +1,251 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -import base64 -import os -import sys - -if sys.version_info < (3,): - from httplib import ( - HTTPSConnection, - HTTPConnection, - HTTP_PORT, - HTTPS_PORT, - ) - from urlparse import urlparse -else: - from http.client import ( - HTTPSConnection, - HTTPConnection, - HTTP_PORT, - HTTPS_PORT, - ) - from urllib.parse import urlparse - -from azure.http import HTTPError, HTTPResponse -from azure import _USER_AGENT_STRING, _update_request_uri_query - - -class _HTTPClient(object): - - ''' - Takes the request and sends it to cloud service and returns the response. - ''' - - def __init__(self, service_instance, cert_file=None, account_name=None, - account_key=None, service_namespace=None, issuer=None, - protocol='https'): - ''' - service_instance: service client instance. - cert_file: - certificate file name/location. This is only used in hosted - service management. - account_name: the storage account. - account_key: - the storage account access key for storage services or servicebus - access key for service bus service. - service_namespace: the service namespace for service bus. - issuer: the issuer for service bus service. - ''' - self.service_instance = service_instance - self.status = None - self.respheader = None - self.message = None - self.cert_file = cert_file - self.account_name = account_name - self.account_key = account_key - self.service_namespace = service_namespace - self.issuer = issuer - self.protocol = protocol - self.proxy_host = None - self.proxy_port = None - self.proxy_user = None - self.proxy_password = None - self.use_httplib = self.should_use_httplib() - - def should_use_httplib(self): - if sys.platform.lower().startswith('win') and self.cert_file: - # On Windows, auto-detect between Windows Store Certificate - # (winhttp) and OpenSSL .pem certificate file (httplib). - # - # We used to only support certificates installed in the Windows - # Certificate Store. - # cert_file example: CURRENT_USER\my\CertificateName - # - # We now support using an OpenSSL .pem certificate file, - # for a consistent experience across all platforms. - # cert_file example: account\certificate.pem - # - # When using OpenSSL .pem certificate file on Windows, make sure - # you are on CPython 2.7.4 or later. - - # If it's not an existing file on disk, then treat it as a path in - # the Windows Certificate Store, which means we can't use httplib. - if not os.path.isfile(self.cert_file): - return False - - return True - - def set_proxy(self, host, port, user, password): - ''' - Sets the proxy server host and port for the HTTP CONNECT Tunnelling. - - host: Address of the proxy. Ex: '192.168.0.100' - port: Port of the proxy. Ex: 6000 - user: User for proxy authorization. - password: Password for proxy authorization. - ''' - self.proxy_host = host - self.proxy_port = port - self.proxy_user = user - self.proxy_password = password - - def get_connection(self, request): - ''' Create connection for the request. ''' - protocol = request.protocol_override \ - if request.protocol_override else self.protocol - target_host = request.host - target_port = HTTP_PORT if protocol == 'http' else HTTPS_PORT - - if not self.use_httplib: - import azure.http.winhttp - connection = azure.http.winhttp._HTTPConnection( - target_host, cert_file=self.cert_file, protocol=protocol) - proxy_host = self.proxy_host - proxy_port = self.proxy_port - else: - if ':' in target_host: - target_host, _, target_port = target_host.rpartition(':') - if self.proxy_host: - proxy_host = target_host - proxy_port = target_port - host = self.proxy_host - port = self.proxy_port - else: - host = target_host - port = target_port - - if protocol == 'http': - connection = HTTPConnection(host, int(port)) - else: - connection = HTTPSConnection( - host, int(port), cert_file=self.cert_file) - - if self.proxy_host: - headers = None - if self.proxy_user and self.proxy_password: - auth = base64.encodestring( - "{0}:{1}".format(self.proxy_user, self.proxy_password)) - headers = {'Proxy-Authorization': 'Basic {0}'.format(auth)} - connection.set_tunnel(proxy_host, int(proxy_port), headers) - - return connection - - def send_request_headers(self, connection, request_headers): - if self.use_httplib: - if self.proxy_host: - for i in connection._buffer: - if i.startswith("Host: "): - connection._buffer.remove(i) - connection.putheader( - 'Host', "{0}:{1}".format(connection._tunnel_host, - connection._tunnel_port)) - - for name, value in request_headers: - if value: - connection.putheader(name, value) - - connection.putheader('User-Agent', _USER_AGENT_STRING) - connection.endheaders() - - def send_request_body(self, connection, request_body): - if request_body: - assert isinstance(request_body, bytes) - connection.send(request_body) - elif (not isinstance(connection, HTTPSConnection) and - not isinstance(connection, HTTPConnection)): - connection.send(None) - - def perform_request(self, request): - ''' Sends request to cloud service server and return the response. ''' - connection = self.get_connection(request) - try: - connection.putrequest(request.method, request.path) - - if not self.use_httplib: - if self.proxy_host and self.proxy_user: - connection.set_proxy_credentials( - self.proxy_user, self.proxy_password) - - self.send_request_headers(connection, request.headers) - self.send_request_body(connection, request.body) - - resp = connection.getresponse() - self.status = int(resp.status) - self.message = resp.reason - self.respheader = headers = resp.getheaders() - - # for consistency across platforms, make header names lowercase - for i, value in enumerate(headers): - headers[i] = (value[0].lower(), value[1]) - - respbody = None - if resp.length is None: - respbody = resp.read() - elif resp.length > 0: - respbody = resp.read(resp.length) - - response = HTTPResponse( - int(resp.status), resp.reason, headers, respbody) - if self.status == 307: - new_url = urlparse(dict(headers)['location']) - request.host = new_url.hostname - request.path = new_url.path - request.path, request.query = _update_request_uri_query(request) - return self.perform_request(request) - if self.status >= 300: - raise HTTPError(self.status, self.message, - self.respheader, respbody) - - return response - finally: - connection.close() +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +import base64 +import os +import sys + +if sys.version_info < (3,): + from httplib import ( + HTTPSConnection, + HTTPConnection, + HTTP_PORT, + HTTPS_PORT, + ) + from urlparse import urlparse +else: + from http.client import ( + HTTPSConnection, + HTTPConnection, + HTTP_PORT, + HTTPS_PORT, + ) + from urllib.parse import urlparse + +from azure.http import HTTPError, HTTPResponse +from azure import _USER_AGENT_STRING, _update_request_uri_query + +DEBUG_REQUESTS = False +DEBUG_RESPONSES = False + +class _HTTPClient(object): + + ''' + Takes the request and sends it to cloud service and returns the response. + ''' + + def __init__(self, service_instance, cert_file=None, account_name=None, + account_key=None, protocol='https', request_session=None): + ''' + service_instance: service client instance. + cert_file: + certificate file name/location. This is only used in hosted + service management. + account_name: the storage account. + account_key: + the storage account access key. + request_session: + session object created with requests library (or compatible). + ''' + self.service_instance = service_instance + self.status = None + self.respheader = None + self.message = None + self.cert_file = cert_file + self.account_name = account_name + self.account_key = account_key + self.protocol = protocol + self.proxy_host = None + self.proxy_port = None + self.proxy_user = None + self.proxy_password = None + self.request_session = request_session + if request_session: + self.use_httplib = True + else: + self.use_httplib = self.should_use_httplib() + + def should_use_httplib(self): + if sys.platform.lower().startswith('win') and self.cert_file: + # On Windows, auto-detect between Windows Store Certificate + # (winhttp) and OpenSSL .pem certificate file (httplib). + # + # We used to only support certificates installed in the Windows + # Certificate Store. + # cert_file example: CURRENT_USER\my\CertificateName + # + # We now support using an OpenSSL .pem certificate file, + # for a consistent experience across all platforms. + # cert_file example: account\certificate.pem + # + # When using OpenSSL .pem certificate file on Windows, make sure + # you are on CPython 2.7.4 or later. + + # If it's not an existing file on disk, then treat it as a path in + # the Windows Certificate Store, which means we can't use httplib. + if not os.path.isfile(self.cert_file): + return False + + return True + + def set_proxy(self, host, port, user, password): + ''' + Sets the proxy server host and port for the HTTP CONNECT Tunnelling. + + host: Address of the proxy. Ex: '192.168.0.100' + port: Port of the proxy. Ex: 6000 + user: User for proxy authorization. + password: Password for proxy authorization. + ''' + self.proxy_host = host + self.proxy_port = port + self.proxy_user = user + self.proxy_password = password + + def get_uri(self, request): + ''' Return the target uri for the request.''' + protocol = request.protocol_override \ + if request.protocol_override else self.protocol + port = HTTP_PORT if protocol == 'http' else HTTPS_PORT + return protocol + '://' + request.host + ':' + str(port) + request.path + + def get_connection(self, request): + ''' Create connection for the request. ''' + protocol = request.protocol_override \ + if request.protocol_override else self.protocol + target_host = request.host + target_port = HTTP_PORT if protocol == 'http' else HTTPS_PORT + + if self.request_session: + import azure.http.requestsclient + connection = azure.http.requestsclient._RequestsConnection( + target_host, protocol, self.request_session) + #TODO: proxy stuff + elif not self.use_httplib: + import azure.http.winhttp + connection = azure.http.winhttp._HTTPConnection( + target_host, cert_file=self.cert_file, protocol=protocol) + proxy_host = self.proxy_host + proxy_port = self.proxy_port + else: + if ':' in target_host: + target_host, _, target_port = target_host.rpartition(':') + if self.proxy_host: + proxy_host = target_host + proxy_port = target_port + host = self.proxy_host + port = self.proxy_port + else: + host = target_host + port = target_port + + if protocol == 'http': + connection = HTTPConnection(host, int(port)) + else: + connection = HTTPSConnection( + host, int(port), cert_file=self.cert_file) + + if self.proxy_host: + headers = None + if self.proxy_user and self.proxy_password: + auth = base64.encodestring( + "{0}:{1}".format(self.proxy_user, self.proxy_password)) + headers = {'Proxy-Authorization': 'Basic {0}'.format(auth)} + connection.set_tunnel(proxy_host, int(proxy_port), headers) + + return connection + + def send_request_headers(self, connection, request_headers): + if self.use_httplib: + if self.proxy_host: + for i in connection._buffer: + if i.startswith("Host: "): + connection._buffer.remove(i) + connection.putheader( + 'Host', "{0}:{1}".format(connection._tunnel_host, + connection._tunnel_port)) + + for name, value in request_headers: + if value: + connection.putheader(name, value) + + connection.putheader('User-Agent', _USER_AGENT_STRING) + connection.endheaders() + + def send_request_body(self, connection, request_body): + if request_body: + assert isinstance(request_body, bytes) + connection.send(request_body) + elif (not isinstance(connection, HTTPSConnection) and + not isinstance(connection, HTTPConnection)): + connection.send(None) + + def perform_request(self, request): + ''' Sends request to cloud service server and return the response. ''' + connection = self.get_connection(request) + try: + connection.putrequest(request.method, request.path) + + if not self.use_httplib: + if self.proxy_host and self.proxy_user: + connection.set_proxy_credentials( + self.proxy_user, self.proxy_password) + + self.send_request_headers(connection, request.headers) + self.send_request_body(connection, request.body) + + if DEBUG_REQUESTS and request.body: + print('request:') + try: + print(request.body) + except: + pass + + resp = connection.getresponse() + self.status = int(resp.status) + self.message = resp.reason + self.respheader = headers = resp.getheaders() + + # for consistency across platforms, make header names lowercase + for i, value in enumerate(headers): + headers[i] = (value[0].lower(), value[1]) + + respbody = None + if resp.length is None: + respbody = resp.read() + elif resp.length > 0: + respbody = resp.read(resp.length) + + if DEBUG_RESPONSES and respbody: + print('response:') + try: + print(respbody) + except: + pass + + response = HTTPResponse( + int(resp.status), resp.reason, headers, respbody) + if self.status == 307: + new_url = urlparse(dict(headers)['location']) + request.host = new_url.hostname + request.path = new_url.path + request.path, request.query = _update_request_uri_query(request) + return self.perform_request(request) + if self.status >= 300: + raise HTTPError(self.status, self.message, + self.respheader, respbody) + + return response + finally: + connection.close() diff --git a/awx/lib/site-packages/azure/http/requestsclient.py b/awx/lib/site-packages/azure/http/requestsclient.py new file mode 100644 index 0000000000..02b524214c --- /dev/null +++ b/awx/lib/site-packages/azure/http/requestsclient.py @@ -0,0 +1,74 @@ +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- + +class _Response(object): + + ''' Response class corresponding to the response returned from httplib + HTTPConnection. ''' + + def __init__(self, response): + self.status = response.status_code + self.reason = response.reason + self.respbody = response.content + self.length = len(response.content) + self.headers = [] + for key, name in response.headers.items(): + self.headers.append((key.lower(), name)) + + def getheaders(self): + '''Returns response headers.''' + return self.headers + + def read(self, _length): + '''Returns response body. ''' + return self.respbody[:_length] + + +class _RequestsConnection(object): + + def __init__(self, host, protocol, session): + self.host = host + self.protocol = protocol + self.session = session + self.headers = {} + self.method = None + self.body = None + self.response = None + self.uri = None + + def close(self): + pass + + def set_tunnel(self, host, port=None, headers=None): + pass + + def set_proxy_credentials(self, user, password): + pass + + def putrequest(self, method, uri): + self.method = method + self.uri = self.protocol + '://' + self.host + uri + + def putheader(self, name, value): + self.headers[name] = value + + def endheaders(self): + pass + + def send(self, request_body): + self.response = self.session.request(self.method, self.uri, data=request_body, headers=self.headers) + + def getresponse(self): + return _Response(self.response) diff --git a/awx/lib/site-packages/azure/http/winhttp.py b/awx/lib/site-packages/azure/http/winhttp.py index 86790333fc..055bf778e0 100644 --- a/awx/lib/site-packages/azure/http/winhttp.py +++ b/awx/lib/site-packages/azure/http/winhttp.py @@ -1,471 +1,471 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -from ctypes import ( - c_void_p, - c_long, - c_ulong, - c_longlong, - c_ulonglong, - c_short, - c_ushort, - c_wchar_p, - c_byte, - byref, - Structure, - Union, - POINTER, - WINFUNCTYPE, - HRESULT, - oledll, - WinDLL, - ) -import ctypes -import sys - -if sys.version_info >= (3,): - def unicode(text): - return text - -#------------------------------------------------------------------------------ -# Constants that are used in COM operations -VT_EMPTY = 0 -VT_NULL = 1 -VT_I2 = 2 -VT_I4 = 3 -VT_BSTR = 8 -VT_BOOL = 11 -VT_I1 = 16 -VT_UI1 = 17 -VT_UI2 = 18 -VT_UI4 = 19 -VT_I8 = 20 -VT_UI8 = 21 -VT_ARRAY = 8192 - -HTTPREQUEST_PROXYSETTING_PROXY = 2 -HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = 1 - -HTTPREQUEST_PROXY_SETTING = c_long -HTTPREQUEST_SETCREDENTIALS_FLAGS = c_long -#------------------------------------------------------------------------------ -# Com related APIs that are used. -_ole32 = oledll.ole32 -_oleaut32 = WinDLL('oleaut32') -_CLSIDFromString = _ole32.CLSIDFromString -_CoInitialize = _ole32.CoInitialize -_CoInitialize.argtypes = [c_void_p] - -_CoCreateInstance = _ole32.CoCreateInstance - -_SysAllocString = _oleaut32.SysAllocString -_SysAllocString.restype = c_void_p -_SysAllocString.argtypes = [c_wchar_p] - -_SysFreeString = _oleaut32.SysFreeString -_SysFreeString.argtypes = [c_void_p] - -# SAFEARRAY* -# SafeArrayCreateVector(_In_ VARTYPE vt,_In_ LONG lLbound,_In_ ULONG -# cElements); -_SafeArrayCreateVector = _oleaut32.SafeArrayCreateVector -_SafeArrayCreateVector.restype = c_void_p -_SafeArrayCreateVector.argtypes = [c_ushort, c_long, c_ulong] - -# HRESULT -# SafeArrayAccessData(_In_ SAFEARRAY *psa, _Out_ void **ppvData); -_SafeArrayAccessData = _oleaut32.SafeArrayAccessData -_SafeArrayAccessData.argtypes = [c_void_p, POINTER(c_void_p)] - -# HRESULT -# SafeArrayUnaccessData(_In_ SAFEARRAY *psa); -_SafeArrayUnaccessData = _oleaut32.SafeArrayUnaccessData -_SafeArrayUnaccessData.argtypes = [c_void_p] - -# HRESULT -# SafeArrayGetUBound(_In_ SAFEARRAY *psa, _In_ UINT nDim, _Out_ LONG -# *plUbound); -_SafeArrayGetUBound = _oleaut32.SafeArrayGetUBound -_SafeArrayGetUBound.argtypes = [c_void_p, c_ulong, POINTER(c_long)] - - -#------------------------------------------------------------------------------ - -class BSTR(c_wchar_p): - - ''' BSTR class in python. ''' - - def __init__(self, value): - super(BSTR, self).__init__(_SysAllocString(value)) - - def __del__(self): - _SysFreeString(self) - - -class VARIANT(Structure): - - ''' - VARIANT structure in python. Does not match the definition in - MSDN exactly & it is only mapping the used fields. Field names are also - slighty different. - ''' - - class _tagData(Union): - - class _tagRecord(Structure): - _fields_ = [('pvoid', c_void_p), ('precord', c_void_p)] - - _fields_ = [('llval', c_longlong), - ('ullval', c_ulonglong), - ('lval', c_long), - ('ulval', c_ulong), - ('ival', c_short), - ('boolval', c_ushort), - ('bstrval', BSTR), - ('parray', c_void_p), - ('record', _tagRecord)] - - _fields_ = [('vt', c_ushort), - ('wReserved1', c_ushort), - ('wReserved2', c_ushort), - ('wReserved3', c_ushort), - ('vdata', _tagData)] - - @staticmethod - def create_empty(): - variant = VARIANT() - variant.vt = VT_EMPTY - variant.vdata.llval = 0 - return variant - - @staticmethod - def create_safearray_from_str(text): - variant = VARIANT() - variant.vt = VT_ARRAY | VT_UI1 - - length = len(text) - variant.vdata.parray = _SafeArrayCreateVector(VT_UI1, 0, length) - pvdata = c_void_p() - _SafeArrayAccessData(variant.vdata.parray, byref(pvdata)) - ctypes.memmove(pvdata, text, length) - _SafeArrayUnaccessData(variant.vdata.parray) - - return variant - - @staticmethod - def create_bstr_from_str(text): - variant = VARIANT() - variant.vt = VT_BSTR - variant.vdata.bstrval = BSTR(text) - return variant - - @staticmethod - def create_bool_false(): - variant = VARIANT() - variant.vt = VT_BOOL - variant.vdata.boolval = 0 - return variant - - def is_safearray_of_bytes(self): - return self.vt == VT_ARRAY | VT_UI1 - - def str_from_safearray(self): - assert self.vt == VT_ARRAY | VT_UI1 - pvdata = c_void_p() - count = c_long() - _SafeArrayGetUBound(self.vdata.parray, 1, byref(count)) - count = c_long(count.value + 1) - _SafeArrayAccessData(self.vdata.parray, byref(pvdata)) - text = ctypes.string_at(pvdata, count) - _SafeArrayUnaccessData(self.vdata.parray) - return text - - def __del__(self): - _VariantClear(self) - -# HRESULT VariantClear(_Inout_ VARIANTARG *pvarg); -_VariantClear = _oleaut32.VariantClear -_VariantClear.argtypes = [POINTER(VARIANT)] - - -class GUID(Structure): - - ''' GUID structure in python. ''' - - _fields_ = [("data1", c_ulong), - ("data2", c_ushort), - ("data3", c_ushort), - ("data4", c_byte * 8)] - - def __init__(self, name=None): - if name is not None: - _CLSIDFromString(unicode(name), byref(self)) - - -class _WinHttpRequest(c_void_p): - - ''' - Maps the Com API to Python class functions. Not all methods in - IWinHttpWebRequest are mapped - only the methods we use. - ''' - _AddRef = WINFUNCTYPE(c_long) \ - (1, 'AddRef') - _Release = WINFUNCTYPE(c_long) \ - (2, 'Release') - _SetProxy = WINFUNCTYPE(HRESULT, - HTTPREQUEST_PROXY_SETTING, - VARIANT, - VARIANT) \ - (7, 'SetProxy') - _SetCredentials = WINFUNCTYPE(HRESULT, - BSTR, - BSTR, - HTTPREQUEST_SETCREDENTIALS_FLAGS) \ - (8, 'SetCredentials') - _Open = WINFUNCTYPE(HRESULT, BSTR, BSTR, VARIANT) \ - (9, 'Open') - _SetRequestHeader = WINFUNCTYPE(HRESULT, BSTR, BSTR) \ - (10, 'SetRequestHeader') - _GetResponseHeader = WINFUNCTYPE(HRESULT, BSTR, POINTER(c_void_p)) \ - (11, 'GetResponseHeader') - _GetAllResponseHeaders = WINFUNCTYPE(HRESULT, POINTER(c_void_p)) \ - (12, 'GetAllResponseHeaders') - _Send = WINFUNCTYPE(HRESULT, VARIANT) \ - (13, 'Send') - _Status = WINFUNCTYPE(HRESULT, POINTER(c_long)) \ - (14, 'Status') - _StatusText = WINFUNCTYPE(HRESULT, POINTER(c_void_p)) \ - (15, 'StatusText') - _ResponseText = WINFUNCTYPE(HRESULT, POINTER(c_void_p)) \ - (16, 'ResponseText') - _ResponseBody = WINFUNCTYPE(HRESULT, POINTER(VARIANT)) \ - (17, 'ResponseBody') - _ResponseStream = WINFUNCTYPE(HRESULT, POINTER(VARIANT)) \ - (18, 'ResponseStream') - _WaitForResponse = WINFUNCTYPE(HRESULT, VARIANT, POINTER(c_ushort)) \ - (21, 'WaitForResponse') - _Abort = WINFUNCTYPE(HRESULT) \ - (22, 'Abort') - _SetTimeouts = WINFUNCTYPE(HRESULT, c_long, c_long, c_long, c_long) \ - (23, 'SetTimeouts') - _SetClientCertificate = WINFUNCTYPE(HRESULT, BSTR) \ - (24, 'SetClientCertificate') - - def open(self, method, url): - ''' - Opens the request. - - method: the request VERB 'GET', 'POST', etc. - url: the url to connect - ''' - _WinHttpRequest._SetTimeouts(self, 0, 65000, 65000, 65000) - - flag = VARIANT.create_bool_false() - _method = BSTR(method) - _url = BSTR(url) - _WinHttpRequest._Open(self, _method, _url, flag) - - def set_request_header(self, name, value): - ''' Sets the request header. ''' - - _name = BSTR(name) - _value = BSTR(value) - _WinHttpRequest._SetRequestHeader(self, _name, _value) - - def get_all_response_headers(self): - ''' Gets back all response headers. ''' - - bstr_headers = c_void_p() - _WinHttpRequest._GetAllResponseHeaders(self, byref(bstr_headers)) - bstr_headers = ctypes.cast(bstr_headers, c_wchar_p) - headers = bstr_headers.value - _SysFreeString(bstr_headers) - return headers - - def send(self, request=None): - ''' Sends the request body. ''' - - # Sends VT_EMPTY if it is GET, HEAD request. - if request is None: - var_empty = VARIANT.create_empty() - _WinHttpRequest._Send(self, var_empty) - else: # Sends request body as SAFEArray. - _request = VARIANT.create_safearray_from_str(request) - _WinHttpRequest._Send(self, _request) - - def status(self): - ''' Gets status of response. ''' - - status = c_long() - _WinHttpRequest._Status(self, byref(status)) - return int(status.value) - - def status_text(self): - ''' Gets status text of response. ''' - - bstr_status_text = c_void_p() - _WinHttpRequest._StatusText(self, byref(bstr_status_text)) - bstr_status_text = ctypes.cast(bstr_status_text, c_wchar_p) - status_text = bstr_status_text.value - _SysFreeString(bstr_status_text) - return status_text - - def response_body(self): - ''' - Gets response body as a SAFEARRAY and converts the SAFEARRAY to str. - If it is an xml file, it always contains 3 characters before <?xml, - so we remove them. - ''' - var_respbody = VARIANT() - _WinHttpRequest._ResponseBody(self, byref(var_respbody)) - if var_respbody.is_safearray_of_bytes(): - respbody = var_respbody.str_from_safearray() - if respbody[3:].startswith(b'<?xml') and\ - respbody.startswith(b'\xef\xbb\xbf'): - respbody = respbody[3:] - return respbody - else: - return '' - - def set_client_certificate(self, certificate): - '''Sets client certificate for the request. ''' - _certificate = BSTR(certificate) - _WinHttpRequest._SetClientCertificate(self, _certificate) - - def set_tunnel(self, host, port): - ''' Sets up the host and the port for the HTTP CONNECT Tunnelling.''' - url = host - if port: - url = url + u':' + port - - var_host = VARIANT.create_bstr_from_str(url) - var_empty = VARIANT.create_empty() - - _WinHttpRequest._SetProxy( - self, HTTPREQUEST_PROXYSETTING_PROXY, var_host, var_empty) - - def set_proxy_credentials(self, user, password): - _WinHttpRequest._SetCredentials( - self, BSTR(user), BSTR(password), - HTTPREQUEST_SETCREDENTIALS_FOR_PROXY) - - def __del__(self): - if self.value is not None: - _WinHttpRequest._Release(self) - - -class _Response(object): - - ''' Response class corresponding to the response returned from httplib - HTTPConnection. ''' - - def __init__(self, _status, _status_text, _length, _headers, _respbody): - self.status = _status - self.reason = _status_text - self.length = _length - self.headers = _headers - self.respbody = _respbody - - def getheaders(self): - '''Returns response headers.''' - return self.headers - - def read(self, _length): - '''Returns resonse body. ''' - return self.respbody[:_length] - - -class _HTTPConnection(object): - - ''' Class corresponding to httplib HTTPConnection class. ''' - - def __init__(self, host, cert_file=None, key_file=None, protocol='http'): - ''' initialize the IWinHttpWebRequest Com Object.''' - self.host = unicode(host) - self.cert_file = cert_file - self._httprequest = _WinHttpRequest() - self.protocol = protocol - clsid = GUID('{2087C2F4-2CEF-4953-A8AB-66779B670495}') - iid = GUID('{016FE2EC-B2C8-45F8-B23B-39E53A75396B}') - _CoInitialize(None) - _CoCreateInstance(byref(clsid), 0, 1, byref(iid), - byref(self._httprequest)) - - def close(self): - pass - - def set_tunnel(self, host, port=None, headers=None): - ''' Sets up the host and the port for the HTTP CONNECT Tunnelling. ''' - self._httprequest.set_tunnel(unicode(host), unicode(str(port))) - - def set_proxy_credentials(self, user, password): - self._httprequest.set_proxy_credentials( - unicode(user), unicode(password)) - - def putrequest(self, method, uri): - ''' Connects to host and sends the request. ''' - - protocol = unicode(self.protocol + '://') - url = protocol + self.host + unicode(uri) - self._httprequest.open(unicode(method), url) - - # sets certificate for the connection if cert_file is set. - if self.cert_file is not None: - self._httprequest.set_client_certificate(unicode(self.cert_file)) - - def putheader(self, name, value): - ''' Sends the headers of request. ''' - if sys.version_info < (3,): - name = str(name).decode('utf-8') - value = str(value).decode('utf-8') - self._httprequest.set_request_header(name, value) - - def endheaders(self): - ''' No operation. Exists only to provide the same interface of httplib - HTTPConnection.''' - pass - - def send(self, request_body): - ''' Sends request body. ''' - if not request_body: - self._httprequest.send() - else: - self._httprequest.send(request_body) - - def getresponse(self): - ''' Gets the response and generates the _Response object''' - status = self._httprequest.status() - status_text = self._httprequest.status_text() - - resp_headers = self._httprequest.get_all_response_headers() - fixed_headers = [] - for resp_header in resp_headers.split('\n'): - if (resp_header.startswith('\t') or\ - resp_header.startswith(' ')) and fixed_headers: - # append to previous header - fixed_headers[-1] += resp_header - else: - fixed_headers.append(resp_header) - - headers = [] - for resp_header in fixed_headers: - if ':' in resp_header: - pos = resp_header.find(':') - headers.append( - (resp_header[:pos].lower(), resp_header[pos + 1:].strip())) - - body = self._httprequest.response_body() - length = len(body) - - return _Response(status, status_text, length, headers, body) +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +from ctypes import ( + c_void_p, + c_long, + c_ulong, + c_longlong, + c_ulonglong, + c_short, + c_ushort, + c_wchar_p, + c_byte, + byref, + Structure, + Union, + POINTER, + WINFUNCTYPE, + HRESULT, + oledll, + WinDLL, + ) +import ctypes +import sys + +if sys.version_info >= (3,): + def unicode(text): + return text + +#------------------------------------------------------------------------------ +# Constants that are used in COM operations +VT_EMPTY = 0 +VT_NULL = 1 +VT_I2 = 2 +VT_I4 = 3 +VT_BSTR = 8 +VT_BOOL = 11 +VT_I1 = 16 +VT_UI1 = 17 +VT_UI2 = 18 +VT_UI4 = 19 +VT_I8 = 20 +VT_UI8 = 21 +VT_ARRAY = 8192 + +HTTPREQUEST_PROXYSETTING_PROXY = 2 +HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = 1 + +HTTPREQUEST_PROXY_SETTING = c_long +HTTPREQUEST_SETCREDENTIALS_FLAGS = c_long +#------------------------------------------------------------------------------ +# Com related APIs that are used. +_ole32 = oledll.ole32 +_oleaut32 = WinDLL('oleaut32') +_CLSIDFromString = _ole32.CLSIDFromString +_CoInitialize = _ole32.CoInitialize +_CoInitialize.argtypes = [c_void_p] + +_CoCreateInstance = _ole32.CoCreateInstance + +_SysAllocString = _oleaut32.SysAllocString +_SysAllocString.restype = c_void_p +_SysAllocString.argtypes = [c_wchar_p] + +_SysFreeString = _oleaut32.SysFreeString +_SysFreeString.argtypes = [c_void_p] + +# SAFEARRAY* +# SafeArrayCreateVector(_In_ VARTYPE vt,_In_ LONG lLbound,_In_ ULONG +# cElements); +_SafeArrayCreateVector = _oleaut32.SafeArrayCreateVector +_SafeArrayCreateVector.restype = c_void_p +_SafeArrayCreateVector.argtypes = [c_ushort, c_long, c_ulong] + +# HRESULT +# SafeArrayAccessData(_In_ SAFEARRAY *psa, _Out_ void **ppvData); +_SafeArrayAccessData = _oleaut32.SafeArrayAccessData +_SafeArrayAccessData.argtypes = [c_void_p, POINTER(c_void_p)] + +# HRESULT +# SafeArrayUnaccessData(_In_ SAFEARRAY *psa); +_SafeArrayUnaccessData = _oleaut32.SafeArrayUnaccessData +_SafeArrayUnaccessData.argtypes = [c_void_p] + +# HRESULT +# SafeArrayGetUBound(_In_ SAFEARRAY *psa, _In_ UINT nDim, _Out_ LONG +# *plUbound); +_SafeArrayGetUBound = _oleaut32.SafeArrayGetUBound +_SafeArrayGetUBound.argtypes = [c_void_p, c_ulong, POINTER(c_long)] + + +#------------------------------------------------------------------------------ + +class BSTR(c_wchar_p): + + ''' BSTR class in python. ''' + + def __init__(self, value): + super(BSTR, self).__init__(_SysAllocString(value)) + + def __del__(self): + _SysFreeString(self) + + +class VARIANT(Structure): + + ''' + VARIANT structure in python. Does not match the definition in + MSDN exactly & it is only mapping the used fields. Field names are also + slighty different. + ''' + + class _tagData(Union): + + class _tagRecord(Structure): + _fields_ = [('pvoid', c_void_p), ('precord', c_void_p)] + + _fields_ = [('llval', c_longlong), + ('ullval', c_ulonglong), + ('lval', c_long), + ('ulval', c_ulong), + ('ival', c_short), + ('boolval', c_ushort), + ('bstrval', BSTR), + ('parray', c_void_p), + ('record', _tagRecord)] + + _fields_ = [('vt', c_ushort), + ('wReserved1', c_ushort), + ('wReserved2', c_ushort), + ('wReserved3', c_ushort), + ('vdata', _tagData)] + + @staticmethod + def create_empty(): + variant = VARIANT() + variant.vt = VT_EMPTY + variant.vdata.llval = 0 + return variant + + @staticmethod + def create_safearray_from_str(text): + variant = VARIANT() + variant.vt = VT_ARRAY | VT_UI1 + + length = len(text) + variant.vdata.parray = _SafeArrayCreateVector(VT_UI1, 0, length) + pvdata = c_void_p() + _SafeArrayAccessData(variant.vdata.parray, byref(pvdata)) + ctypes.memmove(pvdata, text, length) + _SafeArrayUnaccessData(variant.vdata.parray) + + return variant + + @staticmethod + def create_bstr_from_str(text): + variant = VARIANT() + variant.vt = VT_BSTR + variant.vdata.bstrval = BSTR(text) + return variant + + @staticmethod + def create_bool_false(): + variant = VARIANT() + variant.vt = VT_BOOL + variant.vdata.boolval = 0 + return variant + + def is_safearray_of_bytes(self): + return self.vt == VT_ARRAY | VT_UI1 + + def str_from_safearray(self): + assert self.vt == VT_ARRAY | VT_UI1 + pvdata = c_void_p() + count = c_long() + _SafeArrayGetUBound(self.vdata.parray, 1, byref(count)) + count = c_long(count.value + 1) + _SafeArrayAccessData(self.vdata.parray, byref(pvdata)) + text = ctypes.string_at(pvdata, count) + _SafeArrayUnaccessData(self.vdata.parray) + return text + + def __del__(self): + _VariantClear(self) + +# HRESULT VariantClear(_Inout_ VARIANTARG *pvarg); +_VariantClear = _oleaut32.VariantClear +_VariantClear.argtypes = [POINTER(VARIANT)] + + +class GUID(Structure): + + ''' GUID structure in python. ''' + + _fields_ = [("data1", c_ulong), + ("data2", c_ushort), + ("data3", c_ushort), + ("data4", c_byte * 8)] + + def __init__(self, name=None): + if name is not None: + _CLSIDFromString(unicode(name), byref(self)) + + +class _WinHttpRequest(c_void_p): + + ''' + Maps the Com API to Python class functions. Not all methods in + IWinHttpWebRequest are mapped - only the methods we use. + ''' + _AddRef = WINFUNCTYPE(c_long) \ + (1, 'AddRef') + _Release = WINFUNCTYPE(c_long) \ + (2, 'Release') + _SetProxy = WINFUNCTYPE(HRESULT, + HTTPREQUEST_PROXY_SETTING, + VARIANT, + VARIANT) \ + (7, 'SetProxy') + _SetCredentials = WINFUNCTYPE(HRESULT, + BSTR, + BSTR, + HTTPREQUEST_SETCREDENTIALS_FLAGS) \ + (8, 'SetCredentials') + _Open = WINFUNCTYPE(HRESULT, BSTR, BSTR, VARIANT) \ + (9, 'Open') + _SetRequestHeader = WINFUNCTYPE(HRESULT, BSTR, BSTR) \ + (10, 'SetRequestHeader') + _GetResponseHeader = WINFUNCTYPE(HRESULT, BSTR, POINTER(c_void_p)) \ + (11, 'GetResponseHeader') + _GetAllResponseHeaders = WINFUNCTYPE(HRESULT, POINTER(c_void_p)) \ + (12, 'GetAllResponseHeaders') + _Send = WINFUNCTYPE(HRESULT, VARIANT) \ + (13, 'Send') + _Status = WINFUNCTYPE(HRESULT, POINTER(c_long)) \ + (14, 'Status') + _StatusText = WINFUNCTYPE(HRESULT, POINTER(c_void_p)) \ + (15, 'StatusText') + _ResponseText = WINFUNCTYPE(HRESULT, POINTER(c_void_p)) \ + (16, 'ResponseText') + _ResponseBody = WINFUNCTYPE(HRESULT, POINTER(VARIANT)) \ + (17, 'ResponseBody') + _ResponseStream = WINFUNCTYPE(HRESULT, POINTER(VARIANT)) \ + (18, 'ResponseStream') + _WaitForResponse = WINFUNCTYPE(HRESULT, VARIANT, POINTER(c_ushort)) \ + (21, 'WaitForResponse') + _Abort = WINFUNCTYPE(HRESULT) \ + (22, 'Abort') + _SetTimeouts = WINFUNCTYPE(HRESULT, c_long, c_long, c_long, c_long) \ + (23, 'SetTimeouts') + _SetClientCertificate = WINFUNCTYPE(HRESULT, BSTR) \ + (24, 'SetClientCertificate') + + def open(self, method, url): + ''' + Opens the request. + + method: the request VERB 'GET', 'POST', etc. + url: the url to connect + ''' + _WinHttpRequest._SetTimeouts(self, 0, 65000, 65000, 65000) + + flag = VARIANT.create_bool_false() + _method = BSTR(method) + _url = BSTR(url) + _WinHttpRequest._Open(self, _method, _url, flag) + + def set_request_header(self, name, value): + ''' Sets the request header. ''' + + _name = BSTR(name) + _value = BSTR(value) + _WinHttpRequest._SetRequestHeader(self, _name, _value) + + def get_all_response_headers(self): + ''' Gets back all response headers. ''' + + bstr_headers = c_void_p() + _WinHttpRequest._GetAllResponseHeaders(self, byref(bstr_headers)) + bstr_headers = ctypes.cast(bstr_headers, c_wchar_p) + headers = bstr_headers.value + _SysFreeString(bstr_headers) + return headers + + def send(self, request=None): + ''' Sends the request body. ''' + + # Sends VT_EMPTY if it is GET, HEAD request. + if request is None: + var_empty = VARIANT.create_empty() + _WinHttpRequest._Send(self, var_empty) + else: # Sends request body as SAFEArray. + _request = VARIANT.create_safearray_from_str(request) + _WinHttpRequest._Send(self, _request) + + def status(self): + ''' Gets status of response. ''' + + status = c_long() + _WinHttpRequest._Status(self, byref(status)) + return int(status.value) + + def status_text(self): + ''' Gets status text of response. ''' + + bstr_status_text = c_void_p() + _WinHttpRequest._StatusText(self, byref(bstr_status_text)) + bstr_status_text = ctypes.cast(bstr_status_text, c_wchar_p) + status_text = bstr_status_text.value + _SysFreeString(bstr_status_text) + return status_text + + def response_body(self): + ''' + Gets response body as a SAFEARRAY and converts the SAFEARRAY to str. + If it is an xml file, it always contains 3 characters before <?xml, + so we remove them. + ''' + var_respbody = VARIANT() + _WinHttpRequest._ResponseBody(self, byref(var_respbody)) + if var_respbody.is_safearray_of_bytes(): + respbody = var_respbody.str_from_safearray() + if respbody[3:].startswith(b'<?xml') and\ + respbody.startswith(b'\xef\xbb\xbf'): + respbody = respbody[3:] + return respbody + else: + return '' + + def set_client_certificate(self, certificate): + '''Sets client certificate for the request. ''' + _certificate = BSTR(certificate) + _WinHttpRequest._SetClientCertificate(self, _certificate) + + def set_tunnel(self, host, port): + ''' Sets up the host and the port for the HTTP CONNECT Tunnelling.''' + url = host + if port: + url = url + u':' + port + + var_host = VARIANT.create_bstr_from_str(url) + var_empty = VARIANT.create_empty() + + _WinHttpRequest._SetProxy( + self, HTTPREQUEST_PROXYSETTING_PROXY, var_host, var_empty) + + def set_proxy_credentials(self, user, password): + _WinHttpRequest._SetCredentials( + self, BSTR(user), BSTR(password), + HTTPREQUEST_SETCREDENTIALS_FOR_PROXY) + + def __del__(self): + if self.value is not None: + _WinHttpRequest._Release(self) + + +class _Response(object): + + ''' Response class corresponding to the response returned from httplib + HTTPConnection. ''' + + def __init__(self, _status, _status_text, _length, _headers, _respbody): + self.status = _status + self.reason = _status_text + self.length = _length + self.headers = _headers + self.respbody = _respbody + + def getheaders(self): + '''Returns response headers.''' + return self.headers + + def read(self, _length): + '''Returns resonse body. ''' + return self.respbody[:_length] + + +class _HTTPConnection(object): + + ''' Class corresponding to httplib HTTPConnection class. ''' + + def __init__(self, host, cert_file=None, key_file=None, protocol='http'): + ''' initialize the IWinHttpWebRequest Com Object.''' + self.host = unicode(host) + self.cert_file = cert_file + self._httprequest = _WinHttpRequest() + self.protocol = protocol + clsid = GUID('{2087C2F4-2CEF-4953-A8AB-66779B670495}') + iid = GUID('{016FE2EC-B2C8-45F8-B23B-39E53A75396B}') + _CoInitialize(None) + _CoCreateInstance(byref(clsid), 0, 1, byref(iid), + byref(self._httprequest)) + + def close(self): + pass + + def set_tunnel(self, host, port=None, headers=None): + ''' Sets up the host and the port for the HTTP CONNECT Tunnelling. ''' + self._httprequest.set_tunnel(unicode(host), unicode(str(port))) + + def set_proxy_credentials(self, user, password): + self._httprequest.set_proxy_credentials( + unicode(user), unicode(password)) + + def putrequest(self, method, uri): + ''' Connects to host and sends the request. ''' + + protocol = unicode(self.protocol + '://') + url = protocol + self.host + unicode(uri) + self._httprequest.open(unicode(method), url) + + # sets certificate for the connection if cert_file is set. + if self.cert_file is not None: + self._httprequest.set_client_certificate(unicode(self.cert_file)) + + def putheader(self, name, value): + ''' Sends the headers of request. ''' + if sys.version_info < (3,): + name = str(name).decode('utf-8') + value = str(value).decode('utf-8') + self._httprequest.set_request_header(name, value) + + def endheaders(self): + ''' No operation. Exists only to provide the same interface of httplib + HTTPConnection.''' + pass + + def send(self, request_body): + ''' Sends request body. ''' + if not request_body: + self._httprequest.send() + else: + self._httprequest.send(request_body) + + def getresponse(self): + ''' Gets the response and generates the _Response object''' + status = self._httprequest.status() + status_text = self._httprequest.status_text() + + resp_headers = self._httprequest.get_all_response_headers() + fixed_headers = [] + for resp_header in resp_headers.split('\n'): + if (resp_header.startswith('\t') or\ + resp_header.startswith(' ')) and fixed_headers: + # append to previous header + fixed_headers[-1] += resp_header + else: + fixed_headers.append(resp_header) + + headers = [] + for resp_header in fixed_headers: + if ':' in resp_header: + pos = resp_header.find(':') + headers.append( + (resp_header[:pos].lower(), resp_header[pos + 1:].strip())) + + body = self._httprequest.response_body() + length = len(body) + + return _Response(status, status_text, length, headers, body) diff --git a/awx/lib/site-packages/azure/servicebus/__init__.py b/awx/lib/site-packages/azure/servicebus/__init__.py index bee85f4efd..ba098f8123 100644 --- a/awx/lib/site-packages/azure/servicebus/__init__.py +++ b/awx/lib/site-packages/azure/servicebus/__init__.py @@ -1,851 +1,852 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -import ast -import sys - -from datetime import datetime -from xml.dom import minidom -from azure import ( - WindowsAzureData, - WindowsAzureError, - xml_escape, - _create_entry, - _general_error_handler, - _get_entry_properties, - _get_child_nodes, - _get_children_from_path, - _get_first_child_node_value, - _ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_DELETE, - _ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_UNLOCK, - _ERROR_QUEUE_NOT_FOUND, - _ERROR_TOPIC_NOT_FOUND, - ) -from azure.http import HTTPError - -# default rule name for subscription -DEFAULT_RULE_NAME = '$Default' - -#----------------------------------------------------------------------------- -# Constants for Azure app environment settings. -AZURE_SERVICEBUS_NAMESPACE = 'AZURE_SERVICEBUS_NAMESPACE' -AZURE_SERVICEBUS_ACCESS_KEY = 'AZURE_SERVICEBUS_ACCESS_KEY' -AZURE_SERVICEBUS_ISSUER = 'AZURE_SERVICEBUS_ISSUER' - -# namespace used for converting rules to objects -XML_SCHEMA_NAMESPACE = 'http://www.w3.org/2001/XMLSchema-instance' - - -class Queue(WindowsAzureData): - - ''' Queue class corresponding to Queue Description: - http://msdn.microsoft.com/en-us/library/windowsazure/hh780773''' - - def __init__(self, lock_duration=None, max_size_in_megabytes=None, - requires_duplicate_detection=None, requires_session=None, - default_message_time_to_live=None, - dead_lettering_on_message_expiration=None, - duplicate_detection_history_time_window=None, - max_delivery_count=None, enable_batched_operations=None, - size_in_bytes=None, message_count=None): - - self.lock_duration = lock_duration - self.max_size_in_megabytes = max_size_in_megabytes - self.requires_duplicate_detection = requires_duplicate_detection - self.requires_session = requires_session - self.default_message_time_to_live = default_message_time_to_live - self.dead_lettering_on_message_expiration = \ - dead_lettering_on_message_expiration - self.duplicate_detection_history_time_window = \ - duplicate_detection_history_time_window - self.max_delivery_count = max_delivery_count - self.enable_batched_operations = enable_batched_operations - self.size_in_bytes = size_in_bytes - self.message_count = message_count - - -class Topic(WindowsAzureData): - - ''' Topic class corresponding to Topic Description: - http://msdn.microsoft.com/en-us/library/windowsazure/hh780749. ''' - - def __init__(self, default_message_time_to_live=None, - max_size_in_megabytes=None, requires_duplicate_detection=None, - duplicate_detection_history_time_window=None, - enable_batched_operations=None, size_in_bytes=None): - - self.default_message_time_to_live = default_message_time_to_live - self.max_size_in_megabytes = max_size_in_megabytes - self.requires_duplicate_detection = requires_duplicate_detection - self.duplicate_detection_history_time_window = \ - duplicate_detection_history_time_window - self.enable_batched_operations = enable_batched_operations - self.size_in_bytes = size_in_bytes - - @property - def max_size_in_mega_bytes(self): - import warnings - warnings.warn( - 'This attribute has been changed to max_size_in_megabytes.') - return self.max_size_in_megabytes - - @max_size_in_mega_bytes.setter - def max_size_in_mega_bytes(self, value): - self.max_size_in_megabytes = value - - -class Subscription(WindowsAzureData): - - ''' Subscription class corresponding to Subscription Description: - http://msdn.microsoft.com/en-us/library/windowsazure/hh780763. ''' - - def __init__(self, lock_duration=None, requires_session=None, - default_message_time_to_live=None, - dead_lettering_on_message_expiration=None, - dead_lettering_on_filter_evaluation_exceptions=None, - enable_batched_operations=None, max_delivery_count=None, - message_count=None): - - self.lock_duration = lock_duration - self.requires_session = requires_session - self.default_message_time_to_live = default_message_time_to_live - self.dead_lettering_on_message_expiration = \ - dead_lettering_on_message_expiration - self.dead_lettering_on_filter_evaluation_exceptions = \ - dead_lettering_on_filter_evaluation_exceptions - self.enable_batched_operations = enable_batched_operations - self.max_delivery_count = max_delivery_count - self.message_count = message_count - - -class Rule(WindowsAzureData): - - ''' Rule class corresponding to Rule Description: - http://msdn.microsoft.com/en-us/library/windowsazure/hh780753. ''' - - def __init__(self, filter_type=None, filter_expression=None, - action_type=None, action_expression=None): - self.filter_type = filter_type - self.filter_expression = filter_expression - self.action_type = action_type - self.action_expression = action_type - - -class Message(WindowsAzureData): - - ''' Message class that used in send message/get mesage apis. ''' - - def __init__(self, body=None, service_bus_service=None, location=None, - custom_properties=None, - type='application/atom+xml;type=entry;charset=utf-8', - broker_properties=None): - self.body = body - self.location = location - self.broker_properties = broker_properties - self.custom_properties = custom_properties - self.type = type - self.service_bus_service = service_bus_service - self._topic_name = None - self._subscription_name = None - self._queue_name = None - - if not service_bus_service: - return - - # if location is set, then extracts the queue name for queue message and - # extracts the topic and subscriptions name if it is topic message. - if location: - if '/subscriptions/' in location: - pos = location.find('/subscriptions/') - pos1 = location.rfind('/', 0, pos - 1) - self._topic_name = location[pos1 + 1:pos] - pos += len('/subscriptions/') - pos1 = location.find('/', pos) - self._subscription_name = location[pos:pos1] - elif '/messages/' in location: - pos = location.find('/messages/') - pos1 = location.rfind('/', 0, pos - 1) - self._queue_name = location[pos1 + 1:pos] - - def delete(self): - ''' Deletes itself if find queue name or topic name and subscription - name. ''' - if self._queue_name: - self.service_bus_service.delete_queue_message( - self._queue_name, - self.broker_properties['SequenceNumber'], - self.broker_properties['LockToken']) - elif self._topic_name and self._subscription_name: - self.service_bus_service.delete_subscription_message( - self._topic_name, - self._subscription_name, - self.broker_properties['SequenceNumber'], - self.broker_properties['LockToken']) - else: - raise WindowsAzureError(_ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_DELETE) - - def unlock(self): - ''' Unlocks itself if find queue name or topic name and subscription - name. ''' - if self._queue_name: - self.service_bus_service.unlock_queue_message( - self._queue_name, - self.broker_properties['SequenceNumber'], - self.broker_properties['LockToken']) - elif self._topic_name and self._subscription_name: - self.service_bus_service.unlock_subscription_message( - self._topic_name, - self._subscription_name, - self.broker_properties['SequenceNumber'], - self.broker_properties['LockToken']) - else: - raise WindowsAzureError(_ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_UNLOCK) - - def add_headers(self, request): - ''' add addtional headers to request for message request.''' - - # Adds custom properties - if self.custom_properties: - for name, value in self.custom_properties.items(): - if sys.version_info < (3,) and isinstance(value, unicode): - request.headers.append( - (name, '"' + value.encode('utf-8') + '"')) - elif isinstance(value, str): - request.headers.append((name, '"' + str(value) + '"')) - elif isinstance(value, datetime): - request.headers.append( - (name, '"' + value.strftime('%a, %d %b %Y %H:%M:%S GMT') + '"')) - else: - request.headers.append((name, str(value).lower())) - - # Adds content-type - request.headers.append(('Content-Type', self.type)) - - # Adds BrokerProperties - if self.broker_properties: - request.headers.append( - ('BrokerProperties', str(self.broker_properties))) - - return request.headers - - -def _create_message(response, service_instance): - ''' Create message from response. - - response: response from service bus cloud server. - service_instance: the service bus client. - ''' - respbody = response.body - custom_properties = {} - broker_properties = None - message_type = None - message_location = None - - # gets all information from respheaders. - for name, value in response.headers: - if name.lower() == 'brokerproperties': - broker_properties = ast.literal_eval(value) - elif name.lower() == 'content-type': - message_type = value - elif name.lower() == 'location': - message_location = value - elif name.lower() not in ['content-type', - 'brokerproperties', - 'transfer-encoding', - 'server', - 'location', - 'date']: - if '"' in value: - value = value[1:-1] - try: - custom_properties[name] = datetime.strptime( - value, '%a, %d %b %Y %H:%M:%S GMT') - except ValueError: - custom_properties[name] = value - else: # only int, float or boolean - if value.lower() == 'true': - custom_properties[name] = True - elif value.lower() == 'false': - custom_properties[name] = False - # int('3.1') doesn't work so need to get float('3.14') first - elif str(int(float(value))) == value: - custom_properties[name] = int(value) - else: - custom_properties[name] = float(value) - - if message_type == None: - message = Message( - respbody, service_instance, message_location, custom_properties, - 'application/atom+xml;type=entry;charset=utf-8', broker_properties) - else: - message = Message(respbody, service_instance, message_location, - custom_properties, message_type, broker_properties) - return message - -# convert functions - - -def _convert_response_to_rule(response): - return _convert_xml_to_rule(response.body) - - -def _convert_xml_to_rule(xmlstr): - ''' Converts response xml to rule object. - - The format of xml for rule: -<entry xmlns='http://www.w3.org/2005/Atom'> -<content type='application/xml'> -<RuleDescription - xmlns:i="http://www.w3.org/2001/XMLSchema-instance" - xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"> - <Filter i:type="SqlFilterExpression"> - <SqlExpression>MyProperty='XYZ'</SqlExpression> - </Filter> - <Action i:type="SqlFilterAction"> - <SqlExpression>set MyProperty2 = 'ABC'</SqlExpression> - </Action> -</RuleDescription> -</content> -</entry> - ''' - xmldoc = minidom.parseString(xmlstr) - rule = Rule() - - for rule_desc in _get_children_from_path(xmldoc, - 'entry', - 'content', - 'RuleDescription'): - for xml_filter in _get_child_nodes(rule_desc, 'Filter'): - filter_type = xml_filter.getAttributeNS( - XML_SCHEMA_NAMESPACE, 'type') - setattr(rule, 'filter_type', str(filter_type)) - if xml_filter.childNodes: - - for expr in _get_child_nodes(xml_filter, 'SqlExpression'): - setattr(rule, 'filter_expression', - expr.firstChild.nodeValue) - - for xml_action in _get_child_nodes(rule_desc, 'Action'): - action_type = xml_action.getAttributeNS( - XML_SCHEMA_NAMESPACE, 'type') - setattr(rule, 'action_type', str(action_type)) - if xml_action.childNodes: - action_expression = xml_action.childNodes[0].firstChild - if action_expression: - setattr(rule, 'action_expression', - action_expression.nodeValue) - - # extract id, updated and name value from feed entry and set them of rule. - for name, value in _get_entry_properties(xmlstr, True, '/rules').items(): - setattr(rule, name, value) - - return rule - - -def _convert_response_to_queue(response): - return _convert_xml_to_queue(response.body) - - -def _parse_bool(value): - if value.lower() == 'true': - return True - return False - - -def _convert_xml_to_queue(xmlstr): - ''' Converts xml response to queue object. - - The format of xml response for queue: -<QueueDescription - xmlns=\"http://schemas.microsoft.com/netservices/2010/10/servicebus/connect\"> - <MaxSizeInBytes>10000</MaxSizeInBytes> - <DefaultMessageTimeToLive>PT5M</DefaultMessageTimeToLive> - <LockDuration>PT2M</LockDuration> - <RequiresGroupedReceives>False</RequiresGroupedReceives> - <SupportsDuplicateDetection>False</SupportsDuplicateDetection> - ... -</QueueDescription> - - ''' - xmldoc = minidom.parseString(xmlstr) - queue = Queue() - - invalid_queue = True - # get node for each attribute in Queue class, if nothing found then the - # response is not valid xml for Queue. - for desc in _get_children_from_path(xmldoc, - 'entry', - 'content', - 'QueueDescription'): - node_value = _get_first_child_node_value(desc, 'LockDuration') - if node_value is not None: - queue.lock_duration = node_value - invalid_queue = False - - node_value = _get_first_child_node_value(desc, 'MaxSizeInMegabytes') - if node_value is not None: - queue.max_size_in_megabytes = int(node_value) - invalid_queue = False - - node_value = _get_first_child_node_value( - desc, 'RequiresDuplicateDetection') - if node_value is not None: - queue.requires_duplicate_detection = _parse_bool(node_value) - invalid_queue = False - - node_value = _get_first_child_node_value(desc, 'RequiresSession') - if node_value is not None: - queue.requires_session = _parse_bool(node_value) - invalid_queue = False - - node_value = _get_first_child_node_value( - desc, 'DefaultMessageTimeToLive') - if node_value is not None: - queue.default_message_time_to_live = node_value - invalid_queue = False - - node_value = _get_first_child_node_value( - desc, 'DeadLetteringOnMessageExpiration') - if node_value is not None: - queue.dead_lettering_on_message_expiration = _parse_bool(node_value) - invalid_queue = False - - node_value = _get_first_child_node_value( - desc, 'DuplicateDetectionHistoryTimeWindow') - if node_value is not None: - queue.duplicate_detection_history_time_window = node_value - invalid_queue = False - - node_value = _get_first_child_node_value( - desc, 'EnableBatchedOperations') - if node_value is not None: - queue.enable_batched_operations = _parse_bool(node_value) - invalid_queue = False - - node_value = _get_first_child_node_value(desc, 'MaxDeliveryCount') - if node_value is not None: - queue.max_delivery_count = int(node_value) - invalid_queue = False - - node_value = _get_first_child_node_value(desc, 'MessageCount') - if node_value is not None: - queue.message_count = int(node_value) - invalid_queue = False - - node_value = _get_first_child_node_value(desc, 'SizeInBytes') - if node_value is not None: - queue.size_in_bytes = int(node_value) - invalid_queue = False - - if invalid_queue: - raise WindowsAzureError(_ERROR_QUEUE_NOT_FOUND) - - # extract id, updated and name value from feed entry and set them of queue. - for name, value in _get_entry_properties(xmlstr, True).items(): - setattr(queue, name, value) - - return queue - - -def _convert_response_to_topic(response): - return _convert_xml_to_topic(response.body) - - -def _convert_xml_to_topic(xmlstr): - '''Converts xml response to topic - - The xml format for topic: -<entry xmlns='http://www.w3.org/2005/Atom'> - <content type='application/xml'> - <TopicDescription - xmlns:i="http://www.w3.org/2001/XMLSchema-instance" - xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"> - <DefaultMessageTimeToLive>P10675199DT2H48M5.4775807S</DefaultMessageTimeToLive> - <MaxSizeInMegabytes>1024</MaxSizeInMegabytes> - <RequiresDuplicateDetection>false</RequiresDuplicateDetection> - <DuplicateDetectionHistoryTimeWindow>P7D</DuplicateDetectionHistoryTimeWindow> - <DeadLetteringOnFilterEvaluationExceptions>true</DeadLetteringOnFilterEvaluationExceptions> - </TopicDescription> - </content> -</entry> - ''' - xmldoc = minidom.parseString(xmlstr) - topic = Topic() - - invalid_topic = True - - # get node for each attribute in Topic class, if nothing found then the - # response is not valid xml for Topic. - for desc in _get_children_from_path(xmldoc, - 'entry', - 'content', - 'TopicDescription'): - invalid_topic = True - node_value = _get_first_child_node_value( - desc, 'DefaultMessageTimeToLive') - if node_value is not None: - topic.default_message_time_to_live = node_value - invalid_topic = False - node_value = _get_first_child_node_value(desc, 'MaxSizeInMegabytes') - if node_value is not None: - topic.max_size_in_megabytes = int(node_value) - invalid_topic = False - node_value = _get_first_child_node_value( - desc, 'RequiresDuplicateDetection') - if node_value is not None: - topic.requires_duplicate_detection = _parse_bool(node_value) - invalid_topic = False - node_value = _get_first_child_node_value( - desc, 'DuplicateDetectionHistoryTimeWindow') - if node_value is not None: - topic.duplicate_detection_history_time_window = node_value - invalid_topic = False - node_value = _get_first_child_node_value( - desc, 'EnableBatchedOperations') - if node_value is not None: - topic.enable_batched_operations = _parse_bool(node_value) - invalid_topic = False - node_value = _get_first_child_node_value(desc, 'SizeInBytes') - if node_value is not None: - topic.size_in_bytes = int(node_value) - invalid_topic = False - - if invalid_topic: - raise WindowsAzureError(_ERROR_TOPIC_NOT_FOUND) - - # extract id, updated and name value from feed entry and set them of topic. - for name, value in _get_entry_properties(xmlstr, True).items(): - setattr(topic, name, value) - return topic - - -def _convert_response_to_subscription(response): - return _convert_xml_to_subscription(response.body) - - -def _convert_xml_to_subscription(xmlstr): - '''Converts xml response to subscription - - The xml format for subscription: -<entry xmlns='http://www.w3.org/2005/Atom'> - <content type='application/xml'> - <SubscriptionDescription - xmlns:i="http://www.w3.org/2001/XMLSchema-instance" - xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"> - <LockDuration>PT5M</LockDuration> - <RequiresSession>false</RequiresSession> - <DefaultMessageTimeToLive>P10675199DT2H48M5.4775807S</DefaultMessageTimeToLive> - <DeadLetteringOnMessageExpiration>false</DeadLetteringOnMessageExpiration> - <DeadLetteringOnFilterEvaluationExceptions>true</DeadLetteringOnFilterEvaluationExceptions> - </SubscriptionDescription> - </content> -</entry> - ''' - xmldoc = minidom.parseString(xmlstr) - subscription = Subscription() - - for desc in _get_children_from_path(xmldoc, - 'entry', - 'content', - 'SubscriptionDescription'): - node_value = _get_first_child_node_value(desc, 'LockDuration') - if node_value is not None: - subscription.lock_duration = node_value - - node_value = _get_first_child_node_value( - desc, 'RequiresSession') - if node_value is not None: - subscription.requires_session = _parse_bool(node_value) - - node_value = _get_first_child_node_value( - desc, 'DefaultMessageTimeToLive') - if node_value is not None: - subscription.default_message_time_to_live = node_value - - node_value = _get_first_child_node_value( - desc, 'DeadLetteringOnFilterEvaluationExceptions') - if node_value is not None: - subscription.dead_lettering_on_filter_evaluation_exceptions = \ - _parse_bool(node_value) - - node_value = _get_first_child_node_value( - desc, 'DeadLetteringOnMessageExpiration') - if node_value is not None: - subscription.dead_lettering_on_message_expiration = \ - _parse_bool(node_value) - - node_value = _get_first_child_node_value( - desc, 'EnableBatchedOperations') - if node_value is not None: - subscription.enable_batched_operations = _parse_bool(node_value) - - node_value = _get_first_child_node_value( - desc, 'MaxDeliveryCount') - if node_value is not None: - subscription.max_delivery_count = int(node_value) - - node_value = _get_first_child_node_value( - desc, 'MessageCount') - if node_value is not None: - subscription.message_count = int(node_value) - - for name, value in _get_entry_properties(xmlstr, - True, - '/subscriptions').items(): - setattr(subscription, name, value) - - return subscription - - -def _convert_subscription_to_xml(subscription): - ''' - Converts a subscription object to xml to send. The order of each field of - subscription in xml is very important so we can't simple call - convert_class_to_xml. - - subscription: the subsciption object to be converted. - ''' - - subscription_body = '<SubscriptionDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">' - if subscription: - if subscription.lock_duration is not None: - subscription_body += ''.join( - ['<LockDuration>', - str(subscription.lock_duration), - '</LockDuration>']) - - if subscription.requires_session is not None: - subscription_body += ''.join( - ['<RequiresSession>', - str(subscription.requires_session).lower(), - '</RequiresSession>']) - - if subscription.default_message_time_to_live is not None: - subscription_body += ''.join( - ['<DefaultMessageTimeToLive>', - str(subscription.default_message_time_to_live), - '</DefaultMessageTimeToLive>']) - - if subscription.dead_lettering_on_message_expiration is not None: - subscription_body += ''.join( - ['<DeadLetteringOnMessageExpiration>', - str(subscription.dead_lettering_on_message_expiration).lower(), - '</DeadLetteringOnMessageExpiration>']) - - if subscription.dead_lettering_on_filter_evaluation_exceptions is not None: - subscription_body += ''.join( - ['<DeadLetteringOnFilterEvaluationExceptions>', - str(subscription.dead_lettering_on_filter_evaluation_exceptions).lower(), - '</DeadLetteringOnFilterEvaluationExceptions>']) - - if subscription.enable_batched_operations is not None: - subscription_body += ''.join( - ['<EnableBatchedOperations>', - str(subscription.enable_batched_operations).lower(), - '</EnableBatchedOperations>']) - - if subscription.max_delivery_count is not None: - subscription_body += ''.join( - ['<MaxDeliveryCount>', - str(subscription.max_delivery_count), - '</MaxDeliveryCount>']) - - if subscription.message_count is not None: - subscription_body += ''.join( - ['<MessageCount>', - str(subscription.message_count), - '</MessageCount>']) - - subscription_body += '</SubscriptionDescription>' - return _create_entry(subscription_body) - - -def _convert_rule_to_xml(rule): - ''' - Converts a rule object to xml to send. The order of each field of rule - in xml is very important so we cann't simple call convert_class_to_xml. - - rule: the rule object to be converted. - ''' - rule_body = '<RuleDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">' - if rule: - if rule.filter_type: - rule_body += ''.join( - ['<Filter i:type="', - xml_escape(rule.filter_type), - '">']) - if rule.filter_type == 'CorrelationFilter': - rule_body += ''.join( - ['<CorrelationId>', - xml_escape(rule.filter_expression), - '</CorrelationId>']) - else: - rule_body += ''.join( - ['<SqlExpression>', - xml_escape(rule.filter_expression), - '</SqlExpression>']) - rule_body += '<CompatibilityLevel>20</CompatibilityLevel>' - rule_body += '</Filter>' - if rule.action_type: - rule_body += ''.join( - ['<Action i:type="', - xml_escape(rule.action_type), - '">']) - if rule.action_type == 'SqlRuleAction': - rule_body += ''.join( - ['<SqlExpression>', - xml_escape(rule.action_expression), - '</SqlExpression>']) - rule_body += '<CompatibilityLevel>20</CompatibilityLevel>' - rule_body += '</Action>' - rule_body += '</RuleDescription>' - - return _create_entry(rule_body) - - -def _convert_topic_to_xml(topic): - ''' - Converts a topic object to xml to send. The order of each field of topic - in xml is very important so we cann't simple call convert_class_to_xml. - - topic: the topic object to be converted. - ''' - - topic_body = '<TopicDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">' - if topic: - if topic.default_message_time_to_live is not None: - topic_body += ''.join( - ['<DefaultMessageTimeToLive>', - str(topic.default_message_time_to_live), - '</DefaultMessageTimeToLive>']) - - if topic.max_size_in_megabytes is not None: - topic_body += ''.join( - ['<MaxSizeInMegabytes>', - str(topic.max_size_in_megabytes), - '</MaxSizeInMegabytes>']) - - if topic.requires_duplicate_detection is not None: - topic_body += ''.join( - ['<RequiresDuplicateDetection>', - str(topic.requires_duplicate_detection).lower(), - '</RequiresDuplicateDetection>']) - - if topic.duplicate_detection_history_time_window is not None: - topic_body += ''.join( - ['<DuplicateDetectionHistoryTimeWindow>', - str(topic.duplicate_detection_history_time_window), - '</DuplicateDetectionHistoryTimeWindow>']) - - if topic.enable_batched_operations is not None: - topic_body += ''.join( - ['<EnableBatchedOperations>', - str(topic.enable_batched_operations).lower(), - '</EnableBatchedOperations>']) - - if topic.size_in_bytes is not None: - topic_body += ''.join( - ['<SizeInBytes>', - str(topic.size_in_bytes), - '</SizeInBytes>']) - - topic_body += '</TopicDescription>' - - return _create_entry(topic_body) - - -def _convert_queue_to_xml(queue): - ''' - Converts a queue object to xml to send. The order of each field of queue - in xml is very important so we cann't simple call convert_class_to_xml. - - queue: the queue object to be converted. - ''' - queue_body = '<QueueDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">' - if queue: - if queue.lock_duration: - queue_body += ''.join( - ['<LockDuration>', - str(queue.lock_duration), - '</LockDuration>']) - - if queue.max_size_in_megabytes is not None: - queue_body += ''.join( - ['<MaxSizeInMegabytes>', - str(queue.max_size_in_megabytes), - '</MaxSizeInMegabytes>']) - - if queue.requires_duplicate_detection is not None: - queue_body += ''.join( - ['<RequiresDuplicateDetection>', - str(queue.requires_duplicate_detection).lower(), - '</RequiresDuplicateDetection>']) - - if queue.requires_session is not None: - queue_body += ''.join( - ['<RequiresSession>', - str(queue.requires_session).lower(), - '</RequiresSession>']) - - if queue.default_message_time_to_live is not None: - queue_body += ''.join( - ['<DefaultMessageTimeToLive>', - str(queue.default_message_time_to_live), - '</DefaultMessageTimeToLive>']) - - if queue.dead_lettering_on_message_expiration is not None: - queue_body += ''.join( - ['<DeadLetteringOnMessageExpiration>', - str(queue.dead_lettering_on_message_expiration).lower(), - '</DeadLetteringOnMessageExpiration>']) - - if queue.duplicate_detection_history_time_window is not None: - queue_body += ''.join( - ['<DuplicateDetectionHistoryTimeWindow>', - str(queue.duplicate_detection_history_time_window), - '</DuplicateDetectionHistoryTimeWindow>']) - - if queue.max_delivery_count is not None: - queue_body += ''.join( - ['<MaxDeliveryCount>', - str(queue.max_delivery_count), - '</MaxDeliveryCount>']) - - if queue.enable_batched_operations is not None: - queue_body += ''.join( - ['<EnableBatchedOperations>', - str(queue.enable_batched_operations).lower(), - '</EnableBatchedOperations>']) - - if queue.size_in_bytes is not None: - queue_body += ''.join( - ['<SizeInBytes>', - str(queue.size_in_bytes), - '</SizeInBytes>']) - - if queue.message_count is not None: - queue_body += ''.join( - ['<MessageCount>', - str(queue.message_count), - '</MessageCount>']) - - queue_body += '</QueueDescription>' - return _create_entry(queue_body) - - -def _service_bus_error_handler(http_error): - ''' Simple error handler for service bus service. ''' - return _general_error_handler(http_error) - -from azure.servicebus.servicebusservice import ServiceBusService +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +import ast +import json +import sys + +from datetime import datetime +from xml.dom import minidom +from azure import ( + WindowsAzureData, + WindowsAzureError, + xml_escape, + _create_entry, + _general_error_handler, + _get_entry_properties, + _get_child_nodes, + _get_children_from_path, + _get_first_child_node_value, + _ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_DELETE, + _ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_UNLOCK, + _ERROR_QUEUE_NOT_FOUND, + _ERROR_TOPIC_NOT_FOUND, + ) +from azure.http import HTTPError + +# default rule name for subscription +DEFAULT_RULE_NAME = '$Default' + +#----------------------------------------------------------------------------- +# Constants for Azure app environment settings. +AZURE_SERVICEBUS_NAMESPACE = 'AZURE_SERVICEBUS_NAMESPACE' +AZURE_SERVICEBUS_ACCESS_KEY = 'AZURE_SERVICEBUS_ACCESS_KEY' +AZURE_SERVICEBUS_ISSUER = 'AZURE_SERVICEBUS_ISSUER' + +# namespace used for converting rules to objects +XML_SCHEMA_NAMESPACE = 'http://www.w3.org/2001/XMLSchema-instance' + + +class Queue(WindowsAzureData): + + ''' Queue class corresponding to Queue Description: + http://msdn.microsoft.com/en-us/library/windowsazure/hh780773''' + + def __init__(self, lock_duration=None, max_size_in_megabytes=None, + requires_duplicate_detection=None, requires_session=None, + default_message_time_to_live=None, + dead_lettering_on_message_expiration=None, + duplicate_detection_history_time_window=None, + max_delivery_count=None, enable_batched_operations=None, + size_in_bytes=None, message_count=None): + + self.lock_duration = lock_duration + self.max_size_in_megabytes = max_size_in_megabytes + self.requires_duplicate_detection = requires_duplicate_detection + self.requires_session = requires_session + self.default_message_time_to_live = default_message_time_to_live + self.dead_lettering_on_message_expiration = \ + dead_lettering_on_message_expiration + self.duplicate_detection_history_time_window = \ + duplicate_detection_history_time_window + self.max_delivery_count = max_delivery_count + self.enable_batched_operations = enable_batched_operations + self.size_in_bytes = size_in_bytes + self.message_count = message_count + + +class Topic(WindowsAzureData): + + ''' Topic class corresponding to Topic Description: + http://msdn.microsoft.com/en-us/library/windowsazure/hh780749. ''' + + def __init__(self, default_message_time_to_live=None, + max_size_in_megabytes=None, requires_duplicate_detection=None, + duplicate_detection_history_time_window=None, + enable_batched_operations=None, size_in_bytes=None): + + self.default_message_time_to_live = default_message_time_to_live + self.max_size_in_megabytes = max_size_in_megabytes + self.requires_duplicate_detection = requires_duplicate_detection + self.duplicate_detection_history_time_window = \ + duplicate_detection_history_time_window + self.enable_batched_operations = enable_batched_operations + self.size_in_bytes = size_in_bytes + + @property + def max_size_in_mega_bytes(self): + import warnings + warnings.warn( + 'This attribute has been changed to max_size_in_megabytes.') + return self.max_size_in_megabytes + + @max_size_in_mega_bytes.setter + def max_size_in_mega_bytes(self, value): + self.max_size_in_megabytes = value + + +class Subscription(WindowsAzureData): + + ''' Subscription class corresponding to Subscription Description: + http://msdn.microsoft.com/en-us/library/windowsazure/hh780763. ''' + + def __init__(self, lock_duration=None, requires_session=None, + default_message_time_to_live=None, + dead_lettering_on_message_expiration=None, + dead_lettering_on_filter_evaluation_exceptions=None, + enable_batched_operations=None, max_delivery_count=None, + message_count=None): + + self.lock_duration = lock_duration + self.requires_session = requires_session + self.default_message_time_to_live = default_message_time_to_live + self.dead_lettering_on_message_expiration = \ + dead_lettering_on_message_expiration + self.dead_lettering_on_filter_evaluation_exceptions = \ + dead_lettering_on_filter_evaluation_exceptions + self.enable_batched_operations = enable_batched_operations + self.max_delivery_count = max_delivery_count + self.message_count = message_count + + +class Rule(WindowsAzureData): + + ''' Rule class corresponding to Rule Description: + http://msdn.microsoft.com/en-us/library/windowsazure/hh780753. ''' + + def __init__(self, filter_type=None, filter_expression=None, + action_type=None, action_expression=None): + self.filter_type = filter_type + self.filter_expression = filter_expression + self.action_type = action_type + self.action_expression = action_type + + +class Message(WindowsAzureData): + + ''' Message class that used in send message/get mesage apis. ''' + + def __init__(self, body=None, service_bus_service=None, location=None, + custom_properties=None, + type='application/atom+xml;type=entry;charset=utf-8', + broker_properties=None): + self.body = body + self.location = location + self.broker_properties = broker_properties + self.custom_properties = custom_properties + self.type = type + self.service_bus_service = service_bus_service + self._topic_name = None + self._subscription_name = None + self._queue_name = None + + if not service_bus_service: + return + + # if location is set, then extracts the queue name for queue message and + # extracts the topic and subscriptions name if it is topic message. + if location: + if '/subscriptions/' in location: + pos = location.find(service_bus_service.host_base.lower())+1 + pos1 = location.find('/subscriptions/') + self._topic_name = location[pos+len(service_bus_service.host_base):pos1] + pos = pos1 + len('/subscriptions/') + pos1 = location.find('/', pos) + self._subscription_name = location[pos:pos1] + elif '/messages/' in location: + pos = location.find(service_bus_service.host_base.lower())+1 + pos1 = location.find('/messages/') + self._queue_name = location[pos+len(service_bus_service.host_base):pos1] + + def delete(self): + ''' Deletes itself if find queue name or topic name and subscription + name. ''' + if self._queue_name: + self.service_bus_service.delete_queue_message( + self._queue_name, + self.broker_properties['SequenceNumber'], + self.broker_properties['LockToken']) + elif self._topic_name and self._subscription_name: + self.service_bus_service.delete_subscription_message( + self._topic_name, + self._subscription_name, + self.broker_properties['SequenceNumber'], + self.broker_properties['LockToken']) + else: + raise WindowsAzureError(_ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_DELETE) + + def unlock(self): + ''' Unlocks itself if find queue name or topic name and subscription + name. ''' + if self._queue_name: + self.service_bus_service.unlock_queue_message( + self._queue_name, + self.broker_properties['SequenceNumber'], + self.broker_properties['LockToken']) + elif self._topic_name and self._subscription_name: + self.service_bus_service.unlock_subscription_message( + self._topic_name, + self._subscription_name, + self.broker_properties['SequenceNumber'], + self.broker_properties['LockToken']) + else: + raise WindowsAzureError(_ERROR_MESSAGE_NOT_PEEK_LOCKED_ON_UNLOCK) + + def add_headers(self, request): + ''' add addtional headers to request for message request.''' + + # Adds custom properties + if self.custom_properties: + for name, value in self.custom_properties.items(): + if sys.version_info < (3,) and isinstance(value, unicode): + request.headers.append( + (name, '"' + value.encode('utf-8') + '"')) + elif isinstance(value, str): + request.headers.append((name, '"' + str(value) + '"')) + elif isinstance(value, datetime): + request.headers.append( + (name, '"' + value.strftime('%a, %d %b %Y %H:%M:%S GMT') + '"')) + else: + request.headers.append((name, str(value).lower())) + + # Adds content-type + request.headers.append(('Content-Type', self.type)) + + # Adds BrokerProperties + if self.broker_properties: + request.headers.append( + ('BrokerProperties', str(self.broker_properties))) + + return request.headers + + +def _create_message(response, service_instance): + ''' Create message from response. + + response: response from service bus cloud server. + service_instance: the service bus client. + ''' + respbody = response.body + custom_properties = {} + broker_properties = None + message_type = None + message_location = None + + # gets all information from respheaders. + for name, value in response.headers: + if name.lower() == 'brokerproperties': + broker_properties = json.loads(value) + elif name.lower() == 'content-type': + message_type = value + elif name.lower() == 'location': + message_location = value + elif name.lower() not in ['content-type', + 'brokerproperties', + 'transfer-encoding', + 'server', + 'location', + 'date']: + if '"' in value: + value = value[1:-1] + try: + custom_properties[name] = datetime.strptime( + value, '%a, %d %b %Y %H:%M:%S GMT') + except ValueError: + custom_properties[name] = value + else: # only int, float or boolean + if value.lower() == 'true': + custom_properties[name] = True + elif value.lower() == 'false': + custom_properties[name] = False + # int('3.1') doesn't work so need to get float('3.14') first + elif str(int(float(value))) == value: + custom_properties[name] = int(value) + else: + custom_properties[name] = float(value) + + if message_type == None: + message = Message( + respbody, service_instance, message_location, custom_properties, + 'application/atom+xml;type=entry;charset=utf-8', broker_properties) + else: + message = Message(respbody, service_instance, message_location, + custom_properties, message_type, broker_properties) + return message + +# convert functions + + +def _convert_response_to_rule(response): + return _convert_xml_to_rule(response.body) + + +def _convert_xml_to_rule(xmlstr): + ''' Converts response xml to rule object. + + The format of xml for rule: +<entry xmlns='http://www.w3.org/2005/Atom'> +<content type='application/xml'> +<RuleDescription + xmlns:i="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"> + <Filter i:type="SqlFilterExpression"> + <SqlExpression>MyProperty='XYZ'</SqlExpression> + </Filter> + <Action i:type="SqlFilterAction"> + <SqlExpression>set MyProperty2 = 'ABC'</SqlExpression> + </Action> +</RuleDescription> +</content> +</entry> + ''' + xmldoc = minidom.parseString(xmlstr) + rule = Rule() + + for rule_desc in _get_children_from_path(xmldoc, + 'entry', + 'content', + 'RuleDescription'): + for xml_filter in _get_child_nodes(rule_desc, 'Filter'): + filter_type = xml_filter.getAttributeNS( + XML_SCHEMA_NAMESPACE, 'type') + setattr(rule, 'filter_type', str(filter_type)) + if xml_filter.childNodes: + + for expr in _get_child_nodes(xml_filter, 'SqlExpression'): + setattr(rule, 'filter_expression', + expr.firstChild.nodeValue) + + for xml_action in _get_child_nodes(rule_desc, 'Action'): + action_type = xml_action.getAttributeNS( + XML_SCHEMA_NAMESPACE, 'type') + setattr(rule, 'action_type', str(action_type)) + if xml_action.childNodes: + action_expression = xml_action.childNodes[0].firstChild + if action_expression: + setattr(rule, 'action_expression', + action_expression.nodeValue) + + # extract id, updated and name value from feed entry and set them of rule. + for name, value in _get_entry_properties(xmlstr, True, '/rules').items(): + setattr(rule, name, value) + + return rule + + +def _convert_response_to_queue(response): + return _convert_xml_to_queue(response.body) + + +def _parse_bool(value): + if value.lower() == 'true': + return True + return False + + +def _convert_xml_to_queue(xmlstr): + ''' Converts xml response to queue object. + + The format of xml response for queue: +<QueueDescription + xmlns=\"http://schemas.microsoft.com/netservices/2010/10/servicebus/connect\"> + <MaxSizeInBytes>10000</MaxSizeInBytes> + <DefaultMessageTimeToLive>PT5M</DefaultMessageTimeToLive> + <LockDuration>PT2M</LockDuration> + <RequiresGroupedReceives>False</RequiresGroupedReceives> + <SupportsDuplicateDetection>False</SupportsDuplicateDetection> + ... +</QueueDescription> + + ''' + xmldoc = minidom.parseString(xmlstr) + queue = Queue() + + invalid_queue = True + # get node for each attribute in Queue class, if nothing found then the + # response is not valid xml for Queue. + for desc in _get_children_from_path(xmldoc, + 'entry', + 'content', + 'QueueDescription'): + node_value = _get_first_child_node_value(desc, 'LockDuration') + if node_value is not None: + queue.lock_duration = node_value + invalid_queue = False + + node_value = _get_first_child_node_value(desc, 'MaxSizeInMegabytes') + if node_value is not None: + queue.max_size_in_megabytes = int(node_value) + invalid_queue = False + + node_value = _get_first_child_node_value( + desc, 'RequiresDuplicateDetection') + if node_value is not None: + queue.requires_duplicate_detection = _parse_bool(node_value) + invalid_queue = False + + node_value = _get_first_child_node_value(desc, 'RequiresSession') + if node_value is not None: + queue.requires_session = _parse_bool(node_value) + invalid_queue = False + + node_value = _get_first_child_node_value( + desc, 'DefaultMessageTimeToLive') + if node_value is not None: + queue.default_message_time_to_live = node_value + invalid_queue = False + + node_value = _get_first_child_node_value( + desc, 'DeadLetteringOnMessageExpiration') + if node_value is not None: + queue.dead_lettering_on_message_expiration = _parse_bool(node_value) + invalid_queue = False + + node_value = _get_first_child_node_value( + desc, 'DuplicateDetectionHistoryTimeWindow') + if node_value is not None: + queue.duplicate_detection_history_time_window = node_value + invalid_queue = False + + node_value = _get_first_child_node_value( + desc, 'EnableBatchedOperations') + if node_value is not None: + queue.enable_batched_operations = _parse_bool(node_value) + invalid_queue = False + + node_value = _get_first_child_node_value(desc, 'MaxDeliveryCount') + if node_value is not None: + queue.max_delivery_count = int(node_value) + invalid_queue = False + + node_value = _get_first_child_node_value(desc, 'MessageCount') + if node_value is not None: + queue.message_count = int(node_value) + invalid_queue = False + + node_value = _get_first_child_node_value(desc, 'SizeInBytes') + if node_value is not None: + queue.size_in_bytes = int(node_value) + invalid_queue = False + + if invalid_queue: + raise WindowsAzureError(_ERROR_QUEUE_NOT_FOUND) + + # extract id, updated and name value from feed entry and set them of queue. + for name, value in _get_entry_properties(xmlstr, True).items(): + setattr(queue, name, value) + + return queue + + +def _convert_response_to_topic(response): + return _convert_xml_to_topic(response.body) + + +def _convert_xml_to_topic(xmlstr): + '''Converts xml response to topic + + The xml format for topic: +<entry xmlns='http://www.w3.org/2005/Atom'> + <content type='application/xml'> + <TopicDescription + xmlns:i="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"> + <DefaultMessageTimeToLive>P10675199DT2H48M5.4775807S</DefaultMessageTimeToLive> + <MaxSizeInMegabytes>1024</MaxSizeInMegabytes> + <RequiresDuplicateDetection>false</RequiresDuplicateDetection> + <DuplicateDetectionHistoryTimeWindow>P7D</DuplicateDetectionHistoryTimeWindow> + <DeadLetteringOnFilterEvaluationExceptions>true</DeadLetteringOnFilterEvaluationExceptions> + </TopicDescription> + </content> +</entry> + ''' + xmldoc = minidom.parseString(xmlstr) + topic = Topic() + + invalid_topic = True + + # get node for each attribute in Topic class, if nothing found then the + # response is not valid xml for Topic. + for desc in _get_children_from_path(xmldoc, + 'entry', + 'content', + 'TopicDescription'): + invalid_topic = True + node_value = _get_first_child_node_value( + desc, 'DefaultMessageTimeToLive') + if node_value is not None: + topic.default_message_time_to_live = node_value + invalid_topic = False + node_value = _get_first_child_node_value(desc, 'MaxSizeInMegabytes') + if node_value is not None: + topic.max_size_in_megabytes = int(node_value) + invalid_topic = False + node_value = _get_first_child_node_value( + desc, 'RequiresDuplicateDetection') + if node_value is not None: + topic.requires_duplicate_detection = _parse_bool(node_value) + invalid_topic = False + node_value = _get_first_child_node_value( + desc, 'DuplicateDetectionHistoryTimeWindow') + if node_value is not None: + topic.duplicate_detection_history_time_window = node_value + invalid_topic = False + node_value = _get_first_child_node_value( + desc, 'EnableBatchedOperations') + if node_value is not None: + topic.enable_batched_operations = _parse_bool(node_value) + invalid_topic = False + node_value = _get_first_child_node_value(desc, 'SizeInBytes') + if node_value is not None: + topic.size_in_bytes = int(node_value) + invalid_topic = False + + if invalid_topic: + raise WindowsAzureError(_ERROR_TOPIC_NOT_FOUND) + + # extract id, updated and name value from feed entry and set them of topic. + for name, value in _get_entry_properties(xmlstr, True).items(): + setattr(topic, name, value) + return topic + + +def _convert_response_to_subscription(response): + return _convert_xml_to_subscription(response.body) + + +def _convert_xml_to_subscription(xmlstr): + '''Converts xml response to subscription + + The xml format for subscription: +<entry xmlns='http://www.w3.org/2005/Atom'> + <content type='application/xml'> + <SubscriptionDescription + xmlns:i="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"> + <LockDuration>PT5M</LockDuration> + <RequiresSession>false</RequiresSession> + <DefaultMessageTimeToLive>P10675199DT2H48M5.4775807S</DefaultMessageTimeToLive> + <DeadLetteringOnMessageExpiration>false</DeadLetteringOnMessageExpiration> + <DeadLetteringOnFilterEvaluationExceptions>true</DeadLetteringOnFilterEvaluationExceptions> + </SubscriptionDescription> + </content> +</entry> + ''' + xmldoc = minidom.parseString(xmlstr) + subscription = Subscription() + + for desc in _get_children_from_path(xmldoc, + 'entry', + 'content', + 'SubscriptionDescription'): + node_value = _get_first_child_node_value(desc, 'LockDuration') + if node_value is not None: + subscription.lock_duration = node_value + + node_value = _get_first_child_node_value( + desc, 'RequiresSession') + if node_value is not None: + subscription.requires_session = _parse_bool(node_value) + + node_value = _get_first_child_node_value( + desc, 'DefaultMessageTimeToLive') + if node_value is not None: + subscription.default_message_time_to_live = node_value + + node_value = _get_first_child_node_value( + desc, 'DeadLetteringOnFilterEvaluationExceptions') + if node_value is not None: + subscription.dead_lettering_on_filter_evaluation_exceptions = \ + _parse_bool(node_value) + + node_value = _get_first_child_node_value( + desc, 'DeadLetteringOnMessageExpiration') + if node_value is not None: + subscription.dead_lettering_on_message_expiration = \ + _parse_bool(node_value) + + node_value = _get_first_child_node_value( + desc, 'EnableBatchedOperations') + if node_value is not None: + subscription.enable_batched_operations = _parse_bool(node_value) + + node_value = _get_first_child_node_value( + desc, 'MaxDeliveryCount') + if node_value is not None: + subscription.max_delivery_count = int(node_value) + + node_value = _get_first_child_node_value( + desc, 'MessageCount') + if node_value is not None: + subscription.message_count = int(node_value) + + for name, value in _get_entry_properties(xmlstr, + True, + '/subscriptions').items(): + setattr(subscription, name, value) + + return subscription + + +def _convert_subscription_to_xml(subscription): + ''' + Converts a subscription object to xml to send. The order of each field of + subscription in xml is very important so we can't simple call + convert_class_to_xml. + + subscription: the subsciption object to be converted. + ''' + + subscription_body = '<SubscriptionDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">' + if subscription: + if subscription.lock_duration is not None: + subscription_body += ''.join( + ['<LockDuration>', + str(subscription.lock_duration), + '</LockDuration>']) + + if subscription.requires_session is not None: + subscription_body += ''.join( + ['<RequiresSession>', + str(subscription.requires_session).lower(), + '</RequiresSession>']) + + if subscription.default_message_time_to_live is not None: + subscription_body += ''.join( + ['<DefaultMessageTimeToLive>', + str(subscription.default_message_time_to_live), + '</DefaultMessageTimeToLive>']) + + if subscription.dead_lettering_on_message_expiration is not None: + subscription_body += ''.join( + ['<DeadLetteringOnMessageExpiration>', + str(subscription.dead_lettering_on_message_expiration).lower(), + '</DeadLetteringOnMessageExpiration>']) + + if subscription.dead_lettering_on_filter_evaluation_exceptions is not None: + subscription_body += ''.join( + ['<DeadLetteringOnFilterEvaluationExceptions>', + str(subscription.dead_lettering_on_filter_evaluation_exceptions).lower(), + '</DeadLetteringOnFilterEvaluationExceptions>']) + + if subscription.enable_batched_operations is not None: + subscription_body += ''.join( + ['<EnableBatchedOperations>', + str(subscription.enable_batched_operations).lower(), + '</EnableBatchedOperations>']) + + if subscription.max_delivery_count is not None: + subscription_body += ''.join( + ['<MaxDeliveryCount>', + str(subscription.max_delivery_count), + '</MaxDeliveryCount>']) + + if subscription.message_count is not None: + subscription_body += ''.join( + ['<MessageCount>', + str(subscription.message_count), + '</MessageCount>']) + + subscription_body += '</SubscriptionDescription>' + return _create_entry(subscription_body) + + +def _convert_rule_to_xml(rule): + ''' + Converts a rule object to xml to send. The order of each field of rule + in xml is very important so we cann't simple call convert_class_to_xml. + + rule: the rule object to be converted. + ''' + rule_body = '<RuleDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">' + if rule: + if rule.filter_type: + rule_body += ''.join( + ['<Filter i:type="', + xml_escape(rule.filter_type), + '">']) + if rule.filter_type == 'CorrelationFilter': + rule_body += ''.join( + ['<CorrelationId>', + xml_escape(rule.filter_expression), + '</CorrelationId>']) + else: + rule_body += ''.join( + ['<SqlExpression>', + xml_escape(rule.filter_expression), + '</SqlExpression>']) + rule_body += '<CompatibilityLevel>20</CompatibilityLevel>' + rule_body += '</Filter>' + if rule.action_type: + rule_body += ''.join( + ['<Action i:type="', + xml_escape(rule.action_type), + '">']) + if rule.action_type == 'SqlRuleAction': + rule_body += ''.join( + ['<SqlExpression>', + xml_escape(rule.action_expression), + '</SqlExpression>']) + rule_body += '<CompatibilityLevel>20</CompatibilityLevel>' + rule_body += '</Action>' + rule_body += '</RuleDescription>' + + return _create_entry(rule_body) + + +def _convert_topic_to_xml(topic): + ''' + Converts a topic object to xml to send. The order of each field of topic + in xml is very important so we cann't simple call convert_class_to_xml. + + topic: the topic object to be converted. + ''' + + topic_body = '<TopicDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">' + if topic: + if topic.default_message_time_to_live is not None: + topic_body += ''.join( + ['<DefaultMessageTimeToLive>', + str(topic.default_message_time_to_live), + '</DefaultMessageTimeToLive>']) + + if topic.max_size_in_megabytes is not None: + topic_body += ''.join( + ['<MaxSizeInMegabytes>', + str(topic.max_size_in_megabytes), + '</MaxSizeInMegabytes>']) + + if topic.requires_duplicate_detection is not None: + topic_body += ''.join( + ['<RequiresDuplicateDetection>', + str(topic.requires_duplicate_detection).lower(), + '</RequiresDuplicateDetection>']) + + if topic.duplicate_detection_history_time_window is not None: + topic_body += ''.join( + ['<DuplicateDetectionHistoryTimeWindow>', + str(topic.duplicate_detection_history_time_window), + '</DuplicateDetectionHistoryTimeWindow>']) + + if topic.enable_batched_operations is not None: + topic_body += ''.join( + ['<EnableBatchedOperations>', + str(topic.enable_batched_operations).lower(), + '</EnableBatchedOperations>']) + + if topic.size_in_bytes is not None: + topic_body += ''.join( + ['<SizeInBytes>', + str(topic.size_in_bytes), + '</SizeInBytes>']) + + topic_body += '</TopicDescription>' + + return _create_entry(topic_body) + + +def _convert_queue_to_xml(queue): + ''' + Converts a queue object to xml to send. The order of each field of queue + in xml is very important so we cann't simple call convert_class_to_xml. + + queue: the queue object to be converted. + ''' + queue_body = '<QueueDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">' + if queue: + if queue.lock_duration: + queue_body += ''.join( + ['<LockDuration>', + str(queue.lock_duration), + '</LockDuration>']) + + if queue.max_size_in_megabytes is not None: + queue_body += ''.join( + ['<MaxSizeInMegabytes>', + str(queue.max_size_in_megabytes), + '</MaxSizeInMegabytes>']) + + if queue.requires_duplicate_detection is not None: + queue_body += ''.join( + ['<RequiresDuplicateDetection>', + str(queue.requires_duplicate_detection).lower(), + '</RequiresDuplicateDetection>']) + + if queue.requires_session is not None: + queue_body += ''.join( + ['<RequiresSession>', + str(queue.requires_session).lower(), + '</RequiresSession>']) + + if queue.default_message_time_to_live is not None: + queue_body += ''.join( + ['<DefaultMessageTimeToLive>', + str(queue.default_message_time_to_live), + '</DefaultMessageTimeToLive>']) + + if queue.dead_lettering_on_message_expiration is not None: + queue_body += ''.join( + ['<DeadLetteringOnMessageExpiration>', + str(queue.dead_lettering_on_message_expiration).lower(), + '</DeadLetteringOnMessageExpiration>']) + + if queue.duplicate_detection_history_time_window is not None: + queue_body += ''.join( + ['<DuplicateDetectionHistoryTimeWindow>', + str(queue.duplicate_detection_history_time_window), + '</DuplicateDetectionHistoryTimeWindow>']) + + if queue.max_delivery_count is not None: + queue_body += ''.join( + ['<MaxDeliveryCount>', + str(queue.max_delivery_count), + '</MaxDeliveryCount>']) + + if queue.enable_batched_operations is not None: + queue_body += ''.join( + ['<EnableBatchedOperations>', + str(queue.enable_batched_operations).lower(), + '</EnableBatchedOperations>']) + + if queue.size_in_bytes is not None: + queue_body += ''.join( + ['<SizeInBytes>', + str(queue.size_in_bytes), + '</SizeInBytes>']) + + if queue.message_count is not None: + queue_body += ''.join( + ['<MessageCount>', + str(queue.message_count), + '</MessageCount>']) + + queue_body += '</QueueDescription>' + return _create_entry(queue_body) + + +def _service_bus_error_handler(http_error): + ''' Simple error handler for service bus service. ''' + return _general_error_handler(http_error) + +from azure.servicebus.servicebusservice import ServiceBusService diff --git a/awx/lib/site-packages/azure/servicebus/servicebusservice.py b/awx/lib/site-packages/azure/servicebus/servicebusservice.py index 894f018ba2..dcd5fd6ed3 100644 --- a/awx/lib/site-packages/azure/servicebus/servicebusservice.py +++ b/awx/lib/site-packages/azure/servicebus/servicebusservice.py @@ -1,914 +1,1011 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -import os -import time - -from azure import ( - WindowsAzureError, - SERVICE_BUS_HOST_BASE, - _convert_response_to_feeds, - _dont_fail_not_exist, - _dont_fail_on_exist, - _get_request_body, - _get_request_body_bytes_only, - _int_or_none, - _str, - _update_request_uri_query, - url_quote, - url_unquote, - _validate_not_none, - ) -from azure.http import ( - HTTPError, - HTTPRequest, - ) -from azure.http.httpclient import _HTTPClient -from azure.servicebus import ( - AZURE_SERVICEBUS_NAMESPACE, - AZURE_SERVICEBUS_ACCESS_KEY, - AZURE_SERVICEBUS_ISSUER, - _convert_topic_to_xml, - _convert_response_to_topic, - _convert_queue_to_xml, - _convert_response_to_queue, - _convert_subscription_to_xml, - _convert_response_to_subscription, - _convert_rule_to_xml, - _convert_response_to_rule, - _convert_xml_to_queue, - _convert_xml_to_topic, - _convert_xml_to_subscription, - _convert_xml_to_rule, - _create_message, - _service_bus_error_handler, - ) - -# Token cache for Authentication -# Shared by the different instances of ServiceBusService -_tokens = {} - - -class ServiceBusService(object): - - def __init__(self, service_namespace=None, account_key=None, issuer=None, - x_ms_version='2011-06-01', host_base=SERVICE_BUS_HOST_BASE): - # x_ms_version is not used, but the parameter is kept for backwards - # compatibility - self.requestid = None - self.service_namespace = service_namespace - self.account_key = account_key - self.issuer = issuer - self.host_base = host_base - - # Get service namespace, account key and issuer. - # If they are set when constructing, then use them, else find them - # from environment variables. - if not self.service_namespace: - self.service_namespace = os.environ.get(AZURE_SERVICEBUS_NAMESPACE) - if not self.account_key: - self.account_key = os.environ.get(AZURE_SERVICEBUS_ACCESS_KEY) - if not self.issuer: - self.issuer = os.environ.get(AZURE_SERVICEBUS_ISSUER) - - if not self.service_namespace or \ - not self.account_key or not self.issuer: - raise WindowsAzureError( - 'You need to provide servicebus namespace, access key and Issuer') - - self._httpclient = _HTTPClient(service_instance=self, - service_namespace=self.service_namespace, - account_key=self.account_key, - issuer=self.issuer) - self._filter = self._httpclient.perform_request - - def with_filter(self, filter): - ''' - Returns a new service which will process requests with the specified - filter. Filtering operations can include logging, automatic retrying, - etc... The filter is a lambda which receives the HTTPRequest and - another lambda. The filter can perform any pre-processing on the - request, pass it off to the next lambda, and then perform any - post-processing on the response. - ''' - res = ServiceBusService(self.service_namespace, self.account_key, - self.issuer) - old_filter = self._filter - - def new_filter(request): - return filter(request, old_filter) - - res._filter = new_filter - return res - - def set_proxy(self, host, port, user=None, password=None): - ''' - Sets the proxy server host and port for the HTTP CONNECT Tunnelling. - - host: Address of the proxy. Ex: '192.168.0.100' - port: Port of the proxy. Ex: 6000 - user: User for proxy authorization. - password: Password for proxy authorization. - ''' - self._httpclient.set_proxy(host, port, user, password) - - def create_queue(self, queue_name, queue=None, fail_on_exist=False): - ''' - Creates a new queue. Once created, this queue's resource manifest is - immutable. - - queue_name: Name of the queue to create. - queue: Queue object to create. - fail_on_exist: - Specify whether to throw an exception when the queue exists. - ''' - _validate_not_none('queue_name', queue_name) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '' - request.body = _get_request_body(_convert_queue_to_xml(queue)) - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - if not fail_on_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_on_exist(ex) - return False - else: - self._perform_request(request) - return True - - def delete_queue(self, queue_name, fail_not_exist=False): - ''' - Deletes an existing queue. This operation will also remove all - associated state including messages in the queue. - - queue_name: Name of the queue to delete. - fail_not_exist: - Specify whether to throw an exception if the queue doesn't exist. - ''' - _validate_not_none('queue_name', queue_name) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - if not fail_not_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_not_exist(ex) - return False - else: - self._perform_request(request) - return True - - def get_queue(self, queue_name): - ''' - Retrieves an existing queue. - - queue_name: Name of the queue. - ''' - _validate_not_none('queue_name', queue_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - response = self._perform_request(request) - - return _convert_response_to_queue(response) - - def list_queues(self): - ''' - Enumerates the queues in the service namespace. - ''' - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/$Resources/Queues' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - response = self._perform_request(request) - - return _convert_response_to_feeds(response, _convert_xml_to_queue) - - def create_topic(self, topic_name, topic=None, fail_on_exist=False): - ''' - Creates a new topic. Once created, this topic resource manifest is - immutable. - - topic_name: Name of the topic to create. - topic: Topic object to create. - fail_on_exist: - Specify whether to throw an exception when the topic exists. - ''' - _validate_not_none('topic_name', topic_name) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(topic_name) + '' - request.body = _get_request_body(_convert_topic_to_xml(topic)) - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - if not fail_on_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_on_exist(ex) - return False - else: - self._perform_request(request) - return True - - def delete_topic(self, topic_name, fail_not_exist=False): - ''' - Deletes an existing topic. This operation will also remove all - associated state including associated subscriptions. - - topic_name: Name of the topic to delete. - fail_not_exist: - Specify whether throw exception when topic doesn't exist. - ''' - _validate_not_none('topic_name', topic_name) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + _str(topic_name) + '' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - if not fail_not_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_not_exist(ex) - return False - else: - self._perform_request(request) - return True - - def get_topic(self, topic_name): - ''' - Retrieves the description for the specified topic. - - topic_name: Name of the topic. - ''' - _validate_not_none('topic_name', topic_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + _str(topic_name) + '' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - response = self._perform_request(request) - - return _convert_response_to_topic(response) - - def list_topics(self): - ''' - Retrieves the topics in the service namespace. - ''' - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/$Resources/Topics' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - response = self._perform_request(request) - - return _convert_response_to_feeds(response, _convert_xml_to_topic) - - def create_rule(self, topic_name, subscription_name, rule_name, rule=None, - fail_on_exist=False): - ''' - Creates a new rule. Once created, this rule's resource manifest is - immutable. - - topic_name: Name of the topic. - subscription_name: Name of the subscription. - rule_name: Name of the rule. - fail_on_exist: - Specify whether to throw an exception when the rule exists. - ''' - _validate_not_none('topic_name', topic_name) - _validate_not_none('subscription_name', subscription_name) - _validate_not_none('rule_name', rule_name) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(topic_name) + '/subscriptions/' + \ - _str(subscription_name) + \ - '/rules/' + _str(rule_name) + '' - request.body = _get_request_body(_convert_rule_to_xml(rule)) - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - if not fail_on_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_on_exist(ex) - return False - else: - self._perform_request(request) - return True - - def delete_rule(self, topic_name, subscription_name, rule_name, - fail_not_exist=False): - ''' - Deletes an existing rule. - - topic_name: Name of the topic. - subscription_name: Name of the subscription. - rule_name: - Name of the rule to delete. DEFAULT_RULE_NAME=$Default. - Use DEFAULT_RULE_NAME to delete default rule for the subscription. - fail_not_exist: - Specify whether throw exception when rule doesn't exist. - ''' - _validate_not_none('topic_name', topic_name) - _validate_not_none('subscription_name', subscription_name) - _validate_not_none('rule_name', rule_name) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + _str(topic_name) + '/subscriptions/' + \ - _str(subscription_name) + \ - '/rules/' + _str(rule_name) + '' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - if not fail_not_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_not_exist(ex) - return False - else: - self._perform_request(request) - return True - - def get_rule(self, topic_name, subscription_name, rule_name): - ''' - Retrieves the description for the specified rule. - - topic_name: Name of the topic. - subscription_name: Name of the subscription. - rule_name: Name of the rule. - ''' - _validate_not_none('topic_name', topic_name) - _validate_not_none('subscription_name', subscription_name) - _validate_not_none('rule_name', rule_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + _str(topic_name) + '/subscriptions/' + \ - _str(subscription_name) + \ - '/rules/' + _str(rule_name) + '' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - response = self._perform_request(request) - - return _convert_response_to_rule(response) - - def list_rules(self, topic_name, subscription_name): - ''' - Retrieves the rules that exist under the specified subscription. - - topic_name: Name of the topic. - subscription_name: Name of the subscription. - ''' - _validate_not_none('topic_name', topic_name) - _validate_not_none('subscription_name', subscription_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + \ - _str(topic_name) + '/subscriptions/' + \ - _str(subscription_name) + '/rules/' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - response = self._perform_request(request) - - return _convert_response_to_feeds(response, _convert_xml_to_rule) - - def create_subscription(self, topic_name, subscription_name, - subscription=None, fail_on_exist=False): - ''' - Creates a new subscription. Once created, this subscription resource - manifest is immutable. - - topic_name: Name of the topic. - subscription_name: Name of the subscription. - fail_on_exist: - Specify whether throw exception when subscription exists. - ''' - _validate_not_none('topic_name', topic_name) - _validate_not_none('subscription_name', subscription_name) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(topic_name) + '/subscriptions/' + _str(subscription_name) + '' - request.body = _get_request_body( - _convert_subscription_to_xml(subscription)) - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - if not fail_on_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_on_exist(ex) - return False - else: - self._perform_request(request) - return True - - def delete_subscription(self, topic_name, subscription_name, - fail_not_exist=False): - ''' - Deletes an existing subscription. - - topic_name: Name of the topic. - subscription_name: Name of the subscription to delete. - fail_not_exist: - Specify whether to throw an exception when the subscription - doesn't exist. - ''' - _validate_not_none('topic_name', topic_name) - _validate_not_none('subscription_name', subscription_name) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + \ - _str(topic_name) + '/subscriptions/' + _str(subscription_name) + '' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - if not fail_not_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_not_exist(ex) - return False - else: - self._perform_request(request) - return True - - def get_subscription(self, topic_name, subscription_name): - ''' - Gets an existing subscription. - - topic_name: Name of the topic. - subscription_name: Name of the subscription. - ''' - _validate_not_none('topic_name', topic_name) - _validate_not_none('subscription_name', subscription_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + \ - _str(topic_name) + '/subscriptions/' + _str(subscription_name) + '' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - response = self._perform_request(request) - - return _convert_response_to_subscription(response) - - def list_subscriptions(self, topic_name): - ''' - Retrieves the subscriptions in the specified topic. - - topic_name: Name of the topic. - ''' - _validate_not_none('topic_name', topic_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + _str(topic_name) + '/subscriptions/' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - response = self._perform_request(request) - - return _convert_response_to_feeds(response, - _convert_xml_to_subscription) - - def send_topic_message(self, topic_name, message=None): - ''' - Enqueues a message into the specified topic. The limit to the number - of messages which may be present in the topic is governed by the - message size in MaxTopicSizeInBytes. If this message causes the topic - to exceed its quota, a quota exceeded error is returned and the - message will be rejected. - - topic_name: Name of the topic. - message: Message object containing message body and properties. - ''' - _validate_not_none('topic_name', topic_name) - _validate_not_none('message', message) - request = HTTPRequest() - request.method = 'POST' - request.host = self._get_host() - request.path = '/' + _str(topic_name) + '/messages' - request.headers = message.add_headers(request) - request.body = _get_request_body_bytes_only( - 'message.body', message.body) - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - self._perform_request(request) - - def peek_lock_subscription_message(self, topic_name, subscription_name, - timeout='60'): - ''' - This operation is used to atomically retrieve and lock a message for - processing. The message is guaranteed not to be delivered to other - receivers during the lock duration period specified in buffer - description. Once the lock expires, the message will be available to - other receivers (on the same subscription only) during the lock - duration period specified in the topic description. Once the lock - expires, the message will be available to other receivers. In order to - complete processing of the message, the receiver should issue a delete - command with the lock ID received from this operation. To abandon - processing of the message and unlock it for other receivers, an Unlock - Message command should be issued, or the lock duration period can - expire. - - topic_name: Name of the topic. - subscription_name: Name of the subscription. - timeout: Optional. The timeout parameter is expressed in seconds. - ''' - _validate_not_none('topic_name', topic_name) - _validate_not_none('subscription_name', subscription_name) - request = HTTPRequest() - request.method = 'POST' - request.host = self._get_host() - request.path = '/' + \ - _str(topic_name) + '/subscriptions/' + \ - _str(subscription_name) + '/messages/head' - request.query = [('timeout', _int_or_none(timeout))] - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - response = self._perform_request(request) - - return _create_message(response, self) - - def unlock_subscription_message(self, topic_name, subscription_name, - sequence_number, lock_token): - ''' - Unlock a message for processing by other receivers on a given - subscription. This operation deletes the lock object, causing the - message to be unlocked. A message must have first been locked by a - receiver before this operation is called. - - topic_name: Name of the topic. - subscription_name: Name of the subscription. - sequence_number: - The sequence number of the message to be unlocked as returned in - BrokerProperties['SequenceNumber'] by the Peek Message operation. - lock_token: - The ID of the lock as returned by the Peek Message operation in - BrokerProperties['LockToken'] - ''' - _validate_not_none('topic_name', topic_name) - _validate_not_none('subscription_name', subscription_name) - _validate_not_none('sequence_number', sequence_number) - _validate_not_none('lock_token', lock_token) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(topic_name) + \ - '/subscriptions/' + str(subscription_name) + \ - '/messages/' + _str(sequence_number) + \ - '/' + _str(lock_token) + '' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - self._perform_request(request) - - def read_delete_subscription_message(self, topic_name, subscription_name, - timeout='60'): - ''' - Read and delete a message from a subscription as an atomic operation. - This operation should be used when a best-effort guarantee is - sufficient for an application; that is, using this operation it is - possible for messages to be lost if processing fails. - - topic_name: Name of the topic. - subscription_name: Name of the subscription. - timeout: Optional. The timeout parameter is expressed in seconds. - ''' - _validate_not_none('topic_name', topic_name) - _validate_not_none('subscription_name', subscription_name) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + _str(topic_name) + \ - '/subscriptions/' + _str(subscription_name) + \ - '/messages/head' - request.query = [('timeout', _int_or_none(timeout))] - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - response = self._perform_request(request) - - return _create_message(response, self) - - def delete_subscription_message(self, topic_name, subscription_name, - sequence_number, lock_token): - ''' - Completes processing on a locked message and delete it from the - subscription. This operation should only be called after processing a - previously locked message is successful to maintain At-Least-Once - delivery assurances. - - topic_name: Name of the topic. - subscription_name: Name of the subscription. - sequence_number: - The sequence number of the message to be deleted as returned in - BrokerProperties['SequenceNumber'] by the Peek Message operation. - lock_token: - The ID of the lock as returned by the Peek Message operation in - BrokerProperties['LockToken'] - ''' - _validate_not_none('topic_name', topic_name) - _validate_not_none('subscription_name', subscription_name) - _validate_not_none('sequence_number', sequence_number) - _validate_not_none('lock_token', lock_token) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + _str(topic_name) + \ - '/subscriptions/' + _str(subscription_name) + \ - '/messages/' + _str(sequence_number) + \ - '/' + _str(lock_token) + '' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - self._perform_request(request) - - def send_queue_message(self, queue_name, message=None): - ''' - Sends a message into the specified queue. The limit to the number of - messages which may be present in the topic is governed by the message - size the MaxTopicSizeInMegaBytes. If this message will cause the queue - to exceed its quota, a quota exceeded error is returned and the - message will be rejected. - - queue_name: Name of the queue. - message: Message object containing message body and properties. - ''' - _validate_not_none('queue_name', queue_name) - _validate_not_none('message', message) - request = HTTPRequest() - request.method = 'POST' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '/messages' - request.headers = message.add_headers(request) - request.body = _get_request_body_bytes_only('message.body', - message.body) - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - self._perform_request(request) - - def peek_lock_queue_message(self, queue_name, timeout='60'): - ''' - Automically retrieves and locks a message from a queue for processing. - The message is guaranteed not to be delivered to other receivers (on - the same subscription only) during the lock duration period specified - in the queue description. Once the lock expires, the message will be - available to other receivers. In order to complete processing of the - message, the receiver should issue a delete command with the lock ID - received from this operation. To abandon processing of the message and - unlock it for other receivers, an Unlock Message command should be - issued, or the lock duration period can expire. - - queue_name: Name of the queue. - timeout: Optional. The timeout parameter is expressed in seconds. - ''' - _validate_not_none('queue_name', queue_name) - request = HTTPRequest() - request.method = 'POST' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '/messages/head' - request.query = [('timeout', _int_or_none(timeout))] - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - response = self._perform_request(request) - - return _create_message(response, self) - - def unlock_queue_message(self, queue_name, sequence_number, lock_token): - ''' - Unlocks a message for processing by other receivers on a given - subscription. This operation deletes the lock object, causing the - message to be unlocked. A message must have first been locked by a - receiver before this operation is called. - - queue_name: Name of the queue. - sequence_number: - The sequence number of the message to be unlocked as returned in - BrokerProperties['SequenceNumber'] by the Peek Message operation. - lock_token: - The ID of the lock as returned by the Peek Message operation in - BrokerProperties['LockToken'] - ''' - _validate_not_none('queue_name', queue_name) - _validate_not_none('sequence_number', sequence_number) - _validate_not_none('lock_token', lock_token) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + \ - '/messages/' + _str(sequence_number) + \ - '/' + _str(lock_token) + '' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - self._perform_request(request) - - def read_delete_queue_message(self, queue_name, timeout='60'): - ''' - Reads and deletes a message from a queue as an atomic operation. This - operation should be used when a best-effort guarantee is sufficient - for an application; that is, using this operation it is possible for - messages to be lost if processing fails. - - queue_name: Name of the queue. - timeout: Optional. The timeout parameter is expressed in seconds. - ''' - _validate_not_none('queue_name', queue_name) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '/messages/head' - request.query = [('timeout', _int_or_none(timeout))] - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - response = self._perform_request(request) - - return _create_message(response, self) - - def delete_queue_message(self, queue_name, sequence_number, lock_token): - ''' - Completes processing on a locked message and delete it from the queue. - This operation should only be called after processing a previously - locked message is successful to maintain At-Least-Once delivery - assurances. - - queue_name: Name of the queue. - sequence_number: - The sequence number of the message to be deleted as returned in - BrokerProperties['SequenceNumber'] by the Peek Message operation. - lock_token: - The ID of the lock as returned by the Peek Message operation in - BrokerProperties['LockToken'] - ''' - _validate_not_none('queue_name', queue_name) - _validate_not_none('sequence_number', sequence_number) - _validate_not_none('lock_token', lock_token) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + \ - '/messages/' + _str(sequence_number) + \ - '/' + _str(lock_token) + '' - request.path, request.query = _update_request_uri_query(request) - request.headers = self._update_service_bus_header(request) - self._perform_request(request) - - def receive_queue_message(self, queue_name, peek_lock=True, timeout=60): - ''' - Receive a message from a queue for processing. - - queue_name: Name of the queue. - peek_lock: - Optional. True to retrieve and lock the message. False to read and - delete the message. Default is True (lock). - timeout: Optional. The timeout parameter is expressed in seconds. - ''' - if peek_lock: - return self.peek_lock_queue_message(queue_name, timeout) - else: - return self.read_delete_queue_message(queue_name, timeout) - - def receive_subscription_message(self, topic_name, subscription_name, - peek_lock=True, timeout=60): - ''' - Receive a message from a subscription for processing. - - topic_name: Name of the topic. - subscription_name: Name of the subscription. - peek_lock: - Optional. True to retrieve and lock the message. False to read and - delete the message. Default is True (lock). - timeout: Optional. The timeout parameter is expressed in seconds. - ''' - if peek_lock: - return self.peek_lock_subscription_message(topic_name, - subscription_name, - timeout) - else: - return self.read_delete_subscription_message(topic_name, - subscription_name, - timeout) - - def _get_host(self): - return self.service_namespace + self.host_base - - def _perform_request(self, request): - try: - resp = self._filter(request) - except HTTPError as ex: - return _service_bus_error_handler(ex) - - return resp - - def _update_service_bus_header(self, request): - ''' Add additional headers for service bus. ''' - - if request.method in ['PUT', 'POST', 'MERGE', 'DELETE']: - request.headers.append(('Content-Length', str(len(request.body)))) - - # if it is not GET or HEAD request, must set content-type. - if not request.method in ['GET', 'HEAD']: - for name, _ in request.headers: - if 'content-type' == name.lower(): - break - else: - request.headers.append( - ('Content-Type', - 'application/atom+xml;type=entry;charset=utf-8')) - - # Adds authoriaztion header for authentication. - request.headers.append( - ('Authorization', self._sign_service_bus_request(request))) - - return request.headers - - def _sign_service_bus_request(self, request): - ''' return the signed string with token. ''' - - return 'WRAP access_token="' + \ - self._get_token(request.host, request.path) + '"' - - def _token_is_expired(self, token): - ''' Check if token expires or not. ''' - time_pos_begin = token.find('ExpiresOn=') + len('ExpiresOn=') - time_pos_end = token.find('&', time_pos_begin) - token_expire_time = int(token[time_pos_begin:time_pos_end]) - time_now = time.mktime(time.localtime()) - - # Adding 30 seconds so the token wouldn't be expired when we send the - # token to server. - return (token_expire_time - time_now) < 30 - - def _get_token(self, host, path): - ''' - Returns token for the request. - - host: the service bus service request. - path: the service bus service request. - ''' - wrap_scope = 'http://' + host + path + self.issuer + self.account_key - - # Check whether has unexpired cache, return cached token if it is still - # usable. - if wrap_scope in _tokens: - token = _tokens[wrap_scope] - if not self._token_is_expired(token): - return token - - # get token from accessconstrol server - request = HTTPRequest() - request.protocol_override = 'https' - request.host = host.replace('.servicebus.', '-sb.accesscontrol.') - request.method = 'POST' - request.path = '/WRAPv0.9' - request.body = ('wrap_name=' + url_quote(self.issuer) + - '&wrap_password=' + url_quote(self.account_key) + - '&wrap_scope=' + - url_quote('http://' + host + path)).encode('utf-8') - request.headers.append(('Content-Length', str(len(request.body)))) - resp = self._httpclient.perform_request(request) - - token = resp.body.decode('utf-8') - token = url_unquote(token[token.find('=') + 1:token.rfind('&')]) - _tokens[wrap_scope] = token - - return token +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +import datetime +import os +import time + +from azure import ( + WindowsAzureError, + SERVICE_BUS_HOST_BASE, + _convert_response_to_feeds, + _dont_fail_not_exist, + _dont_fail_on_exist, + _encode_base64, + _get_request_body, + _get_request_body_bytes_only, + _int_or_none, + _sign_string, + _str, + _unicode_type, + _update_request_uri_query, + url_quote, + url_unquote, + _validate_not_none, + ) +from azure.http import ( + HTTPError, + HTTPRequest, + ) +from azure.http.httpclient import _HTTPClient +from azure.servicebus import ( + AZURE_SERVICEBUS_NAMESPACE, + AZURE_SERVICEBUS_ACCESS_KEY, + AZURE_SERVICEBUS_ISSUER, + _convert_topic_to_xml, + _convert_response_to_topic, + _convert_queue_to_xml, + _convert_response_to_queue, + _convert_subscription_to_xml, + _convert_response_to_subscription, + _convert_rule_to_xml, + _convert_response_to_rule, + _convert_xml_to_queue, + _convert_xml_to_topic, + _convert_xml_to_subscription, + _convert_xml_to_rule, + _create_message, + _service_bus_error_handler, + ) + + +class ServiceBusService(object): + + def __init__(self, service_namespace=None, account_key=None, issuer=None, + x_ms_version='2011-06-01', host_base=SERVICE_BUS_HOST_BASE, + shared_access_key_name=None, shared_access_key_value=None, + authentication=None): + ''' + Initializes the service bus service for a namespace with the specified + authentication settings (SAS or ACS). + + service_namespace: + Service bus namespace, required for all operations. If None, + the value is set to the AZURE_SERVICEBUS_NAMESPACE env variable. + account_key: + ACS authentication account key. If None, the value is set to the + AZURE_SERVICEBUS_ACCESS_KEY env variable. + Note that if both SAS and ACS settings are specified, SAS is used. + issuer: + ACS authentication issuer. If None, the value is set to the + AZURE_SERVICEBUS_ISSUER env variable. + Note that if both SAS and ACS settings are specified, SAS is used. + x_ms_version: Unused. Kept for backwards compatibility. + host_base: + Optional. Live host base url. Defaults to Azure url. Override this + for on-premise. + shared_access_key_name: + SAS authentication key name. + Note that if both SAS and ACS settings are specified, SAS is used. + shared_access_key_value: + SAS authentication key value. + Note that if both SAS and ACS settings are specified, SAS is used. + authentication: + Instance of authentication class. If this is specified, then + ACS and SAS parameters are ignored. + ''' + self.requestid = None + self.service_namespace = service_namespace + self.host_base = host_base + + if not self.service_namespace: + self.service_namespace = os.environ.get(AZURE_SERVICEBUS_NAMESPACE) + + if not self.service_namespace: + raise WindowsAzureError('You need to provide servicebus namespace') + + if authentication: + self.authentication = authentication + else: + if not account_key: + account_key = os.environ.get(AZURE_SERVICEBUS_ACCESS_KEY) + if not issuer: + issuer = os.environ.get(AZURE_SERVICEBUS_ISSUER) + + if shared_access_key_name and shared_access_key_value: + self.authentication = ServiceBusSASAuthentication( + shared_access_key_name, + shared_access_key_value) + elif account_key and issuer: + self.authentication = ServiceBusWrapTokenAuthentication( + account_key, + issuer) + else: + raise WindowsAzureError( + 'You need to provide servicebus access key and Issuer OR shared access key and value') + + self._httpclient = _HTTPClient(service_instance=self) + self._filter = self._httpclient.perform_request + + # Backwards compatibility: + # account_key and issuer used to be stored on the service class, they are + # now stored on the authentication class. + @property + def account_key(self): + return self.authentication.account_key + + @account_key.setter + def account_key(self, value): + self.authentication.account_key = value + + @property + def issuer(self): + return self.authentication.issuer + + @issuer.setter + def issuer(self, value): + self.authentication.issuer = value + + def with_filter(self, filter): + ''' + Returns a new service which will process requests with the specified + filter. Filtering operations can include logging, automatic retrying, + etc... The filter is a lambda which receives the HTTPRequest and + another lambda. The filter can perform any pre-processing on the + request, pass it off to the next lambda, and then perform any + post-processing on the response. + ''' + res = ServiceBusService( + service_namespace=self.service_namespace, + authentication=self.authentication) + + old_filter = self._filter + + def new_filter(request): + return filter(request, old_filter) + + res._filter = new_filter + return res + + def set_proxy(self, host, port, user=None, password=None): + ''' + Sets the proxy server host and port for the HTTP CONNECT Tunnelling. + + host: Address of the proxy. Ex: '192.168.0.100' + port: Port of the proxy. Ex: 6000 + user: User for proxy authorization. + password: Password for proxy authorization. + ''' + self._httpclient.set_proxy(host, port, user, password) + + def create_queue(self, queue_name, queue=None, fail_on_exist=False): + ''' + Creates a new queue. Once created, this queue's resource manifest is + immutable. + + queue_name: Name of the queue to create. + queue: Queue object to create. + fail_on_exist: + Specify whether to throw an exception when the queue exists. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '' + request.body = _get_request_body(_convert_queue_to_xml(queue)) + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + if not fail_on_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_on_exist(ex) + return False + else: + self._perform_request(request) + return True + + def delete_queue(self, queue_name, fail_not_exist=False): + ''' + Deletes an existing queue. This operation will also remove all + associated state including messages in the queue. + + queue_name: Name of the queue to delete. + fail_not_exist: + Specify whether to throw an exception if the queue doesn't exist. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + if not fail_not_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_not_exist(ex) + return False + else: + self._perform_request(request) + return True + + def get_queue(self, queue_name): + ''' + Retrieves an existing queue. + + queue_name: Name of the queue. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + response = self._perform_request(request) + + return _convert_response_to_queue(response) + + def list_queues(self): + ''' + Enumerates the queues in the service namespace. + ''' + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/$Resources/Queues' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + response = self._perform_request(request) + + return _convert_response_to_feeds(response, _convert_xml_to_queue) + + def create_topic(self, topic_name, topic=None, fail_on_exist=False): + ''' + Creates a new topic. Once created, this topic resource manifest is + immutable. + + topic_name: Name of the topic to create. + topic: Topic object to create. + fail_on_exist: + Specify whether to throw an exception when the topic exists. + ''' + _validate_not_none('topic_name', topic_name) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + _str(topic_name) + '' + request.body = _get_request_body(_convert_topic_to_xml(topic)) + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + if not fail_on_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_on_exist(ex) + return False + else: + self._perform_request(request) + return True + + def delete_topic(self, topic_name, fail_not_exist=False): + ''' + Deletes an existing topic. This operation will also remove all + associated state including associated subscriptions. + + topic_name: Name of the topic to delete. + fail_not_exist: + Specify whether throw exception when topic doesn't exist. + ''' + _validate_not_none('topic_name', topic_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + _str(topic_name) + '' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + if not fail_not_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_not_exist(ex) + return False + else: + self._perform_request(request) + return True + + def get_topic(self, topic_name): + ''' + Retrieves the description for the specified topic. + + topic_name: Name of the topic. + ''' + _validate_not_none('topic_name', topic_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + _str(topic_name) + '' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + response = self._perform_request(request) + + return _convert_response_to_topic(response) + + def list_topics(self): + ''' + Retrieves the topics in the service namespace. + ''' + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/$Resources/Topics' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + response = self._perform_request(request) + + return _convert_response_to_feeds(response, _convert_xml_to_topic) + + def create_rule(self, topic_name, subscription_name, rule_name, rule=None, + fail_on_exist=False): + ''' + Creates a new rule. Once created, this rule's resource manifest is + immutable. + + topic_name: Name of the topic. + subscription_name: Name of the subscription. + rule_name: Name of the rule. + fail_on_exist: + Specify whether to throw an exception when the rule exists. + ''' + _validate_not_none('topic_name', topic_name) + _validate_not_none('subscription_name', subscription_name) + _validate_not_none('rule_name', rule_name) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + _str(topic_name) + '/subscriptions/' + \ + _str(subscription_name) + \ + '/rules/' + _str(rule_name) + '' + request.body = _get_request_body(_convert_rule_to_xml(rule)) + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + if not fail_on_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_on_exist(ex) + return False + else: + self._perform_request(request) + return True + + def delete_rule(self, topic_name, subscription_name, rule_name, + fail_not_exist=False): + ''' + Deletes an existing rule. + + topic_name: Name of the topic. + subscription_name: Name of the subscription. + rule_name: + Name of the rule to delete. DEFAULT_RULE_NAME=$Default. + Use DEFAULT_RULE_NAME to delete default rule for the subscription. + fail_not_exist: + Specify whether throw exception when rule doesn't exist. + ''' + _validate_not_none('topic_name', topic_name) + _validate_not_none('subscription_name', subscription_name) + _validate_not_none('rule_name', rule_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + _str(topic_name) + '/subscriptions/' + \ + _str(subscription_name) + \ + '/rules/' + _str(rule_name) + '' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + if not fail_not_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_not_exist(ex) + return False + else: + self._perform_request(request) + return True + + def get_rule(self, topic_name, subscription_name, rule_name): + ''' + Retrieves the description for the specified rule. + + topic_name: Name of the topic. + subscription_name: Name of the subscription. + rule_name: Name of the rule. + ''' + _validate_not_none('topic_name', topic_name) + _validate_not_none('subscription_name', subscription_name) + _validate_not_none('rule_name', rule_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + _str(topic_name) + '/subscriptions/' + \ + _str(subscription_name) + \ + '/rules/' + _str(rule_name) + '' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + response = self._perform_request(request) + + return _convert_response_to_rule(response) + + def list_rules(self, topic_name, subscription_name): + ''' + Retrieves the rules that exist under the specified subscription. + + topic_name: Name of the topic. + subscription_name: Name of the subscription. + ''' + _validate_not_none('topic_name', topic_name) + _validate_not_none('subscription_name', subscription_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + \ + _str(topic_name) + '/subscriptions/' + \ + _str(subscription_name) + '/rules/' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + response = self._perform_request(request) + + return _convert_response_to_feeds(response, _convert_xml_to_rule) + + def create_subscription(self, topic_name, subscription_name, + subscription=None, fail_on_exist=False): + ''' + Creates a new subscription. Once created, this subscription resource + manifest is immutable. + + topic_name: Name of the topic. + subscription_name: Name of the subscription. + fail_on_exist: + Specify whether throw exception when subscription exists. + ''' + _validate_not_none('topic_name', topic_name) + _validate_not_none('subscription_name', subscription_name) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(topic_name) + '/subscriptions/' + _str(subscription_name) + '' + request.body = _get_request_body( + _convert_subscription_to_xml(subscription)) + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + if not fail_on_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_on_exist(ex) + return False + else: + self._perform_request(request) + return True + + def delete_subscription(self, topic_name, subscription_name, + fail_not_exist=False): + ''' + Deletes an existing subscription. + + topic_name: Name of the topic. + subscription_name: Name of the subscription to delete. + fail_not_exist: + Specify whether to throw an exception when the subscription + doesn't exist. + ''' + _validate_not_none('topic_name', topic_name) + _validate_not_none('subscription_name', subscription_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + \ + _str(topic_name) + '/subscriptions/' + _str(subscription_name) + '' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + if not fail_not_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_not_exist(ex) + return False + else: + self._perform_request(request) + return True + + def get_subscription(self, topic_name, subscription_name): + ''' + Gets an existing subscription. + + topic_name: Name of the topic. + subscription_name: Name of the subscription. + ''' + _validate_not_none('topic_name', topic_name) + _validate_not_none('subscription_name', subscription_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + \ + _str(topic_name) + '/subscriptions/' + _str(subscription_name) + '' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + response = self._perform_request(request) + + return _convert_response_to_subscription(response) + + def list_subscriptions(self, topic_name): + ''' + Retrieves the subscriptions in the specified topic. + + topic_name: Name of the topic. + ''' + _validate_not_none('topic_name', topic_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + _str(topic_name) + '/subscriptions/' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + response = self._perform_request(request) + + return _convert_response_to_feeds(response, + _convert_xml_to_subscription) + + def send_topic_message(self, topic_name, message=None): + ''' + Enqueues a message into the specified topic. The limit to the number + of messages which may be present in the topic is governed by the + message size in MaxTopicSizeInBytes. If this message causes the topic + to exceed its quota, a quota exceeded error is returned and the + message will be rejected. + + topic_name: Name of the topic. + message: Message object containing message body and properties. + ''' + _validate_not_none('topic_name', topic_name) + _validate_not_none('message', message) + request = HTTPRequest() + request.method = 'POST' + request.host = self._get_host() + request.path = '/' + _str(topic_name) + '/messages' + request.headers = message.add_headers(request) + request.body = _get_request_body_bytes_only( + 'message.body', message.body) + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + self._perform_request(request) + + def peek_lock_subscription_message(self, topic_name, subscription_name, + timeout='60'): + ''' + This operation is used to atomically retrieve and lock a message for + processing. The message is guaranteed not to be delivered to other + receivers during the lock duration period specified in buffer + description. Once the lock expires, the message will be available to + other receivers (on the same subscription only) during the lock + duration period specified in the topic description. Once the lock + expires, the message will be available to other receivers. In order to + complete processing of the message, the receiver should issue a delete + command with the lock ID received from this operation. To abandon + processing of the message and unlock it for other receivers, an Unlock + Message command should be issued, or the lock duration period can + expire. + + topic_name: Name of the topic. + subscription_name: Name of the subscription. + timeout: Optional. The timeout parameter is expressed in seconds. + ''' + _validate_not_none('topic_name', topic_name) + _validate_not_none('subscription_name', subscription_name) + request = HTTPRequest() + request.method = 'POST' + request.host = self._get_host() + request.path = '/' + \ + _str(topic_name) + '/subscriptions/' + \ + _str(subscription_name) + '/messages/head' + request.query = [('timeout', _int_or_none(timeout))] + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + response = self._perform_request(request) + + return _create_message(response, self) + + def unlock_subscription_message(self, topic_name, subscription_name, + sequence_number, lock_token): + ''' + Unlock a message for processing by other receivers on a given + subscription. This operation deletes the lock object, causing the + message to be unlocked. A message must have first been locked by a + receiver before this operation is called. + + topic_name: Name of the topic. + subscription_name: Name of the subscription. + sequence_number: + The sequence number of the message to be unlocked as returned in + BrokerProperties['SequenceNumber'] by the Peek Message operation. + lock_token: + The ID of the lock as returned by the Peek Message operation in + BrokerProperties['LockToken'] + ''' + _validate_not_none('topic_name', topic_name) + _validate_not_none('subscription_name', subscription_name) + _validate_not_none('sequence_number', sequence_number) + _validate_not_none('lock_token', lock_token) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + _str(topic_name) + \ + '/subscriptions/' + str(subscription_name) + \ + '/messages/' + _str(sequence_number) + \ + '/' + _str(lock_token) + '' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + self._perform_request(request) + + def read_delete_subscription_message(self, topic_name, subscription_name, + timeout='60'): + ''' + Read and delete a message from a subscription as an atomic operation. + This operation should be used when a best-effort guarantee is + sufficient for an application; that is, using this operation it is + possible for messages to be lost if processing fails. + + topic_name: Name of the topic. + subscription_name: Name of the subscription. + timeout: Optional. The timeout parameter is expressed in seconds. + ''' + _validate_not_none('topic_name', topic_name) + _validate_not_none('subscription_name', subscription_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + _str(topic_name) + \ + '/subscriptions/' + _str(subscription_name) + \ + '/messages/head' + request.query = [('timeout', _int_or_none(timeout))] + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + response = self._perform_request(request) + + return _create_message(response, self) + + def delete_subscription_message(self, topic_name, subscription_name, + sequence_number, lock_token): + ''' + Completes processing on a locked message and delete it from the + subscription. This operation should only be called after processing a + previously locked message is successful to maintain At-Least-Once + delivery assurances. + + topic_name: Name of the topic. + subscription_name: Name of the subscription. + sequence_number: + The sequence number of the message to be deleted as returned in + BrokerProperties['SequenceNumber'] by the Peek Message operation. + lock_token: + The ID of the lock as returned by the Peek Message operation in + BrokerProperties['LockToken'] + ''' + _validate_not_none('topic_name', topic_name) + _validate_not_none('subscription_name', subscription_name) + _validate_not_none('sequence_number', sequence_number) + _validate_not_none('lock_token', lock_token) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + _str(topic_name) + \ + '/subscriptions/' + _str(subscription_name) + \ + '/messages/' + _str(sequence_number) + \ + '/' + _str(lock_token) + '' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + self._perform_request(request) + + def send_queue_message(self, queue_name, message=None): + ''' + Sends a message into the specified queue. The limit to the number of + messages which may be present in the topic is governed by the message + size the MaxTopicSizeInMegaBytes. If this message will cause the queue + to exceed its quota, a quota exceeded error is returned and the + message will be rejected. + + queue_name: Name of the queue. + message: Message object containing message body and properties. + ''' + _validate_not_none('queue_name', queue_name) + _validate_not_none('message', message) + request = HTTPRequest() + request.method = 'POST' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '/messages' + request.headers = message.add_headers(request) + request.body = _get_request_body_bytes_only('message.body', + message.body) + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + self._perform_request(request) + + def peek_lock_queue_message(self, queue_name, timeout='60'): + ''' + Automically retrieves and locks a message from a queue for processing. + The message is guaranteed not to be delivered to other receivers (on + the same subscription only) during the lock duration period specified + in the queue description. Once the lock expires, the message will be + available to other receivers. In order to complete processing of the + message, the receiver should issue a delete command with the lock ID + received from this operation. To abandon processing of the message and + unlock it for other receivers, an Unlock Message command should be + issued, or the lock duration period can expire. + + queue_name: Name of the queue. + timeout: Optional. The timeout parameter is expressed in seconds. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'POST' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '/messages/head' + request.query = [('timeout', _int_or_none(timeout))] + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + response = self._perform_request(request) + + return _create_message(response, self) + + def unlock_queue_message(self, queue_name, sequence_number, lock_token): + ''' + Unlocks a message for processing by other receivers on a given + subscription. This operation deletes the lock object, causing the + message to be unlocked. A message must have first been locked by a + receiver before this operation is called. + + queue_name: Name of the queue. + sequence_number: + The sequence number of the message to be unlocked as returned in + BrokerProperties['SequenceNumber'] by the Peek Message operation. + lock_token: + The ID of the lock as returned by the Peek Message operation in + BrokerProperties['LockToken'] + ''' + _validate_not_none('queue_name', queue_name) + _validate_not_none('sequence_number', sequence_number) + _validate_not_none('lock_token', lock_token) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + \ + '/messages/' + _str(sequence_number) + \ + '/' + _str(lock_token) + '' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + self._perform_request(request) + + def read_delete_queue_message(self, queue_name, timeout='60'): + ''' + Reads and deletes a message from a queue as an atomic operation. This + operation should be used when a best-effort guarantee is sufficient + for an application; that is, using this operation it is possible for + messages to be lost if processing fails. + + queue_name: Name of the queue. + timeout: Optional. The timeout parameter is expressed in seconds. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '/messages/head' + request.query = [('timeout', _int_or_none(timeout))] + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + response = self._perform_request(request) + + return _create_message(response, self) + + def delete_queue_message(self, queue_name, sequence_number, lock_token): + ''' + Completes processing on a locked message and delete it from the queue. + This operation should only be called after processing a previously + locked message is successful to maintain At-Least-Once delivery + assurances. + + queue_name: Name of the queue. + sequence_number: + The sequence number of the message to be deleted as returned in + BrokerProperties['SequenceNumber'] by the Peek Message operation. + lock_token: + The ID of the lock as returned by the Peek Message operation in + BrokerProperties['LockToken'] + ''' + _validate_not_none('queue_name', queue_name) + _validate_not_none('sequence_number', sequence_number) + _validate_not_none('lock_token', lock_token) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + \ + '/messages/' + _str(sequence_number) + \ + '/' + _str(lock_token) + '' + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_service_bus_header(request) + self._perform_request(request) + + def receive_queue_message(self, queue_name, peek_lock=True, timeout=60): + ''' + Receive a message from a queue for processing. + + queue_name: Name of the queue. + peek_lock: + Optional. True to retrieve and lock the message. False to read and + delete the message. Default is True (lock). + timeout: Optional. The timeout parameter is expressed in seconds. + ''' + if peek_lock: + return self.peek_lock_queue_message(queue_name, timeout) + else: + return self.read_delete_queue_message(queue_name, timeout) + + def receive_subscription_message(self, topic_name, subscription_name, + peek_lock=True, timeout=60): + ''' + Receive a message from a subscription for processing. + + topic_name: Name of the topic. + subscription_name: Name of the subscription. + peek_lock: + Optional. True to retrieve and lock the message. False to read and + delete the message. Default is True (lock). + timeout: Optional. The timeout parameter is expressed in seconds. + ''' + if peek_lock: + return self.peek_lock_subscription_message(topic_name, + subscription_name, + timeout) + else: + return self.read_delete_subscription_message(topic_name, + subscription_name, + timeout) + + def _get_host(self): + return self.service_namespace + self.host_base + + def _perform_request(self, request): + try: + resp = self._filter(request) + except HTTPError as ex: + return _service_bus_error_handler(ex) + + return resp + + def _update_service_bus_header(self, request): + ''' Add additional headers for service bus. ''' + + if request.method in ['PUT', 'POST', 'MERGE', 'DELETE']: + request.headers.append(('Content-Length', str(len(request.body)))) + + # if it is not GET or HEAD request, must set content-type. + if not request.method in ['GET', 'HEAD']: + for name, _ in request.headers: + if 'content-type' == name.lower(): + break + else: + request.headers.append( + ('Content-Type', + 'application/atom+xml;type=entry;charset=utf-8')) + + # Adds authorization header for authentication. + self.authentication.sign_request(request, self._httpclient) + + return request.headers + + +# Token cache for Authentication +# Shared by the different instances of ServiceBusWrapTokenAuthentication +_tokens = {} + + +class ServiceBusWrapTokenAuthentication: + def __init__(self, account_key, issuer): + self.account_key = account_key + self.issuer = issuer + + def sign_request(self, request, httpclient): + request.headers.append( + ('Authorization', self._get_authorization(request, httpclient))) + + def _get_authorization(self, request, httpclient): + ''' return the signed string with token. ''' + return 'WRAP access_token="' + \ + self._get_token(request.host, request.path, httpclient) + '"' + + def _token_is_expired(self, token): + ''' Check if token expires or not. ''' + time_pos_begin = token.find('ExpiresOn=') + len('ExpiresOn=') + time_pos_end = token.find('&', time_pos_begin) + token_expire_time = int(token[time_pos_begin:time_pos_end]) + time_now = time.mktime(time.localtime()) + + # Adding 30 seconds so the token wouldn't be expired when we send the + # token to server. + return (token_expire_time - time_now) < 30 + + def _get_token(self, host, path, httpclient): + ''' + Returns token for the request. + + host: the service bus service request. + path: the service bus service request. + ''' + wrap_scope = 'http://' + host + path + self.issuer + self.account_key + + # Check whether has unexpired cache, return cached token if it is still + # usable. + if wrap_scope in _tokens: + token = _tokens[wrap_scope] + if not self._token_is_expired(token): + return token + + # get token from accessconstrol server + request = HTTPRequest() + request.protocol_override = 'https' + request.host = host.replace('.servicebus.', '-sb.accesscontrol.') + request.method = 'POST' + request.path = '/WRAPv0.9' + request.body = ('wrap_name=' + url_quote(self.issuer) + + '&wrap_password=' + url_quote(self.account_key) + + '&wrap_scope=' + + url_quote('http://' + host + path)).encode('utf-8') + request.headers.append(('Content-Length', str(len(request.body)))) + resp = httpclient.perform_request(request) + + token = resp.body.decode('utf-8') + token = url_unquote(token[token.find('=') + 1:token.rfind('&')]) + _tokens[wrap_scope] = token + + return token + + +class ServiceBusSASAuthentication: + def __init__(self, key_name, key_value): + self.key_name = key_name + self.key_value = key_value + + def sign_request(self, request, httpclient): + request.headers.append( + ('Authorization', self._get_authorization(request, httpclient))) + + def _get_authorization(self, request, httpclient): + uri = httpclient.get_uri(request) + uri = url_quote(uri, '').lower() + expiry = str(self._get_expiry()) + + to_sign = uri + '\n' + expiry + signature = url_quote(_sign_string(self.key_value, to_sign, False), '') + + auth_format = 'SharedAccessSignature sig={0}&se={1}&skn={2}&sr={3}' + auth = auth_format.format(signature, expiry, self.key_name, uri) + + return auth + + def _get_expiry(self): + '''Returns the UTC datetime, in seconds since Epoch, when this signed + request expires (5 minutes from now).''' + return int(round(time.time() + 300)) diff --git a/awx/lib/site-packages/azure/servicemanagement/__init__.py b/awx/lib/site-packages/azure/servicemanagement/__init__.py index caca5db4ba..b452a828bf 100644 --- a/awx/lib/site-packages/azure/servicemanagement/__init__.py +++ b/awx/lib/site-packages/azure/servicemanagement/__init__.py @@ -1,1692 +1,3004 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -from xml.dom import minidom -from azure import ( - WindowsAzureData, - _Base64String, - _create_entry, - _dict_of, - _encode_base64, - _general_error_handler, - _get_children_from_path, - _get_first_child_node_value, - _list_of, - _scalar_list_of, - _str, - ) - -#----------------------------------------------------------------------------- -# Constants for Azure app environment settings. -AZURE_MANAGEMENT_CERTFILE = 'AZURE_MANAGEMENT_CERTFILE' -AZURE_MANAGEMENT_SUBSCRIPTIONID = 'AZURE_MANAGEMENT_SUBSCRIPTIONID' - -# x-ms-version for service management. -X_MS_VERSION = '2013-06-01' - -#----------------------------------------------------------------------------- -# Data classes - - -class StorageServices(WindowsAzureData): - - def __init__(self): - self.storage_services = _list_of(StorageService) - - def __iter__(self): - return iter(self.storage_services) - - def __len__(self): - return len(self.storage_services) - - def __getitem__(self, index): - return self.storage_services[index] - - -class StorageService(WindowsAzureData): - - def __init__(self): - self.url = '' - self.service_name = '' - self.storage_service_properties = StorageAccountProperties() - self.storage_service_keys = StorageServiceKeys() - self.extended_properties = _dict_of( - 'ExtendedProperty', 'Name', 'Value') - self.capabilities = _scalar_list_of(str, 'Capability') - - -class StorageAccountProperties(WindowsAzureData): - - def __init__(self): - self.description = u'' - self.affinity_group = u'' - self.location = u'' - self.label = _Base64String() - self.status = u'' - self.endpoints = _scalar_list_of(str, 'Endpoint') - self.geo_replication_enabled = False - self.geo_primary_region = u'' - self.status_of_primary = u'' - self.geo_secondary_region = u'' - self.status_of_secondary = u'' - self.last_geo_failover_time = u'' - - -class StorageServiceKeys(WindowsAzureData): - - def __init__(self): - self.primary = u'' - self.secondary = u'' - - -class Locations(WindowsAzureData): - - def __init__(self): - self.locations = _list_of(Location) - - def __iter__(self): - return iter(self.locations) - - def __len__(self): - return len(self.locations) - - def __getitem__(self, index): - return self.locations[index] - - -class Location(WindowsAzureData): - - def __init__(self): - self.name = u'' - self.display_name = u'' - self.available_services = _scalar_list_of(str, 'AvailableService') - - -class AffinityGroup(WindowsAzureData): - - def __init__(self): - self.name = '' - self.label = _Base64String() - self.description = u'' - self.location = u'' - self.hosted_services = HostedServices() - self.storage_services = StorageServices() - self.capabilities = _scalar_list_of(str, 'Capability') - - -class AffinityGroups(WindowsAzureData): - - def __init__(self): - self.affinity_groups = _list_of(AffinityGroup) - - def __iter__(self): - return iter(self.affinity_groups) - - def __len__(self): - return len(self.affinity_groups) - - def __getitem__(self, index): - return self.affinity_groups[index] - - -class HostedServices(WindowsAzureData): - - def __init__(self): - self.hosted_services = _list_of(HostedService) - - def __iter__(self): - return iter(self.hosted_services) - - def __len__(self): - return len(self.hosted_services) - - def __getitem__(self, index): - return self.hosted_services[index] - - -class HostedService(WindowsAzureData): - - def __init__(self): - self.url = u'' - self.service_name = u'' - self.hosted_service_properties = HostedServiceProperties() - self.deployments = Deployments() - - -class HostedServiceProperties(WindowsAzureData): - - def __init__(self): - self.description = u'' - self.location = u'' - self.affinity_group = u'' - self.label = _Base64String() - self.status = u'' - self.date_created = u'' - self.date_last_modified = u'' - self.extended_properties = _dict_of( - 'ExtendedProperty', 'Name', 'Value') - - -class VirtualNetworkSites(WindowsAzureData): - - def __init__(self): - self.virtual_network_sites = _list_of(VirtualNetworkSite) - - def __iter__(self): - return iter(self.virtual_network_sites) - - def __len__(self): - return len(self.virtual_network_sites) - - def __getitem__(self, index): - return self.virtual_network_sites[index] - - -class VirtualNetworkSite(WindowsAzureData): - - def __init__(self): - self.name = u'' - self.id = u'' - self.affinity_group = u'' - self.subnets = Subnets() - - -class Subnets(WindowsAzureData): - - def __init__(self): - self.subnets = _list_of(Subnet) - - def __iter__(self): - return iter(self.subnets) - - def __len__(self): - return len(self.subnets) - - def __getitem__(self, index): - return self.subnets[index] - - -class Subnet(WindowsAzureData): - - def __init__(self): - self.name = u'' - self.address_prefix = u'' - - - -class Deployments(WindowsAzureData): - - def __init__(self): - self.deployments = _list_of(Deployment) - - def __iter__(self): - return iter(self.deployments) - - def __len__(self): - return len(self.deployments) - - def __getitem__(self, index): - return self.deployments[index] - - -class Deployment(WindowsAzureData): - - def __init__(self): - self.name = u'' - self.deployment_slot = u'' - self.private_id = u'' - self.status = u'' - self.label = _Base64String() - self.url = u'' - self.configuration = _Base64String() - self.role_instance_list = RoleInstanceList() - self.upgrade_status = UpgradeStatus() - self.upgrade_domain_count = u'' - self.role_list = RoleList() - self.sdk_version = u'' - self.input_endpoint_list = InputEndpoints() - self.locked = False - self.rollback_allowed = False - self.persistent_vm_downtime_info = PersistentVMDowntimeInfo() - self.created_time = u'' - self.virtual_network_name = u'' - self.last_modified_time = u'' - self.extended_properties = _dict_of( - 'ExtendedProperty', 'Name', 'Value') - - -class RoleInstanceList(WindowsAzureData): - - def __init__(self): - self.role_instances = _list_of(RoleInstance) - - def __iter__(self): - return iter(self.role_instances) - - def __len__(self): - return len(self.role_instances) - - def __getitem__(self, index): - return self.role_instances[index] - - -class RoleInstance(WindowsAzureData): - - def __init__(self): - self.role_name = u'' - self.instance_name = u'' - self.instance_status = u'' - self.instance_upgrade_domain = 0 - self.instance_fault_domain = 0 - self.instance_size = u'' - self.instance_state_details = u'' - self.instance_error_code = u'' - self.ip_address = u'' - self.instance_endpoints = InstanceEndpoints() - self.power_state = u'' - self.fqdn = u'' - self.host_name = u'' - - -class InstanceEndpoints(WindowsAzureData): - - def __init__(self): - self.instance_endpoints = _list_of(InstanceEndpoint) - - def __iter__(self): - return iter(self.instance_endpoints) - - def __len__(self): - return len(self.instance_endpoints) - - def __getitem__(self, index): - return self.instance_endpoints[index] - - -class InstanceEndpoint(WindowsAzureData): - - def __init__(self): - self.name = u'' - self.vip = u'' - self.public_port = u'' - self.local_port = u'' - self.protocol = u'' - - -class UpgradeStatus(WindowsAzureData): - - def __init__(self): - self.upgrade_type = u'' - self.current_upgrade_domain_state = u'' - self.current_upgrade_domain = u'' - - -class InputEndpoints(WindowsAzureData): - - def __init__(self): - self.input_endpoints = _list_of(InputEndpoint) - - def __iter__(self): - return iter(self.input_endpoints) - - def __len__(self): - return len(self.input_endpoints) - - def __getitem__(self, index): - return self.input_endpoints[index] - - -class InputEndpoint(WindowsAzureData): - - def __init__(self): - self.role_name = u'' - self.vip = u'' - self.port = u'' - - -class RoleList(WindowsAzureData): - - def __init__(self): - self.roles = _list_of(Role) - - def __iter__(self): - return iter(self.roles) - - def __len__(self): - return len(self.roles) - - def __getitem__(self, index): - return self.roles[index] - - -class Role(WindowsAzureData): - - def __init__(self): - self.role_name = u'' - self.role_type = u'' - self.os_version = u'' - self.configuration_sets = ConfigurationSets() - self.availability_set_name = u'' - self.data_virtual_hard_disks = DataVirtualHardDisks() - self.os_virtual_hard_disk = OSVirtualHardDisk() - self.role_size = u'' - self.default_win_rm_certificate_thumbprint = u'' - - -class PersistentVMDowntimeInfo(WindowsAzureData): - - def __init__(self): - self.start_time = u'' - self.end_time = u'' - self.status = u'' - - -class Certificates(WindowsAzureData): - - def __init__(self): - self.certificates = _list_of(Certificate) - - def __iter__(self): - return iter(self.certificates) - - def __len__(self): - return len(self.certificates) - - def __getitem__(self, index): - return self.certificates[index] - - -class Certificate(WindowsAzureData): - - def __init__(self): - self.certificate_url = u'' - self.thumbprint = u'' - self.thumbprint_algorithm = u'' - self.data = u'' - - -class OperationError(WindowsAzureData): - - def __init__(self): - self.code = u'' - self.message = u'' - - -class Operation(WindowsAzureData): - - def __init__(self): - self.id = u'' - self.status = u'' - self.http_status_code = u'' - self.error = OperationError() - - -class OperatingSystem(WindowsAzureData): - - def __init__(self): - self.version = u'' - self.label = _Base64String() - self.is_default = True - self.is_active = True - self.family = 0 - self.family_label = _Base64String() - - -class OperatingSystems(WindowsAzureData): - - def __init__(self): - self.operating_systems = _list_of(OperatingSystem) - - def __iter__(self): - return iter(self.operating_systems) - - def __len__(self): - return len(self.operating_systems) - - def __getitem__(self, index): - return self.operating_systems[index] - - -class OperatingSystemFamily(WindowsAzureData): - - def __init__(self): - self.name = u'' - self.label = _Base64String() - self.operating_systems = OperatingSystems() - - -class OperatingSystemFamilies(WindowsAzureData): - - def __init__(self): - self.operating_system_families = _list_of(OperatingSystemFamily) - - def __iter__(self): - return iter(self.operating_system_families) - - def __len__(self): - return len(self.operating_system_families) - - def __getitem__(self, index): - return self.operating_system_families[index] - - -class Subscription(WindowsAzureData): - - def __init__(self): - self.subscription_id = u'' - self.subscription_name = u'' - self.subscription_status = u'' - self.account_admin_live_email_id = u'' - self.service_admin_live_email_id = u'' - self.max_core_count = 0 - self.max_storage_accounts = 0 - self.max_hosted_services = 0 - self.current_core_count = 0 - self.current_hosted_services = 0 - self.current_storage_accounts = 0 - self.max_virtual_network_sites = 0 - self.max_local_network_sites = 0 - self.max_dns_servers = 0 - - -class AvailabilityResponse(WindowsAzureData): - - def __init__(self): - self.result = False - - -class SubscriptionCertificates(WindowsAzureData): - - def __init__(self): - self.subscription_certificates = _list_of(SubscriptionCertificate) - - def __iter__(self): - return iter(self.subscription_certificates) - - def __len__(self): - return len(self.subscription_certificates) - - def __getitem__(self, index): - return self.subscription_certificates[index] - - -class SubscriptionCertificate(WindowsAzureData): - - def __init__(self): - self.subscription_certificate_public_key = u'' - self.subscription_certificate_thumbprint = u'' - self.subscription_certificate_data = u'' - self.created = u'' - - -class Images(WindowsAzureData): - - def __init__(self): - self.images = _list_of(OSImage) - - def __iter__(self): - return iter(self.images) - - def __len__(self): - return len(self.images) - - def __getitem__(self, index): - return self.images[index] - - -class OSImage(WindowsAzureData): - - def __init__(self): - self.affinity_group = u'' - self.category = u'' - self.location = u'' - self.logical_size_in_gb = 0 - self.label = u'' - self.media_link = u'' - self.name = u'' - self.os = u'' - self.eula = u'' - self.description = u'' - - -class Disks(WindowsAzureData): - - def __init__(self): - self.disks = _list_of(Disk) - - def __iter__(self): - return iter(self.disks) - - def __len__(self): - return len(self.disks) - - def __getitem__(self, index): - return self.disks[index] - - -class Disk(WindowsAzureData): - - def __init__(self): - self.affinity_group = u'' - self.attached_to = AttachedTo() - self.has_operating_system = u'' - self.is_corrupted = u'' - self.location = u'' - self.logical_disk_size_in_gb = 0 - self.label = u'' - self.media_link = u'' - self.name = u'' - self.os = u'' - self.source_image_name = u'' - - -class AttachedTo(WindowsAzureData): - - def __init__(self): - self.hosted_service_name = u'' - self.deployment_name = u'' - self.role_name = u'' - - -class PersistentVMRole(WindowsAzureData): - - def __init__(self): - self.role_name = u'' - self.role_type = u'' - self.os_version = u'' # undocumented - self.configuration_sets = ConfigurationSets() - self.availability_set_name = u'' - self.data_virtual_hard_disks = DataVirtualHardDisks() - self.os_virtual_hard_disk = OSVirtualHardDisk() - self.role_size = u'' - self.default_win_rm_certificate_thumbprint = u'' - - -class ConfigurationSets(WindowsAzureData): - - def __init__(self): - self.configuration_sets = _list_of(ConfigurationSet) - - def __iter__(self): - return iter(self.configuration_sets) - - def __len__(self): - return len(self.configuration_sets) - - def __getitem__(self, index): - return self.configuration_sets[index] - - -class ConfigurationSet(WindowsAzureData): - - def __init__(self): - self.configuration_set_type = u'NetworkConfiguration' - self.role_type = u'' - self.input_endpoints = ConfigurationSetInputEndpoints() - self.subnet_names = _scalar_list_of(str, 'SubnetName') - - -class ConfigurationSetInputEndpoints(WindowsAzureData): - - def __init__(self): - self.input_endpoints = _list_of( - ConfigurationSetInputEndpoint, 'InputEndpoint') - - def __iter__(self): - return iter(self.input_endpoints) - - def __len__(self): - return len(self.input_endpoints) - - def __getitem__(self, index): - return self.input_endpoints[index] - - -class ConfigurationSetInputEndpoint(WindowsAzureData): - - ''' - Initializes a network configuration input endpoint. - - name: Specifies the name for the external endpoint. - protocol: - Specifies the protocol to use to inspect the virtual machine - availability status. Possible values are: HTTP, TCP. - port: Specifies the external port to use for the endpoint. - local_port: - Specifies the internal port on which the virtual machine is listening - to serve the endpoint. - load_balanced_endpoint_set_name: - Specifies a name for a set of load-balanced endpoints. Specifying this - element for a given endpoint adds it to the set. If you are setting an - endpoint to use to connect to the virtual machine via the Remote - Desktop, do not set this property. - enable_direct_server_return: - Specifies whether direct server return load balancing is enabled. - ''' - - def __init__(self, name=u'', protocol=u'', port=u'', local_port=u'', - load_balanced_endpoint_set_name=u'', - enable_direct_server_return=False): - self.enable_direct_server_return = enable_direct_server_return - self.load_balanced_endpoint_set_name = load_balanced_endpoint_set_name - self.local_port = local_port - self.name = name - self.port = port - self.load_balancer_probe = LoadBalancerProbe() - self.protocol = protocol - - -class WindowsConfigurationSet(WindowsAzureData): - - def __init__(self, computer_name=None, admin_password=None, - reset_password_on_first_logon=None, - enable_automatic_updates=None, time_zone=None, - admin_username=None): - self.configuration_set_type = u'WindowsProvisioningConfiguration' - self.computer_name = computer_name - self.admin_password = admin_password - self.admin_username = admin_username - self.reset_password_on_first_logon = reset_password_on_first_logon - self.enable_automatic_updates = enable_automatic_updates - self.time_zone = time_zone - self.domain_join = DomainJoin() - self.stored_certificate_settings = StoredCertificateSettings() - self.win_rm = WinRM() - - -class DomainJoin(WindowsAzureData): - - def __init__(self): - self.credentials = Credentials() - self.join_domain = u'' - self.machine_object_ou = u'' - - -class Credentials(WindowsAzureData): - - def __init__(self): - self.domain = u'' - self.username = u'' - self.password = u'' - - -class StoredCertificateSettings(WindowsAzureData): - - def __init__(self): - self.stored_certificate_settings = _list_of(CertificateSetting) - - def __iter__(self): - return iter(self.stored_certificate_settings) - - def __len__(self): - return len(self.stored_certificate_settings) - - def __getitem__(self, index): - return self.stored_certificate_settings[index] - - -class CertificateSetting(WindowsAzureData): - - ''' - Initializes a certificate setting. - - thumbprint: - Specifies the thumbprint of the certificate to be provisioned. The - thumbprint must specify an existing service certificate. - store_name: - Specifies the name of the certificate store from which retrieve - certificate. - store_location: - Specifies the target certificate store location on the virtual machine. - The only supported value is LocalMachine. - ''' - - def __init__(self, thumbprint=u'', store_name=u'', store_location=u''): - self.thumbprint = thumbprint - self.store_name = store_name - self.store_location = store_location - - -class WinRM(WindowsAzureData): - - ''' - Contains configuration settings for the Windows Remote Management service on - the Virtual Machine. - ''' - - def __init__(self): - self.listeners = Listeners() - - -class Listeners(WindowsAzureData): - - def __init__(self): - self.listeners = _list_of(Listener) - - def __iter__(self): - return iter(self.listeners) - - def __len__(self): - return len(self.listeners) - - def __getitem__(self, index): - return self.listeners[index] - - -class Listener(WindowsAzureData): - - ''' - Specifies the protocol and certificate information for the listener. - - protocol: - Specifies the protocol of listener. Possible values are: Http, Https. - The value is case sensitive. - certificate_thumbprint: - Optional. Specifies the certificate thumbprint for the secure - connection. If this value is not specified, a self-signed certificate is - generated and used for the Virtual Machine. - ''' - - def __init__(self, protocol=u'', certificate_thumbprint=u''): - self.protocol = protocol - self.certificate_thumbprint = certificate_thumbprint - - -class LinuxConfigurationSet(WindowsAzureData): - - def __init__(self, host_name=None, user_name=None, user_password=None, - disable_ssh_password_authentication=None): - self.configuration_set_type = u'LinuxProvisioningConfiguration' - self.host_name = host_name - self.user_name = user_name - self.user_password = user_password - self.disable_ssh_password_authentication =\ - disable_ssh_password_authentication - self.ssh = SSH() - - -class SSH(WindowsAzureData): - - def __init__(self): - self.public_keys = PublicKeys() - self.key_pairs = KeyPairs() - - -class PublicKeys(WindowsAzureData): - - def __init__(self): - self.public_keys = _list_of(PublicKey) - - def __iter__(self): - return iter(self.public_keys) - - def __len__(self): - return len(self.public_keys) - - def __getitem__(self, index): - return self.public_keys[index] - - -class PublicKey(WindowsAzureData): - - def __init__(self, fingerprint=u'', path=u''): - self.fingerprint = fingerprint - self.path = path - - -class KeyPairs(WindowsAzureData): - - def __init__(self): - self.key_pairs = _list_of(KeyPair) - - def __iter__(self): - return iter(self.key_pairs) - - def __len__(self): - return len(self.key_pairs) - - def __getitem__(self, index): - return self.key_pairs[index] - - -class KeyPair(WindowsAzureData): - - def __init__(self, fingerprint=u'', path=u''): - self.fingerprint = fingerprint - self.path = path - - -class LoadBalancerProbe(WindowsAzureData): - - def __init__(self): - self.path = u'' - self.port = u'' - self.protocol = u'' - - -class DataVirtualHardDisks(WindowsAzureData): - - def __init__(self): - self.data_virtual_hard_disks = _list_of(DataVirtualHardDisk) - - def __iter__(self): - return iter(self.data_virtual_hard_disks) - - def __len__(self): - return len(self.data_virtual_hard_disks) - - def __getitem__(self, index): - return self.data_virtual_hard_disks[index] - - -class DataVirtualHardDisk(WindowsAzureData): - - def __init__(self): - self.host_caching = u'' - self.disk_label = u'' - self.disk_name = u'' - self.lun = 0 - self.logical_disk_size_in_gb = 0 - self.media_link = u'' - - -class OSVirtualHardDisk(WindowsAzureData): - - def __init__(self, source_image_name=None, media_link=None, - host_caching=None, disk_label=None, disk_name=None): - self.source_image_name = source_image_name - self.media_link = media_link - self.host_caching = host_caching - self.disk_label = disk_label - self.disk_name = disk_name - self.os = u'' # undocumented, not used when adding a role - - -class AsynchronousOperationResult(WindowsAzureData): - - def __init__(self, request_id=None): - self.request_id = request_id - - -class ServiceBusRegion(WindowsAzureData): - - def __init__(self): - self.code = u'' - self.fullname = u'' - - -class ServiceBusNamespace(WindowsAzureData): - - def __init__(self): - self.name = u'' - self.region = u'' - self.default_key = u'' - self.status = u'' - self.created_at = u'' - self.acs_management_endpoint = u'' - self.servicebus_endpoint = u'' - self.connection_string = u'' - self.subscription_id = u'' - self.enabled = False - - -def _update_management_header(request): - ''' Add additional headers for management. ''' - - if request.method in ['PUT', 'POST', 'MERGE', 'DELETE']: - request.headers.append(('Content-Length', str(len(request.body)))) - - # append additional headers base on the service - request.headers.append(('x-ms-version', X_MS_VERSION)) - - # if it is not GET or HEAD request, must set content-type. - if not request.method in ['GET', 'HEAD']: - for name, _ in request.headers: - if 'content-type' == name.lower(): - break - else: - request.headers.append( - ('Content-Type', - 'application/atom+xml;type=entry;charset=utf-8')) - - return request.headers - - -def _parse_response_for_async_op(response): - ''' Extracts request id from response header. ''' - - if response is None: - return None - - result = AsynchronousOperationResult() - if response.headers: - for name, value in response.headers: - if name.lower() == 'x-ms-request-id': - result.request_id = value - - return result - - -def _management_error_handler(http_error): - ''' Simple error handler for management service. ''' - return _general_error_handler(http_error) - - -def _lower(text): - return text.lower() - - -class _XmlSerializer(object): - - @staticmethod - def create_storage_service_input_to_xml(service_name, description, label, - affinity_group, location, - geo_replication_enabled, - extended_properties): - return _XmlSerializer.doc_from_data( - 'CreateStorageServiceInput', - [('ServiceName', service_name), - ('Description', description), - ('Label', label, _encode_base64), - ('AffinityGroup', affinity_group), - ('Location', location), - ('GeoReplicationEnabled', geo_replication_enabled, _lower)], - extended_properties) - - @staticmethod - def update_storage_service_input_to_xml(description, label, - geo_replication_enabled, - extended_properties): - return _XmlSerializer.doc_from_data( - 'UpdateStorageServiceInput', - [('Description', description), - ('Label', label, _encode_base64), - ('GeoReplicationEnabled', geo_replication_enabled, _lower)], - extended_properties) - - @staticmethod - def regenerate_keys_to_xml(key_type): - return _XmlSerializer.doc_from_data('RegenerateKeys', - [('KeyType', key_type)]) - - @staticmethod - def update_hosted_service_to_xml(label, description, extended_properties): - return _XmlSerializer.doc_from_data('UpdateHostedService', - [('Label', label, _encode_base64), - ('Description', description)], - extended_properties) - - @staticmethod - def create_hosted_service_to_xml(service_name, label, description, - location, affinity_group, - extended_properties): - return _XmlSerializer.doc_from_data( - 'CreateHostedService', - [('ServiceName', service_name), - ('Label', label, _encode_base64), - ('Description', description), - ('Location', location), - ('AffinityGroup', affinity_group)], - extended_properties) - - @staticmethod - def create_deployment_to_xml(name, package_url, label, configuration, - start_deployment, treat_warnings_as_error, - extended_properties): - return _XmlSerializer.doc_from_data( - 'CreateDeployment', - [('Name', name), - ('PackageUrl', package_url), - ('Label', label, _encode_base64), - ('Configuration', configuration), - ('StartDeployment', - start_deployment, _lower), - ('TreatWarningsAsError', treat_warnings_as_error, _lower)], - extended_properties) - - @staticmethod - def swap_deployment_to_xml(production, source_deployment): - return _XmlSerializer.doc_from_data( - 'Swap', - [('Production', production), - ('SourceDeployment', source_deployment)]) - - @staticmethod - def update_deployment_status_to_xml(status): - return _XmlSerializer.doc_from_data( - 'UpdateDeploymentStatus', - [('Status', status)]) - - @staticmethod - def change_deployment_to_xml(configuration, treat_warnings_as_error, mode, - extended_properties): - return _XmlSerializer.doc_from_data( - 'ChangeConfiguration', - [('Configuration', configuration), - ('TreatWarningsAsError', treat_warnings_as_error, _lower), - ('Mode', mode)], - extended_properties) - - @staticmethod - def upgrade_deployment_to_xml(mode, package_url, configuration, label, - role_to_upgrade, force, extended_properties): - return _XmlSerializer.doc_from_data( - 'UpgradeDeployment', - [('Mode', mode), - ('PackageUrl', package_url), - ('Configuration', configuration), - ('Label', label, _encode_base64), - ('RoleToUpgrade', role_to_upgrade), - ('Force', force, _lower)], - extended_properties) - - @staticmethod - def rollback_upgrade_to_xml(mode, force): - return _XmlSerializer.doc_from_data( - 'RollbackUpdateOrUpgrade', - [('Mode', mode), - ('Force', force, _lower)]) - - @staticmethod - def walk_upgrade_domain_to_xml(upgrade_domain): - return _XmlSerializer.doc_from_data( - 'WalkUpgradeDomain', - [('UpgradeDomain', upgrade_domain)]) - - @staticmethod - def certificate_file_to_xml(data, certificate_format, password): - return _XmlSerializer.doc_from_data( - 'CertificateFile', - [('Data', data), - ('CertificateFormat', certificate_format), - ('Password', password)]) - - @staticmethod - def create_affinity_group_to_xml(name, label, description, location): - return _XmlSerializer.doc_from_data( - 'CreateAffinityGroup', - [('Name', name), - ('Label', label, _encode_base64), - ('Description', description), - ('Location', location)]) - - @staticmethod - def update_affinity_group_to_xml(label, description): - return _XmlSerializer.doc_from_data( - 'UpdateAffinityGroup', - [('Label', label, _encode_base64), - ('Description', description)]) - - @staticmethod - def subscription_certificate_to_xml(public_key, thumbprint, data): - return _XmlSerializer.doc_from_data( - 'SubscriptionCertificate', - [('SubscriptionCertificatePublicKey', public_key), - ('SubscriptionCertificateThumbprint', thumbprint), - ('SubscriptionCertificateData', data)]) - - @staticmethod - def os_image_to_xml(label, media_link, name, os): - return _XmlSerializer.doc_from_data( - 'OSImage', - [('Label', label), - ('MediaLink', media_link), - ('Name', name), - ('OS', os)]) - - @staticmethod - def data_virtual_hard_disk_to_xml(host_caching, disk_label, disk_name, lun, - logical_disk_size_in_gb, media_link, - source_media_link): - return _XmlSerializer.doc_from_data( - 'DataVirtualHardDisk', - [('HostCaching', host_caching), - ('DiskLabel', disk_label), - ('DiskName', disk_name), - ('Lun', lun), - ('LogicalDiskSizeInGB', logical_disk_size_in_gb), - ('MediaLink', media_link), - ('SourceMediaLink', source_media_link)]) - - @staticmethod - def disk_to_xml(has_operating_system, label, media_link, name, os): - return _XmlSerializer.doc_from_data( - 'Disk', - [('HasOperatingSystem', has_operating_system, _lower), - ('Label', label), - ('MediaLink', media_link), - ('Name', name), - ('OS', os)]) - - @staticmethod - def restart_role_operation_to_xml(): - return _XmlSerializer.doc_from_xml( - 'RestartRoleOperation', - '<OperationType>RestartRoleOperation</OperationType>') - - @staticmethod - def shutdown_role_operation_to_xml(post_shutdown_action): - xml = _XmlSerializer.data_to_xml( - [('OperationType', 'ShutdownRoleOperation'), - ('PostShutdownAction', post_shutdown_action)]) - return _XmlSerializer.doc_from_xml('ShutdownRoleOperation', xml) - - @staticmethod - def shutdown_roles_operation_to_xml(role_names, post_shutdown_action): - xml = _XmlSerializer.data_to_xml( - [('OperationType', 'ShutdownRolesOperation')]) - xml += '<Roles>' - for role_name in role_names: - xml += _XmlSerializer.data_to_xml([('Name', role_name)]) - xml += '</Roles>' - xml += _XmlSerializer.data_to_xml( - [('PostShutdownAction', post_shutdown_action)]) - return _XmlSerializer.doc_from_xml('ShutdownRolesOperation', xml) - - @staticmethod - def start_role_operation_to_xml(): - return _XmlSerializer.doc_from_xml( - 'StartRoleOperation', - '<OperationType>StartRoleOperation</OperationType>') - - @staticmethod - def start_roles_operation_to_xml(role_names): - xml = _XmlSerializer.data_to_xml( - [('OperationType', 'StartRolesOperation')]) - xml += '<Roles>' - for role_name in role_names: - xml += _XmlSerializer.data_to_xml([('Name', role_name)]) - xml += '</Roles>' - return _XmlSerializer.doc_from_xml('StartRolesOperation', xml) - - @staticmethod - def windows_configuration_to_xml(configuration): - xml = _XmlSerializer.data_to_xml( - [('ConfigurationSetType', configuration.configuration_set_type), - ('ComputerName', configuration.computer_name), - ('AdminPassword', configuration.admin_password), - ('ResetPasswordOnFirstLogon', - configuration.reset_password_on_first_logon, - _lower), - ('EnableAutomaticUpdates', - configuration.enable_automatic_updates, - _lower), - ('TimeZone', configuration.time_zone)]) - - if configuration.domain_join is not None: - xml += '<DomainJoin>' - xml += '<Credentials>' - xml += _XmlSerializer.data_to_xml( - [('Domain', configuration.domain_join.credentials.domain), - ('Username', configuration.domain_join.credentials.username), - ('Password', configuration.domain_join.credentials.password)]) - xml += '</Credentials>' - xml += _XmlSerializer.data_to_xml( - [('JoinDomain', configuration.domain_join.join_domain), - ('MachineObjectOU', - configuration.domain_join.machine_object_ou)]) - xml += '</DomainJoin>' - if configuration.stored_certificate_settings is not None: - xml += '<StoredCertificateSettings>' - for cert in configuration.stored_certificate_settings: - xml += '<CertificateSetting>' - xml += _XmlSerializer.data_to_xml( - [('StoreLocation', cert.store_location), - ('StoreName', cert.store_name), - ('Thumbprint', cert.thumbprint)]) - xml += '</CertificateSetting>' - xml += '</StoredCertificateSettings>' - if configuration.win_rm is not None: - xml += '<WinRM><Listeners>' - for listener in configuration.win_rm.listeners: - xml += '<Listener>' - xml += _XmlSerializer.data_to_xml( - [('Protocol', listener.protocol), - ('CertificateThumbprint', listener.certificate_thumbprint)]) - xml += '</Listener>' - xml += '</Listeners></WinRM>' - xml += _XmlSerializer.data_to_xml( - [('AdminUsername', configuration.admin_username)]) - return xml - - @staticmethod - def linux_configuration_to_xml(configuration): - xml = _XmlSerializer.data_to_xml( - [('ConfigurationSetType', configuration.configuration_set_type), - ('HostName', configuration.host_name), - ('UserName', configuration.user_name), - ('UserPassword', configuration.user_password), - ('DisableSshPasswordAuthentication', - configuration.disable_ssh_password_authentication, - _lower)]) - - if configuration.ssh is not None: - xml += '<SSH>' - xml += '<PublicKeys>' - for key in configuration.ssh.public_keys: - xml += '<PublicKey>' - xml += _XmlSerializer.data_to_xml( - [('Fingerprint', key.fingerprint), - ('Path', key.path)]) - xml += '</PublicKey>' - xml += '</PublicKeys>' - xml += '<KeyPairs>' - for key in configuration.ssh.key_pairs: - xml += '<KeyPair>' - xml += _XmlSerializer.data_to_xml( - [('Fingerprint', key.fingerprint), - ('Path', key.path)]) - xml += '</KeyPair>' - xml += '</KeyPairs>' - xml += '</SSH>' - return xml - - @staticmethod - def network_configuration_to_xml(configuration): - xml = _XmlSerializer.data_to_xml( - [('ConfigurationSetType', configuration.configuration_set_type)]) - xml += '<InputEndpoints>' - for endpoint in configuration.input_endpoints: - xml += '<InputEndpoint>' - xml += _XmlSerializer.data_to_xml( - [('LoadBalancedEndpointSetName', - endpoint.load_balanced_endpoint_set_name), - ('LocalPort', endpoint.local_port), - ('Name', endpoint.name), - ('Port', endpoint.port)]) - - if endpoint.load_balancer_probe.path or\ - endpoint.load_balancer_probe.port or\ - endpoint.load_balancer_probe.protocol: - xml += '<LoadBalancerProbe>' - xml += _XmlSerializer.data_to_xml( - [('Path', endpoint.load_balancer_probe.path), - ('Port', endpoint.load_balancer_probe.port), - ('Protocol', endpoint.load_balancer_probe.protocol)]) - xml += '</LoadBalancerProbe>' - - xml += _XmlSerializer.data_to_xml( - [('Protocol', endpoint.protocol), - ('EnableDirectServerReturn', - endpoint.enable_direct_server_return, - _lower)]) - - xml += '</InputEndpoint>' - xml += '</InputEndpoints>' - xml += '<SubnetNames>' - for name in configuration.subnet_names: - xml += _XmlSerializer.data_to_xml([('SubnetName', name)]) - xml += '</SubnetNames>' - return xml - - @staticmethod - def role_to_xml(availability_set_name, data_virtual_hard_disks, - network_configuration_set, os_virtual_hard_disk, role_name, - role_size, role_type, system_configuration_set): - xml = _XmlSerializer.data_to_xml([('RoleName', role_name), - ('RoleType', role_type)]) - - xml += '<ConfigurationSets>' - - if system_configuration_set is not None: - xml += '<ConfigurationSet>' - if isinstance(system_configuration_set, WindowsConfigurationSet): - xml += _XmlSerializer.windows_configuration_to_xml( - system_configuration_set) - elif isinstance(system_configuration_set, LinuxConfigurationSet): - xml += _XmlSerializer.linux_configuration_to_xml( - system_configuration_set) - xml += '</ConfigurationSet>' - - if network_configuration_set is not None: - xml += '<ConfigurationSet>' - xml += _XmlSerializer.network_configuration_to_xml( - network_configuration_set) - xml += '</ConfigurationSet>' - - xml += '</ConfigurationSets>' - - if availability_set_name is not None: - xml += _XmlSerializer.data_to_xml( - [('AvailabilitySetName', availability_set_name)]) - - if data_virtual_hard_disks is not None: - xml += '<DataVirtualHardDisks>' - for hd in data_virtual_hard_disks: - xml += '<DataVirtualHardDisk>' - xml += _XmlSerializer.data_to_xml( - [('HostCaching', hd.host_caching), - ('DiskLabel', hd.disk_label), - ('DiskName', hd.disk_name), - ('Lun', hd.lun), - ('LogicalDiskSizeInGB', hd.logical_disk_size_in_gb), - ('MediaLink', hd.media_link)]) - xml += '</DataVirtualHardDisk>' - xml += '</DataVirtualHardDisks>' - - if os_virtual_hard_disk is not None: - xml += '<OSVirtualHardDisk>' - xml += _XmlSerializer.data_to_xml( - [('HostCaching', os_virtual_hard_disk.host_caching), - ('DiskLabel', os_virtual_hard_disk.disk_label), - ('DiskName', os_virtual_hard_disk.disk_name), - ('MediaLink', os_virtual_hard_disk.media_link), - ('SourceImageName', os_virtual_hard_disk.source_image_name)]) - xml += '</OSVirtualHardDisk>' - - if role_size is not None: - xml += _XmlSerializer.data_to_xml([('RoleSize', role_size)]) - - return xml - - @staticmethod - def add_role_to_xml(role_name, system_configuration_set, - os_virtual_hard_disk, role_type, - network_configuration_set, availability_set_name, - data_virtual_hard_disks, role_size): - xml = _XmlSerializer.role_to_xml( - availability_set_name, - data_virtual_hard_disks, - network_configuration_set, - os_virtual_hard_disk, - role_name, - role_size, - role_type, - system_configuration_set) - return _XmlSerializer.doc_from_xml('PersistentVMRole', xml) - - @staticmethod - def update_role_to_xml(role_name, os_virtual_hard_disk, role_type, - network_configuration_set, availability_set_name, - data_virtual_hard_disks, role_size): - xml = _XmlSerializer.role_to_xml( - availability_set_name, - data_virtual_hard_disks, - network_configuration_set, - os_virtual_hard_disk, - role_name, - role_size, - role_type, - None) - return _XmlSerializer.doc_from_xml('PersistentVMRole', xml) - - @staticmethod - def capture_role_to_xml(post_capture_action, target_image_name, - target_image_label, provisioning_configuration): - xml = _XmlSerializer.data_to_xml( - [('OperationType', 'CaptureRoleOperation'), - ('PostCaptureAction', post_capture_action)]) - - if provisioning_configuration is not None: - xml += '<ProvisioningConfiguration>' - if isinstance(provisioning_configuration, WindowsConfigurationSet): - xml += _XmlSerializer.windows_configuration_to_xml( - provisioning_configuration) - elif isinstance(provisioning_configuration, LinuxConfigurationSet): - xml += _XmlSerializer.linux_configuration_to_xml( - provisioning_configuration) - xml += '</ProvisioningConfiguration>' - - xml += _XmlSerializer.data_to_xml( - [('TargetImageLabel', target_image_label), - ('TargetImageName', target_image_name)]) - - return _XmlSerializer.doc_from_xml('CaptureRoleOperation', xml) - - @staticmethod - def virtual_machine_deployment_to_xml(deployment_name, deployment_slot, - label, role_name, - system_configuration_set, - os_virtual_hard_disk, role_type, - network_configuration_set, - availability_set_name, - data_virtual_hard_disks, role_size, - virtual_network_name): - xml = _XmlSerializer.data_to_xml([('Name', deployment_name), - ('DeploymentSlot', deployment_slot), - ('Label', label)]) - xml += '<RoleList>' - xml += '<Role>' - xml += _XmlSerializer.role_to_xml( - availability_set_name, - data_virtual_hard_disks, - network_configuration_set, - os_virtual_hard_disk, - role_name, - role_size, - role_type, - system_configuration_set) - xml += '</Role>' - xml += '</RoleList>' - - if virtual_network_name is not None: - xml += _XmlSerializer.data_to_xml( - [('VirtualNetworkName', virtual_network_name)]) - - return _XmlSerializer.doc_from_xml('Deployment', xml) - - @staticmethod - def data_to_xml(data): - '''Creates an xml fragment from the specified data. - data: Array of tuples, where first: xml element name - second: xml element text - third: conversion function - ''' - xml = '' - for element in data: - name = element[0] - val = element[1] - if len(element) > 2: - converter = element[2] - else: - converter = None - - if val is not None: - if converter is not None: - text = _str(converter(_str(val))) - else: - text = _str(val) - - xml += ''.join(['<', name, '>', text, '</', name, '>']) - return xml - - @staticmethod - def doc_from_xml(document_element_name, inner_xml): - '''Wraps the specified xml in an xml root element with default azure - namespaces''' - xml = ''.join(['<', document_element_name, - ' xmlns:i="http://www.w3.org/2001/XMLSchema-instance"', - ' xmlns="http://schemas.microsoft.com/windowsazure">']) - xml += inner_xml - xml += ''.join(['</', document_element_name, '>']) - return xml - - @staticmethod - def doc_from_data(document_element_name, data, extended_properties=None): - xml = _XmlSerializer.data_to_xml(data) - if extended_properties is not None: - xml += _XmlSerializer.extended_properties_dict_to_xml_fragment( - extended_properties) - return _XmlSerializer.doc_from_xml(document_element_name, xml) - - @staticmethod - def extended_properties_dict_to_xml_fragment(extended_properties): - xml = '' - if extended_properties is not None and len(extended_properties) > 0: - xml += '<ExtendedProperties>' - for key, val in extended_properties.items(): - xml += ''.join(['<ExtendedProperty>', - '<Name>', - _str(key), - '</Name>', - '<Value>', - _str(val), - '</Value>', - '</ExtendedProperty>']) - xml += '</ExtendedProperties>' - return xml - - -def _parse_bool(value): - if value.lower() == 'true': - return True - return False - - -class _ServiceBusManagementXmlSerializer(object): - - @staticmethod - def namespace_to_xml(region): - '''Converts a service bus namespace description to xml - - The xml format: -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<entry xmlns="http://www.w3.org/2005/Atom"> - <content type="application/xml"> - <NamespaceDescription - xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"> - <Region>West US</Region> - </NamespaceDescription> - </content> -</entry> - ''' - body = '<NamespaceDescription xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">' - body += ''.join(['<Region>', region, '</Region>']) - body += '</NamespaceDescription>' - - return _create_entry(body) - - @staticmethod - def xml_to_namespace(xmlstr): - '''Converts xml response to service bus namespace - - The xml format for namespace: -<entry> -<id>uuid:00000000-0000-0000-0000-000000000000;id=0000000</id> -<title type="text">myunittests -2012-08-22T16:48:10Z - - - myunittests - West US - 0000000000000000000000000000000000000000000= - Active - 2012-08-22T16:48:10.217Z - https://myunittests-sb.accesscontrol.windows.net/ - https://myunittests.servicebus.windows.net/ - Endpoint=sb://myunittests.servicebus.windows.net/;SharedSecretIssuer=owner;SharedSecretValue=0000000000000000000000000000000000000000000= - 00000000000000000000000000000000 - true - - - - ''' - xmldoc = minidom.parseString(xmlstr) - namespace = ServiceBusNamespace() - - mappings = ( - ('Name', 'name', None), - ('Region', 'region', None), - ('DefaultKey', 'default_key', None), - ('Status', 'status', None), - ('CreatedAt', 'created_at', None), - ('AcsManagementEndpoint', 'acs_management_endpoint', None), - ('ServiceBusEndpoint', 'servicebus_endpoint', None), - ('ConnectionString', 'connection_string', None), - ('SubscriptionId', 'subscription_id', None), - ('Enabled', 'enabled', _parse_bool), - ) - - for desc in _get_children_from_path(xmldoc, - 'entry', - 'content', - 'NamespaceDescription'): - for xml_name, field_name, conversion_func in mappings: - node_value = _get_first_child_node_value(desc, xml_name) - if node_value is not None: - if conversion_func is not None: - node_value = conversion_func(node_value) - setattr(namespace, field_name, node_value) - - return namespace - - @staticmethod - def xml_to_region(xmlstr): - '''Converts xml response to service bus region - - The xml format for region: - -uuid:157c311f-081f-4b4a-a0ba-a8f990ffd2a3;id=1756759 - -2013-04-10T18:25:29Z - - - East Asia - East Asia - - - - ''' - xmldoc = minidom.parseString(xmlstr) - region = ServiceBusRegion() - - for desc in _get_children_from_path(xmldoc, 'entry', 'content', - 'RegionCodeDescription'): - node_value = _get_first_child_node_value(desc, 'Code') - if node_value is not None: - region.code = node_value - node_value = _get_first_child_node_value(desc, 'FullName') - if node_value is not None: - region.fullname = node_value - - return region - - @staticmethod - def xml_to_namespace_availability(xmlstr): - '''Converts xml response to service bus namespace availability - - The xml format: - - - uuid:9fc7c652-1856-47ab-8d74-cd31502ea8e6;id=3683292 - - 2013-04-16T03:03:37Z - - - false - - - - ''' - xmldoc = minidom.parseString(xmlstr) - availability = AvailabilityResponse() - - for desc in _get_children_from_path(xmldoc, 'entry', 'content', - 'NamespaceAvailability'): - node_value = _get_first_child_node_value(desc, 'Result') - if node_value is not None: - availability.result = _parse_bool(node_value) - - return availability - -from azure.servicemanagement.servicemanagementservice import ( - ServiceManagementService) -from azure.servicemanagement.servicebusmanagementservice import ( - ServiceBusManagementService) +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +from xml.dom import minidom +from azure import ( + WindowsAzureData, + _Base64String, + _create_entry, + _dict_of, + _encode_base64, + _general_error_handler, + _get_children_from_path, + _get_first_child_node_value, + _list_of, + _scalar_list_of, + _str, + _xml_attribute, + _get_entry_properties_from_node, + _get_child_nodes, + _get_serialization_name, + ) + +#----------------------------------------------------------------------------- +# Constants for Azure app environment settings. +AZURE_MANAGEMENT_CERTFILE = 'AZURE_MANAGEMENT_CERTFILE' +AZURE_MANAGEMENT_SUBSCRIPTIONID = 'AZURE_MANAGEMENT_SUBSCRIPTIONID' + +# x-ms-version for service management. +X_MS_VERSION = '2014-06-01' + +#----------------------------------------------------------------------------- +# Data classes + + +class StorageServices(WindowsAzureData): + + def __init__(self): + self.storage_services = _list_of(StorageService) + + def __iter__(self): + return iter(self.storage_services) + + def __len__(self): + return len(self.storage_services) + + def __getitem__(self, index): + return self.storage_services[index] + + +class StorageService(WindowsAzureData): + + def __init__(self): + self.url = '' + self.service_name = '' + self.storage_service_properties = StorageAccountProperties() + self.storage_service_keys = StorageServiceKeys() + self.extended_properties = _dict_of( + 'ExtendedProperty', 'Name', 'Value') + self.capabilities = _scalar_list_of(str, 'Capability') + + +class StorageAccountProperties(WindowsAzureData): + + def __init__(self): + self.description = u'' + self.affinity_group = u'' + self.location = u'' + self.label = _Base64String() + self.status = u'' + self.endpoints = _scalar_list_of(str, 'Endpoint') + self.geo_replication_enabled = False + self.geo_primary_region = u'' + self.status_of_primary = u'' + self.geo_secondary_region = u'' + self.status_of_secondary = u'' + self.last_geo_failover_time = u'' + self.creation_time = u'' + self.account_type = u'' + + +class StorageServiceKeys(WindowsAzureData): + + def __init__(self): + self.primary = u'' + self.secondary = u'' + + +class Locations(WindowsAzureData): + + def __init__(self): + self.locations = _list_of(Location) + + def __iter__(self): + return iter(self.locations) + + def __len__(self): + return len(self.locations) + + def __getitem__(self, index): + return self.locations[index] + + +class Location(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.display_name = u'' + self.available_services = _scalar_list_of(str, 'AvailableService') + self.compute_capabilities = ComputeCapabilities() + + +class ComputeCapabilities(WindowsAzureData): + + def __init__(self): + self.web_worker_role_sizes = _scalar_list_of(str, 'RoleSize') + self.virtual_machines_role_sizes = _scalar_list_of(str, 'RoleSize') + + +class AffinityGroup(WindowsAzureData): + + def __init__(self): + self.name = '' + self.label = _Base64String() + self.description = u'' + self.location = u'' + self.hosted_services = HostedServices() + self.storage_services = StorageServices() + self.capabilities = _scalar_list_of(str, 'Capability') + + +class AffinityGroups(WindowsAzureData): + + def __init__(self): + self.affinity_groups = _list_of(AffinityGroup) + + def __iter__(self): + return iter(self.affinity_groups) + + def __len__(self): + return len(self.affinity_groups) + + def __getitem__(self, index): + return self.affinity_groups[index] + + +class HostedServices(WindowsAzureData): + + def __init__(self): + self.hosted_services = _list_of(HostedService) + + def __iter__(self): + return iter(self.hosted_services) + + def __len__(self): + return len(self.hosted_services) + + def __getitem__(self, index): + return self.hosted_services[index] + + +class HostedService(WindowsAzureData): + + def __init__(self): + self.url = u'' + self.service_name = u'' + self.hosted_service_properties = HostedServiceProperties() + self.deployments = Deployments() + + +class HostedServiceProperties(WindowsAzureData): + + def __init__(self): + self.description = u'' + self.location = u'' + self.affinity_group = u'' + self.label = _Base64String() + self.status = u'' + self.date_created = u'' + self.date_last_modified = u'' + self.extended_properties = _dict_of( + 'ExtendedProperty', 'Name', 'Value') + + +class VirtualNetworkSites(WindowsAzureData): + + def __init__(self): + self.virtual_network_sites = _list_of(VirtualNetworkSite) + + def __iter__(self): + return iter(self.virtual_network_sites) + + def __len__(self): + return len(self.virtual_network_sites) + + def __getitem__(self, index): + return self.virtual_network_sites[index] + + +class VirtualNetworkSite(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.id = u'' + self.affinity_group = u'' + self.subnets = Subnets() + + +class Subnets(WindowsAzureData): + + def __init__(self): + self.subnets = _list_of(Subnet) + + def __iter__(self): + return iter(self.subnets) + + def __len__(self): + return len(self.subnets) + + def __getitem__(self, index): + return self.subnets[index] + + +class Subnet(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.address_prefix = u'' + + + +class Deployments(WindowsAzureData): + + def __init__(self): + self.deployments = _list_of(Deployment) + + def __iter__(self): + return iter(self.deployments) + + def __len__(self): + return len(self.deployments) + + def __getitem__(self, index): + return self.deployments[index] + + +class Deployment(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.deployment_slot = u'' + self.private_id = u'' + self.status = u'' + self.label = _Base64String() + self.url = u'' + self.configuration = _Base64String() + self.role_instance_list = RoleInstanceList() + self.upgrade_status = UpgradeStatus() + self.upgrade_domain_count = u'' + self.role_list = RoleList() + self.sdk_version = u'' + self.input_endpoint_list = InputEndpoints() + self.locked = False + self.rollback_allowed = False + self.persistent_vm_downtime_info = PersistentVMDowntimeInfo() + self.created_time = u'' + self.virtual_network_name = u'' + self.last_modified_time = u'' + self.extended_properties = _dict_of( + 'ExtendedProperty', 'Name', 'Value') + + +class RoleInstanceList(WindowsAzureData): + + def __init__(self): + self.role_instances = _list_of(RoleInstance) + + def __iter__(self): + return iter(self.role_instances) + + def __len__(self): + return len(self.role_instances) + + def __getitem__(self, index): + return self.role_instances[index] + + +class RoleInstance(WindowsAzureData): + + def __init__(self): + self.role_name = u'' + self.instance_name = u'' + self.instance_status = u'' + self.instance_upgrade_domain = 0 + self.instance_fault_domain = 0 + self.instance_size = u'' + self.instance_state_details = u'' + self.instance_error_code = u'' + self.ip_address = u'' + self.instance_endpoints = InstanceEndpoints() + self.power_state = u'' + self.fqdn = u'' + self.host_name = u'' + self.public_ips = PublicIPs() + +class InstanceEndpoints(WindowsAzureData): + + def __init__(self): + self.instance_endpoints = _list_of(InstanceEndpoint) + + def __iter__(self): + return iter(self.instance_endpoints) + + def __len__(self): + return len(self.instance_endpoints) + + def __getitem__(self, index): + return self.instance_endpoints[index] + + +class InstanceEndpoint(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.vip = u'' + self.public_port = u'' + self.local_port = u'' + self.protocol = u'' + + +class UpgradeStatus(WindowsAzureData): + + def __init__(self): + self.upgrade_type = u'' + self.current_upgrade_domain_state = u'' + self.current_upgrade_domain = u'' + + +class InputEndpoints(WindowsAzureData): + + def __init__(self): + self.input_endpoints = _list_of(InputEndpoint) + + def __iter__(self): + return iter(self.input_endpoints) + + def __len__(self): + return len(self.input_endpoints) + + def __getitem__(self, index): + return self.input_endpoints[index] + + +class InputEndpoint(WindowsAzureData): + + def __init__(self): + self.role_name = u'' + self.vip = u'' + self.port = u'' + + +class RoleList(WindowsAzureData): + + def __init__(self): + self.roles = _list_of(Role) + + def __iter__(self): + return iter(self.roles) + + def __len__(self): + return len(self.roles) + + def __getitem__(self, index): + return self.roles[index] + + +class Role(WindowsAzureData): + + def __init__(self): + self.role_name = u'' + self.role_type = u'' + self.os_version = u'' + self.configuration_sets = ConfigurationSets() + self.availability_set_name = u'' + self.data_virtual_hard_disks = DataVirtualHardDisks() + self.os_virtual_hard_disk = OSVirtualHardDisk() + self.role_size = u'' + self.default_win_rm_certificate_thumbprint = u'' + + +class CaptureRoleAsVMImage: + + def __init__(self, os_state=None, vm_image_name=None, vm_image_label=None, + description=None, language=None, image_family=None, + recommended_vm_size=None): + self.os_state = os_state + self.vm_image_name = vm_image_name + self.vm_image_label = vm_image_label + self.description = description + self.language = language + self.image_family = image_family + self.recommended_vm_size = recommended_vm_size + + +class OSDiskConfiguration(WindowsAzureData): + + def __init__(self): + self.name = None + self.host_caching = None + self.os_state = None + self.os = None + self.media_link = None + self.logical_disk_size_in_gb = -1 + + +class DataDiskConfigurations(WindowsAzureData): + + def __init__(self): + self.data_disk_configurations = _list_of(DataDiskConfiguration) + + def __iter__(self): + return iter(self.data_disk_configurations) + + def __len__(self): + return len(self.data_disk_configurations) + + def __getitem__(self, index): + return self.data_disk_configurations[index] + + +class DataDiskConfiguration(WindowsAzureData): + + def __init__(self): + self.name = None + self.host_caching = None + self.lun = -1 + self.media_link = None + self.logical_disk_size_in_gb = -1 + + +class VMImages(WindowsAzureData): + + def __init__(self): + self.vm_images = _list_of(VMImage) + + def __iter__(self): + return iter(self.vm_images) + + def __len__(self): + return len(self.vm_images) + + def __getitem__(self, index): + return self.vm_images[index] + + +class VMImage(WindowsAzureData): + + def __init__(self, name=None, label=None, description=None): + self.name = name + self.label = label + self.category = None # read-only + self.description = description + self.os_disk_configuration = OSDiskConfiguration() + self.data_disk_configurations = DataDiskConfigurations() + self.service_name = None # read-only + self.deployment_name = None # read-only + self.role_name = None # read-only + self.location = None # read-only + self.affinity_group = None # read-only + self.created_time = None # read-only + self.modified_time = None # read-only + self.language = None + self.image_family = None + self.recommended_vm_size = None + self.is_premium = False # read-only + self.eula = None + self.icon_uri = None + self.small_icon_uri = None + self.privacy_uri = None + self.publisher_name = None # read-only + self.published_date = None + self.show_in_gui = False + self.pricing_detail_link = None # read-only + + +class ResourceExtensions(WindowsAzureData): + + def __init__(self): + self.resource_extensions = _list_of(ResourceExtension) + + def __iter__(self): + return iter(self.resource_extensions) + + def __len__(self): + return len(self.resource_extensions) + + def __getitem__(self, index): + return self.resource_extensions[index] + + +class ResourceExtension(WindowsAzureData): + + def __init__(self): + self.publisher = u'' + self.name = u'' + self.version = u'' + self.label = u'' + self.description = u'' + self.public_configuration_schema = u'' + self.private_configuration_schema = u'' + self.sample_config = u'' + self.replication_completed = False + self.eula = u'' + self.privacy_uri = u'' + self.homepage_uri = u'' + self.is_json_extension = False + self.is_internal_extension = False + self.disallow_major_version_upgrade = False + self.company_name = u'' + self.supported_os = u'' + self.published_date = u'' + + +class ResourceExtensionParameterValues(WindowsAzureData): + + def __init__(self): + self.resource_extension_parameter_values = _list_of(ResourceExtensionParameterValue) + + def __iter__(self): + return iter(self.resource_extension_parameter_values) + + def __len__(self): + return len(self.resource_extension_parameter_values) + + def __getitem__(self, index): + return self.resource_extension_parameter_values[index] + + +class ResourceExtensionParameterValue(WindowsAzureData): + + def __init__(self): + self.key = u'' + self.value = u'' + self.type = u'' + + +class ResourceExtensionReferences(WindowsAzureData): + + def __init__(self): + self.resource_extension_references = _list_of(ResourceExtensionReference) + + def __iter__(self): + return iter(self.resource_extension_references) + + def __len__(self): + return len(self.resource_extension_references) + + def __getitem__(self, index): + return self.resource_extension_references[index] + + +class ResourceExtensionReference(WindowsAzureData): + + def __init__(self, reference_name=u'', publisher=u'', name=u'', version=u''): + self.reference_name = reference_name + self.publisher = publisher + self.name = name + self.version = version + self.resource_extension_parameter_values = ResourceExtensionParameterValues() + self.state = u'' + self.certificates = Certificates() + + +class AdditionalUnattendContent(WindowsAzureData): + + def __init__(self): + self.passes = Passes() + + +class Passes(WindowsAzureData): + + def __init__(self): + self.passes = _list_of(UnattendPass) + + def __iter__(self): + return iter(self.passes) + + def __len__(self): + return len(self.passes) + + def __getitem__(self, index): + return self.passes[index] + + +class UnattendPass(WindowsAzureData): + + def __init__(self): + self.pass_name = u'' + self.components = Components() + + +class Components(WindowsAzureData): + + def __init__(self): + self.components = _list_of(UnattendComponent) + + def __iter__(self): + return iter(self.components) + + def __len__(self): + return len(self.components) + + def __getitem__(self, index): + return self.components[index] + + +class UnattendComponent(WindowsAzureData): + + def __init__(self): + self.component_name = u'' + self.component_settings = ComponentSettings() + + +class ComponentSettings(WindowsAzureData): + + def __init__(self): + self.component_settings = _list_of(ComponentSetting) + + def __iter__(self): + return iter(self.component_settings) + + def __len__(self): + return len(self.component_settings) + + def __getitem__(self, index): + return self.component_settings[index] + + +class ComponentSetting(WindowsAzureData): + + def __init__(self): + self.setting_name = u'' + self.content = u'' + + +class DnsServer(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.address = u'' + + +class ReservedIPs(WindowsAzureData): + + def __init__(self): + self.reserved_ips = _list_of(ReservedIP) + + def __iter__(self): + return iter(self.reserved_ips) + + def __len__(self): + return len(self.reserved_ips) + + def __getitem__(self, index): + return self.reserved_ips[index] + + +class ReservedIP(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.address = u'' + self.id = u'' + self.label = u'' + self.state = u'' + self.in_use = False + self.service_name = u'' + self.deployment_name = u'' + self.location = u'' + + +class PersistentVMDowntimeInfo(WindowsAzureData): + + def __init__(self): + self.start_time = u'' + self.end_time = u'' + self.status = u'' + + +class Certificates(WindowsAzureData): + + def __init__(self): + self.certificates = _list_of(Certificate) + + def __iter__(self): + return iter(self.certificates) + + def __len__(self): + return len(self.certificates) + + def __getitem__(self, index): + return self.certificates[index] + + +class Certificate(WindowsAzureData): + + def __init__(self): + self.certificate_url = u'' + self.thumbprint = u'' + self.thumbprint_algorithm = u'' + self.data = u'' + + +class OperationError(WindowsAzureData): + + def __init__(self): + self.code = u'' + self.message = u'' + + +class Operation(WindowsAzureData): + + def __init__(self): + self.id = u'' + self.status = u'' + self.http_status_code = u'' + self.error = OperationError() + + +class OperatingSystem(WindowsAzureData): + + def __init__(self): + self.version = u'' + self.label = _Base64String() + self.is_default = True + self.is_active = True + self.family = 0 + self.family_label = _Base64String() + + +class OperatingSystems(WindowsAzureData): + + def __init__(self): + self.operating_systems = _list_of(OperatingSystem) + + def __iter__(self): + return iter(self.operating_systems) + + def __len__(self): + return len(self.operating_systems) + + def __getitem__(self, index): + return self.operating_systems[index] + + +class OperatingSystemFamily(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.label = _Base64String() + self.operating_systems = OperatingSystems() + + +class OperatingSystemFamilies(WindowsAzureData): + + def __init__(self): + self.operating_system_families = _list_of(OperatingSystemFamily) + + def __iter__(self): + return iter(self.operating_system_families) + + def __len__(self): + return len(self.operating_system_families) + + def __getitem__(self, index): + return self.operating_system_families[index] + + +class Subscriptions(WindowsAzureData): + + def __init__(self): + self.subscriptions = _list_of(Subscription) + + def __iter__(self): + return iter(self.subscriptions) + + def __len__(self): + return len(self.subscriptions) + + def __getitem__(self, index): + return self.subscriptions[index] + + +class Subscription(WindowsAzureData): + + def __init__(self): + self.subscription_id = u'' + self.subscription_name = u'' + self.subscription_status = u'' + self.account_admin_live_email_id = u'' + self.service_admin_live_email_id = u'' + self.max_core_count = 0 + self.max_storage_accounts = 0 + self.max_hosted_services = 0 + self.current_core_count = 0 + self.current_hosted_services = 0 + self.current_storage_accounts = 0 + self.max_virtual_network_sites = 0 + self.current_virtual_network_sites = 0 + self.max_local_network_sites = 0 + self.max_dns_servers = 0 + self.aad_tenant_id = u'' + self.created_time = u'' + + +class AvailabilityResponse(WindowsAzureData): + + def __init__(self): + self.result = False + self.reason = False + + +class SubscriptionCertificates(WindowsAzureData): + + def __init__(self): + self.subscription_certificates = _list_of(SubscriptionCertificate) + + def __iter__(self): + return iter(self.subscription_certificates) + + def __len__(self): + return len(self.subscription_certificates) + + def __getitem__(self, index): + return self.subscription_certificates[index] + + +class SubscriptionCertificate(WindowsAzureData): + + def __init__(self): + self.subscription_certificate_public_key = u'' + self.subscription_certificate_thumbprint = u'' + self.subscription_certificate_data = u'' + self.created = u'' + + +class RoleSizes(WindowsAzureData): + + def __init__(self): + self.role_sizes = _list_of(RoleSize) + + def __iter__(self): + return iter(self.role_sizes) + + def __len__(self): + return len(self.role_sizes) + + def __getitem__(self, index): + return self.role_sizes[index] + + +class RoleSize(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.label = u'' + self.cores = 0 + self.memory_in_mb = 0 + self.supported_by_web_worker_roles = False + self.supported_by_virtual_machines = False + self.max_data_disk_count = 0 + self.web_worker_resource_disk_size_in_mb = 0 + self.virtual_machine_resource_disk_size_in_mb = 0 + + +class Images(WindowsAzureData): + + def __init__(self): + self.images = _list_of(OSImage) + + def __iter__(self): + return iter(self.images) + + def __len__(self): + return len(self.images) + + def __getitem__(self, index): + return self.images[index] + + +class OSImage(WindowsAzureData): + + def __init__(self): + self.affinity_group = u'' + self.category = u'' + self.location = u'' + self.logical_size_in_gb = 0 + self.label = u'' + self.media_link = u'' + self.name = u'' + self.os = u'' + self.eula = u'' + self.description = u'' + self.image_family = u'' + self.show_in_gui = True + self.published_date = u'' + self.is_premium = True + self.icon_uri = u'' + self.privacy_uri = u'' + self.recommended_vm_size = u'' + self.publisher_name = u'' + self.pricing_detail_link = u'' + self.small_icon_uri = u'' + self.os_state = u'' + self.language = u'' + + +class Disks(WindowsAzureData): + + def __init__(self): + self.disks = _list_of(Disk) + + def __iter__(self): + return iter(self.disks) + + def __len__(self): + return len(self.disks) + + def __getitem__(self, index): + return self.disks[index] + + +class Disk(WindowsAzureData): + + def __init__(self): + self.affinity_group = u'' + self.attached_to = AttachedTo() + self.has_operating_system = u'' + self.is_corrupted = u'' + self.location = u'' + self.logical_disk_size_in_gb = 0 + self.label = u'' + self.media_link = u'' + self.name = u'' + self.os = u'' + self.source_image_name = u'' + + +class AttachedTo(WindowsAzureData): + + def __init__(self): + self.hosted_service_name = u'' + self.deployment_name = u'' + self.role_name = u'' + + +class PersistentVMRole(WindowsAzureData): + + def __init__(self): + self.role_name = u'' + self.role_type = u'' + self.os_version = u'' # undocumented + self.configuration_sets = ConfigurationSets() + self.availability_set_name = u'' + self.data_virtual_hard_disks = DataVirtualHardDisks() + self.os_virtual_hard_disk = OSVirtualHardDisk() + self.role_size = u'' + self.default_win_rm_certificate_thumbprint = u'' + + +class ConfigurationSets(WindowsAzureData): + + def __init__(self): + self.configuration_sets = _list_of(ConfigurationSet) + + def __iter__(self): + return iter(self.configuration_sets) + + def __len__(self): + return len(self.configuration_sets) + + def __getitem__(self, index): + return self.configuration_sets[index] + + +class PublicIPs(WindowsAzureData): + + def __init__(self): + self.public_ips = _list_of(PublicIP) + + def __iter__(self): + return iter(self.public_ips) + + def __len__(self): + return len(self.public_ips) + + def __getitem__(self, index): + return self.public_ips[index] + + +class PublicIP(WindowsAzureData): + + def __init__(self, name=u''): + self.name = name + self.idle_timeout_in_minutes = 4 + self.address = None + +class ConfigurationSet(WindowsAzureData): + + def __init__(self): + self.configuration_set_type = u'NetworkConfiguration' + self.role_type = u'' + self.input_endpoints = ConfigurationSetInputEndpoints() + self.subnet_names = _scalar_list_of(str, 'SubnetName') + self.public_ips = PublicIPs() + + +class ConfigurationSetInputEndpoints(WindowsAzureData): + + def __init__(self): + self.input_endpoints = _list_of( + ConfigurationSetInputEndpoint, 'InputEndpoint') + + def __iter__(self): + return iter(self.input_endpoints) + + def __len__(self): + return len(self.input_endpoints) + + def __getitem__(self, index): + return self.input_endpoints[index] + + +class ConfigurationSetInputEndpoint(WindowsAzureData): + + ''' + Initializes a network configuration input endpoint. + + name: Specifies the name for the external endpoint. + protocol: + Specifies the protocol to use to inspect the virtual machine + availability status. Possible values are: HTTP, TCP. + port: Specifies the external port to use for the endpoint. + local_port: + Specifies the internal port on which the virtual machine is listening + to serve the endpoint. + load_balanced_endpoint_set_name: + Specifies a name for a set of load-balanced endpoints. Specifying this + element for a given endpoint adds it to the set. If you are setting an + endpoint to use to connect to the virtual machine via the Remote + Desktop, do not set this property. + enable_direct_server_return: + Specifies whether direct server return load balancing is enabled. + ''' + + def __init__(self, name=u'', protocol=u'', port=u'', local_port=u'', + load_balanced_endpoint_set_name=u'', + enable_direct_server_return=False): + self.enable_direct_server_return = enable_direct_server_return + self.load_balanced_endpoint_set_name = load_balanced_endpoint_set_name + self.local_port = local_port + self.name = name + self.port = port + self.load_balancer_probe = LoadBalancerProbe() + self.protocol = protocol + + +class WindowsConfigurationSet(WindowsAzureData): + + def __init__(self, computer_name=None, admin_password=None, + reset_password_on_first_logon=None, + enable_automatic_updates=None, time_zone=None, + admin_username=None, custom_data=None): + self.configuration_set_type = u'WindowsProvisioningConfiguration' + self.computer_name = computer_name + self.admin_password = admin_password + self.admin_username = admin_username + self.reset_password_on_first_logon = reset_password_on_first_logon + self.enable_automatic_updates = enable_automatic_updates + self.time_zone = time_zone + self.domain_join = DomainJoin() + self.stored_certificate_settings = StoredCertificateSettings() + self.win_rm = WinRM() + self.custom_data = custom_data + self.additional_unattend_content = AdditionalUnattendContent() + + +class DomainJoin(WindowsAzureData): + + def __init__(self): + self.credentials = Credentials() + self.join_domain = u'' + self.machine_object_ou = u'' + + +class Credentials(WindowsAzureData): + + def __init__(self): + self.domain = u'' + self.username = u'' + self.password = u'' + + +class StoredCertificateSettings(WindowsAzureData): + + def __init__(self): + self.stored_certificate_settings = _list_of(CertificateSetting) + + def __iter__(self): + return iter(self.stored_certificate_settings) + + def __len__(self): + return len(self.stored_certificate_settings) + + def __getitem__(self, index): + return self.stored_certificate_settings[index] + + +class CertificateSetting(WindowsAzureData): + + ''' + Initializes a certificate setting. + + thumbprint: + Specifies the thumbprint of the certificate to be provisioned. The + thumbprint must specify an existing service certificate. + store_name: + Specifies the name of the certificate store from which retrieve + certificate. + store_location: + Specifies the target certificate store location on the virtual machine. + The only supported value is LocalMachine. + ''' + + def __init__(self, thumbprint=u'', store_name=u'', store_location=u''): + self.thumbprint = thumbprint + self.store_name = store_name + self.store_location = store_location + + +class WinRM(WindowsAzureData): + + ''' + Contains configuration settings for the Windows Remote Management service on + the Virtual Machine. + ''' + + def __init__(self): + self.listeners = Listeners() + + +class Listeners(WindowsAzureData): + + def __init__(self): + self.listeners = _list_of(Listener) + + def __iter__(self): + return iter(self.listeners) + + def __len__(self): + return len(self.listeners) + + def __getitem__(self, index): + return self.listeners[index] + + +class Listener(WindowsAzureData): + + ''' + Specifies the protocol and certificate information for the listener. + + protocol: + Specifies the protocol of listener. Possible values are: Http, Https. + The value is case sensitive. + certificate_thumbprint: + Optional. Specifies the certificate thumbprint for the secure + connection. If this value is not specified, a self-signed certificate is + generated and used for the Virtual Machine. + ''' + + def __init__(self, protocol=u'', certificate_thumbprint=u''): + self.protocol = protocol + self.certificate_thumbprint = certificate_thumbprint + + +class LinuxConfigurationSet(WindowsAzureData): + + def __init__(self, host_name=None, user_name=None, user_password=None, + disable_ssh_password_authentication=None, custom_data=None): + self.configuration_set_type = u'LinuxProvisioningConfiguration' + self.host_name = host_name + self.user_name = user_name + self.user_password = user_password + self.disable_ssh_password_authentication =\ + disable_ssh_password_authentication + self.ssh = SSH() + self.custom_data = custom_data + + +class SSH(WindowsAzureData): + + def __init__(self): + self.public_keys = PublicKeys() + self.key_pairs = KeyPairs() + + +class PublicKeys(WindowsAzureData): + + def __init__(self): + self.public_keys = _list_of(PublicKey) + + def __iter__(self): + return iter(self.public_keys) + + def __len__(self): + return len(self.public_keys) + + def __getitem__(self, index): + return self.public_keys[index] + + +class PublicKey(WindowsAzureData): + + def __init__(self, fingerprint=u'', path=u''): + self.fingerprint = fingerprint + self.path = path + + +class KeyPairs(WindowsAzureData): + + def __init__(self): + self.key_pairs = _list_of(KeyPair) + + def __iter__(self): + return iter(self.key_pairs) + + def __len__(self): + return len(self.key_pairs) + + def __getitem__(self, index): + return self.key_pairs[index] + + +class KeyPair(WindowsAzureData): + + def __init__(self, fingerprint=u'', path=u''): + self.fingerprint = fingerprint + self.path = path + + +class LoadBalancerProbe(WindowsAzureData): + + def __init__(self): + self.path = u'' + self.port = u'' + self.protocol = u'' + + +class DataVirtualHardDisks(WindowsAzureData): + + def __init__(self): + self.data_virtual_hard_disks = _list_of(DataVirtualHardDisk) + + def __iter__(self): + return iter(self.data_virtual_hard_disks) + + def __len__(self): + return len(self.data_virtual_hard_disks) + + def __getitem__(self, index): + return self.data_virtual_hard_disks[index] + + +class DataVirtualHardDisk(WindowsAzureData): + + def __init__(self): + self.host_caching = None + self.disk_label = u'' + self.disk_name = u'' + self.lun = 0 + self.logical_disk_size_in_gb = 0 + self.media_link = u'' + + +class OSVirtualHardDisk(WindowsAzureData): + + def __init__(self, source_image_name=None, media_link=None, + host_caching=None, disk_label=None, disk_name=None, + os=None, remote_source_image_link=None): + self.source_image_name = source_image_name + self.media_link = media_link + self.host_caching = host_caching + self.disk_label = disk_label + self.disk_name = disk_name + self.os = os + self.remote_source_image_link = remote_source_image_link + +class AsynchronousOperationResult(WindowsAzureData): + + def __init__(self, request_id=None): + self.request_id = request_id + + +class ServiceBusRegion(WindowsAzureData): + + def __init__(self): + self.code = u'' + self.fullname = u'' + + +class ServiceBusNamespace(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.region = u'' + self.default_key = u'' + self.status = u'' + self.created_at = u'' + self.acs_management_endpoint = u'' + self.servicebus_endpoint = u'' + self.connection_string = u'' + self.subscription_id = u'' + self.enabled = False + + +class MetricProperties(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.primary_aggregation = u'' + self.unit = u'' + self.display_name = u'' + + +class MetricValues(WindowsAzureData): + + def __init__(self): + self.timestamp = u'' + self.min = 0 + self.max = 0 + self.average = 0 + self.total = 0 + + +class MetricRollups(WindowsAzureData): + + def __init__(self): + self.time_grain = u'' + self.retention = u'' + + +class WebSpaces(WindowsAzureData): + + def __init__(self): + self.web_space = _list_of(WebSpace) + + def __iter__(self): + return iter(self.web_space) + + def __len__(self): + return len(self.web_space) + + def __getitem__(self, index): + return self.web_space[index] + + +class WebSpace(WindowsAzureData): + + def __init__(self): + self.availability_state = u'' + self.geo_location = u'' + self.geo_region = u'' + self.name = u'' + self.plan = u'' + self.status = u'' + self.subscription = u'' + + +class Sites(WindowsAzureData): + + def __init__(self): + self.site = _list_of(Site) + + def __iter__(self): + return iter(self.site) + + def __len__(self): + return len(self.site) + + def __getitem__(self, index): + return self.site[index] + + +class Site(WindowsAzureData): + + def __init__(self): + self.admin_enabled = False + self.availability_state = '' + self.compute_mode = '' + self.enabled = False + self.enabled_host_names = _scalar_list_of(str, 'a:string') + self.host_name_ssl_states = HostNameSslStates() + self.host_names = _scalar_list_of(str, 'a:string') + self.last_modified_time_utc = '' + self.name = '' + self.repository_site_name = '' + self.self_link = '' + self.server_farm = '' + self.site_mode = '' + self.state = '' + self.storage_recovery_default_state = '' + self.usage_state = '' + self.web_space = '' + + +class HostNameSslStates(WindowsAzureData): + + def __init__(self): + self.host_name_ssl_state = _list_of(HostNameSslState) + + def __iter__(self): + return iter(self.host_name_ssl_state) + + def __len__(self): + return len(self.host_name_ssl_state) + + def __getitem__(self, index): + return self.host_name_ssl_state[index] + + +class HostNameSslState(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.ssl_state = u'' + + +class PublishData(WindowsAzureData): + _xml_name = 'publishData' + + def __init__(self): + self.publish_profiles = _list_of(PublishProfile, 'publishProfile') + +class PublishProfile(WindowsAzureData): + + def __init__(self): + self.profile_name = _xml_attribute('profileName') + self.publish_method = _xml_attribute('publishMethod') + self.publish_url = _xml_attribute('publishUrl') + self.msdeploysite = _xml_attribute('msdeploySite') + self.user_name = _xml_attribute('userName') + self.user_pwd = _xml_attribute('userPWD') + self.destination_app_url = _xml_attribute('destinationAppUrl') + self.sql_server_db_connection_string = _xml_attribute('SQLServerDBConnectionString') + self.my_sqldb_connection_string = _xml_attribute('mySQLDBConnectionString') + self.hosting_provider_forum_link = _xml_attribute('hostingProviderForumLink') + self.control_panel_link = _xml_attribute('controlPanelLink') + +class QueueDescription(WindowsAzureData): + + def __init__(self): + self.lock_duration = u'' + self.max_size_in_megabytes = 0 + self.requires_duplicate_detection = False + self.requires_session = False + self.default_message_time_to_live = u'' + self.dead_lettering_on_message_expiration = False + self.duplicate_detection_history_time_window = u'' + self.max_delivery_count = 0 + self.enable_batched_operations = False + self.size_in_bytes = 0 + self.message_count = 0 + self.is_anonymous_accessible = False + self.authorization_rules = AuthorizationRules() + self.status = u'' + self.created_at = u'' + self.updated_at = u'' + self.accessed_at = u'' + self.support_ordering = False + self.auto_delete_on_idle = u'' + self.count_details = CountDetails() + self.entity_availability_status = u'' + +class TopicDescription(WindowsAzureData): + + def __init__(self): + self.default_message_time_to_live = u'' + self.max_size_in_megabytes = 0 + self.requires_duplicate_detection = False + self.duplicate_detection_history_time_window = u'' + self.enable_batched_operations = False + self.size_in_bytes = 0 + self.filtering_messages_before_publishing = False + self.is_anonymous_accessible = False + self.authorization_rules = AuthorizationRules() + self.status = u'' + self.created_at = u'' + self.updated_at = u'' + self.accessed_at = u'' + self.support_ordering = False + self.count_details = CountDetails() + self.subscription_count = 0 + +class CountDetails(WindowsAzureData): + + def __init__(self): + self.active_message_count = 0 + self.dead_letter_message_count = 0 + self.scheduled_message_count = 0 + self.transfer_message_count = 0 + self.transfer_dead_letter_message_count = 0 + +class NotificationHubDescription(WindowsAzureData): + + def __init__(self): + self.registration_ttl = u'' + self.authorization_rules = AuthorizationRules() + +class AuthorizationRules(WindowsAzureData): + + def __init__(self): + self.authorization_rule = _list_of(AuthorizationRule) + + def __iter__(self): + return iter(self.authorization_rule) + + def __len__(self): + return len(self.authorization_rule) + + def __getitem__(self, index): + return self.authorization_rule[index] + +class AuthorizationRule(WindowsAzureData): + + def __init__(self): + self.claim_type = u'' + self.claim_value = u'' + self.rights = _scalar_list_of(str, 'AccessRights') + self.created_time = u'' + self.modified_time = u'' + self.key_name = u'' + self.primary_key = u'' + self.secondary_keu = u'' + +class RelayDescription(WindowsAzureData): + + def __init__(self): + self.path = u'' + self.listener_type = u'' + self.listener_count = 0 + self.created_at = u'' + self.updated_at = u'' + + +class MetricResponses(WindowsAzureData): + + def __init__(self): + self.metric_response = _list_of(MetricResponse) + + def __iter__(self): + return iter(self.metric_response) + + def __len__(self): + return len(self.metric_response) + + def __getitem__(self, index): + return self.metric_response[index] + + +class MetricResponse(WindowsAzureData): + + def __init__(self): + self.code = u'' + self.data = Data() + self.message = u'' + + +class Data(WindowsAzureData): + + def __init__(self): + self.display_name = u'' + self.end_time = u'' + self.name = u'' + self.primary_aggregation_type = u'' + self.start_time = u'' + self.time_grain = u'' + self.unit = u'' + self.values = Values() + + +class Values(WindowsAzureData): + + def __init__(self): + self.metric_sample = _list_of(MetricSample) + + def __iter__(self): + return iter(self.metric_sample) + + def __len__(self): + return len(self.metric_sample) + + def __getitem__(self, index): + return self.metric_sample[index] + + +class MetricSample(WindowsAzureData): + + def __init__(self): + self.count = 0 + self.time_created = u'' + self.total = 0 + + +class MetricDefinitions(WindowsAzureData): + + def __init__(self): + self.metric_definition = _list_of(MetricDefinition) + + def __iter__(self): + return iter(self.metric_definition) + + def __len__(self): + return len(self.metric_definition) + + def __getitem__(self, index): + return self.metric_definition[index] + + +class MetricDefinition(WindowsAzureData): + + def __init__(self): + self.display_name = u'' + self.metric_availabilities = MetricAvailabilities() + self.name = u'' + self.primary_aggregation_type = u'' + self.unit = u'' + + +class MetricAvailabilities(WindowsAzureData): + + def __init__(self): + self.metric_availability = _list_of(MetricAvailability, 'MetricAvailabilily') + + def __iter__(self): + return iter(self.metric_availability) + + def __len__(self): + return len(self.metric_availability) + + def __getitem__(self, index): + return self.metric_availability[index] + + +class MetricAvailability(WindowsAzureData): + + def __init__(self): + self.retention = u'' + self.time_grain = u'' + + +class Servers(WindowsAzureData): + + def __init__(self): + self.server = _list_of(Server) + + def __iter__(self): + return iter(self.server) + + def __len__(self): + return len(self.server) + + def __getitem__(self, index): + return self.server[index] + + +class Server(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.administrator_login = u'' + self.location = u'' + self.geo_paired_region = u'' + self.fully_qualified_domain_name = u'' + self.version = u'' + + +class ServerQuota(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.type = u'' + self.state = u'' + self.self_link = u'' + self.parent_link = u'' + self.value = 0 + + +class EventLog(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.type = u'' + self.state = u'' + self.self_link = u'' + self.parent_link = u'' + self.database_name = u'' + self.name = u'' + self.start_time_utc = u'' + self.interval_size_in_minutes = 0 + self.event_category = u'' + self.event_type = u'' + self.event_subtype = 0 + self.event_subtype_description = u'' + self.number_of_events = 0 + self.severity = 0 + self.description = u'' + self.additional_data = u'' + + +class CreateServerResponse(WindowsAzureData): + + def __init__(self): + self.server_name = u'' + + +class Database(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.type = u'' + self.state = u'' + self.self_link = u'' + self.parent_link = u'' + self.id = 0 + self.edition = u'' + self.collation_name = u'' + self.creation_date = u'' + self.is_federation_root = False + self.is_system_object = False + self.max_size_bytes = 0 + + +class FirewallRule(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.type = u'' + self.state = u'' + self.self_link = u'' + self.parent_link = u'' + self.start_ip_address = u'' + self.end_ip_address = u'' + + +class ServiceObjective(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.type = u'' + self.state = u'' + self.self_link = u'' + self.parent_link = u'' + self.id = u'' + self.is_default = False + self.is_system = False + self.description = u'' + self.enabled = False + + +class CloudServices(WindowsAzureData): + + def __init__(self): + self.cloud_service = _list_of(CloudService) + + def __iter__(self): + return iter(self.cloud_service) + + def __len__(self): + return len(self.cloud_service) + + def __getitem__(self, index): + return self.cloud_service[index] + + +class CloudService(WindowsAzureData): + + def __init__(self): + self.name = u'' + self.label = u'' + self.description = u'' + self.geo_region = u'' + self.resources = Resources() + + +class Resources(WindowsAzureData): + + def __init__(self): + self.resource = _list_of(Resource) + + def __iter__(self): + return iter(self.resource) + + def __len__(self): + return len(self.resource) + + def __getitem__(self, index): + return self.resource[index] + + +class Resource(WindowsAzureData): + + def __init__(self): + self.resource_provider_namespace = u'' + self.type = u'' + self.name = u'' + self.schema_version = u'' + self.e_tag = u'' + self.state = u'' + self.intrinsic_settings = IntrinsicSettings() + self.operation_status = OperationStatus() + + +class IntrinsicSettings(WindowsAzureData): + + def __init__(self): + self.plan = u'' + self.quota = Quota() + + +class Quota(WindowsAzureData): + + def __init__(self): + self.max_job_count = 0 + self.max_recurrence = MaxRecurrence() + + +class MaxRecurrence(WindowsAzureData): + + def __init__(self): + self.frequency = u'' + self.interval = 0 + + +class OperationStatus(WindowsAzureData): + + def __init__(self): + self.type = u'' + self.result = u'' + + +def parse_response_for_async_op(response): + ''' Extracts request id from response header. ''' + + if response is None: + return None + + result = AsynchronousOperationResult() + if response.headers: + for name, value in response.headers: + if name.lower() == 'x-ms-request-id': + result.request_id = value + + return result + + +def _management_error_handler(http_error): + ''' Simple error handler for management service. ''' + return _general_error_handler(http_error) + + +def _lower(text): + return text.lower() + + +def _data_to_xml(data): + '''Creates an xml fragment from the specified data. + data: Array of tuples, where first: xml element name + second: xml element text + third: conversion function + ''' + xml = '' + for element in data: + name = element[0] + val = element[1] + if len(element) > 2: + converter = element[2] + else: + converter = None + + if val is not None: + if converter is not None: + text = _str(converter(_str(val))) + else: + text = _str(val) + + xml += ''.join(['<', name, '>', text, '']) + return xml + + +class _XmlSerializer(object): + + @staticmethod + def create_storage_service_input_to_xml(service_name, description, label, + affinity_group, location, + account_type, + extended_properties): + xml = _XmlSerializer.data_to_xml( + [('ServiceName', service_name), + ('Description', description), + ('Label', label, _encode_base64), + ('AffinityGroup', affinity_group), + ('Location', location)]) + if extended_properties is not None: + xml += _XmlSerializer.extended_properties_dict_to_xml_fragment( + extended_properties) + xml += _XmlSerializer.data_to_xml([('AccountType', account_type)]) + return _XmlSerializer.doc_from_xml('CreateStorageServiceInput', xml) + + @staticmethod + def update_storage_service_input_to_xml(description, label, + account_type, + extended_properties): + xml = _XmlSerializer.data_to_xml( + [('Description', description), + ('Label', label, _encode_base64)]) + if extended_properties is not None: + xml += _XmlSerializer.extended_properties_dict_to_xml_fragment( + extended_properties) + xml += _XmlSerializer.data_to_xml([('AccountType', account_type)]) + return _XmlSerializer.doc_from_xml('UpdateStorageServiceInput', xml) + + @staticmethod + def regenerate_keys_to_xml(key_type): + return _XmlSerializer.doc_from_data('RegenerateKeys', + [('KeyType', key_type)]) + + @staticmethod + def update_hosted_service_to_xml(label, description, extended_properties): + return _XmlSerializer.doc_from_data('UpdateHostedService', + [('Label', label, _encode_base64), + ('Description', description)], + extended_properties) + + @staticmethod + def create_hosted_service_to_xml(service_name, label, description, + location, affinity_group, + extended_properties): + return _XmlSerializer.doc_from_data( + 'CreateHostedService', + [('ServiceName', service_name), + ('Label', label, _encode_base64), + ('Description', description), + ('Location', location), + ('AffinityGroup', affinity_group)], + extended_properties) + + @staticmethod + def create_deployment_to_xml(name, package_url, label, configuration, + start_deployment, treat_warnings_as_error, + extended_properties): + return _XmlSerializer.doc_from_data( + 'CreateDeployment', + [('Name', name), + ('PackageUrl', package_url), + ('Label', label, _encode_base64), + ('Configuration', configuration), + ('StartDeployment', + start_deployment, _lower), + ('TreatWarningsAsError', treat_warnings_as_error, _lower)], + extended_properties) + + @staticmethod + def swap_deployment_to_xml(production, source_deployment): + return _XmlSerializer.doc_from_data( + 'Swap', + [('Production', production), + ('SourceDeployment', source_deployment)]) + + @staticmethod + def update_deployment_status_to_xml(status): + return _XmlSerializer.doc_from_data( + 'UpdateDeploymentStatus', + [('Status', status)]) + + @staticmethod + def change_deployment_to_xml(configuration, treat_warnings_as_error, mode, + extended_properties): + return _XmlSerializer.doc_from_data( + 'ChangeConfiguration', + [('Configuration', configuration), + ('TreatWarningsAsError', treat_warnings_as_error, _lower), + ('Mode', mode)], + extended_properties) + + @staticmethod + def upgrade_deployment_to_xml(mode, package_url, configuration, label, + role_to_upgrade, force, extended_properties): + return _XmlSerializer.doc_from_data( + 'UpgradeDeployment', + [('Mode', mode), + ('PackageUrl', package_url), + ('Configuration', configuration), + ('Label', label, _encode_base64), + ('RoleToUpgrade', role_to_upgrade), + ('Force', force, _lower)], + extended_properties) + + @staticmethod + def rollback_upgrade_to_xml(mode, force): + return _XmlSerializer.doc_from_data( + 'RollbackUpdateOrUpgrade', + [('Mode', mode), + ('Force', force, _lower)]) + + @staticmethod + def walk_upgrade_domain_to_xml(upgrade_domain): + return _XmlSerializer.doc_from_data( + 'WalkUpgradeDomain', + [('UpgradeDomain', upgrade_domain)]) + + @staticmethod + def certificate_file_to_xml(data, certificate_format, password): + return _XmlSerializer.doc_from_data( + 'CertificateFile', + [('Data', data), + ('CertificateFormat', certificate_format), + ('Password', password)]) + + @staticmethod + def create_affinity_group_to_xml(name, label, description, location): + return _XmlSerializer.doc_from_data( + 'CreateAffinityGroup', + [('Name', name), + ('Label', label, _encode_base64), + ('Description', description), + ('Location', location)]) + + @staticmethod + def update_affinity_group_to_xml(label, description): + return _XmlSerializer.doc_from_data( + 'UpdateAffinityGroup', + [('Label', label, _encode_base64), + ('Description', description)]) + + @staticmethod + def subscription_certificate_to_xml(public_key, thumbprint, data): + return _XmlSerializer.doc_from_data( + 'SubscriptionCertificate', + [('SubscriptionCertificatePublicKey', public_key), + ('SubscriptionCertificateThumbprint', thumbprint), + ('SubscriptionCertificateData', data)]) + + @staticmethod + def os_image_to_xml(label, media_link, name, os): + return _XmlSerializer.doc_from_data( + 'OSImage', + [('Label', label), + ('MediaLink', media_link), + ('Name', name), + ('OS', os)]) + + @staticmethod + def data_virtual_hard_disk_to_xml(host_caching, disk_label, disk_name, lun, + logical_disk_size_in_gb, media_link, + source_media_link): + return _XmlSerializer.doc_from_data( + 'DataVirtualHardDisk', + [('HostCaching', host_caching), + ('DiskLabel', disk_label), + ('DiskName', disk_name), + ('Lun', lun), + ('LogicalDiskSizeInGB', logical_disk_size_in_gb), + ('MediaLink', media_link), + ('SourceMediaLink', source_media_link)]) + + @staticmethod + def disk_to_xml(has_operating_system, label, media_link, name, os): + return _XmlSerializer.doc_from_data( + 'Disk', + [('HasOperatingSystem', has_operating_system, _lower), + ('Label', label), + ('MediaLink', media_link), + ('Name', name), + ('OS', os)]) + + @staticmethod + def restart_role_operation_to_xml(): + return _XmlSerializer.doc_from_xml( + 'RestartRoleOperation', + 'RestartRoleOperation') + + @staticmethod + def shutdown_role_operation_to_xml(post_shutdown_action): + xml = _XmlSerializer.data_to_xml( + [('OperationType', 'ShutdownRoleOperation'), + ('PostShutdownAction', post_shutdown_action)]) + return _XmlSerializer.doc_from_xml('ShutdownRoleOperation', xml) + + @staticmethod + def shutdown_roles_operation_to_xml(role_names, post_shutdown_action): + xml = _XmlSerializer.data_to_xml( + [('OperationType', 'ShutdownRolesOperation')]) + xml += '' + for role_name in role_names: + xml += _XmlSerializer.data_to_xml([('Name', role_name)]) + xml += '' + xml += _XmlSerializer.data_to_xml( + [('PostShutdownAction', post_shutdown_action)]) + return _XmlSerializer.doc_from_xml('ShutdownRolesOperation', xml) + + @staticmethod + def start_role_operation_to_xml(): + return _XmlSerializer.doc_from_xml( + 'StartRoleOperation', + 'StartRoleOperation') + + @staticmethod + def start_roles_operation_to_xml(role_names): + xml = _XmlSerializer.data_to_xml( + [('OperationType', 'StartRolesOperation')]) + xml += '' + for role_name in role_names: + xml += _XmlSerializer.data_to_xml([('Name', role_name)]) + xml += '' + return _XmlSerializer.doc_from_xml('StartRolesOperation', xml) + + @staticmethod + def windows_configuration_to_xml(configuration): + xml = _XmlSerializer.data_to_xml( + [('ConfigurationSetType', configuration.configuration_set_type), + ('ComputerName', configuration.computer_name), + ('AdminPassword', configuration.admin_password), + ('ResetPasswordOnFirstLogon', + configuration.reset_password_on_first_logon, + _lower), + ('EnableAutomaticUpdates', + configuration.enable_automatic_updates, + _lower), + ('TimeZone', configuration.time_zone)]) + + if configuration.domain_join is not None: + xml += '' + xml += '' + xml += _XmlSerializer.data_to_xml( + [('Domain', configuration.domain_join.credentials.domain), + ('Username', configuration.domain_join.credentials.username), + ('Password', configuration.domain_join.credentials.password)]) + xml += '' + xml += _XmlSerializer.data_to_xml( + [('JoinDomain', configuration.domain_join.join_domain), + ('MachineObjectOU', + configuration.domain_join.machine_object_ou)]) + xml += '' + if configuration.stored_certificate_settings is not None: + xml += '' + for cert in configuration.stored_certificate_settings: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('StoreLocation', cert.store_location), + ('StoreName', cert.store_name), + ('Thumbprint', cert.thumbprint)]) + xml += '' + xml += '' + if configuration.win_rm is not None: + xml += '' + for listener in configuration.win_rm.listeners: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('Protocol', listener.protocol), + ('CertificateThumbprint', listener.certificate_thumbprint)]) + xml += '' + xml += '' + xml += _XmlSerializer.data_to_xml( + [('AdminUsername', configuration.admin_username), + ('CustomData', configuration.custom_data, _encode_base64)]) + if configuration.additional_unattend_content and configuration.additional_unattend_content.passes: + xml += '' + for unattend_pass in configuration.additional_unattend_content.passes: + xml += _XmlSerializer.data_to_xml( + [('PassName', unattend_pass.pass_name)]) + if unattend_pass.components: + xml += '' + for comp in unattend_pass.components: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('ComponentName', comp.component_name)]) + if comp.component_settings: + xml += '' + for setting in comp.component_settings: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('SettingName', setting.setting_name), + ('Content', setting.content)]) + xml += '' + xml += '' + xml += '' + xml += '' + xml += '' + + return xml + + @staticmethod + def linux_configuration_to_xml(configuration): + xml = _XmlSerializer.data_to_xml( + [('ConfigurationSetType', configuration.configuration_set_type), + ('HostName', configuration.host_name), + ('UserName', configuration.user_name), + ('UserPassword', configuration.user_password), + ('DisableSshPasswordAuthentication', + configuration.disable_ssh_password_authentication, + _lower)]) + + if configuration.ssh is not None: + xml += '' + xml += '' + for key in configuration.ssh.public_keys: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('Fingerprint', key.fingerprint), + ('Path', key.path)]) + xml += '' + xml += '' + xml += '' + for key in configuration.ssh.key_pairs: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('Fingerprint', key.fingerprint), + ('Path', key.path)]) + xml += '' + xml += '' + xml += '' + + xml += _XmlSerializer.data_to_xml( + [('CustomData', configuration.custom_data, _encode_base64)]) + + return xml + + @staticmethod + def network_configuration_to_xml(configuration): + xml = _XmlSerializer.data_to_xml( + [('ConfigurationSetType', configuration.configuration_set_type)]) + xml += '' + for endpoint in configuration.input_endpoints: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('LoadBalancedEndpointSetName', + endpoint.load_balanced_endpoint_set_name), + ('LocalPort', endpoint.local_port), + ('Name', endpoint.name), + ('Port', endpoint.port)]) + + if endpoint.load_balancer_probe.path or\ + endpoint.load_balancer_probe.port or\ + endpoint.load_balancer_probe.protocol: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('Path', endpoint.load_balancer_probe.path), + ('Port', endpoint.load_balancer_probe.port), + ('Protocol', endpoint.load_balancer_probe.protocol)]) + xml += '' + + xml += _XmlSerializer.data_to_xml( + [('Protocol', endpoint.protocol), + ('EnableDirectServerReturn', + endpoint.enable_direct_server_return, + _lower)]) + + xml += '' + xml += '' + xml += '' + for name in configuration.subnet_names: + xml += _XmlSerializer.data_to_xml([('SubnetName', name)]) + xml += '' + + if configuration.public_ips: + xml += '' + for public_ip in configuration.public_ips: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('Name', public_ip.name), + ('IdleTimeoutInMinutes', public_ip.idle_timeout_in_minutes)]) + xml += '' + xml += '' + + return xml + + @staticmethod + def role_to_xml(availability_set_name, data_virtual_hard_disks, + network_configuration_set, os_virtual_hard_disk, role_name, + role_size, role_type, system_configuration_set, + resource_extension_references, + provision_guest_agent, vm_image_name, media_location): + xml = _XmlSerializer.data_to_xml([('RoleName', role_name), + ('RoleType', role_type)]) + + if system_configuration_set or network_configuration_set: + xml += '' + + if system_configuration_set is not None: + xml += '' + if isinstance(system_configuration_set, WindowsConfigurationSet): + xml += _XmlSerializer.windows_configuration_to_xml( + system_configuration_set) + elif isinstance(system_configuration_set, LinuxConfigurationSet): + xml += _XmlSerializer.linux_configuration_to_xml( + system_configuration_set) + xml += '' + + if network_configuration_set is not None: + xml += '' + xml += _XmlSerializer.network_configuration_to_xml( + network_configuration_set) + xml += '' + + xml += '' + + if resource_extension_references: + xml += '' + for ext in resource_extension_references: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('ReferenceName', ext.reference_name), + ('Publisher', ext.publisher), + ('Name', ext.name), + ('Version', ext.version)]) + if ext.resource_extension_parameter_values: + xml += '' + for val in ext.resource_extension_parameter_values: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('Key', val.key), + ('Value', val.value), + ('Type', val.type)]) + xml += '' + xml += '' + xml += '' + xml += '' + + xml += _XmlSerializer.data_to_xml( + [('VMImageName', vm_image_name), + ('MediaLocation', media_location), + ('AvailabilitySetName', availability_set_name)]) + + if data_virtual_hard_disks is not None: + xml += '' + for hd in data_virtual_hard_disks: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('HostCaching', hd.host_caching), + ('DiskLabel', hd.disk_label), + ('DiskName', hd.disk_name), + ('Lun', hd.lun), + ('LogicalDiskSizeInGB', hd.logical_disk_size_in_gb), + ('MediaLink', hd.media_link)]) + xml += '' + xml += '' + + if os_virtual_hard_disk is not None: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('HostCaching', os_virtual_hard_disk.host_caching), + ('DiskLabel', os_virtual_hard_disk.disk_label), + ('DiskName', os_virtual_hard_disk.disk_name), + ('MediaLink', os_virtual_hard_disk.media_link), + ('SourceImageName', os_virtual_hard_disk.source_image_name), + ('OS', os_virtual_hard_disk.os), + ('RemoteSourceImageLink', os_virtual_hard_disk.remote_source_image_link)]) + xml += '' + + xml += _XmlSerializer.data_to_xml( + [('RoleSize', role_size), + ('ProvisionGuestAgent', provision_guest_agent, _lower)]) + + return xml + + @staticmethod + def add_role_to_xml(role_name, system_configuration_set, + os_virtual_hard_disk, role_type, + network_configuration_set, availability_set_name, + data_virtual_hard_disks, role_size, + resource_extension_references, provision_guest_agent, + vm_image_name, media_location): + xml = _XmlSerializer.role_to_xml( + availability_set_name, + data_virtual_hard_disks, + network_configuration_set, + os_virtual_hard_disk, + role_name, + role_size, + role_type, + system_configuration_set, + resource_extension_references, + provision_guest_agent, + vm_image_name, + media_location) + return _XmlSerializer.doc_from_xml('PersistentVMRole', xml) + + @staticmethod + def update_role_to_xml(role_name, os_virtual_hard_disk, role_type, + network_configuration_set, availability_set_name, + data_virtual_hard_disks, role_size, + resource_extension_references, + provision_guest_agent): + xml = _XmlSerializer.role_to_xml( + availability_set_name, + data_virtual_hard_disks, + network_configuration_set, + os_virtual_hard_disk, + role_name, + role_size, + role_type, + None, + resource_extension_references, + provision_guest_agent, + None, + None) + return _XmlSerializer.doc_from_xml('PersistentVMRole', xml) + + @staticmethod + def capture_role_to_xml(post_capture_action, target_image_name, + target_image_label, provisioning_configuration): + xml = _XmlSerializer.data_to_xml( + [('OperationType', 'CaptureRoleOperation'), + ('PostCaptureAction', post_capture_action)]) + + if provisioning_configuration is not None: + xml += '' + if isinstance(provisioning_configuration, WindowsConfigurationSet): + xml += _XmlSerializer.windows_configuration_to_xml( + provisioning_configuration) + elif isinstance(provisioning_configuration, LinuxConfigurationSet): + xml += _XmlSerializer.linux_configuration_to_xml( + provisioning_configuration) + xml += '' + + xml += _XmlSerializer.data_to_xml( + [('TargetImageLabel', target_image_label), + ('TargetImageName', target_image_name)]) + + return _XmlSerializer.doc_from_xml('CaptureRoleOperation', xml) + + @staticmethod + def virtual_machine_deployment_to_xml(deployment_name, deployment_slot, + label, role_name, + system_configuration_set, + os_virtual_hard_disk, role_type, + network_configuration_set, + availability_set_name, + data_virtual_hard_disks, role_size, + virtual_network_name, + resource_extension_references, + provision_guest_agent, + vm_image_name, + media_location, + dns_servers, + reserved_ip_name): + xml = _XmlSerializer.data_to_xml([('Name', deployment_name), + ('DeploymentSlot', deployment_slot), + ('Label', label)]) + xml += '' + xml += '' + xml += _XmlSerializer.role_to_xml( + availability_set_name, + data_virtual_hard_disks, + network_configuration_set, + os_virtual_hard_disk, + role_name, + role_size, + role_type, + system_configuration_set, + resource_extension_references, + provision_guest_agent, + vm_image_name, + media_location) + xml += '' + xml += '' + + xml += _XmlSerializer.data_to_xml( + [('VirtualNetworkName', virtual_network_name)]) + + if dns_servers: + xml += '' + for dns_server in dns_servers: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('Name', dns_server.name), + ('Address', dns_server.address)]) + xml += '' + xml += '' + + xml += _XmlSerializer.data_to_xml( + [('ReservedIPName', reserved_ip_name)]) + + return _XmlSerializer.doc_from_xml('Deployment', xml) + + @staticmethod + def capture_vm_image_to_xml(options): + return _XmlSerializer.doc_from_data( + 'CaptureRoleAsVMImageOperation ', + [('OperationType', 'CaptureRoleAsVMImageOperation'), + ('OSState', options.os_state), + ('VMImageName', options.vm_image_name), + ('VMImageLabel', options.vm_image_label), + ('Description', options.description), + ('Language', options.language), + ('ImageFamily', options.image_family), + ('RecommendedVMSize', options.recommended_vm_size)]) + + @staticmethod + def create_vm_image_to_xml(image): + xml = _XmlSerializer.data_to_xml( + [('Name', image.name), + ('Label', image.label), + ('Description', image.description)]) + + os_disk = image.os_disk_configuration + xml += '' + xml += _XmlSerializer.data_to_xml( + [('HostCaching', os_disk.host_caching), + ('OSState', os_disk.os_state), + ('OS', os_disk.os), + ('MediaLink', os_disk.media_link)]) + xml += '' + + if image.data_disk_configurations: + xml += '' + for data_disk in image.data_disk_configurations: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('HostCaching', data_disk.host_caching), + ('Lun', data_disk.lun), + ('MediaLink', data_disk.media_link), + ('LogicalDiskSizeInGB', data_disk.logical_disk_size_in_gb)]) + xml += '' + xml += '' + + xml += _XmlSerializer.data_to_xml( + [('Language', image.language), + ('ImageFamily', image.image_family), + ('RecommendedVMSize', image.recommended_vm_size), + ('Eula', image.eula), + ('IconUri', image.icon_uri), + ('SmallIconUri', image.small_icon_uri), + ('PrivacyUri', image.privacy_uri), + ('PublishedDate', image.published_date), + ('ShowInGui', image.show_in_gui, _lower)]) + + return _XmlSerializer.doc_from_xml('VMImage', xml) + + @staticmethod + def update_vm_image_to_xml(image): + xml = _XmlSerializer.data_to_xml( + [('Label', image.label), + ('Description', image.description)]) + + os_disk = image.os_disk_configuration + xml += '' + xml += _XmlSerializer.data_to_xml( + [('HostCaching', os_disk.host_caching)]) + xml += '' + + xml += '' + for data_disk in image.data_disk_configurations: + xml += '' + xml += _XmlSerializer.data_to_xml( + [('Name', data_disk.name), + ('HostCaching', data_disk.host_caching), + ('Lun', data_disk.lun)]) + xml += '' + xml += '' + + xml += _XmlSerializer.data_to_xml( + [('Language', image.language), + ('ImageFamily', image.image_family), + ('RecommendedVMSize', image.recommended_vm_size), + ('Eula', image.eula), + ('IconUri', image.icon_uri), + ('SmallIconUri', image.small_icon_uri), + ('PrivacyUri', image.privacy_uri), + ('PublishedDate', image.published_date), + ('ShowInGui', image.show_in_gui, _lower)]) + + return _XmlSerializer.doc_from_xml('VMImage', xml) + + @staticmethod + def create_website_to_xml(webspace_name, website_name, geo_region, plan, + host_names, compute_mode, server_farm, site_mode): + xml = '' + for host_name in host_names: + xml += '{0}'.format(host_name) + xml += '' + xml += _XmlSerializer.data_to_xml( + [('Name', website_name), + ('ComputeMode', compute_mode), + ('ServerFarm', server_farm), + ('SiteMode', site_mode)]) + xml += '' + xml += _XmlSerializer.data_to_xml( + [('GeoRegion', geo_region), + ('Name', webspace_name), + ('Plan', plan)]) + xml += '' + return _XmlSerializer.doc_from_xml('Site', xml) + + @staticmethod + def create_reserved_ip_to_xml(name, label, location): + return _XmlSerializer.doc_from_data( + 'ReservedIP', + [('Name', name), + ('Label', label), + ('Location', location)]) + + @staticmethod + def dns_server_to_xml(name, address): + return _XmlSerializer.doc_from_data( + 'DnsServer', + [('Name', name), + ('Address', address)]) + + @staticmethod + def role_instances_to_xml(role_instances): + xml = '' + for name in role_instances: + xml += _XmlSerializer.data_to_xml([('Name', name)]) + return _XmlSerializer.doc_from_xml('RoleInstances ', xml) + + @staticmethod + def data_to_xml(data): + return _data_to_xml(data) + + @staticmethod + def doc_from_xml(document_element_name, inner_xml): + '''Wraps the specified xml in an xml root element with default azure + namespaces''' + xml = ''.join(['<', document_element_name, + ' xmlns:i="http://www.w3.org/2001/XMLSchema-instance"', + ' xmlns="http://schemas.microsoft.com/windowsazure">']) + xml += inner_xml + xml += ''.join(['']) + return xml + + @staticmethod + def doc_from_data(document_element_name, data, extended_properties=None): + xml = _XmlSerializer.data_to_xml(data) + if extended_properties is not None: + xml += _XmlSerializer.extended_properties_dict_to_xml_fragment( + extended_properties) + return _XmlSerializer.doc_from_xml(document_element_name, xml) + + @staticmethod + def extended_properties_dict_to_xml_fragment(extended_properties): + xml = '' + if extended_properties is not None and len(extended_properties) > 0: + xml += '' + for key, val in extended_properties.items(): + xml += ''.join(['', + '', + _str(key), + '', + '', + _str(val), + '', + '']) + xml += '' + return xml + + +class _SqlManagementXmlSerializer(object): + + @staticmethod + def create_server_to_xml(admin_login, admin_password, location): + return _SqlManagementXmlSerializer.doc_from_data( + 'Server', + [('AdministratorLogin', admin_login), + ('AdministratorLoginPassword', admin_password), + ('Location', location)], + 'http://schemas.microsoft.com/sqlazure/2010/12/') + + @staticmethod + def set_server_admin_password_to_xml(admin_password): + return _SqlManagementXmlSerializer.doc_from_xml( + 'AdministratorLoginPassword', admin_password, + 'http://schemas.microsoft.com/sqlazure/2010/12/') + + @staticmethod + def create_firewall_rule_to_xml(name, start_ip_address, end_ip_address): + return _SqlManagementXmlSerializer.doc_from_data( + 'ServiceResource', + [('Name', name), + ('StartIPAddress', start_ip_address), + ('EndIPAddress', end_ip_address)]) + + @staticmethod + def update_firewall_rule_to_xml(name, start_ip_address, end_ip_address): + return _SqlManagementXmlSerializer.doc_from_data( + 'ServiceResource', + [('Name', name), + ('StartIPAddress', start_ip_address), + ('EndIPAddress', end_ip_address)]) + + @staticmethod + def create_database_to_xml(name, service_objective_id, edition, collation_name, + max_size_bytes): + return _SqlManagementXmlSerializer.doc_from_data( + 'ServiceResource', + [('Name', name), + ('Edition', edition), + ('CollationName', collation_name), + ('MaxSizeBytes', max_size_bytes), + ('ServiceObjectiveId', service_objective_id)]) + + @staticmethod + def update_database_to_xml(name, service_objective_id, edition, + max_size_bytes): + return _SqlManagementXmlSerializer.doc_from_data( + 'ServiceResource', + [('Name', name), + ('Edition', edition), + ('MaxSizeBytes', max_size_bytes), + ('ServiceObjectiveId', service_objective_id)]) + + @staticmethod + def xml_to_create_server_response(xmlstr): + xmldoc = minidom.parseString(xmlstr) + element = xmldoc.documentElement + + response = CreateServerResponse() + response.server_name = element.firstChild.nodeValue + response.fully_qualified_domain_name = element.getAttribute('FullyQualifiedDomainName') + + return response + + @staticmethod + def data_to_xml(data): + return _data_to_xml(data) + + @staticmethod + def doc_from_xml(document_element_name, inner_xml, + xmlns='http://schemas.microsoft.com/windowsazure'): + '''Wraps the specified xml in an xml root element with default azure + namespaces''' + xml = ''.join(['<', document_element_name, + ' xmlns="{0}">'.format(xmlns)]) + xml += inner_xml + xml += ''.join(['']) + return xml + + @staticmethod + def doc_from_data(document_element_name, data, + xmlns='http://schemas.microsoft.com/windowsazure'): + xml = _SqlManagementXmlSerializer.data_to_xml(data) + return _SqlManagementXmlSerializer.doc_from_xml( + document_element_name, xml, xmlns) + + +def _parse_bool(value): + if value.lower() == 'true': + return True + return False + + +class _ServiceBusManagementXmlSerializer(object): + + @staticmethod + def namespace_to_xml(region): + '''Converts a service bus namespace description to xml + + The xml format: + + + + + West US + + + + ''' + body = '' + body += ''.join(['', region, '']) + body += '' + + return _create_entry(body) + + @staticmethod + def xml_to_namespace(xmlstr): + '''Converts xml response to service bus namespace + + The xml format for namespace: + +uuid:00000000-0000-0000-0000-000000000000;id=0000000 +myunittests +2012-08-22T16:48:10Z + + + myunittests + West US + 0000000000000000000000000000000000000000000= + Active + 2012-08-22T16:48:10.217Z + https://myunittests-sb.accesscontrol.windows.net/ + https://myunittests.servicebus.windows.net/ + Endpoint=sb://myunittests.servicebus.windows.net/;SharedSecretIssuer=owner;SharedSecretValue=0000000000000000000000000000000000000000000= + 00000000000000000000000000000000 + true + + + + ''' + xmldoc = minidom.parseString(xmlstr) + namespace = ServiceBusNamespace() + + mappings = ( + ('Name', 'name', None), + ('Region', 'region', None), + ('DefaultKey', 'default_key', None), + ('Status', 'status', None), + ('CreatedAt', 'created_at', None), + ('AcsManagementEndpoint', 'acs_management_endpoint', None), + ('ServiceBusEndpoint', 'servicebus_endpoint', None), + ('ConnectionString', 'connection_string', None), + ('SubscriptionId', 'subscription_id', None), + ('Enabled', 'enabled', _parse_bool), + ) + + for desc in _get_children_from_path(xmldoc, + 'entry', + 'content', + 'NamespaceDescription'): + for xml_name, field_name, conversion_func in mappings: + node_value = _get_first_child_node_value(desc, xml_name) + if node_value is not None: + if conversion_func is not None: + node_value = conversion_func(node_value) + setattr(namespace, field_name, node_value) + + return namespace + + @staticmethod + def xml_to_region(xmlstr): + '''Converts xml response to service bus region + + The xml format for region: + +uuid:157c311f-081f-4b4a-a0ba-a8f990ffd2a3;id=1756759 + +2013-04-10T18:25:29Z + + + East Asia + East Asia + + + + ''' + xmldoc = minidom.parseString(xmlstr) + region = ServiceBusRegion() + + for desc in _get_children_from_path(xmldoc, 'entry', 'content', + 'RegionCodeDescription'): + node_value = _get_first_child_node_value(desc, 'Code') + if node_value is not None: + region.code = node_value + node_value = _get_first_child_node_value(desc, 'FullName') + if node_value is not None: + region.fullname = node_value + + return region + + @staticmethod + def xml_to_namespace_availability(xmlstr): + '''Converts xml response to service bus namespace availability + + The xml format: + + + uuid:9fc7c652-1856-47ab-8d74-cd31502ea8e6;id=3683292 + + 2013-04-16T03:03:37Z + + + false + + + + ''' + xmldoc = minidom.parseString(xmlstr) + availability = AvailabilityResponse() + + for desc in _get_children_from_path(xmldoc, 'entry', 'content', + 'NamespaceAvailability'): + node_value = _get_first_child_node_value(desc, 'Result') + if node_value is not None: + availability.result = _parse_bool(node_value) + + return availability + + @staticmethod + def odata_converter(data, str_type): + ''' Convert odata type + http://www.odata.org/documentation/odata-version-2-0/overview#AbstractTypeSystem + To be completed + ''' + if not str_type: + return _str(data) + if str_type in ["Edm.Single", "Edm.Double"]: + return float(data) + elif "Edm.Int" in str_type: + return int(data) + else: + return _str(data) + + @staticmethod + def xml_to_metrics(xmlstr, object_type): + '''Converts xml response to service bus metrics objects + + The xml format for MetricProperties + + https://sbgm.windows.net/Metrics(\'listeners.active\') + + <updated>2014-10-09T11:56:50Z</updated> + <author> + <name/> + </author> + <content type="application/xml"> + <m:properties> + <d:Name>listeners.active</d:Name> + <d:PrimaryAggregation>Average</d:PrimaryAggregation> + <d:Unit>Count</d:Unit> + <d:DisplayName>Active listeners</d:DisplayName> + </m:properties> + </content> +</entry> + + The xml format for MetricValues + <entry> + <id>https://sbgm.windows.net/MetricValues(datetime\'2014-10-02T00:00:00Z\')</id> + <title/> + <updated>2014-10-09T18:38:28Z</updated> + <author> + <name/> + </author> + <content type="application/xml"> + <m:properties> + <d:Timestamp m:type="Edm.DateTime">2014-10-02T00:00:00Z</d:Timestamp> + <d:Min m:type="Edm.Int64">-118</d:Min> + <d:Max m:type="Edm.Int64">15</d:Max> + <d:Average m:type="Edm.Single">-78.44444</d:Average> + <d:Total m:type="Edm.Int64">0</d:Total> + </m:properties> + </content> + </entry> + ''' + + xmldoc = minidom.parseString(xmlstr) + return_obj = object_type() + + members = dict(vars(return_obj)) + + # Only one entry here + for xml_entry in _get_children_from_path(xmldoc, + 'entry'): + for node in _get_children_from_path(xml_entry, + 'content', + 'm:properties'): + for name in members: + xml_name = "d:" + _get_serialization_name(name) + children = _get_child_nodes(node, xml_name) + if not children: + continue + child = children[0] + node_type = child.getAttributeNS("http://schemas.microsoft.com/ado/2007/08/dataservices/metadata", 'type') + node_value = _ServiceBusManagementXmlSerializer.odata_converter(child.firstChild.nodeValue, node_type) + setattr(return_obj, name, node_value) + for name, value in _get_entry_properties_from_node(xml_entry, + include_id=True, + use_title_as_id=False).items(): + if name in members: + continue # Do not override if already members + setattr(return_obj, name, value) + return return_obj + +from azure.servicemanagement.servicemanagementservice import ( + ServiceManagementService) +from azure.servicemanagement.servicebusmanagementservice import ( + ServiceBusManagementService) +from azure.servicemanagement.websitemanagementservice import ( + WebsiteManagementService) diff --git a/awx/lib/site-packages/azure/servicemanagement/schedulermanagementservice.py b/awx/lib/site-packages/azure/servicemanagement/schedulermanagementservice.py new file mode 100644 index 0000000000..ee57b6f2ed --- /dev/null +++ b/awx/lib/site-packages/azure/servicemanagement/schedulermanagementservice.py @@ -0,0 +1,70 @@ +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +from azure import ( + MANAGEMENT_HOST, + _str + ) +from azure.servicemanagement import ( + CloudServices, + ) +from azure.servicemanagement.servicemanagementclient import ( + _ServiceManagementClient, + ) + +class SchedulerManagementService(_ServiceManagementClient): + ''' Note that this class is a preliminary work on Scheduler + management. Since it lack a lot a features, final version + can be slightly different from the current one. + ''' + + def __init__(self, subscription_id=None, cert_file=None, + host=MANAGEMENT_HOST, request_session=None): + ''' + Initializes the scheduler management service. + + subscription_id: Subscription to manage. + cert_file: + Path to .pem certificate file (httplib), or location of the + certificate in your Personal certificate store (winhttp) in the + CURRENT_USER\my\CertificateName format. + If a request_session is specified, then this is unused. + host: Live ServiceClient URL. Defaults to Azure public cloud. + request_session: + Session object to use for http requests. If this is specified, it + replaces the default use of httplib or winhttp. Also, the cert_file + parameter is unused when a session is passed in. + The session object handles authentication, and as such can support + multiple types of authentication: .pem certificate, oauth. + For example, you can pass in a Session instance from the requests + library. To use .pem certificate authentication with requests + library, set the path to the .pem file on the session.cert + attribute. + ''' + super(SchedulerManagementService, self).__init__( + subscription_id, cert_file, host, request_session) + + #--Operations for scheduler ---------------------------------------- + def list_cloud_services(self): + ''' + List the cloud services for scheduling defined on the account. + ''' + return self._perform_get(self._get_list_cloud_services_path(), + CloudServices) + + + #--Helper functions -------------------------------------------------- + def _get_list_cloud_services_path(self): + return self._get_path('cloudservices', None) + diff --git a/awx/lib/site-packages/azure/servicemanagement/servicebusmanagementservice.py b/awx/lib/site-packages/azure/servicemanagement/servicebusmanagementservice.py index 51d734e367..6008e171be 100644 --- a/awx/lib/site-packages/azure/servicemanagement/servicebusmanagementservice.py +++ b/awx/lib/site-packages/azure/servicemanagement/servicebusmanagementservice.py @@ -1,113 +1,534 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -from azure import ( - MANAGEMENT_HOST, - _convert_response_to_feeds, - _str, - _validate_not_none, - ) -from azure.servicemanagement import ( - _ServiceBusManagementXmlSerializer, - ) -from azure.servicemanagement.servicemanagementclient import ( - _ServiceManagementClient, - ) - - -class ServiceBusManagementService(_ServiceManagementClient): - - def __init__(self, subscription_id=None, cert_file=None, - host=MANAGEMENT_HOST): - super(ServiceBusManagementService, self).__init__( - subscription_id, cert_file, host) - - #--Operations for service bus ---------------------------------------- - def get_regions(self): - ''' - Get list of available service bus regions. - ''' - response = self._perform_get( - self._get_path('services/serviceBus/Regions/', None), - None) - - return _convert_response_to_feeds( - response, - _ServiceBusManagementXmlSerializer.xml_to_region) - - def list_namespaces(self): - ''' - List the service bus namespaces defined on the account. - ''' - response = self._perform_get( - self._get_path('services/serviceBus/Namespaces/', None), - None) - - return _convert_response_to_feeds( - response, - _ServiceBusManagementXmlSerializer.xml_to_namespace) - - def get_namespace(self, name): - ''' - Get details about a specific namespace. - - name: Name of the service bus namespace. - ''' - response = self._perform_get( - self._get_path('services/serviceBus/Namespaces', name), - None) - - return _ServiceBusManagementXmlSerializer.xml_to_namespace( - response.body) - - def create_namespace(self, name, region): - ''' - Create a new service bus namespace. - - name: Name of the service bus namespace to create. - region: Region to create the namespace in. - ''' - _validate_not_none('name', name) - - return self._perform_put( - self._get_path('services/serviceBus/Namespaces', name), - _ServiceBusManagementXmlSerializer.namespace_to_xml(region)) - - def delete_namespace(self, name): - ''' - Delete a service bus namespace. - - name: Name of the service bus namespace to delete. - ''' - _validate_not_none('name', name) - - return self._perform_delete( - self._get_path('services/serviceBus/Namespaces', name), - None) - - def check_namespace_availability(self, name): - ''' - Checks to see if the specified service bus namespace is available, or - if it has already been taken. - - name: Name of the service bus namespace to validate. - ''' - _validate_not_none('name', name) - - response = self._perform_get( - self._get_path('services/serviceBus/CheckNamespaceAvailability', - None) + '/?namespace=' + _str(name), None) - - return _ServiceBusManagementXmlSerializer.xml_to_namespace_availability( - response.body) +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +from azure import ( + MANAGEMENT_HOST, + _convert_response_to_feeds, + _str, + _validate_not_none, + _convert_xml_to_windows_azure_object, +) +from azure.servicemanagement import ( + _ServiceBusManagementXmlSerializer, + QueueDescription, + TopicDescription, + NotificationHubDescription, + RelayDescription, + MetricProperties, + MetricValues, + MetricRollups, +) +from azure.servicemanagement.servicemanagementclient import ( + _ServiceManagementClient, +) + +from functools import partial + +X_MS_VERSION = '2012-03-01' + +class ServiceBusManagementService(_ServiceManagementClient): + + def __init__(self, subscription_id=None, cert_file=None, + host=MANAGEMENT_HOST, request_session=None): + ''' + Initializes the service bus management service. + + subscription_id: Subscription to manage. + cert_file: + Path to .pem certificate file (httplib), or location of the + certificate in your Personal certificate store (winhttp) in the + CURRENT_USER\my\CertificateName format. + If a request_session is specified, then this is unused. + host: Live ServiceClient URL. Defaults to Azure public cloud. + request_session: + Session object to use for http requests. If this is specified, it + replaces the default use of httplib or winhttp. Also, the cert_file + parameter is unused when a session is passed in. + The session object handles authentication, and as such can support + multiple types of authentication: .pem certificate, oauth. + For example, you can pass in a Session instance from the requests + library. To use .pem certificate authentication with requests + library, set the path to the .pem file on the session.cert + attribute. + ''' + super(ServiceBusManagementService, self).__init__( + subscription_id, cert_file, host, request_session) + self.x_ms_version = X_MS_VERSION + + # Operations for service bus ---------------------------------------- + def get_regions(self): + ''' + Get list of available service bus regions. + ''' + response = self._perform_get( + self._get_path('services/serviceBus/Regions/', None), + None) + + return _convert_response_to_feeds( + response, + _ServiceBusManagementXmlSerializer.xml_to_region) + + def list_namespaces(self): + ''' + List the service bus namespaces defined on the account. + ''' + response = self._perform_get( + self._get_path('services/serviceBus/Namespaces/', None), + None) + + return _convert_response_to_feeds( + response, + _ServiceBusManagementXmlSerializer.xml_to_namespace) + + def get_namespace(self, name): + ''' + Get details about a specific namespace. + + name: Name of the service bus namespace. + ''' + response = self._perform_get( + self._get_path('services/serviceBus/Namespaces', name), + None) + + return _ServiceBusManagementXmlSerializer.xml_to_namespace( + response.body) + + def create_namespace(self, name, region): + ''' + Create a new service bus namespace. + + name: Name of the service bus namespace to create. + region: Region to create the namespace in. + ''' + _validate_not_none('name', name) + + return self._perform_put( + self._get_path('services/serviceBus/Namespaces', name), + _ServiceBusManagementXmlSerializer.namespace_to_xml(region)) + + def delete_namespace(self, name): + ''' + Delete a service bus namespace. + + name: Name of the service bus namespace to delete. + ''' + _validate_not_none('name', name) + + return self._perform_delete( + self._get_path('services/serviceBus/Namespaces', name), + None) + + def check_namespace_availability(self, name): + ''' + Checks to see if the specified service bus namespace is available, or + if it has already been taken. + + name: Name of the service bus namespace to validate. + ''' + _validate_not_none('name', name) + + response = self._perform_get( + self._get_path('services/serviceBus/CheckNamespaceAvailability', + None) + '/?namespace=' + _str(name), None) + + return _ServiceBusManagementXmlSerializer.xml_to_namespace_availability( + response.body) + + def list_queues(self, name): + ''' + Enumerates the queues in the service namespace. + + name: Name of the service bus namespace. + ''' + _validate_not_none('name', name) + + response = self._perform_get( + self._get_list_queues_path(name), + None) + + return _convert_response_to_feeds(response, + partial(_convert_xml_to_windows_azure_object, + azure_type=QueueDescription)) + + def list_topics(self, name): + ''' + Retrieves the topics in the service namespace. + + name: Name of the service bus namespace. + ''' + response = self._perform_get( + self._get_list_topics_path(name), + None) + + return _convert_response_to_feeds(response, + partial(_convert_xml_to_windows_azure_object, + azure_type=TopicDescription)) + + def list_notification_hubs(self, name): + ''' + Retrieves the notification hubs in the service namespace. + + name: Name of the service bus namespace. + ''' + response = self._perform_get( + self._get_list_notification_hubs_path(name), + None) + + return _convert_response_to_feeds(response, + partial(_convert_xml_to_windows_azure_object, + azure_type=NotificationHubDescription)) + + def list_relays(self, name): + ''' + Retrieves the relays in the service namespace. + + name: Name of the service bus namespace. + ''' + response = self._perform_get( + self._get_list_relays_path(name), + None) + + return _convert_response_to_feeds(response, + partial(_convert_xml_to_windows_azure_object, + azure_type=RelayDescription)) + + def get_supported_metrics_queue(self, name, queue_name): + ''' + Retrieves the list of supported metrics for this namespace and queue + + name: Name of the service bus namespace. + queue_name: Name of the service bus queue in this namespace. + ''' + response = self._perform_get( + self._get_get_supported_metrics_queue_path(name, queue_name), + None) + + return _convert_response_to_feeds(response, + partial(_ServiceBusManagementXmlSerializer.xml_to_metrics, + object_type=MetricProperties)) + + def get_supported_metrics_topic(self, name, topic_name): + ''' + Retrieves the list of supported metrics for this namespace and topic + + name: Name of the service bus namespace. + topic_name: Name of the service bus queue in this namespace. + ''' + response = self._perform_get( + self._get_get_supported_metrics_topic_path(name, topic_name), + None) + + return _convert_response_to_feeds(response, + partial(_ServiceBusManagementXmlSerializer.xml_to_metrics, + object_type=MetricProperties)) + + def get_supported_metrics_notification_hub(self, name, hub_name): + ''' + Retrieves the list of supported metrics for this namespace and topic + + name: Name of the service bus namespace. + hub_name: Name of the service bus notification hub in this namespace. + ''' + response = self._perform_get( + self._get_get_supported_metrics_hub_path(name, hub_name), + None) + + return _convert_response_to_feeds(response, + partial(_ServiceBusManagementXmlSerializer.xml_to_metrics, + object_type=MetricProperties)) + + def get_supported_metrics_relay(self, name, relay_name): + ''' + Retrieves the list of supported metrics for this namespace and relay + + name: Name of the service bus namespace. + relay_name: Name of the service bus relay in this namespace. + ''' + response = self._perform_get( + self._get_get_supported_metrics_relay_path(name, relay_name), + None) + + return _convert_response_to_feeds(response, + partial(_ServiceBusManagementXmlSerializer.xml_to_metrics, + object_type=MetricProperties)) + + def get_metrics_data_queue(self, name, queue_name, metric, rollup, filter_expresssion): + ''' + Retrieves the list of supported metrics for this namespace and queue + + name: Name of the service bus namespace. + queue_name: Name of the service bus queue in this namespace. + metric: name of a supported metric + rollup: name of a supported rollup + filter_expression: filter, for instance "$filter=Timestamp gt datetime'2014-10-01T00:00:00Z'" + ''' + response = self._perform_get( + self._get_get_metrics_data_queue_path(name, queue_name, metric, rollup, filter_expresssion), + None) + + return _convert_response_to_feeds(response, + partial(_ServiceBusManagementXmlSerializer.xml_to_metrics, + object_type=MetricValues)) + + def get_metrics_data_topic(self, name, topic_name, metric, rollup, filter_expresssion): + ''' + Retrieves the list of supported metrics for this namespace and topic + + name: Name of the service bus namespace. + topic_name: Name of the service bus queue in this namespace. + metric: name of a supported metric + rollup: name of a supported rollup + filter_expression: filter, for instance "$filter=Timestamp gt datetime'2014-10-01T00:00:00Z'" + ''' + response = self._perform_get( + self._get_get_metrics_data_topic_path(name, topic_name, metric, rollup, filter_expresssion), + None) + + return _convert_response_to_feeds(response, + partial(_ServiceBusManagementXmlSerializer.xml_to_metrics, + object_type=MetricValues)) + + def get_metrics_data_notification_hub(self, name, hub_name, metric, rollup, filter_expresssion): + ''' + Retrieves the list of supported metrics for this namespace and topic + + name: Name of the service bus namespace. + hub_name: Name of the service bus notification hub in this namespace. + metric: name of a supported metric + rollup: name of a supported rollup + filter_expression: filter, for instance "$filter=Timestamp gt datetime'2014-10-01T00:00:00Z'" + ''' + response = self._perform_get( + self._get_get_metrics_data_hub_path(name, hub_name, metric, rollup, filter_expresssion), + None) + + return _convert_response_to_feeds(response, + partial(_ServiceBusManagementXmlSerializer.xml_to_metrics, + object_type=MetricValues)) + + def get_metrics_data_relay(self, name, relay_name, metric, rollup, filter_expresssion): + ''' + Retrieves the list of supported metrics for this namespace and relay + + name: Name of the service bus namespace. + relay_name: Name of the service bus relay in this namespace. + metric: name of a supported metric + rollup: name of a supported rollup + filter_expression: filter, for instance "$filter=Timestamp gt datetime'2014-10-01T00:00:00Z'" + ''' + response = self._perform_get( + self._get_get_metrics_data_relay_path(name, relay_name, metric, rollup, filter_expresssion), + None) + + return _convert_response_to_feeds(response, + partial(_ServiceBusManagementXmlSerializer.xml_to_metrics, + object_type=MetricValues)) + + def get_metrics_rollups_queue(self, name, queue_name, metric): + ''' + This operation gets rollup data for Service Bus metrics queue. + Rollup data includes the time granularity for the telemetry aggregation as well as + the retention settings for each time granularity. + + name: Name of the service bus namespace. + queue_name: Name of the service bus queue in this namespace. + metric: name of a supported metric + ''' + response = self._perform_get( + self._get_get_metrics_rollup_queue_path(name, queue_name, metric), + None) + + return _convert_response_to_feeds(response, + partial(_ServiceBusManagementXmlSerializer.xml_to_metrics, + object_type=MetricRollups)) + + def get_metrics_rollups_topic(self, name, topic_name, metric): + ''' + This operation gets rollup data for Service Bus metrics topic. + Rollup data includes the time granularity for the telemetry aggregation as well as + the retention settings for each time granularity. + + name: Name of the service bus namespace. + topic_name: Name of the service bus queue in this namespace. + metric: name of a supported metric + ''' + response = self._perform_get( + self._get_get_metrics_rollup_topic_path(name, topic_name, metric), + None) + + return _convert_response_to_feeds(response, + partial(_ServiceBusManagementXmlSerializer.xml_to_metrics, + object_type=MetricRollups)) + + def get_metrics_rollups_notification_hub(self, name, hub_name, metric): + ''' + This operation gets rollup data for Service Bus metrics notification hub. + Rollup data includes the time granularity for the telemetry aggregation as well as + the retention settings for each time granularity. + + name: Name of the service bus namespace. + hub_name: Name of the service bus notification hub in this namespace. + metric: name of a supported metric + ''' + response = self._perform_get( + self._get_get_metrics_rollup_hub_path(name, hub_name, metric), + None) + + return _convert_response_to_feeds(response, + partial(_ServiceBusManagementXmlSerializer.xml_to_metrics, + object_type=MetricRollups)) + + def get_metrics_rollups_relay(self, name, relay_name, metric): + ''' + This operation gets rollup data for Service Bus metrics relay. + Rollup data includes the time granularity for the telemetry aggregation as well as + the retention settings for each time granularity. + + name: Name of the service bus namespace. + relay_name: Name of the service bus relay in this namespace. + metric: name of a supported metric + ''' + response = self._perform_get( + self._get_get_metrics_rollup_relay_path(name, relay_name, metric), + None) + + return _convert_response_to_feeds(response, + partial(_ServiceBusManagementXmlSerializer.xml_to_metrics, + object_type=MetricRollups)) + + + # Helper functions -------------------------------------------------- + def _get_list_queues_path(self, namespace_name): + return self._get_path('services/serviceBus/Namespaces/', + namespace_name) + '/Queues' + + def _get_list_topics_path(self, namespace_name): + return self._get_path('services/serviceBus/Namespaces/', + namespace_name) + '/Topics' + + def _get_list_notification_hubs_path(self, namespace_name): + return self._get_path('services/serviceBus/Namespaces/', + namespace_name) + '/NotificationHubs' + + def _get_list_relays_path(self, namespace_name): + return self._get_path('services/serviceBus/Namespaces/', + namespace_name) + '/Relays' + + def _get_get_supported_metrics_queue_path(self, namespace_name, queue_name): + return self._get_path('services/serviceBus/Namespaces/', + namespace_name) + '/Queues/' + _str(queue_name) + '/Metrics' + + def _get_get_supported_metrics_topic_path(self, namespace_name, topic_name): + return self._get_path('services/serviceBus/Namespaces/', + namespace_name) + '/Topics/' + _str(topic_name) + '/Metrics' + + def _get_get_supported_metrics_hub_path(self, namespace_name, hub_name): + return self._get_path('services/serviceBus/Namespaces/', + namespace_name) + '/NotificationHubs/' + _str(hub_name) + '/Metrics' + + def _get_get_supported_metrics_relay_path(self, namespace_name, queue_name): + return self._get_path('services/serviceBus/Namespaces/', + namespace_name) + '/Relays/' + _str(queue_name) + '/Metrics' + + def _get_get_metrics_data_queue_path(self, namespace_name, queue_name, metric, rollup, filter_expr): + return "".join([ + self._get_path('services/serviceBus/Namespaces/', namespace_name), + '/Queues/', + _str(queue_name), + '/Metrics/', + _str(metric), + '/Rollups/', + _str(rollup), + '/Values?', + filter_expr + ]) + + def _get_get_metrics_data_topic_path(self, namespace_name, queue_name, metric, rollup, filter_expr): + return "".join([ + self._get_path('services/serviceBus/Namespaces/', namespace_name), + '/Topics/', + _str(queue_name), + '/Metrics/', + _str(metric), + '/Rollups/', + _str(rollup), + '/Values?', + filter_expr + ]) + + def _get_get_metrics_data_hub_path(self, namespace_name, queue_name, metric, rollup, filter_expr): + return "".join([ + self._get_path('services/serviceBus/Namespaces/', namespace_name), + '/NotificationHubs/', + _str(queue_name), + '/Metrics/', + _str(metric), + '/Rollups/', + _str(rollup), + '/Values?', + filter_expr + ]) + + def _get_get_metrics_data_relay_path(self, namespace_name, queue_name, metric, rollup, filter_expr): + return "".join([ + self._get_path('services/serviceBus/Namespaces/', namespace_name), + '/Relays/', + _str(queue_name), + '/Metrics/', + _str(metric), + '/Rollups/', + _str(rollup), + '/Values?', + filter_expr + ]) + + def _get_get_metrics_rollup_queue_path(self, namespace_name, queue_name, metric): + return "".join([ + self._get_path('services/serviceBus/Namespaces/', namespace_name), + '/Queues/', + _str(queue_name), + '/Metrics/', + _str(metric), + '/Rollups', + ]) + + def _get_get_metrics_rollup_topic_path(self, namespace_name, queue_name, metric): + return "".join([ + self._get_path('services/serviceBus/Namespaces/', namespace_name), + '/Topics/', + _str(queue_name), + '/Metrics/', + _str(metric), + '/Rollups', + ]) + + def _get_get_metrics_rollup_hub_path(self, namespace_name, queue_name, metric): + return "".join([ + self._get_path('services/serviceBus/Namespaces/', namespace_name), + '/NotificationHubs/', + _str(queue_name), + '/Metrics/', + _str(metric), + '/Rollups', + ]) + + def _get_get_metrics_rollup_relay_path(self, namespace_name, queue_name, metric): + return "".join([ + self._get_path('services/serviceBus/Namespaces/', namespace_name), + '/Relays/', + _str(queue_name), + '/Metrics/', + _str(metric), + '/Rollups', + ]) diff --git a/awx/lib/site-packages/azure/servicemanagement/servicemanagementclient.py b/awx/lib/site-packages/azure/servicemanagement/servicemanagementclient.py index 53ab03e508..808956e0bb 100644 --- a/awx/lib/site-packages/azure/servicemanagement/servicemanagementclient.py +++ b/awx/lib/site-packages/azure/servicemanagement/servicemanagementclient.py @@ -1,166 +1,258 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -import os - -from azure import ( - WindowsAzureError, - MANAGEMENT_HOST, - _get_request_body, - _parse_response, - _str, - _update_request_uri_query, - ) -from azure.http import ( - HTTPError, - HTTPRequest, - ) -from azure.http.httpclient import _HTTPClient -from azure.servicemanagement import ( - AZURE_MANAGEMENT_CERTFILE, - AZURE_MANAGEMENT_SUBSCRIPTIONID, - _management_error_handler, - _parse_response_for_async_op, - _update_management_header, - ) - - -class _ServiceManagementClient(object): - - def __init__(self, subscription_id=None, cert_file=None, - host=MANAGEMENT_HOST): - self.requestid = None - self.subscription_id = subscription_id - self.cert_file = cert_file - self.host = host - - if not self.cert_file: - if AZURE_MANAGEMENT_CERTFILE in os.environ: - self.cert_file = os.environ[AZURE_MANAGEMENT_CERTFILE] - - if not self.subscription_id: - if AZURE_MANAGEMENT_SUBSCRIPTIONID in os.environ: - self.subscription_id = os.environ[ - AZURE_MANAGEMENT_SUBSCRIPTIONID] - - if not self.cert_file or not self.subscription_id: - raise WindowsAzureError( - 'You need to provide subscription id and certificate file') - - self._httpclient = _HTTPClient( - service_instance=self, cert_file=self.cert_file) - self._filter = self._httpclient.perform_request - - def with_filter(self, filter): - '''Returns a new service which will process requests with the - specified filter. Filtering operations can include logging, automatic - retrying, etc... The filter is a lambda which receives the HTTPRequest - and another lambda. The filter can perform any pre-processing on the - request, pass it off to the next lambda, and then perform any - post-processing on the response.''' - res = type(self)(self.subscription_id, self.cert_file, self.host) - old_filter = self._filter - - def new_filter(request): - return filter(request, old_filter) - - res._filter = new_filter - return res - - def set_proxy(self, host, port, user=None, password=None): - ''' - Sets the proxy server host and port for the HTTP CONNECT Tunnelling. - - host: Address of the proxy. Ex: '192.168.0.100' - port: Port of the proxy. Ex: 6000 - user: User for proxy authorization. - password: Password for proxy authorization. - ''' - self._httpclient.set_proxy(host, port, user, password) - - #--Helper functions -------------------------------------------------- - def _perform_request(self, request): - try: - resp = self._filter(request) - except HTTPError as ex: - return _management_error_handler(ex) - - return resp - - def _perform_get(self, path, response_type): - request = HTTPRequest() - request.method = 'GET' - request.host = self.host - request.path = path - request.path, request.query = _update_request_uri_query(request) - request.headers = _update_management_header(request) - response = self._perform_request(request) - - if response_type is not None: - return _parse_response(response, response_type) - - return response - - def _perform_put(self, path, body, async=False): - request = HTTPRequest() - request.method = 'PUT' - request.host = self.host - request.path = path - request.body = _get_request_body(body) - request.path, request.query = _update_request_uri_query(request) - request.headers = _update_management_header(request) - response = self._perform_request(request) - - if async: - return _parse_response_for_async_op(response) - - return None - - def _perform_post(self, path, body, response_type=None, async=False): - request = HTTPRequest() - request.method = 'POST' - request.host = self.host - request.path = path - request.body = _get_request_body(body) - request.path, request.query = _update_request_uri_query(request) - request.headers = _update_management_header(request) - response = self._perform_request(request) - - if response_type is not None: - return _parse_response(response, response_type) - - if async: - return _parse_response_for_async_op(response) - - return None - - def _perform_delete(self, path, async=False): - request = HTTPRequest() - request.method = 'DELETE' - request.host = self.host - request.path = path - request.path, request.query = _update_request_uri_query(request) - request.headers = _update_management_header(request) - response = self._perform_request(request) - - if async: - return _parse_response_for_async_op(response) - - return None - - def _get_path(self, resource, name): - path = '/' + self.subscription_id + '/' + resource - if name is not None: - path += '/' + _str(name) - return path +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +import os + +from azure import ( + WindowsAzureError, + MANAGEMENT_HOST, + _get_request_body, + _parse_response, + _str, + _update_request_uri_query, + ) +from azure.http import ( + HTTPError, + HTTPRequest, + ) +from azure.http.httpclient import _HTTPClient +from azure.servicemanagement import ( + AZURE_MANAGEMENT_CERTFILE, + AZURE_MANAGEMENT_SUBSCRIPTIONID, + _management_error_handler, + parse_response_for_async_op, + X_MS_VERSION, + ) + + +class _ServiceManagementClient(object): + + def __init__(self, subscription_id=None, cert_file=None, + host=MANAGEMENT_HOST, request_session=None): + self.requestid = None + self.subscription_id = subscription_id + self.cert_file = cert_file + self.host = host + self.request_session = request_session + self.x_ms_version = X_MS_VERSION + self.content_type = 'application/atom+xml;type=entry;charset=utf-8' + + if not self.cert_file and not request_session: + if AZURE_MANAGEMENT_CERTFILE in os.environ: + self.cert_file = os.environ[AZURE_MANAGEMENT_CERTFILE] + + if not self.subscription_id: + if AZURE_MANAGEMENT_SUBSCRIPTIONID in os.environ: + self.subscription_id = os.environ[ + AZURE_MANAGEMENT_SUBSCRIPTIONID] + + if not self.request_session: + if not self.cert_file or not self.subscription_id: + raise WindowsAzureError( + 'You need to provide subscription id and certificate file') + + self._httpclient = _HTTPClient( + service_instance=self, cert_file=self.cert_file, + request_session=self.request_session) + self._filter = self._httpclient.perform_request + + def with_filter(self, filter): + '''Returns a new service which will process requests with the + specified filter. Filtering operations can include logging, automatic + retrying, etc... The filter is a lambda which receives the HTTPRequest + and another lambda. The filter can perform any pre-processing on the + request, pass it off to the next lambda, and then perform any + post-processing on the response.''' + res = type(self)(self.subscription_id, self.cert_file, self.host, + self.request_session) + old_filter = self._filter + + def new_filter(request): + return filter(request, old_filter) + + res._filter = new_filter + return res + + def set_proxy(self, host, port, user=None, password=None): + ''' + Sets the proxy server host and port for the HTTP CONNECT Tunnelling. + + host: Address of the proxy. Ex: '192.168.0.100' + port: Port of the proxy. Ex: 6000 + user: User for proxy authorization. + password: Password for proxy authorization. + ''' + self._httpclient.set_proxy(host, port, user, password) + + def perform_get(self, path, x_ms_version=None): + ''' + Performs a GET request and returns the response. + + path: + Path to the resource. + Ex: '/<subscription-id>/services/hostedservices/<service-name>' + x_ms_version: + If specified, this is used for the x-ms-version header. + Otherwise, self.x_ms_version is used. + ''' + request = HTTPRequest() + request.method = 'GET' + request.host = self.host + request.path = path + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_management_header(request, x_ms_version) + response = self._perform_request(request) + + return response + + def perform_put(self, path, body, x_ms_version=None): + ''' + Performs a PUT request and returns the response. + + path: + Path to the resource. + Ex: '/<subscription-id>/services/hostedservices/<service-name>' + body: + Body for the PUT request. + x_ms_version: + If specified, this is used for the x-ms-version header. + Otherwise, self.x_ms_version is used. + ''' + request = HTTPRequest() + request.method = 'PUT' + request.host = self.host + request.path = path + request.body = _get_request_body(body) + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_management_header(request, x_ms_version) + response = self._perform_request(request) + + return response + + def perform_post(self, path, body, x_ms_version=None): + ''' + Performs a POST request and returns the response. + + path: + Path to the resource. + Ex: '/<subscription-id>/services/hostedservices/<service-name>' + body: + Body for the POST request. + x_ms_version: + If specified, this is used for the x-ms-version header. + Otherwise, self.x_ms_version is used. + ''' + request = HTTPRequest() + request.method = 'POST' + request.host = self.host + request.path = path + request.body = _get_request_body(body) + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_management_header(request, x_ms_version) + response = self._perform_request(request) + + return response + + def perform_delete(self, path, x_ms_version=None): + ''' + Performs a DELETE request and returns the response. + + path: + Path to the resource. + Ex: '/<subscription-id>/services/hostedservices/<service-name>' + x_ms_version: + If specified, this is used for the x-ms-version header. + Otherwise, self.x_ms_version is used. + ''' + request = HTTPRequest() + request.method = 'DELETE' + request.host = self.host + request.path = path + request.path, request.query = _update_request_uri_query(request) + request.headers = self._update_management_header(request, x_ms_version) + response = self._perform_request(request) + + return response + + #--Helper functions -------------------------------------------------- + def _perform_request(self, request): + try: + resp = self._filter(request) + except HTTPError as ex: + return _management_error_handler(ex) + + return resp + + def _update_management_header(self, request, x_ms_version): + ''' Add additional headers for management. ''' + + if request.method in ['PUT', 'POST', 'MERGE', 'DELETE']: + request.headers.append(('Content-Length', str(len(request.body)))) + + # append additional headers base on the service + request.headers.append(('x-ms-version', x_ms_version or self.x_ms_version)) + + # if it is not GET or HEAD request, must set content-type. + if not request.method in ['GET', 'HEAD']: + for name, _ in request.headers: + if 'content-type' == name.lower(): + break + else: + request.headers.append( + ('Content-Type', + self.content_type)) + + return request.headers + + def _perform_get(self, path, response_type, x_ms_version=None): + response = self.perform_get(path, x_ms_version) + + if response_type is not None: + return _parse_response(response, response_type) + + return response + + def _perform_put(self, path, body, async=False, x_ms_version=None): + response = self.perform_put(path, body, x_ms_version) + + if async: + return parse_response_for_async_op(response) + + return None + + def _perform_post(self, path, body, response_type=None, async=False, + x_ms_version=None): + response = self.perform_post(path, body, x_ms_version) + + if response_type is not None: + return _parse_response(response, response_type) + + if async: + return parse_response_for_async_op(response) + + return None + + def _perform_delete(self, path, async=False, x_ms_version=None): + response = self.perform_delete(path, x_ms_version) + + if async: + return parse_response_for_async_op(response) + + return None + + def _get_path(self, resource, name): + path = '/' + self.subscription_id + '/' + resource + if name is not None: + path += '/' + _str(name) + return path diff --git a/awx/lib/site-packages/azure/servicemanagement/servicemanagementservice.py b/awx/lib/site-packages/azure/servicemanagement/servicemanagementservice.py index 13fcf3d76b..651ffdae53 100644 --- a/awx/lib/site-packages/azure/servicemanagement/servicemanagementservice.py +++ b/awx/lib/site-packages/azure/servicemanagement/servicemanagementservice.py @@ -1,1754 +1,2300 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -from azure import ( - WindowsAzureError, - MANAGEMENT_HOST, - _str, - _validate_not_none, - ) -from azure.servicemanagement import ( - AffinityGroups, - AffinityGroup, - AvailabilityResponse, - Certificate, - Certificates, - DataVirtualHardDisk, - Deployment, - Disk, - Disks, - Locations, - Operation, - HostedService, - HostedServices, - Images, - OperatingSystems, - OperatingSystemFamilies, - OSImage, - PersistentVMRole, - StorageService, - StorageServices, - Subscription, - SubscriptionCertificate, - SubscriptionCertificates, - VirtualNetworkSites, - _XmlSerializer, - ) -from azure.servicemanagement.servicemanagementclient import ( - _ServiceManagementClient, - ) - -class ServiceManagementService(_ServiceManagementClient): - - def __init__(self, subscription_id=None, cert_file=None, - host=MANAGEMENT_HOST): - super(ServiceManagementService, self).__init__( - subscription_id, cert_file, host) - - #--Operations for storage accounts ----------------------------------- - def list_storage_accounts(self): - ''' - Lists the storage accounts available under the current subscription. - ''' - return self._perform_get(self._get_storage_service_path(), - StorageServices) - - def get_storage_account_properties(self, service_name): - ''' - Returns system properties for the specified storage account. - - service_name: Name of the storage service account. - ''' - _validate_not_none('service_name', service_name) - return self._perform_get(self._get_storage_service_path(service_name), - StorageService) - - def get_storage_account_keys(self, service_name): - ''' - Returns the primary and secondary access keys for the specified - storage account. - - service_name: Name of the storage service account. - ''' - _validate_not_none('service_name', service_name) - return self._perform_get( - self._get_storage_service_path(service_name) + '/keys', - StorageService) - - def regenerate_storage_account_keys(self, service_name, key_type): - ''' - Regenerates the primary or secondary access key for the specified - storage account. - - service_name: Name of the storage service account. - key_type: - Specifies which key to regenerate. Valid values are: - Primary, Secondary - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('key_type', key_type) - return self._perform_post( - self._get_storage_service_path( - service_name) + '/keys?action=regenerate', - _XmlSerializer.regenerate_keys_to_xml( - key_type), - StorageService) - - def create_storage_account(self, service_name, description, label, - affinity_group=None, location=None, - geo_replication_enabled=True, - extended_properties=None): - ''' - Creates a new storage account in Windows Azure. - - service_name: - A name for the storage account that is unique within Windows Azure. - Storage account names must be between 3 and 24 characters in length - and use numbers and lower-case letters only. - description: - A description for the storage account. The description may be up - to 1024 characters in length. - label: - A name for the storage account. The name may be up to 100 - characters in length. The name can be used to identify the storage - account for your tracking purposes. - affinity_group: - The name of an existing affinity group in the specified - subscription. You can specify either a location or affinity_group, - but not both. - location: - The location where the storage account is created. You can specify - either a location or affinity_group, but not both. - geo_replication_enabled: - Specifies whether the storage account is created with the - geo-replication enabled. If the element is not included in the - request body, the default value is true. If set to true, the data - in the storage account is replicated across more than one - geographic location so as to enable resilience in the face of - catastrophic service loss. - extended_properties: - Dictionary containing name/value pairs of storage account - properties. You can have a maximum of 50 extended property - name/value pairs. The maximum length of the Name element is 64 - characters, only alphanumeric characters and underscores are valid - in the Name, and the name must start with a letter. The value has - a maximum length of 255 characters. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('description', description) - _validate_not_none('label', label) - if affinity_group is None and location is None: - raise WindowsAzureError( - 'location or affinity_group must be specified') - if affinity_group is not None and location is not None: - raise WindowsAzureError( - 'Only one of location or affinity_group needs to be specified') - return self._perform_post( - self._get_storage_service_path(), - _XmlSerializer.create_storage_service_input_to_xml( - service_name, - description, - label, - affinity_group, - location, - geo_replication_enabled, - extended_properties), - async=True) - - def update_storage_account(self, service_name, description=None, - label=None, geo_replication_enabled=None, - extended_properties=None): - ''' - Updates the label, the description, and enables or disables the - geo-replication status for a storage account in Windows Azure. - - service_name: Name of the storage service account. - description: - A description for the storage account. The description may be up - to 1024 characters in length. - label: - A name for the storage account. The name may be up to 100 - characters in length. The name can be used to identify the storage - account for your tracking purposes. - geo_replication_enabled: - Specifies whether the storage account is created with the - geo-replication enabled. If the element is not included in the - request body, the default value is true. If set to true, the data - in the storage account is replicated across more than one - geographic location so as to enable resilience in the face of - catastrophic service loss. - extended_properties: - Dictionary containing name/value pairs of storage account - properties. You can have a maximum of 50 extended property - name/value pairs. The maximum length of the Name element is 64 - characters, only alphanumeric characters and underscores are valid - in the Name, and the name must start with a letter. The value has - a maximum length of 255 characters. - ''' - _validate_not_none('service_name', service_name) - return self._perform_put( - self._get_storage_service_path(service_name), - _XmlSerializer.update_storage_service_input_to_xml( - description, - label, - geo_replication_enabled, - extended_properties)) - - def delete_storage_account(self, service_name): - ''' - Deletes the specified storage account from Windows Azure. - - service_name: Name of the storage service account. - ''' - _validate_not_none('service_name', service_name) - return self._perform_delete( - self._get_storage_service_path(service_name)) - - def check_storage_account_name_availability(self, service_name): - ''' - Checks to see if the specified storage account name is available, or - if it has already been taken. - - service_name: Name of the storage service account. - ''' - _validate_not_none('service_name', service_name) - return self._perform_get( - self._get_storage_service_path() + - '/operations/isavailable/' + - _str(service_name) + '', - AvailabilityResponse) - - #--Operations for hosted services ------------------------------------ - def list_hosted_services(self): - ''' - Lists the hosted services available under the current subscription. - ''' - return self._perform_get(self._get_hosted_service_path(), - HostedServices) - - def get_hosted_service_properties(self, service_name, embed_detail=False): - ''' - Retrieves system properties for the specified hosted service. These - properties include the service name and service type; the name of the - affinity group to which the service belongs, or its location if it is - not part of an affinity group; and optionally, information on the - service's deployments. - - service_name: Name of the hosted service. - embed_detail: - When True, the management service returns properties for all - deployments of the service, as well as for the service itself. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('embed_detail', embed_detail) - return self._perform_get( - self._get_hosted_service_path(service_name) + - '?embed-detail=' + - _str(embed_detail).lower(), - HostedService) - - def create_hosted_service(self, service_name, label, description=None, - location=None, affinity_group=None, - extended_properties=None): - ''' - Creates a new hosted service in Windows Azure. - - service_name: - A name for the hosted service that is unique within Windows Azure. - This name is the DNS prefix name and can be used to access the - hosted service. - label: - A name for the hosted service. The name can be up to 100 characters - in length. The name can be used to identify the storage account for - your tracking purposes. - description: - A description for the hosted service. The description can be up to - 1024 characters in length. - location: - The location where the hosted service will be created. You can - specify either a location or affinity_group, but not both. - affinity_group: - The name of an existing affinity group associated with this - subscription. This name is a GUID and can be retrieved by examining - the name element of the response body returned by - list_affinity_groups. You can specify either a location or - affinity_group, but not both. - extended_properties: - Dictionary containing name/value pairs of storage account - properties. You can have a maximum of 50 extended property - name/value pairs. The maximum length of the Name element is 64 - characters, only alphanumeric characters and underscores are valid - in the Name, and the name must start with a letter. The value has - a maximum length of 255 characters. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('label', label) - if affinity_group is None and location is None: - raise WindowsAzureError( - 'location or affinity_group must be specified') - if affinity_group is not None and location is not None: - raise WindowsAzureError( - 'Only one of location or affinity_group needs to be specified') - return self._perform_post(self._get_hosted_service_path(), - _XmlSerializer.create_hosted_service_to_xml( - service_name, - label, - description, - location, - affinity_group, - extended_properties)) - - def update_hosted_service(self, service_name, label=None, description=None, - extended_properties=None): - ''' - Updates the label and/or the description for a hosted service in - Windows Azure. - - service_name: Name of the hosted service. - label: - A name for the hosted service. The name may be up to 100 characters - in length. You must specify a value for either Label or - Description, or for both. It is recommended that the label be - unique within the subscription. The name can be used - identify the hosted service for your tracking purposes. - description: - A description for the hosted service. The description may be up to - 1024 characters in length. You must specify a value for either - Label or Description, or for both. - extended_properties: - Dictionary containing name/value pairs of storage account - properties. You can have a maximum of 50 extended property - name/value pairs. The maximum length of the Name element is 64 - characters, only alphanumeric characters and underscores are valid - in the Name, and the name must start with a letter. The value has - a maximum length of 255 characters. - ''' - _validate_not_none('service_name', service_name) - return self._perform_put(self._get_hosted_service_path(service_name), - _XmlSerializer.update_hosted_service_to_xml( - label, - description, - extended_properties)) - - def delete_hosted_service(self, service_name): - ''' - Deletes the specified hosted service from Windows Azure. - - service_name: Name of the hosted service. - ''' - _validate_not_none('service_name', service_name) - return self._perform_delete(self._get_hosted_service_path(service_name)) - - def get_deployment_by_slot(self, service_name, deployment_slot): - ''' - Returns configuration information, status, and system properties for - a deployment. - - service_name: Name of the hosted service. - deployment_slot: - The environment to which the hosted service is deployed. Valid - values are: staging, production - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_slot', deployment_slot) - return self._perform_get( - self._get_deployment_path_using_slot( - service_name, deployment_slot), - Deployment) - - def get_deployment_by_name(self, service_name, deployment_name): - ''' - Returns configuration information, status, and system properties for a - deployment. - - service_name: Name of the hosted service. - deployment_name: The name of the deployment. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - return self._perform_get( - self._get_deployment_path_using_name( - service_name, deployment_name), - Deployment) - - def create_deployment(self, service_name, deployment_slot, name, - package_url, label, configuration, - start_deployment=False, - treat_warnings_as_error=False, - extended_properties=None): - ''' - Uploads a new service package and creates a new deployment on staging - or production. - - service_name: Name of the hosted service. - deployment_slot: - The environment to which the hosted service is deployed. Valid - values are: staging, production - name: - The name for the deployment. The deployment name must be unique - among other deployments for the hosted service. - package_url: - A URL that refers to the location of the service package in the - Blob service. The service package can be located either in a - storage account beneath the same subscription or a Shared Access - Signature (SAS) URI from any storage account. - label: - A name for the hosted service. The name can be up to 100 characters - in length. It is recommended that the label be unique within the - subscription. The name can be used to identify the hosted service - for your tracking purposes. - configuration: - The base-64 encoded service configuration file for the deployment. - start_deployment: - Indicates whether to start the deployment immediately after it is - created. If false, the service model is still deployed to the - virtual machines but the code is not run immediately. Instead, the - service is Suspended until you call Update Deployment Status and - set the status to Running, at which time the service will be - started. A deployed service still incurs charges, even if it is - suspended. - treat_warnings_as_error: - Indicates whether to treat package validation warnings as errors. - If set to true, the Created Deployment operation fails if there - are validation warnings on the service package. - extended_properties: - Dictionary containing name/value pairs of storage account - properties. You can have a maximum of 50 extended property - name/value pairs. The maximum length of the Name element is 64 - characters, only alphanumeric characters and underscores are valid - in the Name, and the name must start with a letter. The value has - a maximum length of 255 characters. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_slot', deployment_slot) - _validate_not_none('name', name) - _validate_not_none('package_url', package_url) - _validate_not_none('label', label) - _validate_not_none('configuration', configuration) - return self._perform_post( - self._get_deployment_path_using_slot( - service_name, deployment_slot), - _XmlSerializer.create_deployment_to_xml( - name, - package_url, - label, - configuration, - start_deployment, - treat_warnings_as_error, - extended_properties), - async=True) - - def delete_deployment(self, service_name, deployment_name): - ''' - Deletes the specified deployment. - - service_name: Name of the hosted service. - deployment_name: The name of the deployment. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - return self._perform_delete( - self._get_deployment_path_using_name( - service_name, deployment_name), - async=True) - - def swap_deployment(self, service_name, production, source_deployment): - ''' - Initiates a virtual IP swap between the staging and production - deployment environments for a service. If the service is currently - running in the staging environment, it will be swapped to the - production environment. If it is running in the production - environment, it will be swapped to staging. - - service_name: Name of the hosted service. - production: The name of the production deployment. - source_deployment: The name of the source deployment. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('production', production) - _validate_not_none('source_deployment', source_deployment) - return self._perform_post(self._get_hosted_service_path(service_name), - _XmlSerializer.swap_deployment_to_xml( - production, source_deployment), - async=True) - - def change_deployment_configuration(self, service_name, deployment_name, - configuration, - treat_warnings_as_error=False, - mode='Auto', extended_properties=None): - ''' - Initiates a change to the deployment configuration. - - service_name: Name of the hosted service. - deployment_name: The name of the deployment. - configuration: - The base-64 encoded service configuration file for the deployment. - treat_warnings_as_error: - Indicates whether to treat package validation warnings as errors. - If set to true, the Created Deployment operation fails if there - are validation warnings on the service package. - mode: - If set to Manual, WalkUpgradeDomain must be called to apply the - update. If set to Auto, the Windows Azure platform will - automatically apply the update To each upgrade domain for the - service. Possible values are: Auto, Manual - extended_properties: - Dictionary containing name/value pairs of storage account - properties. You can have a maximum of 50 extended property - name/value pairs. The maximum length of the Name element is 64 - characters, only alphanumeric characters and underscores are valid - in the Name, and the name must start with a letter. The value has - a maximum length of 255 characters. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('configuration', configuration) - return self._perform_post( - self._get_deployment_path_using_name( - service_name, deployment_name) + '/?comp=config', - _XmlSerializer.change_deployment_to_xml( - configuration, - treat_warnings_as_error, - mode, - extended_properties), - async=True) - - def update_deployment_status(self, service_name, deployment_name, status): - ''' - Initiates a change in deployment status. - - service_name: Name of the hosted service. - deployment_name: The name of the deployment. - status: - The change to initiate to the deployment status. Possible values - include: Running, Suspended - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('status', status) - return self._perform_post( - self._get_deployment_path_using_name( - service_name, deployment_name) + '/?comp=status', - _XmlSerializer.update_deployment_status_to_xml( - status), - async=True) - - def upgrade_deployment(self, service_name, deployment_name, mode, - package_url, configuration, label, force, - role_to_upgrade=None, extended_properties=None): - ''' - Initiates an upgrade. - - service_name: Name of the hosted service. - deployment_name: The name of the deployment. - mode: - If set to Manual, WalkUpgradeDomain must be called to apply the - update. If set to Auto, the Windows Azure platform will - automatically apply the update To each upgrade domain for the - service. Possible values are: Auto, Manual - package_url: - A URL that refers to the location of the service package in the - Blob service. The service package can be located either in a - storage account beneath the same subscription or a Shared Access - Signature (SAS) URI from any storage account. - configuration: - The base-64 encoded service configuration file for the deployment. - label: - A name for the hosted service. The name can be up to 100 characters - in length. It is recommended that the label be unique within the - subscription. The name can be used to identify the hosted service - for your tracking purposes. - force: - Specifies whether the rollback should proceed even when it will - cause local data to be lost from some role instances. True if the - rollback should proceed; otherwise false if the rollback should - fail. - role_to_upgrade: The name of the specific role to upgrade. - extended_properties: - Dictionary containing name/value pairs of storage account - properties. You can have a maximum of 50 extended property - name/value pairs. The maximum length of the Name element is 64 - characters, only alphanumeric characters and underscores are valid - in the Name, and the name must start with a letter. The value has - a maximum length of 255 characters. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('mode', mode) - _validate_not_none('package_url', package_url) - _validate_not_none('configuration', configuration) - _validate_not_none('label', label) - _validate_not_none('force', force) - return self._perform_post( - self._get_deployment_path_using_name( - service_name, deployment_name) + '/?comp=upgrade', - _XmlSerializer.upgrade_deployment_to_xml( - mode, - package_url, - configuration, - label, - role_to_upgrade, - force, - extended_properties), - async=True) - - def walk_upgrade_domain(self, service_name, deployment_name, - upgrade_domain): - ''' - Specifies the next upgrade domain to be walked during manual in-place - upgrade or configuration change. - - service_name: Name of the hosted service. - deployment_name: The name of the deployment. - upgrade_domain: - An integer value that identifies the upgrade domain to walk. - Upgrade domains are identified with a zero-based index: the first - upgrade domain has an ID of 0, the second has an ID of 1, and so on. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('upgrade_domain', upgrade_domain) - return self._perform_post( - self._get_deployment_path_using_name( - service_name, deployment_name) + '/?comp=walkupgradedomain', - _XmlSerializer.walk_upgrade_domain_to_xml( - upgrade_domain), - async=True) - - def rollback_update_or_upgrade(self, service_name, deployment_name, mode, - force): - ''' - Cancels an in progress configuration change (update) or upgrade and - returns the deployment to its state before the upgrade or - configuration change was started. - - service_name: Name of the hosted service. - deployment_name: The name of the deployment. - mode: - Specifies whether the rollback should proceed automatically. - auto - The rollback proceeds without further user input. - manual - You must call the Walk Upgrade Domain operation to - apply the rollback to each upgrade domain. - force: - Specifies whether the rollback should proceed even when it will - cause local data to be lost from some role instances. True if the - rollback should proceed; otherwise false if the rollback should - fail. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('mode', mode) - _validate_not_none('force', force) - return self._perform_post( - self._get_deployment_path_using_name( - service_name, deployment_name) + '/?comp=rollback', - _XmlSerializer.rollback_upgrade_to_xml( - mode, force), - async=True) - - def reboot_role_instance(self, service_name, deployment_name, - role_instance_name): - ''' - Requests a reboot of a role instance that is running in a deployment. - - service_name: Name of the hosted service. - deployment_name: The name of the deployment. - role_instance_name: The name of the role instance. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_instance_name', role_instance_name) - return self._perform_post( - self._get_deployment_path_using_name( - service_name, deployment_name) + \ - '/roleinstances/' + _str(role_instance_name) + \ - '?comp=reboot', - '', - async=True) - - def reimage_role_instance(self, service_name, deployment_name, - role_instance_name): - ''' - Requests a reimage of a role instance that is running in a deployment. - - service_name: Name of the hosted service. - deployment_name: The name of the deployment. - role_instance_name: The name of the role instance. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_instance_name', role_instance_name) - return self._perform_post( - self._get_deployment_path_using_name( - service_name, deployment_name) + \ - '/roleinstances/' + _str(role_instance_name) + \ - '?comp=reimage', - '', - async=True) - - def check_hosted_service_name_availability(self, service_name): - ''' - Checks to see if the specified hosted service name is available, or if - it has already been taken. - - service_name: Name of the hosted service. - ''' - _validate_not_none('service_name', service_name) - return self._perform_get( - '/' + self.subscription_id + - '/services/hostedservices/operations/isavailable/' + - _str(service_name) + '', - AvailabilityResponse) - - #--Operations for service certificates ------------------------------- - def list_service_certificates(self, service_name): - ''' - Lists all of the service certificates associated with the specified - hosted service. - - service_name: Name of the hosted service. - ''' - _validate_not_none('service_name', service_name) - return self._perform_get( - '/' + self.subscription_id + '/services/hostedservices/' + - _str(service_name) + '/certificates', - Certificates) - - def get_service_certificate(self, service_name, thumbalgorithm, thumbprint): - ''' - Returns the public data for the specified X.509 certificate associated - with a hosted service. - - service_name: Name of the hosted service. - thumbalgorithm: The algorithm for the certificate's thumbprint. - thumbprint: The hexadecimal representation of the thumbprint. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('thumbalgorithm', thumbalgorithm) - _validate_not_none('thumbprint', thumbprint) - return self._perform_get( - '/' + self.subscription_id + '/services/hostedservices/' + - _str(service_name) + '/certificates/' + - _str(thumbalgorithm) + '-' + _str(thumbprint) + '', - Certificate) - - def add_service_certificate(self, service_name, data, certificate_format, - password): - ''' - Adds a certificate to a hosted service. - - service_name: Name of the hosted service. - data: The base-64 encoded form of the pfx file. - certificate_format: - The service certificate format. The only supported value is pfx. - password: The certificate password. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('data', data) - _validate_not_none('certificate_format', certificate_format) - _validate_not_none('password', password) - return self._perform_post( - '/' + self.subscription_id + '/services/hostedservices/' + - _str(service_name) + '/certificates', - _XmlSerializer.certificate_file_to_xml( - data, certificate_format, password), - async=True) - - def delete_service_certificate(self, service_name, thumbalgorithm, - thumbprint): - ''' - Deletes a service certificate from the certificate store of a hosted - service. - - service_name: Name of the hosted service. - thumbalgorithm: The algorithm for the certificate's thumbprint. - thumbprint: The hexadecimal representation of the thumbprint. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('thumbalgorithm', thumbalgorithm) - _validate_not_none('thumbprint', thumbprint) - return self._perform_delete( - '/' + self.subscription_id + '/services/hostedservices/' + - _str(service_name) + '/certificates/' + - _str(thumbalgorithm) + '-' + _str(thumbprint), - async=True) - - #--Operations for management certificates ---------------------------- - def list_management_certificates(self): - ''' - The List Management Certificates operation lists and returns basic - information about all of the management certificates associated with - the specified subscription. Management certificates, which are also - known as subscription certificates, authenticate clients attempting to - connect to resources associated with your Windows Azure subscription. - ''' - return self._perform_get('/' + self.subscription_id + '/certificates', - SubscriptionCertificates) - - def get_management_certificate(self, thumbprint): - ''' - The Get Management Certificate operation retrieves information about - the management certificate with the specified thumbprint. Management - certificates, which are also known as subscription certificates, - authenticate clients attempting to connect to resources associated - with your Windows Azure subscription. - - thumbprint: The thumbprint value of the certificate. - ''' - _validate_not_none('thumbprint', thumbprint) - return self._perform_get( - '/' + self.subscription_id + '/certificates/' + _str(thumbprint), - SubscriptionCertificate) - - def add_management_certificate(self, public_key, thumbprint, data): - ''' - The Add Management Certificate operation adds a certificate to the - list of management certificates. Management certificates, which are - also known as subscription certificates, authenticate clients - attempting to connect to resources associated with your Windows Azure - subscription. - - public_key: - A base64 representation of the management certificate public key. - thumbprint: - The thumb print that uniquely identifies the management - certificate. - data: The certificate's raw data in base-64 encoded .cer format. - ''' - _validate_not_none('public_key', public_key) - _validate_not_none('thumbprint', thumbprint) - _validate_not_none('data', data) - return self._perform_post( - '/' + self.subscription_id + '/certificates', - _XmlSerializer.subscription_certificate_to_xml( - public_key, thumbprint, data)) - - def delete_management_certificate(self, thumbprint): - ''' - The Delete Management Certificate operation deletes a certificate from - the list of management certificates. Management certificates, which - are also known as subscription certificates, authenticate clients - attempting to connect to resources associated with your Windows Azure - subscription. - - thumbprint: - The thumb print that uniquely identifies the management - certificate. - ''' - _validate_not_none('thumbprint', thumbprint) - return self._perform_delete( - '/' + self.subscription_id + '/certificates/' + _str(thumbprint)) - - #--Operations for affinity groups ------------------------------------ - def list_affinity_groups(self): - ''' - Lists the affinity groups associated with the specified subscription. - ''' - return self._perform_get( - '/' + self.subscription_id + '/affinitygroups', - AffinityGroups) - - def get_affinity_group_properties(self, affinity_group_name): - ''' - Returns the system properties associated with the specified affinity - group. - - affinity_group_name: The name of the affinity group. - ''' - _validate_not_none('affinity_group_name', affinity_group_name) - return self._perform_get( - '/' + self.subscription_id + '/affinitygroups/' + - _str(affinity_group_name) + '', - AffinityGroup) - - def create_affinity_group(self, name, label, location, description=None): - ''' - Creates a new affinity group for the specified subscription. - - name: A name for the affinity group that is unique to the subscription. - label: - A name for the affinity group. The name can be up to 100 characters - in length. - location: - The data center location where the affinity group will be created. - To list available locations, use the list_location function. - description: - A description for the affinity group. The description can be up to - 1024 characters in length. - ''' - _validate_not_none('name', name) - _validate_not_none('label', label) - _validate_not_none('location', location) - return self._perform_post( - '/' + self.subscription_id + '/affinitygroups', - _XmlSerializer.create_affinity_group_to_xml(name, - label, - description, - location)) - - def update_affinity_group(self, affinity_group_name, label, - description=None): - ''' - Updates the label and/or the description for an affinity group for the - specified subscription. - - affinity_group_name: The name of the affinity group. - label: - A name for the affinity group. The name can be up to 100 characters - in length. - description: - A description for the affinity group. The description can be up to - 1024 characters in length. - ''' - _validate_not_none('affinity_group_name', affinity_group_name) - _validate_not_none('label', label) - return self._perform_put( - '/' + self.subscription_id + '/affinitygroups/' + - _str(affinity_group_name), - _XmlSerializer.update_affinity_group_to_xml(label, description)) - - def delete_affinity_group(self, affinity_group_name): - ''' - Deletes an affinity group in the specified subscription. - - affinity_group_name: The name of the affinity group. - ''' - _validate_not_none('affinity_group_name', affinity_group_name) - return self._perform_delete('/' + self.subscription_id + \ - '/affinitygroups/' + \ - _str(affinity_group_name)) - - #--Operations for locations ------------------------------------------ - def list_locations(self): - ''' - Lists all of the data center locations that are valid for your - subscription. - ''' - return self._perform_get('/' + self.subscription_id + '/locations', - Locations) - - #--Operations for tracking asynchronous requests --------------------- - def get_operation_status(self, request_id): - ''' - Returns the status of the specified operation. After calling an - asynchronous operation, you can call Get Operation Status to determine - whether the operation has succeeded, failed, or is still in progress. - - request_id: The request ID for the request you wish to track. - ''' - _validate_not_none('request_id', request_id) - return self._perform_get( - '/' + self.subscription_id + '/operations/' + _str(request_id), - Operation) - - #--Operations for retrieving operating system information ------------ - def list_operating_systems(self): - ''' - Lists the versions of the guest operating system that are currently - available in Windows Azure. - ''' - return self._perform_get( - '/' + self.subscription_id + '/operatingsystems', - OperatingSystems) - - def list_operating_system_families(self): - ''' - Lists the guest operating system families available in Windows Azure, - and also lists the operating system versions available for each family. - ''' - return self._perform_get( - '/' + self.subscription_id + '/operatingsystemfamilies', - OperatingSystemFamilies) - - #--Operations for retrieving subscription history -------------------- - def get_subscription(self): - ''' - Returns account and resource allocation information on the specified - subscription. - ''' - return self._perform_get('/' + self.subscription_id + '', - Subscription) - - #--Operations for virtual machines ----------------------------------- - def get_role(self, service_name, deployment_name, role_name): - ''' - Retrieves the specified virtual machine. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_name: The name of the role. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_name', role_name) - return self._perform_get( - self._get_role_path(service_name, deployment_name, role_name), - PersistentVMRole) - - def create_virtual_machine_deployment(self, service_name, deployment_name, - deployment_slot, label, role_name, - system_config, os_virtual_hard_disk, - network_config=None, - availability_set_name=None, - data_virtual_hard_disks=None, - role_size=None, - role_type='PersistentVMRole', - virtual_network_name=None): - ''' - Provisions a virtual machine based on the supplied configuration. - - service_name: Name of the hosted service. - deployment_name: - The name for the deployment. The deployment name must be unique - among other deployments for the hosted service. - deployment_slot: - The environment to which the hosted service is deployed. Valid - values are: staging, production - label: - Specifies an identifier for the deployment. The label can be up to - 100 characters long. The label can be used for tracking purposes. - role_name: The name of the role. - system_config: - Contains the metadata required to provision a virtual machine from - a Windows or Linux OS image. Use an instance of - WindowsConfigurationSet or LinuxConfigurationSet. - os_virtual_hard_disk: - Contains the parameters Windows Azure uses to create the operating - system disk for the virtual machine. - network_config: - Encapsulates the metadata required to create the virtual network - configuration for a virtual machine. If you do not include a - network configuration set you will not be able to access the VM - through VIPs over the internet. If your virtual machine belongs to - a virtual network you can not specify which subnet address space - it resides under. - availability_set_name: - Specifies the name of an availability set to which to add the - virtual machine. This value controls the virtual machine - allocation in the Windows Azure environment. Virtual machines - specified in the same availability set are allocated to different - nodes to maximize availability. - data_virtual_hard_disks: - Contains the parameters Windows Azure uses to create a data disk - for a virtual machine. - role_size: - The size of the virtual machine to allocate. The default value is - Small. Possible values are: ExtraSmall, Small, Medium, Large, - ExtraLarge. The specified value must be compatible with the disk - selected in the OSVirtualHardDisk values. - role_type: - The type of the role for the virtual machine. The only supported - value is PersistentVMRole. - virtual_network_name: - Specifies the name of an existing virtual network to which the - deployment will belong. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('deployment_slot', deployment_slot) - _validate_not_none('label', label) - _validate_not_none('role_name', role_name) - _validate_not_none('system_config', system_config) - _validate_not_none('os_virtual_hard_disk', os_virtual_hard_disk) - return self._perform_post( - self._get_deployment_path_using_name(service_name), - _XmlSerializer.virtual_machine_deployment_to_xml( - deployment_name, - deployment_slot, - label, - role_name, - system_config, - os_virtual_hard_disk, - role_type, - network_config, - availability_set_name, - data_virtual_hard_disks, - role_size, - virtual_network_name), - async=True) - - def add_role(self, service_name, deployment_name, role_name, system_config, - os_virtual_hard_disk, network_config=None, - availability_set_name=None, data_virtual_hard_disks=None, - role_size=None, role_type='PersistentVMRole'): - ''' - Adds a virtual machine to an existing deployment. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_name: The name of the role. - system_config: - Contains the metadata required to provision a virtual machine from - a Windows or Linux OS image. Use an instance of - WindowsConfigurationSet or LinuxConfigurationSet. - os_virtual_hard_disk: - Contains the parameters Windows Azure uses to create the operating - system disk for the virtual machine. - network_config: - Encapsulates the metadata required to create the virtual network - configuration for a virtual machine. If you do not include a - network configuration set you will not be able to access the VM - through VIPs over the internet. If your virtual machine belongs to - a virtual network you can not specify which subnet address space - it resides under. - availability_set_name: - Specifies the name of an availability set to which to add the - virtual machine. This value controls the virtual machine allocation - in the Windows Azure environment. Virtual machines specified in the - same availability set are allocated to different nodes to maximize - availability. - data_virtual_hard_disks: - Contains the parameters Windows Azure uses to create a data disk - for a virtual machine. - role_size: - The size of the virtual machine to allocate. The default value is - Small. Possible values are: ExtraSmall, Small, Medium, Large, - ExtraLarge. The specified value must be compatible with the disk - selected in the OSVirtualHardDisk values. - role_type: - The type of the role for the virtual machine. The only supported - value is PersistentVMRole. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_name', role_name) - _validate_not_none('system_config', system_config) - _validate_not_none('os_virtual_hard_disk', os_virtual_hard_disk) - return self._perform_post( - self._get_role_path(service_name, deployment_name), - _XmlSerializer.add_role_to_xml( - role_name, - system_config, - os_virtual_hard_disk, - role_type, - network_config, - availability_set_name, - data_virtual_hard_disks, - role_size), - async=True) - - def update_role(self, service_name, deployment_name, role_name, - os_virtual_hard_disk=None, network_config=None, - availability_set_name=None, data_virtual_hard_disks=None, - role_size=None, role_type='PersistentVMRole'): - ''' - Updates the specified virtual machine. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_name: The name of the role. - os_virtual_hard_disk: - Contains the parameters Windows Azure uses to create the operating - system disk for the virtual machine. - network_config: - Encapsulates the metadata required to create the virtual network - configuration for a virtual machine. If you do not include a - network configuration set you will not be able to access the VM - through VIPs over the internet. If your virtual machine belongs to - a virtual network you can not specify which subnet address space - it resides under. - availability_set_name: - Specifies the name of an availability set to which to add the - virtual machine. This value controls the virtual machine allocation - in the Windows Azure environment. Virtual machines specified in the - same availability set are allocated to different nodes to maximize - availability. - data_virtual_hard_disks: - Contains the parameters Windows Azure uses to create a data disk - for a virtual machine. - role_size: - The size of the virtual machine to allocate. The default value is - Small. Possible values are: ExtraSmall, Small, Medium, Large, - ExtraLarge. The specified value must be compatible with the disk - selected in the OSVirtualHardDisk values. - role_type: - The type of the role for the virtual machine. The only supported - value is PersistentVMRole. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_name', role_name) - return self._perform_put( - self._get_role_path(service_name, deployment_name, role_name), - _XmlSerializer.update_role_to_xml( - role_name, - os_virtual_hard_disk, - role_type, - network_config, - availability_set_name, - data_virtual_hard_disks, - role_size), - async=True) - - def delete_role(self, service_name, deployment_name, role_name): - ''' - Deletes the specified virtual machine. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_name: The name of the role. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_name', role_name) - return self._perform_delete( - self._get_role_path(service_name, deployment_name, role_name), - async=True) - - def capture_role(self, service_name, deployment_name, role_name, - post_capture_action, target_image_name, - target_image_label, provisioning_configuration=None): - ''' - The Capture Role operation captures a virtual machine image to your - image gallery. From the captured image, you can create additional - customized virtual machines. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_name: The name of the role. - post_capture_action: - Specifies the action after capture operation completes. Possible - values are: Delete, Reprovision. - target_image_name: - Specifies the image name of the captured virtual machine. - target_image_label: - Specifies the friendly name of the captured virtual machine. - provisioning_configuration: - Use an instance of WindowsConfigurationSet or LinuxConfigurationSet. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_name', role_name) - _validate_not_none('post_capture_action', post_capture_action) - _validate_not_none('target_image_name', target_image_name) - _validate_not_none('target_image_label', target_image_label) - return self._perform_post( - self._get_role_instance_operations_path( - service_name, deployment_name, role_name), - _XmlSerializer.capture_role_to_xml( - post_capture_action, - target_image_name, - target_image_label, - provisioning_configuration), - async=True) - - def start_role(self, service_name, deployment_name, role_name): - ''' - Starts the specified virtual machine. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_name: The name of the role. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_name', role_name) - return self._perform_post( - self._get_role_instance_operations_path( - service_name, deployment_name, role_name), - _XmlSerializer.start_role_operation_to_xml(), - async=True) - - def start_roles(self, service_name, deployment_name, role_names): - ''' - Starts the specified virtual machines. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_names: The names of the roles, as an enumerable of strings. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_names', role_names) - return self._perform_post( - self._get_roles_operations_path(service_name, deployment_name), - _XmlSerializer.start_roles_operation_to_xml(role_names), - async=True) - - def restart_role(self, service_name, deployment_name, role_name): - ''' - Restarts the specified virtual machine. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_name: The name of the role. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_name', role_name) - return self._perform_post( - self._get_role_instance_operations_path( - service_name, deployment_name, role_name), - _XmlSerializer.restart_role_operation_to_xml( - ), - async=True) - - def shutdown_role(self, service_name, deployment_name, role_name, - post_shutdown_action='Stopped'): - ''' - Shuts down the specified virtual machine. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_name: The name of the role. - post_shutdown_action: - Specifies how the Virtual Machine should be shut down. Values are: - Stopped - Shuts down the Virtual Machine but retains the compute - resources. You will continue to be billed for the resources - that the stopped machine uses. - StoppedDeallocated - Shuts down the Virtual Machine and releases the compute - resources. You are not billed for the compute resources that - this Virtual Machine uses. If a static Virtual Network IP - address is assigned to the Virtual Machine, it is reserved. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_name', role_name) - _validate_not_none('post_shutdown_action', post_shutdown_action) - return self._perform_post( - self._get_role_instance_operations_path( - service_name, deployment_name, role_name), - _XmlSerializer.shutdown_role_operation_to_xml(post_shutdown_action), - async=True) - - def shutdown_roles(self, service_name, deployment_name, role_names, - post_shutdown_action='Stopped'): - ''' - Shuts down the specified virtual machines. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_names: The names of the roles, as an enumerable of strings. - post_shutdown_action: - Specifies how the Virtual Machine should be shut down. Values are: - Stopped - Shuts down the Virtual Machine but retains the compute - resources. You will continue to be billed for the resources - that the stopped machine uses. - StoppedDeallocated - Shuts down the Virtual Machine and releases the compute - resources. You are not billed for the compute resources that - this Virtual Machine uses. If a static Virtual Network IP - address is assigned to the Virtual Machine, it is reserved. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_names', role_names) - _validate_not_none('post_shutdown_action', post_shutdown_action) - return self._perform_post( - self._get_roles_operations_path(service_name, deployment_name), - _XmlSerializer.shutdown_roles_operation_to_xml( - role_names, post_shutdown_action), - async=True) - - #--Operations for virtual machine images ----------------------------- - def list_os_images(self): - ''' - Retrieves a list of the OS images from the image repository. - ''' - return self._perform_get(self._get_image_path(), - Images) - - def get_os_image(self, image_name): - ''' - Retrieves an OS image from the image repository. - ''' - return self._perform_get(self._get_image_path(image_name), - OSImage) - - def add_os_image(self, label, media_link, name, os): - ''' - Adds an OS image that is currently stored in a storage account in your - subscription to the image repository. - - label: Specifies the friendly name of the image. - media_link: - Specifies the location of the blob in Windows Azure blob store - where the media for the image is located. The blob location must - belong to a storage account in the subscription specified by the - <subscription-id> value in the operation call. Example: - http://example.blob.core.windows.net/disks/mydisk.vhd - name: - Specifies a name for the OS image that Windows Azure uses to - identify the image when creating one or more virtual machines. - os: - The operating system type of the OS image. Possible values are: - Linux, Windows - ''' - _validate_not_none('label', label) - _validate_not_none('media_link', media_link) - _validate_not_none('name', name) - _validate_not_none('os', os) - return self._perform_post(self._get_image_path(), - _XmlSerializer.os_image_to_xml( - label, media_link, name, os), - async=True) - - def update_os_image(self, image_name, label, media_link, name, os): - ''' - Updates an OS image that in your image repository. - - image_name: The name of the image to update. - label: - Specifies the friendly name of the image to be updated. You cannot - use this operation to update images provided by the Windows Azure - platform. - media_link: - Specifies the location of the blob in Windows Azure blob store - where the media for the image is located. The blob location must - belong to a storage account in the subscription specified by the - <subscription-id> value in the operation call. Example: - http://example.blob.core.windows.net/disks/mydisk.vhd - name: - Specifies a name for the OS image that Windows Azure uses to - identify the image when creating one or more VM Roles. - os: - The operating system type of the OS image. Possible values are: - Linux, Windows - ''' - _validate_not_none('image_name', image_name) - _validate_not_none('label', label) - _validate_not_none('media_link', media_link) - _validate_not_none('name', name) - _validate_not_none('os', os) - return self._perform_put(self._get_image_path(image_name), - _XmlSerializer.os_image_to_xml( - label, media_link, name, os), - async=True) - - def delete_os_image(self, image_name, delete_vhd=False): - ''' - Deletes the specified OS image from your image repository. - - image_name: The name of the image. - delete_vhd: Deletes the underlying vhd blob in Azure storage. - ''' - _validate_not_none('image_name', image_name) - path = self._get_image_path(image_name) - if delete_vhd: - path += '?comp=media' - return self._perform_delete(path, async=True) - - #--Operations for virtual machine disks ------------------------------ - def get_data_disk(self, service_name, deployment_name, role_name, lun): - ''' - Retrieves the specified data disk from a virtual machine. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_name: The name of the role. - lun: The Logical Unit Number (LUN) for the disk. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_name', role_name) - _validate_not_none('lun', lun) - return self._perform_get( - self._get_data_disk_path( - service_name, deployment_name, role_name, lun), - DataVirtualHardDisk) - - def add_data_disk(self, service_name, deployment_name, role_name, lun, - host_caching=None, media_link=None, disk_label=None, - disk_name=None, logical_disk_size_in_gb=None, - source_media_link=None): - ''' - Adds a data disk to a virtual machine. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_name: The name of the role. - lun: - Specifies the Logical Unit Number (LUN) for the disk. The LUN - specifies the slot in which the data drive appears when mounted - for usage by the virtual machine. Valid LUN values are 0 through 15. - host_caching: - Specifies the platform caching behavior of data disk blob for - read/write efficiency. The default vault is ReadOnly. Possible - values are: None, ReadOnly, ReadWrite - media_link: - Specifies the location of the blob in Windows Azure blob store - where the media for the disk is located. The blob location must - belong to the storage account in the subscription specified by the - <subscription-id> value in the operation call. Example: - http://example.blob.core.windows.net/disks/mydisk.vhd - disk_label: - Specifies the description of the data disk. When you attach a disk, - either by directly referencing a media using the MediaLink element - or specifying the target disk size, you can use the DiskLabel - element to customize the name property of the target data disk. - disk_name: - Specifies the name of the disk. Windows Azure uses the specified - disk to create the data disk for the machine and populates this - field with the disk name. - logical_disk_size_in_gb: - Specifies the size, in GB, of an empty disk to be attached to the - role. The disk can be created as part of disk attach or create VM - role call by specifying the value for this property. Windows Azure - creates the empty disk based on size preference and attaches the - newly created disk to the Role. - source_media_link: - Specifies the location of a blob in account storage which is - mounted as a data disk when the virtual machine is created. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_name', role_name) - _validate_not_none('lun', lun) - return self._perform_post( - self._get_data_disk_path(service_name, deployment_name, role_name), - _XmlSerializer.data_virtual_hard_disk_to_xml( - host_caching, - disk_label, - disk_name, - lun, - logical_disk_size_in_gb, - media_link, - source_media_link), - async=True) - - def update_data_disk(self, service_name, deployment_name, role_name, lun, - host_caching=None, media_link=None, updated_lun=None, - disk_label=None, disk_name=None, - logical_disk_size_in_gb=None): - ''' - Updates the specified data disk attached to the specified virtual - machine. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_name: The name of the role. - lun: - Specifies the Logical Unit Number (LUN) for the disk. The LUN - specifies the slot in which the data drive appears when mounted - for usage by the virtual machine. Valid LUN values are 0 through - 15. - host_caching: - Specifies the platform caching behavior of data disk blob for - read/write efficiency. The default vault is ReadOnly. Possible - values are: None, ReadOnly, ReadWrite - media_link: - Specifies the location of the blob in Windows Azure blob store - where the media for the disk is located. The blob location must - belong to the storage account in the subscription specified by - the <subscription-id> value in the operation call. Example: - http://example.blob.core.windows.net/disks/mydisk.vhd - updated_lun: - Specifies the Logical Unit Number (LUN) for the disk. The LUN - specifies the slot in which the data drive appears when mounted - for usage by the virtual machine. Valid LUN values are 0 through 15. - disk_label: - Specifies the description of the data disk. When you attach a disk, - either by directly referencing a media using the MediaLink element - or specifying the target disk size, you can use the DiskLabel - element to customize the name property of the target data disk. - disk_name: - Specifies the name of the disk. Windows Azure uses the specified - disk to create the data disk for the machine and populates this - field with the disk name. - logical_disk_size_in_gb: - Specifies the size, in GB, of an empty disk to be attached to the - role. The disk can be created as part of disk attach or create VM - role call by specifying the value for this property. Windows Azure - creates the empty disk based on size preference and attaches the - newly created disk to the Role. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_name', role_name) - _validate_not_none('lun', lun) - return self._perform_put( - self._get_data_disk_path( - service_name, deployment_name, role_name, lun), - _XmlSerializer.data_virtual_hard_disk_to_xml( - host_caching, - disk_label, - disk_name, - updated_lun, - logical_disk_size_in_gb, - media_link, - None), - async=True) - - def delete_data_disk(self, service_name, deployment_name, role_name, lun, delete_vhd=False): - ''' - Removes the specified data disk from a virtual machine. - - service_name: The name of the service. - deployment_name: The name of the deployment. - role_name: The name of the role. - lun: The Logical Unit Number (LUN) for the disk. - delete_vhd: Deletes the underlying vhd blob in Azure storage. - ''' - _validate_not_none('service_name', service_name) - _validate_not_none('deployment_name', deployment_name) - _validate_not_none('role_name', role_name) - _validate_not_none('lun', lun) - path = self._get_data_disk_path(service_name, deployment_name, role_name, lun) - if delete_vhd: - path += '?comp=media' - return self._perform_delete(path, async=True) - - #--Operations for virtual machine disks ------------------------------ - def list_disks(self): - ''' - Retrieves a list of the disks in your image repository. - ''' - return self._perform_get(self._get_disk_path(), - Disks) - - def get_disk(self, disk_name): - ''' - Retrieves a disk from your image repository. - ''' - return self._perform_get(self._get_disk_path(disk_name), - Disk) - - def add_disk(self, has_operating_system, label, media_link, name, os): - ''' - Adds a disk to the user image repository. The disk can be an OS disk - or a data disk. - - has_operating_system: - Specifies whether the disk contains an operation system. Only a - disk with an operating system installed can be mounted as OS Drive. - label: Specifies the description of the disk. - media_link: - Specifies the location of the blob in Windows Azure blob store - where the media for the disk is located. The blob location must - belong to the storage account in the current subscription specified - by the <subscription-id> value in the operation call. Example: - http://example.blob.core.windows.net/disks/mydisk.vhd - name: - Specifies a name for the disk. Windows Azure uses the name to - identify the disk when creating virtual machines from the disk. - os: The OS type of the disk. Possible values are: Linux, Windows - ''' - _validate_not_none('has_operating_system', has_operating_system) - _validate_not_none('label', label) - _validate_not_none('media_link', media_link) - _validate_not_none('name', name) - _validate_not_none('os', os) - return self._perform_post(self._get_disk_path(), - _XmlSerializer.disk_to_xml( - has_operating_system, - label, - media_link, - name, - os)) - - def update_disk(self, disk_name, has_operating_system, label, media_link, - name, os): - ''' - Updates an existing disk in your image repository. - - disk_name: The name of the disk to update. - has_operating_system: - Specifies whether the disk contains an operation system. Only a - disk with an operating system installed can be mounted as OS Drive. - label: Specifies the description of the disk. - media_link: - Specifies the location of the blob in Windows Azure blob store - where the media for the disk is located. The blob location must - belong to the storage account in the current subscription specified - by the <subscription-id> value in the operation call. Example: - http://example.blob.core.windows.net/disks/mydisk.vhd - name: - Specifies a name for the disk. Windows Azure uses the name to - identify the disk when creating virtual machines from the disk. - os: The OS type of the disk. Possible values are: Linux, Windows - ''' - _validate_not_none('disk_name', disk_name) - _validate_not_none('has_operating_system', has_operating_system) - _validate_not_none('label', label) - _validate_not_none('media_link', media_link) - _validate_not_none('name', name) - _validate_not_none('os', os) - return self._perform_put(self._get_disk_path(disk_name), - _XmlSerializer.disk_to_xml( - has_operating_system, - label, - media_link, - name, - os)) - - def delete_disk(self, disk_name, delete_vhd=False): - ''' - Deletes the specified data or operating system disk from your image - repository. - - disk_name: The name of the disk to delete. - delete_vhd: Deletes the underlying vhd blob in Azure storage. - ''' - _validate_not_none('disk_name', disk_name) - path = self._get_disk_path(disk_name) - if delete_vhd: - path += '?comp=media' - return self._perform_delete(path) - - #--Operations for virtual networks ------------------------------ - def list_virtual_network_sites(self): - ''' - Retrieves a list of the virtual networks. - ''' - return self._perform_get(self._get_virtual_network_site_path(), VirtualNetworkSites) - - #--Helper functions -------------------------------------------------- - def _get_virtual_network_site_path(self): - return self._get_path('services/networking/virtualnetwork', None) - - def _get_storage_service_path(self, service_name=None): - return self._get_path('services/storageservices', service_name) - - def _get_hosted_service_path(self, service_name=None): - return self._get_path('services/hostedservices', service_name) - - def _get_deployment_path_using_slot(self, service_name, slot=None): - return self._get_path('services/hostedservices/' + _str(service_name) + - '/deploymentslots', slot) - - def _get_deployment_path_using_name(self, service_name, - deployment_name=None): - return self._get_path('services/hostedservices/' + _str(service_name) + - '/deployments', deployment_name) - - def _get_role_path(self, service_name, deployment_name, role_name=None): - return self._get_path('services/hostedservices/' + _str(service_name) + - '/deployments/' + deployment_name + - '/roles', role_name) - - def _get_role_instance_operations_path(self, service_name, deployment_name, - role_name=None): - return self._get_path('services/hostedservices/' + _str(service_name) + - '/deployments/' + deployment_name + - '/roleinstances', role_name) + '/Operations' - - def _get_roles_operations_path(self, service_name, deployment_name): - return self._get_path('services/hostedservices/' + _str(service_name) + - '/deployments/' + deployment_name + - '/roles/Operations', None) - - def _get_data_disk_path(self, service_name, deployment_name, role_name, - lun=None): - return self._get_path('services/hostedservices/' + _str(service_name) + - '/deployments/' + _str(deployment_name) + - '/roles/' + _str(role_name) + '/DataDisks', lun) - - def _get_disk_path(self, disk_name=None): - return self._get_path('services/disks', disk_name) - - def _get_image_path(self, image_name=None): - return self._get_path('services/images', image_name) +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +from azure import ( + WindowsAzureError, + MANAGEMENT_HOST, + _str, + _validate_not_none, + ) +from azure.servicemanagement import ( + AffinityGroups, + AffinityGroup, + AvailabilityResponse, + Certificate, + Certificates, + DataVirtualHardDisk, + Deployment, + Disk, + Disks, + Locations, + Operation, + HostedService, + HostedServices, + Images, + OperatingSystems, + OperatingSystemFamilies, + OSImage, + PersistentVMRole, + ResourceExtensions, + ReservedIP, + ReservedIPs, + RoleSize, + RoleSizes, + StorageService, + StorageServices, + Subscription, + Subscriptions, + SubscriptionCertificate, + SubscriptionCertificates, + VirtualNetworkSites, + VMImages, + _XmlSerializer, + ) +from azure.servicemanagement.servicemanagementclient import ( + _ServiceManagementClient, + ) + +class ServiceManagementService(_ServiceManagementClient): + + def __init__(self, subscription_id=None, cert_file=None, + host=MANAGEMENT_HOST, request_session=None): + ''' + Initializes the management service. + + subscription_id: Subscription to manage. + cert_file: + Path to .pem certificate file (httplib), or location of the + certificate in your Personal certificate store (winhttp) in the + CURRENT_USER\my\CertificateName format. + If a request_session is specified, then this is unused. + host: Live ServiceClient URL. Defaults to Azure public cloud. + request_session: + Session object to use for http requests. If this is specified, it + replaces the default use of httplib or winhttp. Also, the cert_file + parameter is unused when a session is passed in. + The session object handles authentication, and as such can support + multiple types of authentication: .pem certificate, oauth. + For example, you can pass in a Session instance from the requests + library. To use .pem certificate authentication with requests + library, set the path to the .pem file on the session.cert + attribute. + ''' + super(ServiceManagementService, self).__init__( + subscription_id, cert_file, host, request_session) + + #--Operations for subscriptions -------------------------------------- + def list_role_sizes(self): + ''' + Lists the role sizes that are available under the specified + subscription. + ''' + return self._perform_get(self._get_role_sizes_path(), + RoleSizes) + + def list_subscriptions(self): + ''' + Returns a list of subscriptions that you can access. + + You must make sure that the request that is made to the management + service is secure using an Active Directory access token. + ''' + return self._perform_get(self._get_subscriptions_path(), + Subscriptions) + + #--Operations for storage accounts ----------------------------------- + def list_storage_accounts(self): + ''' + Lists the storage accounts available under the current subscription. + ''' + return self._perform_get(self._get_storage_service_path(), + StorageServices) + + def get_storage_account_properties(self, service_name): + ''' + Returns system properties for the specified storage account. + + service_name: Name of the storage service account. + ''' + _validate_not_none('service_name', service_name) + return self._perform_get(self._get_storage_service_path(service_name), + StorageService) + + def get_storage_account_keys(self, service_name): + ''' + Returns the primary and secondary access keys for the specified + storage account. + + service_name: Name of the storage service account. + ''' + _validate_not_none('service_name', service_name) + return self._perform_get( + self._get_storage_service_path(service_name) + '/keys', + StorageService) + + def regenerate_storage_account_keys(self, service_name, key_type): + ''' + Regenerates the primary or secondary access key for the specified + storage account. + + service_name: Name of the storage service account. + key_type: + Specifies which key to regenerate. Valid values are: + Primary, Secondary + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('key_type', key_type) + return self._perform_post( + self._get_storage_service_path( + service_name) + '/keys?action=regenerate', + _XmlSerializer.regenerate_keys_to_xml( + key_type), + StorageService) + + def create_storage_account(self, service_name, description, label, + affinity_group=None, location=None, + geo_replication_enabled=None, + extended_properties=None, + account_type='Standard_GRS'): + ''' + Creates a new storage account in Windows Azure. + + service_name: + A name for the storage account that is unique within Windows Azure. + Storage account names must be between 3 and 24 characters in length + and use numbers and lower-case letters only. + description: + A description for the storage account. The description may be up + to 1024 characters in length. + label: + A name for the storage account. The name may be up to 100 + characters in length. The name can be used to identify the storage + account for your tracking purposes. + affinity_group: + The name of an existing affinity group in the specified + subscription. You can specify either a location or affinity_group, + but not both. + location: + The location where the storage account is created. You can specify + either a location or affinity_group, but not both. + geo_replication_enabled: + Deprecated. Replaced by the account_type parameter. + extended_properties: + Dictionary containing name/value pairs of storage account + properties. You can have a maximum of 50 extended property + name/value pairs. The maximum length of the Name element is 64 + characters, only alphanumeric characters and underscores are valid + in the Name, and the name must start with a letter. The value has + a maximum length of 255 characters. + account_type: + Specifies whether the account supports locally-redundant storage, + geo-redundant storage, zone-redundant storage, or read access + geo-redundant storage. + Possible values are: + Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('description', description) + _validate_not_none('label', label) + if affinity_group is None and location is None: + raise WindowsAzureError( + 'location or affinity_group must be specified') + if affinity_group is not None and location is not None: + raise WindowsAzureError( + 'Only one of location or affinity_group needs to be specified') + if geo_replication_enabled == False: + account_type = 'Standard_LRS' + return self._perform_post( + self._get_storage_service_path(), + _XmlSerializer.create_storage_service_input_to_xml( + service_name, + description, + label, + affinity_group, + location, + account_type, + extended_properties), + async=True) + + def update_storage_account(self, service_name, description=None, + label=None, geo_replication_enabled=None, + extended_properties=None, + account_type='Standard_GRS'): + ''' + Updates the label, the description, and enables or disables the + geo-replication status for a storage account in Windows Azure. + + service_name: Name of the storage service account. + description: + A description for the storage account. The description may be up + to 1024 characters in length. + label: + A name for the storage account. The name may be up to 100 + characters in length. The name can be used to identify the storage + account for your tracking purposes. + geo_replication_enabled: + Deprecated. Replaced by the account_type parameter. + extended_properties: + Dictionary containing name/value pairs of storage account + properties. You can have a maximum of 50 extended property + name/value pairs. The maximum length of the Name element is 64 + characters, only alphanumeric characters and underscores are valid + in the Name, and the name must start with a letter. The value has + a maximum length of 255 characters. + account_type: + Specifies whether the account supports locally-redundant storage, + geo-redundant storage, zone-redundant storage, or read access + geo-redundant storage. + Possible values are: + Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS + ''' + _validate_not_none('service_name', service_name) + if geo_replication_enabled == False: + account_type = 'Standard_LRS' + return self._perform_put( + self._get_storage_service_path(service_name), + _XmlSerializer.update_storage_service_input_to_xml( + description, + label, + account_type, + extended_properties)) + + def delete_storage_account(self, service_name): + ''' + Deletes the specified storage account from Windows Azure. + + service_name: Name of the storage service account. + ''' + _validate_not_none('service_name', service_name) + return self._perform_delete( + self._get_storage_service_path(service_name)) + + def check_storage_account_name_availability(self, service_name): + ''' + Checks to see if the specified storage account name is available, or + if it has already been taken. + + service_name: Name of the storage service account. + ''' + _validate_not_none('service_name', service_name) + return self._perform_get( + self._get_storage_service_path() + + '/operations/isavailable/' + + _str(service_name) + '', + AvailabilityResponse) + + #--Operations for hosted services ------------------------------------ + def list_hosted_services(self): + ''' + Lists the hosted services available under the current subscription. + ''' + return self._perform_get(self._get_hosted_service_path(), + HostedServices) + + def get_hosted_service_properties(self, service_name, embed_detail=False): + ''' + Retrieves system properties for the specified hosted service. These + properties include the service name and service type; the name of the + affinity group to which the service belongs, or its location if it is + not part of an affinity group; and optionally, information on the + service's deployments. + + service_name: Name of the hosted service. + embed_detail: + When True, the management service returns properties for all + deployments of the service, as well as for the service itself. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('embed_detail', embed_detail) + return self._perform_get( + self._get_hosted_service_path(service_name) + + '?embed-detail=' + + _str(embed_detail).lower(), + HostedService) + + def create_hosted_service(self, service_name, label, description=None, + location=None, affinity_group=None, + extended_properties=None): + ''' + Creates a new hosted service in Windows Azure. + + service_name: + A name for the hosted service that is unique within Windows Azure. + This name is the DNS prefix name and can be used to access the + hosted service. + label: + A name for the hosted service. The name can be up to 100 characters + in length. The name can be used to identify the storage account for + your tracking purposes. + description: + A description for the hosted service. The description can be up to + 1024 characters in length. + location: + The location where the hosted service will be created. You can + specify either a location or affinity_group, but not both. + affinity_group: + The name of an existing affinity group associated with this + subscription. This name is a GUID and can be retrieved by examining + the name element of the response body returned by + list_affinity_groups. You can specify either a location or + affinity_group, but not both. + extended_properties: + Dictionary containing name/value pairs of storage account + properties. You can have a maximum of 50 extended property + name/value pairs. The maximum length of the Name element is 64 + characters, only alphanumeric characters and underscores are valid + in the Name, and the name must start with a letter. The value has + a maximum length of 255 characters. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('label', label) + if affinity_group is None and location is None: + raise WindowsAzureError( + 'location or affinity_group must be specified') + if affinity_group is not None and location is not None: + raise WindowsAzureError( + 'Only one of location or affinity_group needs to be specified') + return self._perform_post(self._get_hosted_service_path(), + _XmlSerializer.create_hosted_service_to_xml( + service_name, + label, + description, + location, + affinity_group, + extended_properties)) + + def update_hosted_service(self, service_name, label=None, description=None, + extended_properties=None): + ''' + Updates the label and/or the description for a hosted service in + Windows Azure. + + service_name: Name of the hosted service. + label: + A name for the hosted service. The name may be up to 100 characters + in length. You must specify a value for either Label or + Description, or for both. It is recommended that the label be + unique within the subscription. The name can be used + identify the hosted service for your tracking purposes. + description: + A description for the hosted service. The description may be up to + 1024 characters in length. You must specify a value for either + Label or Description, or for both. + extended_properties: + Dictionary containing name/value pairs of storage account + properties. You can have a maximum of 50 extended property + name/value pairs. The maximum length of the Name element is 64 + characters, only alphanumeric characters and underscores are valid + in the Name, and the name must start with a letter. The value has + a maximum length of 255 characters. + ''' + _validate_not_none('service_name', service_name) + return self._perform_put(self._get_hosted_service_path(service_name), + _XmlSerializer.update_hosted_service_to_xml( + label, + description, + extended_properties)) + + def delete_hosted_service(self, service_name): + ''' + Deletes the specified hosted service from Windows Azure. + + service_name: Name of the hosted service. + ''' + _validate_not_none('service_name', service_name) + return self._perform_delete(self._get_hosted_service_path(service_name)) + + def get_deployment_by_slot(self, service_name, deployment_slot): + ''' + Returns configuration information, status, and system properties for + a deployment. + + service_name: Name of the hosted service. + deployment_slot: + The environment to which the hosted service is deployed. Valid + values are: staging, production + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_slot', deployment_slot) + return self._perform_get( + self._get_deployment_path_using_slot( + service_name, deployment_slot), + Deployment) + + def get_deployment_by_name(self, service_name, deployment_name): + ''' + Returns configuration information, status, and system properties for a + deployment. + + service_name: Name of the hosted service. + deployment_name: The name of the deployment. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + return self._perform_get( + self._get_deployment_path_using_name( + service_name, deployment_name), + Deployment) + + def create_deployment(self, service_name, deployment_slot, name, + package_url, label, configuration, + start_deployment=False, + treat_warnings_as_error=False, + extended_properties=None): + ''' + Uploads a new service package and creates a new deployment on staging + or production. + + service_name: Name of the hosted service. + deployment_slot: + The environment to which the hosted service is deployed. Valid + values are: staging, production + name: + The name for the deployment. The deployment name must be unique + among other deployments for the hosted service. + package_url: + A URL that refers to the location of the service package in the + Blob service. The service package can be located either in a + storage account beneath the same subscription or a Shared Access + Signature (SAS) URI from any storage account. + label: + A name for the hosted service. The name can be up to 100 characters + in length. It is recommended that the label be unique within the + subscription. The name can be used to identify the hosted service + for your tracking purposes. + configuration: + The base-64 encoded service configuration file for the deployment. + start_deployment: + Indicates whether to start the deployment immediately after it is + created. If false, the service model is still deployed to the + virtual machines but the code is not run immediately. Instead, the + service is Suspended until you call Update Deployment Status and + set the status to Running, at which time the service will be + started. A deployed service still incurs charges, even if it is + suspended. + treat_warnings_as_error: + Indicates whether to treat package validation warnings as errors. + If set to true, the Created Deployment operation fails if there + are validation warnings on the service package. + extended_properties: + Dictionary containing name/value pairs of storage account + properties. You can have a maximum of 50 extended property + name/value pairs. The maximum length of the Name element is 64 + characters, only alphanumeric characters and underscores are valid + in the Name, and the name must start with a letter. The value has + a maximum length of 255 characters. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_slot', deployment_slot) + _validate_not_none('name', name) + _validate_not_none('package_url', package_url) + _validate_not_none('label', label) + _validate_not_none('configuration', configuration) + return self._perform_post( + self._get_deployment_path_using_slot( + service_name, deployment_slot), + _XmlSerializer.create_deployment_to_xml( + name, + package_url, + label, + configuration, + start_deployment, + treat_warnings_as_error, + extended_properties), + async=True) + + def delete_deployment(self, service_name, deployment_name): + ''' + Deletes the specified deployment. + + service_name: Name of the hosted service. + deployment_name: The name of the deployment. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + return self._perform_delete( + self._get_deployment_path_using_name( + service_name, deployment_name), + async=True) + + def swap_deployment(self, service_name, production, source_deployment): + ''' + Initiates a virtual IP swap between the staging and production + deployment environments for a service. If the service is currently + running in the staging environment, it will be swapped to the + production environment. If it is running in the production + environment, it will be swapped to staging. + + service_name: Name of the hosted service. + production: The name of the production deployment. + source_deployment: The name of the source deployment. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('production', production) + _validate_not_none('source_deployment', source_deployment) + return self._perform_post(self._get_hosted_service_path(service_name), + _XmlSerializer.swap_deployment_to_xml( + production, source_deployment), + async=True) + + def change_deployment_configuration(self, service_name, deployment_name, + configuration, + treat_warnings_as_error=False, + mode='Auto', extended_properties=None): + ''' + Initiates a change to the deployment configuration. + + service_name: Name of the hosted service. + deployment_name: The name of the deployment. + configuration: + The base-64 encoded service configuration file for the deployment. + treat_warnings_as_error: + Indicates whether to treat package validation warnings as errors. + If set to true, the Created Deployment operation fails if there + are validation warnings on the service package. + mode: + If set to Manual, WalkUpgradeDomain must be called to apply the + update. If set to Auto, the Windows Azure platform will + automatically apply the update To each upgrade domain for the + service. Possible values are: Auto, Manual + extended_properties: + Dictionary containing name/value pairs of storage account + properties. You can have a maximum of 50 extended property + name/value pairs. The maximum length of the Name element is 64 + characters, only alphanumeric characters and underscores are valid + in the Name, and the name must start with a letter. The value has + a maximum length of 255 characters. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('configuration', configuration) + return self._perform_post( + self._get_deployment_path_using_name( + service_name, deployment_name) + '/?comp=config', + _XmlSerializer.change_deployment_to_xml( + configuration, + treat_warnings_as_error, + mode, + extended_properties), + async=True) + + def update_deployment_status(self, service_name, deployment_name, status): + ''' + Initiates a change in deployment status. + + service_name: Name of the hosted service. + deployment_name: The name of the deployment. + status: + The change to initiate to the deployment status. Possible values + include: Running, Suspended + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('status', status) + return self._perform_post( + self._get_deployment_path_using_name( + service_name, deployment_name) + '/?comp=status', + _XmlSerializer.update_deployment_status_to_xml( + status), + async=True) + + def upgrade_deployment(self, service_name, deployment_name, mode, + package_url, configuration, label, force, + role_to_upgrade=None, extended_properties=None): + ''' + Initiates an upgrade. + + service_name: Name of the hosted service. + deployment_name: The name of the deployment. + mode: + If set to Manual, WalkUpgradeDomain must be called to apply the + update. If set to Auto, the Windows Azure platform will + automatically apply the update To each upgrade domain for the + service. Possible values are: Auto, Manual + package_url: + A URL that refers to the location of the service package in the + Blob service. The service package can be located either in a + storage account beneath the same subscription or a Shared Access + Signature (SAS) URI from any storage account. + configuration: + The base-64 encoded service configuration file for the deployment. + label: + A name for the hosted service. The name can be up to 100 characters + in length. It is recommended that the label be unique within the + subscription. The name can be used to identify the hosted service + for your tracking purposes. + force: + Specifies whether the rollback should proceed even when it will + cause local data to be lost from some role instances. True if the + rollback should proceed; otherwise false if the rollback should + fail. + role_to_upgrade: The name of the specific role to upgrade. + extended_properties: + Dictionary containing name/value pairs of storage account + properties. You can have a maximum of 50 extended property + name/value pairs. The maximum length of the Name element is 64 + characters, only alphanumeric characters and underscores are valid + in the Name, and the name must start with a letter. The value has + a maximum length of 255 characters. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('mode', mode) + _validate_not_none('package_url', package_url) + _validate_not_none('configuration', configuration) + _validate_not_none('label', label) + _validate_not_none('force', force) + return self._perform_post( + self._get_deployment_path_using_name( + service_name, deployment_name) + '/?comp=upgrade', + _XmlSerializer.upgrade_deployment_to_xml( + mode, + package_url, + configuration, + label, + role_to_upgrade, + force, + extended_properties), + async=True) + + def walk_upgrade_domain(self, service_name, deployment_name, + upgrade_domain): + ''' + Specifies the next upgrade domain to be walked during manual in-place + upgrade or configuration change. + + service_name: Name of the hosted service. + deployment_name: The name of the deployment. + upgrade_domain: + An integer value that identifies the upgrade domain to walk. + Upgrade domains are identified with a zero-based index: the first + upgrade domain has an ID of 0, the second has an ID of 1, and so on. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('upgrade_domain', upgrade_domain) + return self._perform_post( + self._get_deployment_path_using_name( + service_name, deployment_name) + '/?comp=walkupgradedomain', + _XmlSerializer.walk_upgrade_domain_to_xml( + upgrade_domain), + async=True) + + def rollback_update_or_upgrade(self, service_name, deployment_name, mode, + force): + ''' + Cancels an in progress configuration change (update) or upgrade and + returns the deployment to its state before the upgrade or + configuration change was started. + + service_name: Name of the hosted service. + deployment_name: The name of the deployment. + mode: + Specifies whether the rollback should proceed automatically. + auto - The rollback proceeds without further user input. + manual - You must call the Walk Upgrade Domain operation to + apply the rollback to each upgrade domain. + force: + Specifies whether the rollback should proceed even when it will + cause local data to be lost from some role instances. True if the + rollback should proceed; otherwise false if the rollback should + fail. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('mode', mode) + _validate_not_none('force', force) + return self._perform_post( + self._get_deployment_path_using_name( + service_name, deployment_name) + '/?comp=rollback', + _XmlSerializer.rollback_upgrade_to_xml( + mode, force), + async=True) + + def reboot_role_instance(self, service_name, deployment_name, + role_instance_name): + ''' + Requests a reboot of a role instance that is running in a deployment. + + service_name: Name of the hosted service. + deployment_name: The name of the deployment. + role_instance_name: The name of the role instance. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_instance_name', role_instance_name) + return self._perform_post( + self._get_deployment_path_using_name( + service_name, deployment_name) + \ + '/roleinstances/' + _str(role_instance_name) + \ + '?comp=reboot', + '', + async=True) + + def reimage_role_instance(self, service_name, deployment_name, + role_instance_name): + ''' + Requests a reimage of a role instance that is running in a deployment. + + service_name: Name of the hosted service. + deployment_name: The name of the deployment. + role_instance_name: The name of the role instance. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_instance_name', role_instance_name) + return self._perform_post( + self._get_deployment_path_using_name( + service_name, deployment_name) + \ + '/roleinstances/' + _str(role_instance_name) + \ + '?comp=reimage', + '', + async=True) + + def rebuild_role_instance(self, service_name, deployment_name, + role_instance_name): + ''' + Reinstalls the operating system on instances of web roles or worker + roles and initializes the storage resources that are used by them. If + you do not want to initialize storage resources, you can use + reimage_role_instance. + + service_name: Name of the hosted service. + deployment_name: The name of the deployment. + role_instance_name: The name of the role instance. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_instance_name', role_instance_name) + return self._perform_post( + self._get_deployment_path_using_name( + service_name, deployment_name) + \ + '/roleinstances/' + _str(role_instance_name) + \ + '?comp=rebuild&resources=allLocalDrives', + '', + async=True) + + def delete_role_instances(self, service_name, deployment_name, + role_instance_names): + ''' + Reinstalls the operating system on instances of web roles or worker + roles and initializes the storage resources that are used by them. If + you do not want to initialize storage resources, you can use + reimage_role_instance. + + service_name: Name of the hosted service. + deployment_name: The name of the deployment. + role_instance_names: List of role instance names. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_instance_names', role_instance_names) + return self._perform_post( + self._get_deployment_path_using_name( + service_name, deployment_name) + '/roleinstances/?comp=delete', + _XmlSerializer.role_instances_to_xml(role_instance_names), + async=True) + + def check_hosted_service_name_availability(self, service_name): + ''' + Checks to see if the specified hosted service name is available, or if + it has already been taken. + + service_name: Name of the hosted service. + ''' + _validate_not_none('service_name', service_name) + return self._perform_get( + '/' + self.subscription_id + + '/services/hostedservices/operations/isavailable/' + + _str(service_name) + '', + AvailabilityResponse) + + #--Operations for service certificates ------------------------------- + def list_service_certificates(self, service_name): + ''' + Lists all of the service certificates associated with the specified + hosted service. + + service_name: Name of the hosted service. + ''' + _validate_not_none('service_name', service_name) + return self._perform_get( + '/' + self.subscription_id + '/services/hostedservices/' + + _str(service_name) + '/certificates', + Certificates) + + def get_service_certificate(self, service_name, thumbalgorithm, thumbprint): + ''' + Returns the public data for the specified X.509 certificate associated + with a hosted service. + + service_name: Name of the hosted service. + thumbalgorithm: The algorithm for the certificate's thumbprint. + thumbprint: The hexadecimal representation of the thumbprint. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('thumbalgorithm', thumbalgorithm) + _validate_not_none('thumbprint', thumbprint) + return self._perform_get( + '/' + self.subscription_id + '/services/hostedservices/' + + _str(service_name) + '/certificates/' + + _str(thumbalgorithm) + '-' + _str(thumbprint) + '', + Certificate) + + def add_service_certificate(self, service_name, data, certificate_format, + password): + ''' + Adds a certificate to a hosted service. + + service_name: Name of the hosted service. + data: The base-64 encoded form of the pfx file. + certificate_format: + The service certificate format. The only supported value is pfx. + password: The certificate password. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('data', data) + _validate_not_none('certificate_format', certificate_format) + _validate_not_none('password', password) + return self._perform_post( + '/' + self.subscription_id + '/services/hostedservices/' + + _str(service_name) + '/certificates', + _XmlSerializer.certificate_file_to_xml( + data, certificate_format, password), + async=True) + + def delete_service_certificate(self, service_name, thumbalgorithm, + thumbprint): + ''' + Deletes a service certificate from the certificate store of a hosted + service. + + service_name: Name of the hosted service. + thumbalgorithm: The algorithm for the certificate's thumbprint. + thumbprint: The hexadecimal representation of the thumbprint. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('thumbalgorithm', thumbalgorithm) + _validate_not_none('thumbprint', thumbprint) + return self._perform_delete( + '/' + self.subscription_id + '/services/hostedservices/' + + _str(service_name) + '/certificates/' + + _str(thumbalgorithm) + '-' + _str(thumbprint), + async=True) + + #--Operations for management certificates ---------------------------- + def list_management_certificates(self): + ''' + The List Management Certificates operation lists and returns basic + information about all of the management certificates associated with + the specified subscription. Management certificates, which are also + known as subscription certificates, authenticate clients attempting to + connect to resources associated with your Windows Azure subscription. + ''' + return self._perform_get('/' + self.subscription_id + '/certificates', + SubscriptionCertificates) + + def get_management_certificate(self, thumbprint): + ''' + The Get Management Certificate operation retrieves information about + the management certificate with the specified thumbprint. Management + certificates, which are also known as subscription certificates, + authenticate clients attempting to connect to resources associated + with your Windows Azure subscription. + + thumbprint: The thumbprint value of the certificate. + ''' + _validate_not_none('thumbprint', thumbprint) + return self._perform_get( + '/' + self.subscription_id + '/certificates/' + _str(thumbprint), + SubscriptionCertificate) + + def add_management_certificate(self, public_key, thumbprint, data): + ''' + The Add Management Certificate operation adds a certificate to the + list of management certificates. Management certificates, which are + also known as subscription certificates, authenticate clients + attempting to connect to resources associated with your Windows Azure + subscription. + + public_key: + A base64 representation of the management certificate public key. + thumbprint: + The thumb print that uniquely identifies the management + certificate. + data: The certificate's raw data in base-64 encoded .cer format. + ''' + _validate_not_none('public_key', public_key) + _validate_not_none('thumbprint', thumbprint) + _validate_not_none('data', data) + return self._perform_post( + '/' + self.subscription_id + '/certificates', + _XmlSerializer.subscription_certificate_to_xml( + public_key, thumbprint, data)) + + def delete_management_certificate(self, thumbprint): + ''' + The Delete Management Certificate operation deletes a certificate from + the list of management certificates. Management certificates, which + are also known as subscription certificates, authenticate clients + attempting to connect to resources associated with your Windows Azure + subscription. + + thumbprint: + The thumb print that uniquely identifies the management + certificate. + ''' + _validate_not_none('thumbprint', thumbprint) + return self._perform_delete( + '/' + self.subscription_id + '/certificates/' + _str(thumbprint)) + + #--Operations for affinity groups ------------------------------------ + def list_affinity_groups(self): + ''' + Lists the affinity groups associated with the specified subscription. + ''' + return self._perform_get( + '/' + self.subscription_id + '/affinitygroups', + AffinityGroups) + + def get_affinity_group_properties(self, affinity_group_name): + ''' + Returns the system properties associated with the specified affinity + group. + + affinity_group_name: The name of the affinity group. + ''' + _validate_not_none('affinity_group_name', affinity_group_name) + return self._perform_get( + '/' + self.subscription_id + '/affinitygroups/' + + _str(affinity_group_name) + '', + AffinityGroup) + + def create_affinity_group(self, name, label, location, description=None): + ''' + Creates a new affinity group for the specified subscription. + + name: A name for the affinity group that is unique to the subscription. + label: + A name for the affinity group. The name can be up to 100 characters + in length. + location: + The data center location where the affinity group will be created. + To list available locations, use the list_location function. + description: + A description for the affinity group. The description can be up to + 1024 characters in length. + ''' + _validate_not_none('name', name) + _validate_not_none('label', label) + _validate_not_none('location', location) + return self._perform_post( + '/' + self.subscription_id + '/affinitygroups', + _XmlSerializer.create_affinity_group_to_xml(name, + label, + description, + location)) + + def update_affinity_group(self, affinity_group_name, label, + description=None): + ''' + Updates the label and/or the description for an affinity group for the + specified subscription. + + affinity_group_name: The name of the affinity group. + label: + A name for the affinity group. The name can be up to 100 characters + in length. + description: + A description for the affinity group. The description can be up to + 1024 characters in length. + ''' + _validate_not_none('affinity_group_name', affinity_group_name) + _validate_not_none('label', label) + return self._perform_put( + '/' + self.subscription_id + '/affinitygroups/' + + _str(affinity_group_name), + _XmlSerializer.update_affinity_group_to_xml(label, description)) + + def delete_affinity_group(self, affinity_group_name): + ''' + Deletes an affinity group in the specified subscription. + + affinity_group_name: The name of the affinity group. + ''' + _validate_not_none('affinity_group_name', affinity_group_name) + return self._perform_delete('/' + self.subscription_id + \ + '/affinitygroups/' + \ + _str(affinity_group_name)) + + #--Operations for locations ------------------------------------------ + def list_locations(self): + ''' + Lists all of the data center locations that are valid for your + subscription. + ''' + return self._perform_get('/' + self.subscription_id + '/locations', + Locations) + + #--Operations for tracking asynchronous requests --------------------- + def get_operation_status(self, request_id): + ''' + Returns the status of the specified operation. After calling an + asynchronous operation, you can call Get Operation Status to determine + whether the operation has succeeded, failed, or is still in progress. + + request_id: The request ID for the request you wish to track. + ''' + _validate_not_none('request_id', request_id) + return self._perform_get( + '/' + self.subscription_id + '/operations/' + _str(request_id), + Operation) + + #--Operations for retrieving operating system information ------------ + def list_operating_systems(self): + ''' + Lists the versions of the guest operating system that are currently + available in Windows Azure. + ''' + return self._perform_get( + '/' + self.subscription_id + '/operatingsystems', + OperatingSystems) + + def list_operating_system_families(self): + ''' + Lists the guest operating system families available in Windows Azure, + and also lists the operating system versions available for each family. + ''' + return self._perform_get( + '/' + self.subscription_id + '/operatingsystemfamilies', + OperatingSystemFamilies) + + #--Operations for retrieving subscription history -------------------- + def get_subscription(self): + ''' + Returns account and resource allocation information on the specified + subscription. + ''' + return self._perform_get('/' + self.subscription_id + '', + Subscription) + + #--Operations for reserved ip addresses ----------------------------- + def create_reserved_ip_address(self, name, label=None, location=None): + ''' + Reserves an IPv4 address for the specified subscription. + + name: + Required. Specifies the name for the reserved IP address. + label: + Optional. Specifies a label for the reserved IP address. The label + can be up to 100 characters long and can be used for your tracking + purposes. + location: + Required. Specifies the location of the reserved IP address. This + should be the same location that is assigned to the cloud service + containing the deployment that will use the reserved IP address. + To see the available locations, you can use list_locations. + ''' + _validate_not_none('name', name) + return self._perform_post( + self._get_reserved_ip_path(), + _XmlSerializer.create_reserved_ip_to_xml(name, label, location)) + + def delete_reserved_ip_address(self, name): + ''' + Deletes a reserved IP address from the specified subscription. + + name: Required. Name of the reserved IP address. + ''' + _validate_not_none('name', name) + return self._perform_delete(self._get_reserved_ip_path(name)) + + def get_reserved_ip_address(self, name): + ''' + Retrieves information about the specified reserved IP address. + + name: Required. Name of the reserved IP address. + ''' + _validate_not_none('name', name) + return self._perform_get(self._get_reserved_ip_path(name), ReservedIP) + + def list_reserved_ip_addresses(self): + ''' + Lists the IP addresses that have been reserved for the specified + subscription. + ''' + return self._perform_get(self._get_reserved_ip_path(), ReservedIPs) + + #--Operations for virtual machines ----------------------------------- + def get_role(self, service_name, deployment_name, role_name): + ''' + Retrieves the specified virtual machine. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + return self._perform_get( + self._get_role_path(service_name, deployment_name, role_name), + PersistentVMRole) + + def create_virtual_machine_deployment(self, service_name, deployment_name, + deployment_slot, label, role_name, + system_config, os_virtual_hard_disk, + network_config=None, + availability_set_name=None, + data_virtual_hard_disks=None, + role_size=None, + role_type='PersistentVMRole', + virtual_network_name=None, + resource_extension_references=None, + provision_guest_agent=None, + vm_image_name=None, + media_location=None, + dns_servers=None, + reserved_ip_name=None): + ''' + Provisions a virtual machine based on the supplied configuration. + + service_name: Name of the hosted service. + deployment_name: + The name for the deployment. The deployment name must be unique + among other deployments for the hosted service. + deployment_slot: + The environment to which the hosted service is deployed. Valid + values are: staging, production + label: + Specifies an identifier for the deployment. The label can be up to + 100 characters long. The label can be used for tracking purposes. + role_name: The name of the role. + system_config: + Contains the metadata required to provision a virtual machine from + a Windows or Linux OS image. Use an instance of + WindowsConfigurationSet or LinuxConfigurationSet. + os_virtual_hard_disk: + Contains the parameters Windows Azure uses to create the operating + system disk for the virtual machine. If you are creating a Virtual + Machine by using a VM Image, this parameter is not used. + network_config: + Encapsulates the metadata required to create the virtual network + configuration for a virtual machine. If you do not include a + network configuration set you will not be able to access the VM + through VIPs over the internet. If your virtual machine belongs to + a virtual network you can not specify which subnet address space + it resides under. + availability_set_name: + Specifies the name of an availability set to which to add the + virtual machine. This value controls the virtual machine + allocation in the Windows Azure environment. Virtual machines + specified in the same availability set are allocated to different + nodes to maximize availability. + data_virtual_hard_disks: + Contains the parameters Windows Azure uses to create a data disk + for a virtual machine. + role_size: + The size of the virtual machine to allocate. The default value is + Small. Possible values are: ExtraSmall, Small, Medium, Large, + ExtraLarge. The specified value must be compatible with the disk + selected in the OSVirtualHardDisk values. + role_type: + The type of the role for the virtual machine. The only supported + value is PersistentVMRole. + virtual_network_name: + Specifies the name of an existing virtual network to which the + deployment will belong. + resource_extension_references: + Optional. Contains a collection of resource extensions that are to + be installed on the Virtual Machine. This element is used if + provision_guest_agent is set to True. + provision_guest_agent: + Optional. Indicates whether the VM Agent is installed on the + Virtual Machine. To run a resource extension in a Virtual Machine, + this service must be installed. + vm_image_name: + Optional. Specifies the name of the VM Image that is to be used to + create the Virtual Machine. If this is specified, the + system_config and network_config parameters are not used. + media_location: + Optional. Required if the Virtual Machine is being created from a + published VM Image. Specifies the location of the VHD file that is + created when VMImageName specifies a published VM Image. + dns_servers: + Optional. List of DNS servers (use DnsServer class) to associate + with the Virtual Machine. + reserved_ip_name: + Optional. Specifies the name of a reserved IP address that is to be + assigned to the deployment. You must run create_reserved_ip_address + before you can assign the address to the deployment using this + element. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('deployment_slot', deployment_slot) + _validate_not_none('label', label) + _validate_not_none('role_name', role_name) + return self._perform_post( + self._get_deployment_path_using_name(service_name), + _XmlSerializer.virtual_machine_deployment_to_xml( + deployment_name, + deployment_slot, + label, + role_name, + system_config, + os_virtual_hard_disk, + role_type, + network_config, + availability_set_name, + data_virtual_hard_disks, + role_size, + virtual_network_name, + resource_extension_references, + provision_guest_agent, + vm_image_name, + media_location, + dns_servers, + reserved_ip_name), + async=True) + + def add_role(self, service_name, deployment_name, role_name, system_config, + os_virtual_hard_disk, network_config=None, + availability_set_name=None, data_virtual_hard_disks=None, + role_size=None, role_type='PersistentVMRole', + resource_extension_references=None, + provision_guest_agent=None, vm_image_name=None, + media_location=None): + ''' + Adds a virtual machine to an existing deployment. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + system_config: + Contains the metadata required to provision a virtual machine from + a Windows or Linux OS image. Use an instance of + WindowsConfigurationSet or LinuxConfigurationSet. + os_virtual_hard_disk: + Contains the parameters Windows Azure uses to create the operating + system disk for the virtual machine. If you are creating a Virtual + Machine by using a VM Image, this parameter is not used. + network_config: + Encapsulates the metadata required to create the virtual network + configuration for a virtual machine. If you do not include a + network configuration set you will not be able to access the VM + through VIPs over the internet. If your virtual machine belongs to + a virtual network you can not specify which subnet address space + it resides under. + availability_set_name: + Specifies the name of an availability set to which to add the + virtual machine. This value controls the virtual machine allocation + in the Windows Azure environment. Virtual machines specified in the + same availability set are allocated to different nodes to maximize + availability. + data_virtual_hard_disks: + Contains the parameters Windows Azure uses to create a data disk + for a virtual machine. + role_size: + The size of the virtual machine to allocate. The default value is + Small. Possible values are: ExtraSmall, Small, Medium, Large, + ExtraLarge. The specified value must be compatible with the disk + selected in the OSVirtualHardDisk values. + role_type: + The type of the role for the virtual machine. The only supported + value is PersistentVMRole. + resource_extension_references: + Optional. Contains a collection of resource extensions that are to + be installed on the Virtual Machine. This element is used if + provision_guest_agent is set to True. + provision_guest_agent: + Optional. Indicates whether the VM Agent is installed on the + Virtual Machine. To run a resource extension in a Virtual Machine, + this service must be installed. + vm_image_name: + Optional. Specifies the name of the VM Image that is to be used to + create the Virtual Machine. If this is specified, the + system_config and network_config parameters are not used. + media_location: + Optional. Required if the Virtual Machine is being created from a + published VM Image. Specifies the location of the VHD file that is + created when VMImageName specifies a published VM Image. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + return self._perform_post( + self._get_role_path(service_name, deployment_name), + _XmlSerializer.add_role_to_xml( + role_name, + system_config, + os_virtual_hard_disk, + role_type, + network_config, + availability_set_name, + data_virtual_hard_disks, + role_size, + resource_extension_references, + provision_guest_agent, + vm_image_name, + media_location), + async=True) + + def update_role(self, service_name, deployment_name, role_name, + os_virtual_hard_disk=None, network_config=None, + availability_set_name=None, data_virtual_hard_disks=None, + role_size=None, role_type='PersistentVMRole', + resource_extension_references=None, + provision_guest_agent=None): + ''' + Updates the specified virtual machine. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + os_virtual_hard_disk: + Contains the parameters Windows Azure uses to create the operating + system disk for the virtual machine. + network_config: + Encapsulates the metadata required to create the virtual network + configuration for a virtual machine. If you do not include a + network configuration set you will not be able to access the VM + through VIPs over the internet. If your virtual machine belongs to + a virtual network you can not specify which subnet address space + it resides under. + availability_set_name: + Specifies the name of an availability set to which to add the + virtual machine. This value controls the virtual machine allocation + in the Windows Azure environment. Virtual machines specified in the + same availability set are allocated to different nodes to maximize + availability. + data_virtual_hard_disks: + Contains the parameters Windows Azure uses to create a data disk + for a virtual machine. + role_size: + The size of the virtual machine to allocate. The default value is + Small. Possible values are: ExtraSmall, Small, Medium, Large, + ExtraLarge. The specified value must be compatible with the disk + selected in the OSVirtualHardDisk values. + role_type: + The type of the role for the virtual machine. The only supported + value is PersistentVMRole. + resource_extension_references: + Optional. Contains a collection of resource extensions that are to + be installed on the Virtual Machine. This element is used if + provision_guest_agent is set to True. + provision_guest_agent: + Optional. Indicates whether the VM Agent is installed on the + Virtual Machine. To run a resource extension in a Virtual Machine, + this service must be installed. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + return self._perform_put( + self._get_role_path(service_name, deployment_name, role_name), + _XmlSerializer.update_role_to_xml( + role_name, + os_virtual_hard_disk, + role_type, + network_config, + availability_set_name, + data_virtual_hard_disks, + role_size, + resource_extension_references, + provision_guest_agent), + async=True) + + def delete_role(self, service_name, deployment_name, role_name): + ''' + Deletes the specified virtual machine. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + return self._perform_delete( + self._get_role_path(service_name, deployment_name, role_name), + async=True) + + def capture_role(self, service_name, deployment_name, role_name, + post_capture_action, target_image_name, + target_image_label, provisioning_configuration=None): + ''' + The Capture Role operation captures a virtual machine image to your + image gallery. From the captured image, you can create additional + customized virtual machines. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + post_capture_action: + Specifies the action after capture operation completes. Possible + values are: Delete, Reprovision. + target_image_name: + Specifies the image name of the captured virtual machine. + target_image_label: + Specifies the friendly name of the captured virtual machine. + provisioning_configuration: + Use an instance of WindowsConfigurationSet or LinuxConfigurationSet. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + _validate_not_none('post_capture_action', post_capture_action) + _validate_not_none('target_image_name', target_image_name) + _validate_not_none('target_image_label', target_image_label) + return self._perform_post( + self._get_role_instance_operations_path( + service_name, deployment_name, role_name), + _XmlSerializer.capture_role_to_xml( + post_capture_action, + target_image_name, + target_image_label, + provisioning_configuration), + async=True) + + def start_role(self, service_name, deployment_name, role_name): + ''' + Starts the specified virtual machine. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + return self._perform_post( + self._get_role_instance_operations_path( + service_name, deployment_name, role_name), + _XmlSerializer.start_role_operation_to_xml(), + async=True) + + def start_roles(self, service_name, deployment_name, role_names): + ''' + Starts the specified virtual machines. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_names: The names of the roles, as an enumerable of strings. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_names', role_names) + return self._perform_post( + self._get_roles_operations_path(service_name, deployment_name), + _XmlSerializer.start_roles_operation_to_xml(role_names), + async=True) + + def restart_role(self, service_name, deployment_name, role_name): + ''' + Restarts the specified virtual machine. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + return self._perform_post( + self._get_role_instance_operations_path( + service_name, deployment_name, role_name), + _XmlSerializer.restart_role_operation_to_xml( + ), + async=True) + + def shutdown_role(self, service_name, deployment_name, role_name, + post_shutdown_action='Stopped'): + ''' + Shuts down the specified virtual machine. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + post_shutdown_action: + Specifies how the Virtual Machine should be shut down. Values are: + Stopped + Shuts down the Virtual Machine but retains the compute + resources. You will continue to be billed for the resources + that the stopped machine uses. + StoppedDeallocated + Shuts down the Virtual Machine and releases the compute + resources. You are not billed for the compute resources that + this Virtual Machine uses. If a static Virtual Network IP + address is assigned to the Virtual Machine, it is reserved. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + _validate_not_none('post_shutdown_action', post_shutdown_action) + return self._perform_post( + self._get_role_instance_operations_path( + service_name, deployment_name, role_name), + _XmlSerializer.shutdown_role_operation_to_xml(post_shutdown_action), + async=True) + + def shutdown_roles(self, service_name, deployment_name, role_names, + post_shutdown_action='Stopped'): + ''' + Shuts down the specified virtual machines. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_names: The names of the roles, as an enumerable of strings. + post_shutdown_action: + Specifies how the Virtual Machine should be shut down. Values are: + Stopped + Shuts down the Virtual Machine but retains the compute + resources. You will continue to be billed for the resources + that the stopped machine uses. + StoppedDeallocated + Shuts down the Virtual Machine and releases the compute + resources. You are not billed for the compute resources that + this Virtual Machine uses. If a static Virtual Network IP + address is assigned to the Virtual Machine, it is reserved. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_names', role_names) + _validate_not_none('post_shutdown_action', post_shutdown_action) + return self._perform_post( + self._get_roles_operations_path(service_name, deployment_name), + _XmlSerializer.shutdown_roles_operation_to_xml( + role_names, post_shutdown_action), + async=True) + + def add_dns_server(self, service_name, deployment_name, dns_server_name, address): + ''' + Adds a DNS server definition to an existing deployment. + + service_name: The name of the service. + deployment_name: The name of the deployment. + dns_server_name: Specifies the name of the DNS server. + address: Specifies the IP address of the DNS server. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('dns_server_name', dns_server_name) + _validate_not_none('address', address) + return self._perform_post( + self._get_dns_server_path(service_name, deployment_name), + _XmlSerializer.dns_server_to_xml(dns_server_name, address), + async=True) + + def update_dns_server(self, service_name, deployment_name, dns_server_name, address): + ''' + Updates the ip address of a DNS server. + + service_name: The name of the service. + deployment_name: The name of the deployment. + dns_server_name: Specifies the name of the DNS server. + address: Specifies the IP address of the DNS server. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('dns_server_name', dns_server_name) + _validate_not_none('address', address) + return self._perform_put( + self._get_dns_server_path(service_name, + deployment_name, + dns_server_name), + _XmlSerializer.dns_server_to_xml(dns_server_name, address), + async=True) + + def delete_dns_server(self, service_name, deployment_name, dns_server_name): + ''' + Deletes a DNS server from a deployment. + + service_name: The name of the service. + deployment_name: The name of the deployment. + dns_server_name: Name of the DNS server that you want to delete. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('dns_server_name', dns_server_name) + return self._perform_delete( + self._get_dns_server_path(service_name, + deployment_name, + dns_server_name), + async=True) + + def list_resource_extensions(self): + ''' + Lists the resource extensions that are available to add to a + Virtual Machine. + ''' + return self._perform_get(self._get_resource_extensions_path(), + ResourceExtensions) + + def list_resource_extension_versions(self, publisher_name, extension_name): + ''' + Lists the versions of a resource extension that are available to add + to a Virtual Machine. + + publisher_name: Name of the resource extension publisher. + extension_name: Name of the resource extension. + ''' + return self._perform_get(self._get_resource_extension_versions_path( + publisher_name, extension_name), + ResourceExtensions) + + #--Operations for virtual machine images ----------------------------- + def capture_vm_image(self, service_name, deployment_name, role_name, options): + ''' + Creates a copy of the operating system virtual hard disk (VHD) and all + of the data VHDs that are associated with the Virtual Machine, saves + the VHD copies in the same storage location as the original VHDs, and + registers the copies as a VM Image in the image repository that is + associated with the specified subscription. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + options: An instance of CaptureRoleAsVMImage class. + options.os_state: + Required. Specifies the state of the operating system in the image. + Possible values are: Generalized, Specialized + A Virtual Machine that is fully configured and running contains a + Specialized operating system. A Virtual Machine on which the + Sysprep command has been run with the generalize option contains a + Generalized operating system. If you capture an image from a + generalized Virtual Machine, the machine is deleted after the image + is captured. It is recommended that all Virtual Machines are shut + down before capturing an image. + options.vm_image_name: + Required. Specifies the name of the VM Image. + options.vm_image_name: + Required. Specifies the label of the VM Image. + options.description: + Optional. Specifies the description of the VM Image. + options.language: + Optional. Specifies the language of the VM Image. + options.image_family: + Optional. Specifies a value that can be used to group VM Images. + options.recommended_vm_size: + Optional. Specifies the size to use for the Virtual Machine that + is created from the VM Image. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + _validate_not_none('options', options) + _validate_not_none('options.os_state', options.os_state) + _validate_not_none('options.vm_image_name', options.vm_image_name) + _validate_not_none('options.vm_image_label', options.vm_image_label) + return self._perform_post( + self._get_capture_vm_image_path(service_name, deployment_name, role_name), + _XmlSerializer.capture_vm_image_to_xml(options), + async=True) + + def create_vm_image(self, vm_image): + ''' + Creates a VM Image in the image repository that is associated with the + specified subscription using a specified set of virtual hard disks. + + vm_image: An instance of VMImage class. + vm_image.name: Required. Specifies the name of the image. + vm_image.label: Required. Specifies an identifier for the image. + vm_image.description: Optional. Specifies the description of the image. + vm_image.os_disk_configuration: + Required. Specifies configuration information for the operating + system disk that is associated with the image. + vm_image.os_disk_configuration.host_caching: + Optional. Specifies the caching behavior of the operating system disk. + Possible values are: None, ReadOnly, ReadWrite + vm_image.os_disk_configuration.os_state: + Required. Specifies the state of the operating system in the image. + Possible values are: Generalized, Specialized + A Virtual Machine that is fully configured and running contains a + Specialized operating system. A Virtual Machine on which the + Sysprep command has been run with the generalize option contains a + Generalized operating system. + vm_image.os_disk_configuration.os: + Required. Specifies the operating system type of the image. + vm_image.os_disk_configuration.media_link: + Required. Specifies the location of the blob in Windows Azure + storage. The blob location belongs to a storage account in the + subscription specified by the <subscription-id> value in the + operation call. + vm_image.data_disk_configurations: + Optional. Specifies configuration information for the data disks + that are associated with the image. A VM Image might not have data + disks associated with it. + vm_image.data_disk_configurations[].host_caching: + Optional. Specifies the caching behavior of the data disk. + Possible values are: None, ReadOnly, ReadWrite + vm_image.data_disk_configurations[].lun: + Optional if the lun for the disk is 0. Specifies the Logical Unit + Number (LUN) for the data disk. + vm_image.data_disk_configurations[].media_link: + Required. Specifies the location of the blob in Windows Azure + storage. The blob location belongs to a storage account in the + subscription specified by the <subscription-id> value in the + operation call. + vm_image.data_disk_configurations[].logical_size_in_gb: + Required. Specifies the size, in GB, of the data disk. + vm_image.language: Optional. Specifies the language of the image. + vm_image.image_family: + Optional. Specifies a value that can be used to group VM Images. + vm_image.recommended_vm_size: + Optional. Specifies the size to use for the Virtual Machine that + is created from the VM Image. + vm_image.eula: + Optional. Specifies the End User License Agreement that is + associated with the image. The value for this element is a string, + but it is recommended that the value be a URL that points to a EULA. + vm_image.icon_uri: + Optional. Specifies the URI to the icon that is displayed for the + image in the Management Portal. + vm_image.small_icon_uri: + Optional. Specifies the URI to the small icon that is displayed for + the image in the Management Portal. + vm_image.privacy_uri: + Optional. Specifies the URI that points to a document that contains + the privacy policy related to the image. + vm_image.published_date: + Optional. Specifies the date when the image was added to the image + repository. + vm_image.show_in_gui: + Optional. Indicates whether the VM Images should be listed in the + portal. + ''' + _validate_not_none('vm_image', vm_image) + _validate_not_none('vm_image.name', vm_image.name) + _validate_not_none('vm_image.label', vm_image.label) + _validate_not_none('vm_image.os_disk_configuration.os_state', + vm_image.os_disk_configuration.os_state) + _validate_not_none('vm_image.os_disk_configuration.os', + vm_image.os_disk_configuration.os) + _validate_not_none('vm_image.os_disk_configuration.media_link', + vm_image.os_disk_configuration.media_link) + return self._perform_post( + self._get_vm_image_path(), + _XmlSerializer.create_vm_image_to_xml(vm_image), + async=True) + + def delete_vm_image(self, vm_image_name, delete_vhd=False): + ''' + Deletes the specified VM Image from the image repository that is + associated with the specified subscription. + + vm_image_name: The name of the image. + delete_vhd: Deletes the underlying vhd blob in Azure storage. + ''' + _validate_not_none('vm_image_name', vm_image_name) + path = self._get_vm_image_path(vm_image_name) + if delete_vhd: + path += '?comp=media' + return self._perform_delete(path, async=True) + + def list_vm_images(self, location=None, publisher=None, category=None): + ''' + Retrieves a list of the VM Images from the image repository that is + associated with the specified subscription. + ''' + path = self._get_vm_image_path() + query = '' + if location: + query += '&location=' + location + if publisher: + query += '&publisher=' + publisher + if category: + query += '&category=' + category + if query: + path = path + '?' + query.lstrip('&') + return self._perform_get(path, VMImages) + + def update_vm_image(self, vm_image_name, vm_image): + ''' + Updates a VM Image in the image repository that is associated with the + specified subscription. + + vm_image_name: Name of image to update. + vm_image: An instance of VMImage class. + vm_image.label: Optional. Specifies an identifier for the image. + vm_image.os_disk_configuration: + Required. Specifies configuration information for the operating + system disk that is associated with the image. + vm_image.os_disk_configuration.host_caching: + Optional. Specifies the caching behavior of the operating system disk. + Possible values are: None, ReadOnly, ReadWrite + vm_image.data_disk_configurations: + Optional. Specifies configuration information for the data disks + that are associated with the image. A VM Image might not have data + disks associated with it. + vm_image.data_disk_configurations[].name: + Required. Specifies the name of the data disk. + vm_image.data_disk_configurations[].host_caching: + Optional. Specifies the caching behavior of the data disk. + Possible values are: None, ReadOnly, ReadWrite + vm_image.data_disk_configurations[].lun: + Optional if the lun for the disk is 0. Specifies the Logical Unit + Number (LUN) for the data disk. + vm_image.description: Optional. Specifies the description of the image. + vm_image.language: Optional. Specifies the language of the image. + vm_image.image_family: + Optional. Specifies a value that can be used to group VM Images. + vm_image.recommended_vm_size: + Optional. Specifies the size to use for the Virtual Machine that + is created from the VM Image. + vm_image.eula: + Optional. Specifies the End User License Agreement that is + associated with the image. The value for this element is a string, + but it is recommended that the value be a URL that points to a EULA. + vm_image.icon_uri: + Optional. Specifies the URI to the icon that is displayed for the + image in the Management Portal. + vm_image.small_icon_uri: + Optional. Specifies the URI to the small icon that is displayed for + the image in the Management Portal. + vm_image.privacy_uri: + Optional. Specifies the URI that points to a document that contains + the privacy policy related to the image. + vm_image.published_date: + Optional. Specifies the date when the image was added to the image + repository. + vm_image.show_in_gui: + Optional. Indicates whether the VM Images should be listed in the + portal. + ''' + _validate_not_none('vm_image_name', vm_image_name) + _validate_not_none('vm_image', vm_image) + return self._perform_put(self._get_vm_image_path(vm_image_name), + _XmlSerializer.update_vm_image_to_xml(vm_image), + async=True) + + #--Operations for operating system images ---------------------------- + def list_os_images(self): + ''' + Retrieves a list of the OS images from the image repository. + ''' + return self._perform_get(self._get_image_path(), + Images) + + def get_os_image(self, image_name): + ''' + Retrieves an OS image from the image repository. + ''' + return self._perform_get(self._get_image_path(image_name), + OSImage) + + def add_os_image(self, label, media_link, name, os): + ''' + Adds an OS image that is currently stored in a storage account in your + subscription to the image repository. + + label: Specifies the friendly name of the image. + media_link: + Specifies the location of the blob in Windows Azure blob store + where the media for the image is located. The blob location must + belong to a storage account in the subscription specified by the + <subscription-id> value in the operation call. Example: + http://example.blob.core.windows.net/disks/mydisk.vhd + name: + Specifies a name for the OS image that Windows Azure uses to + identify the image when creating one or more virtual machines. + os: + The operating system type of the OS image. Possible values are: + Linux, Windows + ''' + _validate_not_none('label', label) + _validate_not_none('media_link', media_link) + _validate_not_none('name', name) + _validate_not_none('os', os) + return self._perform_post(self._get_image_path(), + _XmlSerializer.os_image_to_xml( + label, media_link, name, os), + async=True) + + def update_os_image(self, image_name, label, media_link, name, os): + ''' + Updates an OS image that in your image repository. + + image_name: The name of the image to update. + label: + Specifies the friendly name of the image to be updated. You cannot + use this operation to update images provided by the Windows Azure + platform. + media_link: + Specifies the location of the blob in Windows Azure blob store + where the media for the image is located. The blob location must + belong to a storage account in the subscription specified by the + <subscription-id> value in the operation call. Example: + http://example.blob.core.windows.net/disks/mydisk.vhd + name: + Specifies a name for the OS image that Windows Azure uses to + identify the image when creating one or more VM Roles. + os: + The operating system type of the OS image. Possible values are: + Linux, Windows + ''' + _validate_not_none('image_name', image_name) + _validate_not_none('label', label) + _validate_not_none('media_link', media_link) + _validate_not_none('name', name) + _validate_not_none('os', os) + return self._perform_put(self._get_image_path(image_name), + _XmlSerializer.os_image_to_xml( + label, media_link, name, os), + async=True) + + def delete_os_image(self, image_name, delete_vhd=False): + ''' + Deletes the specified OS image from your image repository. + + image_name: The name of the image. + delete_vhd: Deletes the underlying vhd blob in Azure storage. + ''' + _validate_not_none('image_name', image_name) + path = self._get_image_path(image_name) + if delete_vhd: + path += '?comp=media' + return self._perform_delete(path, async=True) + + #--Operations for virtual machine disks ------------------------------ + def get_data_disk(self, service_name, deployment_name, role_name, lun): + ''' + Retrieves the specified data disk from a virtual machine. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + lun: The Logical Unit Number (LUN) for the disk. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + _validate_not_none('lun', lun) + return self._perform_get( + self._get_data_disk_path( + service_name, deployment_name, role_name, lun), + DataVirtualHardDisk) + + def add_data_disk(self, service_name, deployment_name, role_name, lun, + host_caching=None, media_link=None, disk_label=None, + disk_name=None, logical_disk_size_in_gb=None, + source_media_link=None): + ''' + Adds a data disk to a virtual machine. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + lun: + Specifies the Logical Unit Number (LUN) for the disk. The LUN + specifies the slot in which the data drive appears when mounted + for usage by the virtual machine. Valid LUN values are 0 through 15. + host_caching: + Specifies the platform caching behavior of data disk blob for + read/write efficiency. The default vault is ReadOnly. Possible + values are: None, ReadOnly, ReadWrite + media_link: + Specifies the location of the blob in Windows Azure blob store + where the media for the disk is located. The blob location must + belong to the storage account in the subscription specified by the + <subscription-id> value in the operation call. Example: + http://example.blob.core.windows.net/disks/mydisk.vhd + disk_label: + Specifies the description of the data disk. When you attach a disk, + either by directly referencing a media using the MediaLink element + or specifying the target disk size, you can use the DiskLabel + element to customize the name property of the target data disk. + disk_name: + Specifies the name of the disk. Windows Azure uses the specified + disk to create the data disk for the machine and populates this + field with the disk name. + logical_disk_size_in_gb: + Specifies the size, in GB, of an empty disk to be attached to the + role. The disk can be created as part of disk attach or create VM + role call by specifying the value for this property. Windows Azure + creates the empty disk based on size preference and attaches the + newly created disk to the Role. + source_media_link: + Specifies the location of a blob in account storage which is + mounted as a data disk when the virtual machine is created. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + _validate_not_none('lun', lun) + return self._perform_post( + self._get_data_disk_path(service_name, deployment_name, role_name), + _XmlSerializer.data_virtual_hard_disk_to_xml( + host_caching, + disk_label, + disk_name, + lun, + logical_disk_size_in_gb, + media_link, + source_media_link), + async=True) + + def update_data_disk(self, service_name, deployment_name, role_name, lun, + host_caching=None, media_link=None, updated_lun=None, + disk_label=None, disk_name=None, + logical_disk_size_in_gb=None): + ''' + Updates the specified data disk attached to the specified virtual + machine. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + lun: + Specifies the Logical Unit Number (LUN) for the disk. The LUN + specifies the slot in which the data drive appears when mounted + for usage by the virtual machine. Valid LUN values are 0 through + 15. + host_caching: + Specifies the platform caching behavior of data disk blob for + read/write efficiency. The default vault is ReadOnly. Possible + values are: None, ReadOnly, ReadWrite + media_link: + Specifies the location of the blob in Windows Azure blob store + where the media for the disk is located. The blob location must + belong to the storage account in the subscription specified by + the <subscription-id> value in the operation call. Example: + http://example.blob.core.windows.net/disks/mydisk.vhd + updated_lun: + Specifies the Logical Unit Number (LUN) for the disk. The LUN + specifies the slot in which the data drive appears when mounted + for usage by the virtual machine. Valid LUN values are 0 through 15. + disk_label: + Specifies the description of the data disk. When you attach a disk, + either by directly referencing a media using the MediaLink element + or specifying the target disk size, you can use the DiskLabel + element to customize the name property of the target data disk. + disk_name: + Specifies the name of the disk. Windows Azure uses the specified + disk to create the data disk for the machine and populates this + field with the disk name. + logical_disk_size_in_gb: + Specifies the size, in GB, of an empty disk to be attached to the + role. The disk can be created as part of disk attach or create VM + role call by specifying the value for this property. Windows Azure + creates the empty disk based on size preference and attaches the + newly created disk to the Role. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + _validate_not_none('lun', lun) + return self._perform_put( + self._get_data_disk_path( + service_name, deployment_name, role_name, lun), + _XmlSerializer.data_virtual_hard_disk_to_xml( + host_caching, + disk_label, + disk_name, + updated_lun, + logical_disk_size_in_gb, + media_link, + None), + async=True) + + def delete_data_disk(self, service_name, deployment_name, role_name, lun, delete_vhd=False): + ''' + Removes the specified data disk from a virtual machine. + + service_name: The name of the service. + deployment_name: The name of the deployment. + role_name: The name of the role. + lun: The Logical Unit Number (LUN) for the disk. + delete_vhd: Deletes the underlying vhd blob in Azure storage. + ''' + _validate_not_none('service_name', service_name) + _validate_not_none('deployment_name', deployment_name) + _validate_not_none('role_name', role_name) + _validate_not_none('lun', lun) + path = self._get_data_disk_path(service_name, deployment_name, role_name, lun) + if delete_vhd: + path += '?comp=media' + return self._perform_delete(path, async=True) + + #--Operations for virtual machine disks ------------------------------ + def list_disks(self): + ''' + Retrieves a list of the disks in your image repository. + ''' + return self._perform_get(self._get_disk_path(), + Disks) + + def get_disk(self, disk_name): + ''' + Retrieves a disk from your image repository. + ''' + return self._perform_get(self._get_disk_path(disk_name), + Disk) + + def add_disk(self, has_operating_system, label, media_link, name, os): + ''' + Adds a disk to the user image repository. The disk can be an OS disk + or a data disk. + + has_operating_system: + Specifies whether the disk contains an operation system. Only a + disk with an operating system installed can be mounted as OS Drive. + label: Specifies the description of the disk. + media_link: + Specifies the location of the blob in Windows Azure blob store + where the media for the disk is located. The blob location must + belong to the storage account in the current subscription specified + by the <subscription-id> value in the operation call. Example: + http://example.blob.core.windows.net/disks/mydisk.vhd + name: + Specifies a name for the disk. Windows Azure uses the name to + identify the disk when creating virtual machines from the disk. + os: The OS type of the disk. Possible values are: Linux, Windows + ''' + _validate_not_none('has_operating_system', has_operating_system) + _validate_not_none('label', label) + _validate_not_none('media_link', media_link) + _validate_not_none('name', name) + _validate_not_none('os', os) + return self._perform_post(self._get_disk_path(), + _XmlSerializer.disk_to_xml( + has_operating_system, + label, + media_link, + name, + os)) + + def update_disk(self, disk_name, has_operating_system, label, media_link, + name, os): + ''' + Updates an existing disk in your image repository. + + disk_name: The name of the disk to update. + has_operating_system: + Specifies whether the disk contains an operation system. Only a + disk with an operating system installed can be mounted as OS Drive. + label: Specifies the description of the disk. + media_link: + Specifies the location of the blob in Windows Azure blob store + where the media for the disk is located. The blob location must + belong to the storage account in the current subscription specified + by the <subscription-id> value in the operation call. Example: + http://example.blob.core.windows.net/disks/mydisk.vhd + name: + Specifies a name for the disk. Windows Azure uses the name to + identify the disk when creating virtual machines from the disk. + os: The OS type of the disk. Possible values are: Linux, Windows + ''' + _validate_not_none('disk_name', disk_name) + _validate_not_none('has_operating_system', has_operating_system) + _validate_not_none('label', label) + _validate_not_none('media_link', media_link) + _validate_not_none('name', name) + _validate_not_none('os', os) + return self._perform_put(self._get_disk_path(disk_name), + _XmlSerializer.disk_to_xml( + has_operating_system, + label, + media_link, + name, + os)) + + def delete_disk(self, disk_name, delete_vhd=False): + ''' + Deletes the specified data or operating system disk from your image + repository. + + disk_name: The name of the disk to delete. + delete_vhd: Deletes the underlying vhd blob in Azure storage. + ''' + _validate_not_none('disk_name', disk_name) + path = self._get_disk_path(disk_name) + if delete_vhd: + path += '?comp=media' + return self._perform_delete(path) + + #--Operations for virtual networks ------------------------------ + def list_virtual_network_sites(self): + ''' + Retrieves a list of the virtual networks. + ''' + return self._perform_get(self._get_virtual_network_site_path(), VirtualNetworkSites) + + #--Helper functions -------------------------------------------------- + def _get_role_sizes_path(self): + return self._get_path('rolesizes', None) + + def _get_subscriptions_path(self): + return '/subscriptions' + + def _get_virtual_network_site_path(self): + return self._get_path('services/networking/virtualnetwork', None) + + def _get_storage_service_path(self, service_name=None): + return self._get_path('services/storageservices', service_name) + + def _get_hosted_service_path(self, service_name=None): + return self._get_path('services/hostedservices', service_name) + + def _get_deployment_path_using_slot(self, service_name, slot=None): + return self._get_path('services/hostedservices/' + _str(service_name) + + '/deploymentslots', slot) + + def _get_deployment_path_using_name(self, service_name, + deployment_name=None): + return self._get_path('services/hostedservices/' + _str(service_name) + + '/deployments', deployment_name) + + def _get_role_path(self, service_name, deployment_name, role_name=None): + return self._get_path('services/hostedservices/' + _str(service_name) + + '/deployments/' + deployment_name + + '/roles', role_name) + + def _get_role_instance_operations_path(self, service_name, deployment_name, + role_name=None): + return self._get_path('services/hostedservices/' + _str(service_name) + + '/deployments/' + deployment_name + + '/roleinstances', role_name) + '/Operations' + + def _get_roles_operations_path(self, service_name, deployment_name): + return self._get_path('services/hostedservices/' + _str(service_name) + + '/deployments/' + deployment_name + + '/roles/Operations', None) + + def _get_resource_extensions_path(self): + return self._get_path('services/resourceextensions', None) + + def _get_resource_extension_versions_path(self, publisher_name, extension_name): + return self._get_path('services/resourceextensions', + publisher_name + '/' + extension_name) + + def _get_dns_server_path(self, service_name, deployment_name, + dns_server_name=None): + return self._get_path('services/hostedservices/' + _str(service_name) + + '/deployments/' + deployment_name + + '/dnsservers', dns_server_name) + + def _get_capture_vm_image_path(self, service_name, deployment_name, role_name): + return self._get_path('services/hostedservices/' + _str(service_name) + + '/deployments/' + _str(deployment_name) + + '/roleinstances/' + _str(role_name) + '/Operations', + None) + + def _get_vm_image_path(self, image_name=None): + return self._get_path('services/vmimages', image_name) + + def _get_reserved_ip_path(self, name=None): + return self._get_path('services/networking/reservedips', name) + + def _get_data_disk_path(self, service_name, deployment_name, role_name, + lun=None): + return self._get_path('services/hostedservices/' + _str(service_name) + + '/deployments/' + _str(deployment_name) + + '/roles/' + _str(role_name) + '/DataDisks', lun) + + def _get_disk_path(self, disk_name=None): + return self._get_path('services/disks', disk_name) + + def _get_image_path(self, image_name=None): + return self._get_path('services/images', image_name) diff --git a/awx/lib/site-packages/azure/servicemanagement/sqldatabasemanagementservice.py b/awx/lib/site-packages/azure/servicemanagement/sqldatabasemanagementservice.py new file mode 100644 index 0000000000..741b60f8b4 --- /dev/null +++ b/awx/lib/site-packages/azure/servicemanagement/sqldatabasemanagementservice.py @@ -0,0 +1,390 @@ +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +from azure import ( + MANAGEMENT_HOST, + _parse_service_resources_response, + _validate_not_none, + ) +from azure.servicemanagement import ( + EventLog, + ServerQuota, + Servers, + ServiceObjective, + Database, + FirewallRule, + _SqlManagementXmlSerializer, + ) +from azure.servicemanagement.servicemanagementclient import ( + _ServiceManagementClient, + ) + +class SqlDatabaseManagementService(_ServiceManagementClient): + ''' Note that this class is a preliminary work on SQL Database + management. Since it lack a lot a features, final version + can be slightly different from the current one. + ''' + + def __init__(self, subscription_id=None, cert_file=None, + host=MANAGEMENT_HOST, request_session=None): + ''' + Initializes the sql database management service. + + subscription_id: Subscription to manage. + cert_file: + Path to .pem certificate file (httplib), or location of the + certificate in your Personal certificate store (winhttp) in the + CURRENT_USER\my\CertificateName format. + If a request_session is specified, then this is unused. + host: Live ServiceClient URL. Defaults to Azure public cloud. + request_session: + Session object to use for http requests. If this is specified, it + replaces the default use of httplib or winhttp. Also, the cert_file + parameter is unused when a session is passed in. + The session object handles authentication, and as such can support + multiple types of authentication: .pem certificate, oauth. + For example, you can pass in a Session instance from the requests + library. To use .pem certificate authentication with requests + library, set the path to the .pem file on the session.cert + attribute. + ''' + super(SqlDatabaseManagementService, self).__init__( + subscription_id, cert_file, host, request_session) + self.content_type = 'application/xml' + + #--Operations for sql servers ---------------------------------------- + def create_server(self, admin_login, admin_password, location): + ''' + Create a new Azure SQL Database server. + + admin_login: The administrator login name for the new server. + admin_password: The administrator login password for the new server. + location: The region to deploy the new server. + ''' + _validate_not_none('admin_login', admin_login) + _validate_not_none('admin_password', admin_password) + _validate_not_none('location', location) + response = self.perform_post( + self._get_servers_path(), + _SqlManagementXmlSerializer.create_server_to_xml( + admin_login, + admin_password, + location + ) + ) + + return _SqlManagementXmlSerializer.xml_to_create_server_response( + response.body) + + def set_server_admin_password(self, server_name, admin_password): + ''' + Reset the administrator password for a server. + + server_name: Name of the server to change the password. + admin_password: The new administrator password for the server. + ''' + _validate_not_none('server_name', server_name) + _validate_not_none('admin_password', admin_password) + return self._perform_post( + self._get_servers_path(server_name) + '?op=ResetPassword', + _SqlManagementXmlSerializer.set_server_admin_password_to_xml( + admin_password + ) + ) + + def delete_server(self, server_name): + ''' + Deletes an Azure SQL Database server (including all its databases). + + server_name: Name of the server you want to delete. + ''' + _validate_not_none('server_name', server_name) + return self._perform_delete( + self._get_servers_path(server_name)) + + def list_servers(self): + ''' + List the SQL servers defined on the account. + ''' + return self._perform_get(self._get_servers_path(), + Servers) + + def list_quotas(self, server_name): + ''' + Gets quotas for an Azure SQL Database Server. + + server_name: Name of the server. + ''' + _validate_not_none('server_name', server_name) + response = self._perform_get(self._get_quotas_path(server_name), + None) + return _parse_service_resources_response(response, ServerQuota) + + def get_server_event_logs(self, server_name, start_date, + interval_size_in_minutes, event_types=''): + ''' + Gets the event logs for an Azure SQL Database Server. + + server_name: Name of the server to retrieve the event logs from. + start_date: + The starting date and time of the events to retrieve in UTC format, + for example '2011-09-28 16:05:00'. + interval_size_in_minutes: + Size of the event logs to retrieve (in minutes). + Valid values are: 5, 60, or 1440. + event_types: + The event type of the log entries you want to retrieve. + Valid values are: + - connection_successful + - connection_failed + - connection_terminated + - deadlock + - throttling + - throttling_long_transaction + To return all event types pass in an empty string. + ''' + _validate_not_none('server_name', server_name) + _validate_not_none('start_date', start_date) + _validate_not_none('interval_size_in_minutes', interval_size_in_minutes) + _validate_not_none('event_types', event_types) + path = self._get_server_event_logs_path(server_name) + \ + '?startDate={0}&intervalSizeInMinutes={1}&eventTypes={2}'.format( + start_date, interval_size_in_minutes, event_types) + response = self._perform_get(path, None) + return _parse_service_resources_response(response, EventLog) + + #--Operations for firewall rules ------------------------------------------ + def create_firewall_rule(self, server_name, name, start_ip_address, + end_ip_address): + ''' + Creates an Azure SQL Database server firewall rule. + + server_name: Name of the server to set the firewall rule on. + name: The name of the new firewall rule. + start_ip_address: + The lowest IP address in the range of the server-level firewall + setting. IP addresses equal to or greater than this can attempt to + connect to the server. The lowest possible IP address is 0.0.0.0. + end_ip_address: + The highest IP address in the range of the server-level firewall + setting. IP addresses equal to or less than this can attempt to + connect to the server. The highest possible IP address is + 255.255.255.255. + ''' + _validate_not_none('server_name', server_name) + _validate_not_none('name', name) + _validate_not_none('start_ip_address', start_ip_address) + _validate_not_none('end_ip_address', end_ip_address) + return self._perform_post( + self._get_firewall_rules_path(server_name), + _SqlManagementXmlSerializer.create_firewall_rule_to_xml( + name, start_ip_address, end_ip_address + ) + ) + + def update_firewall_rule(self, server_name, name, start_ip_address, + end_ip_address): + ''' + Update a firewall rule for an Azure SQL Database server. + + server_name: Name of the server to set the firewall rule on. + name: The name of the firewall rule to update. + start_ip_address: + The lowest IP address in the range of the server-level firewall + setting. IP addresses equal to or greater than this can attempt to + connect to the server. The lowest possible IP address is 0.0.0.0. + end_ip_address: + The highest IP address in the range of the server-level firewall + setting. IP addresses equal to or less than this can attempt to + connect to the server. The highest possible IP address is + 255.255.255.255. + ''' + _validate_not_none('server_name', server_name) + _validate_not_none('name', name) + _validate_not_none('start_ip_address', start_ip_address) + _validate_not_none('end_ip_address', end_ip_address) + return self._perform_put( + self._get_firewall_rules_path(server_name, name), + _SqlManagementXmlSerializer.update_firewall_rule_to_xml( + name, start_ip_address, end_ip_address + ) + ) + + def delete_firewall_rule(self, server_name, name): + ''' + Deletes an Azure SQL Database server firewall rule. + + server_name: + Name of the server with the firewall rule you want to delete. + name: + Name of the firewall rule you want to delete. + ''' + _validate_not_none('server_name', server_name) + _validate_not_none('name', name) + return self._perform_delete( + self._get_firewall_rules_path(server_name, name)) + + def list_firewall_rules(self, server_name): + ''' + Retrieves the set of firewall rules for an Azure SQL Database Server. + + server_name: Name of the server. + ''' + _validate_not_none('server_name', server_name) + response = self._perform_get(self._get_firewall_rules_path(server_name), + None) + return _parse_service_resources_response(response, FirewallRule) + + def list_service_level_objectives(self, server_name): + ''' + Gets the service level objectives for an Azure SQL Database server. + + server_name: Name of the server. + ''' + _validate_not_none('server_name', server_name) + response = self._perform_get( + self._get_service_objectives_path(server_name), None) + return _parse_service_resources_response(response, ServiceObjective) + + #--Operations for sql databases ---------------------------------------- + def create_database(self, server_name, name, service_objective_id, + edition=None, collation_name=None, + max_size_bytes=None): + ''' + Creates a new Azure SQL Database. + + server_name: Name of the server to contain the new database. + name: + Required. The name for the new database. See Naming Requirements + in Azure SQL Database General Guidelines and Limitations and + Database Identifiers for more information. + service_objective_id: + Required. The GUID corresponding to the performance level for + Edition. See List Service Level Objectives for current values. + edition: + Optional. The Service Tier (Edition) for the new database. If + omitted, the default is Web. Valid values are Web, Business, + Basic, Standard, and Premium. See Azure SQL Database Service Tiers + (Editions) and Web and Business Edition Sunset FAQ for more + information. + collation_name: + Optional. The database collation. This can be any collation + supported by SQL. If omitted, the default collation is used. See + SQL Server Collation Support in Azure SQL Database General + Guidelines and Limitations for more information. + max_size_bytes: + Optional. Sets the maximum size, in bytes, for the database. This + value must be within the range of allowed values for Edition. If + omitted, the default value for the edition is used. See Azure SQL + Database Service Tiers (Editions) for current maximum databases + sizes. Convert MB or GB values to bytes. + 1 MB = 1048576 bytes. 1 GB = 1073741824 bytes. + ''' + _validate_not_none('server_name', server_name) + _validate_not_none('name', name) + _validate_not_none('service_objective_id', service_objective_id) + return self._perform_post( + self._get_databases_path(server_name), + _SqlManagementXmlSerializer.create_database_to_xml( + name, service_objective_id, edition, collation_name, + max_size_bytes + ) + ) + + def update_database(self, server_name, name, new_database_name=None, + service_objective_id=None, edition=None, + max_size_bytes=None): + ''' + Updates existing database details. + + server_name: Name of the server to contain the new database. + name: + Required. The name for the new database. See Naming Requirements + in Azure SQL Database General Guidelines and Limitations and + Database Identifiers for more information. + new_database_name: + Optional. The new name for the new database. + service_objective_id: + Optional. The new service level to apply to the database. For more + information about service levels, see Azure SQL Database Service + Tiers and Performance Levels. Use List Service Level Objectives to + get the correct ID for the desired service objective. + edition: + Optional. The new edition for the new database. + max_size_bytes: + Optional. The new size of the database in bytes. For information on + available sizes for each edition, see Azure SQL Database Service + Tiers (Editions). + ''' + _validate_not_none('server_name', server_name) + _validate_not_none('name', name) + return self._perform_put( + self._get_databases_path(server_name, name), + _SqlManagementXmlSerializer.update_database_to_xml( + new_database_name, service_objective_id, edition, + max_size_bytes + ) + ) + + def delete_database(self, server_name, name): + ''' + Deletes an Azure SQL Database. + + server_name: Name of the server where the database is located. + name: Name of the database to delete. + ''' + return self._perform_delete(self._get_databases_path(server_name, name)) + + def list_databases(self, name): + ''' + List the SQL databases defined on the specified server name + ''' + response = self._perform_get(self._get_list_databases_path(name), + None) + return _parse_service_resources_response(response, Database) + + + #--Helper functions -------------------------------------------------- + def _get_servers_path(self, server_name=None): + return self._get_path('services/sqlservers/servers', server_name) + + def _get_firewall_rules_path(self, server_name, name=None): + path = self._get_servers_path(server_name) + '/firewallrules' + if name: + path = path + '/' + name + return path + + def _get_databases_path(self, server_name, name=None): + path = self._get_servers_path(server_name) + '/databases' + if name: + path = path + '/' + name + return path + + def _get_server_event_logs_path(self, server_name): + return self._get_servers_path(server_name) + '/events' + + def _get_service_objectives_path(self, server_name): + return self._get_servers_path(server_name) + '/serviceobjectives' + + def _get_quotas_path(self, server_name, name=None): + path = self._get_servers_path(server_name) + '/serverquotas' + if name: + path = path + '/' + name + return path + + def _get_list_databases_path(self, name): + # *contentview=generic is mandatory* + return self._get_path('services/sqlservers/servers/', + name) + '/databases?contentview=generic' + diff --git a/awx/lib/site-packages/azure/servicemanagement/websitemanagementservice.py b/awx/lib/site-packages/azure/servicemanagement/websitemanagementservice.py new file mode 100644 index 0000000000..3faf30562b --- /dev/null +++ b/awx/lib/site-packages/azure/servicemanagement/websitemanagementservice.py @@ -0,0 +1,256 @@ +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +from azure import ( + MANAGEMENT_HOST, + _str, + ) +from azure.servicemanagement import ( + WebSpaces, + WebSpace, + Sites, + Site, + MetricResponses, + MetricDefinitions, + PublishData, + _XmlSerializer, + ) +from azure.servicemanagement.servicemanagementclient import ( + _ServiceManagementClient, + ) + +class WebsiteManagementService(_ServiceManagementClient): + ''' Note that this class is a preliminary work on WebSite + management. Since it lack a lot a features, final version + can be slightly different from the current one. + ''' + + def __init__(self, subscription_id=None, cert_file=None, + host=MANAGEMENT_HOST, request_session=None): + ''' + Initializes the website management service. + + subscription_id: Subscription to manage. + cert_file: + Path to .pem certificate file (httplib), or location of the + certificate in your Personal certificate store (winhttp) in the + CURRENT_USER\my\CertificateName format. + If a request_session is specified, then this is unused. + host: Live ServiceClient URL. Defaults to Azure public cloud. + request_session: + Session object to use for http requests. If this is specified, it + replaces the default use of httplib or winhttp. Also, the cert_file + parameter is unused when a session is passed in. + The session object handles authentication, and as such can support + multiple types of authentication: .pem certificate, oauth. + For example, you can pass in a Session instance from the requests + library. To use .pem certificate authentication with requests + library, set the path to the .pem file on the session.cert + attribute. + ''' + super(WebsiteManagementService, self).__init__( + subscription_id, cert_file, host, request_session) + + #--Operations for web sites ---------------------------------------- + def list_webspaces(self): + ''' + List the webspaces defined on the account. + ''' + return self._perform_get(self._get_list_webspaces_path(), + WebSpaces) + + def get_webspace(self, webspace_name): + ''' + Get details of a specific webspace. + + webspace_name: The name of the webspace. + ''' + return self._perform_get(self._get_webspace_details_path(webspace_name), + WebSpace) + + def list_sites(self, webspace_name): + ''' + List the web sites defined on this webspace. + + webspace_name: The name of the webspace. + ''' + return self._perform_get(self._get_sites_path(webspace_name), + Sites) + + def get_site(self, webspace_name, website_name): + ''' + List the web sites defined on this webspace. + + webspace_name: The name of the webspace. + website_name: The name of the website. + ''' + return self._perform_get(self._get_sites_details_path(webspace_name, + website_name), + Site) + + def create_site(self, webspace_name, website_name, geo_region, host_names, + plan='VirtualDedicatedPlan', compute_mode='Shared', + server_farm=None, site_mode=None): + ''' + Create a website. + + webspace_name: The name of the webspace. + website_name: The name of the website. + geo_region: + The geographical region of the webspace that will be created. + host_names: + An array of fully qualified domain names for website. Only one + hostname can be specified in the azurewebsites.net domain. + The hostname should match the name of the website. Custom domains + can only be specified for Shared or Standard websites. + plan: + This value must be 'VirtualDedicatedPlan'. + compute_mode: + This value should be 'Shared' for the Free or Paid Shared + offerings, or 'Dedicated' for the Standard offering. The default + value is 'Shared'. If you set it to 'Dedicated', you must specify + a value for the server_farm parameter. + server_farm: + The name of the Server Farm associated with this website. This is + a required value for Standard mode. + site_mode: + Can be None, 'Limited' or 'Basic'. This value is 'Limited' for the + Free offering, and 'Basic' for the Paid Shared offering. Standard + mode does not use the site_mode parameter; it uses the compute_mode + parameter. + ''' + xml = _XmlSerializer.create_website_to_xml(webspace_name, website_name, geo_region, plan, host_names, compute_mode, server_farm, site_mode) + return self._perform_post( + self._get_sites_path(webspace_name), + xml, + Site) + + def delete_site(self, webspace_name, website_name, + delete_empty_server_farm=False, delete_metrics=False): + ''' + Delete a website. + + webspace_name: The name of the webspace. + website_name: The name of the website. + delete_empty_server_farm: + If the site being deleted is the last web site in a server farm, + you can delete the server farm by setting this to True. + delete_metrics: + To also delete the metrics for the site that you are deleting, you + can set this to True. + ''' + path = self._get_sites_details_path(webspace_name, website_name) + query = '' + if delete_empty_server_farm: + query += '&deleteEmptyServerFarm=true' + if delete_metrics: + query += '&deleteMetrics=true' + if query: + path = path + '?' + query.lstrip('&') + return self._perform_delete(path) + + def restart_site(self, webspace_name, website_name): + ''' + Restart a web site. + + webspace_name: The name of the webspace. + website_name: The name of the website. + ''' + return self._perform_post( + self._get_restart_path(webspace_name, website_name), + '') + + def get_historical_usage_metrics(self, webspace_name, website_name, + metrics = None, start_time=None, end_time=None, time_grain=None): + ''' + Get historical usage metrics. + + webspace_name: The name of the webspace. + website_name: The name of the website. + metrics: Optional. List of metrics name. Otherwise, all metrics returned. + start_time: Optional. An ISO8601 date. Otherwise, current hour is used. + end_time: Optional. An ISO8601 date. Otherwise, current time is used. + time_grain: Optional. A rollup name, as P1D. OTherwise, default rollup for the metrics is used. + More information and metrics name at: + http://msdn.microsoft.com/en-us/library/azure/dn166964.aspx + ''' + metrics = ('names='+','.join(metrics)) if metrics else '' + start_time = ('StartTime='+start_time) if start_time else '' + end_time = ('EndTime='+end_time) if end_time else '' + time_grain = ('TimeGrain='+time_grain) if time_grain else '' + parameters = ('&'.join(v for v in (metrics, start_time, end_time, time_grain) if v)) + parameters = '?'+parameters if parameters else '' + return self._perform_get(self._get_historical_usage_metrics_path(webspace_name, website_name) + parameters, + MetricResponses) + + def get_metric_definitions(self, webspace_name, website_name): + ''' + Get metric definitions of metrics available of this web site. + + webspace_name: The name of the webspace. + website_name: The name of the website. + ''' + return self._perform_get(self._get_metric_definitions_path(webspace_name, website_name), + MetricDefinitions) + + def get_publish_profile_xml(self, webspace_name, website_name): + ''' + Get a site's publish profile as a string + + webspace_name: The name of the webspace. + website_name: The name of the website. + ''' + return self._perform_get(self._get_publishxml_path(webspace_name, website_name), + None).body.decode("utf-8") + + def get_publish_profile(self, webspace_name, website_name): + ''' + Get a site's publish profile as an object + + webspace_name: The name of the webspace. + website_name: The name of the website. + ''' + return self._perform_get(self._get_publishxml_path(webspace_name, website_name), + PublishData) + + #--Helper functions -------------------------------------------------- + def _get_list_webspaces_path(self): + return self._get_path('services/webspaces', None) + + def _get_webspace_details_path(self, webspace_name): + return self._get_path('services/webspaces/', webspace_name) + + def _get_sites_path(self, webspace_name): + return self._get_path('services/webspaces/', + webspace_name) + '/sites' + + def _get_sites_details_path(self, webspace_name, website_name): + return self._get_path('services/webspaces/', + webspace_name) + '/sites/' + _str(website_name) + + def _get_restart_path(self, webspace_name, website_name): + return self._get_path('services/webspaces/', + webspace_name) + '/sites/' + _str(website_name) + '/restart/' + + def _get_historical_usage_metrics_path(self, webspace_name, website_name): + return self._get_path('services/webspaces/', + webspace_name) + '/sites/' + _str(website_name) + '/metrics/' + + def _get_metric_definitions_path(self, webspace_name, website_name): + return self._get_path('services/webspaces/', + webspace_name) + '/sites/' + _str(website_name) + '/metricdefinitions/' + + def _get_publishxml_path(self, webspace_name, website_name): + return self._get_path('services/webspaces/', + webspace_name) + '/sites/' + _str(website_name) + '/publishxml/' diff --git a/awx/lib/site-packages/azure/storage/__init__.py b/awx/lib/site-packages/azure/storage/__init__.py index 5a28afd0bb..6089d3ff2a 100644 --- a/awx/lib/site-packages/azure/storage/__init__.py +++ b/awx/lib/site-packages/azure/storage/__init__.py @@ -1,913 +1,901 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -import hashlib -import hmac -import sys -import types - -from datetime import datetime -from xml.dom import minidom -from azure import (WindowsAzureData, - WindowsAzureError, - METADATA_NS, - xml_escape, - _create_entry, - _decode_base64_to_text, - _decode_base64_to_bytes, - _encode_base64, - _fill_data_minidom, - _fill_instance_element, - _get_child_nodes, - _get_child_nodesNS, - _get_children_from_path, - _get_entry_properties, - _general_error_handler, - _list_of, - _parse_response_for_dict, - _unicode_type, - _ERROR_CANNOT_SERIALIZE_VALUE_TO_ENTITY, - ) - -# x-ms-version for storage service. -X_MS_VERSION = '2012-02-12' - - -class EnumResultsBase(object): - - ''' base class for EnumResults. ''' - - def __init__(self): - self.prefix = u'' - self.marker = u'' - self.max_results = 0 - self.next_marker = u'' - - -class ContainerEnumResults(EnumResultsBase): - - ''' Blob Container list. ''' - - def __init__(self): - EnumResultsBase.__init__(self) - self.containers = _list_of(Container) - - def __iter__(self): - return iter(self.containers) - - def __len__(self): - return len(self.containers) - - def __getitem__(self, index): - return self.containers[index] - - -class Container(WindowsAzureData): - - ''' Blob container class. ''' - - def __init__(self): - self.name = u'' - self.url = u'' - self.properties = Properties() - self.metadata = {} - - -class Properties(WindowsAzureData): - - ''' Blob container's properties class. ''' - - def __init__(self): - self.last_modified = u'' - self.etag = u'' - - -class RetentionPolicy(WindowsAzureData): - - ''' RetentionPolicy in service properties. ''' - - def __init__(self): - self.enabled = False - self.__dict__['days'] = None - - def get_days(self): - # convert days to int value - return int(self.__dict__['days']) - - def set_days(self, value): - ''' set default days if days is set to empty. ''' - self.__dict__['days'] = value - - days = property(fget=get_days, fset=set_days) - - -class Logging(WindowsAzureData): - - ''' Logging class in service properties. ''' - - def __init__(self): - self.version = u'1.0' - self.delete = False - self.read = False - self.write = False - self.retention_policy = RetentionPolicy() - - -class Metrics(WindowsAzureData): - - ''' Metrics class in service properties. ''' - - def __init__(self): - self.version = u'1.0' - self.enabled = False - self.include_apis = None - self.retention_policy = RetentionPolicy() - - -class StorageServiceProperties(WindowsAzureData): - - ''' Storage Service Propeties class. ''' - - def __init__(self): - self.logging = Logging() - self.metrics = Metrics() - - -class AccessPolicy(WindowsAzureData): - - ''' Access Policy class in service properties. ''' - - def __init__(self, start=u'', expiry=u'', permission='u'): - self.start = start - self.expiry = expiry - self.permission = permission - - -class SignedIdentifier(WindowsAzureData): - - ''' Signed Identifier class for service properties. ''' - - def __init__(self): - self.id = u'' - self.access_policy = AccessPolicy() - - -class SignedIdentifiers(WindowsAzureData): - - ''' SignedIdentifier list. ''' - - def __init__(self): - self.signed_identifiers = _list_of(SignedIdentifier) - - def __iter__(self): - return iter(self.signed_identifiers) - - def __len__(self): - return len(self.signed_identifiers) - - def __getitem__(self, index): - return self.signed_identifiers[index] - - -class BlobEnumResults(EnumResultsBase): - - ''' Blob list.''' - - def __init__(self): - EnumResultsBase.__init__(self) - self.blobs = _list_of(Blob) - self.prefixes = _list_of(BlobPrefix) - self.delimiter = '' - - def __iter__(self): - return iter(self.blobs) - - def __len__(self): - return len(self.blobs) - - def __getitem__(self, index): - return self.blobs[index] - - -class BlobResult(bytes): - - def __new__(cls, blob, properties): - return bytes.__new__(cls, blob if blob else b'') - - def __init__(self, blob, properties): - self.properties = properties - - -class Blob(WindowsAzureData): - - ''' Blob class. ''' - - def __init__(self): - self.name = u'' - self.snapshot = u'' - self.url = u'' - self.properties = BlobProperties() - self.metadata = {} - - -class BlobProperties(WindowsAzureData): - - ''' Blob Properties ''' - - def __init__(self): - self.last_modified = u'' - self.etag = u'' - self.content_length = 0 - self.content_type = u'' - self.content_encoding = u'' - self.content_language = u'' - self.content_md5 = u'' - self.xms_blob_sequence_number = 0 - self.blob_type = u'' - self.lease_status = u'' - self.lease_state = u'' - self.lease_duration = u'' - self.copy_id = u'' - self.copy_source = u'' - self.copy_status = u'' - self.copy_progress = u'' - self.copy_completion_time = u'' - self.copy_status_description = u'' - - -class BlobPrefix(WindowsAzureData): - - ''' BlobPrefix in Blob. ''' - - def __init__(self): - self.name = '' - - -class BlobBlock(WindowsAzureData): - - ''' BlobBlock class ''' - - def __init__(self, id=None, size=None): - self.id = id - self.size = size - - -class BlobBlockList(WindowsAzureData): - - ''' BlobBlockList class ''' - - def __init__(self): - self.committed_blocks = [] - self.uncommitted_blocks = [] - - -class PageRange(WindowsAzureData): - - ''' Page Range for page blob. ''' - - def __init__(self): - self.start = 0 - self.end = 0 - - -class PageList(object): - - ''' Page list for page blob. ''' - - def __init__(self): - self.page_ranges = _list_of(PageRange) - - def __iter__(self): - return iter(self.page_ranges) - - def __len__(self): - return len(self.page_ranges) - - def __getitem__(self, index): - return self.page_ranges[index] - - -class QueueEnumResults(EnumResultsBase): - - ''' Queue list''' - - def __init__(self): - EnumResultsBase.__init__(self) - self.queues = _list_of(Queue) - - def __iter__(self): - return iter(self.queues) - - def __len__(self): - return len(self.queues) - - def __getitem__(self, index): - return self.queues[index] - - -class Queue(WindowsAzureData): - - ''' Queue class ''' - - def __init__(self): - self.name = u'' - self.url = u'' - self.metadata = {} - - -class QueueMessagesList(WindowsAzureData): - - ''' Queue message list. ''' - - def __init__(self): - self.queue_messages = _list_of(QueueMessage) - - def __iter__(self): - return iter(self.queue_messages) - - def __len__(self): - return len(self.queue_messages) - - def __getitem__(self, index): - return self.queue_messages[index] - - -class QueueMessage(WindowsAzureData): - - ''' Queue message class. ''' - - def __init__(self): - self.message_id = u'' - self.insertion_time = u'' - self.expiration_time = u'' - self.pop_receipt = u'' - self.time_next_visible = u'' - self.dequeue_count = u'' - self.message_text = u'' - - -class Entity(WindowsAzureData): - - ''' Entity class. The attributes of entity will be created dynamically. ''' - pass - - -class EntityProperty(WindowsAzureData): - - ''' Entity property. contains type and value. ''' - - def __init__(self, type=None, value=None): - self.type = type - self.value = value - - -class Table(WindowsAzureData): - - ''' Only for intellicens and telling user the return type. ''' - pass - - -def _parse_blob_enum_results_list(response): - respbody = response.body - return_obj = BlobEnumResults() - doc = minidom.parseString(respbody) - - for enum_results in _get_child_nodes(doc, 'EnumerationResults'): - for child in _get_children_from_path(enum_results, 'Blobs', 'Blob'): - return_obj.blobs.append(_fill_instance_element(child, Blob)) - - for child in _get_children_from_path(enum_results, - 'Blobs', - 'BlobPrefix'): - return_obj.prefixes.append( - _fill_instance_element(child, BlobPrefix)) - - for name, value in vars(return_obj).items(): - if name == 'blobs' or name == 'prefixes': - continue - value = _fill_data_minidom(enum_results, name, value) - if value is not None: - setattr(return_obj, name, value) - - return return_obj - - -def _update_storage_header(request): - ''' add additional headers for storage request. ''' - if request.body: - assert isinstance(request.body, bytes) - - # if it is PUT, POST, MERGE, DELETE, need to add content-lengt to header. - if request.method in ['PUT', 'POST', 'MERGE', 'DELETE']: - request.headers.append(('Content-Length', str(len(request.body)))) - - # append addtional headers base on the service - request.headers.append(('x-ms-version', X_MS_VERSION)) - - # append x-ms-meta name, values to header - for name, value in request.headers: - if 'x-ms-meta-name-values' in name and value: - for meta_name, meta_value in value.items(): - request.headers.append(('x-ms-meta-' + meta_name, meta_value)) - request.headers.remove((name, value)) - break - return request - - -def _update_storage_blob_header(request, account_name, account_key): - ''' add additional headers for storage blob request. ''' - - request = _update_storage_header(request) - current_time = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') - request.headers.append(('x-ms-date', current_time)) - request.headers.append( - ('Content-Type', 'application/octet-stream Charset=UTF-8')) - request.headers.append(('Authorization', - _sign_storage_blob_request(request, - account_name, - account_key))) - - return request.headers - - -def _update_storage_queue_header(request, account_name, account_key): - ''' add additional headers for storage queue request. ''' - return _update_storage_blob_header(request, account_name, account_key) - - -def _update_storage_table_header(request): - ''' add additional headers for storage table request. ''' - - request = _update_storage_header(request) - for name, _ in request.headers: - if name.lower() == 'content-type': - break - else: - request.headers.append(('Content-Type', 'application/atom+xml')) - request.headers.append(('DataServiceVersion', '2.0;NetFx')) - request.headers.append(('MaxDataServiceVersion', '2.0;NetFx')) - current_time = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') - request.headers.append(('x-ms-date', current_time)) - request.headers.append(('Date', current_time)) - return request.headers - - -def _sign_storage_blob_request(request, account_name, account_key): - ''' - Returns the signed string for blob request which is used to set - Authorization header. This is also used to sign queue request. - ''' - - uri_path = request.path.split('?')[0] - - # method to sign - string_to_sign = request.method + '\n' - - # get headers to sign - headers_to_sign = [ - 'content-encoding', 'content-language', 'content-length', - 'content-md5', 'content-type', 'date', 'if-modified-since', - 'if-match', 'if-none-match', 'if-unmodified-since', 'range'] - - request_header_dict = dict((name.lower(), value) - for name, value in request.headers if value) - string_to_sign += '\n'.join(request_header_dict.get(x, '') - for x in headers_to_sign) + '\n' - - # get x-ms header to sign - x_ms_headers = [] - for name, value in request.headers: - if 'x-ms' in name: - x_ms_headers.append((name.lower(), value)) - x_ms_headers.sort() - for name, value in x_ms_headers: - if value: - string_to_sign += ''.join([name, ':', value, '\n']) - - # get account_name and uri path to sign - string_to_sign += '/' + account_name + uri_path - - # get query string to sign if it is not table service - query_to_sign = request.query - query_to_sign.sort() - - current_name = '' - for name, value in query_to_sign: - if value: - if current_name != name: - string_to_sign += '\n' + name + ':' + value - else: - string_to_sign += '\n' + ',' + value - - # sign the request - auth_string = 'SharedKey ' + account_name + ':' + \ - _sign_string(account_key, string_to_sign) - return auth_string - - -def _sign_storage_table_request(request, account_name, account_key): - uri_path = request.path.split('?')[0] - - string_to_sign = request.method + '\n' - headers_to_sign = ['content-md5', 'content-type', 'date'] - request_header_dict = dict((name.lower(), value) - for name, value in request.headers if value) - string_to_sign += '\n'.join(request_header_dict.get(x, '') - for x in headers_to_sign) + '\n' - - # get account_name and uri path to sign - string_to_sign += ''.join(['/', account_name, uri_path]) - - for name, value in request.query: - if name == 'comp' and uri_path == '/': - string_to_sign += '?comp=' + value - break - - # sign the request - auth_string = 'SharedKey ' + account_name + ':' + \ - _sign_string(account_key, string_to_sign) - return auth_string - - -def _sign_string(account_key, string_to_sign): - decoded_account_key = _decode_base64_to_bytes(account_key) - if isinstance(string_to_sign, _unicode_type): - string_to_sign = string_to_sign.encode('utf-8') - signed_hmac_sha256 = hmac.HMAC( - decoded_account_key, string_to_sign, hashlib.sha256) - digest = signed_hmac_sha256.digest() - encoded_digest = _encode_base64(digest) - return encoded_digest - - -def _to_python_bool(value): - if value.lower() == 'true': - return True - return False - - -def _to_entity_int(data): - int_max = (2 << 30) - 1 - if data > (int_max) or data < (int_max + 1) * (-1): - return 'Edm.Int64', str(data) - else: - return 'Edm.Int32', str(data) - - -def _to_entity_bool(value): - if value: - return 'Edm.Boolean', 'true' - return 'Edm.Boolean', 'false' - - -def _to_entity_datetime(value): - return 'Edm.DateTime', value.strftime('%Y-%m-%dT%H:%M:%S') - - -def _to_entity_float(value): - return 'Edm.Double', str(value) - - -def _to_entity_property(value): - if value.type == 'Edm.Binary': - return value.type, _encode_base64(value.value) - - return value.type, str(value.value) - - -def _to_entity_none(value): - return None, None - - -def _to_entity_str(value): - return 'Edm.String', value - - -# Tables of conversions to and from entity types. We support specific -# datatypes, and beyond that the user can use an EntityProperty to get -# custom data type support. - -def _from_entity_binary(value): - return EntityProperty('Edm.Binary', _decode_base64_to_bytes(value)) - - -def _from_entity_int(value): - return int(value) - - -def _from_entity_datetime(value): - format = '%Y-%m-%dT%H:%M:%S' - if '.' in value: - format = format + '.%f' - if value.endswith('Z'): - format = format + 'Z' - return datetime.strptime(value, format) - -_ENTITY_TO_PYTHON_CONVERSIONS = { - 'Edm.Binary': _from_entity_binary, - 'Edm.Int32': _from_entity_int, - 'Edm.Int64': _from_entity_int, - 'Edm.Double': float, - 'Edm.Boolean': _to_python_bool, - 'Edm.DateTime': _from_entity_datetime, -} - -# Conversion from Python type to a function which returns a tuple of the -# type string and content string. -_PYTHON_TO_ENTITY_CONVERSIONS = { - int: _to_entity_int, - bool: _to_entity_bool, - datetime: _to_entity_datetime, - float: _to_entity_float, - EntityProperty: _to_entity_property, - str: _to_entity_str, -} - -if sys.version_info < (3,): - _PYTHON_TO_ENTITY_CONVERSIONS.update({ - long: _to_entity_int, - types.NoneType: _to_entity_none, - unicode: _to_entity_str, - }) - - -def _convert_entity_to_xml(source): - ''' Converts an entity object to xml to send. - - The entity format is: - <entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> - <title /> - <updated>2008-09-18T23:46:19.3857256Z</updated> - <author> - <name /> - </author> - <id /> - <content type="application/xml"> - <m:properties> - <d:Address>Mountain View</d:Address> - <d:Age m:type="Edm.Int32">23</d:Age> - <d:AmountDue m:type="Edm.Double">200.23</d:AmountDue> - <d:BinaryData m:type="Edm.Binary" m:null="true" /> - <d:CustomerCode m:type="Edm.Guid">c9da6455-213d-42c9-9a79-3e9149a57833</d:CustomerCode> - <d:CustomerSince m:type="Edm.DateTime">2008-07-10T00:00:00</d:CustomerSince> - <d:IsActive m:type="Edm.Boolean">true</d:IsActive> - <d:NumOfOrders m:type="Edm.Int64">255</d:NumOfOrders> - <d:PartitionKey>mypartitionkey</d:PartitionKey> - <d:RowKey>myrowkey1</d:RowKey> - <d:Timestamp m:type="Edm.DateTime">0001-01-01T00:00:00</d:Timestamp> - </m:properties> - </content> - </entry> - ''' - - # construct the entity body included in <m:properties> and </m:properties> - entity_body = '<m:properties xml:space="preserve">{properties}</m:properties>' - - if isinstance(source, WindowsAzureData): - source = vars(source) - - properties_str = '' - - # set properties type for types we know if value has no type info. - # if value has type info, then set the type to value.type - for name, value in source.items(): - mtype = '' - conv = _PYTHON_TO_ENTITY_CONVERSIONS.get(type(value)) - if conv is None and sys.version_info >= (3,) and value is None: - conv = _to_entity_none - if conv is None: - raise WindowsAzureError( - _ERROR_CANNOT_SERIALIZE_VALUE_TO_ENTITY.format( - type(value).__name__)) - - mtype, value = conv(value) - - # form the property node - properties_str += ''.join(['<d:', name]) - if value is None: - properties_str += ' m:null="true" />' - else: - if mtype: - properties_str += ''.join([' m:type="', mtype, '"']) - properties_str += ''.join(['>', - xml_escape(value), '</d:', name, '>']) - - if sys.version_info < (3,): - if isinstance(properties_str, unicode): - properties_str = properties_str.encode(encoding='utf-8') - - # generate the entity_body - entity_body = entity_body.format(properties=properties_str) - xmlstr = _create_entry(entity_body) - return xmlstr - - -def _convert_table_to_xml(table_name): - ''' - Create xml to send for a given table name. Since xml format for table is - the same as entity and the only difference is that table has only one - property 'TableName', so we just call _convert_entity_to_xml. - - table_name: the name of the table - ''' - return _convert_entity_to_xml({'TableName': table_name}) - - -def _convert_block_list_to_xml(block_id_list): - ''' - Convert a block list to xml to send. - - block_id_list: - a str list containing the block ids that are used in put_block_list. - Only get block from latest blocks. - ''' - if block_id_list is None: - return '' - xml = '<?xml version="1.0" encoding="utf-8"?><BlockList>' - for value in block_id_list: - xml += '<Latest>{0}</Latest>'.format(_encode_base64(value)) - - return xml + '</BlockList>' - - -def _create_blob_result(response): - blob_properties = _parse_response_for_dict(response) - return BlobResult(response.body, blob_properties) - - -def _convert_response_to_block_list(response): - ''' - Converts xml response to block list class. - ''' - blob_block_list = BlobBlockList() - - xmldoc = minidom.parseString(response.body) - for xml_block in _get_children_from_path(xmldoc, - 'BlockList', - 'CommittedBlocks', - 'Block'): - xml_block_id = _decode_base64_to_text( - _get_child_nodes(xml_block, 'Name')[0].firstChild.nodeValue) - xml_block_size = int( - _get_child_nodes(xml_block, 'Size')[0].firstChild.nodeValue) - blob_block_list.committed_blocks.append( - BlobBlock(xml_block_id, xml_block_size)) - - for xml_block in _get_children_from_path(xmldoc, - 'BlockList', - 'UncommittedBlocks', - 'Block'): - xml_block_id = _decode_base64_to_text( - _get_child_nodes(xml_block, 'Name')[0].firstChild.nodeValue) - xml_block_size = int( - _get_child_nodes(xml_block, 'Size')[0].firstChild.nodeValue) - blob_block_list.uncommitted_blocks.append( - BlobBlock(xml_block_id, xml_block_size)) - - return blob_block_list - - -def _remove_prefix(name): - colon = name.find(':') - if colon != -1: - return name[colon + 1:] - return name - - -def _convert_response_to_entity(response): - if response is None: - return response - return _convert_xml_to_entity(response.body) - - -def _convert_xml_to_entity(xmlstr): - ''' Convert xml response to entity. - - The format of entity: - <entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> - <title /> - <updated>2008-09-18T23:46:19.3857256Z</updated> - <author> - <name /> - </author> - <id /> - <content type="application/xml"> - <m:properties> - <d:Address>Mountain View</d:Address> - <d:Age m:type="Edm.Int32">23</d:Age> - <d:AmountDue m:type="Edm.Double">200.23</d:AmountDue> - <d:BinaryData m:type="Edm.Binary" m:null="true" /> - <d:CustomerCode m:type="Edm.Guid">c9da6455-213d-42c9-9a79-3e9149a57833</d:CustomerCode> - <d:CustomerSince m:type="Edm.DateTime">2008-07-10T00:00:00</d:CustomerSince> - <d:IsActive m:type="Edm.Boolean">true</d:IsActive> - <d:NumOfOrders m:type="Edm.Int64">255</d:NumOfOrders> - <d:PartitionKey>mypartitionkey</d:PartitionKey> - <d:RowKey>myrowkey1</d:RowKey> - <d:Timestamp m:type="Edm.DateTime">0001-01-01T00:00:00</d:Timestamp> - </m:properties> - </content> - </entry> - ''' - xmldoc = minidom.parseString(xmlstr) - - xml_properties = None - for entry in _get_child_nodes(xmldoc, 'entry'): - for content in _get_child_nodes(entry, 'content'): - # TODO: Namespace - xml_properties = _get_child_nodesNS( - content, METADATA_NS, 'properties') - - if not xml_properties: - return None - - entity = Entity() - # extract each property node and get the type from attribute and node value - for xml_property in xml_properties[0].childNodes: - name = _remove_prefix(xml_property.nodeName) - # exclude the Timestamp since it is auto added by azure when - # inserting entity. We don't want this to mix with real properties - if name in ['Timestamp']: - continue - - if xml_property.firstChild: - value = xml_property.firstChild.nodeValue - else: - value = '' - - isnull = xml_property.getAttributeNS(METADATA_NS, 'null') - mtype = xml_property.getAttributeNS(METADATA_NS, 'type') - - # if not isnull and no type info, then it is a string and we just - # need the str type to hold the property. - if not isnull and not mtype: - _set_entity_attr(entity, name, value) - elif isnull == 'true': - if mtype: - property = EntityProperty(mtype, None) - else: - property = EntityProperty('Edm.String', None) - else: # need an object to hold the property - conv = _ENTITY_TO_PYTHON_CONVERSIONS.get(mtype) - if conv is not None: - property = conv(value) - else: - property = EntityProperty(mtype, value) - _set_entity_attr(entity, name, property) - - # extract id, updated and name value from feed entry and set them of - # rule. - for name, value in _get_entry_properties(xmlstr, True).items(): - if name in ['etag']: - _set_entity_attr(entity, name, value) - - return entity - - -def _set_entity_attr(entity, name, value): - try: - setattr(entity, name, value) - except UnicodeEncodeError: - # Python 2 doesn't support unicode attribute names, so we'll - # add them and access them directly through the dictionary - entity.__dict__[name] = value - - -def _convert_xml_to_table(xmlstr): - ''' Converts the xml response to table class. - Simply call convert_xml_to_entity and extract the table name, and add - updated and author info - ''' - table = Table() - entity = _convert_xml_to_entity(xmlstr) - setattr(table, 'name', entity.TableName) - for name, value in _get_entry_properties(xmlstr, False).items(): - setattr(table, name, value) - return table - - -def _storage_error_handler(http_error): - ''' Simple error handler for storage service. ''' - return _general_error_handler(http_error) - -# make these available just from storage. -from azure.storage.blobservice import BlobService -from azure.storage.queueservice import QueueService -from azure.storage.tableservice import TableService -from azure.storage.cloudstorageaccount import CloudStorageAccount -from azure.storage.sharedaccesssignature import ( - SharedAccessSignature, - SharedAccessPolicy, - Permission, - WebResource, - ) +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +import sys +import types + +from datetime import datetime +from dateutil import parser +from dateutil.tz import tzutc +from xml.dom import minidom +from azure import (WindowsAzureData, + WindowsAzureError, + METADATA_NS, + xml_escape, + _create_entry, + _decode_base64_to_text, + _decode_base64_to_bytes, + _encode_base64, + _fill_data_minidom, + _fill_instance_element, + _get_child_nodes, + _get_child_nodesNS, + _get_children_from_path, + _get_entry_properties, + _general_error_handler, + _list_of, + _parse_response_for_dict, + _sign_string, + _unicode_type, + _ERROR_CANNOT_SERIALIZE_VALUE_TO_ENTITY, + ) + +# x-ms-version for storage service. +X_MS_VERSION = '2012-02-12' + + +class EnumResultsBase(object): + + ''' base class for EnumResults. ''' + + def __init__(self): + self.prefix = u'' + self.marker = u'' + self.max_results = 0 + self.next_marker = u'' + + +class ContainerEnumResults(EnumResultsBase): + + ''' Blob Container list. ''' + + def __init__(self): + EnumResultsBase.__init__(self) + self.containers = _list_of(Container) + + def __iter__(self): + return iter(self.containers) + + def __len__(self): + return len(self.containers) + + def __getitem__(self, index): + return self.containers[index] + + +class Container(WindowsAzureData): + + ''' Blob container class. ''' + + def __init__(self): + self.name = u'' + self.url = u'' + self.properties = Properties() + self.metadata = {} + + +class Properties(WindowsAzureData): + + ''' Blob container's properties class. ''' + + def __init__(self): + self.last_modified = u'' + self.etag = u'' + + +class RetentionPolicy(WindowsAzureData): + + ''' RetentionPolicy in service properties. ''' + + def __init__(self): + self.enabled = False + self.__dict__['days'] = None + + def get_days(self): + # convert days to int value + return int(self.__dict__['days']) + + def set_days(self, value): + ''' set default days if days is set to empty. ''' + self.__dict__['days'] = value + + days = property(fget=get_days, fset=set_days) + + +class Logging(WindowsAzureData): + + ''' Logging class in service properties. ''' + + def __init__(self): + self.version = u'1.0' + self.delete = False + self.read = False + self.write = False + self.retention_policy = RetentionPolicy() + + +class Metrics(WindowsAzureData): + + ''' Metrics class in service properties. ''' + + def __init__(self): + self.version = u'1.0' + self.enabled = False + self.include_apis = None + self.retention_policy = RetentionPolicy() + + +class StorageServiceProperties(WindowsAzureData): + + ''' Storage Service Propeties class. ''' + + def __init__(self): + self.logging = Logging() + self.metrics = Metrics() + + +class AccessPolicy(WindowsAzureData): + + ''' Access Policy class in service properties. ''' + + def __init__(self, start=u'', expiry=u'', permission='u'): + self.start = start + self.expiry = expiry + self.permission = permission + + +class SignedIdentifier(WindowsAzureData): + + ''' Signed Identifier class for service properties. ''' + + def __init__(self): + self.id = u'' + self.access_policy = AccessPolicy() + + +class SignedIdentifiers(WindowsAzureData): + + ''' SignedIdentifier list. ''' + + def __init__(self): + self.signed_identifiers = _list_of(SignedIdentifier) + + def __iter__(self): + return iter(self.signed_identifiers) + + def __len__(self): + return len(self.signed_identifiers) + + def __getitem__(self, index): + return self.signed_identifiers[index] + + +class BlobEnumResults(EnumResultsBase): + + ''' Blob list.''' + + def __init__(self): + EnumResultsBase.__init__(self) + self.blobs = _list_of(Blob) + self.prefixes = _list_of(BlobPrefix) + self.delimiter = '' + + def __iter__(self): + return iter(self.blobs) + + def __len__(self): + return len(self.blobs) + + def __getitem__(self, index): + return self.blobs[index] + + +class BlobResult(bytes): + + def __new__(cls, blob, properties): + return bytes.__new__(cls, blob if blob else b'') + + def __init__(self, blob, properties): + self.properties = properties + + +class Blob(WindowsAzureData): + + ''' Blob class. ''' + + def __init__(self): + self.name = u'' + self.snapshot = u'' + self.url = u'' + self.properties = BlobProperties() + self.metadata = {} + + +class BlobProperties(WindowsAzureData): + + ''' Blob Properties ''' + + def __init__(self): + self.last_modified = u'' + self.etag = u'' + self.content_length = 0 + self.content_type = u'' + self.content_encoding = u'' + self.content_language = u'' + self.content_md5 = u'' + self.xms_blob_sequence_number = 0 + self.blob_type = u'' + self.lease_status = u'' + self.lease_state = u'' + self.lease_duration = u'' + self.copy_id = u'' + self.copy_source = u'' + self.copy_status = u'' + self.copy_progress = u'' + self.copy_completion_time = u'' + self.copy_status_description = u'' + + +class BlobPrefix(WindowsAzureData): + + ''' BlobPrefix in Blob. ''' + + def __init__(self): + self.name = '' + + +class BlobBlock(WindowsAzureData): + + ''' BlobBlock class ''' + + def __init__(self, id=None, size=None): + self.id = id + self.size = size + + +class BlobBlockList(WindowsAzureData): + + ''' BlobBlockList class ''' + + def __init__(self): + self.committed_blocks = [] + self.uncommitted_blocks = [] + + +class PageRange(WindowsAzureData): + + ''' Page Range for page blob. ''' + + def __init__(self): + self.start = 0 + self.end = 0 + + +class PageList(object): + + ''' Page list for page blob. ''' + + def __init__(self): + self.page_ranges = _list_of(PageRange) + + def __iter__(self): + return iter(self.page_ranges) + + def __len__(self): + return len(self.page_ranges) + + def __getitem__(self, index): + return self.page_ranges[index] + + +class QueueEnumResults(EnumResultsBase): + + ''' Queue list''' + + def __init__(self): + EnumResultsBase.__init__(self) + self.queues = _list_of(Queue) + + def __iter__(self): + return iter(self.queues) + + def __len__(self): + return len(self.queues) + + def __getitem__(self, index): + return self.queues[index] + + +class Queue(WindowsAzureData): + + ''' Queue class ''' + + def __init__(self): + self.name = u'' + self.url = u'' + self.metadata = {} + + +class QueueMessagesList(WindowsAzureData): + + ''' Queue message list. ''' + + def __init__(self): + self.queue_messages = _list_of(QueueMessage) + + def __iter__(self): + return iter(self.queue_messages) + + def __len__(self): + return len(self.queue_messages) + + def __getitem__(self, index): + return self.queue_messages[index] + + +class QueueMessage(WindowsAzureData): + + ''' Queue message class. ''' + + def __init__(self): + self.message_id = u'' + self.insertion_time = u'' + self.expiration_time = u'' + self.pop_receipt = u'' + self.time_next_visible = u'' + self.dequeue_count = u'' + self.message_text = u'' + + +class Entity(WindowsAzureData): + + ''' Entity class. The attributes of entity will be created dynamically. ''' + pass + + +class EntityProperty(WindowsAzureData): + + ''' Entity property. contains type and value. ''' + + def __init__(self, type=None, value=None): + self.type = type + self.value = value + + +class Table(WindowsAzureData): + + ''' Only for intellicens and telling user the return type. ''' + pass + + +def _parse_blob_enum_results_list(response): + respbody = response.body + return_obj = BlobEnumResults() + doc = minidom.parseString(respbody) + + for enum_results in _get_child_nodes(doc, 'EnumerationResults'): + for child in _get_children_from_path(enum_results, 'Blobs', 'Blob'): + return_obj.blobs.append(_fill_instance_element(child, Blob)) + + for child in _get_children_from_path(enum_results, + 'Blobs', + 'BlobPrefix'): + return_obj.prefixes.append( + _fill_instance_element(child, BlobPrefix)) + + for name, value in vars(return_obj).items(): + if name == 'blobs' or name == 'prefixes': + continue + value = _fill_data_minidom(enum_results, name, value) + if value is not None: + setattr(return_obj, name, value) + + return return_obj + + +def _update_storage_header(request): + ''' add additional headers for storage request. ''' + if request.body: + assert isinstance(request.body, bytes) + + # if it is PUT, POST, MERGE, DELETE, need to add content-length to header. + if request.method in ['PUT', 'POST', 'MERGE', 'DELETE']: + request.headers.append(('Content-Length', str(len(request.body)))) + + # append addtional headers base on the service + request.headers.append(('x-ms-version', X_MS_VERSION)) + + # append x-ms-meta name, values to header + for name, value in request.headers: + if 'x-ms-meta-name-values' in name and value: + for meta_name, meta_value in value.items(): + request.headers.append(('x-ms-meta-' + meta_name, meta_value)) + request.headers.remove((name, value)) + break + return request + + +def _update_storage_blob_header(request, account_name, account_key): + ''' add additional headers for storage blob request. ''' + + request = _update_storage_header(request) + current_time = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') + request.headers.append(('x-ms-date', current_time)) + request.headers.append( + ('Content-Type', 'application/octet-stream Charset=UTF-8')) + request.headers.append(('Authorization', + _sign_storage_blob_request(request, + account_name, + account_key))) + + return request.headers + + +def _update_storage_queue_header(request, account_name, account_key): + ''' add additional headers for storage queue request. ''' + return _update_storage_blob_header(request, account_name, account_key) + + +def _update_storage_table_header(request): + ''' add additional headers for storage table request. ''' + + request = _update_storage_header(request) + for name, _ in request.headers: + if name.lower() == 'content-type': + break + else: + request.headers.append(('Content-Type', 'application/atom+xml')) + request.headers.append(('DataServiceVersion', '2.0;NetFx')) + request.headers.append(('MaxDataServiceVersion', '2.0;NetFx')) + current_time = datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') + request.headers.append(('x-ms-date', current_time)) + request.headers.append(('Date', current_time)) + return request.headers + + +def _sign_storage_blob_request(request, account_name, account_key): + ''' + Returns the signed string for blob request which is used to set + Authorization header. This is also used to sign queue request. + ''' + + uri_path = request.path.split('?')[0] + + # method to sign + string_to_sign = request.method + '\n' + + # get headers to sign + headers_to_sign = [ + 'content-encoding', 'content-language', 'content-length', + 'content-md5', 'content-type', 'date', 'if-modified-since', + 'if-match', 'if-none-match', 'if-unmodified-since', 'range'] + + request_header_dict = dict((name.lower(), value) + for name, value in request.headers if value) + string_to_sign += '\n'.join(request_header_dict.get(x, '') + for x in headers_to_sign) + '\n' + + # get x-ms header to sign + x_ms_headers = [] + for name, value in request.headers: + if 'x-ms' in name: + x_ms_headers.append((name.lower(), value)) + x_ms_headers.sort() + for name, value in x_ms_headers: + if value: + string_to_sign += ''.join([name, ':', value, '\n']) + + # get account_name and uri path to sign + string_to_sign += '/' + account_name + uri_path + + # get query string to sign if it is not table service + query_to_sign = request.query + query_to_sign.sort() + + current_name = '' + for name, value in query_to_sign: + if value: + if current_name != name: + string_to_sign += '\n' + name + ':' + value + else: + string_to_sign += '\n' + ',' + value + + # sign the request + auth_string = 'SharedKey ' + account_name + ':' + \ + _sign_string(account_key, string_to_sign) + return auth_string + + +def _sign_storage_table_request(request, account_name, account_key): + uri_path = request.path.split('?')[0] + + string_to_sign = request.method + '\n' + headers_to_sign = ['content-md5', 'content-type', 'date'] + request_header_dict = dict((name.lower(), value) + for name, value in request.headers if value) + string_to_sign += '\n'.join(request_header_dict.get(x, '') + for x in headers_to_sign) + '\n' + + # get account_name and uri path to sign + string_to_sign += ''.join(['/', account_name, uri_path]) + + for name, value in request.query: + if name == 'comp' and uri_path == '/': + string_to_sign += '?comp=' + value + break + + # sign the request + auth_string = 'SharedKey ' + account_name + ':' + \ + _sign_string(account_key, string_to_sign) + return auth_string + + +def _to_python_bool(value): + if value.lower() == 'true': + return True + return False + + +def _to_entity_int(data): + int_max = (2 << 30) - 1 + if data > (int_max) or data < (int_max + 1) * (-1): + return 'Edm.Int64', str(data) + else: + return 'Edm.Int32', str(data) + + +def _to_entity_bool(value): + if value: + return 'Edm.Boolean', 'true' + return 'Edm.Boolean', 'false' + + +def _to_entity_datetime(value): + # Azure expects the date value passed in to be UTC. + # Azure will always return values as UTC. + # If a date is passed in without timezone info, it is assumed to be UTC. + if value.tzinfo: + value = value.astimezone(tzutc()) + return 'Edm.DateTime', value.strftime('%Y-%m-%dT%H:%M:%SZ') + + +def _to_entity_float(value): + return 'Edm.Double', str(value) + + +def _to_entity_property(value): + if value.type == 'Edm.Binary': + return value.type, _encode_base64(value.value) + + return value.type, str(value.value) + + +def _to_entity_none(value): + return None, None + + +def _to_entity_str(value): + return 'Edm.String', value + + +# Tables of conversions to and from entity types. We support specific +# datatypes, and beyond that the user can use an EntityProperty to get +# custom data type support. + +def _from_entity_binary(value): + return EntityProperty('Edm.Binary', _decode_base64_to_bytes(value)) + + +def _from_entity_int(value): + return int(value) + + +def _from_entity_datetime(value): + # Note that Azure always returns UTC datetime, and dateutil parser + # will set the tzinfo on the date it returns + return parser.parse(value) + +_ENTITY_TO_PYTHON_CONVERSIONS = { + 'Edm.Binary': _from_entity_binary, + 'Edm.Int32': _from_entity_int, + 'Edm.Int64': _from_entity_int, + 'Edm.Double': float, + 'Edm.Boolean': _to_python_bool, + 'Edm.DateTime': _from_entity_datetime, +} + +# Conversion from Python type to a function which returns a tuple of the +# type string and content string. +_PYTHON_TO_ENTITY_CONVERSIONS = { + int: _to_entity_int, + bool: _to_entity_bool, + datetime: _to_entity_datetime, + float: _to_entity_float, + EntityProperty: _to_entity_property, + str: _to_entity_str, +} + +if sys.version_info < (3,): + _PYTHON_TO_ENTITY_CONVERSIONS.update({ + long: _to_entity_int, + types.NoneType: _to_entity_none, + unicode: _to_entity_str, + }) + + +def _convert_entity_to_xml(source): + ''' Converts an entity object to xml to send. + + The entity format is: + <entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> + <title /> + <updated>2008-09-18T23:46:19.3857256Z</updated> + <author> + <name /> + </author> + <id /> + <content type="application/xml"> + <m:properties> + <d:Address>Mountain View</d:Address> + <d:Age m:type="Edm.Int32">23</d:Age> + <d:AmountDue m:type="Edm.Double">200.23</d:AmountDue> + <d:BinaryData m:type="Edm.Binary" m:null="true" /> + <d:CustomerCode m:type="Edm.Guid">c9da6455-213d-42c9-9a79-3e9149a57833</d:CustomerCode> + <d:CustomerSince m:type="Edm.DateTime">2008-07-10T00:00:00</d:CustomerSince> + <d:IsActive m:type="Edm.Boolean">true</d:IsActive> + <d:NumOfOrders m:type="Edm.Int64">255</d:NumOfOrders> + <d:PartitionKey>mypartitionkey</d:PartitionKey> + <d:RowKey>myrowkey1</d:RowKey> + <d:Timestamp m:type="Edm.DateTime">0001-01-01T00:00:00</d:Timestamp> + </m:properties> + </content> + </entry> + ''' + + # construct the entity body included in <m:properties> and </m:properties> + entity_body = '<m:properties xml:space="preserve">{properties}</m:properties>' + + if isinstance(source, WindowsAzureData): + source = vars(source) + + properties_str = '' + + # set properties type for types we know if value has no type info. + # if value has type info, then set the type to value.type + for name, value in source.items(): + mtype = '' + conv = _PYTHON_TO_ENTITY_CONVERSIONS.get(type(value)) + if conv is None and sys.version_info >= (3,) and value is None: + conv = _to_entity_none + if conv is None: + raise WindowsAzureError( + _ERROR_CANNOT_SERIALIZE_VALUE_TO_ENTITY.format( + type(value).__name__)) + + mtype, value = conv(value) + + # form the property node + properties_str += ''.join(['<d:', name]) + if value is None: + properties_str += ' m:null="true" />' + else: + if mtype: + properties_str += ''.join([' m:type="', mtype, '"']) + properties_str += ''.join(['>', + xml_escape(value), '</d:', name, '>']) + + if sys.version_info < (3,): + if isinstance(properties_str, unicode): + properties_str = properties_str.encode('utf-8') + + # generate the entity_body + entity_body = entity_body.format(properties=properties_str) + xmlstr = _create_entry(entity_body) + return xmlstr + + +def _convert_table_to_xml(table_name): + ''' + Create xml to send for a given table name. Since xml format for table is + the same as entity and the only difference is that table has only one + property 'TableName', so we just call _convert_entity_to_xml. + + table_name: the name of the table + ''' + return _convert_entity_to_xml({'TableName': table_name}) + + +def _convert_block_list_to_xml(block_id_list): + ''' + Convert a block list to xml to send. + + block_id_list: + a str list containing the block ids that are used in put_block_list. + Only get block from latest blocks. + ''' + if block_id_list is None: + return '' + xml = '<?xml version="1.0" encoding="utf-8"?><BlockList>' + for value in block_id_list: + xml += '<Latest>{0}</Latest>'.format(_encode_base64(value)) + + return xml + '</BlockList>' + + +def _create_blob_result(response): + blob_properties = _parse_response_for_dict(response) + return BlobResult(response.body, blob_properties) + + +def _convert_response_to_block_list(response): + ''' + Converts xml response to block list class. + ''' + blob_block_list = BlobBlockList() + + xmldoc = minidom.parseString(response.body) + for xml_block in _get_children_from_path(xmldoc, + 'BlockList', + 'CommittedBlocks', + 'Block'): + xml_block_id = _decode_base64_to_text( + _get_child_nodes(xml_block, 'Name')[0].firstChild.nodeValue) + xml_block_size = int( + _get_child_nodes(xml_block, 'Size')[0].firstChild.nodeValue) + blob_block_list.committed_blocks.append( + BlobBlock(xml_block_id, xml_block_size)) + + for xml_block in _get_children_from_path(xmldoc, + 'BlockList', + 'UncommittedBlocks', + 'Block'): + xml_block_id = _decode_base64_to_text( + _get_child_nodes(xml_block, 'Name')[0].firstChild.nodeValue) + xml_block_size = int( + _get_child_nodes(xml_block, 'Size')[0].firstChild.nodeValue) + blob_block_list.uncommitted_blocks.append( + BlobBlock(xml_block_id, xml_block_size)) + + return blob_block_list + + +def _remove_prefix(name): + colon = name.find(':') + if colon != -1: + return name[colon + 1:] + return name + + +def _convert_response_to_entity(response): + if response is None: + return response + return _convert_xml_to_entity(response.body) + + +def _convert_xml_to_entity(xmlstr): + ''' Convert xml response to entity. + + The format of entity: + <entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> + <title /> + <updated>2008-09-18T23:46:19.3857256Z</updated> + <author> + <name /> + </author> + <id /> + <content type="application/xml"> + <m:properties> + <d:Address>Mountain View</d:Address> + <d:Age m:type="Edm.Int32">23</d:Age> + <d:AmountDue m:type="Edm.Double">200.23</d:AmountDue> + <d:BinaryData m:type="Edm.Binary" m:null="true" /> + <d:CustomerCode m:type="Edm.Guid">c9da6455-213d-42c9-9a79-3e9149a57833</d:CustomerCode> + <d:CustomerSince m:type="Edm.DateTime">2008-07-10T00:00:00</d:CustomerSince> + <d:IsActive m:type="Edm.Boolean">true</d:IsActive> + <d:NumOfOrders m:type="Edm.Int64">255</d:NumOfOrders> + <d:PartitionKey>mypartitionkey</d:PartitionKey> + <d:RowKey>myrowkey1</d:RowKey> + <d:Timestamp m:type="Edm.DateTime">0001-01-01T00:00:00</d:Timestamp> + </m:properties> + </content> + </entry> + ''' + xmldoc = minidom.parseString(xmlstr) + + xml_properties = None + for entry in _get_child_nodes(xmldoc, 'entry'): + for content in _get_child_nodes(entry, 'content'): + # TODO: Namespace + xml_properties = _get_child_nodesNS( + content, METADATA_NS, 'properties') + + if not xml_properties: + return None + + entity = Entity() + # extract each property node and get the type from attribute and node value + for xml_property in xml_properties[0].childNodes: + name = _remove_prefix(xml_property.nodeName) + + if xml_property.firstChild: + value = xml_property.firstChild.nodeValue + else: + value = '' + + isnull = xml_property.getAttributeNS(METADATA_NS, 'null') + mtype = xml_property.getAttributeNS(METADATA_NS, 'type') + + # if not isnull and no type info, then it is a string and we just + # need the str type to hold the property. + if not isnull and not mtype: + _set_entity_attr(entity, name, value) + elif isnull == 'true': + if mtype: + property = EntityProperty(mtype, None) + else: + property = EntityProperty('Edm.String', None) + else: # need an object to hold the property + conv = _ENTITY_TO_PYTHON_CONVERSIONS.get(mtype) + if conv is not None: + property = conv(value) + else: + property = EntityProperty(mtype, value) + _set_entity_attr(entity, name, property) + + # extract id, updated and name value from feed entry and set them of + # rule. + for name, value in _get_entry_properties(xmlstr, True).items(): + if name in ['etag']: + _set_entity_attr(entity, name, value) + + return entity + + +def _set_entity_attr(entity, name, value): + try: + setattr(entity, name, value) + except UnicodeEncodeError: + # Python 2 doesn't support unicode attribute names, so we'll + # add them and access them directly through the dictionary + entity.__dict__[name] = value + + +def _convert_xml_to_table(xmlstr): + ''' Converts the xml response to table class. + Simply call convert_xml_to_entity and extract the table name, and add + updated and author info + ''' + table = Table() + entity = _convert_xml_to_entity(xmlstr) + setattr(table, 'name', entity.TableName) + for name, value in _get_entry_properties(xmlstr, False).items(): + setattr(table, name, value) + return table + + +def _storage_error_handler(http_error): + ''' Simple error handler for storage service. ''' + return _general_error_handler(http_error) + +# make these available just from storage. +from azure.storage.blobservice import BlobService +from azure.storage.queueservice import QueueService +from azure.storage.tableservice import TableService +from azure.storage.cloudstorageaccount import CloudStorageAccount +from azure.storage.sharedaccesssignature import ( + SharedAccessSignature, + SharedAccessPolicy, + Permission, + WebResource, + ) diff --git a/awx/lib/site-packages/azure/storage/blobservice.py b/awx/lib/site-packages/azure/storage/blobservice.py index aca56b4584..f6b060eccd 100644 --- a/awx/lib/site-packages/azure/storage/blobservice.py +++ b/awx/lib/site-packages/azure/storage/blobservice.py @@ -1,2225 +1,2178 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -from azure import ( - WindowsAzureError, - BLOB_SERVICE_HOST_BASE, - DEV_BLOB_HOST, - _ERROR_VALUE_NEGATIVE, - _ERROR_PAGE_BLOB_SIZE_ALIGNMENT, - _convert_class_to_xml, - _dont_fail_not_exist, - _dont_fail_on_exist, - _encode_base64, - _get_request_body, - _get_request_body_bytes_only, - _int_or_none, - _parse_enum_results_list, - _parse_response, - _parse_response_for_dict, - _parse_response_for_dict_filter, - _parse_response_for_dict_prefix, - _parse_simple_list, - _str, - _str_or_none, - _update_request_uri_query_local_storage, - _validate_type_bytes, - _validate_not_none, - ) -from azure.http import HTTPRequest -from azure.storage import ( - Container, - ContainerEnumResults, - PageList, - PageRange, - SignedIdentifiers, - StorageServiceProperties, - _convert_block_list_to_xml, - _convert_response_to_block_list, - _create_blob_result, - _parse_blob_enum_results_list, - _update_storage_blob_header, - ) -from azure.storage.storageclient import _StorageClient -from os import path -import sys -if sys.version_info >= (3,): - from io import BytesIO -else: - from cStringIO import StringIO as BytesIO - -# Keep this value sync with _ERROR_PAGE_BLOB_SIZE_ALIGNMENT -_PAGE_SIZE = 512 - -class BlobService(_StorageClient): - - ''' - This is the main class managing Blob resources. - ''' - - def __init__(self, account_name=None, account_key=None, protocol='https', - host_base=BLOB_SERVICE_HOST_BASE, dev_host=DEV_BLOB_HOST): - ''' - account_name: your storage account name, required for all operations. - account_key: your storage account key, required for all operations. - protocol: Optional. Protocol. Defaults to https. - host_base: - Optional. Live host base url. Defaults to Azure url. Override this - for on-premise. - dev_host: Optional. Dev host url. Defaults to localhost. - ''' - self._BLOB_MAX_DATA_SIZE = 64 * 1024 * 1024 - self._BLOB_MAX_CHUNK_DATA_SIZE = 4 * 1024 * 1024 - super(BlobService, self).__init__( - account_name, account_key, protocol, host_base, dev_host) - - def make_blob_url(self, container_name, blob_name, account_name=None, - protocol=None, host_base=None): - ''' - Creates the url to access a blob. - - container_name: Name of container. - blob_name: Name of blob. - account_name: - Name of the storage account. If not specified, uses the account - specified when BlobService was initialized. - protocol: - Protocol to use: 'http' or 'https'. If not specified, uses the - protocol specified when BlobService was initialized. - host_base: - Live host base url. If not specified, uses the host base specified - when BlobService was initialized. - ''' - if not account_name: - account_name = self.account_name - if not protocol: - protocol = self.protocol - if not host_base: - host_base = self.host_base - - return '{0}://{1}{2}/{3}/{4}'.format(protocol, - account_name, - host_base, - container_name, - blob_name) - - def list_containers(self, prefix=None, marker=None, maxresults=None, - include=None): - ''' - The List Containers operation returns a list of the containers under - the specified account. - - prefix: - Optional. Filters the results to return only containers whose names - begin with the specified prefix. - marker: - Optional. A string value that identifies the portion of the list to - be returned with the next list operation. - maxresults: - Optional. Specifies the maximum number of containers to return. - include: - Optional. Include this parameter to specify that the container's - metadata be returned as part of the response body. set this - parameter to string 'metadata' to get container's metadata. - ''' - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/?comp=list' - request.query = [ - ('prefix', _str_or_none(prefix)), - ('marker', _str_or_none(marker)), - ('maxresults', _int_or_none(maxresults)), - ('include', _str_or_none(include)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_enum_results_list(response, - ContainerEnumResults, - "Containers", - Container) - - def create_container(self, container_name, x_ms_meta_name_values=None, - x_ms_blob_public_access=None, fail_on_exist=False): - ''' - Creates a new container under the specified account. If the container - with the same name already exists, the operation fails. - - container_name: Name of container to create. - x_ms_meta_name_values: - Optional. A dict with name_value pairs to associate with the - container as metadata. Example:{'Category':'test'} - x_ms_blob_public_access: - Optional. Possible values include: container, blob - fail_on_exist: - specify whether to throw an exception when the container exists. - ''' - _validate_not_none('container_name', container_name) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '?restype=container' - request.headers = [ - ('x-ms-meta-name-values', x_ms_meta_name_values), - ('x-ms-blob-public-access', _str_or_none(x_ms_blob_public_access)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - if not fail_on_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_on_exist(ex) - return False - else: - self._perform_request(request) - return True - - def get_container_properties(self, container_name, x_ms_lease_id=None): - ''' - Returns all user-defined metadata and system properties for the - specified container. - - container_name: Name of existing container. - x_ms_lease_id: - If specified, get_container_properties only succeeds if the - container's lease is active and matches this ID. - ''' - _validate_not_none('container_name', container_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '?restype=container' - request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response_for_dict(response) - - def get_container_metadata(self, container_name, x_ms_lease_id=None): - ''' - Returns all user-defined metadata for the specified container. The - metadata will be in returned dictionary['x-ms-meta-(name)']. - - container_name: Name of existing container. - x_ms_lease_id: - If specified, get_container_metadata only succeeds if the - container's lease is active and matches this ID. - ''' - _validate_not_none('container_name', container_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '?restype=container&comp=metadata' - request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response_for_dict_prefix(response, prefixes=['x-ms-meta']) - - def set_container_metadata(self, container_name, - x_ms_meta_name_values=None, x_ms_lease_id=None): - ''' - Sets one or more user-defined name-value pairs for the specified - container. - - container_name: Name of existing container. - x_ms_meta_name_values: - A dict containing name, value for metadata. - Example: {'category':'test'} - x_ms_lease_id: - If specified, set_container_metadata only succeeds if the - container's lease is active and matches this ID. - ''' - _validate_not_none('container_name', container_name) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '?restype=container&comp=metadata' - request.headers = [ - ('x-ms-meta-name-values', x_ms_meta_name_values), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def get_container_acl(self, container_name, x_ms_lease_id=None): - ''' - Gets the permissions for the specified container. - - container_name: Name of existing container. - x_ms_lease_id: - If specified, get_container_acl only succeeds if the - container's lease is active and matches this ID. - ''' - _validate_not_none('container_name', container_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '?restype=container&comp=acl' - request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response(response, SignedIdentifiers) - - def set_container_acl(self, container_name, signed_identifiers=None, - x_ms_blob_public_access=None, x_ms_lease_id=None): - ''' - Sets the permissions for the specified container. - - container_name: Name of existing container. - signed_identifiers: SignedIdentifers instance - x_ms_blob_public_access: - Optional. Possible values include: container, blob - x_ms_lease_id: - If specified, set_container_acl only succeeds if the - container's lease is active and matches this ID. - ''' - _validate_not_none('container_name', container_name) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '?restype=container&comp=acl' - request.headers = [ - ('x-ms-blob-public-access', _str_or_none(x_ms_blob_public_access)), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ] - request.body = _get_request_body( - _convert_class_to_xml(signed_identifiers)) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def delete_container(self, container_name, fail_not_exist=False, - x_ms_lease_id=None): - ''' - Marks the specified container for deletion. - - container_name: Name of container to delete. - fail_not_exist: - Specify whether to throw an exception when the container doesn't - exist. - x_ms_lease_id: Required if the container has an active lease. - ''' - _validate_not_none('container_name', container_name) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '?restype=container' - request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - if not fail_not_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_not_exist(ex) - return False - else: - self._perform_request(request) - return True - - def lease_container(self, container_name, x_ms_lease_action, - x_ms_lease_id=None, x_ms_lease_duration=60, - x_ms_lease_break_period=None, - x_ms_proposed_lease_id=None): - ''' - Establishes and manages a lock on a container for delete operations. - The lock duration can be 15 to 60 seconds, or can be infinite. - - container_name: Name of existing container. - x_ms_lease_action: - Required. Possible values: acquire|renew|release|break|change - x_ms_lease_id: Required if the container has an active lease. - x_ms_lease_duration: - Specifies the duration of the lease, in seconds, or negative one - (-1) for a lease that never expires. A non-infinite lease can be - between 15 and 60 seconds. A lease duration cannot be changed - using renew or change. For backwards compatibility, the default is - 60, and the value is only used on an acquire operation. - x_ms_lease_break_period: - Optional. For a break operation, this is the proposed duration of - seconds that the lease should continue before it is broken, between - 0 and 60 seconds. This break period is only used if it is shorter - than the time remaining on the lease. If longer, the time remaining - on the lease is used. A new lease will not be available before the - break period has expired, but the lease may be held for longer than - the break period. If this header does not appear with a break - operation, a fixed-duration lease breaks after the remaining lease - period elapses, and an infinite lease breaks immediately. - x_ms_proposed_lease_id: - Optional for acquire, required for change. Proposed lease ID, in a - GUID string format. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('x_ms_lease_action', x_ms_lease_action) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '?restype=container&comp=lease' - request.headers = [ - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ('x-ms-lease-action', _str_or_none(x_ms_lease_action)), - ('x-ms-lease-duration', - _str_or_none( - x_ms_lease_duration if x_ms_lease_action == 'acquire'\ - else None)), - ('x-ms-lease-break-period', _str_or_none(x_ms_lease_break_period)), - ('x-ms-proposed-lease-id', _str_or_none(x_ms_proposed_lease_id)), - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response_for_dict_filter( - response, - filter=['x-ms-lease-id', 'x-ms-lease-time']) - - def list_blobs(self, container_name, prefix=None, marker=None, - maxresults=None, include=None, delimiter=None): - ''' - Returns the list of blobs under the specified container. - - container_name: Name of existing container. - prefix: - Optional. Filters the results to return only blobs whose names - begin with the specified prefix. - marker: - Optional. A string value that identifies the portion of the list - to be returned with the next list operation. The operation returns - a marker value within the response body if the list returned was - not complete. The marker value may then be used in a subsequent - call to request the next set of list items. The marker value is - opaque to the client. - maxresults: - Optional. Specifies the maximum number of blobs to return, - including all BlobPrefix elements. If the request does not specify - maxresults or specifies a value greater than 5,000, the server will - return up to 5,000 items. Setting maxresults to a value less than - or equal to zero results in error response code 400 (Bad Request). - include: - Optional. Specifies one or more datasets to include in the - response. To specify more than one of these options on the URI, - you must separate each option with a comma. Valid values are: - snapshots: - Specifies that snapshots should be included in the - enumeration. Snapshots are listed from oldest to newest in - the response. - metadata: - Specifies that blob metadata be returned in the response. - uncommittedblobs: - Specifies that blobs for which blocks have been uploaded, - but which have not been committed using Put Block List - (REST API), be included in the response. - copy: - Version 2012-02-12 and newer. Specifies that metadata - related to any current or previous Copy Blob operation - should be included in the response. - delimiter: - Optional. When the request includes this parameter, the operation - returns a BlobPrefix element in the response body that acts as a - placeholder for all blobs whose names begin with the same - substring up to the appearance of the delimiter character. The - delimiter may be a single character or a string. - ''' - _validate_not_none('container_name', container_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '?restype=container&comp=list' - request.query = [ - ('prefix', _str_or_none(prefix)), - ('delimiter', _str_or_none(delimiter)), - ('marker', _str_or_none(marker)), - ('maxresults', _int_or_none(maxresults)), - ('include', _str_or_none(include)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_blob_enum_results_list(response) - - def set_blob_service_properties(self, storage_service_properties, - timeout=None): - ''' - Sets the properties of a storage account's Blob service, including - Windows Azure Storage Analytics. You can also use this operation to - set the default request version for all incoming requests that do not - have a version specified. - - storage_service_properties: a StorageServiceProperties object. - timeout: Optional. The timeout parameter is expressed in seconds. - ''' - _validate_not_none('storage_service_properties', - storage_service_properties) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/?restype=service&comp=properties' - request.query = [('timeout', _int_or_none(timeout))] - request.body = _get_request_body( - _convert_class_to_xml(storage_service_properties)) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def get_blob_service_properties(self, timeout=None): - ''' - Gets the properties of a storage account's Blob service, including - Windows Azure Storage Analytics. - - timeout: Optional. The timeout parameter is expressed in seconds. - ''' - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/?restype=service&comp=properties' - request.query = [('timeout', _int_or_none(timeout))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response(response, StorageServiceProperties) - - def get_blob_properties(self, container_name, blob_name, - x_ms_lease_id=None): - ''' - Returns all user-defined metadata, standard HTTP properties, and - system properties for the blob. - - container_name: Name of existing container. - blob_name: Name of existing blob. - x_ms_lease_id: Required if the blob has an active lease. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - request = HTTPRequest() - request.method = 'HEAD' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' - request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response_for_dict(response) - - def set_blob_properties(self, container_name, blob_name, - x_ms_blob_cache_control=None, - x_ms_blob_content_type=None, - x_ms_blob_content_md5=None, - x_ms_blob_content_encoding=None, - x_ms_blob_content_language=None, - x_ms_lease_id=None): - ''' - Sets system properties on the blob. - - container_name: Name of existing container. - blob_name: Name of existing blob. - x_ms_blob_cache_control: - Optional. Modifies the cache control string for the blob. - x_ms_blob_content_type: Optional. Sets the blob's content type. - x_ms_blob_content_md5: Optional. Sets the blob's MD5 hash. - x_ms_blob_content_encoding: Optional. Sets the blob's content encoding. - x_ms_blob_content_language: Optional. Sets the blob's content language. - x_ms_lease_id: Required if the blob has an active lease. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '/' + _str(blob_name) + '?comp=properties' - request.headers = [ - ('x-ms-blob-cache-control', _str_or_none(x_ms_blob_cache_control)), - ('x-ms-blob-content-type', _str_or_none(x_ms_blob_content_type)), - ('x-ms-blob-content-md5', _str_or_none(x_ms_blob_content_md5)), - ('x-ms-blob-content-encoding', - _str_or_none(x_ms_blob_content_encoding)), - ('x-ms-blob-content-language', - _str_or_none(x_ms_blob_content_language)), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def put_blob(self, container_name, blob_name, blob, x_ms_blob_type, - content_encoding=None, content_language=None, - content_md5=None, cache_control=None, - x_ms_blob_content_type=None, x_ms_blob_content_encoding=None, - x_ms_blob_content_language=None, x_ms_blob_content_md5=None, - x_ms_blob_cache_control=None, x_ms_meta_name_values=None, - x_ms_lease_id=None, x_ms_blob_content_length=None, - x_ms_blob_sequence_number=None): - ''' - Creates a new block blob or page blob, or updates the content of an - existing block blob. - - See put_block_blob_from_* and put_page_blob_from_* for high level - functions that handle the creation and upload of large blobs with - automatic chunking and progress notifications. - - container_name: Name of existing container. - blob_name: Name of blob to create or update. - blob: - For BlockBlob: - Content of blob as bytes (size < 64MB). For larger size, you - must call put_block and put_block_list to set content of blob. - For PageBlob: - Use None and call put_page to set content of blob. - x_ms_blob_type: Required. Could be BlockBlob or PageBlob. - content_encoding: - Optional. Specifies which content encodings have been applied to - the blob. This value is returned to the client when the Get Blob - (REST API) operation is performed on the blob resource. The client - can use this value when returned to decode the blob content. - content_language: - Optional. Specifies the natural languages used by this resource. - content_md5: - Optional. An MD5 hash of the blob content. This hash is used to - verify the integrity of the blob during transport. When this header - is specified, the storage service checks the hash that has arrived - with the one that was sent. If the two hashes do not match, the - operation will fail with error code 400 (Bad Request). - cache_control: - Optional. The Blob service stores this value but does not use or - modify it. - x_ms_blob_content_type: Optional. Set the blob's content type. - x_ms_blob_content_encoding: Optional. Set the blob's content encoding. - x_ms_blob_content_language: Optional. Set the blob's content language. - x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. - x_ms_blob_cache_control: Optional. Sets the blob's cache control. - x_ms_meta_name_values: A dict containing name, value for metadata. - x_ms_lease_id: Required if the blob has an active lease. - x_ms_blob_content_length: - Required for page blobs. This header specifies the maximum size - for the page blob, up to 1 TB. The page blob size must be aligned - to a 512-byte boundary. - x_ms_blob_sequence_number: - Optional. Set for page blobs only. The sequence number is a - user-controlled value that you can use to track requests. The - value of the sequence number must be between 0 and 2^63 - 1. The - default value is 0. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('x_ms_blob_type', x_ms_blob_type) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' - request.headers = [ - ('x-ms-blob-type', _str_or_none(x_ms_blob_type)), - ('Content-Encoding', _str_or_none(content_encoding)), - ('Content-Language', _str_or_none(content_language)), - ('Content-MD5', _str_or_none(content_md5)), - ('Cache-Control', _str_or_none(cache_control)), - ('x-ms-blob-content-type', _str_or_none(x_ms_blob_content_type)), - ('x-ms-blob-content-encoding', - _str_or_none(x_ms_blob_content_encoding)), - ('x-ms-blob-content-language', - _str_or_none(x_ms_blob_content_language)), - ('x-ms-blob-content-md5', _str_or_none(x_ms_blob_content_md5)), - ('x-ms-blob-cache-control', _str_or_none(x_ms_blob_cache_control)), - ('x-ms-meta-name-values', x_ms_meta_name_values), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ('x-ms-blob-content-length', - _str_or_none(x_ms_blob_content_length)), - ('x-ms-blob-sequence-number', - _str_or_none(x_ms_blob_sequence_number)) - ] - request.body = _get_request_body_bytes_only('blob', blob) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def put_block_blob_from_path(self, container_name, blob_name, file_path, - content_encoding=None, content_language=None, - content_md5=None, cache_control=None, - x_ms_blob_content_type=None, - x_ms_blob_content_encoding=None, - x_ms_blob_content_language=None, - x_ms_blob_content_md5=None, - x_ms_blob_cache_control=None, - x_ms_meta_name_values=None, - x_ms_lease_id=None, progress_callback=None): - ''' - Creates a new block blob from a file path, or updates the content of an - existing block blob, with automatic chunking and progress notifications. - - container_name: Name of existing container. - blob_name: Name of blob to create or update. - file_path: Path of the file to upload as the blob content. - content_encoding: - Optional. Specifies which content encodings have been applied to - the blob. This value is returned to the client when the Get Blob - (REST API) operation is performed on the blob resource. The client - can use this value when returned to decode the blob content. - content_language: - Optional. Specifies the natural languages used by this resource. - content_md5: - Optional. An MD5 hash of the blob content. This hash is used to - verify the integrity of the blob during transport. When this header - is specified, the storage service checks the hash that has arrived - with the one that was sent. If the two hashes do not match, the - operation will fail with error code 400 (Bad Request). - cache_control: - Optional. The Blob service stores this value but does not use or - modify it. - x_ms_blob_content_type: Optional. Set the blob's content type. - x_ms_blob_content_encoding: Optional. Set the blob's content encoding. - x_ms_blob_content_language: Optional. Set the blob's content language. - x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. - x_ms_blob_cache_control: Optional. Sets the blob's cache control. - x_ms_meta_name_values: A dict containing name, value for metadata. - x_ms_lease_id: Required if the blob has an active lease. - progress_callback: - Callback for progress with signature function(current, total) where - current is the number of bytes transfered so far, and total is the - size of the blob, or None if the total size is unknown. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('file_path', file_path) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' - request.headers = [ - ('x-ms-blob-type', 'BlockBlob'), - ('Content-Encoding', _str_or_none(content_encoding)), - ('Content-Language', _str_or_none(content_language)), - ('Content-MD5', _str_or_none(content_md5)), - ('Cache-Control', _str_or_none(cache_control)), - ('x-ms-blob-content-type', _str_or_none(x_ms_blob_content_type)), - ('x-ms-blob-content-encoding', - _str_or_none(x_ms_blob_content_encoding)), - ('x-ms-blob-content-language', - _str_or_none(x_ms_blob_content_language)), - ('x-ms-blob-content-md5', _str_or_none(x_ms_blob_content_md5)), - ('x-ms-blob-cache-control', _str_or_none(x_ms_blob_cache_control)), - ('x-ms-meta-name-values', x_ms_meta_name_values), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ] - - count = path.getsize(file_path) - with open(file_path, 'rb') as stream: - self.put_block_blob_from_file(container_name, - blob_name, - stream, - count, - content_encoding, - content_language, - content_md5, - cache_control, - x_ms_blob_content_type, - x_ms_blob_content_encoding, - x_ms_blob_content_language, - x_ms_blob_content_md5, - x_ms_blob_cache_control, - x_ms_meta_name_values, - x_ms_lease_id, - progress_callback) - - def put_block_blob_from_file(self, container_name, blob_name, stream, - count=None, content_encoding=None, - content_language=None, content_md5=None, - cache_control=None, - x_ms_blob_content_type=None, - x_ms_blob_content_encoding=None, - x_ms_blob_content_language=None, - x_ms_blob_content_md5=None, - x_ms_blob_cache_control=None, - x_ms_meta_name_values=None, - x_ms_lease_id=None, progress_callback=None): - ''' - Creates a new block blob from a file/stream, or updates the content of - an existing block blob, with automatic chunking and progress - notifications. - - container_name: Name of existing container. - blob_name: Name of blob to create or update. - stream: Opened file/stream to upload as the blob content. - count: - Number of bytes to read from the stream. This is optional, but - should be supplied for optimal performance. - content_encoding: - Optional. Specifies which content encodings have been applied to - the blob. This value is returned to the client when the Get Blob - (REST API) operation is performed on the blob resource. The client - can use this value when returned to decode the blob content. - content_language: - Optional. Specifies the natural languages used by this resource. - content_md5: - Optional. An MD5 hash of the blob content. This hash is used to - verify the integrity of the blob during transport. When this header - is specified, the storage service checks the hash that has arrived - with the one that was sent. If the two hashes do not match, the - operation will fail with error code 400 (Bad Request). - cache_control: - Optional. The Blob service stores this value but does not use or - modify it. - x_ms_blob_content_type: Optional. Set the blob's content type. - x_ms_blob_content_encoding: Optional. Set the blob's content encoding. - x_ms_blob_content_language: Optional. Set the blob's content language. - x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. - x_ms_blob_cache_control: Optional. Sets the blob's cache control. - x_ms_meta_name_values: A dict containing name, value for metadata. - x_ms_lease_id: Required if the blob has an active lease. - progress_callback: - Callback for progress with signature function(current, total) where - current is the number of bytes transfered so far, and total is the - size of the blob, or None if the total size is unknown. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('stream', stream) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' - request.headers = [ - ('x-ms-blob-type', 'BlockBlob'), - ('Content-Encoding', _str_or_none(content_encoding)), - ('Content-Language', _str_or_none(content_language)), - ('Content-MD5', _str_or_none(content_md5)), - ('Cache-Control', _str_or_none(cache_control)), - ('x-ms-blob-content-type', _str_or_none(x_ms_blob_content_type)), - ('x-ms-blob-content-encoding', - _str_or_none(x_ms_blob_content_encoding)), - ('x-ms-blob-content-language', - _str_or_none(x_ms_blob_content_language)), - ('x-ms-blob-content-md5', _str_or_none(x_ms_blob_content_md5)), - ('x-ms-blob-cache-control', _str_or_none(x_ms_blob_cache_control)), - ('x-ms-meta-name-values', x_ms_meta_name_values), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ] - - if count and count < self._BLOB_MAX_DATA_SIZE: - if progress_callback: - progress_callback(0, count) - - data = stream.read(count) - self.put_blob(container_name, - blob_name, - data, - 'BlockBlob', - content_encoding, - content_language, - content_md5, - cache_control, - x_ms_blob_content_type, - x_ms_blob_content_encoding, - x_ms_blob_content_language, - x_ms_blob_content_md5, - x_ms_blob_cache_control, - x_ms_meta_name_values, - x_ms_lease_id) - - if progress_callback: - progress_callback(count, count) - else: - if progress_callback: - progress_callback(0, count) - - self.put_blob(container_name, - blob_name, - None, - 'BlockBlob', - content_encoding, - content_language, - content_md5, - cache_control, - x_ms_blob_content_type, - x_ms_blob_content_encoding, - x_ms_blob_content_language, - x_ms_blob_content_md5, - x_ms_blob_cache_control, - x_ms_meta_name_values, - x_ms_lease_id) - - remain_bytes = count - block_ids = [] - block_index = 0 - index = 0 - while True: - request_count = self._BLOB_MAX_CHUNK_DATA_SIZE\ - if remain_bytes is None else min( - remain_bytes, - self._BLOB_MAX_CHUNK_DATA_SIZE) - data = stream.read(request_count) - if data: - length = len(data) - index += length - remain_bytes = remain_bytes - \ - length if remain_bytes else None - block_id = '{0:08d}'.format(block_index) - self.put_block(container_name, blob_name, - data, block_id, x_ms_lease_id=x_ms_lease_id) - block_ids.append(block_id) - block_index += 1 - if progress_callback: - progress_callback(index, count) - else: - break - - self.put_block_list(container_name, blob_name, block_ids) - - def put_block_blob_from_bytes(self, container_name, blob_name, blob, - index=0, count=None, content_encoding=None, - content_language=None, content_md5=None, - cache_control=None, - x_ms_blob_content_type=None, - x_ms_blob_content_encoding=None, - x_ms_blob_content_language=None, - x_ms_blob_content_md5=None, - x_ms_blob_cache_control=None, - x_ms_meta_name_values=None, - x_ms_lease_id=None, progress_callback=None): - ''' - Creates a new block blob from an array of bytes, or updates the content - of an existing block blob, with automatic chunking and progress - notifications. - - container_name: Name of existing container. - blob_name: Name of blob to create or update. - blob: Content of blob as an array of bytes. - index: Start index in the array of bytes. - count: - Number of bytes to upload. Set to None or negative value to upload - all bytes starting from index. - content_encoding: - Optional. Specifies which content encodings have been applied to - the blob. This value is returned to the client when the Get Blob - (REST API) operation is performed on the blob resource. The client - can use this value when returned to decode the blob content. - content_language: - Optional. Specifies the natural languages used by this resource. - content_md5: - Optional. An MD5 hash of the blob content. This hash is used to - verify the integrity of the blob during transport. When this header - is specified, the storage service checks the hash that has arrived - with the one that was sent. If the two hashes do not match, the - operation will fail with error code 400 (Bad Request). - cache_control: - Optional. The Blob service stores this value but does not use or - modify it. - x_ms_blob_content_type: Optional. Set the blob's content type. - x_ms_blob_content_encoding: Optional. Set the blob's content encoding. - x_ms_blob_content_language: Optional. Set the blob's content language. - x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. - x_ms_blob_cache_control: Optional. Sets the blob's cache control. - x_ms_meta_name_values: A dict containing name, value for metadata. - x_ms_lease_id: Required if the blob has an active lease. - progress_callback: - Callback for progress with signature function(current, total) where - current is the number of bytes transfered so far, and total is the - size of the blob, or None if the total size is unknown. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('blob', blob) - _validate_not_none('index', index) - _validate_type_bytes('blob', blob) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' - request.headers = [ - ('x-ms-blob-type', 'BlockBlob'), - ('Content-Encoding', _str_or_none(content_encoding)), - ('Content-Language', _str_or_none(content_language)), - ('Content-MD5', _str_or_none(content_md5)), - ('Cache-Control', _str_or_none(cache_control)), - ('x-ms-blob-content-type', _str_or_none(x_ms_blob_content_type)), - ('x-ms-blob-content-encoding', - _str_or_none(x_ms_blob_content_encoding)), - ('x-ms-blob-content-language', - _str_or_none(x_ms_blob_content_language)), - ('x-ms-blob-content-md5', _str_or_none(x_ms_blob_content_md5)), - ('x-ms-blob-cache-control', _str_or_none(x_ms_blob_cache_control)), - ('x-ms-meta-name-values', x_ms_meta_name_values), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ] - - if index < 0: - raise TypeError(_ERROR_VALUE_NEGATIVE.format('index')) - - if count is None or count < 0: - count = len(blob) - index - - if count < self._BLOB_MAX_DATA_SIZE: - if progress_callback: - progress_callback(0, count) - - data = blob[index: index + count] - self.put_blob(container_name, - blob_name, - data, - 'BlockBlob', - content_encoding, - content_language, - content_md5, - cache_control, - x_ms_blob_content_type, - x_ms_blob_content_encoding, - x_ms_blob_content_language, - x_ms_blob_content_md5, - x_ms_blob_cache_control, - x_ms_meta_name_values, - x_ms_lease_id) - - if progress_callback: - progress_callback(count, count) - else: - stream = BytesIO(blob) - stream.seek(index) - - self.put_block_blob_from_file(container_name, - blob_name, - stream, - count, - content_encoding, - content_language, - content_md5, - cache_control, - x_ms_blob_content_type, - x_ms_blob_content_encoding, - x_ms_blob_content_language, - x_ms_blob_content_md5, - x_ms_blob_cache_control, - x_ms_meta_name_values, - x_ms_lease_id, - progress_callback) - - def put_block_blob_from_text(self, container_name, blob_name, text, - text_encoding='utf-8', - content_encoding=None, content_language=None, - content_md5=None, cache_control=None, - x_ms_blob_content_type=None, - x_ms_blob_content_encoding=None, - x_ms_blob_content_language=None, - x_ms_blob_content_md5=None, - x_ms_blob_cache_control=None, - x_ms_meta_name_values=None, - x_ms_lease_id=None, progress_callback=None): - ''' - Creates a new block blob from str/unicode, or updates the content of an - existing block blob, with automatic chunking and progress notifications. - - container_name: Name of existing container. - blob_name: Name of blob to create or update. - text: Text to upload to the blob. - text_encoding: Encoding to use to convert the text to bytes. - content_encoding: - Optional. Specifies which content encodings have been applied to - the blob. This value is returned to the client when the Get Blob - (REST API) operation is performed on the blob resource. The client - can use this value when returned to decode the blob content. - content_language: - Optional. Specifies the natural languages used by this resource. - content_md5: - Optional. An MD5 hash of the blob content. This hash is used to - verify the integrity of the blob during transport. When this header - is specified, the storage service checks the hash that has arrived - with the one that was sent. If the two hashes do not match, the - operation will fail with error code 400 (Bad Request). - cache_control: - Optional. The Blob service stores this value but does not use or - modify it. - x_ms_blob_content_type: Optional. Set the blob's content type. - x_ms_blob_content_encoding: Optional. Set the blob's content encoding. - x_ms_blob_content_language: Optional. Set the blob's content language. - x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. - x_ms_blob_cache_control: Optional. Sets the blob's cache control. - x_ms_meta_name_values: A dict containing name, value for metadata. - x_ms_lease_id: Required if the blob has an active lease. - progress_callback: - Callback for progress with signature function(current, total) where - current is the number of bytes transfered so far, and total is the - size of the blob, or None if the total size is unknown. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('text', text) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' - request.headers = [ - ('x-ms-blob-type', 'BlockBlob'), - ('Content-Encoding', _str_or_none(content_encoding)), - ('Content-Language', _str_or_none(content_language)), - ('Content-MD5', _str_or_none(content_md5)), - ('Cache-Control', _str_or_none(cache_control)), - ('x-ms-blob-content-type', _str_or_none(x_ms_blob_content_type)), - ('x-ms-blob-content-encoding', - _str_or_none(x_ms_blob_content_encoding)), - ('x-ms-blob-content-language', - _str_or_none(x_ms_blob_content_language)), - ('x-ms-blob-content-md5', _str_or_none(x_ms_blob_content_md5)), - ('x-ms-blob-cache-control', _str_or_none(x_ms_blob_cache_control)), - ('x-ms-meta-name-values', x_ms_meta_name_values), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ] - - if not isinstance(text, bytes): - _validate_not_none('text_encoding', text_encoding) - text = text.encode(text_encoding) - - self.put_block_blob_from_bytes(container_name, - blob_name, - text, - 0, - len(text), - content_encoding, - content_language, - content_md5, - cache_control, - x_ms_blob_content_type, - x_ms_blob_content_encoding, - x_ms_blob_content_language, - x_ms_blob_content_md5, - x_ms_blob_cache_control, - x_ms_meta_name_values, - x_ms_lease_id, - progress_callback) - - def put_page_blob_from_path(self, container_name, blob_name, file_path, - content_encoding=None, content_language=None, - content_md5=None, cache_control=None, - x_ms_blob_content_type=None, - x_ms_blob_content_encoding=None, - x_ms_blob_content_language=None, - x_ms_blob_content_md5=None, - x_ms_blob_cache_control=None, - x_ms_meta_name_values=None, - x_ms_lease_id=None, - x_ms_blob_sequence_number=None, - progress_callback=None): - ''' - Creates a new page blob from a file path, or updates the content of an - existing page blob, with automatic chunking and progress notifications. - - container_name: Name of existing container. - blob_name: Name of blob to create or update. - file_path: Path of the file to upload as the blob content. - content_encoding: - Optional. Specifies which content encodings have been applied to - the blob. This value is returned to the client when the Get Blob - (REST API) operation is performed on the blob resource. The client - can use this value when returned to decode the blob content. - content_language: - Optional. Specifies the natural languages used by this resource. - content_md5: - Optional. An MD5 hash of the blob content. This hash is used to - verify the integrity of the blob during transport. When this header - is specified, the storage service checks the hash that has arrived - with the one that was sent. If the two hashes do not match, the - operation will fail with error code 400 (Bad Request). - cache_control: - Optional. The Blob service stores this value but does not use or - modify it. - x_ms_blob_content_type: Optional. Set the blob's content type. - x_ms_blob_content_encoding: Optional. Set the blob's content encoding. - x_ms_blob_content_language: Optional. Set the blob's content language. - x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. - x_ms_blob_cache_control: Optional. Sets the blob's cache control. - x_ms_meta_name_values: A dict containing name, value for metadata. - x_ms_lease_id: Required if the blob has an active lease. - x_ms_blob_sequence_number: - Optional. Set for page blobs only. The sequence number is a - user-controlled value that you can use to track requests. The - value of the sequence number must be between 0 and 2^63 - 1. The - default value is 0. - progress_callback: - Callback for progress with signature function(current, total) where - current is the number of bytes transfered so far, and total is the - size of the blob, or None if the total size is unknown. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('file_path', file_path) - - count = path.getsize(file_path) - with open(file_path, 'rb') as stream: - self.put_page_blob_from_file(container_name, - blob_name, - stream, - count, - content_encoding, - content_language, - content_md5, - cache_control, - x_ms_blob_content_type, - x_ms_blob_content_encoding, - x_ms_blob_content_language, - x_ms_blob_content_md5, - x_ms_blob_cache_control, - x_ms_meta_name_values, - x_ms_lease_id, - x_ms_blob_sequence_number, - progress_callback) - - def put_page_blob_from_file(self, container_name, blob_name, stream, count, - content_encoding=None, content_language=None, - content_md5=None, cache_control=None, - x_ms_blob_content_type=None, - x_ms_blob_content_encoding=None, - x_ms_blob_content_language=None, - x_ms_blob_content_md5=None, - x_ms_blob_cache_control=None, - x_ms_meta_name_values=None, - x_ms_lease_id=None, - x_ms_blob_sequence_number=None, - progress_callback=None): - ''' - Creates a new page blob from a file/stream, or updates the content of an - existing page blob, with automatic chunking and progress notifications. - - container_name: Name of existing container. - blob_name: Name of blob to create or update. - stream: Opened file/stream to upload as the blob content. - count: - Number of bytes to read from the stream. This is required, a page - blob cannot be created if the count is unknown. - content_encoding: - Optional. Specifies which content encodings have been applied to - the blob. This value is returned to the client when the Get Blob - (REST API) operation is performed on the blob resource. The client - can use this value when returned to decode the blob content. - content_language: - Optional. Specifies the natural languages used by this resource. - content_md5: - Optional. An MD5 hash of the blob content. This hash is used to - verify the integrity of the blob during transport. When this header - is specified, the storage service checks the hash that has arrived - with the one that was sent. If the two hashes do not match, the - operation will fail with error code 400 (Bad Request). - cache_control: - Optional. The Blob service stores this value but does not use or - modify it. - x_ms_blob_content_type: Optional. Set the blob's content type. - x_ms_blob_content_encoding: Optional. Set the blob's content encoding. - x_ms_blob_content_language: Optional. Set the blob's content language. - x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. - x_ms_blob_cache_control: Optional. Sets the blob's cache control. - x_ms_meta_name_values: A dict containing name, value for metadata. - x_ms_lease_id: Required if the blob has an active lease. - x_ms_blob_sequence_number: - Optional. Set for page blobs only. The sequence number is a - user-controlled value that you can use to track requests. The - value of the sequence number must be between 0 and 2^63 - 1. The - default value is 0. - progress_callback: - Callback for progress with signature function(current, total) where - current is the number of bytes transfered so far, and total is the - size of the blob, or None if the total size is unknown. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('stream', stream) - _validate_not_none('count', count) - - if count < 0: - raise TypeError(_ERROR_VALUE_NEGATIVE.format('count')) - - if count % _PAGE_SIZE != 0: - raise TypeError(_ERROR_PAGE_BLOB_SIZE_ALIGNMENT.format(count)) - - if progress_callback: - progress_callback(0, count) - - self.put_blob(container_name, - blob_name, - b'', - 'PageBlob', - content_encoding, - content_language, - content_md5, - cache_control, - x_ms_blob_content_type, - x_ms_blob_content_encoding, - x_ms_blob_content_language, - x_ms_blob_content_md5, - x_ms_blob_cache_control, - x_ms_meta_name_values, - x_ms_lease_id, - count, - x_ms_blob_sequence_number) - - remain_bytes = count - page_start = 0 - while True: - request_count = min(remain_bytes, self._BLOB_MAX_CHUNK_DATA_SIZE) - data = stream.read(request_count) - if data: - length = len(data) - remain_bytes = remain_bytes - length - page_end = page_start + length - 1 - self.put_page(container_name, - blob_name, - data, - 'bytes={0}-{1}'.format(page_start, page_end), - 'update', - x_ms_lease_id=x_ms_lease_id) - page_start = page_start + length - - if progress_callback: - progress_callback(page_start, count) - else: - break - - def put_page_blob_from_bytes(self, container_name, blob_name, blob, - index=0, count=None, content_encoding=None, - content_language=None, content_md5=None, - cache_control=None, - x_ms_blob_content_type=None, - x_ms_blob_content_encoding=None, - x_ms_blob_content_language=None, - x_ms_blob_content_md5=None, - x_ms_blob_cache_control=None, - x_ms_meta_name_values=None, - x_ms_lease_id=None, - x_ms_blob_sequence_number=None, - progress_callback=None): - ''' - Creates a new page blob from an array of bytes, or updates the content - of an existing page blob, with automatic chunking and progress - notifications. - - container_name: Name of existing container. - blob_name: Name of blob to create or update. - blob: Content of blob as an array of bytes. - index: Start index in the array of bytes. - count: - Number of bytes to upload. Set to None or negative value to upload - all bytes starting from index. - content_encoding: - Optional. Specifies which content encodings have been applied to - the blob. This value is returned to the client when the Get Blob - (REST API) operation is performed on the blob resource. The client - can use this value when returned to decode the blob content. - content_language: - Optional. Specifies the natural languages used by this resource. - content_md5: - Optional. An MD5 hash of the blob content. This hash is used to - verify the integrity of the blob during transport. When this header - is specified, the storage service checks the hash that has arrived - with the one that was sent. If the two hashes do not match, the - operation will fail with error code 400 (Bad Request). - cache_control: - Optional. The Blob service stores this value but does not use or - modify it. - x_ms_blob_content_type: Optional. Set the blob's content type. - x_ms_blob_content_encoding: Optional. Set the blob's content encoding. - x_ms_blob_content_language: Optional. Set the blob's content language. - x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. - x_ms_blob_cache_control: Optional. Sets the blob's cache control. - x_ms_meta_name_values: A dict containing name, value for metadata. - x_ms_lease_id: Required if the blob has an active lease. - x_ms_blob_sequence_number: - Optional. Set for page blobs only. The sequence number is a - user-controlled value that you can use to track requests. The - value of the sequence number must be between 0 and 2^63 - 1. The - default value is 0. - progress_callback: - Callback for progress with signature function(current, total) where - current is the number of bytes transfered so far, and total is the - size of the blob, or None if the total size is unknown. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('blob', blob) - _validate_type_bytes('blob', blob) - - if index < 0: - raise TypeError(_ERROR_VALUE_NEGATIVE.format('index')) - - if count is None or count < 0: - count = len(blob) - index - - stream = BytesIO(blob) - stream.seek(index) - - self.put_page_blob_from_file(container_name, - blob_name, - stream, - count, - content_encoding, - content_language, - content_md5, - cache_control, - x_ms_blob_content_type, - x_ms_blob_content_encoding, - x_ms_blob_content_language, - x_ms_blob_content_md5, - x_ms_blob_cache_control, - x_ms_meta_name_values, - x_ms_lease_id, - x_ms_blob_sequence_number, - progress_callback) - - def get_blob(self, container_name, blob_name, snapshot=None, - x_ms_range=None, x_ms_lease_id=None, - x_ms_range_get_content_md5=None): - ''' - Reads or downloads a blob from the system, including its metadata and - properties. - - See get_blob_to_* for high level functions that handle the download - of large blobs with automatic chunking and progress notifications. - - container_name: Name of existing container. - blob_name: Name of existing blob. - snapshot: - Optional. The snapshot parameter is an opaque DateTime value that, - when present, specifies the blob snapshot to retrieve. - x_ms_range: - Optional. Return only the bytes of the blob in the specified range. - x_ms_lease_id: Required if the blob has an active lease. - x_ms_range_get_content_md5: - Optional. When this header is set to true and specified together - with the Range header, the service returns the MD5 hash for the - range, as long as the range is less than or equal to 4 MB in size. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' - request.headers = [ - ('x-ms-range', _str_or_none(x_ms_range)), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ('x-ms-range-get-content-md5', - _str_or_none(x_ms_range_get_content_md5)) - ] - request.query = [('snapshot', _str_or_none(snapshot))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request, None) - - return _create_blob_result(response) - - def get_blob_to_path(self, container_name, blob_name, file_path, - open_mode='wb', snapshot=None, x_ms_lease_id=None, - progress_callback=None): - ''' - Downloads a blob to a file path, with automatic chunking and progress - notifications. - - container_name: Name of existing container. - blob_name: Name of existing blob. - file_path: Path of file to write to. - open_mode: Mode to use when opening the file. - snapshot: - Optional. The snapshot parameter is an opaque DateTime value that, - when present, specifies the blob snapshot to retrieve. - x_ms_lease_id: Required if the blob has an active lease. - progress_callback: - Callback for progress with signature function(current, total) where - current is the number of bytes transfered so far, and total is the - size of the blob. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('file_path', file_path) - _validate_not_none('open_mode', open_mode) - - with open(file_path, open_mode) as stream: - self.get_blob_to_file(container_name, - blob_name, - stream, - snapshot, - x_ms_lease_id, - progress_callback) - - def get_blob_to_file(self, container_name, blob_name, stream, - snapshot=None, x_ms_lease_id=None, - progress_callback=None): - ''' - Downloads a blob to a file/stream, with automatic chunking and progress - notifications. - - container_name: Name of existing container. - blob_name: Name of existing blob. - stream: Opened file/stream to write to. - snapshot: - Optional. The snapshot parameter is an opaque DateTime value that, - when present, specifies the blob snapshot to retrieve. - x_ms_lease_id: Required if the blob has an active lease. - progress_callback: - Callback for progress with signature function(current, total) where - current is the number of bytes transfered so far, and total is the - size of the blob. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('stream', stream) - - props = self.get_blob_properties(container_name, blob_name) - blob_size = int(props['content-length']) - - if blob_size < self._BLOB_MAX_DATA_SIZE: - if progress_callback: - progress_callback(0, blob_size) - - data = self.get_blob(container_name, - blob_name, - snapshot, - x_ms_lease_id=x_ms_lease_id) - - stream.write(data) - - if progress_callback: - progress_callback(blob_size, blob_size) - else: - if progress_callback: - progress_callback(0, blob_size) - - index = 0 - while index < blob_size: - chunk_range = 'bytes={}-{}'.format( - index, - index + self._BLOB_MAX_CHUNK_DATA_SIZE - 1) - data = self.get_blob( - container_name, blob_name, x_ms_range=chunk_range) - length = len(data) - index += length - if length > 0: - stream.write(data) - if progress_callback: - progress_callback(index, blob_size) - if length < self._BLOB_MAX_CHUNK_DATA_SIZE: - break - else: - break - - def get_blob_to_bytes(self, container_name, blob_name, snapshot=None, - x_ms_lease_id=None, progress_callback=None): - ''' - Downloads a blob as an array of bytes, with automatic chunking and - progress notifications. - - container_name: Name of existing container. - blob_name: Name of existing blob. - snapshot: - Optional. The snapshot parameter is an opaque DateTime value that, - when present, specifies the blob snapshot to retrieve. - x_ms_lease_id: Required if the blob has an active lease. - progress_callback: - Callback for progress with signature function(current, total) where - current is the number of bytes transfered so far, and total is the - size of the blob. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - - stream = BytesIO() - self.get_blob_to_file(container_name, - blob_name, - stream, - snapshot, - x_ms_lease_id, - progress_callback) - - return stream.getvalue() - - def get_blob_to_text(self, container_name, blob_name, text_encoding='utf-8', - snapshot=None, x_ms_lease_id=None, - progress_callback=None): - ''' - Downloads a blob as unicode text, with automatic chunking and progress - notifications. - - container_name: Name of existing container. - blob_name: Name of existing blob. - text_encoding: Encoding to use when decoding the blob data. - snapshot: - Optional. The snapshot parameter is an opaque DateTime value that, - when present, specifies the blob snapshot to retrieve. - x_ms_lease_id: Required if the blob has an active lease. - progress_callback: - Callback for progress with signature function(current, total) where - current is the number of bytes transfered so far, and total is the - size of the blob. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('text_encoding', text_encoding) - - result = self.get_blob_to_bytes(container_name, - blob_name, - snapshot, - x_ms_lease_id, - progress_callback) - - return result.decode(text_encoding) - - def get_blob_metadata(self, container_name, blob_name, snapshot=None, - x_ms_lease_id=None): - ''' - Returns all user-defined metadata for the specified blob or snapshot. - - container_name: Name of existing container. - blob_name: Name of existing blob. - snapshot: - Optional. The snapshot parameter is an opaque DateTime value that, - when present, specifies the blob snapshot to retrieve. - x_ms_lease_id: Required if the blob has an active lease. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '/' + _str(blob_name) + '?comp=metadata' - request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] - request.query = [('snapshot', _str_or_none(snapshot))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response_for_dict_prefix(response, prefixes=['x-ms-meta']) - - def set_blob_metadata(self, container_name, blob_name, - x_ms_meta_name_values=None, x_ms_lease_id=None): - ''' - Sets user-defined metadata for the specified blob as one or more - name-value pairs. - - container_name: Name of existing container. - blob_name: Name of existing blob. - x_ms_meta_name_values: Dict containing name and value pairs. - x_ms_lease_id: Required if the blob has an active lease. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '/' + _str(blob_name) + '?comp=metadata' - request.headers = [ - ('x-ms-meta-name-values', x_ms_meta_name_values), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def lease_blob(self, container_name, blob_name, x_ms_lease_action, - x_ms_lease_id=None, x_ms_lease_duration=60, - x_ms_lease_break_period=None, x_ms_proposed_lease_id=None): - ''' - Establishes and manages a one-minute lock on a blob for write - operations. - - container_name: Name of existing container. - blob_name: Name of existing blob. - x_ms_lease_action: - Required. Possible values: acquire|renew|release|break|change - x_ms_lease_id: Required if the blob has an active lease. - x_ms_lease_duration: - Specifies the duration of the lease, in seconds, or negative one - (-1) for a lease that never expires. A non-infinite lease can be - between 15 and 60 seconds. A lease duration cannot be changed - using renew or change. For backwards compatibility, the default is - 60, and the value is only used on an acquire operation. - x_ms_lease_break_period: - Optional. For a break operation, this is the proposed duration of - seconds that the lease should continue before it is broken, between - 0 and 60 seconds. This break period is only used if it is shorter - than the time remaining on the lease. If longer, the time remaining - on the lease is used. A new lease will not be available before the - break period has expired, but the lease may be held for longer than - the break period. If this header does not appear with a break - operation, a fixed-duration lease breaks after the remaining lease - period elapses, and an infinite lease breaks immediately. - x_ms_proposed_lease_id: - Optional for acquire, required for change. Proposed lease ID, in a - GUID string format. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('x_ms_lease_action', x_ms_lease_action) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '/' + _str(blob_name) + '?comp=lease' - request.headers = [ - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ('x-ms-lease-action', _str_or_none(x_ms_lease_action)), - ('x-ms-lease-duration', _str_or_none(x_ms_lease_duration\ - if x_ms_lease_action == 'acquire' else None)), - ('x-ms-lease-break-period', _str_or_none(x_ms_lease_break_period)), - ('x-ms-proposed-lease-id', _str_or_none(x_ms_proposed_lease_id)), - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response_for_dict_filter( - response, - filter=['x-ms-lease-id', 'x-ms-lease-time']) - - def snapshot_blob(self, container_name, blob_name, - x_ms_meta_name_values=None, if_modified_since=None, - if_unmodified_since=None, if_match=None, - if_none_match=None, x_ms_lease_id=None): - ''' - Creates a read-only snapshot of a blob. - - container_name: Name of existing container. - blob_name: Name of existing blob. - x_ms_meta_name_values: Optional. Dict containing name and value pairs. - if_modified_since: Optional. Datetime string. - if_unmodified_since: DateTime string. - if_match: - Optional. snapshot the blob only if its ETag value matches the - value specified. - if_none_match: Optional. An ETag value - x_ms_lease_id: Required if the blob has an active lease. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '/' + _str(blob_name) + '?comp=snapshot' - request.headers = [ - ('x-ms-meta-name-values', x_ms_meta_name_values), - ('If-Modified-Since', _str_or_none(if_modified_since)), - ('If-Unmodified-Since', _str_or_none(if_unmodified_since)), - ('If-Match', _str_or_none(if_match)), - ('If-None-Match', _str_or_none(if_none_match)), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response_for_dict_filter( - response, - filter=['x-ms-snapshot', 'etag', 'last-modified']) - - def copy_blob(self, container_name, blob_name, x_ms_copy_source, - x_ms_meta_name_values=None, - x_ms_source_if_modified_since=None, - x_ms_source_if_unmodified_since=None, - x_ms_source_if_match=None, x_ms_source_if_none_match=None, - if_modified_since=None, if_unmodified_since=None, - if_match=None, if_none_match=None, x_ms_lease_id=None, - x_ms_source_lease_id=None): - ''' - Copies a blob to a destination within the storage account. - - container_name: Name of existing container. - blob_name: Name of existing blob. - x_ms_copy_source: - URL up to 2 KB in length that specifies a blob. A source blob in - the same account can be private, but a blob in another account - must be public or accept credentials included in this URL, such as - a Shared Access Signature. Examples: - https://myaccount.blob.core.windows.net/mycontainer/myblob - https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=<DateTime> - x_ms_meta_name_values: Optional. Dict containing name and value pairs. - x_ms_source_if_modified_since: - Optional. An ETag value. Specify this conditional header to copy - the source blob only if its ETag matches the value specified. - x_ms_source_if_unmodified_since: - Optional. An ETag value. Specify this conditional header to copy - the blob only if its ETag does not match the value specified. - x_ms_source_if_match: - Optional. A DateTime value. Specify this conditional header to - copy the blob only if the source blob has been modified since the - specified date/time. - x_ms_source_if_none_match: - Optional. An ETag value. Specify this conditional header to copy - the source blob only if its ETag matches the value specified. - if_modified_since: Optional. Datetime string. - if_unmodified_since: DateTime string. - if_match: - Optional. Snapshot the blob only if its ETag value matches the - value specified. - if_none_match: Optional. An ETag value - x_ms_lease_id: Required if the blob has an active lease. - x_ms_source_lease_id: - Optional. Specify this to perform the Copy Blob operation only if - the lease ID given matches the active lease ID of the source blob. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('x_ms_copy_source', x_ms_copy_source) - - if x_ms_copy_source.startswith('/'): - # Backwards compatibility for earlier versions of the SDK where - # the copy source can be in the following formats: - # - Blob in named container: - # /accountName/containerName/blobName - # - Snapshot in named container: - # /accountName/containerName/blobName?snapshot=<DateTime> - # - Blob in root container: - # /accountName/blobName - # - Snapshot in root container: - # /accountName/blobName?snapshot=<DateTime> - account, _, source =\ - x_ms_copy_source.partition('/')[2].partition('/') - x_ms_copy_source = self.protocol + '://' + \ - account + self.host_base + '/' + source - - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' - request.headers = [ - ('x-ms-copy-source', _str_or_none(x_ms_copy_source)), - ('x-ms-meta-name-values', x_ms_meta_name_values), - ('x-ms-source-if-modified-since', - _str_or_none(x_ms_source_if_modified_since)), - ('x-ms-source-if-unmodified-since', - _str_or_none(x_ms_source_if_unmodified_since)), - ('x-ms-source-if-match', _str_or_none(x_ms_source_if_match)), - ('x-ms-source-if-none-match', - _str_or_none(x_ms_source_if_none_match)), - ('If-Modified-Since', _str_or_none(if_modified_since)), - ('If-Unmodified-Since', _str_or_none(if_unmodified_since)), - ('If-Match', _str_or_none(if_match)), - ('If-None-Match', _str_or_none(if_none_match)), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ('x-ms-source-lease-id', _str_or_none(x_ms_source_lease_id)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response_for_dict(response) - - def abort_copy_blob(self, container_name, blob_name, x_ms_copy_id, - x_ms_lease_id=None): - ''' - Aborts a pending copy_blob operation, and leaves a destination blob - with zero length and full metadata. - - container_name: Name of destination container. - blob_name: Name of destination blob. - x_ms_copy_id: - Copy identifier provided in the x-ms-copy-id of the original - copy_blob operation. - x_ms_lease_id: - Required if the destination blob has an active infinite lease. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('x_ms_copy_id', x_ms_copy_id) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '/' + \ - _str(blob_name) + '?comp=copy©id=' + \ - _str(x_ms_copy_id) - request.headers = [ - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ('x-ms-copy-action', 'abort'), - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def delete_blob(self, container_name, blob_name, snapshot=None, - x_ms_lease_id=None): - ''' - Marks the specified blob or snapshot for deletion. The blob is later - deleted during garbage collection. - - To mark a specific snapshot for deletion provide the date/time of the - snapshot via the snapshot parameter. - - container_name: Name of existing container. - blob_name: Name of existing blob. - snapshot: - Optional. The snapshot parameter is an opaque DateTime value that, - when present, specifies the blob snapshot to delete. - x_ms_lease_id: Required if the blob has an active lease. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' - request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] - request.query = [('snapshot', _str_or_none(snapshot))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def put_block(self, container_name, blob_name, block, blockid, - content_md5=None, x_ms_lease_id=None): - ''' - Creates a new block to be committed as part of a blob. - - container_name: Name of existing container. - blob_name: Name of existing blob. - block: Content of the block. - blockid: - Required. A value that identifies the block. The string must be - less than or equal to 64 bytes in size. - content_md5: - Optional. An MD5 hash of the block content. This hash is used to - verify the integrity of the blob during transport. When this - header is specified, the storage service checks the hash that has - arrived with the one that was sent. - x_ms_lease_id: Required if the blob has an active lease. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('block', block) - _validate_not_none('blockid', blockid) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '/' + _str(blob_name) + '?comp=block' - request.headers = [ - ('Content-MD5', _str_or_none(content_md5)), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) - ] - request.query = [('blockid', _encode_base64(_str_or_none(blockid)))] - request.body = _get_request_body_bytes_only('block', block) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def put_block_list(self, container_name, blob_name, block_list, - content_md5=None, x_ms_blob_cache_control=None, - x_ms_blob_content_type=None, - x_ms_blob_content_encoding=None, - x_ms_blob_content_language=None, - x_ms_blob_content_md5=None, x_ms_meta_name_values=None, - x_ms_lease_id=None): - ''' - Writes a blob by specifying the list of block IDs that make up the - blob. In order to be written as part of a blob, a block must have been - successfully written to the server in a prior Put Block (REST API) - operation. - - container_name: Name of existing container. - blob_name: Name of existing blob. - block_list: A str list containing the block ids. - content_md5: - Optional. An MD5 hash of the block content. This hash is used to - verify the integrity of the blob during transport. When this header - is specified, the storage service checks the hash that has arrived - with the one that was sent. - x_ms_blob_cache_control: - Optional. Sets the blob's cache control. If specified, this - property is stored with the blob and returned with a read request. - x_ms_blob_content_type: - Optional. Sets the blob's content type. If specified, this property - is stored with the blob and returned with a read request. - x_ms_blob_content_encoding: - Optional. Sets the blob's content encoding. If specified, this - property is stored with the blob and returned with a read request. - x_ms_blob_content_language: - Optional. Set the blob's content language. If specified, this - property is stored with the blob and returned with a read request. - x_ms_blob_content_md5: - Optional. An MD5 hash of the blob content. Note that this hash is - not validated, as the hashes for the individual blocks were - validated when each was uploaded. - x_ms_meta_name_values: Optional. Dict containing name and value pairs. - x_ms_lease_id: Required if the blob has an active lease. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('block_list', block_list) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '/' + _str(blob_name) + '?comp=blocklist' - request.headers = [ - ('Content-MD5', _str_or_none(content_md5)), - ('x-ms-blob-cache-control', _str_or_none(x_ms_blob_cache_control)), - ('x-ms-blob-content-type', _str_or_none(x_ms_blob_content_type)), - ('x-ms-blob-content-encoding', - _str_or_none(x_ms_blob_content_encoding)), - ('x-ms-blob-content-language', - _str_or_none(x_ms_blob_content_language)), - ('x-ms-blob-content-md5', _str_or_none(x_ms_blob_content_md5)), - ('x-ms-meta-name-values', x_ms_meta_name_values), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) - ] - request.body = _get_request_body( - _convert_block_list_to_xml(block_list)) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def get_block_list(self, container_name, blob_name, snapshot=None, - blocklisttype=None, x_ms_lease_id=None): - ''' - Retrieves the list of blocks that have been uploaded as part of a - block blob. - - container_name: Name of existing container. - blob_name: Name of existing blob. - snapshot: - Optional. Datetime to determine the time to retrieve the blocks. - blocklisttype: - Specifies whether to return the list of committed blocks, the list - of uncommitted blocks, or both lists together. Valid values are: - committed, uncommitted, or all. - x_ms_lease_id: Required if the blob has an active lease. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '/' + _str(blob_name) + '?comp=blocklist' - request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] - request.query = [ - ('snapshot', _str_or_none(snapshot)), - ('blocklisttype', _str_or_none(blocklisttype)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _convert_response_to_block_list(response) - - def put_page(self, container_name, blob_name, page, x_ms_range, - x_ms_page_write, timeout=None, content_md5=None, - x_ms_lease_id=None, x_ms_if_sequence_number_lte=None, - x_ms_if_sequence_number_lt=None, - x_ms_if_sequence_number_eq=None, - if_modified_since=None, if_unmodified_since=None, - if_match=None, if_none_match=None): - ''' - Writes a range of pages to a page blob. - - container_name: Name of existing container. - blob_name: Name of existing blob. - page: Content of the page. - x_ms_range: - Required. Specifies the range of bytes to be written as a page. - Both the start and end of the range must be specified. Must be in - format: bytes=startByte-endByte. Given that pages must be aligned - with 512-byte boundaries, the start offset must be a modulus of - 512 and the end offset must be a modulus of 512-1. Examples of - valid byte ranges are 0-511, 512-1023, etc. - x_ms_page_write: - Required. You may specify one of the following options: - update (lower case): - Writes the bytes specified by the request body into the - specified range. The Range and Content-Length headers must - match to perform the update. - clear (lower case): - Clears the specified range and releases the space used in - storage for that range. To clear a range, set the - Content-Length header to zero, and the Range header to a - value that indicates the range to clear, up to maximum - blob size. - timeout: the timeout parameter is expressed in seconds. - content_md5: - Optional. An MD5 hash of the page content. This hash is used to - verify the integrity of the page during transport. When this header - is specified, the storage service compares the hash of the content - that has arrived with the header value that was sent. If the two - hashes do not match, the operation will fail with error code 400 - (Bad Request). - x_ms_lease_id: Required if the blob has an active lease. - x_ms_if_sequence_number_lte: - Optional. If the blob's sequence number is less than or equal to - the specified value, the request proceeds; otherwise it fails. - x_ms_if_sequence_number_lt: - Optional. If the blob's sequence number is less than the specified - value, the request proceeds; otherwise it fails. - x_ms_if_sequence_number_eq: - Optional. If the blob's sequence number is equal to the specified - value, the request proceeds; otherwise it fails. - if_modified_since: - Optional. A DateTime value. Specify this conditional header to - write the page only if the blob has been modified since the - specified date/time. If the blob has not been modified, the Blob - service fails. - if_unmodified_since: - Optional. A DateTime value. Specify this conditional header to - write the page only if the blob has not been modified since the - specified date/time. If the blob has been modified, the Blob - service fails. - if_match: - Optional. An ETag value. Specify an ETag value for this conditional - header to write the page only if the blob's ETag value matches the - value specified. If the values do not match, the Blob service fails. - if_none_match: - Optional. An ETag value. Specify an ETag value for this conditional - header to write the page only if the blob's ETag value does not - match the value specified. If the values are identical, the Blob - service fails. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - _validate_not_none('page', page) - _validate_not_none('x_ms_range', x_ms_range) - _validate_not_none('x_ms_page_write', x_ms_page_write) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '/' + _str(blob_name) + '?comp=page' - request.headers = [ - ('x-ms-range', _str_or_none(x_ms_range)), - ('Content-MD5', _str_or_none(content_md5)), - ('x-ms-page-write', _str_or_none(x_ms_page_write)), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), - ('x-ms-if-sequence-number-le', - _str_or_none(x_ms_if_sequence_number_lte)), - ('x-ms-if-sequence-number-lt', - _str_or_none(x_ms_if_sequence_number_lt)), - ('x-ms-if-sequence-number-eq', - _str_or_none(x_ms_if_sequence_number_eq)), - ('If-Modified-Since', _str_or_none(if_modified_since)), - ('If-Unmodified-Since', _str_or_none(if_unmodified_since)), - ('If-Match', _str_or_none(if_match)), - ('If-None-Match', _str_or_none(if_none_match)) - ] - request.query = [('timeout', _int_or_none(timeout))] - request.body = _get_request_body_bytes_only('page', page) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def get_page_ranges(self, container_name, blob_name, snapshot=None, - range=None, x_ms_range=None, x_ms_lease_id=None): - ''' - Retrieves the page ranges for a blob. - - container_name: Name of existing container. - blob_name: Name of existing blob. - snapshot: - Optional. The snapshot parameter is an opaque DateTime value that, - when present, specifies the blob snapshot to retrieve information - from. - range: - Optional. Specifies the range of bytes over which to list ranges, - inclusively. If omitted, then all ranges for the blob are returned. - x_ms_range: - Optional. Specifies the range of bytes to be written as a page. - Both the start and end of the range must be specified. Must be in - format: bytes=startByte-endByte. Given that pages must be aligned - with 512-byte boundaries, the start offset must be a modulus of - 512 and the end offset must be a modulus of 512-1. Examples of - valid byte ranges are 0-511, 512-1023, etc. - x_ms_lease_id: Required if the blob has an active lease. - ''' - _validate_not_none('container_name', container_name) - _validate_not_none('blob_name', blob_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + \ - _str(container_name) + '/' + _str(blob_name) + '?comp=pagelist' - request.headers = [ - ('Range', _str_or_none(range)), - ('x-ms-range', _str_or_none(x_ms_range)), - ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) - ] - request.query = [('snapshot', _str_or_none(snapshot))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_blob_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_simple_list(response, PageList, PageRange, "page_ranges") +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +from azure import ( + WindowsAzureError, + BLOB_SERVICE_HOST_BASE, + DEV_BLOB_HOST, + _ERROR_VALUE_NEGATIVE, + _ERROR_PAGE_BLOB_SIZE_ALIGNMENT, + _convert_class_to_xml, + _dont_fail_not_exist, + _dont_fail_on_exist, + _encode_base64, + _get_request_body, + _get_request_body_bytes_only, + _int_or_none, + _parse_enum_results_list, + _parse_response, + _parse_response_for_dict, + _parse_response_for_dict_filter, + _parse_response_for_dict_prefix, + _parse_simple_list, + _str, + _str_or_none, + _update_request_uri_query_local_storage, + _validate_type_bytes, + _validate_not_none, + ) +from azure.http import HTTPRequest +from azure.storage import ( + Container, + ContainerEnumResults, + PageList, + PageRange, + SignedIdentifiers, + StorageServiceProperties, + _convert_block_list_to_xml, + _convert_response_to_block_list, + _create_blob_result, + _parse_blob_enum_results_list, + _update_storage_blob_header, + ) +from azure.storage.storageclient import _StorageClient +from os import path +import sys +if sys.version_info >= (3,): + from io import BytesIO +else: + from cStringIO import StringIO as BytesIO + +# Keep this value sync with _ERROR_PAGE_BLOB_SIZE_ALIGNMENT +_PAGE_SIZE = 512 + + +class BlobService(_StorageClient): + + ''' + This is the main class managing Blob resources. + ''' + + def __init__(self, account_name=None, account_key=None, protocol='https', + host_base=BLOB_SERVICE_HOST_BASE, dev_host=DEV_BLOB_HOST): + ''' + account_name: your storage account name, required for all operations. + account_key: your storage account key, required for all operations. + protocol: Optional. Protocol. Defaults to https. + host_base: + Optional. Live host base url. Defaults to Azure url. Override this + for on-premise. + dev_host: Optional. Dev host url. Defaults to localhost. + ''' + self._BLOB_MAX_DATA_SIZE = 64 * 1024 * 1024 + self._BLOB_MAX_CHUNK_DATA_SIZE = 4 * 1024 * 1024 + super(BlobService, self).__init__( + account_name, account_key, protocol, host_base, dev_host) + + def make_blob_url(self, container_name, blob_name, account_name=None, + protocol=None, host_base=None): + ''' + Creates the url to access a blob. + + container_name: Name of container. + blob_name: Name of blob. + account_name: + Name of the storage account. If not specified, uses the account + specified when BlobService was initialized. + protocol: + Protocol to use: 'http' or 'https'. If not specified, uses the + protocol specified when BlobService was initialized. + host_base: + Live host base url. If not specified, uses the host base specified + when BlobService was initialized. + ''' + + if not account_name: + account_name = self.account_name + if not protocol: + protocol = self.protocol + if not host_base: + host_base = self.host_base + + return '{0}://{1}{2}/{3}/{4}'.format(protocol, + account_name, + host_base, + container_name, + blob_name) + + def list_containers(self, prefix=None, marker=None, maxresults=None, + include=None): + ''' + The List Containers operation returns a list of the containers under + the specified account. + + prefix: + Optional. Filters the results to return only containers whose names + begin with the specified prefix. + marker: + Optional. A string value that identifies the portion of the list to + be returned with the next list operation. + maxresults: + Optional. Specifies the maximum number of containers to return. + include: + Optional. Include this parameter to specify that the container's + metadata be returned as part of the response body. set this + parameter to string 'metadata' to get container's metadata. + ''' + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/?comp=list' + request.query = [ + ('prefix', _str_or_none(prefix)), + ('marker', _str_or_none(marker)), + ('maxresults', _int_or_none(maxresults)), + ('include', _str_or_none(include)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_enum_results_list(response, + ContainerEnumResults, + "Containers", + Container) + + def create_container(self, container_name, x_ms_meta_name_values=None, + x_ms_blob_public_access=None, fail_on_exist=False): + ''' + Creates a new container under the specified account. If the container + with the same name already exists, the operation fails. + + container_name: Name of container to create. + x_ms_meta_name_values: + Optional. A dict with name_value pairs to associate with the + container as metadata. Example:{'Category':'test'} + x_ms_blob_public_access: + Optional. Possible values include: container, blob + fail_on_exist: + specify whether to throw an exception when the container exists. + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + _str(container_name) + '?restype=container' + request.headers = [ + ('x-ms-meta-name-values', x_ms_meta_name_values), + ('x-ms-blob-public-access', _str_or_none(x_ms_blob_public_access)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + if not fail_on_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_on_exist(ex) + return False + else: + self._perform_request(request) + return True + + def get_container_properties(self, container_name, x_ms_lease_id=None): + ''' + Returns all user-defined metadata and system properties for the + specified container. + + container_name: Name of existing container. + x_ms_lease_id: + If specified, get_container_properties only succeeds if the + container's lease is active and matches this ID. + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + _str(container_name) + '?restype=container' + request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response_for_dict(response) + + def get_container_metadata(self, container_name, x_ms_lease_id=None): + ''' + Returns all user-defined metadata for the specified container. The + metadata will be in returned dictionary['x-ms-meta-(name)']. + + container_name: Name of existing container. + x_ms_lease_id: + If specified, get_container_metadata only succeeds if the + container's lease is active and matches this ID. + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '?restype=container&comp=metadata' + request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response_for_dict_prefix(response, prefixes=['x-ms-meta']) + + def set_container_metadata(self, container_name, + x_ms_meta_name_values=None, x_ms_lease_id=None): + ''' + Sets one or more user-defined name-value pairs for the specified + container. + + container_name: Name of existing container. + x_ms_meta_name_values: + A dict containing name, value for metadata. + Example: {'category':'test'} + x_ms_lease_id: + If specified, set_container_metadata only succeeds if the + container's lease is active and matches this ID. + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '?restype=container&comp=metadata' + request.headers = [ + ('x-ms-meta-name-values', x_ms_meta_name_values), + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def get_container_acl(self, container_name, x_ms_lease_id=None): + ''' + Gets the permissions for the specified container. + + container_name: Name of existing container. + x_ms_lease_id: + If specified, get_container_acl only succeeds if the + container's lease is active and matches this ID. + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '?restype=container&comp=acl' + request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response(response, SignedIdentifiers) + + def set_container_acl(self, container_name, signed_identifiers=None, + x_ms_blob_public_access=None, x_ms_lease_id=None): + ''' + Sets the permissions for the specified container. + + container_name: Name of existing container. + signed_identifiers: SignedIdentifers instance + x_ms_blob_public_access: + Optional. Possible values include: container, blob + x_ms_lease_id: + If specified, set_container_acl only succeeds if the + container's lease is active and matches this ID. + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '?restype=container&comp=acl' + request.headers = [ + ('x-ms-blob-public-access', _str_or_none(x_ms_blob_public_access)), + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), + ] + request.body = _get_request_body( + _convert_class_to_xml(signed_identifiers)) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def delete_container(self, container_name, fail_not_exist=False, + x_ms_lease_id=None): + ''' + Marks the specified container for deletion. + + container_name: Name of container to delete. + fail_not_exist: + Specify whether to throw an exception when the container doesn't + exist. + x_ms_lease_id: Required if the container has an active lease. + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + _str(container_name) + '?restype=container' + request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + if not fail_not_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_not_exist(ex) + return False + else: + self._perform_request(request) + return True + + def lease_container(self, container_name, x_ms_lease_action, + x_ms_lease_id=None, x_ms_lease_duration=60, + x_ms_lease_break_period=None, + x_ms_proposed_lease_id=None): + ''' + Establishes and manages a lock on a container for delete operations. + The lock duration can be 15 to 60 seconds, or can be infinite. + + container_name: Name of existing container. + x_ms_lease_action: + Required. Possible values: acquire|renew|release|break|change + x_ms_lease_id: Required if the container has an active lease. + x_ms_lease_duration: + Specifies the duration of the lease, in seconds, or negative one + (-1) for a lease that never expires. A non-infinite lease can be + between 15 and 60 seconds. A lease duration cannot be changed + using renew or change. For backwards compatibility, the default is + 60, and the value is only used on an acquire operation. + x_ms_lease_break_period: + Optional. For a break operation, this is the proposed duration of + seconds that the lease should continue before it is broken, between + 0 and 60 seconds. This break period is only used if it is shorter + than the time remaining on the lease. If longer, the time remaining + on the lease is used. A new lease will not be available before the + break period has expired, but the lease may be held for longer than + the break period. If this header does not appear with a break + operation, a fixed-duration lease breaks after the remaining lease + period elapses, and an infinite lease breaks immediately. + x_ms_proposed_lease_id: + Optional for acquire, required for change. Proposed lease ID, in a + GUID string format. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('x_ms_lease_action', x_ms_lease_action) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '?restype=container&comp=lease' + request.headers = [ + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), + ('x-ms-lease-action', _str_or_none(x_ms_lease_action)), + ('x-ms-lease-duration', + _str_or_none( + x_ms_lease_duration if x_ms_lease_action == 'acquire'\ + else None)), + ('x-ms-lease-break-period', _str_or_none(x_ms_lease_break_period)), + ('x-ms-proposed-lease-id', _str_or_none(x_ms_proposed_lease_id)), + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response_for_dict_filter( + response, + filter=['x-ms-lease-id', 'x-ms-lease-time']) + + def list_blobs(self, container_name, prefix=None, marker=None, + maxresults=None, include=None, delimiter=None): + ''' + Returns the list of blobs under the specified container. + + container_name: Name of existing container. + prefix: + Optional. Filters the results to return only blobs whose names + begin with the specified prefix. + marker: + Optional. A string value that identifies the portion of the list + to be returned with the next list operation. The operation returns + a marker value within the response body if the list returned was + not complete. The marker value may then be used in a subsequent + call to request the next set of list items. The marker value is + opaque to the client. + maxresults: + Optional. Specifies the maximum number of blobs to return, + including all BlobPrefix elements. If the request does not specify + maxresults or specifies a value greater than 5,000, the server will + return up to 5,000 items. Setting maxresults to a value less than + or equal to zero results in error response code 400 (Bad Request). + include: + Optional. Specifies one or more datasets to include in the + response. To specify more than one of these options on the URI, + you must separate each option with a comma. Valid values are: + snapshots: + Specifies that snapshots should be included in the + enumeration. Snapshots are listed from oldest to newest in + the response. + metadata: + Specifies that blob metadata be returned in the response. + uncommittedblobs: + Specifies that blobs for which blocks have been uploaded, + but which have not been committed using Put Block List + (REST API), be included in the response. + copy: + Version 2012-02-12 and newer. Specifies that metadata + related to any current or previous Copy Blob operation + should be included in the response. + delimiter: + Optional. When the request includes this parameter, the operation + returns a BlobPrefix element in the response body that acts as a + placeholder for all blobs whose names begin with the same + substring up to the appearance of the delimiter character. The + delimiter may be a single character or a string. + ''' + _validate_not_none('container_name', container_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '?restype=container&comp=list' + request.query = [ + ('prefix', _str_or_none(prefix)), + ('delimiter', _str_or_none(delimiter)), + ('marker', _str_or_none(marker)), + ('maxresults', _int_or_none(maxresults)), + ('include', _str_or_none(include)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_blob_enum_results_list(response) + + def set_blob_service_properties(self, storage_service_properties, + timeout=None): + ''' + Sets the properties of a storage account's Blob service, including + Windows Azure Storage Analytics. You can also use this operation to + set the default request version for all incoming requests that do not + have a version specified. + + storage_service_properties: a StorageServiceProperties object. + timeout: Optional. The timeout parameter is expressed in seconds. + ''' + _validate_not_none('storage_service_properties', + storage_service_properties) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/?restype=service&comp=properties' + request.query = [('timeout', _int_or_none(timeout))] + request.body = _get_request_body( + _convert_class_to_xml(storage_service_properties)) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def get_blob_service_properties(self, timeout=None): + ''' + Gets the properties of a storage account's Blob service, including + Windows Azure Storage Analytics. + + timeout: Optional. The timeout parameter is expressed in seconds. + ''' + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/?restype=service&comp=properties' + request.query = [('timeout', _int_or_none(timeout))] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response(response, StorageServiceProperties) + + def get_blob_properties(self, container_name, blob_name, + x_ms_lease_id=None): + ''' + Returns all user-defined metadata, standard HTTP properties, and + system properties for the blob. + + container_name: Name of existing container. + blob_name: Name of existing blob. + x_ms_lease_id: Required if the blob has an active lease. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'HEAD' + request.host = self._get_host() + request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' + request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + + response = self._perform_request(request) + + return _parse_response_for_dict(response) + + def set_blob_properties(self, container_name, blob_name, + x_ms_blob_cache_control=None, + x_ms_blob_content_type=None, + x_ms_blob_content_md5=None, + x_ms_blob_content_encoding=None, + x_ms_blob_content_language=None, + x_ms_lease_id=None): + ''' + Sets system properties on the blob. + + container_name: Name of existing container. + blob_name: Name of existing blob. + x_ms_blob_cache_control: + Optional. Modifies the cache control string for the blob. + x_ms_blob_content_type: Optional. Sets the blob's content type. + x_ms_blob_content_md5: Optional. Sets the blob's MD5 hash. + x_ms_blob_content_encoding: Optional. Sets the blob's content encoding. + x_ms_blob_content_language: Optional. Sets the blob's content language. + x_ms_lease_id: Required if the blob has an active lease. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '/' + _str(blob_name) + '?comp=properties' + request.headers = [ + ('x-ms-blob-cache-control', _str_or_none(x_ms_blob_cache_control)), + ('x-ms-blob-content-type', _str_or_none(x_ms_blob_content_type)), + ('x-ms-blob-content-md5', _str_or_none(x_ms_blob_content_md5)), + ('x-ms-blob-content-encoding', + _str_or_none(x_ms_blob_content_encoding)), + ('x-ms-blob-content-language', + _str_or_none(x_ms_blob_content_language)), + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def put_blob(self, container_name, blob_name, blob, x_ms_blob_type, + content_encoding=None, content_language=None, + content_md5=None, cache_control=None, + x_ms_blob_content_type=None, x_ms_blob_content_encoding=None, + x_ms_blob_content_language=None, x_ms_blob_content_md5=None, + x_ms_blob_cache_control=None, x_ms_meta_name_values=None, + x_ms_lease_id=None, x_ms_blob_content_length=None, + x_ms_blob_sequence_number=None): + ''' + Creates a new block blob or page blob, or updates the content of an + existing block blob. + + See put_block_blob_from_* and put_page_blob_from_* for high level + functions that handle the creation and upload of large blobs with + automatic chunking and progress notifications. + + container_name: Name of existing container. + blob_name: Name of blob to create or update. + blob: + For BlockBlob: + Content of blob as bytes (size < 64MB). For larger size, you + must call put_block and put_block_list to set content of blob. + For PageBlob: + Use None and call put_page to set content of blob. + x_ms_blob_type: Required. Could be BlockBlob or PageBlob. + content_encoding: + Optional. Specifies which content encodings have been applied to + the blob. This value is returned to the client when the Get Blob + (REST API) operation is performed on the blob resource. The client + can use this value when returned to decode the blob content. + content_language: + Optional. Specifies the natural languages used by this resource. + content_md5: + Optional. An MD5 hash of the blob content. This hash is used to + verify the integrity of the blob during transport. When this header + is specified, the storage service checks the hash that has arrived + with the one that was sent. If the two hashes do not match, the + operation will fail with error code 400 (Bad Request). + cache_control: + Optional. The Blob service stores this value but does not use or + modify it. + x_ms_blob_content_type: Optional. Set the blob's content type. + x_ms_blob_content_encoding: Optional. Set the blob's content encoding. + x_ms_blob_content_language: Optional. Set the blob's content language. + x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. + x_ms_blob_cache_control: Optional. Sets the blob's cache control. + x_ms_meta_name_values: A dict containing name, value for metadata. + x_ms_lease_id: Required if the blob has an active lease. + x_ms_blob_content_length: + Required for page blobs. This header specifies the maximum size + for the page blob, up to 1 TB. The page blob size must be aligned + to a 512-byte boundary. + x_ms_blob_sequence_number: + Optional. Set for page blobs only. The sequence number is a + user-controlled value that you can use to track requests. The + value of the sequence number must be between 0 and 2^63 - 1. The + default value is 0. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('x_ms_blob_type', x_ms_blob_type) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' + request.headers = [ + ('x-ms-blob-type', _str_or_none(x_ms_blob_type)), + ('Content-Encoding', _str_or_none(content_encoding)), + ('Content-Language', _str_or_none(content_language)), + ('Content-MD5', _str_or_none(content_md5)), + ('Cache-Control', _str_or_none(cache_control)), + ('x-ms-blob-content-type', _str_or_none(x_ms_blob_content_type)), + ('x-ms-blob-content-encoding', + _str_or_none(x_ms_blob_content_encoding)), + ('x-ms-blob-content-language', + _str_or_none(x_ms_blob_content_language)), + ('x-ms-blob-content-md5', _str_or_none(x_ms_blob_content_md5)), + ('x-ms-blob-cache-control', _str_or_none(x_ms_blob_cache_control)), + ('x-ms-meta-name-values', x_ms_meta_name_values), + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), + ('x-ms-blob-content-length', + _str_or_none(x_ms_blob_content_length)), + ('x-ms-blob-sequence-number', + _str_or_none(x_ms_blob_sequence_number)) + ] + request.body = _get_request_body_bytes_only('blob', blob) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def put_block_blob_from_path(self, container_name, blob_name, file_path, + content_encoding=None, content_language=None, + content_md5=None, cache_control=None, + x_ms_blob_content_type=None, + x_ms_blob_content_encoding=None, + x_ms_blob_content_language=None, + x_ms_blob_content_md5=None, + x_ms_blob_cache_control=None, + x_ms_meta_name_values=None, + x_ms_lease_id=None, progress_callback=None): + ''' + Creates a new block blob from a file path, or updates the content of an + existing block blob, with automatic chunking and progress notifications. + + container_name: Name of existing container. + blob_name: Name of blob to create or update. + file_path: Path of the file to upload as the blob content. + content_encoding: + Optional. Specifies which content encodings have been applied to + the blob. This value is returned to the client when the Get Blob + (REST API) operation is performed on the blob resource. The client + can use this value when returned to decode the blob content. + content_language: + Optional. Specifies the natural languages used by this resource. + content_md5: + Optional. An MD5 hash of the blob content. This hash is used to + verify the integrity of the blob during transport. When this header + is specified, the storage service checks the hash that has arrived + with the one that was sent. If the two hashes do not match, the + operation will fail with error code 400 (Bad Request). + cache_control: + Optional. The Blob service stores this value but does not use or + modify it. + x_ms_blob_content_type: Optional. Set the blob's content type. + x_ms_blob_content_encoding: Optional. Set the blob's content encoding. + x_ms_blob_content_language: Optional. Set the blob's content language. + x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. + x_ms_blob_cache_control: Optional. Sets the blob's cache control. + x_ms_meta_name_values: A dict containing name, value for metadata. + x_ms_lease_id: Required if the blob has an active lease. + progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('file_path', file_path) + + count = path.getsize(file_path) + with open(file_path, 'rb') as stream: + self.put_block_blob_from_file(container_name, + blob_name, + stream, + count, + content_encoding, + content_language, + content_md5, + cache_control, + x_ms_blob_content_type, + x_ms_blob_content_encoding, + x_ms_blob_content_language, + x_ms_blob_content_md5, + x_ms_blob_cache_control, + x_ms_meta_name_values, + x_ms_lease_id, + progress_callback) + + def put_block_blob_from_file(self, container_name, blob_name, stream, + count=None, content_encoding=None, + content_language=None, content_md5=None, + cache_control=None, + x_ms_blob_content_type=None, + x_ms_blob_content_encoding=None, + x_ms_blob_content_language=None, + x_ms_blob_content_md5=None, + x_ms_blob_cache_control=None, + x_ms_meta_name_values=None, + x_ms_lease_id=None, progress_callback=None): + ''' + Creates a new block blob from a file/stream, or updates the content of + an existing block blob, with automatic chunking and progress + notifications. + + container_name: Name of existing container. + blob_name: Name of blob to create or update. + stream: Opened file/stream to upload as the blob content. + count: + Number of bytes to read from the stream. This is optional, but + should be supplied for optimal performance. + content_encoding: + Optional. Specifies which content encodings have been applied to + the blob. This value is returned to the client when the Get Blob + (REST API) operation is performed on the blob resource. The client + can use this value when returned to decode the blob content. + content_language: + Optional. Specifies the natural languages used by this resource. + content_md5: + Optional. An MD5 hash of the blob content. This hash is used to + verify the integrity of the blob during transport. When this header + is specified, the storage service checks the hash that has arrived + with the one that was sent. If the two hashes do not match, the + operation will fail with error code 400 (Bad Request). + cache_control: + Optional. The Blob service stores this value but does not use or + modify it. + x_ms_blob_content_type: Optional. Set the blob's content type. + x_ms_blob_content_encoding: Optional. Set the blob's content encoding. + x_ms_blob_content_language: Optional. Set the blob's content language. + x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. + x_ms_blob_cache_control: Optional. Sets the blob's cache control. + x_ms_meta_name_values: A dict containing name, value for metadata. + x_ms_lease_id: Required if the blob has an active lease. + progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('stream', stream) + + if count and count < self._BLOB_MAX_DATA_SIZE: + if progress_callback: + progress_callback(0, count) + + data = stream.read(count) + self.put_blob(container_name, + blob_name, + data, + 'BlockBlob', + content_encoding, + content_language, + content_md5, + cache_control, + x_ms_blob_content_type, + x_ms_blob_content_encoding, + x_ms_blob_content_language, + x_ms_blob_content_md5, + x_ms_blob_cache_control, + x_ms_meta_name_values, + x_ms_lease_id) + + if progress_callback: + progress_callback(count, count) + else: + if progress_callback: + progress_callback(0, count) + + self.put_blob(container_name, + blob_name, + None, + 'BlockBlob', + content_encoding, + content_language, + content_md5, + cache_control, + x_ms_blob_content_type, + x_ms_blob_content_encoding, + x_ms_blob_content_language, + x_ms_blob_content_md5, + x_ms_blob_cache_control, + x_ms_meta_name_values, + x_ms_lease_id) + + remain_bytes = count + block_ids = [] + block_index = 0 + index = 0 + while True: + request_count = self._BLOB_MAX_CHUNK_DATA_SIZE\ + if remain_bytes is None else min( + remain_bytes, + self._BLOB_MAX_CHUNK_DATA_SIZE) + data = stream.read(request_count) + if data: + length = len(data) + index += length + remain_bytes = remain_bytes - \ + length if remain_bytes else None + block_id = '{0:08d}'.format(block_index) + self.put_block(container_name, blob_name, + data, block_id, x_ms_lease_id=x_ms_lease_id) + block_ids.append(block_id) + block_index += 1 + if progress_callback: + progress_callback(index, count) + else: + break + + self.put_block_list(container_name, blob_name, block_ids, + content_md5, x_ms_blob_cache_control, + x_ms_blob_content_type, + x_ms_blob_content_encoding, + x_ms_blob_content_language, + x_ms_blob_content_md5, + x_ms_meta_name_values, + x_ms_lease_id) + + def put_block_blob_from_bytes(self, container_name, blob_name, blob, + index=0, count=None, content_encoding=None, + content_language=None, content_md5=None, + cache_control=None, + x_ms_blob_content_type=None, + x_ms_blob_content_encoding=None, + x_ms_blob_content_language=None, + x_ms_blob_content_md5=None, + x_ms_blob_cache_control=None, + x_ms_meta_name_values=None, + x_ms_lease_id=None, progress_callback=None): + ''' + Creates a new block blob from an array of bytes, or updates the content + of an existing block blob, with automatic chunking and progress + notifications. + + container_name: Name of existing container. + blob_name: Name of blob to create or update. + blob: Content of blob as an array of bytes. + index: Start index in the array of bytes. + count: + Number of bytes to upload. Set to None or negative value to upload + all bytes starting from index. + content_encoding: + Optional. Specifies which content encodings have been applied to + the blob. This value is returned to the client when the Get Blob + (REST API) operation is performed on the blob resource. The client + can use this value when returned to decode the blob content. + content_language: + Optional. Specifies the natural languages used by this resource. + content_md5: + Optional. An MD5 hash of the blob content. This hash is used to + verify the integrity of the blob during transport. When this header + is specified, the storage service checks the hash that has arrived + with the one that was sent. If the two hashes do not match, the + operation will fail with error code 400 (Bad Request). + cache_control: + Optional. The Blob service stores this value but does not use or + modify it. + x_ms_blob_content_type: Optional. Set the blob's content type. + x_ms_blob_content_encoding: Optional. Set the blob's content encoding. + x_ms_blob_content_language: Optional. Set the blob's content language. + x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. + x_ms_blob_cache_control: Optional. Sets the blob's cache control. + x_ms_meta_name_values: A dict containing name, value for metadata. + x_ms_lease_id: Required if the blob has an active lease. + progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('blob', blob) + _validate_not_none('index', index) + _validate_type_bytes('blob', blob) + + if index < 0: + raise TypeError(_ERROR_VALUE_NEGATIVE.format('index')) + + if count is None or count < 0: + count = len(blob) - index + + if count < self._BLOB_MAX_DATA_SIZE: + if progress_callback: + progress_callback(0, count) + + data = blob[index: index + count] + self.put_blob(container_name, + blob_name, + data, + 'BlockBlob', + content_encoding, + content_language, + content_md5, + cache_control, + x_ms_blob_content_type, + x_ms_blob_content_encoding, + x_ms_blob_content_language, + x_ms_blob_content_md5, + x_ms_blob_cache_control, + x_ms_meta_name_values, + x_ms_lease_id) + + if progress_callback: + progress_callback(count, count) + else: + stream = BytesIO(blob) + stream.seek(index) + + self.put_block_blob_from_file(container_name, + blob_name, + stream, + count, + content_encoding, + content_language, + content_md5, + cache_control, + x_ms_blob_content_type, + x_ms_blob_content_encoding, + x_ms_blob_content_language, + x_ms_blob_content_md5, + x_ms_blob_cache_control, + x_ms_meta_name_values, + x_ms_lease_id, + progress_callback) + + def put_block_blob_from_text(self, container_name, blob_name, text, + text_encoding='utf-8', + content_encoding=None, content_language=None, + content_md5=None, cache_control=None, + x_ms_blob_content_type=None, + x_ms_blob_content_encoding=None, + x_ms_blob_content_language=None, + x_ms_blob_content_md5=None, + x_ms_blob_cache_control=None, + x_ms_meta_name_values=None, + x_ms_lease_id=None, progress_callback=None): + ''' + Creates a new block blob from str/unicode, or updates the content of an + existing block blob, with automatic chunking and progress notifications. + + container_name: Name of existing container. + blob_name: Name of blob to create or update. + text: Text to upload to the blob. + text_encoding: Encoding to use to convert the text to bytes. + content_encoding: + Optional. Specifies which content encodings have been applied to + the blob. This value is returned to the client when the Get Blob + (REST API) operation is performed on the blob resource. The client + can use this value when returned to decode the blob content. + content_language: + Optional. Specifies the natural languages used by this resource. + content_md5: + Optional. An MD5 hash of the blob content. This hash is used to + verify the integrity of the blob during transport. When this header + is specified, the storage service checks the hash that has arrived + with the one that was sent. If the two hashes do not match, the + operation will fail with error code 400 (Bad Request). + cache_control: + Optional. The Blob service stores this value but does not use or + modify it. + x_ms_blob_content_type: Optional. Set the blob's content type. + x_ms_blob_content_encoding: Optional. Set the blob's content encoding. + x_ms_blob_content_language: Optional. Set the blob's content language. + x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. + x_ms_blob_cache_control: Optional. Sets the blob's cache control. + x_ms_meta_name_values: A dict containing name, value for metadata. + x_ms_lease_id: Required if the blob has an active lease. + progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('text', text) + + if not isinstance(text, bytes): + _validate_not_none('text_encoding', text_encoding) + text = text.encode(text_encoding) + + self.put_block_blob_from_bytes(container_name, + blob_name, + text, + 0, + len(text), + content_encoding, + content_language, + content_md5, + cache_control, + x_ms_blob_content_type, + x_ms_blob_content_encoding, + x_ms_blob_content_language, + x_ms_blob_content_md5, + x_ms_blob_cache_control, + x_ms_meta_name_values, + x_ms_lease_id, + progress_callback) + + def put_page_blob_from_path(self, container_name, blob_name, file_path, + content_encoding=None, content_language=None, + content_md5=None, cache_control=None, + x_ms_blob_content_type=None, + x_ms_blob_content_encoding=None, + x_ms_blob_content_language=None, + x_ms_blob_content_md5=None, + x_ms_blob_cache_control=None, + x_ms_meta_name_values=None, + x_ms_lease_id=None, + x_ms_blob_sequence_number=None, + progress_callback=None): + ''' + Creates a new page blob from a file path, or updates the content of an + existing page blob, with automatic chunking and progress notifications. + + container_name: Name of existing container. + blob_name: Name of blob to create or update. + file_path: Path of the file to upload as the blob content. + content_encoding: + Optional. Specifies which content encodings have been applied to + the blob. This value is returned to the client when the Get Blob + (REST API) operation is performed on the blob resource. The client + can use this value when returned to decode the blob content. + content_language: + Optional. Specifies the natural languages used by this resource. + content_md5: + Optional. An MD5 hash of the blob content. This hash is used to + verify the integrity of the blob during transport. When this header + is specified, the storage service checks the hash that has arrived + with the one that was sent. If the two hashes do not match, the + operation will fail with error code 400 (Bad Request). + cache_control: + Optional. The Blob service stores this value but does not use or + modify it. + x_ms_blob_content_type: Optional. Set the blob's content type. + x_ms_blob_content_encoding: Optional. Set the blob's content encoding. + x_ms_blob_content_language: Optional. Set the blob's content language. + x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. + x_ms_blob_cache_control: Optional. Sets the blob's cache control. + x_ms_meta_name_values: A dict containing name, value for metadata. + x_ms_lease_id: Required if the blob has an active lease. + x_ms_blob_sequence_number: + Optional. Set for page blobs only. The sequence number is a + user-controlled value that you can use to track requests. The + value of the sequence number must be between 0 and 2^63 - 1. The + default value is 0. + progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('file_path', file_path) + + count = path.getsize(file_path) + with open(file_path, 'rb') as stream: + self.put_page_blob_from_file(container_name, + blob_name, + stream, + count, + content_encoding, + content_language, + content_md5, + cache_control, + x_ms_blob_content_type, + x_ms_blob_content_encoding, + x_ms_blob_content_language, + x_ms_blob_content_md5, + x_ms_blob_cache_control, + x_ms_meta_name_values, + x_ms_lease_id, + x_ms_blob_sequence_number, + progress_callback) + + def put_page_blob_from_file(self, container_name, blob_name, stream, count, + content_encoding=None, content_language=None, + content_md5=None, cache_control=None, + x_ms_blob_content_type=None, + x_ms_blob_content_encoding=None, + x_ms_blob_content_language=None, + x_ms_blob_content_md5=None, + x_ms_blob_cache_control=None, + x_ms_meta_name_values=None, + x_ms_lease_id=None, + x_ms_blob_sequence_number=None, + progress_callback=None): + ''' + Creates a new page blob from a file/stream, or updates the content of an + existing page blob, with automatic chunking and progress notifications. + + container_name: Name of existing container. + blob_name: Name of blob to create or update. + stream: Opened file/stream to upload as the blob content. + count: + Number of bytes to read from the stream. This is required, a page + blob cannot be created if the count is unknown. + content_encoding: + Optional. Specifies which content encodings have been applied to + the blob. This value is returned to the client when the Get Blob + (REST API) operation is performed on the blob resource. The client + can use this value when returned to decode the blob content. + content_language: + Optional. Specifies the natural languages used by this resource. + content_md5: + Optional. An MD5 hash of the blob content. This hash is used to + verify the integrity of the blob during transport. When this header + is specified, the storage service checks the hash that has arrived + with the one that was sent. If the two hashes do not match, the + operation will fail with error code 400 (Bad Request). + cache_control: + Optional. The Blob service stores this value but does not use or + modify it. + x_ms_blob_content_type: Optional. Set the blob's content type. + x_ms_blob_content_encoding: Optional. Set the blob's content encoding. + x_ms_blob_content_language: Optional. Set the blob's content language. + x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. + x_ms_blob_cache_control: Optional. Sets the blob's cache control. + x_ms_meta_name_values: A dict containing name, value for metadata. + x_ms_lease_id: Required if the blob has an active lease. + x_ms_blob_sequence_number: + Optional. Set for page blobs only. The sequence number is a + user-controlled value that you can use to track requests. The + value of the sequence number must be between 0 and 2^63 - 1. The + default value is 0. + progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('stream', stream) + _validate_not_none('count', count) + + if count < 0: + raise TypeError(_ERROR_VALUE_NEGATIVE.format('count')) + + if count % _PAGE_SIZE != 0: + raise TypeError(_ERROR_PAGE_BLOB_SIZE_ALIGNMENT.format(count)) + + if progress_callback: + progress_callback(0, count) + + self.put_blob(container_name, + blob_name, + b'', + 'PageBlob', + content_encoding, + content_language, + content_md5, + cache_control, + x_ms_blob_content_type, + x_ms_blob_content_encoding, + x_ms_blob_content_language, + x_ms_blob_content_md5, + x_ms_blob_cache_control, + x_ms_meta_name_values, + x_ms_lease_id, + count, + x_ms_blob_sequence_number) + + remain_bytes = count + page_start = 0 + while True: + request_count = min(remain_bytes, self._BLOB_MAX_CHUNK_DATA_SIZE) + data = stream.read(request_count) + if data: + length = len(data) + remain_bytes = remain_bytes - length + page_end = page_start + length - 1 + self.put_page(container_name, + blob_name, + data, + 'bytes={0}-{1}'.format(page_start, page_end), + 'update', + x_ms_lease_id=x_ms_lease_id) + page_start = page_start + length + + if progress_callback: + progress_callback(page_start, count) + else: + break + + def put_page_blob_from_bytes(self, container_name, blob_name, blob, + index=0, count=None, content_encoding=None, + content_language=None, content_md5=None, + cache_control=None, + x_ms_blob_content_type=None, + x_ms_blob_content_encoding=None, + x_ms_blob_content_language=None, + x_ms_blob_content_md5=None, + x_ms_blob_cache_control=None, + x_ms_meta_name_values=None, + x_ms_lease_id=None, + x_ms_blob_sequence_number=None, + progress_callback=None): + ''' + Creates a new page blob from an array of bytes, or updates the content + of an existing page blob, with automatic chunking and progress + notifications. + + container_name: Name of existing container. + blob_name: Name of blob to create or update. + blob: Content of blob as an array of bytes. + index: Start index in the array of bytes. + count: + Number of bytes to upload. Set to None or negative value to upload + all bytes starting from index. + content_encoding: + Optional. Specifies which content encodings have been applied to + the blob. This value is returned to the client when the Get Blob + (REST API) operation is performed on the blob resource. The client + can use this value when returned to decode the blob content. + content_language: + Optional. Specifies the natural languages used by this resource. + content_md5: + Optional. An MD5 hash of the blob content. This hash is used to + verify the integrity of the blob during transport. When this header + is specified, the storage service checks the hash that has arrived + with the one that was sent. If the two hashes do not match, the + operation will fail with error code 400 (Bad Request). + cache_control: + Optional. The Blob service stores this value but does not use or + modify it. + x_ms_blob_content_type: Optional. Set the blob's content type. + x_ms_blob_content_encoding: Optional. Set the blob's content encoding. + x_ms_blob_content_language: Optional. Set the blob's content language. + x_ms_blob_content_md5: Optional. Set the blob's MD5 hash. + x_ms_blob_cache_control: Optional. Sets the blob's cache control. + x_ms_meta_name_values: A dict containing name, value for metadata. + x_ms_lease_id: Required if the blob has an active lease. + x_ms_blob_sequence_number: + Optional. Set for page blobs only. The sequence number is a + user-controlled value that you can use to track requests. The + value of the sequence number must be between 0 and 2^63 - 1. The + default value is 0. + progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob, or None if the total size is unknown. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('blob', blob) + _validate_type_bytes('blob', blob) + + if index < 0: + raise TypeError(_ERROR_VALUE_NEGATIVE.format('index')) + + if count is None or count < 0: + count = len(blob) - index + + stream = BytesIO(blob) + stream.seek(index) + + self.put_page_blob_from_file(container_name, + blob_name, + stream, + count, + content_encoding, + content_language, + content_md5, + cache_control, + x_ms_blob_content_type, + x_ms_blob_content_encoding, + x_ms_blob_content_language, + x_ms_blob_content_md5, + x_ms_blob_cache_control, + x_ms_meta_name_values, + x_ms_lease_id, + x_ms_blob_sequence_number, + progress_callback) + + def get_blob(self, container_name, blob_name, snapshot=None, + x_ms_range=None, x_ms_lease_id=None, + x_ms_range_get_content_md5=None): + ''' + Reads or downloads a blob from the system, including its metadata and + properties. + + See get_blob_to_* for high level functions that handle the download + of large blobs with automatic chunking and progress notifications. + + container_name: Name of existing container. + blob_name: Name of existing blob. + snapshot: + Optional. The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve. + x_ms_range: + Optional. Return only the bytes of the blob in the specified range. + x_ms_lease_id: Required if the blob has an active lease. + x_ms_range_get_content_md5: + Optional. When this header is set to true and specified together + with the Range header, the service returns the MD5 hash for the + range, as long as the range is less than or equal to 4 MB in size. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' + request.headers = [ + ('x-ms-range', _str_or_none(x_ms_range)), + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), + ('x-ms-range-get-content-md5', + _str_or_none(x_ms_range_get_content_md5)) + ] + request.query = [('snapshot', _str_or_none(snapshot))] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request, None) + + return _create_blob_result(response) + + def get_blob_to_path(self, container_name, blob_name, file_path, + open_mode='wb', snapshot=None, x_ms_lease_id=None, + progress_callback=None): + ''' + Downloads a blob to a file path, with automatic chunking and progress + notifications. + + container_name: Name of existing container. + blob_name: Name of existing blob. + file_path: Path of file to write to. + open_mode: Mode to use when opening the file. + snapshot: + Optional. The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve. + x_ms_lease_id: Required if the blob has an active lease. + progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('file_path', file_path) + _validate_not_none('open_mode', open_mode) + + with open(file_path, open_mode) as stream: + self.get_blob_to_file(container_name, + blob_name, + stream, + snapshot, + x_ms_lease_id, + progress_callback) + + def get_blob_to_file(self, container_name, blob_name, stream, + snapshot=None, x_ms_lease_id=None, + progress_callback=None): + ''' + Downloads a blob to a file/stream, with automatic chunking and progress + notifications. + + container_name: Name of existing container. + blob_name: Name of existing blob. + stream: Opened file/stream to write to. + snapshot: + Optional. The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve. + x_ms_lease_id: Required if the blob has an active lease. + progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('stream', stream) + + props = self.get_blob_properties(container_name, blob_name) + blob_size = int(props['content-length']) + + if blob_size < self._BLOB_MAX_DATA_SIZE: + if progress_callback: + progress_callback(0, blob_size) + + data = self.get_blob(container_name, + blob_name, + snapshot, + x_ms_lease_id=x_ms_lease_id) + + stream.write(data) + + if progress_callback: + progress_callback(blob_size, blob_size) + else: + if progress_callback: + progress_callback(0, blob_size) + + index = 0 + while index < blob_size: + chunk_range = 'bytes={0}-{1}'.format( + index, + index + self._BLOB_MAX_CHUNK_DATA_SIZE - 1) + data = self.get_blob( + container_name, blob_name, x_ms_range=chunk_range) + length = len(data) + index += length + if length > 0: + stream.write(data) + if progress_callback: + progress_callback(index, blob_size) + if length < self._BLOB_MAX_CHUNK_DATA_SIZE: + break + else: + break + + def get_blob_to_bytes(self, container_name, blob_name, snapshot=None, + x_ms_lease_id=None, progress_callback=None): + ''' + Downloads a blob as an array of bytes, with automatic chunking and + progress notifications. + + container_name: Name of existing container. + blob_name: Name of existing blob. + snapshot: + Optional. The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve. + x_ms_lease_id: Required if the blob has an active lease. + progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + + stream = BytesIO() + self.get_blob_to_file(container_name, + blob_name, + stream, + snapshot, + x_ms_lease_id, + progress_callback) + + return stream.getvalue() + + def get_blob_to_text(self, container_name, blob_name, text_encoding='utf-8', + snapshot=None, x_ms_lease_id=None, + progress_callback=None): + ''' + Downloads a blob as unicode text, with automatic chunking and progress + notifications. + + container_name: Name of existing container. + blob_name: Name of existing blob. + text_encoding: Encoding to use when decoding the blob data. + snapshot: + Optional. The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve. + x_ms_lease_id: Required if the blob has an active lease. + progress_callback: + Callback for progress with signature function(current, total) where + current is the number of bytes transfered so far, and total is the + size of the blob. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('text_encoding', text_encoding) + + result = self.get_blob_to_bytes(container_name, + blob_name, + snapshot, + x_ms_lease_id, + progress_callback) + + return result.decode(text_encoding) + + def get_blob_metadata(self, container_name, blob_name, snapshot=None, + x_ms_lease_id=None): + ''' + Returns all user-defined metadata for the specified blob or snapshot. + + container_name: Name of existing container. + blob_name: Name of existing blob. + snapshot: + Optional. The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve. + x_ms_lease_id: Required if the blob has an active lease. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '/' + _str(blob_name) + '?comp=metadata' + request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] + request.query = [('snapshot', _str_or_none(snapshot))] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response_for_dict_prefix(response, prefixes=['x-ms-meta']) + + def set_blob_metadata(self, container_name, blob_name, + x_ms_meta_name_values=None, x_ms_lease_id=None): + ''' + Sets user-defined metadata for the specified blob as one or more + name-value pairs. + + container_name: Name of existing container. + blob_name: Name of existing blob. + x_ms_meta_name_values: Dict containing name and value pairs. + x_ms_lease_id: Required if the blob has an active lease. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '/' + _str(blob_name) + '?comp=metadata' + request.headers = [ + ('x-ms-meta-name-values', x_ms_meta_name_values), + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def lease_blob(self, container_name, blob_name, x_ms_lease_action, + x_ms_lease_id=None, x_ms_lease_duration=60, + x_ms_lease_break_period=None, x_ms_proposed_lease_id=None): + ''' + Establishes and manages a one-minute lock on a blob for write + operations. + + container_name: Name of existing container. + blob_name: Name of existing blob. + x_ms_lease_action: + Required. Possible values: acquire|renew|release|break|change + x_ms_lease_id: Required if the blob has an active lease. + x_ms_lease_duration: + Specifies the duration of the lease, in seconds, or negative one + (-1) for a lease that never expires. A non-infinite lease can be + between 15 and 60 seconds. A lease duration cannot be changed + using renew or change. For backwards compatibility, the default is + 60, and the value is only used on an acquire operation. + x_ms_lease_break_period: + Optional. For a break operation, this is the proposed duration of + seconds that the lease should continue before it is broken, between + 0 and 60 seconds. This break period is only used if it is shorter + than the time remaining on the lease. If longer, the time remaining + on the lease is used. A new lease will not be available before the + break period has expired, but the lease may be held for longer than + the break period. If this header does not appear with a break + operation, a fixed-duration lease breaks after the remaining lease + period elapses, and an infinite lease breaks immediately. + x_ms_proposed_lease_id: + Optional for acquire, required for change. Proposed lease ID, in a + GUID string format. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('x_ms_lease_action', x_ms_lease_action) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '/' + _str(blob_name) + '?comp=lease' + request.headers = [ + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), + ('x-ms-lease-action', _str_or_none(x_ms_lease_action)), + ('x-ms-lease-duration', _str_or_none(x_ms_lease_duration\ + if x_ms_lease_action == 'acquire' else None)), + ('x-ms-lease-break-period', _str_or_none(x_ms_lease_break_period)), + ('x-ms-proposed-lease-id', _str_or_none(x_ms_proposed_lease_id)), + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response_for_dict_filter( + response, + filter=['x-ms-lease-id', 'x-ms-lease-time']) + + def snapshot_blob(self, container_name, blob_name, + x_ms_meta_name_values=None, if_modified_since=None, + if_unmodified_since=None, if_match=None, + if_none_match=None, x_ms_lease_id=None): + ''' + Creates a read-only snapshot of a blob. + + container_name: Name of existing container. + blob_name: Name of existing blob. + x_ms_meta_name_values: Optional. Dict containing name and value pairs. + if_modified_since: Optional. Datetime string. + if_unmodified_since: DateTime string. + if_match: + Optional. snapshot the blob only if its ETag value matches the + value specified. + if_none_match: Optional. An ETag value + x_ms_lease_id: Required if the blob has an active lease. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '/' + _str(blob_name) + '?comp=snapshot' + request.headers = [ + ('x-ms-meta-name-values', x_ms_meta_name_values), + ('If-Modified-Since', _str_or_none(if_modified_since)), + ('If-Unmodified-Since', _str_or_none(if_unmodified_since)), + ('If-Match', _str_or_none(if_match)), + ('If-None-Match', _str_or_none(if_none_match)), + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response_for_dict_filter( + response, + filter=['x-ms-snapshot', 'etag', 'last-modified']) + + def copy_blob(self, container_name, blob_name, x_ms_copy_source, + x_ms_meta_name_values=None, + x_ms_source_if_modified_since=None, + x_ms_source_if_unmodified_since=None, + x_ms_source_if_match=None, x_ms_source_if_none_match=None, + if_modified_since=None, if_unmodified_since=None, + if_match=None, if_none_match=None, x_ms_lease_id=None, + x_ms_source_lease_id=None): + ''' + Copies a blob to a destination within the storage account. + + container_name: Name of existing container. + blob_name: Name of existing blob. + x_ms_copy_source: + URL up to 2 KB in length that specifies a blob. A source blob in + the same account can be private, but a blob in another account + must be public or accept credentials included in this URL, such as + a Shared Access Signature. Examples: + https://myaccount.blob.core.windows.net/mycontainer/myblob + https://myaccount.blob.core.windows.net/mycontainer/myblob?snapshot=<DateTime> + x_ms_meta_name_values: Optional. Dict containing name and value pairs. + x_ms_source_if_modified_since: + Optional. An ETag value. Specify this conditional header to copy + the source blob only if its ETag matches the value specified. + x_ms_source_if_unmodified_since: + Optional. An ETag value. Specify this conditional header to copy + the blob only if its ETag does not match the value specified. + x_ms_source_if_match: + Optional. A DateTime value. Specify this conditional header to + copy the blob only if the source blob has been modified since the + specified date/time. + x_ms_source_if_none_match: + Optional. An ETag value. Specify this conditional header to copy + the source blob only if its ETag matches the value specified. + if_modified_since: Optional. Datetime string. + if_unmodified_since: DateTime string. + if_match: + Optional. Snapshot the blob only if its ETag value matches the + value specified. + if_none_match: Optional. An ETag value + x_ms_lease_id: Required if the blob has an active lease. + x_ms_source_lease_id: + Optional. Specify this to perform the Copy Blob operation only if + the lease ID given matches the active lease ID of the source blob. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('x_ms_copy_source', x_ms_copy_source) + + if x_ms_copy_source.startswith('/'): + # Backwards compatibility for earlier versions of the SDK where + # the copy source can be in the following formats: + # - Blob in named container: + # /accountName/containerName/blobName + # - Snapshot in named container: + # /accountName/containerName/blobName?snapshot=<DateTime> + # - Blob in root container: + # /accountName/blobName + # - Snapshot in root container: + # /accountName/blobName?snapshot=<DateTime> + account, _, source =\ + x_ms_copy_source.partition('/')[2].partition('/') + x_ms_copy_source = self.protocol + '://' + \ + account + self.host_base + '/' + source + + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' + request.headers = [ + ('x-ms-copy-source', _str_or_none(x_ms_copy_source)), + ('x-ms-meta-name-values', x_ms_meta_name_values), + ('x-ms-source-if-modified-since', + _str_or_none(x_ms_source_if_modified_since)), + ('x-ms-source-if-unmodified-since', + _str_or_none(x_ms_source_if_unmodified_since)), + ('x-ms-source-if-match', _str_or_none(x_ms_source_if_match)), + ('x-ms-source-if-none-match', + _str_or_none(x_ms_source_if_none_match)), + ('If-Modified-Since', _str_or_none(if_modified_since)), + ('If-Unmodified-Since', _str_or_none(if_unmodified_since)), + ('If-Match', _str_or_none(if_match)), + ('If-None-Match', _str_or_none(if_none_match)), + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), + ('x-ms-source-lease-id', _str_or_none(x_ms_source_lease_id)) + ] + + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response_for_dict(response) + + def abort_copy_blob(self, container_name, blob_name, x_ms_copy_id, + x_ms_lease_id=None): + ''' + Aborts a pending copy_blob operation, and leaves a destination blob + with zero length and full metadata. + + container_name: Name of destination container. + blob_name: Name of destination blob. + x_ms_copy_id: + Copy identifier provided in the x-ms-copy-id of the original + copy_blob operation. + x_ms_lease_id: + Required if the destination blob has an active infinite lease. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('x_ms_copy_id', x_ms_copy_id) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + _str(container_name) + '/' + \ + _str(blob_name) + '?comp=copy©id=' + \ + _str(x_ms_copy_id) + request.headers = [ + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), + ('x-ms-copy-action', 'abort'), + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def delete_blob(self, container_name, blob_name, snapshot=None, + timeout=None, x_ms_lease_id=None, + x_ms_delete_snapshots=None): + ''' + Marks the specified blob or snapshot for deletion. The blob is later + deleted during garbage collection. + + To mark a specific snapshot for deletion provide the date/time of the + snapshot via the snapshot parameter. + + container_name: Name of existing container. + blob_name: Name of existing blob. + snapshot: + Optional. The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to delete. + timeout: + Optional. The timeout parameter is expressed in seconds. + The Blob service returns an error when the timeout interval elapses + while processing the request. + x_ms_lease_id: Required if the blob has an active lease. + x_ms_delete_snapshots: + Required if the blob has associated snapshots. Specify one of the + following two options: + include: Delete the base blob and all of its snapshots. + only: Delete only the blob's snapshots and not the blob itself. + This header should be specified only for a request against the base + blob resource. If this header is specified on a request to delete + an individual snapshot, the Blob service returns status code 400 + (Bad Request). If this header is not specified on the request and + the blob has associated snapshots, the Blob service returns status + code 409 (Conflict). + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + _str(container_name) + '/' + _str(blob_name) + '' + request.headers = [ + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), + ('x-ms-delete-snapshots', _str_or_none(x_ms_delete_snapshots)) + ] + request.query = [ + ('snapshot', _str_or_none(snapshot)), + ('timeout', _int_or_none(timeout)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def put_block(self, container_name, blob_name, block, blockid, + content_md5=None, x_ms_lease_id=None): + ''' + Creates a new block to be committed as part of a blob. + + container_name: Name of existing container. + blob_name: Name of existing blob. + block: Content of the block. + blockid: + Required. A value that identifies the block. The string must be + less than or equal to 64 bytes in size. + content_md5: + Optional. An MD5 hash of the block content. This hash is used to + verify the integrity of the blob during transport. When this + header is specified, the storage service checks the hash that has + arrived with the one that was sent. + x_ms_lease_id: Required if the blob has an active lease. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('block', block) + _validate_not_none('blockid', blockid) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '/' + _str(blob_name) + '?comp=block' + request.headers = [ + ('Content-MD5', _str_or_none(content_md5)), + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) + ] + request.query = [('blockid', _encode_base64(_str_or_none(blockid)))] + request.body = _get_request_body_bytes_only('block', block) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def put_block_list(self, container_name, blob_name, block_list, + content_md5=None, x_ms_blob_cache_control=None, + x_ms_blob_content_type=None, + x_ms_blob_content_encoding=None, + x_ms_blob_content_language=None, + x_ms_blob_content_md5=None, x_ms_meta_name_values=None, + x_ms_lease_id=None): + ''' + Writes a blob by specifying the list of block IDs that make up the + blob. In order to be written as part of a blob, a block must have been + successfully written to the server in a prior Put Block (REST API) + operation. + + container_name: Name of existing container. + blob_name: Name of existing blob. + block_list: A str list containing the block ids. + content_md5: + Optional. An MD5 hash of the block content. This hash is used to + verify the integrity of the blob during transport. When this header + is specified, the storage service checks the hash that has arrived + with the one that was sent. + x_ms_blob_cache_control: + Optional. Sets the blob's cache control. If specified, this + property is stored with the blob and returned with a read request. + x_ms_blob_content_type: + Optional. Sets the blob's content type. If specified, this property + is stored with the blob and returned with a read request. + x_ms_blob_content_encoding: + Optional. Sets the blob's content encoding. If specified, this + property is stored with the blob and returned with a read request. + x_ms_blob_content_language: + Optional. Set the blob's content language. If specified, this + property is stored with the blob and returned with a read request. + x_ms_blob_content_md5: + Optional. An MD5 hash of the blob content. Note that this hash is + not validated, as the hashes for the individual blocks were + validated when each was uploaded. + x_ms_meta_name_values: Optional. Dict containing name and value pairs. + x_ms_lease_id: Required if the blob has an active lease. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('block_list', block_list) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '/' + _str(blob_name) + '?comp=blocklist' + request.headers = [ + ('Content-MD5', _str_or_none(content_md5)), + ('x-ms-blob-cache-control', _str_or_none(x_ms_blob_cache_control)), + ('x-ms-blob-content-type', _str_or_none(x_ms_blob_content_type)), + ('x-ms-blob-content-encoding', + _str_or_none(x_ms_blob_content_encoding)), + ('x-ms-blob-content-language', + _str_or_none(x_ms_blob_content_language)), + ('x-ms-blob-content-md5', _str_or_none(x_ms_blob_content_md5)), + ('x-ms-meta-name-values', x_ms_meta_name_values), + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) + ] + request.body = _get_request_body( + _convert_block_list_to_xml(block_list)) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def get_block_list(self, container_name, blob_name, snapshot=None, + blocklisttype=None, x_ms_lease_id=None): + ''' + Retrieves the list of blocks that have been uploaded as part of a + block blob. + + container_name: Name of existing container. + blob_name: Name of existing blob. + snapshot: + Optional. Datetime to determine the time to retrieve the blocks. + blocklisttype: + Specifies whether to return the list of committed blocks, the list + of uncommitted blocks, or both lists together. Valid values are: + committed, uncommitted, or all. + x_ms_lease_id: Required if the blob has an active lease. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '/' + _str(blob_name) + '?comp=blocklist' + request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))] + request.query = [ + ('snapshot', _str_or_none(snapshot)), + ('blocklisttype', _str_or_none(blocklisttype)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _convert_response_to_block_list(response) + + def put_page(self, container_name, blob_name, page, x_ms_range, + x_ms_page_write, timeout=None, content_md5=None, + x_ms_lease_id=None, x_ms_if_sequence_number_lte=None, + x_ms_if_sequence_number_lt=None, + x_ms_if_sequence_number_eq=None, + if_modified_since=None, if_unmodified_since=None, + if_match=None, if_none_match=None): + ''' + Writes a range of pages to a page blob. + + container_name: Name of existing container. + blob_name: Name of existing blob. + page: Content of the page. + x_ms_range: + Required. Specifies the range of bytes to be written as a page. + Both the start and end of the range must be specified. Must be in + format: bytes=startByte-endByte. Given that pages must be aligned + with 512-byte boundaries, the start offset must be a modulus of + 512 and the end offset must be a modulus of 512-1. Examples of + valid byte ranges are 0-511, 512-1023, etc. + x_ms_page_write: + Required. You may specify one of the following options: + update (lower case): + Writes the bytes specified by the request body into the + specified range. The Range and Content-Length headers must + match to perform the update. + clear (lower case): + Clears the specified range and releases the space used in + storage for that range. To clear a range, set the + Content-Length header to zero, and the Range header to a + value that indicates the range to clear, up to maximum + blob size. + timeout: the timeout parameter is expressed in seconds. + content_md5: + Optional. An MD5 hash of the page content. This hash is used to + verify the integrity of the page during transport. When this header + is specified, the storage service compares the hash of the content + that has arrived with the header value that was sent. If the two + hashes do not match, the operation will fail with error code 400 + (Bad Request). + x_ms_lease_id: Required if the blob has an active lease. + x_ms_if_sequence_number_lte: + Optional. If the blob's sequence number is less than or equal to + the specified value, the request proceeds; otherwise it fails. + x_ms_if_sequence_number_lt: + Optional. If the blob's sequence number is less than the specified + value, the request proceeds; otherwise it fails. + x_ms_if_sequence_number_eq: + Optional. If the blob's sequence number is equal to the specified + value, the request proceeds; otherwise it fails. + if_modified_since: + Optional. A DateTime value. Specify this conditional header to + write the page only if the blob has been modified since the + specified date/time. If the blob has not been modified, the Blob + service fails. + if_unmodified_since: + Optional. A DateTime value. Specify this conditional header to + write the page only if the blob has not been modified since the + specified date/time. If the blob has been modified, the Blob + service fails. + if_match: + Optional. An ETag value. Specify an ETag value for this conditional + header to write the page only if the blob's ETag value matches the + value specified. If the values do not match, the Blob service fails. + if_none_match: + Optional. An ETag value. Specify an ETag value for this conditional + header to write the page only if the blob's ETag value does not + match the value specified. If the values are identical, the Blob + service fails. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + _validate_not_none('page', page) + _validate_not_none('x_ms_range', x_ms_range) + _validate_not_none('x_ms_page_write', x_ms_page_write) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '/' + _str(blob_name) + '?comp=page' + request.headers = [ + ('x-ms-range', _str_or_none(x_ms_range)), + ('Content-MD5', _str_or_none(content_md5)), + ('x-ms-page-write', _str_or_none(x_ms_page_write)), + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)), + ('x-ms-if-sequence-number-le', + _str_or_none(x_ms_if_sequence_number_lte)), + ('x-ms-if-sequence-number-lt', + _str_or_none(x_ms_if_sequence_number_lt)), + ('x-ms-if-sequence-number-eq', + _str_or_none(x_ms_if_sequence_number_eq)), + ('If-Modified-Since', _str_or_none(if_modified_since)), + ('If-Unmodified-Since', _str_or_none(if_unmodified_since)), + ('If-Match', _str_or_none(if_match)), + ('If-None-Match', _str_or_none(if_none_match)) + ] + request.query = [('timeout', _int_or_none(timeout))] + request.body = _get_request_body_bytes_only('page', page) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def get_page_ranges(self, container_name, blob_name, snapshot=None, + range=None, x_ms_range=None, x_ms_lease_id=None): + ''' + Retrieves the page ranges for a blob. + + container_name: Name of existing container. + blob_name: Name of existing blob. + snapshot: + Optional. The snapshot parameter is an opaque DateTime value that, + when present, specifies the blob snapshot to retrieve information + from. + range: + Optional. Specifies the range of bytes over which to list ranges, + inclusively. If omitted, then all ranges for the blob are returned. + x_ms_range: + Optional. Specifies the range of bytes to be written as a page. + Both the start and end of the range must be specified. Must be in + format: bytes=startByte-endByte. Given that pages must be aligned + with 512-byte boundaries, the start offset must be a modulus of + 512 and the end offset must be a modulus of 512-1. Examples of + valid byte ranges are 0-511, 512-1023, etc. + x_ms_lease_id: Required if the blob has an active lease. + ''' + _validate_not_none('container_name', container_name) + _validate_not_none('blob_name', blob_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + \ + _str(container_name) + '/' + _str(blob_name) + '?comp=pagelist' + request.headers = [ + ('Range', _str_or_none(range)), + ('x-ms-range', _str_or_none(x_ms_range)), + ('x-ms-lease-id', _str_or_none(x_ms_lease_id)) + ] + request.query = [('snapshot', _str_or_none(snapshot))] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_blob_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_simple_list(response, PageList, PageRange, "page_ranges") diff --git a/awx/lib/site-packages/azure/storage/cloudstorageaccount.py b/awx/lib/site-packages/azure/storage/cloudstorageaccount.py index e043f898cd..4cca4c45b3 100644 --- a/awx/lib/site-packages/azure/storage/cloudstorageaccount.py +++ b/awx/lib/site-packages/azure/storage/cloudstorageaccount.py @@ -1,39 +1,39 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -from azure.storage.blobservice import BlobService -from azure.storage.tableservice import TableService -from azure.storage.queueservice import QueueService - - -class CloudStorageAccount(object): - - """ - Provides a factory for creating the blob, queue, and table services - with a common account name and account key. Users can either use the - factory or can construct the appropriate service directly. - """ - - def __init__(self, account_name=None, account_key=None): - self.account_name = account_name - self.account_key = account_key - - def create_blob_service(self): - return BlobService(self.account_name, self.account_key) - - def create_table_service(self): - return TableService(self.account_name, self.account_key) - - def create_queue_service(self): - return QueueService(self.account_name, self.account_key) +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +from azure.storage.blobservice import BlobService +from azure.storage.tableservice import TableService +from azure.storage.queueservice import QueueService + + +class CloudStorageAccount(object): + + """ + Provides a factory for creating the blob, queue, and table services + with a common account name and account key. Users can either use the + factory or can construct the appropriate service directly. + """ + + def __init__(self, account_name=None, account_key=None): + self.account_name = account_name + self.account_key = account_key + + def create_blob_service(self): + return BlobService(self.account_name, self.account_key) + + def create_table_service(self): + return TableService(self.account_name, self.account_key) + + def create_queue_service(self): + return QueueService(self.account_name, self.account_key) diff --git a/awx/lib/site-packages/azure/storage/queueservice.py b/awx/lib/site-packages/azure/storage/queueservice.py index fdde5fafd9..bfcb47a2de 100644 --- a/awx/lib/site-packages/azure/storage/queueservice.py +++ b/awx/lib/site-packages/azure/storage/queueservice.py @@ -1,458 +1,458 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -from azure import ( - WindowsAzureConflictError, - WindowsAzureError, - DEV_QUEUE_HOST, - QUEUE_SERVICE_HOST_BASE, - xml_escape, - _convert_class_to_xml, - _dont_fail_not_exist, - _dont_fail_on_exist, - _get_request_body, - _int_or_none, - _parse_enum_results_list, - _parse_response, - _parse_response_for_dict_filter, - _parse_response_for_dict_prefix, - _str, - _str_or_none, - _update_request_uri_query_local_storage, - _validate_not_none, - _ERROR_CONFLICT, - ) -from azure.http import ( - HTTPRequest, - HTTP_RESPONSE_NO_CONTENT, - ) -from azure.storage import ( - Queue, - QueueEnumResults, - QueueMessagesList, - StorageServiceProperties, - _update_storage_queue_header, - ) -from azure.storage.storageclient import _StorageClient - - -class QueueService(_StorageClient): - - ''' - This is the main class managing queue resources. - ''' - - def __init__(self, account_name=None, account_key=None, protocol='https', - host_base=QUEUE_SERVICE_HOST_BASE, dev_host=DEV_QUEUE_HOST): - ''' - account_name: your storage account name, required for all operations. - account_key: your storage account key, required for all operations. - protocol: Optional. Protocol. Defaults to http. - host_base: - Optional. Live host base url. Defaults to Azure url. Override this - for on-premise. - dev_host: Optional. Dev host url. Defaults to localhost. - ''' - super(QueueService, self).__init__( - account_name, account_key, protocol, host_base, dev_host) - - def get_queue_service_properties(self, timeout=None): - ''' - Gets the properties of a storage account's Queue Service, including - Windows Azure Storage Analytics. - - timeout: Optional. The timeout parameter is expressed in seconds. - ''' - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/?restype=service&comp=properties' - request.query = [('timeout', _int_or_none(timeout))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response(response, StorageServiceProperties) - - def list_queues(self, prefix=None, marker=None, maxresults=None, - include=None): - ''' - Lists all of the queues in a given storage account. - - prefix: - Filters the results to return only queues with names that begin - with the specified prefix. - marker: - A string value that identifies the portion of the list to be - returned with the next list operation. The operation returns a - NextMarker element within the response body if the list returned - was not complete. This value may then be used as a query parameter - in a subsequent call to request the next portion of the list of - queues. The marker value is opaque to the client. - maxresults: - Specifies the maximum number of queues to return. If maxresults is - not specified, the server will return up to 5,000 items. - include: - Optional. Include this parameter to specify that the container's - metadata be returned as part of the response body. - ''' - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/?comp=list' - request.query = [ - ('prefix', _str_or_none(prefix)), - ('marker', _str_or_none(marker)), - ('maxresults', _int_or_none(maxresults)), - ('include', _str_or_none(include)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_enum_results_list( - response, QueueEnumResults, "Queues", Queue) - - def create_queue(self, queue_name, x_ms_meta_name_values=None, - fail_on_exist=False): - ''' - Creates a queue under the given account. - - queue_name: name of the queue. - x_ms_meta_name_values: - Optional. A dict containing name-value pairs to associate with the - queue as metadata. - fail_on_exist: Specify whether throw exception when queue exists. - ''' - _validate_not_none('queue_name', queue_name) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '' - request.headers = [('x-ms-meta-name-values', x_ms_meta_name_values)] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - if not fail_on_exist: - try: - response = self._perform_request(request) - if response.status == HTTP_RESPONSE_NO_CONTENT: - return False - return True - except WindowsAzureError as ex: - _dont_fail_on_exist(ex) - return False - else: - response = self._perform_request(request) - if response.status == HTTP_RESPONSE_NO_CONTENT: - raise WindowsAzureConflictError( - _ERROR_CONFLICT.format(response.message)) - return True - - def delete_queue(self, queue_name, fail_not_exist=False): - ''' - Permanently deletes the specified queue. - - queue_name: Name of the queue. - fail_not_exist: - Specify whether throw exception when queue doesn't exist. - ''' - _validate_not_none('queue_name', queue_name) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '' - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - if not fail_not_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_not_exist(ex) - return False - else: - self._perform_request(request) - return True - - def get_queue_metadata(self, queue_name): - ''' - Retrieves user-defined metadata and queue properties on the specified - queue. Metadata is associated with the queue as name-values pairs. - - queue_name: Name of the queue. - ''' - _validate_not_none('queue_name', queue_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '?comp=metadata' - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response_for_dict_prefix( - response, - prefixes=['x-ms-meta', 'x-ms-approximate-messages-count']) - - def set_queue_metadata(self, queue_name, x_ms_meta_name_values=None): - ''' - Sets user-defined metadata on the specified queue. Metadata is - associated with the queue as name-value pairs. - - queue_name: Name of the queue. - x_ms_meta_name_values: - Optional. A dict containing name-value pairs to associate with the - queue as metadata. - ''' - _validate_not_none('queue_name', queue_name) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '?comp=metadata' - request.headers = [('x-ms-meta-name-values', x_ms_meta_name_values)] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def put_message(self, queue_name, message_text, visibilitytimeout=None, - messagettl=None): - ''' - Adds a new message to the back of the message queue. A visibility - timeout can also be specified to make the message invisible until the - visibility timeout expires. A message must be in a format that can be - included in an XML request with UTF-8 encoding. The encoded message can - be up to 64KB in size for versions 2011-08-18 and newer, or 8KB in size - for previous versions. - - queue_name: Name of the queue. - message_text: Message content. - visibilitytimeout: - Optional. If not specified, the default value is 0. Specifies the - new visibility timeout value, in seconds, relative to server time. - The new value must be larger than or equal to 0, and cannot be - larger than 7 days. The visibility timeout of a message cannot be - set to a value later than the expiry time. visibilitytimeout - should be set to a value smaller than the time-to-live value. - messagettl: - Optional. Specifies the time-to-live interval for the message, in - seconds. The maximum time-to-live allowed is 7 days. If this - parameter is omitted, the default time-to-live is 7 days. - ''' - _validate_not_none('queue_name', queue_name) - _validate_not_none('message_text', message_text) - request = HTTPRequest() - request.method = 'POST' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '/messages' - request.query = [ - ('visibilitytimeout', _str_or_none(visibilitytimeout)), - ('messagettl', _str_or_none(messagettl)) - ] - request.body = _get_request_body( - '<?xml version="1.0" encoding="utf-8"?> \ -<QueueMessage> \ - <MessageText>' + xml_escape(_str(message_text)) + '</MessageText> \ -</QueueMessage>') - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def get_messages(self, queue_name, numofmessages=None, - visibilitytimeout=None): - ''' - Retrieves one or more messages from the front of the queue. - - queue_name: Name of the queue. - numofmessages: - Optional. A nonzero integer value that specifies the number of - messages to retrieve from the queue, up to a maximum of 32. If - fewer are visible, the visible messages are returned. By default, - a single message is retrieved from the queue with this operation. - visibilitytimeout: - Specifies the new visibility timeout value, in seconds, relative - to server time. The new value must be larger than or equal to 1 - second, and cannot be larger than 7 days, or larger than 2 hours - on REST protocol versions prior to version 2011-08-18. The - visibility timeout of a message can be set to a value later than - the expiry time. - ''' - _validate_not_none('queue_name', queue_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '/messages' - request.query = [ - ('numofmessages', _str_or_none(numofmessages)), - ('visibilitytimeout', _str_or_none(visibilitytimeout)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response(response, QueueMessagesList) - - def peek_messages(self, queue_name, numofmessages=None): - ''' - Retrieves one or more messages from the front of the queue, but does - not alter the visibility of the message. - - queue_name: Name of the queue. - numofmessages: - Optional. A nonzero integer value that specifies the number of - messages to peek from the queue, up to a maximum of 32. By default, - a single message is peeked from the queue with this operation. - ''' - _validate_not_none('queue_name', queue_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '/messages?peekonly=true' - request.query = [('numofmessages', _str_or_none(numofmessages))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response(response, QueueMessagesList) - - def delete_message(self, queue_name, message_id, popreceipt): - ''' - Deletes the specified message. - - queue_name: Name of the queue. - message_id: Message to delete. - popreceipt: - Required. A valid pop receipt value returned from an earlier call - to the Get Messages or Update Message operation. - ''' - _validate_not_none('queue_name', queue_name) - _validate_not_none('message_id', message_id) - _validate_not_none('popreceipt', popreceipt) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + \ - _str(queue_name) + '/messages/' + _str(message_id) + '' - request.query = [('popreceipt', _str_or_none(popreceipt))] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def clear_messages(self, queue_name): - ''' - Deletes all messages from the specified queue. - - queue_name: Name of the queue. - ''' - _validate_not_none('queue_name', queue_name) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + _str(queue_name) + '/messages' - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - self._perform_request(request) - - def update_message(self, queue_name, message_id, message_text, popreceipt, - visibilitytimeout): - ''' - Updates the visibility timeout of a message. You can also use this - operation to update the contents of a message. - - queue_name: Name of the queue. - message_id: Message to update. - message_text: Content of message. - popreceipt: - Required. A valid pop receipt value returned from an earlier call - to the Get Messages or Update Message operation. - visibilitytimeout: - Required. Specifies the new visibility timeout value, in seconds, - relative to server time. The new value must be larger than or equal - to 0, and cannot be larger than 7 days. The visibility timeout of a - message cannot be set to a value later than the expiry time. A - message can be updated until it has been deleted or has expired. - ''' - _validate_not_none('queue_name', queue_name) - _validate_not_none('message_id', message_id) - _validate_not_none('message_text', message_text) - _validate_not_none('popreceipt', popreceipt) - _validate_not_none('visibilitytimeout', visibilitytimeout) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(queue_name) + '/messages/' + _str(message_id) + '' - request.query = [ - ('popreceipt', _str_or_none(popreceipt)), - ('visibilitytimeout', _str_or_none(visibilitytimeout)) - ] - request.body = _get_request_body( - '<?xml version="1.0" encoding="utf-8"?> \ -<QueueMessage> \ - <MessageText>' + xml_escape(_str(message_text)) + '</MessageText> \ -</QueueMessage>') - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - response = self._perform_request(request) - - return _parse_response_for_dict_filter( - response, - filter=['x-ms-popreceipt', 'x-ms-time-next-visible']) - - def set_queue_service_properties(self, storage_service_properties, - timeout=None): - ''' - Sets the properties of a storage account's Queue service, including - Windows Azure Storage Analytics. - - storage_service_properties: StorageServiceProperties object. - timeout: Optional. The timeout parameter is expressed in seconds. - ''' - _validate_not_none('storage_service_properties', - storage_service_properties) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/?restype=service&comp=properties' - request.query = [('timeout', _int_or_none(timeout))] - request.body = _get_request_body( - _convert_class_to_xml(storage_service_properties)) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_queue_header( - request, self.account_name, self.account_key) - self._perform_request(request) +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +from azure import ( + WindowsAzureConflictError, + WindowsAzureError, + DEV_QUEUE_HOST, + QUEUE_SERVICE_HOST_BASE, + xml_escape, + _convert_class_to_xml, + _dont_fail_not_exist, + _dont_fail_on_exist, + _get_request_body, + _int_or_none, + _parse_enum_results_list, + _parse_response, + _parse_response_for_dict_filter, + _parse_response_for_dict_prefix, + _str, + _str_or_none, + _update_request_uri_query_local_storage, + _validate_not_none, + _ERROR_CONFLICT, + ) +from azure.http import ( + HTTPRequest, + HTTP_RESPONSE_NO_CONTENT, + ) +from azure.storage import ( + Queue, + QueueEnumResults, + QueueMessagesList, + StorageServiceProperties, + _update_storage_queue_header, + ) +from azure.storage.storageclient import _StorageClient + + +class QueueService(_StorageClient): + + ''' + This is the main class managing queue resources. + ''' + + def __init__(self, account_name=None, account_key=None, protocol='https', + host_base=QUEUE_SERVICE_HOST_BASE, dev_host=DEV_QUEUE_HOST): + ''' + account_name: your storage account name, required for all operations. + account_key: your storage account key, required for all operations. + protocol: Optional. Protocol. Defaults to http. + host_base: + Optional. Live host base url. Defaults to Azure url. Override this + for on-premise. + dev_host: Optional. Dev host url. Defaults to localhost. + ''' + super(QueueService, self).__init__( + account_name, account_key, protocol, host_base, dev_host) + + def get_queue_service_properties(self, timeout=None): + ''' + Gets the properties of a storage account's Queue Service, including + Windows Azure Storage Analytics. + + timeout: Optional. The timeout parameter is expressed in seconds. + ''' + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/?restype=service&comp=properties' + request.query = [('timeout', _int_or_none(timeout))] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response(response, StorageServiceProperties) + + def list_queues(self, prefix=None, marker=None, maxresults=None, + include=None): + ''' + Lists all of the queues in a given storage account. + + prefix: + Filters the results to return only queues with names that begin + with the specified prefix. + marker: + A string value that identifies the portion of the list to be + returned with the next list operation. The operation returns a + NextMarker element within the response body if the list returned + was not complete. This value may then be used as a query parameter + in a subsequent call to request the next portion of the list of + queues. The marker value is opaque to the client. + maxresults: + Specifies the maximum number of queues to return. If maxresults is + not specified, the server will return up to 5,000 items. + include: + Optional. Include this parameter to specify that the container's + metadata be returned as part of the response body. + ''' + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/?comp=list' + request.query = [ + ('prefix', _str_or_none(prefix)), + ('marker', _str_or_none(marker)), + ('maxresults', _int_or_none(maxresults)), + ('include', _str_or_none(include)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_enum_results_list( + response, QueueEnumResults, "Queues", Queue) + + def create_queue(self, queue_name, x_ms_meta_name_values=None, + fail_on_exist=False): + ''' + Creates a queue under the given account. + + queue_name: name of the queue. + x_ms_meta_name_values: + Optional. A dict containing name-value pairs to associate with the + queue as metadata. + fail_on_exist: Specify whether throw exception when queue exists. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '' + request.headers = [('x-ms-meta-name-values', x_ms_meta_name_values)] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + if not fail_on_exist: + try: + response = self._perform_request(request) + if response.status == HTTP_RESPONSE_NO_CONTENT: + return False + return True + except WindowsAzureError as ex: + _dont_fail_on_exist(ex) + return False + else: + response = self._perform_request(request) + if response.status == HTTP_RESPONSE_NO_CONTENT: + raise WindowsAzureConflictError( + _ERROR_CONFLICT.format(response.message)) + return True + + def delete_queue(self, queue_name, fail_not_exist=False): + ''' + Permanently deletes the specified queue. + + queue_name: Name of the queue. + fail_not_exist: + Specify whether throw exception when queue doesn't exist. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '' + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + if not fail_not_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_not_exist(ex) + return False + else: + self._perform_request(request) + return True + + def get_queue_metadata(self, queue_name): + ''' + Retrieves user-defined metadata and queue properties on the specified + queue. Metadata is associated with the queue as name-values pairs. + + queue_name: Name of the queue. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '?comp=metadata' + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response_for_dict_prefix( + response, + prefixes=['x-ms-meta', 'x-ms-approximate-messages-count']) + + def set_queue_metadata(self, queue_name, x_ms_meta_name_values=None): + ''' + Sets user-defined metadata on the specified queue. Metadata is + associated with the queue as name-value pairs. + + queue_name: Name of the queue. + x_ms_meta_name_values: + Optional. A dict containing name-value pairs to associate with the + queue as metadata. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '?comp=metadata' + request.headers = [('x-ms-meta-name-values', x_ms_meta_name_values)] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def put_message(self, queue_name, message_text, visibilitytimeout=None, + messagettl=None): + ''' + Adds a new message to the back of the message queue. A visibility + timeout can also be specified to make the message invisible until the + visibility timeout expires. A message must be in a format that can be + included in an XML request with UTF-8 encoding. The encoded message can + be up to 64KB in size for versions 2011-08-18 and newer, or 8KB in size + for previous versions. + + queue_name: Name of the queue. + message_text: Message content. + visibilitytimeout: + Optional. If not specified, the default value is 0. Specifies the + new visibility timeout value, in seconds, relative to server time. + The new value must be larger than or equal to 0, and cannot be + larger than 7 days. The visibility timeout of a message cannot be + set to a value later than the expiry time. visibilitytimeout + should be set to a value smaller than the time-to-live value. + messagettl: + Optional. Specifies the time-to-live interval for the message, in + seconds. The maximum time-to-live allowed is 7 days. If this + parameter is omitted, the default time-to-live is 7 days. + ''' + _validate_not_none('queue_name', queue_name) + _validate_not_none('message_text', message_text) + request = HTTPRequest() + request.method = 'POST' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '/messages' + request.query = [ + ('visibilitytimeout', _str_or_none(visibilitytimeout)), + ('messagettl', _str_or_none(messagettl)) + ] + request.body = _get_request_body( + '<?xml version="1.0" encoding="utf-8"?> \ +<QueueMessage> \ + <MessageText>' + xml_escape(_str(message_text)) + '</MessageText> \ +</QueueMessage>') + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def get_messages(self, queue_name, numofmessages=None, + visibilitytimeout=None): + ''' + Retrieves one or more messages from the front of the queue. + + queue_name: Name of the queue. + numofmessages: + Optional. A nonzero integer value that specifies the number of + messages to retrieve from the queue, up to a maximum of 32. If + fewer are visible, the visible messages are returned. By default, + a single message is retrieved from the queue with this operation. + visibilitytimeout: + Specifies the new visibility timeout value, in seconds, relative + to server time. The new value must be larger than or equal to 1 + second, and cannot be larger than 7 days, or larger than 2 hours + on REST protocol versions prior to version 2011-08-18. The + visibility timeout of a message can be set to a value later than + the expiry time. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '/messages' + request.query = [ + ('numofmessages', _str_or_none(numofmessages)), + ('visibilitytimeout', _str_or_none(visibilitytimeout)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response(response, QueueMessagesList) + + def peek_messages(self, queue_name, numofmessages=None): + ''' + Retrieves one or more messages from the front of the queue, but does + not alter the visibility of the message. + + queue_name: Name of the queue. + numofmessages: + Optional. A nonzero integer value that specifies the number of + messages to peek from the queue, up to a maximum of 32. By default, + a single message is peeked from the queue with this operation. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '/messages?peekonly=true' + request.query = [('numofmessages', _str_or_none(numofmessages))] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response(response, QueueMessagesList) + + def delete_message(self, queue_name, message_id, popreceipt): + ''' + Deletes the specified message. + + queue_name: Name of the queue. + message_id: Message to delete. + popreceipt: + Required. A valid pop receipt value returned from an earlier call + to the Get Messages or Update Message operation. + ''' + _validate_not_none('queue_name', queue_name) + _validate_not_none('message_id', message_id) + _validate_not_none('popreceipt', popreceipt) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + \ + _str(queue_name) + '/messages/' + _str(message_id) + '' + request.query = [('popreceipt', _str_or_none(popreceipt))] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def clear_messages(self, queue_name): + ''' + Deletes all messages from the specified queue. + + queue_name: Name of the queue. + ''' + _validate_not_none('queue_name', queue_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + _str(queue_name) + '/messages' + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + self._perform_request(request) + + def update_message(self, queue_name, message_id, message_text, popreceipt, + visibilitytimeout): + ''' + Updates the visibility timeout of a message. You can also use this + operation to update the contents of a message. + + queue_name: Name of the queue. + message_id: Message to update. + message_text: Content of message. + popreceipt: + Required. A valid pop receipt value returned from an earlier call + to the Get Messages or Update Message operation. + visibilitytimeout: + Required. Specifies the new visibility timeout value, in seconds, + relative to server time. The new value must be larger than or equal + to 0, and cannot be larger than 7 days. The visibility timeout of a + message cannot be set to a value later than the expiry time. A + message can be updated until it has been deleted or has expired. + ''' + _validate_not_none('queue_name', queue_name) + _validate_not_none('message_id', message_id) + _validate_not_none('message_text', message_text) + _validate_not_none('popreceipt', popreceipt) + _validate_not_none('visibilitytimeout', visibilitytimeout) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(queue_name) + '/messages/' + _str(message_id) + '' + request.query = [ + ('popreceipt', _str_or_none(popreceipt)), + ('visibilitytimeout', _str_or_none(visibilitytimeout)) + ] + request.body = _get_request_body( + '<?xml version="1.0" encoding="utf-8"?> \ +<QueueMessage> \ + <MessageText>' + xml_escape(_str(message_text)) + '</MessageText> \ +</QueueMessage>') + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + response = self._perform_request(request) + + return _parse_response_for_dict_filter( + response, + filter=['x-ms-popreceipt', 'x-ms-time-next-visible']) + + def set_queue_service_properties(self, storage_service_properties, + timeout=None): + ''' + Sets the properties of a storage account's Queue service, including + Windows Azure Storage Analytics. + + storage_service_properties: StorageServiceProperties object. + timeout: Optional. The timeout parameter is expressed in seconds. + ''' + _validate_not_none('storage_service_properties', + storage_service_properties) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/?restype=service&comp=properties' + request.query = [('timeout', _int_or_none(timeout))] + request.body = _get_request_body( + _convert_class_to_xml(storage_service_properties)) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_queue_header( + request, self.account_name, self.account_key) + self._perform_request(request) diff --git a/awx/lib/site-packages/azure/storage/sharedaccesssignature.py b/awx/lib/site-packages/azure/storage/sharedaccesssignature.py index a882461cd4..a9ec14cc70 100644 --- a/awx/lib/site-packages/azure/storage/sharedaccesssignature.py +++ b/awx/lib/site-packages/azure/storage/sharedaccesssignature.py @@ -1,230 +1,231 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -from azure import url_quote -from azure.storage import _sign_string, X_MS_VERSION - -#------------------------------------------------------------------------- -# Constants for the share access signature -SIGNED_START = 'st' -SIGNED_EXPIRY = 'se' -SIGNED_RESOURCE = 'sr' -SIGNED_PERMISSION = 'sp' -SIGNED_IDENTIFIER = 'si' -SIGNED_SIGNATURE = 'sig' -SIGNED_VERSION = 'sv' -RESOURCE_BLOB = 'b' -RESOURCE_CONTAINER = 'c' -SIGNED_RESOURCE_TYPE = 'resource' -SHARED_ACCESS_PERMISSION = 'permission' - -#-------------------------------------------------------------------------- - - -class WebResource(object): - - ''' - Class that stands for the resource to get the share access signature - - path: the resource path. - properties: dict of name and values. Contains 2 item: resource type and - permission - request_url: the url of the webresource include all the queries. - ''' - - def __init__(self, path=None, request_url=None, properties=None): - self.path = path - self.properties = properties or {} - self.request_url = request_url - - -class Permission(object): - - ''' - Permission class. Contains the path and query_string for the path. - - path: the resource path - query_string: dict of name, values. Contains SIGNED_START, SIGNED_EXPIRY - SIGNED_RESOURCE, SIGNED_PERMISSION, SIGNED_IDENTIFIER, - SIGNED_SIGNATURE name values. - ''' - - def __init__(self, path=None, query_string=None): - self.path = path - self.query_string = query_string - - -class SharedAccessPolicy(object): - - ''' SharedAccessPolicy class. ''' - - def __init__(self, access_policy, signed_identifier=None): - self.id = signed_identifier - self.access_policy = access_policy - - -class SharedAccessSignature(object): - - ''' - The main class used to do the signing and generating the signature. - - account_name: - the storage account name used to generate shared access signature - account_key: the access key to genenerate share access signature - permission_set: the permission cache used to signed the request url. - ''' - - def __init__(self, account_name, account_key, permission_set=None): - self.account_name = account_name - self.account_key = account_key - self.permission_set = permission_set - - def generate_signed_query_string(self, path, resource_type, - shared_access_policy, - version=X_MS_VERSION): - ''' - Generates the query string for path, resource type and shared access - policy. - - path: the resource - resource_type: could be blob or container - shared_access_policy: shared access policy - version: - x-ms-version for storage service, or None to get a signed query - string compatible with pre 2012-02-12 clients, where the version - is not included in the query string. - ''' - - query_string = {} - if shared_access_policy.access_policy.start: - query_string[ - SIGNED_START] = shared_access_policy.access_policy.start - - if version: - query_string[SIGNED_VERSION] = version - query_string[SIGNED_EXPIRY] = shared_access_policy.access_policy.expiry - query_string[SIGNED_RESOURCE] = resource_type - query_string[ - SIGNED_PERMISSION] = shared_access_policy.access_policy.permission - - if shared_access_policy.id: - query_string[SIGNED_IDENTIFIER] = shared_access_policy.id - - query_string[SIGNED_SIGNATURE] = self._generate_signature( - path, shared_access_policy, version) - return query_string - - def sign_request(self, web_resource): - ''' sign request to generate request_url with sharedaccesssignature - info for web_resource.''' - - if self.permission_set: - for shared_access_signature in self.permission_set: - if self._permission_matches_request( - shared_access_signature, web_resource, - web_resource.properties[ - SIGNED_RESOURCE_TYPE], - web_resource.properties[SHARED_ACCESS_PERMISSION]): - if web_resource.request_url.find('?') == -1: - web_resource.request_url += '?' - else: - web_resource.request_url += '&' - - web_resource.request_url += self._convert_query_string( - shared_access_signature.query_string) - break - return web_resource - - def _convert_query_string(self, query_string): - ''' Converts query string to str. The order of name, values is very - important and can't be wrong.''' - - convert_str = '' - if SIGNED_START in query_string: - convert_str += SIGNED_START + '=' + \ - url_quote(query_string[SIGNED_START]) + '&' - convert_str += SIGNED_EXPIRY + '=' + \ - url_quote(query_string[SIGNED_EXPIRY]) + '&' - convert_str += SIGNED_PERMISSION + '=' + \ - query_string[SIGNED_PERMISSION] + '&' - convert_str += SIGNED_RESOURCE + '=' + \ - query_string[SIGNED_RESOURCE] + '&' - - if SIGNED_IDENTIFIER in query_string: - convert_str += SIGNED_IDENTIFIER + '=' + \ - query_string[SIGNED_IDENTIFIER] + '&' - if SIGNED_VERSION in query_string: - convert_str += SIGNED_VERSION + '=' + \ - query_string[SIGNED_VERSION] + '&' - convert_str += SIGNED_SIGNATURE + '=' + \ - url_quote(query_string[SIGNED_SIGNATURE]) + '&' - return convert_str - - def _generate_signature(self, path, shared_access_policy, version): - ''' Generates signature for a given path and shared access policy. ''' - - def get_value_to_append(value, no_new_line=False): - return_value = '' - if value: - return_value = value - if not no_new_line: - return_value += '\n' - return return_value - - if path[0] != '/': - path = '/' + path - - canonicalized_resource = '/' + self.account_name + path - - # Form the string to sign from shared_access_policy and canonicalized - # resource. The order of values is important. - string_to_sign = \ - (get_value_to_append(shared_access_policy.access_policy.permission) + - get_value_to_append(shared_access_policy.access_policy.start) + - get_value_to_append(shared_access_policy.access_policy.expiry) + - get_value_to_append(canonicalized_resource)) - - if version: - string_to_sign += get_value_to_append(shared_access_policy.id) - string_to_sign += get_value_to_append(version, True) - else: - string_to_sign += get_value_to_append(shared_access_policy.id, True) - - return self._sign(string_to_sign) - - def _permission_matches_request(self, shared_access_signature, - web_resource, resource_type, - required_permission): - ''' Check whether requested permission matches given - shared_access_signature, web_resource and resource type. ''' - - required_resource_type = resource_type - if required_resource_type == RESOURCE_BLOB: - required_resource_type += RESOURCE_CONTAINER - - for name, value in shared_access_signature.query_string.items(): - if name == SIGNED_RESOURCE and \ - required_resource_type.find(value) == -1: - return False - elif name == SIGNED_PERMISSION and \ - required_permission.find(value) == -1: - return False - - return web_resource.path.find(shared_access_signature.path) != -1 - - def _sign(self, string_to_sign): - ''' use HMAC-SHA256 to sign the string and convert it as base64 - encoded string. ''' - - return _sign_string(self.account_key, string_to_sign) +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +from azure import _sign_string, url_quote +from azure.storage import X_MS_VERSION + +#------------------------------------------------------------------------- +# Constants for the share access signature +SIGNED_VERSION = 'sv' +SIGNED_START = 'st' +SIGNED_EXPIRY = 'se' +SIGNED_RESOURCE = 'sr' +SIGNED_PERMISSION = 'sp' +SIGNED_IDENTIFIER = 'si' +SIGNED_SIGNATURE = 'sig' +SIGNED_VERSION = 'sv' +RESOURCE_BLOB = 'b' +RESOURCE_CONTAINER = 'c' +SIGNED_RESOURCE_TYPE = 'resource' +SHARED_ACCESS_PERMISSION = 'permission' + +#-------------------------------------------------------------------------- + + +class WebResource(object): + + ''' + Class that stands for the resource to get the share access signature + + path: the resource path. + properties: dict of name and values. Contains 2 item: resource type and + permission + request_url: the url of the webresource include all the queries. + ''' + + def __init__(self, path=None, request_url=None, properties=None): + self.path = path + self.properties = properties or {} + self.request_url = request_url + + +class Permission(object): + + ''' + Permission class. Contains the path and query_string for the path. + + path: the resource path + query_string: dict of name, values. Contains SIGNED_START, SIGNED_EXPIRY + SIGNED_RESOURCE, SIGNED_PERMISSION, SIGNED_IDENTIFIER, + SIGNED_SIGNATURE name values. + ''' + + def __init__(self, path=None, query_string=None): + self.path = path + self.query_string = query_string + + +class SharedAccessPolicy(object): + + ''' SharedAccessPolicy class. ''' + + def __init__(self, access_policy, signed_identifier=None): + self.id = signed_identifier + self.access_policy = access_policy + + +class SharedAccessSignature(object): + + ''' + The main class used to do the signing and generating the signature. + + account_name: + the storage account name used to generate shared access signature + account_key: the access key to genenerate share access signature + permission_set: the permission cache used to signed the request url. + ''' + + def __init__(self, account_name, account_key, permission_set=None): + self.account_name = account_name + self.account_key = account_key + self.permission_set = permission_set + + def generate_signed_query_string(self, path, resource_type, + shared_access_policy, + version=X_MS_VERSION): + ''' + Generates the query string for path, resource type and shared access + policy. + + path: the resource + resource_type: could be blob or container + shared_access_policy: shared access policy + version: + x-ms-version for storage service, or None to get a signed query + string compatible with pre 2012-02-12 clients, where the version + is not included in the query string. + ''' + + query_string = {} + if shared_access_policy.access_policy.start: + query_string[ + SIGNED_START] = shared_access_policy.access_policy.start + + if version: + query_string[SIGNED_VERSION] = version + query_string[SIGNED_EXPIRY] = shared_access_policy.access_policy.expiry + query_string[SIGNED_RESOURCE] = resource_type + query_string[ + SIGNED_PERMISSION] = shared_access_policy.access_policy.permission + + if shared_access_policy.id: + query_string[SIGNED_IDENTIFIER] = shared_access_policy.id + + query_string[SIGNED_SIGNATURE] = self._generate_signature( + path, shared_access_policy, version) + return query_string + + def sign_request(self, web_resource): + ''' sign request to generate request_url with sharedaccesssignature + info for web_resource.''' + + if self.permission_set: + for shared_access_signature in self.permission_set: + if self._permission_matches_request( + shared_access_signature, web_resource, + web_resource.properties[ + SIGNED_RESOURCE_TYPE], + web_resource.properties[SHARED_ACCESS_PERMISSION]): + if web_resource.request_url.find('?') == -1: + web_resource.request_url += '?' + else: + web_resource.request_url += '&' + + web_resource.request_url += self._convert_query_string( + shared_access_signature.query_string) + break + return web_resource + + def _convert_query_string(self, query_string): + ''' Converts query string to str. The order of name, values is very + important and can't be wrong.''' + + convert_str = '' + if SIGNED_START in query_string: + convert_str += SIGNED_START + '=' + \ + url_quote(query_string[SIGNED_START]) + '&' + convert_str += SIGNED_EXPIRY + '=' + \ + url_quote(query_string[SIGNED_EXPIRY]) + '&' + convert_str += SIGNED_PERMISSION + '=' + \ + query_string[SIGNED_PERMISSION] + '&' + convert_str += SIGNED_RESOURCE + '=' + \ + query_string[SIGNED_RESOURCE] + '&' + + if SIGNED_IDENTIFIER in query_string: + convert_str += SIGNED_IDENTIFIER + '=' + \ + query_string[SIGNED_IDENTIFIER] + '&' + if SIGNED_VERSION in query_string: + convert_str += SIGNED_VERSION + '=' + \ + query_string[SIGNED_VERSION] + '&' + convert_str += SIGNED_SIGNATURE + '=' + \ + url_quote(query_string[SIGNED_SIGNATURE]) + '&' + return convert_str + + def _generate_signature(self, path, shared_access_policy, version): + ''' Generates signature for a given path and shared access policy. ''' + + def get_value_to_append(value, no_new_line=False): + return_value = '' + if value: + return_value = value + if not no_new_line: + return_value += '\n' + return return_value + + if path[0] != '/': + path = '/' + path + + canonicalized_resource = '/' + self.account_name + path + + # Form the string to sign from shared_access_policy and canonicalized + # resource. The order of values is important. + string_to_sign = \ + (get_value_to_append(shared_access_policy.access_policy.permission) + + get_value_to_append(shared_access_policy.access_policy.start) + + get_value_to_append(shared_access_policy.access_policy.expiry) + + get_value_to_append(canonicalized_resource)) + + if version: + string_to_sign += get_value_to_append(shared_access_policy.id) + string_to_sign += get_value_to_append(version, True) + else: + string_to_sign += get_value_to_append(shared_access_policy.id, True) + + return self._sign(string_to_sign) + + def _permission_matches_request(self, shared_access_signature, + web_resource, resource_type, + required_permission): + ''' Check whether requested permission matches given + shared_access_signature, web_resource and resource type. ''' + + required_resource_type = resource_type + if required_resource_type == RESOURCE_BLOB: + required_resource_type += RESOURCE_CONTAINER + + for name, value in shared_access_signature.query_string.items(): + if name == SIGNED_RESOURCE and \ + required_resource_type.find(value) == -1: + return False + elif name == SIGNED_PERMISSION and \ + required_permission.find(value) == -1: + return False + + return web_resource.path.find(shared_access_signature.path) != -1 + + def _sign(self, string_to_sign): + ''' use HMAC-SHA256 to sign the string and convert it as base64 + encoded string. ''' + + return _sign_string(self.account_key, string_to_sign) diff --git a/awx/lib/site-packages/azure/storage/storageclient.py b/awx/lib/site-packages/azure/storage/storageclient.py index 7f160faff9..9b0fd56c4b 100644 --- a/awx/lib/site-packages/azure/storage/storageclient.py +++ b/awx/lib/site-packages/azure/storage/storageclient.py @@ -1,152 +1,152 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -import os -import sys - -from azure import ( - WindowsAzureError, - DEV_ACCOUNT_NAME, - DEV_ACCOUNT_KEY, - _ERROR_STORAGE_MISSING_INFO, - ) -from azure.http import HTTPError -from azure.http.httpclient import _HTTPClient -from azure.storage import _storage_error_handler - -#-------------------------------------------------------------------------- -# constants for azure app setting environment variables -AZURE_STORAGE_ACCOUNT = 'AZURE_STORAGE_ACCOUNT' -AZURE_STORAGE_ACCESS_KEY = 'AZURE_STORAGE_ACCESS_KEY' -EMULATED = 'EMULATED' - -#-------------------------------------------------------------------------- - - -class _StorageClient(object): - - ''' - This is the base class for BlobManager, TableManager and QueueManager. - ''' - - def __init__(self, account_name=None, account_key=None, protocol='https', - host_base='', dev_host=''): - ''' - account_name: your storage account name, required for all operations. - account_key: your storage account key, required for all operations. - protocol: Optional. Protocol. Defaults to http. - host_base: - Optional. Live host base url. Defaults to Azure url. Override this - for on-premise. - dev_host: Optional. Dev host url. Defaults to localhost. - ''' - self.account_name = account_name - self.account_key = account_key - self.requestid = None - self.protocol = protocol - self.host_base = host_base - self.dev_host = dev_host - - # the app is not run in azure emulator or use default development - # storage account and key if app is run in emulator. - self.use_local_storage = False - - # check whether it is run in emulator. - if EMULATED in os.environ: - self.is_emulated = os.environ[EMULATED].lower() != 'false' - else: - self.is_emulated = False - - # get account_name and account key. If they are not set when - # constructing, get the account and key from environment variables if - # the app is not run in azure emulator or use default development - # storage account and key if app is run in emulator. - if not self.account_name or not self.account_key: - if self.is_emulated: - self.account_name = DEV_ACCOUNT_NAME - self.account_key = DEV_ACCOUNT_KEY - self.protocol = 'http' - self.use_local_storage = True - else: - self.account_name = os.environ.get(AZURE_STORAGE_ACCOUNT) - self.account_key = os.environ.get(AZURE_STORAGE_ACCESS_KEY) - - if not self.account_name or not self.account_key: - raise WindowsAzureError(_ERROR_STORAGE_MISSING_INFO) - - self._httpclient = _HTTPClient( - service_instance=self, - account_key=self.account_key, - account_name=self.account_name, - protocol=self.protocol) - self._batchclient = None - self._filter = self._perform_request_worker - - def with_filter(self, filter): - ''' - Returns a new service which will process requests with the specified - filter. Filtering operations can include logging, automatic retrying, - etc... The filter is a lambda which receives the HTTPRequest and - another lambda. The filter can perform any pre-processing on the - request, pass it off to the next lambda, and then perform any - post-processing on the response. - ''' - res = type(self)(self.account_name, self.account_key, self.protocol) - old_filter = self._filter - - def new_filter(request): - return filter(request, old_filter) - - res._filter = new_filter - return res - - def set_proxy(self, host, port, user=None, password=None): - ''' - Sets the proxy server host and port for the HTTP CONNECT Tunnelling. - - host: Address of the proxy. Ex: '192.168.0.100' - port: Port of the proxy. Ex: 6000 - user: User for proxy authorization. - password: Password for proxy authorization. - ''' - self._httpclient.set_proxy(host, port, user, password) - - def _get_host(self): - if self.use_local_storage: - return self.dev_host - else: - return self.account_name + self.host_base - - def _perform_request_worker(self, request): - return self._httpclient.perform_request(request) - - def _perform_request(self, request, text_encoding='utf-8'): - ''' - Sends the request and return response. Catches HTTPError and hand it - to error handler - ''' - try: - if self._batchclient is not None: - return self._batchclient.insert_request_to_batch(request) - else: - resp = self._filter(request) - - if sys.version_info >= (3,) and isinstance(resp, bytes) and \ - text_encoding: - resp = resp.decode(text_encoding) - - except HTTPError as ex: - _storage_error_handler(ex) - - return resp +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +import os +import sys + +from azure import ( + WindowsAzureError, + DEV_ACCOUNT_NAME, + DEV_ACCOUNT_KEY, + _ERROR_STORAGE_MISSING_INFO, + ) +from azure.http import HTTPError +from azure.http.httpclient import _HTTPClient +from azure.storage import _storage_error_handler + +#-------------------------------------------------------------------------- +# constants for azure app setting environment variables +AZURE_STORAGE_ACCOUNT = 'AZURE_STORAGE_ACCOUNT' +AZURE_STORAGE_ACCESS_KEY = 'AZURE_STORAGE_ACCESS_KEY' +EMULATED = 'EMULATED' + +#-------------------------------------------------------------------------- + + +class _StorageClient(object): + + ''' + This is the base class for BlobManager, TableManager and QueueManager. + ''' + + def __init__(self, account_name=None, account_key=None, protocol='https', + host_base='', dev_host=''): + ''' + account_name: your storage account name, required for all operations. + account_key: your storage account key, required for all operations. + protocol: Optional. Protocol. Defaults to http. + host_base: + Optional. Live host base url. Defaults to Azure url. Override this + for on-premise. + dev_host: Optional. Dev host url. Defaults to localhost. + ''' + self.account_name = account_name + self.account_key = account_key + self.requestid = None + self.protocol = protocol + self.host_base = host_base + self.dev_host = dev_host + + # the app is not run in azure emulator or use default development + # storage account and key if app is run in emulator. + self.use_local_storage = False + + # check whether it is run in emulator. + if EMULATED in os.environ: + self.is_emulated = os.environ[EMULATED].lower() != 'false' + else: + self.is_emulated = False + + # get account_name and account key. If they are not set when + # constructing, get the account and key from environment variables if + # the app is not run in azure emulator or use default development + # storage account and key if app is run in emulator. + if not self.account_name or not self.account_key: + if self.is_emulated: + self.account_name = DEV_ACCOUNT_NAME + self.account_key = DEV_ACCOUNT_KEY + self.protocol = 'http' + self.use_local_storage = True + else: + self.account_name = os.environ.get(AZURE_STORAGE_ACCOUNT) + self.account_key = os.environ.get(AZURE_STORAGE_ACCESS_KEY) + + if not self.account_name or not self.account_key: + raise WindowsAzureError(_ERROR_STORAGE_MISSING_INFO) + + self._httpclient = _HTTPClient( + service_instance=self, + account_key=self.account_key, + account_name=self.account_name, + protocol=self.protocol) + self._batchclient = None + self._filter = self._perform_request_worker + + def with_filter(self, filter): + ''' + Returns a new service which will process requests with the specified + filter. Filtering operations can include logging, automatic retrying, + etc... The filter is a lambda which receives the HTTPRequest and + another lambda. The filter can perform any pre-processing on the + request, pass it off to the next lambda, and then perform any + post-processing on the response. + ''' + res = type(self)(self.account_name, self.account_key, self.protocol) + old_filter = self._filter + + def new_filter(request): + return filter(request, old_filter) + + res._filter = new_filter + return res + + def set_proxy(self, host, port, user=None, password=None): + ''' + Sets the proxy server host and port for the HTTP CONNECT Tunnelling. + + host: Address of the proxy. Ex: '192.168.0.100' + port: Port of the proxy. Ex: 6000 + user: User for proxy authorization. + password: Password for proxy authorization. + ''' + self._httpclient.set_proxy(host, port, user, password) + + def _get_host(self): + if self.use_local_storage: + return self.dev_host + else: + return self.account_name + self.host_base + + def _perform_request_worker(self, request): + return self._httpclient.perform_request(request) + + def _perform_request(self, request, text_encoding='utf-8'): + ''' + Sends the request and return response. Catches HTTPError and hand it + to error handler + ''' + try: + if self._batchclient is not None: + return self._batchclient.insert_request_to_batch(request) + else: + resp = self._filter(request) + + if sys.version_info >= (3,) and isinstance(resp, bytes) and \ + text_encoding: + resp = resp.decode(text_encoding) + + except HTTPError as ex: + _storage_error_handler(ex) + + return resp diff --git a/awx/lib/site-packages/azure/storage/tableservice.py b/awx/lib/site-packages/azure/storage/tableservice.py index 3fe58a73f1..f25c48a5c8 100644 --- a/awx/lib/site-packages/azure/storage/tableservice.py +++ b/awx/lib/site-packages/azure/storage/tableservice.py @@ -1,491 +1,491 @@ -#------------------------------------------------------------------------- -# Copyright (c) Microsoft. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -from azure import ( - WindowsAzureError, - TABLE_SERVICE_HOST_BASE, - DEV_TABLE_HOST, - _convert_class_to_xml, - _convert_response_to_feeds, - _dont_fail_not_exist, - _dont_fail_on_exist, - _get_request_body, - _int_or_none, - _parse_response, - _parse_response_for_dict, - _parse_response_for_dict_filter, - _str, - _str_or_none, - _update_request_uri_query_local_storage, - _validate_not_none, - ) -from azure.http import HTTPRequest -from azure.http.batchclient import _BatchClient -from azure.storage import ( - StorageServiceProperties, - _convert_entity_to_xml, - _convert_response_to_entity, - _convert_table_to_xml, - _convert_xml_to_entity, - _convert_xml_to_table, - _sign_storage_table_request, - _update_storage_table_header, - ) -from azure.storage.storageclient import _StorageClient - - -class TableService(_StorageClient): - - ''' - This is the main class managing Table resources. - ''' - - def __init__(self, account_name=None, account_key=None, protocol='https', - host_base=TABLE_SERVICE_HOST_BASE, dev_host=DEV_TABLE_HOST): - ''' - account_name: your storage account name, required for all operations. - account_key: your storage account key, required for all operations. - protocol: Optional. Protocol. Defaults to http. - host_base: - Optional. Live host base url. Defaults to Azure url. Override this - for on-premise. - dev_host: Optional. Dev host url. Defaults to localhost. - ''' - super(TableService, self).__init__( - account_name, account_key, protocol, host_base, dev_host) - - def begin_batch(self): - if self._batchclient is None: - self._batchclient = _BatchClient( - service_instance=self, - account_key=self.account_key, - account_name=self.account_name) - return self._batchclient.begin_batch() - - def commit_batch(self): - try: - ret = self._batchclient.commit_batch() - finally: - self._batchclient = None - return ret - - def cancel_batch(self): - self._batchclient = None - - def get_table_service_properties(self): - ''' - Gets the properties of a storage account's Table service, including - Windows Azure Storage Analytics. - ''' - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/?restype=service&comp=properties' - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - response = self._perform_request(request) - - return _parse_response(response, StorageServiceProperties) - - def set_table_service_properties(self, storage_service_properties): - ''' - Sets the properties of a storage account's Table Service, including - Windows Azure Storage Analytics. - - storage_service_properties: StorageServiceProperties object. - ''' - _validate_not_none('storage_service_properties', - storage_service_properties) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/?restype=service&comp=properties' - request.body = _get_request_body( - _convert_class_to_xml(storage_service_properties)) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - response = self._perform_request(request) - - return _parse_response_for_dict(response) - - def query_tables(self, table_name=None, top=None, next_table_name=None): - ''' - Returns a list of tables under the specified account. - - table_name: Optional. The specific table to query. - top: Optional. Maximum number of tables to return. - next_table_name: - Optional. When top is used, the next table name is stored in - result.x_ms_continuation['NextTableName'] - ''' - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - if table_name is not None: - uri_part_table_name = "('" + table_name + "')" - else: - uri_part_table_name = "" - request.path = '/Tables' + uri_part_table_name + '' - request.query = [ - ('$top', _int_or_none(top)), - ('NextTableName', _str_or_none(next_table_name)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - response = self._perform_request(request) - - return _convert_response_to_feeds(response, _convert_xml_to_table) - - def create_table(self, table, fail_on_exist=False): - ''' - Creates a new table in the storage account. - - table: - Name of the table to create. Table name may contain only - alphanumeric characters and cannot begin with a numeric character. - It is case-insensitive and must be from 3 to 63 characters long. - fail_on_exist: Specify whether throw exception when table exists. - ''' - _validate_not_none('table', table) - request = HTTPRequest() - request.method = 'POST' - request.host = self._get_host() - request.path = '/Tables' - request.body = _get_request_body(_convert_table_to_xml(table)) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - if not fail_on_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_on_exist(ex) - return False - else: - self._perform_request(request) - return True - - def delete_table(self, table_name, fail_not_exist=False): - ''' - table_name: Name of the table to delete. - fail_not_exist: - Specify whether throw exception when table doesn't exist. - ''' - _validate_not_none('table_name', table_name) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/Tables(\'' + _str(table_name) + '\')' - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - if not fail_not_exist: - try: - self._perform_request(request) - return True - except WindowsAzureError as ex: - _dont_fail_not_exist(ex) - return False - else: - self._perform_request(request) - return True - - def get_entity(self, table_name, partition_key, row_key, select=''): - ''' - Get an entity in a table; includes the $select options. - - partition_key: PartitionKey of the entity. - row_key: RowKey of the entity. - select: Property names to select. - ''' - _validate_not_none('table_name', table_name) - _validate_not_none('partition_key', partition_key) - _validate_not_none('row_key', row_key) - _validate_not_none('select', select) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + _str(table_name) + \ - '(PartitionKey=\'' + _str(partition_key) + \ - '\',RowKey=\'' + \ - _str(row_key) + '\')?$select=' + \ - _str(select) + '' - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - response = self._perform_request(request) - - return _convert_response_to_entity(response) - - def query_entities(self, table_name, filter=None, select=None, top=None, - next_partition_key=None, next_row_key=None): - ''' - Get entities in a table; includes the $filter and $select options. - - table_name: Table to query. - filter: - Optional. Filter as described at - http://msdn.microsoft.com/en-us/library/windowsazure/dd894031.aspx - select: Optional. Property names to select from the entities. - top: Optional. Maximum number of entities to return. - next_partition_key: - Optional. When top is used, the next partition key is stored in - result.x_ms_continuation['NextPartitionKey'] - next_row_key: - Optional. When top is used, the next partition key is stored in - result.x_ms_continuation['NextRowKey'] - ''' - _validate_not_none('table_name', table_name) - request = HTTPRequest() - request.method = 'GET' - request.host = self._get_host() - request.path = '/' + _str(table_name) + '()' - request.query = [ - ('$filter', _str_or_none(filter)), - ('$select', _str_or_none(select)), - ('$top', _int_or_none(top)), - ('NextPartitionKey', _str_or_none(next_partition_key)), - ('NextRowKey', _str_or_none(next_row_key)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - response = self._perform_request(request) - - return _convert_response_to_feeds(response, _convert_xml_to_entity) - - def insert_entity(self, table_name, entity, - content_type='application/atom+xml'): - ''' - Inserts a new entity into a table. - - table_name: Table name. - entity: - Required. The entity object to insert. Could be a dict format or - entity object. - content_type: Required. Must be set to application/atom+xml - ''' - _validate_not_none('table_name', table_name) - _validate_not_none('entity', entity) - _validate_not_none('content_type', content_type) - request = HTTPRequest() - request.method = 'POST' - request.host = self._get_host() - request.path = '/' + _str(table_name) + '' - request.headers = [('Content-Type', _str_or_none(content_type))] - request.body = _get_request_body(_convert_entity_to_xml(entity)) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - response = self._perform_request(request) - - return _convert_response_to_entity(response) - - def update_entity(self, table_name, partition_key, row_key, entity, - content_type='application/atom+xml', if_match='*'): - ''' - Updates an existing entity in a table. The Update Entity operation - replaces the entire entity and can be used to remove properties. - - table_name: Table name. - partition_key: PartitionKey of the entity. - row_key: RowKey of the entity. - entity: - Required. The entity object to insert. Could be a dict format or - entity object. - content_type: Required. Must be set to application/atom+xml - if_match: - Optional. Specifies the condition for which the merge should be - performed. To force an unconditional merge, set to the wildcard - character (*). - ''' - _validate_not_none('table_name', table_name) - _validate_not_none('partition_key', partition_key) - _validate_not_none('row_key', row_key) - _validate_not_none('entity', entity) - _validate_not_none('content_type', content_type) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(table_name) + '(PartitionKey=\'' + \ - _str(partition_key) + '\',RowKey=\'' + _str(row_key) + '\')' - request.headers = [ - ('Content-Type', _str_or_none(content_type)), - ('If-Match', _str_or_none(if_match)) - ] - request.body = _get_request_body(_convert_entity_to_xml(entity)) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - response = self._perform_request(request) - - return _parse_response_for_dict_filter(response, filter=['etag']) - - def merge_entity(self, table_name, partition_key, row_key, entity, - content_type='application/atom+xml', if_match='*'): - ''' - Updates an existing entity by updating the entity's properties. This - operation does not replace the existing entity as the Update Entity - operation does. - - table_name: Table name. - partition_key: PartitionKey of the entity. - row_key: RowKey of the entity. - entity: - Required. The entity object to insert. Can be a dict format or - entity object. - content_type: Required. Must be set to application/atom+xml - if_match: - Optional. Specifies the condition for which the merge should be - performed. To force an unconditional merge, set to the wildcard - character (*). - ''' - _validate_not_none('table_name', table_name) - _validate_not_none('partition_key', partition_key) - _validate_not_none('row_key', row_key) - _validate_not_none('entity', entity) - _validate_not_none('content_type', content_type) - request = HTTPRequest() - request.method = 'MERGE' - request.host = self._get_host() - request.path = '/' + \ - _str(table_name) + '(PartitionKey=\'' + \ - _str(partition_key) + '\',RowKey=\'' + _str(row_key) + '\')' - request.headers = [ - ('Content-Type', _str_or_none(content_type)), - ('If-Match', _str_or_none(if_match)) - ] - request.body = _get_request_body(_convert_entity_to_xml(entity)) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - response = self._perform_request(request) - - return _parse_response_for_dict_filter(response, filter=['etag']) - - def delete_entity(self, table_name, partition_key, row_key, - content_type='application/atom+xml', if_match='*'): - ''' - Deletes an existing entity in a table. - - table_name: Table name. - partition_key: PartitionKey of the entity. - row_key: RowKey of the entity. - content_type: Required. Must be set to application/atom+xml - if_match: - Optional. Specifies the condition for which the delete should be - performed. To force an unconditional delete, set to the wildcard - character (*). - ''' - _validate_not_none('table_name', table_name) - _validate_not_none('partition_key', partition_key) - _validate_not_none('row_key', row_key) - _validate_not_none('content_type', content_type) - _validate_not_none('if_match', if_match) - request = HTTPRequest() - request.method = 'DELETE' - request.host = self._get_host() - request.path = '/' + \ - _str(table_name) + '(PartitionKey=\'' + \ - _str(partition_key) + '\',RowKey=\'' + _str(row_key) + '\')' - request.headers = [ - ('Content-Type', _str_or_none(content_type)), - ('If-Match', _str_or_none(if_match)) - ] - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - self._perform_request(request) - - def insert_or_replace_entity(self, table_name, partition_key, row_key, - entity, content_type='application/atom+xml'): - ''' - Replaces an existing entity or inserts a new entity if it does not - exist in the table. Because this operation can insert or update an - entity, it is also known as an "upsert" operation. - - table_name: Table name. - partition_key: PartitionKey of the entity. - row_key: RowKey of the entity. - entity: - Required. The entity object to insert. Could be a dict format or - entity object. - content_type: Required. Must be set to application/atom+xml - ''' - _validate_not_none('table_name', table_name) - _validate_not_none('partition_key', partition_key) - _validate_not_none('row_key', row_key) - _validate_not_none('entity', entity) - _validate_not_none('content_type', content_type) - request = HTTPRequest() - request.method = 'PUT' - request.host = self._get_host() - request.path = '/' + \ - _str(table_name) + '(PartitionKey=\'' + \ - _str(partition_key) + '\',RowKey=\'' + _str(row_key) + '\')' - request.headers = [('Content-Type', _str_or_none(content_type))] - request.body = _get_request_body(_convert_entity_to_xml(entity)) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - response = self._perform_request(request) - - return _parse_response_for_dict_filter(response, filter=['etag']) - - def insert_or_merge_entity(self, table_name, partition_key, row_key, - entity, content_type='application/atom+xml'): - ''' - Merges an existing entity or inserts a new entity if it does not exist - in the table. Because this operation can insert or update an entity, - it is also known as an "upsert" operation. - - table_name: Table name. - partition_key: PartitionKey of the entity. - row_key: RowKey of the entity. - entity: - Required. The entity object to insert. Could be a dict format or - entity object. - content_type: Required. Must be set to application/atom+xml - ''' - _validate_not_none('table_name', table_name) - _validate_not_none('partition_key', partition_key) - _validate_not_none('row_key', row_key) - _validate_not_none('entity', entity) - _validate_not_none('content_type', content_type) - request = HTTPRequest() - request.method = 'MERGE' - request.host = self._get_host() - request.path = '/' + \ - _str(table_name) + '(PartitionKey=\'' + \ - _str(partition_key) + '\',RowKey=\'' + _str(row_key) + '\')' - request.headers = [('Content-Type', _str_or_none(content_type))] - request.body = _get_request_body(_convert_entity_to_xml(entity)) - request.path, request.query = _update_request_uri_query_local_storage( - request, self.use_local_storage) - request.headers = _update_storage_table_header(request) - response = self._perform_request(request) - - return _parse_response_for_dict_filter(response, filter=['etag']) - - def _perform_request_worker(self, request): - auth = _sign_storage_table_request(request, - self.account_name, - self.account_key) - request.headers.append(('Authorization', auth)) - return self._httpclient.perform_request(request) +#------------------------------------------------------------------------- +# Copyright (c) Microsoft. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +from azure import ( + WindowsAzureError, + TABLE_SERVICE_HOST_BASE, + DEV_TABLE_HOST, + _convert_class_to_xml, + _convert_response_to_feeds, + _dont_fail_not_exist, + _dont_fail_on_exist, + _get_request_body, + _int_or_none, + _parse_response, + _parse_response_for_dict, + _parse_response_for_dict_filter, + _str, + _str_or_none, + _update_request_uri_query_local_storage, + _validate_not_none, + ) +from azure.http import HTTPRequest +from azure.http.batchclient import _BatchClient +from azure.storage import ( + StorageServiceProperties, + _convert_entity_to_xml, + _convert_response_to_entity, + _convert_table_to_xml, + _convert_xml_to_entity, + _convert_xml_to_table, + _sign_storage_table_request, + _update_storage_table_header, + ) +from azure.storage.storageclient import _StorageClient + + +class TableService(_StorageClient): + + ''' + This is the main class managing Table resources. + ''' + + def __init__(self, account_name=None, account_key=None, protocol='https', + host_base=TABLE_SERVICE_HOST_BASE, dev_host=DEV_TABLE_HOST): + ''' + account_name: your storage account name, required for all operations. + account_key: your storage account key, required for all operations. + protocol: Optional. Protocol. Defaults to http. + host_base: + Optional. Live host base url. Defaults to Azure url. Override this + for on-premise. + dev_host: Optional. Dev host url. Defaults to localhost. + ''' + super(TableService, self).__init__( + account_name, account_key, protocol, host_base, dev_host) + + def begin_batch(self): + if self._batchclient is None: + self._batchclient = _BatchClient( + service_instance=self, + account_key=self.account_key, + account_name=self.account_name) + return self._batchclient.begin_batch() + + def commit_batch(self): + try: + ret = self._batchclient.commit_batch() + finally: + self._batchclient = None + return ret + + def cancel_batch(self): + self._batchclient = None + + def get_table_service_properties(self): + ''' + Gets the properties of a storage account's Table service, including + Windows Azure Storage Analytics. + ''' + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/?restype=service&comp=properties' + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + response = self._perform_request(request) + + return _parse_response(response, StorageServiceProperties) + + def set_table_service_properties(self, storage_service_properties): + ''' + Sets the properties of a storage account's Table Service, including + Windows Azure Storage Analytics. + + storage_service_properties: StorageServiceProperties object. + ''' + _validate_not_none('storage_service_properties', + storage_service_properties) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/?restype=service&comp=properties' + request.body = _get_request_body( + _convert_class_to_xml(storage_service_properties)) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + response = self._perform_request(request) + + return _parse_response_for_dict(response) + + def query_tables(self, table_name=None, top=None, next_table_name=None): + ''' + Returns a list of tables under the specified account. + + table_name: Optional. The specific table to query. + top: Optional. Maximum number of tables to return. + next_table_name: + Optional. When top is used, the next table name is stored in + result.x_ms_continuation['NextTableName'] + ''' + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + if table_name is not None: + uri_part_table_name = "('" + table_name + "')" + else: + uri_part_table_name = "" + request.path = '/Tables' + uri_part_table_name + '' + request.query = [ + ('$top', _int_or_none(top)), + ('NextTableName', _str_or_none(next_table_name)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + response = self._perform_request(request) + + return _convert_response_to_feeds(response, _convert_xml_to_table) + + def create_table(self, table, fail_on_exist=False): + ''' + Creates a new table in the storage account. + + table: + Name of the table to create. Table name may contain only + alphanumeric characters and cannot begin with a numeric character. + It is case-insensitive and must be from 3 to 63 characters long. + fail_on_exist: Specify whether throw exception when table exists. + ''' + _validate_not_none('table', table) + request = HTTPRequest() + request.method = 'POST' + request.host = self._get_host() + request.path = '/Tables' + request.body = _get_request_body(_convert_table_to_xml(table)) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + if not fail_on_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_on_exist(ex) + return False + else: + self._perform_request(request) + return True + + def delete_table(self, table_name, fail_not_exist=False): + ''' + table_name: Name of the table to delete. + fail_not_exist: + Specify whether throw exception when table doesn't exist. + ''' + _validate_not_none('table_name', table_name) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/Tables(\'' + _str(table_name) + '\')' + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + if not fail_not_exist: + try: + self._perform_request(request) + return True + except WindowsAzureError as ex: + _dont_fail_not_exist(ex) + return False + else: + self._perform_request(request) + return True + + def get_entity(self, table_name, partition_key, row_key, select=''): + ''' + Get an entity in a table; includes the $select options. + + partition_key: PartitionKey of the entity. + row_key: RowKey of the entity. + select: Property names to select. + ''' + _validate_not_none('table_name', table_name) + _validate_not_none('partition_key', partition_key) + _validate_not_none('row_key', row_key) + _validate_not_none('select', select) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + _str(table_name) + \ + '(PartitionKey=\'' + _str(partition_key) + \ + '\',RowKey=\'' + \ + _str(row_key) + '\')?$select=' + \ + _str(select) + '' + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + response = self._perform_request(request) + + return _convert_response_to_entity(response) + + def query_entities(self, table_name, filter=None, select=None, top=None, + next_partition_key=None, next_row_key=None): + ''' + Get entities in a table; includes the $filter and $select options. + + table_name: Table to query. + filter: + Optional. Filter as described at + http://msdn.microsoft.com/en-us/library/windowsazure/dd894031.aspx + select: Optional. Property names to select from the entities. + top: Optional. Maximum number of entities to return. + next_partition_key: + Optional. When top is used, the next partition key is stored in + result.x_ms_continuation['NextPartitionKey'] + next_row_key: + Optional. When top is used, the next partition key is stored in + result.x_ms_continuation['NextRowKey'] + ''' + _validate_not_none('table_name', table_name) + request = HTTPRequest() + request.method = 'GET' + request.host = self._get_host() + request.path = '/' + _str(table_name) + '()' + request.query = [ + ('$filter', _str_or_none(filter)), + ('$select', _str_or_none(select)), + ('$top', _int_or_none(top)), + ('NextPartitionKey', _str_or_none(next_partition_key)), + ('NextRowKey', _str_or_none(next_row_key)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + response = self._perform_request(request) + + return _convert_response_to_feeds(response, _convert_xml_to_entity) + + def insert_entity(self, table_name, entity, + content_type='application/atom+xml'): + ''' + Inserts a new entity into a table. + + table_name: Table name. + entity: + Required. The entity object to insert. Could be a dict format or + entity object. + content_type: Required. Must be set to application/atom+xml + ''' + _validate_not_none('table_name', table_name) + _validate_not_none('entity', entity) + _validate_not_none('content_type', content_type) + request = HTTPRequest() + request.method = 'POST' + request.host = self._get_host() + request.path = '/' + _str(table_name) + '' + request.headers = [('Content-Type', _str_or_none(content_type))] + request.body = _get_request_body(_convert_entity_to_xml(entity)) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + response = self._perform_request(request) + + return _convert_response_to_entity(response) + + def update_entity(self, table_name, partition_key, row_key, entity, + content_type='application/atom+xml', if_match='*'): + ''' + Updates an existing entity in a table. The Update Entity operation + replaces the entire entity and can be used to remove properties. + + table_name: Table name. + partition_key: PartitionKey of the entity. + row_key: RowKey of the entity. + entity: + Required. The entity object to insert. Could be a dict format or + entity object. + content_type: Required. Must be set to application/atom+xml + if_match: + Optional. Specifies the condition for which the merge should be + performed. To force an unconditional merge, set to the wildcard + character (*). + ''' + _validate_not_none('table_name', table_name) + _validate_not_none('partition_key', partition_key) + _validate_not_none('row_key', row_key) + _validate_not_none('entity', entity) + _validate_not_none('content_type', content_type) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(table_name) + '(PartitionKey=\'' + \ + _str(partition_key) + '\',RowKey=\'' + _str(row_key) + '\')' + request.headers = [ + ('Content-Type', _str_or_none(content_type)), + ('If-Match', _str_or_none(if_match)) + ] + request.body = _get_request_body(_convert_entity_to_xml(entity)) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + response = self._perform_request(request) + + return _parse_response_for_dict_filter(response, filter=['etag']) + + def merge_entity(self, table_name, partition_key, row_key, entity, + content_type='application/atom+xml', if_match='*'): + ''' + Updates an existing entity by updating the entity's properties. This + operation does not replace the existing entity as the Update Entity + operation does. + + table_name: Table name. + partition_key: PartitionKey of the entity. + row_key: RowKey of the entity. + entity: + Required. The entity object to insert. Can be a dict format or + entity object. + content_type: Required. Must be set to application/atom+xml + if_match: + Optional. Specifies the condition for which the merge should be + performed. To force an unconditional merge, set to the wildcard + character (*). + ''' + _validate_not_none('table_name', table_name) + _validate_not_none('partition_key', partition_key) + _validate_not_none('row_key', row_key) + _validate_not_none('entity', entity) + _validate_not_none('content_type', content_type) + request = HTTPRequest() + request.method = 'MERGE' + request.host = self._get_host() + request.path = '/' + \ + _str(table_name) + '(PartitionKey=\'' + \ + _str(partition_key) + '\',RowKey=\'' + _str(row_key) + '\')' + request.headers = [ + ('Content-Type', _str_or_none(content_type)), + ('If-Match', _str_or_none(if_match)) + ] + request.body = _get_request_body(_convert_entity_to_xml(entity)) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + response = self._perform_request(request) + + return _parse_response_for_dict_filter(response, filter=['etag']) + + def delete_entity(self, table_name, partition_key, row_key, + content_type='application/atom+xml', if_match='*'): + ''' + Deletes an existing entity in a table. + + table_name: Table name. + partition_key: PartitionKey of the entity. + row_key: RowKey of the entity. + content_type: Required. Must be set to application/atom+xml + if_match: + Optional. Specifies the condition for which the delete should be + performed. To force an unconditional delete, set to the wildcard + character (*). + ''' + _validate_not_none('table_name', table_name) + _validate_not_none('partition_key', partition_key) + _validate_not_none('row_key', row_key) + _validate_not_none('content_type', content_type) + _validate_not_none('if_match', if_match) + request = HTTPRequest() + request.method = 'DELETE' + request.host = self._get_host() + request.path = '/' + \ + _str(table_name) + '(PartitionKey=\'' + \ + _str(partition_key) + '\',RowKey=\'' + _str(row_key) + '\')' + request.headers = [ + ('Content-Type', _str_or_none(content_type)), + ('If-Match', _str_or_none(if_match)) + ] + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + self._perform_request(request) + + def insert_or_replace_entity(self, table_name, partition_key, row_key, + entity, content_type='application/atom+xml'): + ''' + Replaces an existing entity or inserts a new entity if it does not + exist in the table. Because this operation can insert or update an + entity, it is also known as an "upsert" operation. + + table_name: Table name. + partition_key: PartitionKey of the entity. + row_key: RowKey of the entity. + entity: + Required. The entity object to insert. Could be a dict format or + entity object. + content_type: Required. Must be set to application/atom+xml + ''' + _validate_not_none('table_name', table_name) + _validate_not_none('partition_key', partition_key) + _validate_not_none('row_key', row_key) + _validate_not_none('entity', entity) + _validate_not_none('content_type', content_type) + request = HTTPRequest() + request.method = 'PUT' + request.host = self._get_host() + request.path = '/' + \ + _str(table_name) + '(PartitionKey=\'' + \ + _str(partition_key) + '\',RowKey=\'' + _str(row_key) + '\')' + request.headers = [('Content-Type', _str_or_none(content_type))] + request.body = _get_request_body(_convert_entity_to_xml(entity)) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + response = self._perform_request(request) + + return _parse_response_for_dict_filter(response, filter=['etag']) + + def insert_or_merge_entity(self, table_name, partition_key, row_key, + entity, content_type='application/atom+xml'): + ''' + Merges an existing entity or inserts a new entity if it does not exist + in the table. Because this operation can insert or update an entity, + it is also known as an "upsert" operation. + + table_name: Table name. + partition_key: PartitionKey of the entity. + row_key: RowKey of the entity. + entity: + Required. The entity object to insert. Could be a dict format or + entity object. + content_type: Required. Must be set to application/atom+xml + ''' + _validate_not_none('table_name', table_name) + _validate_not_none('partition_key', partition_key) + _validate_not_none('row_key', row_key) + _validate_not_none('entity', entity) + _validate_not_none('content_type', content_type) + request = HTTPRequest() + request.method = 'MERGE' + request.host = self._get_host() + request.path = '/' + \ + _str(table_name) + '(PartitionKey=\'' + \ + _str(partition_key) + '\',RowKey=\'' + _str(row_key) + '\')' + request.headers = [('Content-Type', _str_or_none(content_type))] + request.body = _get_request_body(_convert_entity_to_xml(entity)) + request.path, request.query = _update_request_uri_query_local_storage( + request, self.use_local_storage) + request.headers = _update_storage_table_header(request) + response = self._perform_request(request) + + return _parse_response_for_dict_filter(response, filter=['etag']) + + def _perform_request_worker(self, request): + auth = _sign_storage_table_request(request, + self.account_name, + self.account_key) + request.headers.append(('Authorization', auth)) + return self._httpclient.perform_request(request) From 6abca24c128d65ef00b4bf771281fb76693541e0 Mon Sep 17 00:00:00 2001 From: Matthew Jones <mat@matburt.net> Date: Thu, 29 Jan 2015 12:28:44 -0500 Subject: [PATCH 02/10] Upgrading setuptools (and related modules) to 12.0.5 --- awx/lib/site-packages/README | 2 +- .../__init__.py} | 1241 ++++++++++------ .../pkg_resources/_vendor/__init__.py | 0 .../_vendor/packaging/__about__.py | 31 + .../_vendor/packaging/__init__.py | 24 + .../_vendor/packaging/_compat.py | 40 + .../_vendor/packaging/_structures.py | 78 + .../_vendor/packaging/specifiers.py | 772 ++++++++++ .../_vendor/packaging/version.py | 401 +++++ .../pkg_resources/_vendor/vendored.txt | 1 + .../site-packages/pkg_resources/api_tests.txt | 419 ++++++ .../pkg_resources/tests/__init__.py | 0 .../pkg_resources/tests/test_pkg_resources.py | 111 ++ .../pkg_resources/tests/test_resources.py | 661 +++++++++ awx/lib/site-packages/setuptools/__init__.py | 115 +- .../site-packages/setuptools/archive_util.py | 106 +- .../setuptools/command/__init__.py | 5 +- .../site-packages/setuptools/command/alias.py | 28 +- .../setuptools/command/bdist_egg.py | 298 ++-- .../setuptools/command/bdist_rpm.py | 83 +- .../setuptools/command/bdist_wininst.py | 79 +- .../setuptools/command/build_ext.py | 211 +-- .../setuptools/command/build_py.py | 83 +- .../setuptools/command/develop.py | 68 +- .../setuptools/command/easy_install.py | 1285 +++++++++++------ .../setuptools/command/egg_info.py | 259 ++-- .../setuptools/command/install.py | 88 +- .../setuptools/command/install_egg_info.py | 131 +- .../setuptools/command/install_lib.py | 112 +- .../setuptools/command/install_scripts.py | 40 +- .../setuptools/command/launcher manifest.xml | 18 +- .../setuptools/command/register.py | 10 +- .../setuptools/command/rotate.py | 52 +- .../setuptools/command/saveopts.py | 14 +- .../site-packages/setuptools/command/sdist.py | 109 +- .../setuptools/command/setopt.py | 80 +- .../site-packages/setuptools/command/test.py | 117 +- .../setuptools/command/upload_docs.py | 21 +- awx/lib/site-packages/setuptools/compat.py | 25 +- awx/lib/site-packages/setuptools/depends.py | 95 +- awx/lib/site-packages/setuptools/dist.py | 93 +- awx/lib/site-packages/setuptools/extension.py | 31 +- .../site-packages/setuptools/msvc9_support.py | 63 + .../site-packages/setuptools/package_index.py | 62 +- .../site-packages/setuptools/py31compat.py | 41 + awx/lib/site-packages/setuptools/sandbox.py | 237 ++- .../setuptools/script (dev).tmpl | 5 + awx/lib/site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 21 +- .../site-packages/setuptools/ssl_support.py | 9 +- .../setuptools/tests/__init__.py | 277 ++-- .../setuptools/tests/contexts.py | 93 ++ .../setuptools/tests/environment.py | 121 +- .../setuptools/tests/fixtures.py | 27 + .../indexes/test_links_priority/external.html | 3 + .../simple/foobar/index.html | 4 + .../setuptools/tests/py26compat.py | 26 +- .../site-packages/setuptools/tests/server.py | 27 +- .../setuptools/tests/test_bdist_egg.py | 58 +- .../setuptools/tests/test_build_ext.py | 20 +- .../setuptools/tests/test_develop.py | 45 +- .../setuptools/tests/test_dist_info.py | 93 +- .../setuptools/tests/test_easy_install.py | 477 +++--- .../setuptools/tests/test_egg_info.py | 235 +-- .../setuptools/tests/test_find_packages.py | 170 +++ .../setuptools/tests/test_integration.py | 99 ++ .../setuptools/tests/test_markerlib.py | 79 +- .../setuptools/tests/test_msvc9compiler.py | 179 +++ .../setuptools/tests/test_packageindex.py | 102 +- .../setuptools/tests/test_sandbox.py | 129 +- .../setuptools/tests/test_sdist.py | 378 ++--- .../setuptools/tests/test_test.py | 147 +- .../setuptools/tests/test_upload_docs.py | 87 +- .../setuptools/tests/test_windows_wrappers.py | 183 +++ .../setuptools/tests/textwrap.py | 8 + .../site-packages/setuptools/unicode_utils.py | 41 + awx/lib/site-packages/setuptools/utils.py | 11 + awx/lib/site-packages/setuptools/version.py | 2 +- .../setuptools/windows_support.py | 29 + 79 files changed, 7450 insertions(+), 3578 deletions(-) rename awx/lib/site-packages/{pkg_resources.py => pkg_resources/__init__.py} (74%) create mode 100644 awx/lib/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 awx/lib/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 awx/lib/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 awx/lib/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 awx/lib/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 awx/lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 awx/lib/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 awx/lib/site-packages/pkg_resources/_vendor/vendored.txt create mode 100644 awx/lib/site-packages/pkg_resources/api_tests.txt create mode 100644 awx/lib/site-packages/pkg_resources/tests/__init__.py create mode 100644 awx/lib/site-packages/pkg_resources/tests/test_pkg_resources.py create mode 100644 awx/lib/site-packages/pkg_resources/tests/test_resources.py create mode 100644 awx/lib/site-packages/setuptools/msvc9_support.py create mode 100644 awx/lib/site-packages/setuptools/script (dev).tmpl create mode 100644 awx/lib/site-packages/setuptools/script.tmpl create mode 100644 awx/lib/site-packages/setuptools/tests/contexts.py create mode 100644 awx/lib/site-packages/setuptools/tests/fixtures.py create mode 100644 awx/lib/site-packages/setuptools/tests/indexes/test_links_priority/external.html create mode 100644 awx/lib/site-packages/setuptools/tests/indexes/test_links_priority/simple/foobar/index.html create mode 100644 awx/lib/site-packages/setuptools/tests/test_find_packages.py create mode 100644 awx/lib/site-packages/setuptools/tests/test_integration.py create mode 100644 awx/lib/site-packages/setuptools/tests/test_msvc9compiler.py create mode 100644 awx/lib/site-packages/setuptools/tests/test_windows_wrappers.py create mode 100644 awx/lib/site-packages/setuptools/tests/textwrap.py create mode 100644 awx/lib/site-packages/setuptools/unicode_utils.py create mode 100644 awx/lib/site-packages/setuptools/utils.py create mode 100644 awx/lib/site-packages/setuptools/windows_support.py diff --git a/awx/lib/site-packages/README b/awx/lib/site-packages/README index 0506812d4c..65613ba7e2 100644 --- a/awx/lib/site-packages/README +++ b/awx/lib/site-packages/README @@ -54,7 +54,7 @@ rackspace-novaclient==1.4 (no files) rax-default-network-flags-python-novaclient-ext==0.2.3 (rax_default_network_flags_python_novaclient_ext/*) rax-scheduled-images-python-novaclient-ext==0.2.1 (rax_scheduled_images_python_novaclient_ext/*) requests==2.3.0 (requests/*) -setuptools==2.2 (setuptools/*, _markerlib/*, pkg_resources.py, easy_install.py, excluded bin/easy_install*) +setuptools==12.0.5 (setuptools/*, _markerlib/*, pkg_resources/*, easy_install.py) simplejson==3.6.0 (simplejson/*, excluded simplejson/_speedups.so) six==1.7.3 (six.py) South==0.8.4 (south/*) diff --git a/awx/lib/site-packages/pkg_resources.py b/awx/lib/site-packages/pkg_resources/__init__.py similarity index 74% rename from awx/lib/site-packages/pkg_resources.py rename to awx/lib/site-packages/pkg_resources/__init__.py index bde30989fe..c0c095b253 100644 --- a/awx/lib/site-packages/pkg_resources.py +++ b/awx/lib/site-packages/pkg_resources/__init__.py @@ -14,8 +14,11 @@ The package resource API is designed to work with normal filesystem packages, method. """ +from __future__ import absolute_import + import sys import os +import io import time import re import imp @@ -29,30 +32,27 @@ import token import symbol import operator import platform +import collections +import plistlib +import email.parser +import tempfile from pkgutil import get_importer -try: - from urlparse import urlparse, urlunparse -except ImportError: +PY3 = sys.version_info > (3,) +PY2 = not PY3 + +if PY3: from urllib.parse import urlparse, urlunparse -try: - frozenset -except NameError: - from sets import ImmutableSet as frozenset -try: - basestring - next = lambda o: o.next() - from cStringIO import StringIO as BytesIO -except NameError: - basestring = str - from io import BytesIO - def execfile(fn, globs=None, locs=None): - if globs is None: - globs = globals() - if locs is None: - locs = globs - exec(compile(open(fn).read(), fn, 'exec'), globs, locs) +if PY2: + from urlparse import urlparse, urlunparse + +if PY3: + string_types = str, +else: + string_types = str, eval('unicode') + +iteritems = (lambda i: i.items()) if PY3 else lambda i: i.iteritems() # capture these to bypass sandboxing from os import utime @@ -77,23 +77,142 @@ try: except ImportError: pass -def _bypass_ensure_directory(name, mode=0x1FF): # 0777 - # Sandbox-bypassing version of ensure_directory() - if not WRITE_SUPPORT: - raise IOError('"os.mkdir" not supported on this platform.') - dirname, filename = split(name) - if dirname and filename and not isdir(dirname): - _bypass_ensure_directory(dirname) - mkdir(dirname, mode) +try: + import pkg_resources._vendor.packaging.version + import pkg_resources._vendor.packaging.specifiers + packaging = pkg_resources._vendor.packaging +except ImportError: + # fallback to naturally-installed version; allows system packagers to + # omit vendored packages. + import packaging.version + import packaging.specifiers + + +class PEP440Warning(RuntimeWarning): + """ + Used when there is an issue with a version or specifier not complying with + PEP 440. + """ + + +class _SetuptoolsVersionMixin(object): + + def __hash__(self): + return super(_SetuptoolsVersionMixin, self).__hash__() + + def __lt__(self, other): + if isinstance(other, tuple): + return tuple(self) < other + else: + return super(_SetuptoolsVersionMixin, self).__lt__(other) + + def __le__(self, other): + if isinstance(other, tuple): + return tuple(self) <= other + else: + return super(_SetuptoolsVersionMixin, self).__le__(other) + + def __eq__(self, other): + if isinstance(other, tuple): + return tuple(self) == other + else: + return super(_SetuptoolsVersionMixin, self).__eq__(other) + + def __ge__(self, other): + if isinstance(other, tuple): + return tuple(self) >= other + else: + return super(_SetuptoolsVersionMixin, self).__ge__(other) + + def __gt__(self, other): + if isinstance(other, tuple): + return tuple(self) > other + else: + return super(_SetuptoolsVersionMixin, self).__gt__(other) + + def __ne__(self, other): + if isinstance(other, tuple): + return tuple(self) != other + else: + return super(_SetuptoolsVersionMixin, self).__ne__(other) + + def __getitem__(self, key): + return tuple(self)[key] + + def __iter__(self): + component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE) + replace = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + }.get + + def _parse_version_parts(s): + for part in component_re.split(s): + part = replace(part, part) + if not part or part == '.': + continue + if part[:1] in '0123456789': + # pad for numeric comparison + yield part.zfill(8) + else: + yield '*'+part + + # ensure that alpha/beta/candidate are before final + yield '*final' + + def old_parse_version(s): + parts = [] + for part in _parse_version_parts(s.lower()): + if part.startswith('*'): + # remove '-' before a prerelease tag + if part < '*final': + while parts and parts[-1] == '*final-': + parts.pop() + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == '00000000': + parts.pop() + parts.append(part) + return tuple(parts) + + # Warn for use of this function + warnings.warn( + "You have iterated over the result of " + "pkg_resources.parse_version. This is a legacy behavior which is " + "inconsistent with the new version class introduced in setuptools " + "8.0. That class should be used directly instead of attempting to " + "iterate over the result.", + RuntimeWarning, + stacklevel=1, + ) + + for part in old_parse_version(str(self)): + yield part + + +class SetuptoolsVersion(_SetuptoolsVersionMixin, packaging.version.Version): + pass + + +class SetuptoolsLegacyVersion(_SetuptoolsVersionMixin, + packaging.version.LegacyVersion): + pass + + +def parse_version(v): + try: + return SetuptoolsVersion(v) + except packaging.version.InvalidVersion: + return SetuptoolsLegacyVersion(v) _state_vars = {} def _declare_state(vartype, **kw): - g = globals() - for name, val in kw.items(): - g[name] = val - _state_vars[name] = vartype + globals().update(kw) + _state_vars.update(dict.fromkeys(kw, vartype)) def __getstate__(): state = {} @@ -143,13 +262,15 @@ def get_supported_platform(): try: plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) except ValueError: - pass # not Mac OS X + # not Mac OS X + pass return plat __all__ = [ # Basic resource access and distribution/entry point discovery 'require', 'run_script', 'get_provider', 'get_distribution', - 'load_entry_point', 'get_entry_map', 'get_entry_info', 'iter_entry_points', + 'load_entry_point', 'get_entry_map', 'get_entry_info', + 'iter_entry_points', 'resource_string', 'resource_stream', 'resource_filename', 'resource_listdir', 'resource_exists', 'resource_isdir', @@ -163,8 +284,11 @@ __all__ = [ 'Distribution', 'Requirement', 'EntryPoint', # Exceptions - 'ResolutionError','VersionConflict','DistributionNotFound','UnknownExtra', - 'ExtractionError', + 'ResolutionError', 'VersionConflict', 'DistributionNotFound', + 'UnknownExtra', 'ExtractionError', + + # Warnings + 'PEP440Warning', # Parsing functions and string utilities 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', @@ -193,8 +317,51 @@ class ResolutionError(Exception): def __repr__(self): return self.__class__.__name__+repr(self.args) + class VersionConflict(ResolutionError): - """An already-installed version conflicts with the requested version""" + """ + An already-installed version conflicts with the requested version. + + Should be initialized with the installed Distribution and the requested + Requirement. + """ + + _template = "{self.dist} is installed but {self.req} is required" + + @property + def dist(self): + return self.args[0] + + @property + def req(self): + return self.args[1] + + def report(self): + return self._template.format(**locals()) + + def with_context(self, required_by): + """ + If required_by is non-empty, return a version of self that is a + ContextualVersionConflict. + """ + if not required_by: + return self + args = self.args + (required_by,) + return ContextualVersionConflict(*args) + + +class ContextualVersionConflict(VersionConflict): + """ + A VersionConflict that accepts a third parameter, the set of the + requirements that required the installed Distribution. + """ + + _template = VersionConflict._template + ' by {self.required_by}' + + @property + def required_by(self): + return self.args[2] + class DistributionNotFound(ResolutionError): """A requested distribution was not found""" @@ -221,7 +388,7 @@ def register_loader_type(loader_type, provider_factory): def get_provider(moduleOrReq): """Return an IResourceProvider for the named module or requirement""" - if isinstance(moduleOrReq,Requirement): + if isinstance(moduleOrReq, Requirement): return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] try: module = sys.modules[moduleOrReq] @@ -233,11 +400,9 @@ def get_provider(moduleOrReq): def _macosx_vers(_cache=[]): if not _cache: - import platform version = platform.mac_ver()[0] # fallback for MacPorts if version == '': - import plistlib plist = '/System/Library/CoreServices/SystemVersion.plist' if os.path.exists(plist): if hasattr(plistlib, 'readPlist'): @@ -249,7 +414,7 @@ def _macosx_vers(_cache=[]): return _cache[0] def _macosx_arch(machine): - return {'PowerPC':'ppc', 'Power_Macintosh':'ppc'}.get(machine,machine) + return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) def get_build_platform(): """Return this platform's string for platform-specific distributions @@ -278,10 +443,11 @@ def get_build_platform(): macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") -get_platform = get_build_platform # XXX backward compat +# XXX backward compat +get_platform = get_build_platform -def compatible_platforms(provided,required): +def compatible_platforms(provided, required): """Can code for the `provided` platform run on the `required` platform? Returns true if either platform is ``None``, or the platforms are equal. @@ -289,7 +455,8 @@ def compatible_platforms(provided,required): XXX Needs compatibility checks for Linux and other unixy OSes. """ if provided is None or required is None or provided==required: - return True # easy case + # easy case + return True # Mac OS X special cases reqMac = macosVersionString.match(required) @@ -307,13 +474,9 @@ def compatible_platforms(provided,required): macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) if dversion == 7 and macosversion >= "10.3" or \ dversion == 8 and macosversion >= "10.4": - - #import warnings - #warnings.warn("Mac eggs should be rebuilt to " - # "use the macosx designation instead of darwin.", - # category=DeprecationWarning) return True - return False # egg isn't macosx or legacy darwin + # egg isn't macosx or legacy darwin + return False # are they the same major version and machine type? if provMac.group(1) != reqMac.group(1) or \ @@ -338,13 +501,16 @@ def run_script(dist_spec, script_name): ns['__name__'] = name require(dist_spec)[0].run_script(script_name, ns) -run_main = run_script # backward compatibility +# backward compatibility +run_main = run_script def get_distribution(dist): """Return a current distribution object for a Requirement or string""" - if isinstance(dist,basestring): dist = Requirement.parse(dist) - if isinstance(dist,Requirement): dist = get_provider(dist) - if not isinstance(dist,Distribution): + if isinstance(dist, string_types): + dist = Requirement.parse(dist) + if isinstance(dist, Requirement): + dist = get_provider(dist) + if not isinstance(dist, Distribution): raise TypeError("Expected string, Requirement, or Distribution", dist) return dist @@ -429,6 +595,48 @@ class WorkingSet(object): for entry in entries: self.add_entry(entry) + @classmethod + def _build_master(cls): + """ + Prepare the master working set. + """ + ws = cls() + try: + from __main__ import __requires__ + except ImportError: + # The main program does not list any requirements + return ws + + # ensure the requirements are met + try: + ws.require(__requires__) + except VersionConflict: + return cls._build_from_requirements(__requires__) + + return ws + + @classmethod + def _build_from_requirements(cls, req_spec): + """ + Build a working set from a requirement spec. Rewrites sys.path. + """ + # try it without defaults already on sys.path + # by starting with an empty path + ws = cls([]) + reqs = parse_requirements(req_spec) + dists = ws.resolve(reqs, Environment()) + for dist in dists: + ws.add(dist) + + # add any missing entries from sys.path + for entry in sys.path: + if entry not in ws.entries: + ws.add_entry(entry) + + # then copy back to sys.path + sys.path[:] = ws.entries + return ws + def add_entry(self, entry): """Add a path item to ``.entries``, finding any distributions on it @@ -444,7 +652,7 @@ class WorkingSet(object): for dist in find_distributions(entry, True): self.add(dist, entry, False) - def __contains__(self,dist): + def __contains__(self, dist): """True if `dist` is the active distribution for its project""" return self.by_key.get(dist.key) == dist @@ -460,9 +668,9 @@ class WorkingSet(object): """ dist = self.by_key.get(req.key) if dist is not None and dist not in req: - raise VersionConflict(dist,req) # XXX add more info - else: - return dist + # XXX add more info + raise VersionConflict(dist, req) + return dist def iter_entry_points(self, group, name=None): """Yield entry point objects from `group` matching `name` @@ -524,7 +732,8 @@ class WorkingSet(object): keys = self.entry_keys.setdefault(entry,[]) keys2 = self.entry_keys.setdefault(dist.location,[]) if not replace and dist.key in self.by_key: - return # ignore hidden distros + # ignore hidden distros + return self.by_key[dist.key] = dist if dist.key not in keys: @@ -552,13 +761,21 @@ class WorkingSet(object): it. """ - requirements = list(requirements)[::-1] # set up the stack - processed = {} # set of processed requirements - best = {} # key -> dist + # set up the stack + requirements = list(requirements)[::-1] + # set of processed requirements + processed = {} + # key -> dist + best = {} to_activate = [] + # Mapping of requirement to set of distributions that required it; + # useful for reporting info about conflicts. + required_by = collections.defaultdict(set) + while requirements: - req = requirements.pop(0) # process dependencies breadth-first + # process dependencies breadth-first + req = requirements.pop(0) if req in processed: # Ignore cyclic or redundant dependencies continue @@ -589,11 +806,21 @@ class WorkingSet(object): to_activate.append(dist) if dist not in req: # Oops, the "best" so far conflicts with a dependency - raise VersionConflict(dist,req) # XXX put more info here - requirements.extend(dist.requires(req.extras)[::-1]) + dependent_req = required_by[req] + raise VersionConflict(dist, req).with_context(dependent_req) + + # push the new requirements onto the stack + new_requirements = dist.requires(req.extras)[::-1] + requirements.extend(new_requirements) + + # Register the new requirements needed by req + for new_requirement in new_requirements: + required_by[new_requirement].add(req.project_name) + processed[req] = True - return to_activate # return list of distros to activate + # return list of distros to activate + return to_activate def find_plugins(self, plugin_env, full_env=None, installer=None, fallback=True): @@ -604,8 +831,10 @@ class WorkingSet(object): distributions, errors = working_set.find_plugins( Environment(plugin_dirlist) ) - map(working_set.add, distributions) # add plugins+libs to sys.path - print 'Could not load', errors # display errors + # add plugins+libs to sys.path + map(working_set.add, distributions) + # display errors + print('Could not load', errors) The `plugin_env` should be an ``Environment`` instance that contains only distributions that are in the project's "plugin directory" or @@ -630,7 +859,8 @@ class WorkingSet(object): """ plugin_projects = list(plugin_env) - plugin_projects.sort() # scan project names in alphabetic order + # scan project names in alphabetic order + plugin_projects.sort() error_info = {} distributions = {} @@ -642,7 +872,8 @@ class WorkingSet(object): env = full_env + plugin_env shadow_set = self.__class__([]) - list(map(shadow_set.add, self)) # put all our entries in shadow_set + # put all our entries in shadow_set + list(map(shadow_set.add, self)) for project_name in plugin_projects: @@ -653,13 +884,15 @@ class WorkingSet(object): try: resolvees = shadow_set.resolve(req, env, installer) - except ResolutionError: - v = sys.exc_info()[1] - error_info[dist] = v # save error info + except ResolutionError as v: + # save error info + error_info[dist] = v if fallback: - continue # try the next older version of project + # try the next older version of project + continue else: - break # give up on this project, keep going + # give up on this project, keep going + break else: list(map(shadow_set.add, resolvees)) @@ -718,7 +951,8 @@ class WorkingSet(object): class Environment(object): """Searchable snapshot of distributions on a search path""" - def __init__(self, search_path=None, platform=get_supported_platform(), python=PY_MAJOR): + def __init__(self, search_path=None, platform=get_supported_platform(), + python=PY_MAJOR): """Snapshot distributions available on a search path Any distributions found on `search_path` are added to the environment. @@ -736,7 +970,6 @@ class Environment(object): running platform or Python version. """ self._distmap = {} - self._cache = {} self.platform = platform self.python = python self.scan(search_path) @@ -750,7 +983,7 @@ class Environment(object): """ return (self.python is None or dist.py_version is None or dist.py_version==self.python) \ - and compatible_platforms(dist.platform,self.platform) + and compatible_platforms(dist.platform, self.platform) def remove(self, dist): """Remove `dist` from the environment""" @@ -771,30 +1004,25 @@ class Environment(object): for dist in find_distributions(item): self.add(dist) - def __getitem__(self,project_name): + def __getitem__(self, project_name): """Return a newest-to-oldest list of distributions for `project_name` + + Uses case-insensitive `project_name` comparison, assuming all the + project's distributions use their project's name converted to all + lowercase as their key. + """ - try: - return self._cache[project_name] - except KeyError: - project_name = project_name.lower() - if project_name not in self._distmap: - return [] + distribution_key = project_name.lower() + return self._distmap.get(distribution_key, []) - if project_name not in self._cache: - dists = self._cache[project_name] = self._distmap[project_name] - _sort_dists(dists) - - return self._cache[project_name] - - def add(self,dist): - """Add `dist` if we ``can_add()`` it and it isn't already added""" + def add(self, dist): + """Add `dist` if we ``can_add()`` it and it has not already been added + """ if self.can_add(dist) and dist.has_version(): - dists = self._distmap.setdefault(dist.key,[]) + dists = self._distmap.setdefault(dist.key, []) if dist not in dists: dists.append(dist) - if dist.key in self._cache: - _sort_dists(self._cache[dist.key]) + dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) def best_match(self, req, working_set, installer=None): """Find distribution best matching `req` and usable on `working_set` @@ -815,7 +1043,8 @@ class Environment(object): for dist in self[req.key]: if dist in req: return dist - return self.obtain(req, installer) # try and download/install + # try to download/install + return self.obtain(req, installer) def obtain(self, requirement, installer=None): """Obtain a distribution matching `requirement` (e.g. via download) @@ -832,13 +1061,14 @@ class Environment(object): def __iter__(self): """Yield the unique project names of the available distributions""" for key in self._distmap.keys(): - if self[key]: yield key + if self[key]: + yield key def __iadd__(self, other): """In-place addition of a distribution or environment""" - if isinstance(other,Distribution): + if isinstance(other, Distribution): self.add(other) - elif isinstance(other,Environment): + elif isinstance(other, Environment): for project in other: for dist in other[project]: self.add(dist) @@ -854,7 +1084,8 @@ class Environment(object): return new -AvailableDistributions = Environment # XXX backward compatibility +# XXX backward compatibility +AvailableDistributions = Environment class ExtractionError(RuntimeError): @@ -1007,7 +1238,7 @@ variable to point to an accessible directory. if os.name == 'posix': # Make the resource executable - mode = ((os.stat(tempname).st_mode) | 0x16D) & 0xFFF # 0555, 07777 + mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 os.chmod(tempname, mode) def set_extraction_path(self, path): @@ -1064,14 +1295,17 @@ def get_default_cache(): if os.name!='nt': return os.path.expanduser('~/.python-eggs') - app_data = 'Application Data' # XXX this may be locale-specific! + # XXX this may be locale-specific! + app_data = 'Application Data' app_homes = [ - (('APPDATA',), None), # best option, should be locale-safe + # best option, should be locale-safe + (('APPDATA',), None), (('USERPROFILE',), app_data), (('HOMEDRIVE','HOMEPATH'), app_data), (('HOMEPATH',), app_data), (('HOME',), None), - (('WINDIR',), app_data), # 95/98/ME + # 95/98/ME + (('WINDIR',), app_data), ] for keys, subdir in app_homes: @@ -1083,7 +1317,7 @@ def get_default_cache(): break else: if subdir: - dirname = os.path.join(dirname,subdir) + dirname = os.path.join(dirname, subdir) return os.path.join(dirname, 'Python-Eggs') else: raise RuntimeError( @@ -1099,13 +1333,15 @@ def safe_name(name): def safe_version(version): - """Convert an arbitrary string to a standard version string - - Spaces become dots, and all other non-alphanumeric characters become - dashes, with runs of multiple dashes condensed to a single dash. """ - version = version.replace(' ','.') - return re.sub('[^A-Za-z0-9.]+', '-', version) + Convert an arbitrary string to a standard version string + """ + try: + # normalize the version + return str(packaging.version.Version(version)) + except packaging.version.InvalidVersion: + version = version.replace(' ','.') + return re.sub('[^A-Za-z0-9.]+', '-', version) def safe_extra(extra): @@ -1129,8 +1365,8 @@ class MarkerEvaluation(object): values = { 'os_name': lambda: os.name, 'sys_platform': lambda: sys.platform, - 'python_full_version': lambda: sys.version.split()[0], - 'python_version': lambda:'%s.%s' % (sys.version_info[0], sys.version_info[1]), + 'python_full_version': platform.python_version, + 'python_version': lambda: platform.python_version()[:3], 'platform_version': platform.version, 'platform_machine': platform.machine, 'python_implementation': platform.python_implementation, @@ -1144,16 +1380,18 @@ class MarkerEvaluation(object): """ try: cls.evaluate_marker(text) - except SyntaxError: - return cls.normalize_exception(sys.exc_info()[1]) + except SyntaxError as e: + return cls.normalize_exception(e) return False @staticmethod def normalize_exception(exc): """ - Given a SyntaxError from a marker evaluation, normalize the error message: + Given a SyntaxError from a marker evaluation, normalize the error + message: - Remove indications of filename and line number. - - Replace platform-specific error messages with standard error messages. + - Replace platform-specific error messages with standard error + messages. """ subs = { 'unexpected EOF while parsing': 'invalid syntax', @@ -1167,12 +1405,20 @@ class MarkerEvaluation(object): @classmethod def and_test(cls, nodelist): # MUST NOT short-circuit evaluation, or invalid syntax can be skipped! - return functools.reduce(operator.and_, [cls.interpret(nodelist[i]) for i in range(1,len(nodelist),2)]) + items = [ + cls.interpret(nodelist[i]) + for i in range(1, len(nodelist), 2) + ] + return functools.reduce(operator.and_, items) @classmethod def test(cls, nodelist): # MUST NOT short-circuit evaluation, or invalid syntax can be skipped! - return functools.reduce(operator.or_, [cls.interpret(nodelist[i]) for i in range(1,len(nodelist),2)]) + items = [ + cls.interpret(nodelist[i]) + for i in range(1, len(nodelist), 2) + ] + return functools.reduce(operator.or_, items) @classmethod def atom(cls, nodelist): @@ -1181,12 +1427,14 @@ class MarkerEvaluation(object): if nodelist[2][0] == token.RPAR: raise SyntaxError("Empty parentheses") return cls.interpret(nodelist[2]) - raise SyntaxError("Language feature not supported in environment markers") + msg = "Language feature not supported in environment markers" + raise SyntaxError(msg) @classmethod def comparison(cls, nodelist): - if len(nodelist)>4: - raise SyntaxError("Chained comparison not allowed in environment markers") + if len(nodelist) > 4: + msg = "Chained comparison not allowed in environment markers" + raise SyntaxError(msg) comp = nodelist[2][1] cop = comp[1] if comp[0] == token.NAME: @@ -1198,7 +1446,8 @@ class MarkerEvaluation(object): try: cop = cls.get_op(cop) except KeyError: - raise SyntaxError(repr(cop)+" operator not allowed in environment markers") + msg = repr(cop) + " operator not allowed in environment markers" + raise SyntaxError(msg) return cop(cls.evaluate(nodelist[1]), cls.evaluate(nodelist[3])) @classmethod @@ -1224,7 +1473,8 @@ class MarkerEvaluation(object): Return a boolean indicating the marker result in this environment. Raise SyntaxError if marker is invalid. - This implementation uses the 'parser' module, which is not implemented on + This implementation uses the 'parser' module, which is not implemented + on Jython and has been superseded by the 'ast' module in Python 2.6 and later. """ @@ -1246,8 +1496,7 @@ class MarkerEvaluation(object): env[new_key] = env.pop(key) try: result = _markerlib.interpret(text, env) - except NameError: - e = sys.exc_info()[1] + except NameError as e: raise SyntaxError(e.args[0]) return result @@ -1278,12 +1527,21 @@ class MarkerEvaluation(object): return op() if kind==token.STRING: s = nodelist[1] - if s[:1] not in "'\"" or s.startswith('"""') or s.startswith("'''") \ - or '\\' in s: + if not cls._safe_string(s): raise SyntaxError( "Only plain strings allowed in environment markers") return s[1:-1] - raise SyntaxError("Language feature not supported in environment markers") + msg = "Language feature not supported in environment markers" + raise SyntaxError(msg) + + @staticmethod + def _safe_string(cand): + return ( + cand[:1] in "'\"" and + not cand.startswith('"""') and + not cand.startswith("'''") and + '\\' not in cand + ) invalid_marker = MarkerEvaluation.is_invalid_marker evaluate_marker = MarkerEvaluation.evaluate_marker @@ -1303,7 +1561,7 @@ class NullProvider: return self._fn(self.module_path, resource_name) def get_resource_stream(self, manager, resource_name): - return BytesIO(self.get_resource_string(manager, resource_name)) + return io.BytesIO(self.get_resource_string(manager, resource_name)) def get_resource_string(self, manager, resource_name): return self._get(self._fn(self.module_path, resource_name)) @@ -1312,52 +1570,54 @@ class NullProvider: return self._has(self._fn(self.module_path, resource_name)) def has_metadata(self, name): - return self.egg_info and self._has(self._fn(self.egg_info,name)) + return self.egg_info and self._has(self._fn(self.egg_info, name)) if sys.version_info <= (3,): def get_metadata(self, name): if not self.egg_info: return "" - return self._get(self._fn(self.egg_info,name)) + return self._get(self._fn(self.egg_info, name)) else: def get_metadata(self, name): if not self.egg_info: return "" - return self._get(self._fn(self.egg_info,name)).decode("utf-8") + return self._get(self._fn(self.egg_info, name)).decode("utf-8") def get_metadata_lines(self, name): return yield_lines(self.get_metadata(name)) - def resource_isdir(self,resource_name): + def resource_isdir(self, resource_name): return self._isdir(self._fn(self.module_path, resource_name)) - def metadata_isdir(self,name): - return self.egg_info and self._isdir(self._fn(self.egg_info,name)) + def metadata_isdir(self, name): + return self.egg_info and self._isdir(self._fn(self.egg_info, name)) - def resource_listdir(self,resource_name): - return self._listdir(self._fn(self.module_path,resource_name)) + def resource_listdir(self, resource_name): + return self._listdir(self._fn(self.module_path, resource_name)) - def metadata_listdir(self,name): + def metadata_listdir(self, name): if self.egg_info: - return self._listdir(self._fn(self.egg_info,name)) + return self._listdir(self._fn(self.egg_info, name)) return [] - def run_script(self,script_name,namespace): + def run_script(self, script_name, namespace): script = 'scripts/'+script_name if not self.has_metadata(script): raise ResolutionError("No script named %r" % script_name) - script_text = self.get_metadata(script).replace('\r\n','\n') - script_text = script_text.replace('\r','\n') - script_filename = self._fn(self.egg_info,script) + script_text = self.get_metadata(script).replace('\r\n', '\n') + script_text = script_text.replace('\r', '\n') + script_filename = self._fn(self.egg_info, script) namespace['__file__'] = script_filename if os.path.exists(script_filename): - execfile(script_filename, namespace, namespace) + source = open(script_filename).read() + code = compile(source, script_filename, 'exec') + exec(code, namespace, namespace) else: from linecache import cache cache[script_filename] = ( len(script_text), 0, script_text.split('\n'), script_filename ) - script_code = compile(script_text,script_filename,'exec') + script_code = compile(script_text, script_filename,'exec') exec(script_code, namespace, namespace) def _has(self, path): @@ -1393,8 +1653,8 @@ register_loader_type(object, NullProvider) class EggProvider(NullProvider): """Provider based on a virtual filesystem""" - def __init__(self,module): - NullProvider.__init__(self,module) + def __init__(self, module): + NullProvider.__init__(self, module) self._setup_prefix() def _setup_prefix(self): @@ -1417,21 +1677,18 @@ class DefaultProvider(EggProvider): def _has(self, path): return os.path.exists(path) - def _isdir(self,path): + def _isdir(self, path): return os.path.isdir(path) - def _listdir(self,path): + def _listdir(self, path): return os.listdir(path) def get_resource_stream(self, manager, resource_name): return open(self._fn(self.module_path, resource_name), 'rb') def _get(self, path): - stream = open(path, 'rb') - try: + with open(path, 'rb') as stream: return stream.read() - finally: - stream.close() register_loader_type(type(None), DefaultProvider) @@ -1442,9 +1699,9 @@ if importlib_bootstrap is not None: class EmptyProvider(NullProvider): """Provider that returns nothing for all requests""" - _isdir = _has = lambda self,path: False - _get = lambda self,path: '' - _listdir = lambda self,path: [] + _isdir = _has = lambda self, path: False + _get = lambda self, path: '' + _listdir = lambda self, path: [] module_path = None def __init__(self): @@ -1453,47 +1710,81 @@ class EmptyProvider(NullProvider): empty_provider = EmptyProvider() -def build_zipmanifest(path): +class ZipManifests(dict): + """ + zip manifest builder """ - This builds a similar dictionary to the zipimport directory - caches. However instead of tuples, ZipInfo objects are stored. - The translation of the tuple is as follows: - * [0] - zipinfo.filename on stock pythons this needs "/" --> os.sep - on pypy it is the same (one reason why distribute did work - in some cases on pypy and win32). - * [1] - zipinfo.compress_type - * [2] - zipinfo.compress_size - * [3] - zipinfo.file_size - * [4] - len(utf-8 encoding of filename) if zipinfo & 0x800 - len(ascii encoding of filename) otherwise - * [5] - (zipinfo.date_time[0] - 1980) << 9 | - zipinfo.date_time[1] << 5 | zipinfo.date_time[2] - * [6] - (zipinfo.date_time[3] - 1980) << 11 | - zipinfo.date_time[4] << 5 | (zipinfo.date_time[5] // 2) - * [7] - zipinfo.CRC + @classmethod + def build(cls, path): + """ + Build a dictionary similar to the zipimport directory + caches, except instead of tuples, store ZipInfo objects. + + Use a platform-specific path separator (os.sep) for the path keys + for compatibility with pypy on Windows. + """ + with ContextualZipFile(path) as zfile: + items = ( + ( + name.replace('/', os.sep), + zfile.getinfo(name), + ) + for name in zfile.namelist() + ) + return dict(items) + + load = build + + +class MemoizedZipManifests(ZipManifests): """ - zipinfo = dict() - zfile = zipfile.ZipFile(path) - #Got ZipFile has not __exit__ on python 3.1 - try: - for zitem in zfile.namelist(): - zpath = zitem.replace('/', os.sep) - zipinfo[zpath] = zfile.getinfo(zitem) - assert zipinfo[zpath] is not None - finally: - zfile.close() - return zipinfo + Memoized zipfile manifests. + """ + manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') + + def load(self, path): + """ + Load a manifest at path or return a suitable manifest already loaded. + """ + path = os.path.normpath(path) + mtime = os.stat(path).st_mtime + + if path not in self or self[path].mtime != mtime: + manifest = self.build(path) + self[path] = self.manifest_mod(manifest, mtime) + + return self[path].manifest + + +class ContextualZipFile(zipfile.ZipFile): + """ + Supplement ZipFile class to support context manager for Python 2.6 + """ + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + self.close() + + def __new__(cls, *args, **kwargs): + """ + Construct a ZipFile or ContextualZipFile as appropriate + """ + if hasattr(zipfile.ZipFile, '__exit__'): + return zipfile.ZipFile(*args, **kwargs) + return super(ContextualZipFile, cls).__new__(cls) class ZipProvider(EggProvider): """Resource support for zips and eggs""" eagers = None + _zip_manifests = MemoizedZipManifests() def __init__(self, module): - EggProvider.__init__(self,module) - self.zipinfo = build_zipmanifest(self.loader.archive) + EggProvider.__init__(self, module) self.zip_pre = self.loader.archive+os.sep def _zipinfo_name(self, fspath): @@ -1502,18 +1793,23 @@ class ZipProvider(EggProvider): if fspath.startswith(self.zip_pre): return fspath[len(self.zip_pre):] raise AssertionError( - "%s is not a subpath of %s" % (fspath,self.zip_pre) + "%s is not a subpath of %s" % (fspath, self.zip_pre) ) - def _parts(self,zip_path): - # Convert a zipfile subpath into an egg-relative path part list - fspath = self.zip_pre+zip_path # pseudo-fs path + def _parts(self, zip_path): + # Convert a zipfile subpath into an egg-relative path part list. + # pseudo-fs path + fspath = self.zip_pre+zip_path if fspath.startswith(self.egg_root+os.sep): return fspath[len(self.egg_root)+1:].split(os.sep) raise AssertionError( - "%s is not a subpath of %s" % (fspath,self.egg_root) + "%s is not a subpath of %s" % (fspath, self.egg_root) ) + @property + def zipinfo(self): + return self._zip_manifests.load(self.loader.archive) + def get_resource_filename(self, manager, resource_name): if not self.egg_name: raise NotImplementedError( @@ -1530,8 +1826,9 @@ class ZipProvider(EggProvider): @staticmethod def _get_date_and_size(zip_stat): size = zip_stat.file_size - date_time = zip_stat.date_time + (0, 0, -1) # ymdhms+wday, yday, dst - #1980 offset already done + # ymdhms+wday, yday, dst + date_time = zip_stat.date_time + (0, 0, -1) + # 1980 offset already done timestamp = time.mktime(date_time) return timestamp, size @@ -1542,7 +1839,8 @@ class ZipProvider(EggProvider): last = self._extract_resource( manager, os.path.join(zip_path, name) ) - return os.path.dirname(last) # return the extracted directory name + # return the extracted directory name + return os.path.dirname(last) timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) @@ -1561,7 +1859,7 @@ class ZipProvider(EggProvider): outf, tmpnam = _mkstemp(".$extract", dir=os.path.dirname(real_path)) os.write(outf, self.loader.get_data(zip_path)) os.close(outf) - utime(tmpnam, (timestamp,timestamp)) + utime(tmpnam, (timestamp, timestamp)) manager.postprocess(tmpnam, real_path) try: @@ -1573,14 +1871,16 @@ class ZipProvider(EggProvider): # the file became current since it was checked above, # so proceed. return real_path - elif os.name=='nt': # Windows, del old file and retry + # Windows, del old file and retry + elif os.name=='nt': unlink(real_path) rename(tmpnam, real_path) return real_path raise except os.error: - manager.extraction_error() # report a user-friendly error + # report a user-friendly error + manager.extraction_error() return real_path @@ -1596,9 +1896,8 @@ class ZipProvider(EggProvider): return False # check that the contents match zip_contents = self.loader.get_data(zip_path) - f = open(file_path, 'rb') - file_contents = f.read() - f.close() + with open(file_path, 'rb') as f: + file_contents = f.read() return zip_contents == file_contents def _get_eager_resources(self): @@ -1631,17 +1930,17 @@ class ZipProvider(EggProvider): zip_path = self._zipinfo_name(fspath) return zip_path in self.zipinfo or zip_path in self._index() - def _isdir(self,fspath): + def _isdir(self, fspath): return self._zipinfo_name(fspath) in self._index() - def _listdir(self,fspath): + def _listdir(self, fspath): return list(self._index().get(self._zipinfo_name(fspath), ())) - def _eager_to_zip(self,resource_name): - return self._zipinfo_name(self._fn(self.egg_root,resource_name)) + def _eager_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.egg_root, resource_name)) - def _resource_to_zip(self,resource_name): - return self._zipinfo_name(self._fn(self.module_path,resource_name)) + def _resource_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.module_path, resource_name)) register_loader_type(zipimport.zipimporter, ZipProvider) @@ -1658,21 +1957,20 @@ class FileMetadata(EmptyProvider): the provided location. """ - def __init__(self,path): + def __init__(self, path): self.path = path - def has_metadata(self,name): + def has_metadata(self, name): return name=='PKG-INFO' - def get_metadata(self,name): + def get_metadata(self, name): if name=='PKG-INFO': - f = open(self.path,'rU') - metadata = f.read() - f.close() + with open(self.path,'rU') as f: + metadata = f.read() return metadata raise KeyError("No metadata except PKG-INFO is available") - def get_metadata_lines(self,name): + def get_metadata_lines(self, name): return yield_lines(self.get_metadata(name)) @@ -1687,7 +1985,7 @@ class PathMetadata(DefaultProvider): base_dir = os.path.dirname(egg_info) metadata = PathMetadata(base_dir, egg_info) dist_name = os.path.splitext(os.path.basename(egg_info))[0] - dist = Distribution(basedir,project_name=dist_name,metadata=metadata) + dist = Distribution(basedir, project_name=dist_name, metadata=metadata) # Unpacked egg directories: @@ -1707,7 +2005,6 @@ class EggMetadata(ZipProvider): def __init__(self, importer): """Create a metadata provider from a zipimporter""" - self.zipinfo = build_zipmanifest(importer.archive) self.zip_pre = importer.archive+os.sep self.loader = importer if importer.prefix: @@ -1746,7 +2043,8 @@ def find_eggs_in_zip(importer, path_item, only=False): if metadata.has_metadata('PKG-INFO'): yield Distribution.from_filename(path_item, metadata=metadata) if only: - return # don't yield nested distros + # don't yield nested distros + return for subitem in metadata.resource_listdir('/'): if subitem.endswith('.egg'): subpath = os.path.join(path_item, subitem) @@ -1757,7 +2055,7 @@ register_finder(zipimport.zipimporter, find_eggs_in_zip) def find_nothing(importer, path_item, only=False): return () -register_finder(object,find_nothing) +register_finder(object, find_nothing) def find_on_path(importer, path_item, only=False): """Yield distributions accessible on a sys.path directory""" @@ -1783,23 +2081,24 @@ def find_on_path(importer, path_item, only=False): else: metadata = FileMetadata(fullpath) yield Distribution.from_location( - path_item,entry,metadata,precedence=DEVELOP_DIST + path_item, entry, metadata, precedence=DEVELOP_DIST ) elif not only and lower.endswith('.egg'): - for dist in find_distributions(os.path.join(path_item, entry)): + dists = find_distributions(os.path.join(path_item, entry)) + for dist in dists: yield dist elif not only and lower.endswith('.egg-link'): - entry_file = open(os.path.join(path_item, entry)) - try: + with open(os.path.join(path_item, entry)) as entry_file: entry_lines = entry_file.readlines() - finally: - entry_file.close() for line in entry_lines: - if not line.strip(): continue - for item in find_distributions(os.path.join(path_item,line.rstrip())): + if not line.strip(): + continue + path = os.path.join(path_item, line.rstrip()) + dists = find_distributions(path) + for item in dists: yield item break -register_finder(pkgutil.ImpImporter,find_on_path) +register_finder(pkgutil.ImpImporter, find_on_path) if importlib_bootstrap is not None: register_finder(importlib_bootstrap.FileFinder, find_on_path) @@ -1814,7 +2113,7 @@ def register_namespace_handler(importer_type, namespace_handler): `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item handler), and `namespace_handler` is a callable like this:: - def namespace_handler(importer,path_entry,moduleName,module): + def namespace_handler(importer, path_entry, moduleName, module): # return a path_entry to use for child packages Namespace handlers are only called if the importer object has already @@ -1890,7 +2189,8 @@ def fixup_namespace_packages(path_item, parent=None): try: for package in _namespace_packages.get(parent,()): subpath = _handle_ns(package, path_item) - if subpath: fixup_namespace_packages(subpath,package) + if subpath: + fixup_namespace_packages(subpath, package) finally: imp.release_lock() @@ -1906,8 +2206,8 @@ def file_ns_handler(importer, path_item, packageName, module): # Only return the path if it's not already there return subpath -register_namespace_handler(pkgutil.ImpImporter,file_ns_handler) -register_namespace_handler(zipimport.zipimporter,file_ns_handler) +register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) +register_namespace_handler(zipimport.zipimporter, file_ns_handler) if importlib_bootstrap is not None: register_namespace_handler(importlib_bootstrap.FileFinder, file_ns_handler) @@ -1916,14 +2216,14 @@ if importlib_bootstrap is not None: def null_ns_handler(importer, path_item, packageName, module): return None -register_namespace_handler(object,null_ns_handler) +register_namespace_handler(object, null_ns_handler) def normalize_path(filename): """Normalize a file/dir name for comparison purposes""" return os.path.normcase(os.path.realpath(filename)) -def _normalize_cached(filename,_cache={}): +def _normalize_cached(filename, _cache={}): try: return _cache[filename] except KeyError: @@ -1939,22 +2239,28 @@ def _set_parent_ns(packageName): def yield_lines(strs): - """Yield non-empty/non-comment lines of a ``basestring`` or sequence""" - if isinstance(strs,basestring): + """Yield non-empty/non-comment lines of a string or sequence""" + if isinstance(strs, string_types): for s in strs.splitlines(): s = s.strip() - if s and not s.startswith('#'): # skip blank lines/comments + # skip blank lines/comments + if s and not s.startswith('#'): yield s else: for ss in strs: for s in yield_lines(ss): yield s -LINE_END = re.compile(r"\s*(#.*)?$").match # whitespace and comment -CONTINUE = re.compile(r"\s*\\\s*(#.*)?$").match # line continuation -DISTRO = re.compile(r"\s*((\w|[-.])+)").match # Distribution or extra -VERSION = re.compile(r"\s*(<=?|>=?|==|!=)\s*((\w|[-.])+)").match # ver. info -COMMA = re.compile(r"\s*,").match # comma between items +# whitespace and comment +LINE_END = re.compile(r"\s*(#.*)?$").match +# line continuation +CONTINUE = re.compile(r"\s*\\\s*(#.*)?$").match +# Distribution or extra +DISTRO = re.compile(r"\s*((\w|[-.])+)").match +# ver. info +VERSION = re.compile(r"\s*(<=?|>=?|===?|!=|~=)\s*((\w|[-.*_!+])+)").match +# comma between items +COMMA = re.compile(r"\s*,").match OBRACKET = re.compile(r"\s*\[").match CBRACKET = re.compile(r"\s*\]").match MODULE = re.compile(r"\w+(\.\w+)*$").match @@ -1964,62 +2270,7 @@ EGG_NAME = re.compile( re.VERBOSE | re.IGNORECASE ).match -component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE) -replace = {'pre':'c', 'preview':'c','-':'final-','rc':'c','dev':'@'}.get -def _parse_version_parts(s): - for part in component_re.split(s): - part = replace(part,part) - if not part or part=='.': - continue - if part[:1] in '0123456789': - yield part.zfill(8) # pad for numeric comparison - else: - yield '*'+part - - yield '*final' # ensure that alpha/beta/candidate are before final - -def parse_version(s): - """Convert a version string to a chronologically-sortable key - - This is a rough cross between distutils' StrictVersion and LooseVersion; - if you give it versions that would work with StrictVersion, then it behaves - the same; otherwise it acts like a slightly-smarter LooseVersion. It is - *possible* to create pathological version coding schemes that will fool - this parser, but they should be very rare in practice. - - The returned value will be a tuple of strings. Numeric portions of the - version are padded to 8 digits so they will compare numerically, but - without relying on how numbers compare relative to strings. Dots are - dropped, but dashes are retained. Trailing zeros between alpha segments - or dashes are suppressed, so that e.g. "2.4.0" is considered the same as - "2.4". Alphanumeric parts are lower-cased. - - The algorithm assumes that strings like "-" and any alpha string that - alphabetically follows "final" represents a "patch level". So, "2.4-1" - is assumed to be a branch or patch of "2.4", and therefore "2.4.1" is - considered newer than "2.4-1", which in turn is newer than "2.4". - - Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that - come before "final" alphabetically) are assumed to be pre-release versions, - so that the version "2.4" is considered newer than "2.4a1". - - Finally, to handle miscellaneous cases, the strings "pre", "preview", and - "rc" are treated as if they were "c", i.e. as though they were release - candidates, and therefore are not as new as a version string that does not - contain them, and "dev" is replaced with an '@' so that it sorts lower than - than any other pre-release tag. - """ - parts = [] - for part in _parse_version_parts(s.lower()): - if part.startswith('*'): - if part<'*final': # remove '-' before a prerelease tag - while parts and parts[-1]=='*final-': parts.pop() - # remove trailing zeros from each series of numeric parts - while parts and parts[-1]=='00000000': - parts.pop() - parts.append(part) - return tuple(parts) class EntryPoint(object): """Object representing an advertised importable object""" @@ -2043,21 +2294,46 @@ class EntryPoint(object): def __repr__(self): return "EntryPoint.parse(%r)" % str(self) - def load(self, require=True, env=None, installer=None): - if require: self.require(env, installer) - entry = __import__(self.module_name, globals(),globals(), ['__name__']) - for attr in self.attrs: - try: - entry = getattr(entry,attr) - except AttributeError: - raise ImportError("%r has no %r attribute" % (entry,attr)) - return entry + def load(self, require=True, *args, **kwargs): + """ + Require packages for this EntryPoint, then resolve it. + """ + if not require or args or kwargs: + warnings.warn( + "Parameters to load are deprecated. Call .resolve and " + ".require separately.", + DeprecationWarning, + stacklevel=2, + ) + if require: + self.require(*args, **kwargs) + return self.resolve() + + def resolve(self): + """ + Resolve the entry point from its module and attrs. + """ + module = __import__(self.module_name, fromlist=['__name__'], level=0) + try: + return functools.reduce(getattr, self.attrs, module) + except AttributeError as exc: + raise ImportError(str(exc)) def require(self, env=None, installer=None): if self.extras and not self.dist: raise UnknownExtra("Can't require() without a distribution", self) - list(map(working_set.add, - working_set.resolve(self.dist.requires(self.extras),env,installer))) + reqs = self.dist.requires(self.extras) + items = working_set.resolve(reqs, env, installer) + list(map(working_set.add, items)) + + pattern = re.compile( + r'\s*' + r'(?P<name>.+?)\s*' + r'=\s*' + r'(?P<module>[\w.]+)\s*' + r'(:\s*(?P<attr>[\w.]+))?\s*' + r'(?P<extras>\[.*\])?\s*$' + ) @classmethod def parse(cls, src, dist=None): @@ -2065,31 +2341,28 @@ class EntryPoint(object): Entry point syntax follows the form:: - name = some.module:some.attr [extra1,extra2] + name = some.module:some.attr [extra1, extra2] The entry name and module name are required, but the ``:attrs`` and ``[extras]`` parts are optional """ - try: - attrs = extras = () - name,value = src.split('=',1) - if '[' in value: - value,extras = value.split('[',1) - req = Requirement.parse("x["+extras) - if req.specs: raise ValueError - extras = req.extras - if ':' in value: - value,attrs = value.split(':',1) - if not MODULE(attrs.rstrip()): - raise ValueError - attrs = attrs.rstrip().split('.') - except ValueError: - raise ValueError( - "EntryPoint must be in 'name=module:attrs [extras]' format", - src - ) - else: - return cls(name.strip(), value.strip(), attrs, extras, dist) + m = cls.pattern.match(src) + if not m: + msg = "EntryPoint must be in 'name=module:attrs [extras]' format" + raise ValueError(msg, src) + res = m.groupdict() + extras = cls._parse_extras(res['extras']) + attrs = res['attr'].split('.') if res['attr'] else () + return cls(res['name'], res['module'], attrs, extras, dist) + + @classmethod + def _parse_extras(cls, extras_spec): + if not extras_spec: + return () + req = Requirement.parse('x' + extras_spec) + if req.specs: + raise ValueError() + return req.extras @classmethod def parse_group(cls, group, lines, dist=None): @@ -2107,7 +2380,7 @@ class EntryPoint(object): @classmethod def parse_map(cls, data, dist=None): """Parse a map of entry point groups""" - if isinstance(data,dict): + if isinstance(data, dict): data = data.items() else: data = split_sections(data) @@ -2150,7 +2423,7 @@ class Distribution(object): self._provider = metadata or empty_provider @classmethod - def from_location(cls,location,basename,metadata=None,**kw): + def from_location(cls, location, basename, metadata=None,**kw): project_name, version, py_version, platform = [None]*4 basename, ext = os.path.splitext(basename) if ext.lower() in _distributionImpl: @@ -2166,30 +2439,38 @@ class Distribution(object): py_version=py_version, platform=platform, **kw ) - hashcmp = property( - lambda self: ( - getattr(self,'parsed_version',()), + @property + def hashcmp(self): + return ( + self.parsed_version, self.precedence, self.key, _remove_md5_fragment(self.location), self.py_version, - self.platform + self.platform, ) - ) - def __hash__(self): return hash(self.hashcmp) + + def __hash__(self): + return hash(self.hashcmp) + def __lt__(self, other): return self.hashcmp < other.hashcmp + def __le__(self, other): return self.hashcmp <= other.hashcmp + def __gt__(self, other): return self.hashcmp > other.hashcmp + def __ge__(self, other): return self.hashcmp >= other.hashcmp + def __eq__(self, other): if not isinstance(other, self.__class__): # It's not a Distribution, so they are not equal return False return self.hashcmp == other.hashcmp + def __ne__(self, other): return not self == other @@ -2207,11 +2488,29 @@ class Distribution(object): @property def parsed_version(self): - try: - return self._parsed_version - except AttributeError: - self._parsed_version = pv = parse_version(self.version) - return pv + if not hasattr(self, "_parsed_version"): + self._parsed_version = parse_version(self.version) + if isinstance( + self._parsed_version, packaging.version.LegacyVersion): + # While an empty version is techincally a legacy version and + # is not a valid PEP 440 version, it's also unlikely to + # actually come from someone and instead it is more likely that + # it comes from setuptools attempting to parse a filename and + # including it in the list. So for that we'll gate this warning + # on if the version is anything at all or not. + if self.version: + warnings.warn( + "'%s (%s)' is being parsed as a legacy, non PEP 440, " + "version. You may find odd behavior and sort order. " + "In particular it will be sorted as less than 0.0. It " + "is recommend to migrate to PEP 440 compatible " + "versions." % ( + self.project_name, self.version, + ), + PEP440Warning, + ) + + return self._parsed_version @property def version(self): @@ -2223,9 +2522,8 @@ class Distribution(object): self._version = safe_version(line.split(':',1)[1].strip()) return self._version else: - raise ValueError( - "Missing 'Version:' header and/or %s file" % self.PKG_INFO, self - ) + tmpl = "Missing 'Version:' header and/or %s file" + raise ValueError(tmpl % self.PKG_INFO, self) @property def _dep_map(self): @@ -2234,23 +2532,24 @@ class Distribution(object): except AttributeError: dm = self.__dep_map = {None: []} for name in 'requires.txt', 'depends.txt': - for extra,reqs in split_sections(self._get_metadata(name)): + for extra, reqs in split_sections(self._get_metadata(name)): if extra: if ':' in extra: - extra, marker = extra.split(':',1) + extra, marker = extra.split(':', 1) if invalid_marker(marker): - reqs=[] # XXX warn + # XXX warn + reqs=[] elif not evaluate_marker(marker): reqs=[] extra = safe_extra(extra) or None dm.setdefault(extra,[]).extend(parse_requirements(reqs)) return dm - def requires(self,extras=()): + def requires(self, extras=()): """List of Requirements needed for this distro if `extras` are used""" dm = self._dep_map deps = [] - deps.extend(dm.get(None,())) + deps.extend(dm.get(None, ())) for ext in extras: try: deps.extend(dm[safe_extra(ext)]) @@ -2260,18 +2559,21 @@ class Distribution(object): ) return deps - def _get_metadata(self,name): + def _get_metadata(self, name): if self.has_metadata(name): for line in self.get_metadata_lines(name): yield line - def activate(self,path=None): + def activate(self, path=None): """Ensure distribution is importable on `path` (default=sys.path)""" - if path is None: path = sys.path + if path is None: + path = sys.path self.insert_on(path) if path is sys.path: fixup_namespace_packages(self.location) - list(map(declare_namespace, self._get_metadata('namespace_packages.txt'))) + for pkg in self._get_metadata('namespace_packages.txt'): + if pkg in sys.modules: + declare_namespace(pkg) def egg_name(self): """Return what this distribution's standard .egg filename should be""" @@ -2281,29 +2583,31 @@ class Distribution(object): ) if self.platform: - filename += '-'+self.platform + filename += '-' + self.platform return filename def __repr__(self): if self.location: - return "%s (%s)" % (self,self.location) + return "%s (%s)" % (self, self.location) else: return str(self) def __str__(self): - try: version = getattr(self,'version',None) - except ValueError: version = None + try: + version = getattr(self, 'version', None) + except ValueError: + version = None version = version or "[unknown version]" - return "%s %s" % (self.project_name,version) + return "%s %s" % (self.project_name, version) - def __getattr__(self,attr): + def __getattr__(self, attr): """Delegate all unrecognized public attributes to .metadata provider""" if attr.startswith('_'): raise AttributeError(attr) return getattr(self._provider, attr) @classmethod - def from_filename(cls,filename,metadata=None, **kw): + def from_filename(cls, filename, metadata=None, **kw): return cls.from_location( _normalize_cached(filename), os.path.basename(filename), metadata, **kw @@ -2311,13 +2615,18 @@ class Distribution(object): def as_requirement(self): """Return a ``Requirement`` that matches this distribution exactly""" - return Requirement.parse('%s==%s' % (self.project_name, self.version)) + if isinstance(self.parsed_version, packaging.version.Version): + spec = "%s==%s" % (self.project_name, self.parsed_version) + else: + spec = "%s===%s" % (self.project_name, self.parsed_version) + + return Requirement.parse(spec) def load_entry_point(self, group, name): """Return the `name` entry point of `group` or raise ImportError""" - ep = self.get_entry_info(group,name) + ep = self.get_entry_info(group, name) if ep is None: - raise ImportError("Entry point %r not found" % ((group,name),)) + raise ImportError("Entry point %r not found" % ((group, name),)) return ep.load() def get_entry_map(self, group=None): @@ -2348,9 +2657,9 @@ class Distribution(object): npath= [(p and _normalize_cached(p) or p) for p in path] for p, item in enumerate(npath): - if item==nloc: + if item == nloc: break - elif item==bdir and self.precedence==EGG_DIST: + elif item == bdir and self.precedence == EGG_DIST: # if it's an .egg, give it precedence over its directory if path is sys.path: self.check_version_conflict() @@ -2364,20 +2673,22 @@ class Distribution(object): return # p is the spot where we found or inserted loc; now remove duplicates - while 1: + while True: try: np = npath.index(nloc, p+1) except ValueError: break else: del npath[np], path[np] - p = np # ha! + # ha! + p = np return def check_version_conflict(self): - if self.key=='setuptools': - return # ignore the inevitable setuptools self-conflicts :( + if self.key == 'setuptools': + # ignore the inevitable setuptools self-conflicts :( + return nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) loc = normalize_path(self.location) @@ -2400,17 +2711,15 @@ class Distribution(object): try: self.version except ValueError: - issue_warning("Unbuilt egg for "+repr(self)) + issue_warning("Unbuilt egg for " + repr(self)) return False return True def clone(self,**kw): """Copy this distribution, substituting in any changed keyword args""" - for attr in ( - 'project_name', 'version', 'py_version', 'platform', 'location', - 'precedence' - ): - kw.setdefault(attr, getattr(self,attr,None)) + names = 'project_name version py_version platform location precedence' + for attr in names.split(): + kw.setdefault(attr, getattr(self, attr, None)) kw.setdefault('metadata', self._provider) return self.__class__(**kw) @@ -2430,8 +2739,8 @@ class DistInfoDistribution(Distribution): try: return self._pkg_info except AttributeError: - from email.parser import Parser - self._pkg_info = Parser().parsestr(self.get_metadata(self.PKG_INFO)) + metadata = self.get_metadata(self.PKG_INFO) + self._pkg_info = email.parser.Parser().parsestr(metadata) return self._pkg_info @property @@ -2499,25 +2808,23 @@ def issue_warning(*args,**kw): level += 1 except ValueError: pass - from warnings import warn - warn(stacklevel = level+1, *args, **kw) + warnings.warn(stacklevel=level + 1, *args, **kw) def parse_requirements(strs): """Yield ``Requirement`` objects for each specification in `strs` - `strs` must be an instance of ``basestring``, or a (possibly-nested) - iterable thereof. + `strs` must be a string, or a (possibly-nested) iterable thereof. """ # create a steppable iterator, so we can handle \-continuations lines = iter(yield_lines(strs)) - def scan_list(ITEM,TERMINATOR,line,p,groups,item_name): + def scan_list(ITEM, TERMINATOR, line, p, groups, item_name): items = [] - while not TERMINATOR(line,p): - if CONTINUE(line,p): + while not TERMINATOR(line, p): + if CONTINUE(line, p): try: line = next(lines) p = 0 @@ -2526,23 +2833,26 @@ def parse_requirements(strs): "\\ must not appear on the last nonblank line" ) - match = ITEM(line,p) + match = ITEM(line, p) if not match: - raise ValueError("Expected "+item_name+" in",line,"at",line[p:]) + msg = "Expected " + item_name + " in" + raise ValueError(msg, line, "at", line[p:]) items.append(match.group(*groups)) p = match.end() - match = COMMA(line,p) + match = COMMA(line, p) if match: - p = match.end() # skip the comma - elif not TERMINATOR(line,p): - raise ValueError( - "Expected ',' or end-of-list in",line,"at",line[p:] - ) + # skip the comma + p = match.end() + elif not TERMINATOR(line, p): + msg = "Expected ',' or end-of-list in" + raise ValueError(msg, line, "at", line[p:]) - match = TERMINATOR(line,p) - if match: p = match.end() # skip the terminator, if any + match = TERMINATOR(line, p) + # skip the terminator, if any + if match: + p = match.end() return line, p, items for line in lines: @@ -2553,67 +2863,59 @@ def parse_requirements(strs): p = match.end() extras = [] - match = OBRACKET(line,p) + match = OBRACKET(line, p) if match: p = match.end() line, p, extras = scan_list( DISTRO, CBRACKET, line, p, (1,), "'extra' name" ) - line, p, specs = scan_list(VERSION,LINE_END,line,p,(1,2),"version spec") - specs = [(op,safe_version(val)) for op,val in specs] + line, p, specs = scan_list(VERSION, LINE_END, line, p, (1, 2), + "version spec") + specs = [(op, val) for op, val in specs] yield Requirement(project_name, specs, extras) -def _sort_dists(dists): - tmp = [(dist.hashcmp,dist) for dist in dists] - tmp.sort() - dists[::-1] = [d for hc,d in tmp] - - class Requirement: def __init__(self, project_name, specs, extras): """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" self.unsafe_name, project_name = project_name, safe_name(project_name) self.project_name, self.key = project_name, project_name.lower() - index = [(parse_version(v),state_machine[op],op,v) for op,v in specs] - index.sort() - self.specs = [(op,ver) for parsed,trans,op,ver in index] - self.index, self.extras = index, tuple(map(safe_extra,extras)) + self.specifier = packaging.specifiers.SpecifierSet( + ",".join(["".join([x, y]) for x, y in specs]) + ) + self.specs = specs + self.extras = tuple(map(safe_extra, extras)) self.hashCmp = ( - self.key, tuple([(op,parsed) for parsed,trans,op,ver in index]), - frozenset(self.extras) + self.key, + self.specifier, + frozenset(self.extras), ) self.__hash = hash(self.hashCmp) def __str__(self): - specs = ','.join([''.join(s) for s in self.specs]) extras = ','.join(self.extras) - if extras: extras = '[%s]' % extras - return '%s%s%s' % (self.project_name, extras, specs) + if extras: + extras = '[%s]' % extras + return '%s%s%s' % (self.project_name, extras, self.specifier) - def __eq__(self,other): - return isinstance(other,Requirement) and self.hashCmp==other.hashCmp + def __eq__(self, other): + return ( + isinstance(other, Requirement) and + self.hashCmp == other.hashCmp + ) - def __contains__(self,item): - if isinstance(item,Distribution): - if item.key != self.key: return False - if self.index: item = item.parsed_version # only get if we need it - elif isinstance(item,basestring): - item = parse_version(item) - last = None - compare = lambda a, b: (a > b) - (a < b) # -1, 0, 1 - for parsed,trans,op,ver in self.index: - action = trans[compare(item,parsed)] # Indexing: 0, 1, -1 - if action=='F': + def __contains__(self, item): + if isinstance(item, Distribution): + if item.key != self.key: return False - elif action=='T': - return True - elif action=='+': - last = True - elif action=='-' or last is None: last = False - if last is None: last = True # no rules encountered - return last + + item = item.version + + # Allow prereleases always in order to match the previous behavior of + # this method. In the future this should be smarter and follow PEP 440 + # more accurately. + return self.specifier.contains(item, prereleases=True) def __hash__(self): return self.__hash @@ -2624,26 +2926,16 @@ class Requirement: def parse(s): reqs = list(parse_requirements(s)) if reqs: - if len(reqs)==1: + if len(reqs) == 1: return reqs[0] raise ValueError("Expected only one requirement", s) raise ValueError("No requirements found", s) -state_machine = { - # =>< - '<': '--T', - '<=': 'T-T', - '>': 'F+F', - '>=': 'T+F', - '==': 'T..', - '!=': 'F++', -} - def _get_mro(cls): """Get an mro for a type or classic class""" - if not isinstance(cls,type): - class cls(cls,object): pass + if not isinstance(cls, type): + class cls(cls, object): pass return cls.__mro__[1:] return cls.__mro__ @@ -2660,8 +2952,19 @@ def ensure_directory(path): if not os.path.isdir(dirname): os.makedirs(dirname) + +def _bypass_ensure_directory(path, mode=0o777): + """Sandbox-bypassing version of ensure_directory()""" + if not WRITE_SUPPORT: + raise IOError('"os.mkdir" not supported on this platform.') + dirname, filename = split(path) + if dirname and filename and not isdir(dirname): + _bypass_ensure_directory(dirname) + mkdir(dirname, mode) + + def split_sections(s): - """Split a string or iterable thereof into (section,content) pairs + """Split a string or iterable thereof into (section, content) pairs Each ``section`` is a stripped version of the section header ("[section]") and each ``content`` is a list of stripped lines excluding blank lines and @@ -2686,13 +2989,21 @@ def split_sections(s): yield section, content def _mkstemp(*args,**kw): - from tempfile import mkstemp old_open = os.open try: - os.open = os_open # temporarily bypass sandboxing - return mkstemp(*args,**kw) + # temporarily bypass sandboxing + os.open = os_open + return tempfile.mkstemp(*args,**kw) finally: - os.open = old_open # and then put it back + # and then put it back + os.open = old_open + + +# Silence the PEP440Warning by default, so that end users don't get hit by it +# randomly just because they use pkg_resources. We want to append the rule +# because we want earlier uses of filterwarnings to take precedence over this +# one. +warnings.filterwarnings("ignore", category=PEP440Warning, append=True) # Set up global resource manager (deliberately not state-saved) @@ -2704,35 +3015,19 @@ def _initialize(g): _initialize(globals()) # Prepare the master working set and make the ``require()`` API available -_declare_state('object', working_set = WorkingSet()) -try: - # Does the main program list any requirements? - from __main__ import __requires__ -except ImportError: - pass # No: just use the default working set based on sys.path -else: - # Yes: ensure the requirements are met, by prefixing sys.path if necessary - try: - working_set.require(__requires__) - except VersionConflict: # try it without defaults already on sys.path - working_set = WorkingSet([]) # by starting with an empty path - for dist in working_set.resolve( - parse_requirements(__requires__), Environment() - ): - working_set.add(dist) - for entry in sys.path: # add any missing entries from sys.path - if entry not in working_set.entries: - working_set.add_entry(entry) - sys.path[:] = working_set.entries # then copy back to sys.path +working_set = WorkingSet._build_master() +_declare_state('object', working_set=working_set) require = working_set.require iter_entry_points = working_set.iter_entry_points add_activation_listener = working_set.subscribe run_script = working_set.run_script -run_main = run_script # backward compatibility +# backward compatibility +run_main = run_script # Activate all distributions already on sys.path, and ensure that # all distributions added to the working set in the future (e.g. by # calling ``require()``) will get activated as well. add_activation_listener(lambda dist: dist.activate()) working_set.entries=[] -list(map(working_set.add_entry,sys.path)) # match order +# match order +list(map(working_set.add_entry, sys.path)) diff --git a/awx/lib/site-packages/pkg_resources/_vendor/__init__.py b/awx/lib/site-packages/pkg_resources/_vendor/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/awx/lib/site-packages/pkg_resources/_vendor/packaging/__about__.py b/awx/lib/site-packages/pkg_resources/_vendor/packaging/__about__.py new file mode 100644 index 0000000000..36f1a35c85 --- /dev/null +++ b/awx/lib/site-packages/pkg_resources/_vendor/packaging/__about__.py @@ -0,0 +1,31 @@ +# Copyright 2014 Donald Stufft +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "15.0" + +__author__ = "Donald Stufft" +__email__ = "donald@stufft.io" + +__license__ = "Apache License, Version 2.0" +__copyright__ = "Copyright 2014 %s" % __author__ diff --git a/awx/lib/site-packages/pkg_resources/_vendor/packaging/__init__.py b/awx/lib/site-packages/pkg_resources/_vendor/packaging/__init__.py new file mode 100644 index 0000000000..c39a8eab8e --- /dev/null +++ b/awx/lib/site-packages/pkg_resources/_vendor/packaging/__init__.py @@ -0,0 +1,24 @@ +# Copyright 2014 Donald Stufft +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff --git a/awx/lib/site-packages/pkg_resources/_vendor/packaging/_compat.py b/awx/lib/site-packages/pkg_resources/_vendor/packaging/_compat.py new file mode 100644 index 0000000000..5c396ceac6 --- /dev/null +++ b/awx/lib/site-packages/pkg_resources/_vendor/packaging/_compat.py @@ -0,0 +1,40 @@ +# Copyright 2014 Donald Stufft +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = str, +else: + string_types = basestring, + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/awx/lib/site-packages/pkg_resources/_vendor/packaging/_structures.py b/awx/lib/site-packages/pkg_resources/_vendor/packaging/_structures.py new file mode 100644 index 0000000000..0ae9bb52a2 --- /dev/null +++ b/awx/lib/site-packages/pkg_resources/_vendor/packaging/_structures.py @@ -0,0 +1,78 @@ +# Copyright 2014 Donald Stufft +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + +Infinity = Infinity() + + +class NegativeInfinity(object): + + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + +NegativeInfinity = NegativeInfinity() diff --git a/awx/lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/awx/lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py new file mode 100644 index 0000000000..9ad0a635ed --- /dev/null +++ b/awx/lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py @@ -0,0 +1,772 @@ +# Copyright 2014 Donald Stufft +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format( + self.__class__.__name__, + str(self), + pre, + ) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self._spec[0])(item, self._spec[1]) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if (parsed_version.is_prerelease + and not (prereleases or self.prereleases)): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the begining. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex = re.compile( + r""" + ^ + \s* + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^\s]* # We just match everything, except for whitespace since this + # is a "legacy" specifier and the version string can be just + # about anything. + ) + \s* + $ + """, + re.VERBOSE | re.IGNORECASE, + ) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex = re.compile( + r""" + ^ + \s* + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + \s* + $ + """, + re.VERBOSE | re.IGNORECASE, + ) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") + and not x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return (self._get_operator(">=")(prospective, spec) + and self._get_operator("==")(prospective, prefix)) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[:len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is techincally greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split):]) + right_split.append(left[len(right_split):]) + + # Insert our padding + left_split.insert( + 1, + ["0"] * max(0, len(right_split[0]) - len(left_split[0])), + ) + right_split.insert( + 1, + ["0"] * max(0, len(left_split[0]) - len(right_split[0])), + ) + + return ( + list(itertools.chain(*left_split)), + list(itertools.chain(*right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + # Note: The use of any() here means that an empty set of specifiers + # will always return False, this is an explicit design decision. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if (not (self.prereleases or prereleases)) and item.is_prerelease: + return False + + # Determine if we're forcing a prerelease or not, we bypass + # self.prereleases here and use self._prereleases because we want to + # only take into consideration actual *forced* values. The underlying + # specifiers will handle the other logic. + # The logic here is: If prereleases is anything but None, we'll just + # go aheand and continue to use that. However if + # prereleases is None, then we'll use whatever the + # value of self._prereleases is as long as it is not + # None itself. + if prereleases is None and self._prereleases is not None: + prereleases = self._prereleases + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all( + s.contains(item, prereleases=prereleases) + for s in self._specs + ) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, we bypass + # self.prereleases here and use self._prereleases because we want to + # only take into consideration actual *forced* values. The underlying + # specifiers will handle the other logic. + # The logic here is: If prereleases is anything but None, we'll just + # go aheand and continue to use that. However if + # prereleases is None, then we'll use whatever the + # value of self._prereleases is as long as it is not + # None itself. + if prereleases is None and self._prereleases is not None: + prereleases = self._prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=prereleases) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/awx/lib/site-packages/pkg_resources/_vendor/packaging/version.py b/awx/lib/site-packages/pkg_resources/_vendor/packaging/version.py new file mode 100644 index 0000000000..cf8afb16d6 --- /dev/null +++ b/awx/lib/site-packages/pkg_resources/_vendor/packaging/version.py @@ -0,0 +1,401 @@ +# Copyright 2014 Donald Stufft +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = [ + "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" +] + + +_Version = collections.namedtuple( + "_Version", + ["epoch", "release", "dev", "pre", "post", "local"], +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + +_legacy_version_component_re = re.compile( + r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, +) + +_legacy_version_replacement_map = { + "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile( + r"^\s*" + VERSION_PATTERN + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version( + match.group("pre_l"), + match.group("pre_n"), + ), + post=_parse_letter_version( + match.group("post_l"), + match.group("post_n1") or match.group("post_n2"), + ), + dev=_parse_letter_version( + match.group("dev_l"), + match.group("dev_n"), + ), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + # Pre-release + if self._version.pre is not None: + parts.append("".join(str(x) for x in self._version.pre)) + + # Post-release + if self._version.post is not None: + parts.append(".post{0}".format(self._version.post[1])) + + # Development release + if self._version.dev is not None: + parts.append(".dev{0}".format(self._version.dev[1])) + + # Local version segment + if self._version.local is not None: + parts.append( + "+{0}".format(".".join(str(x) for x in self._version.local)) + ) + + return "".join(parts) + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + return "".join(parts) + + @property + def local(self): + version_string = str(self) + if "+" in version_string: + return version_string.split("+", 1)[1] + + @property + def is_prerelease(self): + return bool(self._version.dev or self._version.pre) + + @property + def is_postrelease(self): + return bool(self._version.post) + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_seperators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_seperators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + )) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in local + ) + + return epoch, release, pre, post, dev, local diff --git a/awx/lib/site-packages/pkg_resources/_vendor/vendored.txt b/awx/lib/site-packages/pkg_resources/_vendor/vendored.txt new file mode 100644 index 0000000000..75a31670c6 --- /dev/null +++ b/awx/lib/site-packages/pkg_resources/_vendor/vendored.txt @@ -0,0 +1 @@ +packaging==15.0 diff --git a/awx/lib/site-packages/pkg_resources/api_tests.txt b/awx/lib/site-packages/pkg_resources/api_tests.txt new file mode 100644 index 0000000000..a6c25a378f --- /dev/null +++ b/awx/lib/site-packages/pkg_resources/api_tests.txt @@ -0,0 +1,419 @@ +Pluggable Distributions of Python Software +========================================== + +Distributions +------------- + +A "Distribution" is a collection of files that represent a "Release" of a +"Project" as of a particular point in time, denoted by a +"Version":: + + >>> import sys, pkg_resources + >>> from pkg_resources import Distribution + >>> Distribution(project_name="Foo", version="1.2") + Foo 1.2 + +Distributions have a location, which can be a filename, URL, or really anything +else you care to use:: + + >>> dist = Distribution( + ... location="http://example.com/something", + ... project_name="Bar", version="0.9" + ... ) + + >>> dist + Bar 0.9 (http://example.com/something) + + +Distributions have various introspectable attributes:: + + >>> dist.location + 'http://example.com/something' + + >>> dist.project_name + 'Bar' + + >>> dist.version + '0.9' + + >>> dist.py_version == sys.version[:3] + True + + >>> print(dist.platform) + None + +Including various computed attributes:: + + >>> from pkg_resources import parse_version + >>> dist.parsed_version == parse_version(dist.version) + True + + >>> dist.key # case-insensitive form of the project name + 'bar' + +Distributions are compared (and hashed) by version first:: + + >>> Distribution(version='1.0') == Distribution(version='1.0') + True + >>> Distribution(version='1.0') == Distribution(version='1.1') + False + >>> Distribution(version='1.0') < Distribution(version='1.1') + True + +but also by project name (case-insensitive), platform, Python version, +location, etc.:: + + >>> Distribution(project_name="Foo",version="1.0") == \ + ... Distribution(project_name="Foo",version="1.0") + True + + >>> Distribution(project_name="Foo",version="1.0") == \ + ... Distribution(project_name="foo",version="1.0") + True + + >>> Distribution(project_name="Foo",version="1.0") == \ + ... Distribution(project_name="Foo",version="1.1") + False + + >>> Distribution(project_name="Foo",py_version="2.3",version="1.0") == \ + ... Distribution(project_name="Foo",py_version="2.4",version="1.0") + False + + >>> Distribution(location="spam",version="1.0") == \ + ... Distribution(location="spam",version="1.0") + True + + >>> Distribution(location="spam",version="1.0") == \ + ... Distribution(location="baz",version="1.0") + False + + + +Hash and compare distribution by prio/plat + +Get version from metadata +provider capabilities +egg_name() +as_requirement() +from_location, from_filename (w/path normalization) + +Releases may have zero or more "Requirements", which indicate +what releases of another project the release requires in order to +function. A Requirement names the other project, expresses some criteria +as to what releases of that project are acceptable, and lists any "Extras" +that the requiring release may need from that project. (An Extra is an +optional feature of a Release, that can only be used if its additional +Requirements are satisfied.) + + + +The Working Set +--------------- + +A collection of active distributions is called a Working Set. Note that a +Working Set can contain any importable distribution, not just pluggable ones. +For example, the Python standard library is an importable distribution that +will usually be part of the Working Set, even though it is not pluggable. +Similarly, when you are doing development work on a project, the files you are +editing are also a Distribution. (And, with a little attention to the +directory names used, and including some additional metadata, such a +"development distribution" can be made pluggable as well.) + + >>> from pkg_resources import WorkingSet + +A working set's entries are the sys.path entries that correspond to the active +distributions. By default, the working set's entries are the items on +``sys.path``:: + + >>> ws = WorkingSet() + >>> ws.entries == sys.path + True + +But you can also create an empty working set explicitly, and add distributions +to it:: + + >>> ws = WorkingSet([]) + >>> ws.add(dist) + >>> ws.entries + ['http://example.com/something'] + >>> dist in ws + True + >>> Distribution('foo',version="") in ws + False + +And you can iterate over its distributions:: + + >>> list(ws) + [Bar 0.9 (http://example.com/something)] + +Adding the same distribution more than once is a no-op:: + + >>> ws.add(dist) + >>> list(ws) + [Bar 0.9 (http://example.com/something)] + +For that matter, adding multiple distributions for the same project also does +nothing, because a working set can only hold one active distribution per +project -- the first one added to it:: + + >>> ws.add( + ... Distribution( + ... 'http://example.com/something', project_name="Bar", + ... version="7.2" + ... ) + ... ) + >>> list(ws) + [Bar 0.9 (http://example.com/something)] + +You can append a path entry to a working set using ``add_entry()``:: + + >>> ws.entries + ['http://example.com/something'] + >>> ws.add_entry(pkg_resources.__file__) + >>> ws.entries + ['http://example.com/something', '...pkg_resources...'] + +Multiple additions result in multiple entries, even if the entry is already in +the working set (because ``sys.path`` can contain the same entry more than +once):: + + >>> ws.add_entry(pkg_resources.__file__) + >>> ws.entries + ['...example.com...', '...pkg_resources...', '...pkg_resources...'] + +And you can specify the path entry a distribution was found under, using the +optional second parameter to ``add()``:: + + >>> ws = WorkingSet([]) + >>> ws.add(dist,"foo") + >>> ws.entries + ['foo'] + +But even if a distribution is found under multiple path entries, it still only +shows up once when iterating the working set: + + >>> ws.add_entry(ws.entries[0]) + >>> list(ws) + [Bar 0.9 (http://example.com/something)] + +You can ask a WorkingSet to ``find()`` a distribution matching a requirement:: + + >>> from pkg_resources import Requirement + >>> print(ws.find(Requirement.parse("Foo==1.0"))) # no match, return None + None + + >>> ws.find(Requirement.parse("Bar==0.9")) # match, return distribution + Bar 0.9 (http://example.com/something) + +Note that asking for a conflicting version of a distribution already in a +working set triggers a ``pkg_resources.VersionConflict`` error: + + >>> try: + ... ws.find(Requirement.parse("Bar==1.0")) + ... except pkg_resources.VersionConflict as exc: + ... print(str(exc)) + ... else: + ... raise AssertionError("VersionConflict was not raised") + (Bar 0.9 (http://example.com/something), Requirement.parse('Bar==1.0')) + +You can subscribe a callback function to receive notifications whenever a new +distribution is added to a working set. The callback is immediately invoked +once for each existing distribution in the working set, and then is called +again for new distributions added thereafter:: + + >>> def added(dist): print("Added %s" % dist) + >>> ws.subscribe(added) + Added Bar 0.9 + >>> foo12 = Distribution(project_name="Foo", version="1.2", location="f12") + >>> ws.add(foo12) + Added Foo 1.2 + +Note, however, that only the first distribution added for a given project name +will trigger a callback, even during the initial ``subscribe()`` callback:: + + >>> foo14 = Distribution(project_name="Foo", version="1.4", location="f14") + >>> ws.add(foo14) # no callback, because Foo 1.2 is already active + + >>> ws = WorkingSet([]) + >>> ws.add(foo12) + >>> ws.add(foo14) + >>> ws.subscribe(added) + Added Foo 1.2 + +And adding a callback more than once has no effect, either:: + + >>> ws.subscribe(added) # no callbacks + + # and no double-callbacks on subsequent additions, either + >>> just_a_test = Distribution(project_name="JustATest", version="0.99") + >>> ws.add(just_a_test) + Added JustATest 0.99 + + +Finding Plugins +--------------- + +``WorkingSet`` objects can be used to figure out what plugins in an +``Environment`` can be loaded without any resolution errors:: + + >>> from pkg_resources import Environment + + >>> plugins = Environment([]) # normally, a list of plugin directories + >>> plugins.add(foo12) + >>> plugins.add(foo14) + >>> plugins.add(just_a_test) + +In the simplest case, we just get the newest version of each distribution in +the plugin environment:: + + >>> ws = WorkingSet([]) + >>> ws.find_plugins(plugins) + ([JustATest 0.99, Foo 1.4 (f14)], {}) + +But if there's a problem with a version conflict or missing requirements, the +method falls back to older versions, and the error info dict will contain an +exception instance for each unloadable plugin:: + + >>> ws.add(foo12) # this will conflict with Foo 1.4 + >>> ws.find_plugins(plugins) + ([JustATest 0.99, Foo 1.2 (f12)], {Foo 1.4 (f14): VersionConflict(...)}) + +But if you disallow fallbacks, the failed plugin will be skipped instead of +trying older versions:: + + >>> ws.find_plugins(plugins, fallback=False) + ([JustATest 0.99], {Foo 1.4 (f14): VersionConflict(...)}) + + + +Platform Compatibility Rules +---------------------------- + +On the Mac, there are potential compatibility issues for modules compiled +on newer versions of Mac OS X than what the user is running. Additionally, +Mac OS X will soon have two platforms to contend with: Intel and PowerPC. + +Basic equality works as on other platforms:: + + >>> from pkg_resources import compatible_platforms as cp + >>> reqd = 'macosx-10.4-ppc' + >>> cp(reqd, reqd) + True + >>> cp("win32", reqd) + False + +Distributions made on other machine types are not compatible:: + + >>> cp("macosx-10.4-i386", reqd) + False + +Distributions made on earlier versions of the OS are compatible, as +long as they are from the same top-level version. The patchlevel version +number does not matter:: + + >>> cp("macosx-10.4-ppc", reqd) + True + >>> cp("macosx-10.3-ppc", reqd) + True + >>> cp("macosx-10.5-ppc", reqd) + False + >>> cp("macosx-9.5-ppc", reqd) + False + +Backwards compatibility for packages made via earlier versions of +setuptools is provided as well:: + + >>> cp("darwin-8.2.0-Power_Macintosh", reqd) + True + >>> cp("darwin-7.2.0-Power_Macintosh", reqd) + True + >>> cp("darwin-8.2.0-Power_Macintosh", "macosx-10.3-ppc") + False + + +Environment Markers +------------------- + + >>> from pkg_resources import invalid_marker as im, evaluate_marker as em + >>> import os + + >>> print(im("sys_platform")) + Comparison or logical expression expected + + >>> print(im("sys_platform==")) + invalid syntax + + >>> print(im("sys_platform=='win32'")) + False + + >>> print(im("sys=='x'")) + Unknown name 'sys' + + >>> print(im("(extra)")) + Comparison or logical expression expected + + >>> print(im("(extra")) + invalid syntax + + >>> print(im("os.open('foo')=='y'")) + Language feature not supported in environment markers + + >>> print(im("'x'=='y' and os.open('foo')=='y'")) # no short-circuit! + Language feature not supported in environment markers + + >>> print(im("'x'=='x' or os.open('foo')=='y'")) # no short-circuit! + Language feature not supported in environment markers + + >>> print(im("'x' < 'y'")) + '<' operator not allowed in environment markers + + >>> print(im("'x' < 'y' < 'z'")) + Chained comparison not allowed in environment markers + + >>> print(im("r'x'=='x'")) + Only plain strings allowed in environment markers + + >>> print(im("'''x'''=='x'")) + Only plain strings allowed in environment markers + + >>> print(im('"""x"""=="x"')) + Only plain strings allowed in environment markers + + >>> print(im(r"'x\n'=='x'")) + Only plain strings allowed in environment markers + + >>> print(im("os.open=='y'")) + Language feature not supported in environment markers + + >>> em('"x"=="x"') + True + + >>> em('"x"=="y"') + False + + >>> em('"x"=="y" and "x"=="x"') + False + + >>> em('"x"=="y" or "x"=="x"') + True + + >>> em('"x"=="y" and "x"=="q" or "z"=="z"') + True + + >>> em('"x"=="y" and ("x"=="q" or "z"=="z")') + False + + >>> em('"x"=="y" and "z"=="z" or "x"=="q"') + False + + >>> em('"x"=="x" and "z"=="z" or "x"=="q"') + True + + >>> em("sys_platform=='win32'") == (sys.platform=='win32') + True + + >>> em("'x' in 'yx'") + True + + >>> em("'yx' in 'x'") + False diff --git a/awx/lib/site-packages/pkg_resources/tests/__init__.py b/awx/lib/site-packages/pkg_resources/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/awx/lib/site-packages/pkg_resources/tests/test_pkg_resources.py b/awx/lib/site-packages/pkg_resources/tests/test_pkg_resources.py new file mode 100644 index 0000000000..564d7cec4f --- /dev/null +++ b/awx/lib/site-packages/pkg_resources/tests/test_pkg_resources.py @@ -0,0 +1,111 @@ +import sys +import tempfile +import os +import zipfile +import datetime +import time +import subprocess + +import pkg_resources + +try: + unicode +except NameError: + unicode = str + +def timestamp(dt): + """ + Return a timestamp for a local, naive datetime instance. + """ + try: + return dt.timestamp() + except AttributeError: + # Python 3.2 and earlier + return time.mktime(dt.timetuple()) + +class EggRemover(unicode): + def __call__(self): + if self in sys.path: + sys.path.remove(self) + if os.path.exists(self): + os.remove(self) + +class TestZipProvider(object): + finalizers = [] + + ref_time = datetime.datetime(2013, 5, 12, 13, 25, 0) + "A reference time for a file modification" + + @classmethod + def setup_class(cls): + "create a zip egg and add it to sys.path" + egg = tempfile.NamedTemporaryFile(suffix='.egg', delete=False) + zip_egg = zipfile.ZipFile(egg, 'w') + zip_info = zipfile.ZipInfo() + zip_info.filename = 'mod.py' + zip_info.date_time = cls.ref_time.timetuple() + zip_egg.writestr(zip_info, 'x = 3\n') + zip_info = zipfile.ZipInfo() + zip_info.filename = 'data.dat' + zip_info.date_time = cls.ref_time.timetuple() + zip_egg.writestr(zip_info, 'hello, world!') + zip_egg.close() + egg.close() + + sys.path.append(egg.name) + cls.finalizers.append(EggRemover(egg.name)) + + @classmethod + def teardown_class(cls): + for finalizer in cls.finalizers: + finalizer() + + def test_resource_filename_rewrites_on_change(self): + """ + If a previous call to get_resource_filename has saved the file, but + the file has been subsequently mutated with different file of the + same size and modification time, it should not be overwritten on a + subsequent call to get_resource_filename. + """ + import mod + manager = pkg_resources.ResourceManager() + zp = pkg_resources.ZipProvider(mod) + filename = zp.get_resource_filename(manager, 'data.dat') + actual = datetime.datetime.fromtimestamp(os.stat(filename).st_mtime) + assert actual == self.ref_time + f = open(filename, 'w') + f.write('hello, world?') + f.close() + ts = timestamp(self.ref_time) + os.utime(filename, (ts, ts)) + filename = zp.get_resource_filename(manager, 'data.dat') + f = open(filename) + assert f.read() == 'hello, world!' + manager.cleanup_resources() + +class TestResourceManager(object): + def test_get_cache_path(self): + mgr = pkg_resources.ResourceManager() + path = mgr.get_cache_path('foo') + type_ = str(type(path)) + message = "Unexpected type from get_cache_path: " + type_ + assert isinstance(path, (unicode, str)), message + + +class TestIndependence: + """ + Tests to ensure that pkg_resources runs independently from setuptools. + """ + def test_setuptools_not_imported(self): + """ + In a separate Python environment, import pkg_resources and assert + that action doesn't cause setuptools to be imported. + """ + lines = ( + 'import pkg_resources', + 'import sys', + 'assert "setuptools" not in sys.modules, ' + '"setuptools was imported"', + ) + cmd = [sys.executable, '-c', '; '.join(lines)] + subprocess.check_call(cmd) diff --git a/awx/lib/site-packages/pkg_resources/tests/test_resources.py b/awx/lib/site-packages/pkg_resources/tests/test_resources.py new file mode 100644 index 0000000000..a55478a249 --- /dev/null +++ b/awx/lib/site-packages/pkg_resources/tests/test_resources.py @@ -0,0 +1,661 @@ +import os +import sys +import tempfile +import shutil +import string + +import pytest + +import pkg_resources +from pkg_resources import (parse_requirements, VersionConflict, parse_version, + Distribution, EntryPoint, Requirement, safe_version, safe_name, + WorkingSet) + +packaging = pkg_resources.packaging + + +def safe_repr(obj, short=False): + """ copied from Python2.7""" + try: + result = repr(obj) + except Exception: + result = object.__repr__(obj) + if not short or len(result) < pkg_resources._MAX_LENGTH: + return result + return result[:pkg_resources._MAX_LENGTH] + ' [truncated]...' + + +class Metadata(pkg_resources.EmptyProvider): + """Mock object to return metadata as if from an on-disk distribution""" + + def __init__(self, *pairs): + self.metadata = dict(pairs) + + def has_metadata(self, name): + return name in self.metadata + + def get_metadata(self, name): + return self.metadata[name] + + def get_metadata_lines(self, name): + return pkg_resources.yield_lines(self.get_metadata(name)) + + +dist_from_fn = pkg_resources.Distribution.from_filename + +class TestDistro: + + def testCollection(self): + # empty path should produce no distributions + ad = pkg_resources.Environment([], platform=None, python=None) + assert list(ad) == [] + assert ad['FooPkg'] == [] + ad.add(dist_from_fn("FooPkg-1.3_1.egg")) + ad.add(dist_from_fn("FooPkg-1.4-py2.4-win32.egg")) + ad.add(dist_from_fn("FooPkg-1.2-py2.4.egg")) + + # Name is in there now + assert ad['FooPkg'] + # But only 1 package + assert list(ad) == ['foopkg'] + + # Distributions sort by version + assert [dist.version for dist in ad['FooPkg']] == ['1.4','1.3-1','1.2'] + + # Removing a distribution leaves sequence alone + ad.remove(ad['FooPkg'][1]) + assert [dist.version for dist in ad['FooPkg']] == ['1.4','1.2'] + + # And inserting adds them in order + ad.add(dist_from_fn("FooPkg-1.9.egg")) + assert [dist.version for dist in ad['FooPkg']] == ['1.9','1.4','1.2'] + + ws = WorkingSet([]) + foo12 = dist_from_fn("FooPkg-1.2-py2.4.egg") + foo14 = dist_from_fn("FooPkg-1.4-py2.4-win32.egg") + req, = parse_requirements("FooPkg>=1.3") + + # Nominal case: no distros on path, should yield all applicable + assert ad.best_match(req, ws).version == '1.9' + # If a matching distro is already installed, should return only that + ws.add(foo14) + assert ad.best_match(req, ws).version == '1.4' + + # If the first matching distro is unsuitable, it's a version conflict + ws = WorkingSet([]) + ws.add(foo12) + ws.add(foo14) + with pytest.raises(VersionConflict): + ad.best_match(req, ws) + + # If more than one match on the path, the first one takes precedence + ws = WorkingSet([]) + ws.add(foo14) + ws.add(foo12) + ws.add(foo14) + assert ad.best_match(req, ws).version == '1.4' + + def checkFooPkg(self,d): + assert d.project_name == "FooPkg" + assert d.key == "foopkg" + assert d.version == "1.3.post1" + assert d.py_version == "2.4" + assert d.platform == "win32" + assert d.parsed_version == parse_version("1.3-1") + + def testDistroBasics(self): + d = Distribution( + "/some/path", + project_name="FooPkg",version="1.3-1",py_version="2.4",platform="win32" + ) + self.checkFooPkg(d) + + d = Distribution("/some/path") + assert d.py_version == sys.version[:3] + assert d.platform == None + + def testDistroParse(self): + d = dist_from_fn("FooPkg-1.3.post1-py2.4-win32.egg") + self.checkFooPkg(d) + d = dist_from_fn("FooPkg-1.3.post1-py2.4-win32.egg-info") + self.checkFooPkg(d) + + def testDistroMetadata(self): + d = Distribution( + "/some/path", project_name="FooPkg", py_version="2.4", platform="win32", + metadata = Metadata( + ('PKG-INFO',"Metadata-Version: 1.0\nVersion: 1.3-1\n") + ) + ) + self.checkFooPkg(d) + + def distRequires(self, txt): + return Distribution("/foo", metadata=Metadata(('depends.txt', txt))) + + def checkRequires(self, dist, txt, extras=()): + assert list(dist.requires(extras)) == list(parse_requirements(txt)) + + def testDistroDependsSimple(self): + for v in "Twisted>=1.5", "Twisted>=1.5\nZConfig>=2.0": + self.checkRequires(self.distRequires(v), v) + + def testResolve(self): + ad = pkg_resources.Environment([]) + ws = WorkingSet([]) + # Resolving no requirements -> nothing to install + assert list(ws.resolve([], ad)) == [] + # Request something not in the collection -> DistributionNotFound + with pytest.raises(pkg_resources.DistributionNotFound): + ws.resolve(parse_requirements("Foo"), ad) + + Foo = Distribution.from_filename( + "/foo_dir/Foo-1.2.egg", + metadata=Metadata(('depends.txt', "[bar]\nBaz>=2.0")) + ) + ad.add(Foo) + ad.add(Distribution.from_filename("Foo-0.9.egg")) + + # Request thing(s) that are available -> list to activate + for i in range(3): + targets = list(ws.resolve(parse_requirements("Foo"), ad)) + assert targets == [Foo] + list(map(ws.add,targets)) + with pytest.raises(VersionConflict): + ws.resolve(parse_requirements("Foo==0.9"), ad) + ws = WorkingSet([]) # reset + + # Request an extra that causes an unresolved dependency for "Baz" + with pytest.raises(pkg_resources.DistributionNotFound): + ws.resolve(parse_requirements("Foo[bar]"), ad) + Baz = Distribution.from_filename( + "/foo_dir/Baz-2.1.egg", metadata=Metadata(('depends.txt', "Foo")) + ) + ad.add(Baz) + + # Activation list now includes resolved dependency + assert list(ws.resolve(parse_requirements("Foo[bar]"), ad)) ==[Foo,Baz] + # Requests for conflicting versions produce VersionConflict + with pytest.raises(VersionConflict) as vc: + ws.resolve(parse_requirements("Foo==1.2\nFoo!=1.2"), ad) + + msg = 'Foo 0.9 is installed but Foo==1.2 is required' + assert vc.value.report() == msg + + def testDistroDependsOptions(self): + d = self.distRequires(""" + Twisted>=1.5 + [docgen] + ZConfig>=2.0 + docutils>=0.3 + [fastcgi] + fcgiapp>=0.1""") + self.checkRequires(d,"Twisted>=1.5") + self.checkRequires( + d,"Twisted>=1.5 ZConfig>=2.0 docutils>=0.3".split(), ["docgen"] + ) + self.checkRequires( + d,"Twisted>=1.5 fcgiapp>=0.1".split(), ["fastcgi"] + ) + self.checkRequires( + d,"Twisted>=1.5 ZConfig>=2.0 docutils>=0.3 fcgiapp>=0.1".split(), + ["docgen","fastcgi"] + ) + self.checkRequires( + d,"Twisted>=1.5 fcgiapp>=0.1 ZConfig>=2.0 docutils>=0.3".split(), + ["fastcgi", "docgen"] + ) + with pytest.raises(pkg_resources.UnknownExtra): + d.requires(["foo"]) + + +class TestWorkingSet: + def test_find_conflicting(self): + ws = WorkingSet([]) + Foo = Distribution.from_filename("/foo_dir/Foo-1.2.egg") + ws.add(Foo) + + # create a requirement that conflicts with Foo 1.2 + req = next(parse_requirements("Foo<1.2")) + + with pytest.raises(VersionConflict) as vc: + ws.find(req) + + msg = 'Foo 1.2 is installed but Foo<1.2 is required' + assert vc.value.report() == msg + + def test_resolve_conflicts_with_prior(self): + """ + A ContextualVersionConflict should be raised when a requirement + conflicts with a prior requirement for a different package. + """ + # Create installation where Foo depends on Baz 1.0 and Bar depends on + # Baz 2.0. + ws = WorkingSet([]) + md = Metadata(('depends.txt', "Baz==1.0")) + Foo = Distribution.from_filename("/foo_dir/Foo-1.0.egg", metadata=md) + ws.add(Foo) + md = Metadata(('depends.txt', "Baz==2.0")) + Bar = Distribution.from_filename("/foo_dir/Bar-1.0.egg", metadata=md) + ws.add(Bar) + Baz = Distribution.from_filename("/foo_dir/Baz-1.0.egg") + ws.add(Baz) + Baz = Distribution.from_filename("/foo_dir/Baz-2.0.egg") + ws.add(Baz) + + with pytest.raises(VersionConflict) as vc: + ws.resolve(parse_requirements("Foo\nBar\n")) + + msg = "Baz 1.0 is installed but Baz==2.0 is required by {'Bar'}" + if pkg_resources.PY2: + msg = msg.replace("{'Bar'}", "set(['Bar'])") + assert vc.value.report() == msg + + +class TestEntryPoints: + + def assertfields(self, ep): + assert ep.name == "foo" + assert ep.module_name == "pkg_resources.tests.test_resources" + assert ep.attrs == ("TestEntryPoints",) + assert ep.extras == ("x",) + assert ep.load() is TestEntryPoints + expect = "foo = pkg_resources.tests.test_resources:TestEntryPoints [x]" + assert str(ep) == expect + + def setup_method(self, method): + self.dist = Distribution.from_filename( + "FooPkg-1.2-py2.4.egg", metadata=Metadata(('requires.txt','[x]'))) + + def testBasics(self): + ep = EntryPoint( + "foo", "pkg_resources.tests.test_resources", ["TestEntryPoints"], + ["x"], self.dist + ) + self.assertfields(ep) + + def testParse(self): + s = "foo = pkg_resources.tests.test_resources:TestEntryPoints [x]" + ep = EntryPoint.parse(s, self.dist) + self.assertfields(ep) + + ep = EntryPoint.parse("bar baz= spammity[PING]") + assert ep.name == "bar baz" + assert ep.module_name == "spammity" + assert ep.attrs == () + assert ep.extras == ("ping",) + + ep = EntryPoint.parse(" fizzly = wocka:foo") + assert ep.name == "fizzly" + assert ep.module_name == "wocka" + assert ep.attrs == ("foo",) + assert ep.extras == () + + # plus in the name + spec = "html+mako = mako.ext.pygmentplugin:MakoHtmlLexer" + ep = EntryPoint.parse(spec) + assert ep.name == 'html+mako' + + reject_specs = "foo", "x=a:b:c", "q=x/na", "fez=pish:tush-z", "x=f[a]>2" + @pytest.mark.parametrize("reject_spec", reject_specs) + def test_reject_spec(self, reject_spec): + with pytest.raises(ValueError): + EntryPoint.parse(reject_spec) + + def test_printable_name(self): + """ + Allow any printable character in the name. + """ + # Create a name with all printable characters; strip the whitespace. + name = string.printable.strip() + spec = "{name} = module:attr".format(**locals()) + ep = EntryPoint.parse(spec) + assert ep.name == name + + def checkSubMap(self, m): + assert len(m) == len(self.submap_expect) + for key, ep in pkg_resources.iteritems(self.submap_expect): + assert repr(m.get(key)) == repr(ep) + + submap_expect = dict( + feature1=EntryPoint('feature1', 'somemodule', ['somefunction']), + feature2=EntryPoint('feature2', 'another.module', ['SomeClass'], ['extra1','extra2']), + feature3=EntryPoint('feature3', 'this.module', extras=['something']) + ) + submap_str = """ + # define features for blah blah + feature1 = somemodule:somefunction + feature2 = another.module:SomeClass [extra1,extra2] + feature3 = this.module [something] + """ + + def testParseList(self): + self.checkSubMap(EntryPoint.parse_group("xyz", self.submap_str)) + with pytest.raises(ValueError): + EntryPoint.parse_group("x a", "foo=bar") + with pytest.raises(ValueError): + EntryPoint.parse_group("x", ["foo=baz", "foo=bar"]) + + def testParseMap(self): + m = EntryPoint.parse_map({'xyz':self.submap_str}) + self.checkSubMap(m['xyz']) + assert list(m.keys()) == ['xyz'] + m = EntryPoint.parse_map("[xyz]\n"+self.submap_str) + self.checkSubMap(m['xyz']) + assert list(m.keys()) == ['xyz'] + with pytest.raises(ValueError): + EntryPoint.parse_map(["[xyz]", "[xyz]"]) + with pytest.raises(ValueError): + EntryPoint.parse_map(self.submap_str) + +class TestRequirements: + + def testBasics(self): + r = Requirement.parse("Twisted>=1.2") + assert str(r) == "Twisted>=1.2" + assert repr(r) == "Requirement.parse('Twisted>=1.2')" + assert r == Requirement("Twisted", [('>=','1.2')], ()) + assert r == Requirement("twisTed", [('>=','1.2')], ()) + assert r != Requirement("Twisted", [('>=','2.0')], ()) + assert r != Requirement("Zope", [('>=','1.2')], ()) + assert r != Requirement("Zope", [('>=','3.0')], ()) + assert r != Requirement.parse("Twisted[extras]>=1.2") + + def testOrdering(self): + r1 = Requirement("Twisted", [('==','1.2c1'),('>=','1.2')], ()) + r2 = Requirement("Twisted", [('>=','1.2'),('==','1.2c1')], ()) + assert r1 == r2 + assert str(r1) == str(r2) + assert str(r2) == "Twisted==1.2c1,>=1.2" + + def testBasicContains(self): + r = Requirement("Twisted", [('>=','1.2')], ()) + foo_dist = Distribution.from_filename("FooPkg-1.3_1.egg") + twist11 = Distribution.from_filename("Twisted-1.1.egg") + twist12 = Distribution.from_filename("Twisted-1.2.egg") + assert parse_version('1.2') in r + assert parse_version('1.1') not in r + assert '1.2' in r + assert '1.1' not in r + assert foo_dist not in r + assert twist11 not in r + assert twist12 in r + + def testOptionsAndHashing(self): + r1 = Requirement.parse("Twisted[foo,bar]>=1.2") + r2 = Requirement.parse("Twisted[bar,FOO]>=1.2") + assert r1 == r2 + assert r1.extras == ("foo","bar") + assert r2.extras == ("bar","foo") # extras are normalized + assert hash(r1) == hash(r2) + assert ( + hash(r1) + == + hash(( + "twisted", + packaging.specifiers.SpecifierSet(">=1.2"), + frozenset(["foo","bar"]), + )) + ) + + def testVersionEquality(self): + r1 = Requirement.parse("foo==0.3a2") + r2 = Requirement.parse("foo!=0.3a4") + d = Distribution.from_filename + + assert d("foo-0.3a4.egg") not in r1 + assert d("foo-0.3a1.egg") not in r1 + assert d("foo-0.3a4.egg") not in r2 + + assert d("foo-0.3a2.egg") in r1 + assert d("foo-0.3a2.egg") in r2 + assert d("foo-0.3a3.egg") in r2 + assert d("foo-0.3a5.egg") in r2 + + def testSetuptoolsProjectName(self): + """ + The setuptools project should implement the setuptools package. + """ + + assert ( + Requirement.parse('setuptools').project_name == 'setuptools') + # setuptools 0.7 and higher means setuptools. + assert ( + Requirement.parse('setuptools == 0.7').project_name == 'setuptools') + assert ( + Requirement.parse('setuptools == 0.7a1').project_name == 'setuptools') + assert ( + Requirement.parse('setuptools >= 0.7').project_name == 'setuptools') + + +class TestParsing: + + def testEmptyParse(self): + assert list(parse_requirements('')) == [] + + def testYielding(self): + for inp,out in [ + ([], []), ('x',['x']), ([[]],[]), (' x\n y', ['x','y']), + (['x\n\n','y'], ['x','y']), + ]: + assert list(pkg_resources.yield_lines(inp)) == out + + def testSplitting(self): + sample = """ + x + [Y] + z + + a + [b ] + # foo + c + [ d] + [q] + v + """ + assert ( + list(pkg_resources.split_sections(sample)) + == + [ + (None, ["x"]), + ("Y", ["z", "a"]), + ("b", ["c"]), + ("d", []), + ("q", ["v"]), + ] + ) + with pytest.raises(ValueError): + list(pkg_resources.split_sections("[foo")) + + def testSafeName(self): + assert safe_name("adns-python") == "adns-python" + assert safe_name("WSGI Utils") == "WSGI-Utils" + assert safe_name("WSGI Utils") == "WSGI-Utils" + assert safe_name("Money$$$Maker") == "Money-Maker" + assert safe_name("peak.web") != "peak-web" + + def testSafeVersion(self): + assert safe_version("1.2-1") == "1.2.post1" + assert safe_version("1.2 alpha") == "1.2.alpha" + assert safe_version("2.3.4 20050521") == "2.3.4.20050521" + assert safe_version("Money$$$Maker") == "Money-Maker" + assert safe_version("peak.web") == "peak.web" + + def testSimpleRequirements(self): + assert ( + list(parse_requirements('Twis-Ted>=1.2-1')) + == + [Requirement('Twis-Ted',[('>=','1.2-1')], ())] + ) + assert ( + list(parse_requirements('Twisted >=1.2, \ # more\n<2.0')) + == + [Requirement('Twisted',[('>=','1.2'),('<','2.0')], ())] + ) + assert ( + Requirement.parse("FooBar==1.99a3") + == + Requirement("FooBar", [('==','1.99a3')], ()) + ) + with pytest.raises(ValueError): + Requirement.parse(">=2.3") + with pytest.raises(ValueError): + Requirement.parse("x\\") + with pytest.raises(ValueError): + Requirement.parse("x==2 q") + with pytest.raises(ValueError): + Requirement.parse("X==1\nY==2") + with pytest.raises(ValueError): + Requirement.parse("#") + + def testVersionEquality(self): + def c(s1,s2): + p1, p2 = parse_version(s1),parse_version(s2) + assert p1 == p2, (s1,s2,p1,p2) + + c('1.2-rc1', '1.2rc1') + c('0.4', '0.4.0') + c('0.4.0.0', '0.4.0') + c('0.4.0-0', '0.4-0') + c('0post1', '0.0post1') + c('0pre1', '0.0c1') + c('0.0.0preview1', '0c1') + c('0.0c1', '0-rc1') + c('1.2a1', '1.2.a.1') + c('1.2.a', '1.2a') + + def testVersionOrdering(self): + def c(s1,s2): + p1, p2 = parse_version(s1),parse_version(s2) + assert p1<p2, (s1,s2,p1,p2) + + c('2.1','2.1.1') + c('2a1','2b0') + c('2a1','2.1') + c('2.3a1', '2.3') + c('2.1-1', '2.1-2') + c('2.1-1', '2.1.1') + c('2.1', '2.1post4') + c('2.1a0-20040501', '2.1') + c('1.1', '02.1') + c('3.2', '3.2.post0') + c('3.2post1', '3.2post2') + c('0.4', '4.0') + c('0.0.4', '0.4.0') + c('0post1', '0.4post1') + c('2.1.0-rc1','2.1.0') + c('2.1dev','2.1a0') + + torture =""" + 0.80.1-3 0.80.1-2 0.80.1-1 0.79.9999+0.80.0pre4-1 + 0.79.9999+0.80.0pre2-3 0.79.9999+0.80.0pre2-2 + 0.77.2-1 0.77.1-1 0.77.0-1 + """.split() + + for p,v1 in enumerate(torture): + for v2 in torture[p+1:]: + c(v2,v1) + + def testVersionBuildout(self): + """ + Buildout has a function in it's bootstrap.py that inspected the return + value of parse_version. The new parse_version returns a Version class + which needs to support this behavior, at least for now. + """ + def buildout(parsed_version): + _final_parts = '*final-', '*final' + + def _final_version(parsed_version): + for part in parsed_version: + if (part[:1] == '*') and (part not in _final_parts): + return False + return True + return _final_version(parsed_version) + + assert buildout(parse_version("1.0")) + assert not buildout(parse_version("1.0a1")) + + def testVersionIndexable(self): + """ + Some projects were doing things like parse_version("v")[0], so we'll + support indexing the same as we support iterating. + """ + assert parse_version("1.0")[0] == "00000001" + + def testVersionTupleSort(self): + """ + Some projects expected to be able to sort tuples against the return + value of parse_version. So again we'll add a warning enabled shim to + make this possible. + """ + assert parse_version("1.0") < tuple(parse_version("2.0")) + assert parse_version("1.0") <= tuple(parse_version("2.0")) + assert parse_version("1.0") == tuple(parse_version("1.0")) + assert parse_version("3.0") > tuple(parse_version("2.0")) + assert parse_version("3.0") >= tuple(parse_version("2.0")) + assert parse_version("3.0") != tuple(parse_version("2.0")) + assert not (parse_version("3.0") != tuple(parse_version("3.0"))) + + def testVersionHashable(self): + """ + Ensure that our versions stay hashable even though we've subclassed + them and added some shim code to them. + """ + assert ( + hash(parse_version("1.0")) + == + hash(parse_version("1.0")) + ) + + +class TestNamespaces: + + def setup_method(self, method): + self._ns_pkgs = pkg_resources._namespace_packages.copy() + self._tmpdir = tempfile.mkdtemp(prefix="tests-setuptools-") + os.makedirs(os.path.join(self._tmpdir, "site-pkgs")) + self._prev_sys_path = sys.path[:] + sys.path.append(os.path.join(self._tmpdir, "site-pkgs")) + + def teardown_method(self, method): + shutil.rmtree(self._tmpdir) + pkg_resources._namespace_packages = self._ns_pkgs.copy() + sys.path = self._prev_sys_path[:] + + @pytest.mark.skipif(os.path.islink(tempfile.gettempdir()), + reason="Test fails when /tmp is a symlink. See #231") + def test_two_levels_deep(self): + """ + Test nested namespace packages + Create namespace packages in the following tree : + site-packages-1/pkg1/pkg2 + site-packages-2/pkg1/pkg2 + Check both are in the _namespace_packages dict and that their __path__ + is correct + """ + sys.path.append(os.path.join(self._tmpdir, "site-pkgs2")) + os.makedirs(os.path.join(self._tmpdir, "site-pkgs", "pkg1", "pkg2")) + os.makedirs(os.path.join(self._tmpdir, "site-pkgs2", "pkg1", "pkg2")) + ns_str = "__import__('pkg_resources').declare_namespace(__name__)\n" + for site in ["site-pkgs", "site-pkgs2"]: + pkg1_init = open(os.path.join(self._tmpdir, site, + "pkg1", "__init__.py"), "w") + pkg1_init.write(ns_str) + pkg1_init.close() + pkg2_init = open(os.path.join(self._tmpdir, site, + "pkg1", "pkg2", "__init__.py"), "w") + pkg2_init.write(ns_str) + pkg2_init.close() + import pkg1 + assert "pkg1" in pkg_resources._namespace_packages + # attempt to import pkg2 from site-pkgs2 + import pkg1.pkg2 + # check the _namespace_packages dict + assert "pkg1.pkg2" in pkg_resources._namespace_packages + assert pkg_resources._namespace_packages["pkg1"] == ["pkg1.pkg2"] + # check the __path__ attribute contains both paths + expected = [ + os.path.join(self._tmpdir, "site-pkgs", "pkg1", "pkg2"), + os.path.join(self._tmpdir, "site-pkgs2", "pkg1", "pkg2"), + ] + assert pkg1.pkg2.__path__ == expected diff --git a/awx/lib/site-packages/setuptools/__init__.py b/awx/lib/site-packages/setuptools/__init__.py index fc9b7b936c..8188f12528 100644 --- a/awx/lib/site-packages/setuptools/__init__.py +++ b/awx/lib/site-packages/setuptools/__init__.py @@ -1,16 +1,17 @@ """Extensions to the 'distutils' for large or complex distributions""" import os -import sys import distutils.core import distutils.filelist from distutils.core import Command as _Command from distutils.util import convert_path +from fnmatch import fnmatchcase import setuptools.version from setuptools.extension import Extension from setuptools.dist import Distribution, Feature, _get_unpatched from setuptools.depends import Require +from setuptools.compat import filterfalse __all__ = [ 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', @@ -27,33 +28,87 @@ run_2to3_on_doctests = True # Standard package names for fixer packages lib2to3_fixer_packages = ['lib2to3.fixes'] -def find_packages(where='.', exclude=()): - """Return a list all Python packages found within directory 'where' - 'where' should be supplied as a "cross-platform" (i.e. URL-style) path; it - will be converted to the appropriate local path syntax. 'exclude' is a - sequence of package names to exclude; '*' can be used as a wildcard in the - names, such that 'foo.*' will exclude all subpackages of 'foo' (but not - 'foo' itself). - """ - out = [] - stack=[(convert_path(where), '')] - while stack: - where,prefix = stack.pop(0) - for name in os.listdir(where): - fn = os.path.join(where,name) - looks_like_package = ( - '.' not in name - and os.path.isdir(fn) - and os.path.isfile(os.path.join(fn, '__init__.py')) - ) - if looks_like_package: - out.append(prefix+name) - stack.append((fn, prefix+name+'.')) - for pat in list(exclude)+['ez_setup']: - from fnmatch import fnmatchcase - out = [item for item in out if not fnmatchcase(item,pat)] - return out +class PackageFinder(object): + @classmethod + def find(cls, where='.', exclude=(), include=('*',)): + """Return a list all Python packages found within directory 'where' + + 'where' should be supplied as a "cross-platform" (i.e. URL-style) + path; it will be converted to the appropriate local path syntax. + 'exclude' is a sequence of package names to exclude; '*' can be used + as a wildcard in the names, such that 'foo.*' will exclude all + subpackages of 'foo' (but not 'foo' itself). + + 'include' is a sequence of package names to include. If it's + specified, only the named packages will be included. If it's not + specified, all found packages will be included. 'include' can contain + shell style wildcard patterns just like 'exclude'. + + The list of included packages is built up first and then any + explicitly excluded packages are removed from it. + """ + out = cls._find_packages_iter(convert_path(where)) + out = cls.require_parents(out) + includes = cls._build_filter(*include) + excludes = cls._build_filter('ez_setup', '*__pycache__', *exclude) + out = filter(includes, out) + out = filterfalse(excludes, out) + return list(out) + + @staticmethod + def require_parents(packages): + """ + Exclude any apparent package that apparently doesn't include its + parent. + + For example, exclude 'foo.bar' if 'foo' is not present. + """ + found = [] + for pkg in packages: + base, sep, child = pkg.rpartition('.') + if base and base not in found: + continue + found.append(pkg) + yield pkg + + @staticmethod + def _all_dirs(base_path): + """ + Return all dirs in base_path, relative to base_path + """ + for root, dirs, files in os.walk(base_path, followlinks=True): + for dir in dirs: + yield os.path.relpath(os.path.join(root, dir), base_path) + + @classmethod + def _find_packages_iter(cls, base_path): + dirs = cls._all_dirs(base_path) + suitable = filterfalse(lambda n: '.' in n, dirs) + return ( + path.replace(os.path.sep, '.') + for path in suitable + if cls._looks_like_package(os.path.join(base_path, path)) + ) + + @staticmethod + def _looks_like_package(path): + return os.path.isfile(os.path.join(path, '__init__.py')) + + @staticmethod + def _build_filter(*patterns): + """ + Given a list of patterns, return a callable that will be true only if + the input matches one of the patterns. + """ + return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) + +class PEP420PackageFinder(PackageFinder): + @staticmethod + def _looks_like_package(path): + return True + +find_packages = PackageFinder.find setup = distutils.core.setup @@ -83,7 +138,7 @@ def findall(dir = os.curdir): (relative to 'dir'). """ all_files = [] - for base, dirs, files in os.walk(dir): + for base, dirs, files in os.walk(dir, followlinks=True): if base==os.curdir or base.startswith(os.curdir+os.sep): base = base[2:] if base: @@ -92,7 +147,3 @@ def findall(dir = os.curdir): return all_files distutils.filelist.findall = findall # fix findall bug in distutils. - -# sys.dont_write_bytecode was introduced in Python 2.6. -_dont_write_bytecode = getattr(sys, 'dont_write_bytecode', - bool(os.environ.get("PYTHONDONTWRITEBYTECODE"))) diff --git a/awx/lib/site-packages/setuptools/archive_util.py b/awx/lib/site-packages/setuptools/archive_util.py index 1109f34677..b3c9fa5690 100644 --- a/awx/lib/site-packages/setuptools/archive_util.py +++ b/awx/lib/site-packages/setuptools/archive_util.py @@ -6,42 +6,25 @@ __all__ = [ "UnrecognizedFormat", "extraction_drivers", "unpack_directory", ] -import zipfile, tarfile, os, shutil, posixpath -from pkg_resources import ensure_directory +import zipfile +import tarfile +import os +import shutil +import posixpath +import contextlib +from pkg_resources import ensure_directory, ContextualZipFile from distutils.errors import DistutilsError class UnrecognizedFormat(DistutilsError): """Couldn't recognize the archive type""" def default_filter(src,dst): - """The default progress/filter callback; returns True for all files""" + """The default progress/filter callback; returns True for all files""" return dst - - - - - - - - - - - - - - - - - - - - - def unpack_archive(filename, extract_dir, progress_filter=default_filter, - drivers=None -): + drivers=None): """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` `progress_filter` is a function taking two arguments: a source path @@ -75,52 +58,33 @@ def unpack_archive(filename, extract_dir, progress_filter=default_filter, ) - - - - - def unpack_directory(filename, extract_dir, progress_filter=default_filter): """"Unpack" a directory, using the same interface as for archives Raises ``UnrecognizedFormat`` if `filename` is not a directory """ if not os.path.isdir(filename): - raise UnrecognizedFormat("%s is not a directory" % (filename,)) + raise UnrecognizedFormat("%s is not a directory" % filename) - paths = {filename:('',extract_dir)} + paths = { + filename: ('', extract_dir), + } for base, dirs, files in os.walk(filename): - src,dst = paths[base] + src, dst = paths[base] for d in dirs: - paths[os.path.join(base,d)] = src+d+'/', os.path.join(dst,d) + paths[os.path.join(base, d)] = src + d + '/', os.path.join(dst, d) for f in files: - name = src+f - target = os.path.join(dst,f) - target = progress_filter(src+f, target) + target = os.path.join(dst, f) + target = progress_filter(src + f, target) if not target: - continue # skip non-files + # skip non-files + continue ensure_directory(target) - f = os.path.join(base,f) + f = os.path.join(base, f) shutil.copyfile(f, target) shutil.copystat(f, target) - - - - - - - - - - - - - - - - def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): """Unpack zip `filename` to `extract_dir` @@ -132,8 +96,7 @@ def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): if not zipfile.is_zipfile(filename): raise UnrecognizedFormat("%s is not a zip file" % (filename,)) - z = zipfile.ZipFile(filename) - try: + with ContextualZipFile(filename) as z: for info in z.infolist(): name = info.filename @@ -152,17 +115,11 @@ def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): # file ensure_directory(target) data = z.read(info.filename) - f = open(target,'wb') - try: + with open(target, 'wb') as f: f.write(data) - finally: - f.close() - del data unix_attributes = info.external_attr >> 16 if unix_attributes: os.chmod(target, unix_attributes) - finally: - z.close() def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): @@ -178,19 +135,22 @@ def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): raise UnrecognizedFormat( "%s is not a compressed or uncompressed tar file" % (filename,) ) - try: - tarobj.chown = lambda *args: None # don't do any chowning! + with contextlib.closing(tarobj): + # don't do any chowning! + tarobj.chown = lambda *args: None for member in tarobj: name = member.name # don't extract absolute paths or ones with .. in them if not name.startswith('/') and '..' not in name.split('/'): prelim_dst = os.path.join(extract_dir, *name.split('/')) - # resolve any links and to extract the link targets as normal files + # resolve any links and to extract the link targets as normal + # files while member is not None and (member.islnk() or member.issym()): linkpath = member.linkname if member.issym(): - linkpath = posixpath.join(posixpath.dirname(member.name), linkpath) + base = posixpath.dirname(member.name) + linkpath = posixpath.join(base, linkpath) linkpath = posixpath.normpath(linkpath) member = tarobj._getmember(linkpath) @@ -200,11 +160,11 @@ def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): if final_dst.endswith(os.sep): final_dst = final_dst[:-1] try: - tarobj._extract_member(member, final_dst) # XXX Ugh + # XXX Ugh + tarobj._extract_member(member, final_dst) except tarfile.ExtractError: - pass # chown/chmod/mkfifo/mknode/makedev failed + # chown/chmod/mkfifo/mknode/makedev failed + pass return True - finally: - tarobj.close() extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile diff --git a/awx/lib/site-packages/setuptools/command/__init__.py b/awx/lib/site-packages/setuptools/command/__init__.py index 29c9d75ad1..f6dbc39c40 100644 --- a/awx/lib/site-packages/setuptools/command/__init__.py +++ b/awx/lib/site-packages/setuptools/command/__init__.py @@ -5,10 +5,11 @@ __all__ = [ 'register', 'bdist_wininst', 'upload_docs', ] -from setuptools.command import install_scripts +from distutils.command.bdist import bdist import sys -from distutils.command.bdist import bdist +from setuptools.command import install_scripts + if 'egg' not in bdist.format_commands: bdist.format_command['egg'] = ('bdist_egg', "Python .egg file") diff --git a/awx/lib/site-packages/setuptools/command/alias.py b/awx/lib/site-packages/setuptools/command/alias.py index 52384e1a28..452a9244ea 100644 --- a/awx/lib/site-packages/setuptools/command/alias.py +++ b/awx/lib/site-packages/setuptools/command/alias.py @@ -1,27 +1,26 @@ -import distutils, os -from setuptools import Command -from distutils.util import convert_path -from distutils import log -from distutils.errors import * +from distutils.errors import DistutilsOptionError + from setuptools.command.setopt import edit_config, option_base, config_file + def shquote(arg): """Quote an argument for later parsing by shlex.split()""" for c in '"', "'", "\\", "#": - if c in arg: return repr(arg) + if c in arg: + return repr(arg) if arg.split() != [arg]: return repr(arg) - return arg + return arg class alias(option_base): """Define a shortcut that invokes one or more commands""" - + description = "define a shortcut to invoke one or more commands" command_consumes_arguments = True user_options = [ - ('remove', 'r', 'remove (unset) the alias'), + ('remove', 'r', 'remove (unset) the alias'), ] + option_base.user_options boolean_options = option_base.boolean_options + ['remove'] @@ -49,7 +48,7 @@ class alias(option_base): print("setup.py alias", format_alias(alias, aliases)) return - elif len(self.args)==1: + elif len(self.args) == 1: alias, = self.args if self.remove: command = None @@ -61,9 +60,9 @@ class alias(option_base): return else: alias = self.args[0] - command = ' '.join(map(shquote,self.args[1:])) + command = ' '.join(map(shquote, self.args[1:])) - edit_config(self.filename, {'aliases': {alias:command}}, self.dry_run) + edit_config(self.filename, {'aliases': {alias: command}}, self.dry_run) def format_alias(name, aliases): @@ -76,7 +75,4 @@ def format_alias(name, aliases): source = '' else: source = '--filename=%r' % source - return source+name+' '+command - - - + return source + name + ' ' + command diff --git a/awx/lib/site-packages/setuptools/command/bdist_egg.py b/awx/lib/site-packages/setuptools/command/bdist_egg.py index c577615824..34fdeec21f 100644 --- a/awx/lib/site-packages/setuptools/command/bdist_egg.py +++ b/awx/lib/site-packages/setuptools/command/bdist_egg.py @@ -3,26 +3,33 @@ Build .egg distributions""" # This module should be kept compatible with Python 2.3 -import sys, os, marshal -from setuptools import Command +from distutils.errors import DistutilsSetupError from distutils.dir_util import remove_tree, mkpath +from distutils import log +from types import CodeType +import sys +import os +import marshal +import textwrap + +from pkg_resources import get_build_platform, Distribution, ensure_directory +from pkg_resources import EntryPoint +from setuptools.compat import basestring +from setuptools.extension import Library +from setuptools import Command + try: # Python 2.7 or >=3.2 from sysconfig import get_path, get_python_version + def _get_purelib(): return get_path("purelib") except ImportError: from distutils.sysconfig import get_python_lib, get_python_version + def _get_purelib(): return get_python_lib(False) -from distutils import log -from distutils.errors import DistutilsSetupError -from pkg_resources import get_build_platform, Distribution, ensure_directory -from pkg_resources import EntryPoint -from types import CodeType -from setuptools.compat import basestring, next -from setuptools.extension import Library def strip_module(filename): if '.' in filename: @@ -31,66 +38,45 @@ def strip_module(filename): filename = filename[:-6] return filename -def write_stub(resource, pyfile): - f = open(pyfile,'w') - f.write('\n'.join([ - "def __bootstrap__():", - " global __bootstrap__, __loader__, __file__", - " import sys, pkg_resources, imp", - " __file__ = pkg_resources.resource_filename(__name__,%r)" - % resource, - " __loader__ = None; del __bootstrap__, __loader__", - " imp.load_dynamic(__name__,__file__)", - "__bootstrap__()", - "" # terminal \n - ])) - f.close() -# stub __init__.py for packages distributed without one -NS_PKG_STUB = '__import__("pkg_resources").declare_namespace(__name__)' +def write_stub(resource, pyfile): + _stub_template = textwrap.dedent(""" + def __bootstrap__(): + global __bootstrap__, __loader__, __file__ + import sys, pkg_resources, imp + __file__ = pkg_resources.resource_filename(__name__, %r) + __loader__ = None; del __bootstrap__, __loader__ + imp.load_dynamic(__name__,__file__) + __bootstrap__() + """).lstrip() + with open(pyfile, 'w') as f: + f.write(_stub_template % resource) + class bdist_egg(Command): - description = "create an \"egg\" distribution" user_options = [ ('bdist-dir=', 'b', - "temporary directory for creating the distribution"), - ('plat-name=', 'p', - "platform name to embed in generated filenames " - "(default: %s)" % get_build_platform()), + "temporary directory for creating the distribution"), + ('plat-name=', 'p', "platform name to embed in generated filenames " + "(default: %s)" % get_build_platform()), ('exclude-source-files', None, - "remove all .py files from the generated egg"), + "remove all .py files from the generated egg"), ('keep-temp', 'k', - "keep the pseudo-installation tree around after " + - "creating the distribution archive"), + "keep the pseudo-installation tree around after " + + "creating the distribution archive"), ('dist-dir=', 'd', - "directory to put final built distributions in"), + "directory to put final built distributions in"), ('skip-build', None, - "skip rebuilding everything (for testing/debugging)"), + "skip rebuilding everything (for testing/debugging)"), ] boolean_options = [ 'keep-temp', 'skip-build', 'exclude-source-files' ] - - - - - - - - - - - - - - - - - def initialize_options (self): + def initialize_options(self): self.bdist_dir = None self.plat_name = None self.keep_temp = 0 @@ -99,7 +85,6 @@ class bdist_egg(Command): self.egg_output = None self.exclude_source_files = None - def finalize_options(self): ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info") self.egg_info = ei_cmd.egg_info @@ -111,7 +96,7 @@ class bdist_egg(Command): if self.plat_name is None: self.plat_name = get_build_platform() - self.set_undefined_options('bdist',('dist_dir', 'dist_dir')) + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) if self.egg_output is None: @@ -122,32 +107,25 @@ class bdist_egg(Command): self.distribution.has_ext_modules() and self.plat_name ).egg_name() - self.egg_output = os.path.join(self.dist_dir, basename+'.egg') - - - - - - - + self.egg_output = os.path.join(self.dist_dir, basename + '.egg') def do_install_data(self): # Hack for packages that install data to install's --install-lib self.get_finalized_command('install').install_lib = self.bdist_dir site_packages = os.path.normcase(os.path.realpath(_get_purelib())) - old, self.distribution.data_files = self.distribution.data_files,[] + old, self.distribution.data_files = self.distribution.data_files, [] for item in old: - if isinstance(item,tuple) and len(item)==2: + if isinstance(item, tuple) and len(item) == 2: if os.path.isabs(item[0]): realpath = os.path.realpath(item[0]) normalized = os.path.normcase(realpath) - if normalized==site_packages or normalized.startswith( - site_packages+os.sep + if normalized == site_packages or normalized.startswith( + site_packages + os.sep ): - item = realpath[len(site_packages)+1:], item[1] - # XXX else: raise ??? + item = realpath[len(site_packages) + 1:], item[1] + # XXX else: raise ??? self.distribution.data_files.append(item) try: @@ -156,22 +134,19 @@ class bdist_egg(Command): finally: self.distribution.data_files = old - def get_outputs(self): return [self.egg_output] - - def call_command(self,cmdname,**kw): + def call_command(self, cmdname, **kw): """Invoke reinitialized command `cmdname` with keyword args""" for dirname in INSTALL_DIRECTORY_ATTRS: - kw.setdefault(dirname,self.bdist_dir) - kw.setdefault('skip_build',self.skip_build) + kw.setdefault(dirname, self.bdist_dir) + kw.setdefault('skip_build', self.skip_build) kw.setdefault('dry_run', self.dry_run) cmd = self.reinitialize_command(cmdname, **kw) self.run_command(cmdname) return cmd - def run(self): # Generate metadata first self.run_command("egg_info") @@ -179,7 +154,8 @@ class bdist_egg(Command): # pull their data path from the install_lib command. log.info("installing library code to %s" % self.bdist_dir) instcmd = self.get_finalized_command('install') - old_root = instcmd.root; instcmd.root = None + old_root = instcmd.root + instcmd.root = None if self.distribution.has_c_libraries() and not self.skip_build: self.run_command('build_clib') cmd = self.call_command('install_lib', warn_dir=0) @@ -188,17 +164,17 @@ class bdist_egg(Command): all_outputs, ext_outputs = self.get_ext_outputs() self.stubs = [] to_compile = [] - for (p,ext_name) in enumerate(ext_outputs): - filename,ext = os.path.splitext(ext_name) - pyfile = os.path.join(self.bdist_dir, strip_module(filename)+'.py') + for (p, ext_name) in enumerate(ext_outputs): + filename, ext = os.path.splitext(ext_name) + pyfile = os.path.join(self.bdist_dir, strip_module(filename) + + '.py') self.stubs.append(pyfile) log.info("creating stub loader for %s" % ext_name) if not self.dry_run: write_stub(os.path.basename(ext_name), pyfile) to_compile.append(pyfile) - ext_outputs[p] = ext_name.replace(os.sep,'/') + ext_outputs[p] = ext_name.replace(os.sep, '/') - to_compile.extend(self.make_init_files()) if to_compile: cmd.byte_compile(to_compile) if self.distribution.data_files: @@ -206,12 +182,13 @@ class bdist_egg(Command): # Make the EGG-INFO directory archive_root = self.bdist_dir - egg_info = os.path.join(archive_root,'EGG-INFO') + egg_info = os.path.join(archive_root, 'EGG-INFO') self.mkpath(egg_info) if self.distribution.scripts: script_dir = os.path.join(egg_info, 'scripts') log.info("installing scripts to %s" % script_dir) - self.call_command('install_scripts',install_dir=script_dir,no_ep=1) + self.call_command('install_scripts', install_dir=script_dir, + no_ep=1) self.copy_metadata_to(egg_info) native_libs = os.path.join(egg_info, "native_libs.txt") @@ -229,10 +206,10 @@ class bdist_egg(Command): os.unlink(native_libs) write_safety_flag( - os.path.join(archive_root,'EGG-INFO'), self.zip_safe() + os.path.join(archive_root, 'EGG-INFO'), self.zip_safe() ) - if os.path.exists(os.path.join(self.egg_info,'depends.txt')): + if os.path.exists(os.path.join(self.egg_info, 'depends.txt')): log.warn( "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n" "Use the install_requires/extras_require setup() args instead." @@ -243,61 +220,33 @@ class bdist_egg(Command): # Make the archive make_zipfile(self.egg_output, archive_root, verbose=self.verbose, - dry_run=self.dry_run, mode=self.gen_header()) + dry_run=self.dry_run, mode=self.gen_header()) if not self.keep_temp: remove_tree(self.bdist_dir, dry_run=self.dry_run) # Add to 'Distribution.dist_files' so that the "upload" command works - getattr(self.distribution,'dist_files',[]).append( - ('bdist_egg',get_python_version(),self.egg_output)) - - - + getattr(self.distribution, 'dist_files', []).append( + ('bdist_egg', get_python_version(), self.egg_output)) def zap_pyfiles(self): log.info("Removing .py files from temporary directory") - for base,dirs,files in walk_egg(self.bdist_dir): + for base, dirs, files in walk_egg(self.bdist_dir): for name in files: if name.endswith('.py'): - path = os.path.join(base,name) + path = os.path.join(base, name) log.debug("Deleting %s", path) os.unlink(path) def zip_safe(self): - safe = getattr(self.distribution,'zip_safe',None) + safe = getattr(self.distribution, 'zip_safe', None) if safe is not None: return safe log.warn("zip_safe flag not set; analyzing archive contents...") return analyze_egg(self.bdist_dir, self.stubs) - def make_init_files(self): - """Create missing package __init__ files""" - init_files = [] - for base,dirs,files in walk_egg(self.bdist_dir): - if base==self.bdist_dir: - # don't put an __init__ in the root - continue - for name in files: - if name.endswith('.py'): - if '__init__.py' not in files: - pkg = base[len(self.bdist_dir)+1:].replace(os.sep,'.') - if self.distribution.has_contents_for(pkg): - log.warn("Creating missing __init__.py for %s",pkg) - filename = os.path.join(base,'__init__.py') - if not self.dry_run: - f = open(filename,'w'); f.write(NS_PKG_STUB) - f.close() - init_files.append(filename) - break - else: - # not a package, don't traverse to subdirectories - dirs[:] = [] - - return init_files - def gen_header(self): epm = EntryPoint.parse_map(self.distribution.entry_points or '') - ep = epm.get('setuptools.installation',{}).get('eggsecutable') + ep = epm.get('setuptools.installation', {}).get('eggsecutable') if ep is None: return 'w' # not an eggsecutable, do it the usual way. @@ -325,7 +274,6 @@ class bdist_egg(Command): ' echo Please rename it back to %(basename)s and try again.\n' ' exec false\n' 'fi\n' - ) % locals() if not self.dry_run: @@ -335,13 +283,12 @@ class bdist_egg(Command): f.close() return 'a' - def copy_metadata_to(self, target_dir): "Copy metadata (egg info) to the target_dir" # normalize the path (so that a forward-slash in egg_info will # match using startswith below) norm_egg_info = os.path.normpath(self.egg_info) - prefix = os.path.join(norm_egg_info,'') + prefix = os.path.join(norm_egg_info, '') for path in self.ei_cmd.filelist.files: if path.startswith(prefix): target = os.path.join(target_dir, path[len(prefix):]) @@ -354,23 +301,24 @@ class bdist_egg(Command): all_outputs = [] ext_outputs = [] - paths = {self.bdist_dir:''} + paths = {self.bdist_dir: ''} for base, dirs, files in os.walk(self.bdist_dir): for filename in files: if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS: - all_outputs.append(paths[base]+filename) + all_outputs.append(paths[base] + filename) for filename in dirs: - paths[os.path.join(base,filename)] = paths[base]+filename+'/' + paths[os.path.join(base, filename)] = (paths[base] + + filename + '/') if self.distribution.has_ext_modules(): build_cmd = self.get_finalized_command('build_ext') for ext in build_cmd.extensions: - if isinstance(ext,Library): + if isinstance(ext, Library): continue fullname = build_cmd.get_ext_fullname(ext.name) filename = build_cmd.get_ext_filename(fullname) if not os.path.basename(filename).startswith('dl-'): - if os.path.exists(os.path.join(self.bdist_dir,filename)): + if os.path.exists(os.path.join(self.bdist_dir, filename)): ext_outputs.append(filename) return all_outputs, ext_outputs @@ -379,24 +327,24 @@ class bdist_egg(Command): NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split()) - - def walk_egg(egg_dir): """Walk an unpacked egg's contents, skipping the metadata directory""" walker = os.walk(egg_dir) - base,dirs,files = next(walker) + base, dirs, files = next(walker) if 'EGG-INFO' in dirs: dirs.remove('EGG-INFO') - yield base,dirs,files + yield base, dirs, files for bdf in walker: yield bdf + def analyze_egg(egg_dir, stubs): # check for existing flag in EGG-INFO - for flag,fn in safety_flags.items(): - if os.path.exists(os.path.join(egg_dir,'EGG-INFO',fn)): + for flag, fn in safety_flags.items(): + if os.path.exists(os.path.join(egg_dir, 'EGG-INFO', fn)): return flag - if not can_scan(): return False + if not can_scan(): + return False safe = True for base, dirs, files in walk_egg(egg_dir): for name in files: @@ -407,35 +355,42 @@ def analyze_egg(egg_dir, stubs): safe = scan_module(egg_dir, base, name, stubs) and safe return safe + def write_safety_flag(egg_dir, safe): # Write or remove zip safety flag file(s) - for flag,fn in safety_flags.items(): + for flag, fn in safety_flags.items(): fn = os.path.join(egg_dir, fn) if os.path.exists(fn): if safe is None or bool(safe) != flag: os.unlink(fn) - elif safe is not None and bool(safe)==flag: - f=open(fn,'wt'); f.write('\n'); f.close() + elif safe is not None and bool(safe) == flag: + f = open(fn, 'wt') + f.write('\n') + f.close() + safety_flags = { True: 'zip-safe', False: 'not-zip-safe', } + def scan_module(egg_dir, base, name, stubs): """Check whether module possibly uses unsafe-for-zipfile stuff""" - filename = os.path.join(base,name) + filename = os.path.join(base, name) if filename[:-1] in stubs: - return True # Extension module - pkg = base[len(egg_dir)+1:].replace(os.sep,'.') - module = pkg+(pkg and '.' or '')+os.path.splitext(name)[0] + return True # Extension module + pkg = base[len(egg_dir) + 1:].replace(os.sep, '.') + module = pkg + (pkg and '.' or '') + os.path.splitext(name)[0] if sys.version_info < (3, 3): - skip = 8 # skip magic & date + skip = 8 # skip magic & date else: skip = 12 # skip magic & date & file size - f = open(filename,'rb'); f.read(skip) - code = marshal.load(f); f.close() + f = open(filename, 'rb') + f.read(skip) + code = marshal.load(f) + f.close() safe = True symbols = dict.fromkeys(iter_symbols(code)) for bad in ['__file__', '__path__']: @@ -452,21 +407,24 @@ def scan_module(egg_dir, base, name, stubs): log.warn("%s: module MAY be using inspect.%s", module, bad) safe = False if '__name__' in symbols and '__main__' in symbols and '.' not in module: - if sys.version[:3]=="2.4": # -m works w/zipfiles in 2.5 + if sys.version[:3] == "2.4": # -m works w/zipfiles in 2.5 log.warn("%s: top-level module may be 'python -m' script", module) safe = False return safe + def iter_symbols(code): """Yield names and strings used by `code` and its nested code objects""" - for name in code.co_names: yield name + for name in code.co_names: + yield name for const in code.co_consts: - if isinstance(const,basestring): + if isinstance(const, basestring): yield const - elif isinstance(const,CodeType): + elif isinstance(const, CodeType): for name in iter_symbols(const): yield name + def can_scan(): if not sys.platform.startswith('java') and sys.platform != 'cli': # CPython, PyPy, etc. @@ -475,39 +433,6 @@ def can_scan(): log.warn("Please ask the author to include a 'zip_safe'" " setting (either True or False) in the package's setup.py") - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Attribute names of options for commands that might need to be convinced to # install to the egg build directory @@ -515,9 +440,9 @@ INSTALL_DIRECTORY_ATTRS = [ 'install_lib', 'install_dir', 'install_data', 'install_base' ] + def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=None, - mode='w' -): + mode='w'): """Create a zip file from all the files under 'base_dir'. The output zip file will be named 'base_dir' + ".zip". Uses either the "zipfile" Python module (if available) or the InfoZIP "zip" utility (if installed @@ -525,6 +450,7 @@ def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=None, raises DistutilsExecError. Returns the name of the output zip file. """ import zipfile + mkpath(os.path.dirname(zip_filename), dry_run=dry_run) log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir) @@ -532,13 +458,14 @@ def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=None, for name in names: path = os.path.normpath(os.path.join(dirname, name)) if os.path.isfile(path): - p = path[len(base_dir)+1:] + p = path[len(base_dir) + 1:] if not dry_run: z.write(path, p) log.debug("adding '%s'" % p) if compress is None: - compress = (sys.version>="2.4") # avoid 2.3 zipimport bug when 64 bits + # avoid 2.3 zipimport bug when 64 bits + compress = (sys.version >= "2.4") compression = [zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED][bool(compress)] if not dry_run: @@ -550,4 +477,3 @@ def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=None, for dirname, dirs, files in os.walk(base_dir): visit(None, dirname, files) return zip_filename -# diff --git a/awx/lib/site-packages/setuptools/command/bdist_rpm.py b/awx/lib/site-packages/setuptools/command/bdist_rpm.py index 8c48da3559..70730927ec 100644 --- a/awx/lib/site-packages/setuptools/command/bdist_rpm.py +++ b/awx/lib/site-packages/setuptools/command/bdist_rpm.py @@ -1,51 +1,30 @@ -# This is just a kludge so that bdist_rpm doesn't guess wrong about the -# distribution name and version, if the egg_info command is going to alter -# them, another kludge to allow you to build old-style non-egg RPMs, and -# finally, a kludge to track .rpm files for uploading when run on Python <2.5. +import distutils.command.bdist_rpm as orig -from distutils.command.bdist_rpm import bdist_rpm as _bdist_rpm -import sys, os -class bdist_rpm(_bdist_rpm): +class bdist_rpm(orig.bdist_rpm): + """ + Override the default bdist_rpm behavior to do the following: - def initialize_options(self): - _bdist_rpm.initialize_options(self) - self.no_egg = None - - if sys.version<"2.5": - # Track for uploading any .rpm file(s) moved to self.dist_dir - def move_file(self, src, dst, level=1): - _bdist_rpm.move_file(self, src, dst, level) - if dst==self.dist_dir and src.endswith('.rpm'): - getattr(self.distribution,'dist_files',[]).append( - ('bdist_rpm', - src.endswith('.src.rpm') and 'any' or sys.version[:3], - os.path.join(dst, os.path.basename(src))) - ) + 1. Run egg_info to ensure the name and version are properly calculated. + 2. Always run 'install' using --single-version-externally-managed to + disable eggs in RPM distributions. + 3. Replace dash with underscore in the version numbers for better RPM + compatibility. + """ def run(self): - self.run_command('egg_info') # ensure distro name is up-to-date - _bdist_rpm.run(self) - - - - - - - - - - - + # ensure distro name is up-to-date + self.run_command('egg_info') + orig.bdist_rpm.run(self) def _make_spec_file(self): version = self.distribution.get_version() - rpmversion = version.replace('-','_') - spec = _bdist_rpm._make_spec_file(self) - line23 = '%define version '+version - line24 = '%define version '+rpmversion - spec = [ + rpmversion = version.replace('-', '_') + spec = orig.bdist_rpm._make_spec_file(self) + line23 = '%define version ' + version + line24 = '%define version ' + rpmversion + spec = [ line.replace( "Source0: %{name}-%{version}.tar", "Source0: %{name}-%{unmangled_version}.tar" @@ -55,28 +34,10 @@ class bdist_rpm(_bdist_rpm): ).replace( "%setup", "%setup -n %{name}-%{unmangled_version}" - ).replace(line23,line24) + ).replace(line23, line24) for line in spec ] - spec.insert(spec.index(line24)+1, "%define unmangled_version "+version) + insert_loc = spec.index(line24) + 1 + unmangled_version = "%define unmangled_version " + version + spec.insert(insert_loc, unmangled_version) return spec - - - - - - - - - - - - - - - - - - - - diff --git a/awx/lib/site-packages/setuptools/command/bdist_wininst.py b/awx/lib/site-packages/setuptools/command/bdist_wininst.py index e8521f834c..073de97b46 100644 --- a/awx/lib/site-packages/setuptools/command/bdist_wininst.py +++ b/awx/lib/site-packages/setuptools/command/bdist_wininst.py @@ -1,82 +1,21 @@ -from distutils.command.bdist_wininst import bdist_wininst as _bdist_wininst -import os, sys +import distutils.command.bdist_wininst as orig -class bdist_wininst(_bdist_wininst): - _good_upload = _bad_upload = None - def create_exe(self, arcname, fullname, bitmap=None): - _bdist_wininst.create_exe(self, arcname, fullname, bitmap) - installer_name = self.get_installer_filename(fullname) - if self.target_version: - pyversion = self.target_version - # fix 2.5+ bdist_wininst ignoring --target-version spec - self._bad_upload = ('bdist_wininst', 'any', installer_name) - else: - pyversion = 'any' - self._good_upload = ('bdist_wininst', pyversion, installer_name) - - def _fix_upload_names(self): - good, bad = self._good_upload, self._bad_upload - dist_files = getattr(self.distribution, 'dist_files', []) - if bad in dist_files: - dist_files.remove(bad) - if good not in dist_files: - dist_files.append(good) - - def reinitialize_command (self, command, reinit_subcommands=0): +class bdist_wininst(orig.bdist_wininst): + def reinitialize_command(self, command, reinit_subcommands=0): + """ + Supplement reinitialize_command to work around + http://bugs.python.org/issue20819 + """ cmd = self.distribution.reinitialize_command( command, reinit_subcommands) if command in ('install', 'install_lib'): - cmd.install_lib = None # work around distutils bug + cmd.install_lib = None return cmd def run(self): self._is_running = True try: - _bdist_wininst.run(self) - self._fix_upload_names() + orig.bdist_wininst.run(self) finally: self._is_running = False - - - if not hasattr(_bdist_wininst, 'get_installer_filename'): - def get_installer_filename(self, fullname): - # Factored out to allow overriding in subclasses - if self.target_version: - # if we create an installer for a specific python version, - # it's better to include this in the name - installer_name = os.path.join(self.dist_dir, - "%s.win32-py%s.exe" % - (fullname, self.target_version)) - else: - installer_name = os.path.join(self.dist_dir, - "%s.win32.exe" % fullname) - return installer_name - # get_installer_filename() - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/awx/lib/site-packages/setuptools/command/build_ext.py b/awx/lib/site-packages/setuptools/command/build_ext.py index 50a039ce50..e4b2c593f3 100644 --- a/awx/lib/site-packages/setuptools/command/build_ext.py +++ b/awx/lib/site-packages/setuptools/command/build_ext.py @@ -1,25 +1,30 @@ from distutils.command.build_ext import build_ext as _du_build_ext +from distutils.file_util import copy_file +from distutils.ccompiler import new_compiler +from distutils.sysconfig import customize_compiler +from distutils.errors import DistutilsError +from distutils import log +import os +import sys +import itertools + +from setuptools.extension import Library + try: # Attempt to use Pyrex for building extensions, if available from Pyrex.Distutils.build_ext import build_ext as _build_ext except ImportError: _build_ext = _du_build_ext -import os, sys -from distutils.file_util import copy_file -from setuptools.extension import Library -from distutils.ccompiler import new_compiler -from distutils.sysconfig import customize_compiler try: # Python 2.7 or >=3.2 from sysconfig import _CONFIG_VARS except ImportError: from distutils.sysconfig import get_config_var + get_config_var("LDSHARED") # make sure _config_vars is initialized del get_config_var from distutils.sysconfig import _config_vars as _CONFIG_VARS -from distutils import log -from distutils.errors import * have_rtld = False use_stubs = False @@ -29,20 +34,13 @@ if sys.platform == "darwin": use_stubs = True elif os.name != 'nt': try: - from dl import RTLD_NOW - have_rtld = True - use_stubs = True + import dl + use_stubs = have_rtld = hasattr(dl, 'RTLD_NOW') except ImportError: pass -def if_dl(s): - if have_rtld: - return s - return '' - - - +if_dl = lambda s: s if have_rtld else '' class build_ext(_build_ext): @@ -62,8 +60,9 @@ class build_ext(_build_ext): modpath = fullname.split('.') package = '.'.join(modpath[:-1]) package_dir = build_py.get_package_dir(package) - dest_filename = os.path.join(package_dir,os.path.basename(filename)) - src_filename = os.path.join(self.build_lib,filename) + dest_filename = os.path.join(package_dir, + os.path.basename(filename)) + src_filename = os.path.join(self.build_lib, filename) # Always copy, even if source is older than destination, to ensure # that the right extensions for the current Python/platform are @@ -75,8 +74,8 @@ class build_ext(_build_ext): if ext._needs_stub: self.write_stub(package_dir or os.curdir, ext, True) - - if _build_ext is not _du_build_ext and not hasattr(_build_ext,'pyrex_sources'): + if _build_ext is not _du_build_ext and not hasattr(_build_ext, + 'pyrex_sources'): # Workaround for problems using some Pyrex versions w/SWIG and/or 2.4 def swig_sources(self, sources, *otherargs): # first do any Pyrex processing @@ -84,18 +83,16 @@ class build_ext(_build_ext): # Then do any actual SWIG stuff on the remainder return _du_build_ext.swig_sources(self, sources, *otherargs) - - def get_ext_filename(self, fullname): - filename = _build_ext.get_ext_filename(self,fullname) + filename = _build_ext.get_ext_filename(self, fullname) if fullname in self.ext_map: ext = self.ext_map[fullname] - if isinstance(ext,Library): + if isinstance(ext, Library): fn, ext = os.path.splitext(filename) - return self.shlib_compiler.library_filename(fn,libtype) + return self.shlib_compiler.library_filename(fn, libtype) elif use_stubs and ext._links_to_dynamic: - d,fn = os.path.split(filename) - return os.path.join(d,'dl-'+fn) + d, fn = os.path.split(filename) + return os.path.join(d, 'dl-' + fn) return filename def initialize_options(self): @@ -109,7 +106,7 @@ class build_ext(_build_ext): self.extensions = self.extensions or [] self.check_extensions_list(self.extensions) self.shlibs = [ext for ext in self.extensions - if isinstance(ext,Library)] + if isinstance(ext, Library)] if self.shlibs: self.setup_shlib_compiler() for ext in self.extensions: @@ -122,11 +119,12 @@ class build_ext(_build_ext): # XXX what to do with conflicts? self.ext_map[fullname.split('.')[-1]] = ext - ltd = ext._links_to_dynamic = \ - self.shlibs and self.links_to_dynamic(ext) or False - ext._needs_stub = ltd and use_stubs and not isinstance(ext,Library) + ltd = self.shlibs and self.links_to_dynamic(ext) or False + ns = ltd and use_stubs and not isinstance(ext, Library) + ext._links_to_dynamic = ltd + ext._needs_stub = ns filename = ext._file_name = self.get_ext_filename(fullname) - libdir = os.path.dirname(os.path.join(self.build_lib,filename)) + libdir = os.path.dirname(os.path.join(self.build_lib, filename)) if ltd and libdir not in ext.library_dirs: ext.library_dirs.append(libdir) if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs: @@ -140,7 +138,8 @@ class build_ext(_build_ext): tmp = _CONFIG_VARS.copy() try: # XXX Help! I don't have any idea whether these are right... - _CONFIG_VARS['LDSHARED'] = "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup" + _CONFIG_VARS['LDSHARED'] = ( + "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup") _CONFIG_VARS['CCSHARED'] = " -dynamiclib" _CONFIG_VARS['SO'] = ".dylib" customize_compiler(compiler) @@ -154,7 +153,7 @@ class build_ext(_build_ext): compiler.set_include_dirs(self.include_dirs) if self.define is not None: # 'define' option is a list of (name,value) tuples - for (name,value) in self.define: + for (name, value) in self.define: compiler.define_macro(name, value) if self.undef is not None: for macro in self.undef: @@ -171,23 +170,20 @@ class build_ext(_build_ext): # hack so distutils' build_extension() builds a library instead compiler.link_shared_object = link_shared_object.__get__(compiler) - - def get_export_symbols(self, ext): - if isinstance(ext,Library): + if isinstance(ext, Library): return ext.export_symbols - return _build_ext.get_export_symbols(self,ext) + return _build_ext.get_export_symbols(self, ext) def build_extension(self, ext): _compiler = self.compiler try: - if isinstance(ext,Library): + if isinstance(ext, Library): self.compiler = self.shlib_compiler - _build_ext.build_extension(self,ext) + _build_ext.build_extension(self, ext) if ext._needs_stub: - self.write_stub( - self.get_finalized_command('build_py').build_lib, ext - ) + cmd = self.get_finalized_command('build_py').build_lib + self.write_stub(cmd, ext) finally: self.compiler = _compiler @@ -197,54 +193,66 @@ class build_ext(_build_ext): # XXX as dynamic, and not just using a locally-found version or a # XXX static-compiled version libnames = dict.fromkeys([lib._full_name for lib in self.shlibs]) - pkg = '.'.join(ext._full_name.split('.')[:-1]+['']) - for libname in ext.libraries: - if pkg+libname in libnames: return True - return False + pkg = '.'.join(ext._full_name.split('.')[:-1] + ['']) + return any(pkg + libname in libnames for libname in ext.libraries) def get_outputs(self): - outputs = _build_ext.get_outputs(self) - optimize = self.get_finalized_command('build_py').optimize - for ext in self.extensions: - if ext._needs_stub: - base = os.path.join(self.build_lib, *ext._full_name.split('.')) - outputs.append(base+'.py') - outputs.append(base+'.pyc') - if optimize: - outputs.append(base+'.pyo') - return outputs + return _build_ext.get_outputs(self) + self.__get_stubs_outputs() + + def __get_stubs_outputs(self): + # assemble the base name for each extension that needs a stub + ns_ext_bases = ( + os.path.join(self.build_lib, *ext._full_name.split('.')) + for ext in self.extensions + if ext._needs_stub + ) + # pair each base with the extension + pairs = itertools.product(ns_ext_bases, self.__get_output_extensions()) + return list(base + fnext for base, fnext in pairs) + + def __get_output_extensions(self): + yield '.py' + yield '.pyc' + if self.get_finalized_command('build_py').optimize: + yield '.pyo' def write_stub(self, output_dir, ext, compile=False): - log.info("writing stub loader for %s to %s",ext._full_name, output_dir) - stub_file = os.path.join(output_dir, *ext._full_name.split('.'))+'.py' + log.info("writing stub loader for %s to %s", ext._full_name, + output_dir) + stub_file = (os.path.join(output_dir, *ext._full_name.split('.')) + + '.py') if compile and os.path.exists(stub_file): - raise DistutilsError(stub_file+" already exists! Please delete.") + raise DistutilsError(stub_file + " already exists! Please delete.") if not self.dry_run: - f = open(stub_file,'w') - f.write('\n'.join([ - "def __bootstrap__():", - " global __bootstrap__, __file__, __loader__", - " import sys, os, pkg_resources, imp"+if_dl(", dl"), - " __file__ = pkg_resources.resource_filename(__name__,%r)" - % os.path.basename(ext._file_name), - " del __bootstrap__", - " if '__loader__' in globals():", - " del __loader__", - if_dl(" old_flags = sys.getdlopenflags()"), - " old_dir = os.getcwd()", - " try:", - " os.chdir(os.path.dirname(__file__))", - if_dl(" sys.setdlopenflags(dl.RTLD_NOW)"), - " imp.load_dynamic(__name__,__file__)", - " finally:", - if_dl(" sys.setdlopenflags(old_flags)"), - " os.chdir(old_dir)", - "__bootstrap__()", - "" # terminal \n - ])) + f = open(stub_file, 'w') + f.write( + '\n'.join([ + "def __bootstrap__():", + " global __bootstrap__, __file__, __loader__", + " import sys, os, pkg_resources, imp" + if_dl(", dl"), + " __file__ = pkg_resources.resource_filename" + "(__name__,%r)" + % os.path.basename(ext._file_name), + " del __bootstrap__", + " if '__loader__' in globals():", + " del __loader__", + if_dl(" old_flags = sys.getdlopenflags()"), + " old_dir = os.getcwd()", + " try:", + " os.chdir(os.path.dirname(__file__))", + if_dl(" sys.setdlopenflags(dl.RTLD_NOW)"), + " imp.load_dynamic(__name__,__file__)", + " finally:", + if_dl(" sys.setdlopenflags(old_flags)"), + " os.chdir(old_dir)", + "__bootstrap__()", + "" # terminal \n + ]) + ) f.close() if compile: from distutils.util import byte_compile + byte_compile([stub_file], optimize=0, force=True, dry_run=self.dry_run) optimize = self.get_finalized_command('install_lib').optimize @@ -255,14 +263,15 @@ class build_ext(_build_ext): os.unlink(stub_file) -if use_stubs or os.name=='nt': +if use_stubs or os.name == 'nt': # Build shared libraries # - def link_shared_object(self, objects, output_libname, output_dir=None, - libraries=None, library_dirs=None, runtime_library_dirs=None, - export_symbols=None, debug=0, extra_preargs=None, - extra_postargs=None, build_temp=None, target_lang=None - ): self.link( + def link_shared_object( + self, objects, output_libname, output_dir=None, libraries=None, + library_dirs=None, runtime_library_dirs=None, export_symbols=None, + debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None): + self.link( self.SHARED_LIBRARY, objects, output_libname, output_dir, libraries, library_dirs, runtime_library_dirs, export_symbols, debug, extra_preargs, extra_postargs, @@ -272,19 +281,19 @@ else: # Build static libraries everywhere else libtype = 'static' - def link_shared_object(self, objects, output_libname, output_dir=None, - libraries=None, library_dirs=None, runtime_library_dirs=None, - export_symbols=None, debug=0, extra_preargs=None, - extra_postargs=None, build_temp=None, target_lang=None - ): + def link_shared_object( + self, objects, output_libname, output_dir=None, libraries=None, + library_dirs=None, runtime_library_dirs=None, export_symbols=None, + debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None): # XXX we need to either disallow these attrs on Library instances, - # or warn/abort here if set, or something... - #libraries=None, library_dirs=None, runtime_library_dirs=None, - #export_symbols=None, extra_preargs=None, extra_postargs=None, - #build_temp=None + # or warn/abort here if set, or something... + # libraries=None, library_dirs=None, runtime_library_dirs=None, + # export_symbols=None, extra_preargs=None, extra_postargs=None, + # build_temp=None - assert output_dir is None # distutils build_ext doesn't pass this - output_dir,filename = os.path.split(output_libname) + assert output_dir is None # distutils build_ext doesn't pass this + output_dir, filename = os.path.split(output_libname) basename, ext = os.path.splitext(filename) if self.library_filename("x").startswith('lib'): # strip 'lib' prefix; this is kludgy if some platform uses @@ -294,5 +303,3 @@ else: self.create_static_lib( objects, basename, output_dir, debug, target_lang ) - - diff --git a/awx/lib/site-packages/setuptools/command/build_py.py b/awx/lib/site-packages/setuptools/command/build_py.py index 090b44d265..98080694ad 100644 --- a/awx/lib/site-packages/setuptools/command/build_py.py +++ b/awx/lib/site-packages/setuptools/command/build_py.py @@ -1,10 +1,10 @@ +from glob import glob +from distutils.util import convert_path +import distutils.command.build_py as orig import os import sys import fnmatch import textwrap -from distutils.command.build_py import build_py as _build_py -from distutils.util import convert_path -from glob import glob try: from setuptools.lib2to3_ex import Mixin2to3 @@ -13,7 +13,8 @@ except ImportError: def run_2to3(self, files, doctests=True): "do nothing" -class build_py(_build_py, Mixin2to3): + +class build_py(orig.build_py, Mixin2to3): """Enhanced 'build_py' command that includes data files with packages The data files are specified via a 'package_data' argument to 'setup()'. @@ -22,11 +23,14 @@ class build_py(_build_py, Mixin2to3): Also, this version of the 'build_py' command allows you to specify both 'py_modules' and 'packages' in the same setup operation. """ + def finalize_options(self): - _build_py.finalize_options(self) + orig.build_py.finalize_options(self) self.package_data = self.distribution.package_data - self.exclude_package_data = self.distribution.exclude_package_data or {} - if 'data_files' in self.__dict__: del self.__dict__['data_files'] + self.exclude_package_data = (self.distribution.exclude_package_data or + {}) + if 'data_files' in self.__dict__: + del self.__dict__['data_files'] self.__updated_files = [] self.__doctests_2to3 = [] @@ -48,16 +52,17 @@ class build_py(_build_py, Mixin2to3): # Only compile actual .py files, using our base class' idea of what our # output files are. - self.byte_compile(_build_py.get_outputs(self, include_bytecode=0)) + self.byte_compile(orig.build_py.get_outputs(self, include_bytecode=0)) def __getattr__(self, attr): - if attr=='data_files': # lazily compute data files + if attr == 'data_files': # lazily compute data files self.data_files = files = self._get_data_files() return files - return _build_py.__getattr__(self,attr) + return orig.build_py.__getattr__(self, attr) def build_module(self, module, module_file, package): - outfile, copied = _build_py.build_module(self, module, module_file, package) + outfile, copied = orig.build_py.build_module(self, module, module_file, + package) if copied: self.__updated_files.append(outfile) return outfile, copied @@ -74,12 +79,12 @@ class build_py(_build_py, Mixin2to3): build_dir = os.path.join(*([self.build_lib] + package.split('.'))) # Length of path to strip from found files - plen = len(src_dir)+1 + plen = len(src_dir) + 1 # Strip directory from globbed filenames filenames = [ file[plen:] for file in self.find_data_files(package, src_dir) - ] + ] data.append((package, src_dir, build_dir, filenames)) return data @@ -102,7 +107,8 @@ class build_py(_build_py, Mixin2to3): srcfile = os.path.join(src_dir, filename) outf, copied = self.copy_file(srcfile, target) srcfile = os.path.abspath(srcfile) - if copied and srcfile in self.distribution.convert_2to3_doctests: + if (copied and + srcfile in self.distribution.convert_2to3_doctests): self.__doctests_2to3.append(outf) def analyze_manifest(self): @@ -117,21 +123,22 @@ class build_py(_build_py, Mixin2to3): self.run_command('egg_info') ei_cmd = self.get_finalized_command('egg_info') for path in ei_cmd.filelist.files: - d,f = os.path.split(assert_relative(path)) + d, f = os.path.split(assert_relative(path)) prev = None oldf = f - while d and d!=prev and d not in src_dirs: + while d and d != prev and d not in src_dirs: prev = d d, df = os.path.split(d) f = os.path.join(df, f) if d in src_dirs: - if path.endswith('.py') and f==oldf: - continue # it's a module, not data - mf.setdefault(src_dirs[d],[]).append(path) + if path.endswith('.py') and f == oldf: + continue # it's a module, not data + mf.setdefault(src_dirs[d], []).append(path) - def get_data_files(self): pass # kludge 2.4 for lazy computation + def get_data_files(self): + pass # kludge 2.4 for lazy computation - if sys.version<"2.4": # Python 2.4 already has this code + if sys.version < "2.4": # Python 2.4 already has this code def get_outputs(self, include_bytecode=1): """Return complete list of files copied to the build directory @@ -140,11 +147,11 @@ class build_py(_build_py, Mixin2to3): needed for the 'install_lib' command to do its job properly, and to generate a correct installation manifest.) """ - return _build_py.get_outputs(self, include_bytecode) + [ + return orig.build_py.get_outputs(self, include_bytecode) + [ os.path.join(build_dir, filename) - for package, src_dir, build_dir,filenames in self.data_files + for package, src_dir, build_dir, filenames in self.data_files for filename in filenames - ] + ] def check_package(self, package, package_dir): """Check namespace packages' __init__ for declare_namespace""" @@ -153,36 +160,37 @@ class build_py(_build_py, Mixin2to3): except KeyError: pass - init_py = _build_py.check_package(self, package, package_dir) + init_py = orig.build_py.check_package(self, package, package_dir) self.packages_checked[package] = init_py if not init_py or not self.distribution.namespace_packages: return init_py for pkg in self.distribution.namespace_packages: - if pkg==package or pkg.startswith(package+'.'): + if pkg == package or pkg.startswith(package + '.'): break else: return init_py - f = open(init_py,'rbU') + f = open(init_py, 'rbU') if 'declare_namespace'.encode() not in f.read(): - from distutils import log - log.warn( - "WARNING: %s is a namespace package, but its __init__.py does\n" - "not declare_namespace(); setuptools 0.7 will REQUIRE this!\n" - '(See the setuptools manual under "Namespace Packages" for ' - "details.)\n", package + from distutils.errors import DistutilsError + + raise DistutilsError( + "Namespace package problem: %s is a namespace package, but " + "its\n__init__.py does not call declare_namespace()! Please " + 'fix it.\n(See the setuptools manual under ' + '"Namespace Packages" for details.)\n"' % (package,) ) f.close() return init_py def initialize_options(self): - self.packages_checked={} - _build_py.initialize_options(self) + self.packages_checked = {} + orig.build_py.initialize_options(self) def get_package_dir(self, package): - res = _build_py.get_package_dir(self, package) + res = orig.build_py.get_package_dir(self, package) if self.distribution.src_root is not None: return os.path.join(self.distribution.src_root, res) return res @@ -202,7 +210,7 @@ class build_py(_build_py, Mixin2to3): seen = {} return [ f for f in files if f not in bad - and f not in seen and seen.setdefault(f,1) # ditch dupes + and f not in seen and seen.setdefault(f, 1) # ditch dupes ] @@ -210,6 +218,7 @@ def assert_relative(path): if not os.path.isabs(path): return path from distutils.errors import DistutilsSetupError + msg = textwrap.dedent(""" Error: setup script specifies an absolute path: diff --git a/awx/lib/site-packages/setuptools/command/develop.py b/awx/lib/site-packages/setuptools/command/develop.py index 1d500040d0..368b64fed7 100644 --- a/awx/lib/site-packages/setuptools/command/develop.py +++ b/awx/lib/site-packages/setuptools/command/develop.py @@ -1,9 +1,14 @@ -from setuptools.command.easy_install import easy_install -from distutils.util import convert_path, subst_vars -from pkg_resources import Distribution, PathMetadata, normalize_path +from distutils.util import convert_path from distutils import log from distutils.errors import DistutilsError, DistutilsOptionError -import os, sys, setuptools, glob +import os +import glob + +from pkg_resources import Distribution, PathMetadata, normalize_path +from setuptools.command.easy_install import easy_install +from setuptools.compat import PY3 +import setuptools + class develop(easy_install): """Set up package for development""" @@ -32,59 +37,56 @@ class develop(easy_install): self.egg_path = None easy_install.initialize_options(self) self.setup_path = None - self.always_copy_from = '.' # always copy eggs installed in curdir - - + self.always_copy_from = '.' # always copy eggs installed in curdir def finalize_options(self): ei = self.get_finalized_command("egg_info") if ei.broken_egg_info: - raise DistutilsError( - "Please rename %r to %r before using 'develop'" - % (ei.egg_info, ei.broken_egg_info) - ) + template = "Please rename %r to %r before using 'develop'" + args = ei.egg_info, ei.broken_egg_info + raise DistutilsError(template % args) self.args = [ei.egg_name] - - - easy_install.finalize_options(self) self.expand_basedirs() self.expand_dirs() # pick up setup-dir .egg files only: no .egg-info self.package_index.scan(glob.glob('*.egg')) - self.egg_link = os.path.join(self.install_dir, ei.egg_name+'.egg-link') + self.egg_link = os.path.join(self.install_dir, ei.egg_name + + '.egg-link') self.egg_base = ei.egg_base if self.egg_path is None: self.egg_path = os.path.abspath(ei.egg_base) target = normalize_path(self.egg_base) - if normalize_path(os.path.join(self.install_dir, self.egg_path)) != target: + egg_path = normalize_path(os.path.join(self.install_dir, + self.egg_path)) + if egg_path != target: raise DistutilsOptionError( "--egg-path must be a relative path from the install" - " directory to "+target - ) + " directory to " + target + ) # Make a distribution for the package's source self.dist = Distribution( target, PathMetadata(target, os.path.abspath(ei.egg_info)), - project_name = ei.egg_name + project_name=ei.egg_name ) - p = self.egg_base.replace(os.sep,'/') - if p!= os.curdir: - p = '../' * (p.count('/')+1) + p = self.egg_base.replace(os.sep, '/') + if p != os.curdir: + p = '../' * (p.count('/') + 1) self.setup_path = p p = normalize_path(os.path.join(self.install_dir, self.egg_path, p)) - if p != normalize_path(os.curdir): + if p != normalize_path(os.curdir): raise DistutilsOptionError( "Can't get a consistent path to setup script from" " installation directory", p, normalize_path(os.curdir)) def install_for_development(self): - if sys.version_info >= (3,) and getattr(self.distribution, 'use_2to3', False): + if PY3 and getattr(self.distribution, 'use_2to3', False): # If we run 2to3 we can not do this inplace: # Ensure metadata is up-to-date @@ -99,12 +101,13 @@ class develop(easy_install): self.reinitialize_command('build_ext', inplace=0) self.run_command('build_ext') - + # Fixup egg-link and easy-install.pth ei_cmd = self.get_finalized_command("egg_info") self.egg_path = build_path self.dist.location = build_path - self.dist._provider = PathMetadata(build_path, ei_cmd.egg_info) # XXX + # XXX + self.dist._provider = PathMetadata(build_path, ei_cmd.egg_info) else: # Without 2to3 inplace works fine: self.run_command('egg_info') @@ -112,7 +115,7 @@ class develop(easy_install): # Build extensions in-place self.reinitialize_command('build_ext', inplace=1) self.run_command('build_ext') - + self.install_site_py() # ensure that target dir is site-safe if setuptools.bootstrap_install_from: self.easy_install(setuptools.bootstrap_install_from) @@ -121,21 +124,21 @@ class develop(easy_install): # create an .egg-link in the installation dir, pointing to our egg log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) if not self.dry_run: - f = open(self.egg_link,"w") + f = open(self.egg_link, "w") f.write(self.egg_path + "\n" + self.setup_path) f.close() # postprocess the installed distro, fixing up .pth, installing scripts, # and handling requirements self.process_distribution(None, self.dist, not self.no_deps) - def uninstall_link(self): if os.path.exists(self.egg_link): log.info("Removing %s (link to %s)", self.egg_link, self.egg_base) egg_link_file = open(self.egg_link) contents = [line.rstrip() for line in egg_link_file] egg_link_file.close() - if contents not in ([self.egg_path], [self.egg_path, self.setup_path]): + if contents not in ([self.egg_path], + [self.egg_path, self.setup_path]): log.warn("Link points to %s: uninstall aborted", contents) return if not self.dry_run: @@ -149,7 +152,7 @@ class develop(easy_install): def install_egg_scripts(self, dist): if dist is not self.dist: # Installing a dependency, so fall back to normal behavior - return easy_install.install_egg_scripts(self,dist) + return easy_install.install_egg_scripts(self, dist) # create wrapper scripts in the script dir, pointing to dist.scripts @@ -160,8 +163,7 @@ class develop(easy_install): for script_name in self.distribution.scripts or []: script_path = os.path.abspath(convert_path(script_name)) script_name = os.path.basename(script_path) - f = open(script_path,'rU') + f = open(script_path, 'rU') script_text = f.read() f.close() self.install_script(dist, script_name, script_text, script_path) - diff --git a/awx/lib/site-packages/setuptools/command/easy_install.py b/awx/lib/site-packages/setuptools/command/easy_install.py index 08ebf3e589..e057b508e9 100644 --- a/awx/lib/site-packages/setuptools/command/easy_install.py +++ b/awx/lib/site-packages/setuptools/command/easy_install.py @@ -12,6 +12,14 @@ __ https://pythonhosted.org/setuptools/easy_install.html """ +from glob import glob +from distutils.util import get_platform +from distutils.util import convert_path, subst_vars +from distutils.errors import DistutilsArgError, DistutilsOptionError, \ + DistutilsError, DistutilsPlatformError +from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS +from distutils import log, dir_util +from distutils.command.build_scripts import first_line_re import sys import os import zipimport @@ -26,44 +34,43 @@ import textwrap import warnings import site import struct -from glob import glob -from distutils import log, dir_util +import contextlib +import subprocess +import shlex +import io -import pkg_resources -from setuptools import Command, _dont_write_bytecode +from setuptools import Command from setuptools.sandbox import run_setup from setuptools.py31compat import get_path, get_config_vars - -from distutils.util import get_platform -from distutils.util import convert_path, subst_vars -from distutils.errors import DistutilsArgError, DistutilsOptionError, \ - DistutilsError, DistutilsPlatformError -from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS from setuptools.command import setopt from setuptools.archive_util import unpack_archive from setuptools.package_index import PackageIndex from setuptools.package_index import URL_SCHEME from setuptools.command import bdist_egg, egg_info from setuptools.compat import (iteritems, maxsize, basestring, unicode, - reraise) + reraise, PY2, PY3) from pkg_resources import ( yield_lines, normalize_path, resource_string, ensure_directory, get_distribution, find_distributions, Environment, Requirement, Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound, VersionConflict, DEVELOP_DIST, ) +import pkg_resources + +# Turn on PEP440Warnings +warnings.filterwarnings("default", category=pkg_resources.PEP440Warning) -sys_executable = os.environ.get('__VENV_LAUNCHER__', - os.path.normpath(sys.executable)) __all__ = [ 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', 'main', 'get_exe_prefixes', ] + def is_64bit(): return struct.calcsize("P") == 8 + def samefile(p1, p2): both_exist = os.path.exists(p1) and os.path.exists(p2) use_samefile = hasattr(os.path, 'samefile') and both_exist @@ -73,9 +80,11 @@ def samefile(p1, p2): norm_p2 = os.path.normpath(os.path.normcase(p2)) return norm_p1 == norm_p2 -if sys.version_info <= (3,): + +if PY2: def _to_ascii(s): return s + def isascii(s): try: unicode(s, 'ascii') @@ -85,6 +94,7 @@ if sys.version_info <= (3,): else: def _to_ascii(s): return s.encode('ascii') + def isascii(s): try: s.encode('ascii') @@ -92,6 +102,7 @@ else: except UnicodeError: return False + class easy_install(Command): """Manage a download/build/install process""" description = "Find/get/install Python packages" @@ -109,22 +120,22 @@ class easy_install(Command): ("index-url=", "i", "base URL of Python Package Index"), ("find-links=", "f", "additional URL(s) to search for packages"), ("build-directory=", "b", - "download/extract/build in DIR; keep the results"), + "download/extract/build in DIR; keep the results"), ('optimize=', 'O', - "also compile with optimization: -O1 for \"python -O\", " - "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), + "also compile with optimization: -O1 for \"python -O\", " + "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), ('record=', None, - "filename in which to record list of installed files"), + "filename in which to record list of installed files"), ('always-unzip', 'Z', "don't install as a zipfile, no matter what"), - ('site-dirs=','S',"list of directories where .pth files work"), + ('site-dirs=', 'S', "list of directories where .pth files work"), ('editable', 'e', "Install specified packages in editable form"), ('no-deps', 'N', "don't install dependencies"), ('allow-hosts=', 'H', "pattern(s) that hostnames must match"), ('local-snapshots-ok', 'l', - "allow building eggs from local checkouts"), + "allow building eggs from local checkouts"), ('version', None, "print version information and exit"), ('no-find-links', None, - "Don't load find-links defined in packages being installed") + "Don't load find-links defined in packages being installed") ] boolean_options = [ 'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy', @@ -158,10 +169,10 @@ class easy_install(Command): self.editable = self.no_deps = self.allow_hosts = None self.root = self.prefix = self.no_report = None self.version = None - self.install_purelib = None # for pure module distributions - self.install_platlib = None # non-pure (dists w/ extensions) - self.install_headers = None # for C/C++ headers - self.install_lib = None # set to either purelib or platlib + self.install_purelib = None # for pure module distributions + self.install_platlib = None # non-pure (dists w/ extensions) + self.install_headers = None # for C/C++ headers + self.install_lib = None # set to either purelib or platlib self.install_scripts = None self.install_data = None self.install_base = None @@ -196,7 +207,8 @@ class easy_install(Command): if os.path.exists(filename) or os.path.islink(filename): log.info("Deleting %s", filename) if not self.dry_run: - if os.path.isdir(filename) and not os.path.islink(filename): + if (os.path.isdir(filename) and + not os.path.islink(filename)): rmtree(filename) else: os.unlink(filename) @@ -229,7 +241,7 @@ class easy_install(Command): self.config_vars['usersite'] = self.install_usersite # fix the install_dir if "--user" was used - #XXX: duplicate of the code in the setup command + # XXX: duplicate of the code in the setup command if self.user and site.ENABLE_USER_SITE: self.create_home_path() if self.install_userbase is None: @@ -244,7 +256,8 @@ class easy_install(Command): self.expand_basedirs() self.expand_dirs() - self._expand('install_dir','script_dir','build_directory','site_dirs') + self._expand('install_dir', 'script_dir', 'build_directory', + 'site_dirs') # If a non-default installation directory was specified, default the # script directory to match it. if self.script_dir is None: @@ -256,12 +269,12 @@ class easy_install(Command): # Let install_dir get set by install_lib command, which in turn # gets its info from the install command, and takes into account # --prefix and --home and all that other crud. - self.set_undefined_options('install_lib', - ('install_dir','install_dir') + self.set_undefined_options( + 'install_lib', ('install_dir', 'install_dir') ) # Likewise, set default script_dir from 'install_scripts.install_dir' - self.set_undefined_options('install_scripts', - ('install_dir', 'script_dir') + self.set_undefined_options( + 'install_scripts', ('install_dir', 'script_dir') ) if self.user and self.install_purelib: @@ -275,18 +288,20 @@ class easy_install(Command): self.all_site_dirs = get_site_dirs() if self.site_dirs is not None: site_dirs = [ - os.path.expanduser(s.strip()) for s in self.site_dirs.split(',') + os.path.expanduser(s.strip()) for s in + self.site_dirs.split(',') ] for d in site_dirs: if not os.path.isdir(d): log.warn("%s (in --site-dirs) does not exist", d) elif normalize_path(d) not in normpath: raise DistutilsOptionError( - d+" (in --site-dirs) is not on sys.path" + d + " (in --site-dirs) is not on sys.path" ) else: self.all_site_dirs.append(normalize_path(d)) - if not self.editable: self.check_site_dir() + if not self.editable: + self.check_site_dir() self.index_url = self.index_url or "https://pypi.python.org/simple" self.shadow_path = self.all_site_dirs[:] for path_item in self.install_dir, normalize_path(self.script_dir): @@ -299,9 +314,9 @@ class easy_install(Command): hosts = ['*'] if self.package_index is None: self.package_index = self.create_index( - self.index_url, search_path = self.shadow_path, hosts=hosts, + self.index_url, search_path=self.shadow_path, hosts=hosts, ) - self.local_index = Environment(self.shadow_path+sys.path) + self.local_index = Environment(self.shadow_path + sys.path) if self.find_links is not None: if isinstance(self.find_links, basestring): @@ -309,14 +324,15 @@ class easy_install(Command): else: self.find_links = [] if self.local_snapshots_ok: - self.package_index.scan_egg_links(self.shadow_path+sys.path) + self.package_index.scan_egg_links(self.shadow_path + sys.path) if not self.no_find_links: self.package_index.add_find_links(self.find_links) - self.set_undefined_options('install_lib', ('optimize','optimize')) - if not isinstance(self.optimize,int): + self.set_undefined_options('install_lib', ('optimize', 'optimize')) + if not isinstance(self.optimize, int): try: self.optimize = int(self.optimize) - if not (0 <= self.optimize <= 2): raise ValueError + if not (0 <= self.optimize <= 2): + raise ValueError except ValueError: raise DistutilsOptionError("--optimize must be 0, 1, or 2") @@ -348,7 +364,7 @@ class easy_install(Command): """Calls `os.path.expanduser` on install dirs.""" self._expand_attrs(['install_purelib', 'install_platlib', 'install_lib', 'install_headers', - 'install_scripts', 'install_data',]) + 'install_scripts', 'install_data', ]) def run(self): if self.verbose != self.distribution.verbose: @@ -358,11 +374,12 @@ class easy_install(Command): self.easy_install(spec, not self.no_deps) if self.record: outputs = self.outputs - if self.root: # strip any package prefix + if self.root: # strip any package prefix root_len = len(self.root) for counter in range(len(outputs)): outputs[counter] = outputs[counter][root_len:] from distutils import file_util + self.execute( file_util.write_file, (self.record, outputs), "writing list of installed files to '%s'" % @@ -390,7 +407,7 @@ class easy_install(Command): """Verify that self.install_dir is .pth-capable dir, if needed""" instdir = normalize_path(self.install_dir) - pth_file = os.path.join(instdir,'easy-install.pth') + pth_file = os.path.join(instdir, 'easy-install.pth') # Is it a configured, PYTHONPATH, implicit, or explicit site dir? is_site_dir = instdir in self.all_site_dirs @@ -400,13 +417,14 @@ class easy_install(Command): is_site_dir = self.check_pth_processing() else: # make sure we can write to target dir - testfile = self.pseudo_tempname()+'.write-test' + testfile = self.pseudo_tempname() + '.write-test' test_exists = os.path.exists(testfile) try: - if test_exists: os.unlink(testfile) - open(testfile,'w').close() + if test_exists: + os.unlink(testfile) + open(testfile, 'w').close() os.unlink(testfile) - except (OSError,IOError): + except (OSError, IOError): self.cant_write_to_target() if not is_site_dir and not self.multi_version: @@ -419,84 +437,94 @@ class easy_install(Command): else: self.pth_file = None - PYTHONPATH = os.environ.get('PYTHONPATH','').split(os.pathsep) + PYTHONPATH = os.environ.get('PYTHONPATH', '').split(os.pathsep) if instdir not in map(normalize_path, [_f for _f in PYTHONPATH if _f]): # only PYTHONPATH dirs need a site.py, so pretend it's there self.sitepy_installed = True elif self.multi_version and not os.path.exists(pth_file): - self.sitepy_installed = True # don't need site.py in this case - self.pth_file = None # and don't create a .pth file + self.sitepy_installed = True # don't need site.py in this case + self.pth_file = None # and don't create a .pth file self.install_dir = instdir + __cant_write_msg = textwrap.dedent(""" + can't create or remove files in install directory + + The following error occurred while trying to add or remove files in the + installation directory: + + %s + + The installation directory you specified (via --install-dir, --prefix, or + the distutils default setting) was: + + %s + """).lstrip() + + __not_exists_id = textwrap.dedent(""" + This directory does not currently exist. Please create it and try again, or + choose a different installation directory (using the -d or --install-dir + option). + """).lstrip() + + __access_msg = textwrap.dedent(""" + Perhaps your account does not have write access to this directory? If the + installation directory is a system-owned directory, you may need to sign in + as the administrator or "root" account. If you do not have administrative + access to this machine, you may wish to choose a different installation + directory, preferably one that is listed in your PYTHONPATH environment + variable. + + For information on other options, you may wish to consult the + documentation at: + + https://pythonhosted.org/setuptools/easy_install.html + + Please make the appropriate changes for your system and try again. + """).lstrip() + def cant_write_to_target(self): - template = """can't create or remove files in install directory - -The following error occurred while trying to add or remove files in the -installation directory: - - %s - -The installation directory you specified (via --install-dir, --prefix, or -the distutils default setting) was: - - %s -""" - msg = template % (sys.exc_info()[1], self.install_dir,) + msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,) if not os.path.exists(self.install_dir): - msg += """ -This directory does not currently exist. Please create it and try again, or -choose a different installation directory (using the -d or --install-dir -option). -""" + msg += '\n' + self.__not_exists_id else: - msg += """ -Perhaps your account does not have write access to this directory? If the -installation directory is a system-owned directory, you may need to sign in -as the administrator or "root" account. If you do not have administrative -access to this machine, you may wish to choose a different installation -directory, preferably one that is listed in your PYTHONPATH environment -variable. - -For information on other options, you may wish to consult the -documentation at: - - https://pythonhosted.org/setuptools/easy_install.html - -Please make the appropriate changes for your system and try again. -""" + msg += '\n' + self.__access_msg raise DistutilsError(msg) def check_pth_processing(self): """Empirically verify whether .pth files are supported in inst. dir""" instdir = self.install_dir log.info("Checking .pth file support in %s", instdir) - pth_file = self.pseudo_tempname()+".pth" - ok_file = pth_file+'.ok' + pth_file = self.pseudo_tempname() + ".pth" + ok_file = pth_file + '.ok' ok_exists = os.path.exists(ok_file) try: - if ok_exists: os.unlink(ok_file) + if ok_exists: + os.unlink(ok_file) dirname = os.path.dirname(ok_file) if not os.path.exists(dirname): os.makedirs(dirname) - f = open(pth_file,'w') - except (OSError,IOError): + f = open(pth_file, 'w') + except (OSError, IOError): self.cant_write_to_target() else: try: - f.write("import os; f = open(%r, 'w'); f.write('OK'); f.close()\n" % (ok_file,)) + f.write("import os; f = open(%r, 'w'); f.write('OK'); " + "f.close()\n" % (ok_file,)) f.close() - f=None + f = None executable = sys.executable - if os.name=='nt': - dirname,basename = os.path.split(executable) - alt = os.path.join(dirname,'pythonw.exe') - if basename.lower()=='python.exe' and os.path.exists(alt): + if os.name == 'nt': + dirname, basename = os.path.split(executable) + alt = os.path.join(dirname, 'pythonw.exe') + if (basename.lower() == 'python.exe' and + os.path.exists(alt)): # use pythonw.exe to avoid opening a console window executable = alt from distutils.spawn import spawn - spawn([executable,'-E','-c','pass'],0) + + spawn([executable, '-E', '-c', 'pass'], 0) if os.path.exists(ok_file): log.info( @@ -525,7 +553,7 @@ Please make the appropriate changes for your system and try again. continue self.install_script( dist, script_name, - dist.get_metadata('scripts/'+script_name) + dist.get_metadata('scripts/' + script_name) ) self.install_wrapper_scripts(dist) @@ -533,7 +561,7 @@ Please make the appropriate changes for your system and try again. if os.path.isdir(path): for base, dirs, files in os.walk(path): for filename in files: - self.outputs.append(os.path.join(base,filename)) + self.outputs.append(os.path.join(base, filename)) else: self.outputs.append(path) @@ -545,7 +573,7 @@ Please make the appropriate changes for your system and try again. % (spec,) ) - def check_editable(self,spec): + def check_editable(self, spec): if not self.editable: return @@ -558,15 +586,17 @@ Please make the appropriate changes for your system and try again. def easy_install(self, spec, deps=False): tmpdir = tempfile.mkdtemp(prefix="easy_install-") download = None - if not self.editable: self.install_site_py() + if not self.editable: + self.install_site_py() try: - if not isinstance(spec,Requirement): + if not isinstance(spec, Requirement): if URL_SCHEME(spec): # It's a url, download it to tmpdir and process self.not_editable(spec) download = self.package_index.download(spec, tmpdir) - return self.install_item(None, download, tmpdir, deps, True) + return self.install_item(None, download, tmpdir, deps, + True) elif os.path.exists(spec): # Existing file or directory, just process it directly @@ -577,15 +607,15 @@ Please make the appropriate changes for your system and try again. self.check_editable(spec) dist = self.package_index.fetch_distribution( - spec, tmpdir, self.upgrade, self.editable, not self.always_copy, - self.local_index + spec, tmpdir, self.upgrade, self.editable, + not self.always_copy, self.local_index ) if dist is None: msg = "Could not find suitable distribution for %r" % spec if self.always_copy: - msg+=" (--always-copy skips system and development eggs)" + msg += " (--always-copy skips system and development eggs)" raise DistutilsError(msg) - elif dist.precedence==DEVELOP_DIST: + elif dist.precedence == DEVELOP_DIST: # .egg-info dists don't need installing, just process deps self.process_distribution(spec, dist, deps, "Using") return dist @@ -612,10 +642,10 @@ Please make the appropriate changes for your system and try again. # at this point, we know it's a local .egg, we just don't know if # it's already installed. for dist in self.local_index[spec.project_name]: - if dist.location==download: + if dist.location == download: break else: - install_needed = True # it's not in the local index + install_needed = True # it's not in the local index log.info("Processing %s", os.path.basename(download)) @@ -644,6 +674,8 @@ Please make the appropriate changes for your system and try again. def process_distribution(self, requirement, dist, deps=True, *info): self.update_pth(dist) self.package_index.add(dist) + if dist in self.local_index[dist.key]: + self.local_index.remove(dist) self.local_index.add(dist) self.install_egg_scripts(dist) self.installed_projects[dist.key] = dist @@ -670,17 +702,12 @@ Please make the appropriate changes for your system and try again. distros = WorkingSet([]).resolve( [requirement], self.local_index, self.easy_install ) - except DistributionNotFound: - e = sys.exc_info()[1] + except DistributionNotFound as e: raise DistutilsError( "Could not find required distribution %s" % e.args ) - except VersionConflict: - e = sys.exc_info()[1] - raise DistutilsError( - "Installed distribution %s conflicts with requirement %s" - % e.args - ) + except VersionConflict as e: + raise DistutilsError(e.report()) if self.always_copy or self.always_copy_from: # Force all the relevant distros to be copied or activated for dist in distros: @@ -700,17 +727,18 @@ Please make the appropriate changes for your system and try again. def maybe_move(self, spec, dist_filename, setup_base): dst = os.path.join(self.build_directory, spec.key) if os.path.exists(dst): - msg = "%r already exists in %s; build directory %s will not be kept" + msg = ("%r already exists in %s; build directory %s will not be " + "kept") log.warn(msg, spec.key, self.build_directory, setup_base) return setup_base if os.path.isdir(dist_filename): setup_base = dist_filename else: - if os.path.dirname(dist_filename)==setup_base: - os.unlink(dist_filename) # get it out of the tmp dir + if os.path.dirname(dist_filename) == setup_base: + os.unlink(dist_filename) # get it out of the tmp dir contents = os.listdir(setup_base) - if len(contents)==1: - dist_filename = os.path.join(setup_base,contents[0]) + if len(contents) == 1: + dist_filename = os.path.join(setup_base, contents[0]) if os.path.isdir(dist_filename): # if the only thing there is a directory, move it instead setup_base = dist_filename @@ -720,7 +748,7 @@ Please make the appropriate changes for your system and try again. def install_wrapper_scripts(self, dist): if not self.exclude_scripts: - for args in get_script_args(dist): + for args in ScriptWriter.best().get_args(dist): self.write_script(*args) def install_script(self, dist, script_name, script_text, dev_path=None): @@ -728,32 +756,31 @@ Please make the appropriate changes for your system and try again. spec = str(dist.as_requirement()) is_script = is_python_script(script_text, script_name) - def get_template(filename): - """ - There are a couple of template scripts in the package. This - function loads one of them and prepares it for use. - - These templates use triple-quotes to escape variable - substitutions so the scripts get the 2to3 treatment when build - on Python 3. The templates cannot use triple-quotes naturally. - """ - raw_bytes = resource_string('setuptools', template_name) - template_str = raw_bytes.decode('utf-8') - clean_template = template_str.replace('"""', '') - return clean_template - if is_script: - template_name = 'script template.py' - if dev_path: - template_name = template_name.replace('.py', ' (dev).py') - script_text = (get_script_header(script_text) + - get_template(template_name) % locals()) + script_text = (ScriptWriter.get_header(script_text) + + self._load_template(dev_path) % locals()) self.write_script(script_name, _to_ascii(script_text), 'b') + @staticmethod + def _load_template(dev_path): + """ + There are a couple of template scripts in the package. This + function loads one of them and prepares it for use. + """ + # See https://bitbucket.org/pypa/setuptools/issue/134 for info + # on script file naming and downstream issues with SVR4 + name = 'script.tmpl' + if dev_path: + name = name.replace('.tmpl', ' (dev).tmpl') + + raw_bytes = resource_string('setuptools', name) + return raw_bytes.decode('utf-8') + def write_script(self, script_name, contents, mode="t", blockers=()): """Write an executable file to the scripts directory""" - self.delete_blockers( # clean up old .py/.pyw w/o a script - [os.path.join(self.script_dir,x) for x in blockers]) + self.delete_blockers( # clean up old .py/.pyw w/o a script + [os.path.join(self.script_dir, x) for x in blockers] + ) log.info("Installing %s script to %s", script_name, self.script_dir) target = os.path.join(self.script_dir, script_name) self.add_output(target) @@ -763,10 +790,10 @@ Please make the appropriate changes for your system and try again. ensure_directory(target) if os.path.exists(target): os.unlink(target) - f = open(target,"w"+mode) + f = open(target, "w" + mode) f.write(contents) f.close() - chmod(target, 0x1FF-mask) # 0777 + chmod(target, 0o777 - mask) def install_eggs(self, spec, dist_filename, tmpdir): # .egg dirs or files are already built, so just return them @@ -782,7 +809,7 @@ Please make the appropriate changes for your system and try again. elif os.path.isdir(dist_filename): setup_base = os.path.abspath(dist_filename) - if (setup_base.startswith(tmpdir) # something we downloaded + if (setup_base.startswith(tmpdir) # something we downloaded and self.build_directory and spec is not None): setup_base = self.maybe_move(spec, dist_filename, setup_base) @@ -793,11 +820,13 @@ Please make the appropriate changes for your system and try again. setups = glob(os.path.join(setup_base, '*', 'setup.py')) if not setups: raise DistutilsError( - "Couldn't find a setup script in %s" % os.path.abspath(dist_filename) + "Couldn't find a setup script in %s" % + os.path.abspath(dist_filename) ) - if len(setups)>1: + if len(setups) > 1: raise DistutilsError( - "Multiple setup scripts in %s" % os.path.abspath(dist_filename) + "Multiple setup scripts in %s" % + os.path.abspath(dist_filename) ) setup_script = setups[0] @@ -810,13 +839,15 @@ Please make the appropriate changes for your system and try again. def egg_distribution(self, egg_path): if os.path.isdir(egg_path): - metadata = PathMetadata(egg_path,os.path.join(egg_path,'EGG-INFO')) + metadata = PathMetadata(egg_path, os.path.join(egg_path, + 'EGG-INFO')) else: metadata = EggMetadata(zipimport.zipimporter(egg_path)) - return Distribution.from_filename(egg_path,metadata=metadata) + return Distribution.from_filename(egg_path, metadata=metadata) def install_egg(self, egg_path, tmpdir): - destination = os.path.join(self.install_dir,os.path.basename(egg_path)) + destination = os.path.join(self.install_dir, + os.path.basename(egg_path)) destination = os.path.abspath(destination) if not self.dry_run: ensure_directory(destination) @@ -826,24 +857,33 @@ Please make the appropriate changes for your system and try again. if os.path.isdir(destination) and not os.path.islink(destination): dir_util.remove_tree(destination, dry_run=self.dry_run) elif os.path.exists(destination): - self.execute(os.unlink,(destination,),"Removing "+destination) - uncache_zipdir(destination) - if os.path.isdir(egg_path): - if egg_path.startswith(tmpdir): - f,m = shutil.move, "Moving" + self.execute(os.unlink, (destination,), "Removing " + + destination) + try: + new_dist_is_zipped = False + if os.path.isdir(egg_path): + if egg_path.startswith(tmpdir): + f, m = shutil.move, "Moving" + else: + f, m = shutil.copytree, "Copying" + elif self.should_unzip(dist): + self.mkpath(destination) + f, m = self.unpack_and_compile, "Extracting" else: - f,m = shutil.copytree, "Copying" - elif self.should_unzip(dist): - self.mkpath(destination) - f,m = self.unpack_and_compile, "Extracting" - elif egg_path.startswith(tmpdir): - f,m = shutil.move, "Moving" - else: - f,m = shutil.copy2, "Copying" - - self.execute(f, (egg_path, destination), - (m+" %s to %s") % - (os.path.basename(egg_path),os.path.dirname(destination))) + new_dist_is_zipped = True + if egg_path.startswith(tmpdir): + f, m = shutil.move, "Moving" + else: + f, m = shutil.copy2, "Copying" + self.execute(f, (egg_path, destination), + (m + " %s to %s") % + (os.path.basename(egg_path), + os.path.dirname(destination))) + update_dist_caches(destination, + fix_zipimporter_caches=new_dist_is_zipped) + except: + update_dist_caches(destination, fix_zipimporter_caches=False) + raise self.add_output(destination) return self.egg_distribution(destination) @@ -858,30 +898,33 @@ Please make the appropriate changes for your system and try again. # Create a dummy distribution object until we build the real distro dist = Distribution( None, - project_name=cfg.get('metadata','name'), - version=cfg.get('metadata','version'), platform=get_platform(), + project_name=cfg.get('metadata', 'name'), + version=cfg.get('metadata', 'version'), platform=get_platform(), ) # Convert the .exe to an unpacked egg - egg_path = dist.location = os.path.join(tmpdir, dist.egg_name()+'.egg') + egg_path = dist.location = os.path.join(tmpdir, dist.egg_name() + + '.egg') egg_tmp = egg_path + '.tmp' _egg_info = os.path.join(egg_tmp, 'EGG-INFO') pkg_inf = os.path.join(_egg_info, 'PKG-INFO') - ensure_directory(pkg_inf) # make sure EGG-INFO dir exists - dist._provider = PathMetadata(egg_tmp, _egg_info) # XXX + ensure_directory(pkg_inf) # make sure EGG-INFO dir exists + dist._provider = PathMetadata(egg_tmp, _egg_info) # XXX self.exe_to_egg(dist_filename, egg_tmp) # Write EGG-INFO/PKG-INFO if not os.path.exists(pkg_inf): - f = open(pkg_inf,'w') + f = open(pkg_inf, 'w') f.write('Metadata-Version: 1.0\n') - for k,v in cfg.items('metadata'): + for k, v in cfg.items('metadata'): if k != 'target_version': - f.write('%s: %s\n' % (k.replace('_','-').title(), v)) + f.write('%s: %s\n' % (k.replace('_', '-').title(), v)) f.close() - script_dir = os.path.join(_egg_info,'scripts') - self.delete_blockers( # delete entry-point scripts to avoid duping - [os.path.join(script_dir,args[0]) for args in get_script_args(dist)] + script_dir = os.path.join(_egg_info, 'scripts') + # delete entry-point scripts to avoid duping + self.delete_blockers( + [os.path.join(script_dir, args[0]) for args in + ScriptWriter.get_args(dist)] ) # Build .egg file from tmpdir bdist_egg.make_zipfile( @@ -897,11 +940,12 @@ Please make the appropriate changes for your system and try again. to_compile = [] native_libs = [] top_level = {} - def process(src,dst): + + def process(src, dst): s = src.lower() - for old,new in prefixes: + for old, new in prefixes: if s.startswith(old): - src = new+src[len(old):] + src = new + src[len(old):] parts = src.split('/') dst = os.path.join(egg_tmp, *parts) dl = dst.lower() @@ -909,97 +953,104 @@ Please make the appropriate changes for your system and try again. parts[-1] = bdist_egg.strip_module(parts[-1]) top_level[os.path.splitext(parts[0])[0]] = 1 native_libs.append(src) - elif dl.endswith('.py') and old!='SCRIPTS/': + elif dl.endswith('.py') and old != 'SCRIPTS/': top_level[os.path.splitext(parts[0])[0]] = 1 to_compile.append(dst) return dst if not src.endswith('.pth'): log.warn("WARNING: can't process %s", src) return None + # extract, tracking .pyd/.dll->native_libs and .py -> to_compile unpack_archive(dist_filename, egg_tmp, process) stubs = [] for res in native_libs: - if res.lower().endswith('.pyd'): # create stubs for .pyd's + if res.lower().endswith('.pyd'): # create stubs for .pyd's parts = res.split('/') resource = parts[-1] - parts[-1] = bdist_egg.strip_module(parts[-1])+'.py' + parts[-1] = bdist_egg.strip_module(parts[-1]) + '.py' pyfile = os.path.join(egg_tmp, *parts) to_compile.append(pyfile) stubs.append(pyfile) bdist_egg.write_stub(resource, pyfile) - self.byte_compile(to_compile) # compile .py's - bdist_egg.write_safety_flag(os.path.join(egg_tmp,'EGG-INFO'), + self.byte_compile(to_compile) # compile .py's + bdist_egg.write_safety_flag( + os.path.join(egg_tmp, 'EGG-INFO'), bdist_egg.analyze_egg(egg_tmp, stubs)) # write zip-safety flag - for name in 'top_level','native_libs': + for name in 'top_level', 'native_libs': if locals()[name]: - txt = os.path.join(egg_tmp, 'EGG-INFO', name+'.txt') + txt = os.path.join(egg_tmp, 'EGG-INFO', name + '.txt') if not os.path.exists(txt): - f = open(txt,'w') - f.write('\n'.join(locals()[name])+'\n') + f = open(txt, 'w') + f.write('\n'.join(locals()[name]) + '\n') f.close() + __mv_warning = textwrap.dedent(""" + Because this distribution was installed --multi-version, before you can + import modules from this package in an application, you will need to + 'import pkg_resources' and then use a 'require()' call similar to one of + these examples, in order to select the desired version: + + pkg_resources.require("%(name)s") # latest installed version + pkg_resources.require("%(name)s==%(version)s") # this exact version + pkg_resources.require("%(name)s>=%(version)s") # this version or higher + """).lstrip() + + __id_warning = textwrap.dedent(""" + Note also that the installation directory must be on sys.path at runtime for + this to work. (e.g. by being the application's script directory, by being on + PYTHONPATH, or by being added to sys.path by your code.) + """) + def installation_report(self, req, dist, what="Installed"): """Helpful installation message for display to package users""" msg = "\n%(what)s %(eggloc)s%(extras)s" if self.multi_version and not self.no_report: - msg += """ + msg += '\n' + self.__mv_warning + if self.install_dir not in map(normalize_path, sys.path): + msg += '\n' + self.__id_warning -Because this distribution was installed --multi-version, before you can -import modules from this package in an application, you will need to -'import pkg_resources' and then use a 'require()' call similar to one of -these examples, in order to select the desired version: - - pkg_resources.require("%(name)s") # latest installed version - pkg_resources.require("%(name)s==%(version)s") # this exact version - pkg_resources.require("%(name)s>=%(version)s") # this version or higher -""" - if self.install_dir not in map(normalize_path,sys.path): - msg += """ - -Note also that the installation directory must be on sys.path at runtime for -this to work. (e.g. by being the application's script directory, by being on -PYTHONPATH, or by being added to sys.path by your code.) -""" eggloc = dist.location name = dist.project_name version = dist.version - extras = '' # TODO: self.report_extras(req, dist) + extras = '' # TODO: self.report_extras(req, dist) return msg % locals() + __editable_msg = textwrap.dedent(""" + Extracted editable version of %(spec)s to %(dirname)s + + If it uses setuptools in its setup script, you can activate it in + "development" mode by going to that directory and running:: + + %(python)s setup.py develop + + See the setuptools documentation for the "develop" command for more info. + """).lstrip() + def report_editable(self, spec, setup_script): dirname = os.path.dirname(setup_script) python = sys.executable - return """\nExtracted editable version of %(spec)s to %(dirname)s - -If it uses setuptools in its setup script, you can activate it in -"development" mode by going to that directory and running:: - - %(python)s setup.py develop - -See the setuptools documentation for the "develop" command for more info. -""" % locals() + return '\n' + self.__editable_msg % locals() def run_setup(self, setup_script, setup_base, args): sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg) sys.modules.setdefault('distutils.command.egg_info', egg_info) args = list(args) - if self.verbose>2: + if self.verbose > 2: v = 'v' * (self.verbose - 1) - args.insert(0,'-'+v) - elif self.verbose<2: - args.insert(0,'-q') + args.insert(0, '-' + v) + elif self.verbose < 2: + args.insert(0, '-q') if self.dry_run: - args.insert(0,'-n') + args.insert(0, '-n') log.info( - "Running %s %s", setup_script[len(setup_base)+1:], ' '.join(args) + "Running %s %s", setup_script[len(setup_base) + 1:], ' '.join(args) ) try: run_setup(setup_script, args) - except SystemExit: - v = sys.exc_info()[1] + except SystemExit as v: raise DistutilsError("Setup script exited with %s" % (v.args[0],)) def build_and_install(self, setup_script, setup_base): @@ -1020,11 +1071,11 @@ See the setuptools documentation for the "develop" command for more info. eggs.append(self.install_egg(dist.location, setup_base)) if not eggs and not self.dry_run: log.warn("No eggs found in %s (setup script problem?)", - dist_dir) + dist_dir) return eggs finally: rmtree(dist_dir) - log.set_verbosity(self.verbose) # restore our log verbosity + log.set_verbosity(self.verbose) # restore our log verbosity def _set_fetcher_options(self, base): """ @@ -1034,7 +1085,7 @@ See the setuptools documentation for the "develop" command for more info. are available to that command as well. """ # find the fetch options from easy_install and write them out - # to the setup.cfg file. + # to the setup.cfg file. ei_opts = self.distribution.get_option_dict('easy_install').copy() fetch_directives = ( 'find_links', 'site_dirs', 'index_url', 'optimize', @@ -1042,7 +1093,8 @@ See the setuptools documentation for the "develop" command for more info. ) fetch_options = {} for key, val in ei_opts.items(): - if key not in fetch_directives: continue + if key not in fetch_directives: + continue fetch_options[key.replace('_', '-')] = val[1] # create a settings dictionary suitable for `edit_config` settings = dict(easy_install=fetch_options) @@ -1053,7 +1105,7 @@ See the setuptools documentation for the "develop" command for more info. if self.pth_file is None: return - for d in self.pth_file[dist.key]: # drop old entries + for d in self.pth_file[dist.key]: # drop old entries if self.multi_version or d.location != dist.location: log.info("Removing %s from easy-install.pth file", d) self.pth_file.remove(d) @@ -1068,7 +1120,7 @@ See the setuptools documentation for the "develop" command for more info. ) else: log.info("Adding %s to easy-install.pth file", dist) - self.pth_file.add(dist) # add new entry + self.pth_file.add(dist) # add new entry if dist.location not in self.shadow_path: self.shadow_path.append(dist.location) @@ -1076,19 +1128,20 @@ See the setuptools documentation for the "develop" command for more info. self.pth_file.save() - if dist.key=='setuptools': + if dist.key == 'setuptools': # Ensure that setuptools itself never becomes unavailable! # XXX should this check for latest version? - filename = os.path.join(self.install_dir,'setuptools.pth') - if os.path.islink(filename): os.unlink(filename) + filename = os.path.join(self.install_dir, 'setuptools.pth') + if os.path.islink(filename): + os.unlink(filename) f = open(filename, 'wt') - f.write(self.pth_file.make_relative(dist.location)+'\n') + f.write(self.pth_file.make_relative(dist.location) + '\n') f.close() def unpack_progress(self, src, dst): # Progress filter for unpacking log.debug("Unpacking %s to %s", src, dst) - return dst # only unpack-and-compile skips files for dry run + return dst # only unpack-and-compile skips files for dry run def unpack_and_compile(self, egg_path, destination): to_compile = [] @@ -1099,22 +1152,23 @@ See the setuptools documentation for the "develop" command for more info. to_compile.append(dst) elif dst.endswith('.dll') or dst.endswith('.so'): to_chmod.append(dst) - self.unpack_progress(src,dst) + self.unpack_progress(src, dst) return not self.dry_run and dst or None unpack_archive(egg_path, destination, pf) self.byte_compile(to_compile) if not self.dry_run: for f in to_chmod: - mode = ((os.stat(f)[stat.ST_MODE]) | 0x16D) & 0xFED # 0555, 07755 + mode = ((os.stat(f)[stat.ST_MODE]) | 0o555) & 0o7755 chmod(f, mode) def byte_compile(self, to_compile): - if _dont_write_bytecode: + if sys.dont_write_bytecode: self.warn('byte-compiling is disabled, skipping.') return from distutils.util import byte_compile + try: # try to make the byte compile messages quieter log.set_verbosity(self.verbose - 1) @@ -1126,38 +1180,41 @@ See the setuptools documentation for the "develop" command for more info. dry_run=self.dry_run ) finally: - log.set_verbosity(self.verbose) # restore original verbosity + log.set_verbosity(self.verbose) # restore original verbosity + + __no_default_msg = textwrap.dedent(""" + bad install directory or PYTHONPATH + + You are attempting to install a package to a directory that is not + on PYTHONPATH and which Python does not read ".pth" files from. The + installation directory you specified (via --install-dir, --prefix, or + the distutils default setting) was: + + %s + + and your PYTHONPATH environment variable currently contains: + + %r + + Here are some of your options for correcting the problem: + + * You can choose a different installation directory, i.e., one that is + on PYTHONPATH or supports .pth files + + * You can add the installation directory to the PYTHONPATH environment + variable. (It must then also be on PYTHONPATH whenever you run + Python and want to use the package(s) you are installing.) + + * You can set up the installation directory to support ".pth" files by + using one of the approaches described here: + + https://pythonhosted.org/setuptools/easy_install.html#custom-installation-locations + + Please make the appropriate changes for your system and try again.""").lstrip() def no_default_version_msg(self): - template = """bad install directory or PYTHONPATH - -You are attempting to install a package to a directory that is not -on PYTHONPATH and which Python does not read ".pth" files from. The -installation directory you specified (via --install-dir, --prefix, or -the distutils default setting) was: - - %s - -and your PYTHONPATH environment variable currently contains: - - %r - -Here are some of your options for correcting the problem: - -* You can choose a different installation directory, i.e., one that is - on PYTHONPATH or supports .pth files - -* You can add the installation directory to the PYTHONPATH environment - variable. (It must then also be on PYTHONPATH whenever you run - Python and want to use the package(s) you are installing.) - -* You can set up the installation directory to support ".pth" files by - using one of the approaches described here: - - https://pythonhosted.org/setuptools/easy_install.html#custom-installation-locations - -Please make the appropriate changes for your system and try again.""" - return template % (self.install_dir, os.environ.get('PYTHONPATH','')) + template = self.__no_default_msg + return template % (self.install_dir, os.environ.get('PYTHONPATH', '')) def install_site_py(self): """Make sure there's a site.py in the target dir, if needed""" @@ -1171,10 +1228,10 @@ Please make the appropriate changes for your system and try again.""" if os.path.exists(sitepy): log.debug("Checking existing site.py in %s", self.install_dir) - f = open(sitepy,'rb') + f = open(sitepy, 'rb') current = f.read() # we want str, not bytes - if sys.version_info >= (3,): + if PY3: current = current.decode() f.close() @@ -1188,7 +1245,7 @@ Please make the appropriate changes for your system and try again.""" log.info("Creating %s", sitepy) if not self.dry_run: ensure_directory(sitepy) - f = open(sitepy,'wb') + f = open(sitepy, 'wb') f.write(source) f.close() self.byte_compile([sitepy]) @@ -1202,19 +1259,19 @@ Please make the appropriate changes for your system and try again.""" home = convert_path(os.path.expanduser("~")) for name, path in iteritems(self.config_vars): if path.startswith(home) and not os.path.isdir(path): - self.debug_print("os.makedirs('%s', 0700)" % path) - os.makedirs(path, 0x1C0) # 0700 + self.debug_print("os.makedirs('%s', 0o700)" % path) + os.makedirs(path, 0o700) INSTALL_SCHEMES = dict( - posix = dict( - install_dir = '$base/lib/python$py_version_short/site-packages', - script_dir = '$base/bin', + posix=dict( + install_dir='$base/lib/python$py_version_short/site-packages', + script_dir='$base/bin', ), ) DEFAULT_SCHEME = dict( - install_dir = '$base/Lib/site-packages', - script_dir = '$base/Scripts', + install_dir='$base/Lib/site-packages', + script_dir='$base/Scripts', ) def _expand(self, *attrs): @@ -1224,12 +1281,13 @@ Please make the appropriate changes for your system and try again.""" # Set default install_dir/scripts from --prefix config_vars = config_vars.copy() config_vars['base'] = self.prefix - scheme = self.INSTALL_SCHEMES.get(os.name,self.DEFAULT_SCHEME) - for attr,val in scheme.items(): - if getattr(self,attr,None) is None: - setattr(self,attr,val) + scheme = self.INSTALL_SCHEMES.get(os.name, self.DEFAULT_SCHEME) + for attr, val in scheme.items(): + if getattr(self, attr, None) is None: + setattr(self, attr, val) from distutils.util import subst_vars + for attr in attrs: val = getattr(self, attr) if val is not None: @@ -1238,6 +1296,7 @@ Please make the appropriate changes for your system and try again.""" val = os.path.expanduser(val) setattr(self, attr, val) + def get_site_dirs(): # return a list of 'site' dirs sitedirs = [_f for _f in os.environ.get('PYTHONPATH', @@ -1251,10 +1310,10 @@ def get_site_dirs(): sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) elif os.sep == '/': sitedirs.extend([os.path.join(prefix, - "lib", - "python" + sys.version[:3], - "site-packages"), - os.path.join(prefix, "lib", "site-python")]) + "lib", + "python" + sys.version[:3], + "site-packages"), + os.path.join(prefix, "lib", "site-python")]) else: sitedirs.extend( [prefix, os.path.join(prefix, "lib", "site-packages")] @@ -1274,7 +1333,8 @@ def get_site_dirs(): 'site-packages')) lib_paths = get_path('purelib'), get_path('platlib') for site_lib in lib_paths: - if site_lib not in sitedirs: sitedirs.append(site_lib) + if site_lib not in sitedirs: + sitedirs.append(site_lib) if site.ENABLE_USER_SITE: sitedirs.append(site.USER_SITE) @@ -1305,12 +1365,12 @@ def expand_paths(inputs): if not name.endswith('.pth'): # We only care about the .pth files continue - if name in ('easy-install.pth','setuptools.pth'): + if name in ('easy-install.pth', 'setuptools.pth'): # Ignore .pth files that we control continue # Read the .pth file - f = open(os.path.join(dirname,name)) + f = open(os.path.join(dirname, name)) lines = list(yield_lines(f)) f.close() @@ -1330,7 +1390,7 @@ def extract_wininst_cfg(dist_filename): Returns a ConfigParser.RawConfigParser, or None """ - f = open(dist_filename,'rb') + f = open(dist_filename, 'rb') try: endrec = zipfile._EndRecData(f) if endrec is None: @@ -1339,21 +1399,23 @@ def extract_wininst_cfg(dist_filename): prepended = (endrec[9] - endrec[5]) - endrec[6] if prepended < 12: # no wininst data here return None - f.seek(prepended-12) + f.seek(prepended - 12) from setuptools.compat import StringIO, ConfigParser import struct - tag, cfglen, bmlen = struct.unpack("<iii",f.read(12)) - if tag not in (0x1234567A, 0x1234567B): - return None # not a valid tag - f.seek(prepended-(12+cfglen)) - cfg = ConfigParser.RawConfigParser({'version':'','target_version':''}) + tag, cfglen, bmlen = struct.unpack("<iii", f.read(12)) + if tag not in (0x1234567A, 0x1234567B): + return None # not a valid tag + + f.seek(prepended - (12 + cfglen)) + cfg = ConfigParser.RawConfigParser( + {'version': '', 'target_version': ''}) try: part = f.read(cfglen) # part is in bytes, but we need to read up to the first null - # byte. - if sys.version_info >= (2,6): + # byte. + if sys.version_info >= (2, 6): null_byte = bytes([0]) else: null_byte = chr(0) @@ -1386,25 +1448,25 @@ def get_exe_prefixes(exe_filename): for info in z.infolist(): name = info.filename parts = name.split('/') - if len(parts)==3 and parts[2]=='PKG-INFO': + if len(parts) == 3 and parts[2] == 'PKG-INFO': if parts[1].endswith('.egg-info'): - prefixes.insert(0,('/'.join(parts[:2]), 'EGG-INFO/')) + prefixes.insert(0, ('/'.join(parts[:2]), 'EGG-INFO/')) break if len(parts) != 2 or not name.endswith('.pth'): continue if name.endswith('-nspkg.pth'): continue - if parts[0].upper() in ('PURELIB','PLATLIB'): + if parts[0].upper() in ('PURELIB', 'PLATLIB'): contents = z.read(name) - if sys.version_info >= (3,): + if PY3: contents = contents.decode() for pth in yield_lines(contents): - pth = pth.strip().replace('\\','/') + pth = pth.strip().replace('\\', '/') if not pth.startswith('import'): - prefixes.append((('%s/%s/' % (parts[0],pth)), '')) + prefixes.append((('%s/%s/' % (parts[0], pth)), '')) finally: z.close() - prefixes = [(x.lower(),y) for x, y in prefixes] + prefixes = [(x.lower(), y) for x, y in prefixes] prefixes.sort() prefixes.reverse() return prefixes @@ -1418,6 +1480,7 @@ def parse_requirement_arg(spec): "Not a URL, existing file, or requirement spec: %r" % (spec,) ) + class PthDistributions(Environment): """A .pth file with Distribution paths in it""" @@ -1437,7 +1500,7 @@ class PthDistributions(Environment): saw_import = False seen = dict.fromkeys(self.sitedirs) if os.path.isfile(self.filename): - f = open(self.filename,'rt') + f = open(self.filename, 'rt') for line in f: if line.startswith('import'): saw_import = True @@ -1449,17 +1512,17 @@ class PthDistributions(Environment): # skip non-existent paths, in case somebody deleted a package # manually, and duplicate paths as well path = self.paths[-1] = normalize_path( - os.path.join(self.basedir,path) + os.path.join(self.basedir, path) ) if not os.path.exists(path) or path in seen: - self.paths.pop() # skip it - self.dirty = True # we cleaned up, so we're dirty now :) + self.paths.pop() # skip it + self.dirty = True # we cleaned up, so we're dirty now :) continue seen[path] = 1 f.close() if self.paths and not saw_import: - self.dirty = True # ensure anything we touch has import wrappers + self.dirty = True # ensure anything we touch has import wrappers while self.paths and not self.paths[-1].strip(): self.paths.pop() @@ -1468,7 +1531,7 @@ class PthDistributions(Environment): if not self.dirty: return - data = '\n'.join(map(self.make_relative,self.paths)) + data = '\n'.join(map(self.make_relative, self.paths)) if data: log.debug("Saving %s", self.filename) data = ( @@ -1482,7 +1545,7 @@ class PthDistributions(Environment): if os.path.islink(self.filename): os.unlink(self.filename) - f = open(self.filename,'wt') + f = open(self.filename, 'wt') f.write(data) f.close() @@ -1494,10 +1557,14 @@ class PthDistributions(Environment): def add(self, dist): """Add `dist` to the distribution map""" - if (dist.location not in self.paths and ( + new_path = ( + dist.location not in self.paths and ( dist.location not in self.sitedirs or - dist.location == os.getcwd() # account for '.' being in PYTHONPATH - )): + # account for '.' being in PYTHONPATH + dist.location == os.getcwd() + ) + ) + if new_path: self.paths.append(dist.location) self.dirty = True Environment.add(self, dist) @@ -1509,13 +1576,13 @@ class PthDistributions(Environment): self.dirty = True Environment.remove(self, dist) - def make_relative(self,path): + def make_relative(self, path): npath, last = os.path.split(normalize_path(path)) baselen = len(self.basedir) parts = [last] - sep = os.altsep=='/' and '/' or os.sep - while len(npath)>=baselen: - if npath==self.basedir: + sep = os.altsep == '/' and '/' or os.sep + while len(npath) >= baselen: + if npath == self.basedir: parts.append(os.curdir) parts.reverse() return sep.join(parts) @@ -1524,59 +1591,203 @@ class PthDistributions(Environment): else: return path -def get_script_header(script_text, executable=sys_executable, wininst=False): - """Create a #! line, getting options (if any) from script_text""" - from distutils.command.build_scripts import first_line_re + +def _first_line_re(): + """ + Return a regular expression based on first_line_re suitable for matching + strings. + """ + if isinstance(first_line_re.pattern, str): + return first_line_re # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern. - if not isinstance(first_line_re.pattern, str): - first_line_re = re.compile(first_line_re.pattern.decode()) + return re.compile(first_line_re.pattern.decode()) - first = (script_text+'\n').splitlines()[0] - match = first_line_re.match(first) - options = '' - if match: - options = match.group(1) or '' - if options: options = ' '+options - if wininst: - executable = "python.exe" - else: - executable = nt_quote_arg(executable) - hdr = "#!%(executable)s%(options)s\n" % locals() - if not isascii(hdr): - # Non-ascii path to sys.executable, use -x to prevent warnings - if options: - if options.strip().startswith('-'): - options = ' -x'+options.strip()[1:] - # else: punt, we can't do it, let the warning happen anyway - else: - options = ' -x' - executable = fix_jython_executable(executable, options) - hdr = "#!%(executable)s%(options)s\n" % locals() - return hdr def auto_chmod(func, arg, exc): - if func is os.remove and os.name=='nt': + if func is os.remove and os.name == 'nt': chmod(arg, stat.S_IWRITE) return func(arg) et, ev, _ = sys.exc_info() - reraise(et, (ev[0], ev[1] + (" %s %s" % (func,arg)))) + reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg)))) -def uncache_zipdir(path): - """Ensure that the importer caches dont have stale info for `path`""" - from zipimport import _zip_directory_cache as zdc - _uncache(path, zdc) - _uncache(path, sys.path_importer_cache) -def _uncache(path, cache): - if path in cache: - del cache[path] +def update_dist_caches(dist_path, fix_zipimporter_caches): + """ + Fix any globally cached `dist_path` related data + + `dist_path` should be a path of a newly installed egg distribution (zipped + or unzipped). + + sys.path_importer_cache contains finder objects that have been cached when + importing data from the original distribution. Any such finders need to be + cleared since the replacement distribution might be packaged differently, + e.g. a zipped egg distribution might get replaced with an unzipped egg + folder or vice versa. Having the old finders cached may then cause Python + to attempt loading modules from the replacement distribution using an + incorrect loader. + + zipimport.zipimporter objects are Python loaders charged with importing + data packaged inside zip archives. If stale loaders referencing the + original distribution, are left behind, they can fail to load modules from + the replacement distribution. E.g. if an old zipimport.zipimporter instance + is used to load data from a new zipped egg archive, it may cause the + operation to attempt to locate the requested data in the wrong location - + one indicated by the original distribution's zip archive directory + information. Such an operation may then fail outright, e.g. report having + read a 'bad local file header', or even worse, it may fail silently & + return invalid data. + + zipimport._zip_directory_cache contains cached zip archive directory + information for all existing zipimport.zipimporter instances and all such + instances connected to the same archive share the same cached directory + information. + + If asked, and the underlying Python implementation allows it, we can fix + all existing zipimport.zipimporter instances instead of having to track + them down and remove them one by one, by updating their shared cached zip + archive directory information. This, of course, assumes that the + replacement distribution is packaged as a zipped egg. + + If not asked to fix existing zipimport.zipimporter instances, we still do + our best to clear any remaining zipimport.zipimporter related cached data + that might somehow later get used when attempting to load data from the new + distribution and thus cause such load operations to fail. Note that when + tracking down such remaining stale data, we can not catch every conceivable + usage from here, and we clear only those that we know of and have found to + cause problems if left alive. Any remaining caches should be updated by + whomever is in charge of maintaining them, i.e. they should be ready to + handle us replacing their zip archives with new distributions at runtime. + + """ + # There are several other known sources of stale zipimport.zipimporter + # instances that we do not clear here, but might if ever given a reason to + # do so: + # * Global setuptools pkg_resources.working_set (a.k.a. 'master working + # set') may contain distributions which may in turn contain their + # zipimport.zipimporter loaders. + # * Several zipimport.zipimporter loaders held by local variables further + # up the function call stack when running the setuptools installation. + # * Already loaded modules may have their __loader__ attribute set to the + # exact loader instance used when importing them. Python 3.4 docs state + # that this information is intended mostly for introspection and so is + # not expected to cause us problems. + normalized_path = normalize_path(dist_path) + _uncache(normalized_path, sys.path_importer_cache) + if fix_zipimporter_caches: + _replace_zip_directory_cache_data(normalized_path) else: - path = normalize_path(path) - for p in cache: - if normalize_path(p)==path: - del cache[p] - return + # Here, even though we do not want to fix existing and now stale + # zipimporter cache information, we still want to remove it. Related to + # Python's zip archive directory information cache, we clear each of + # its stale entries in two phases: + # 1. Clear the entry so attempting to access zip archive information + # via any existing stale zipimport.zipimporter instances fails. + # 2. Remove the entry from the cache so any newly constructed + # zipimport.zipimporter instances do not end up using old stale + # zip archive directory information. + # This whole stale data removal step does not seem strictly necessary, + # but has been left in because it was done before we started replacing + # the zip archive directory information cache content if possible, and + # there are no relevant unit tests that we can depend on to tell us if + # this is really needed. + _remove_and_clear_zip_directory_cache_data(normalized_path) + + +def _collect_zipimporter_cache_entries(normalized_path, cache): + """ + Return zipimporter cache entry keys related to a given normalized path. + + Alternative path spellings (e.g. those using different character case or + those using alternative path separators) related to the same path are + included. Any sub-path entries are included as well, i.e. those + corresponding to zip archives embedded in other zip archives. + + """ + result = [] + prefix_len = len(normalized_path) + for p in cache: + np = normalize_path(p) + if (np.startswith(normalized_path) and + np[prefix_len:prefix_len + 1] in (os.sep, '')): + result.append(p) + return result + + +def _update_zipimporter_cache(normalized_path, cache, updater=None): + """ + Update zipimporter cache data for a given normalized path. + + Any sub-path entries are processed as well, i.e. those corresponding to zip + archives embedded in other zip archives. + + Given updater is a callable taking a cache entry key and the original entry + (after already removing the entry from the cache), and expected to update + the entry and possibly return a new one to be inserted in its place. + Returning None indicates that the entry should not be replaced with a new + one. If no updater is given, the cache entries are simply removed without + any additional processing, the same as if the updater simply returned None. + + """ + for p in _collect_zipimporter_cache_entries(normalized_path, cache): + # N.B. pypy's custom zipimport._zip_directory_cache implementation does + # not support the complete dict interface: + # * Does not support item assignment, thus not allowing this function + # to be used only for removing existing cache entries. + # * Does not support the dict.pop() method, forcing us to use the + # get/del patterns instead. For more detailed information see the + # following links: + # https://bitbucket.org/pypa/setuptools/issue/202/more-robust-zipimporter-cache-invalidation#comment-10495960 + # https://bitbucket.org/pypy/pypy/src/dd07756a34a41f674c0cacfbc8ae1d4cc9ea2ae4/pypy/module/zipimport/interp_zipimport.py#cl-99 + old_entry = cache[p] + del cache[p] + new_entry = updater and updater(p, old_entry) + if new_entry is not None: + cache[p] = new_entry + + +def _uncache(normalized_path, cache): + _update_zipimporter_cache(normalized_path, cache) + + +def _remove_and_clear_zip_directory_cache_data(normalized_path): + def clear_and_remove_cached_zip_archive_directory_data(path, old_entry): + old_entry.clear() + + _update_zipimporter_cache( + normalized_path, zipimport._zip_directory_cache, + updater=clear_and_remove_cached_zip_archive_directory_data) + +# PyPy Python implementation does not allow directly writing to the +# zipimport._zip_directory_cache and so prevents us from attempting to correct +# its content. The best we can do there is clear the problematic cache content +# and have PyPy repopulate it as needed. The downside is that if there are any +# stale zipimport.zipimporter instances laying around, attempting to use them +# will fail due to not having its zip archive directory information available +# instead of being automatically corrected to use the new correct zip archive +# directory information. +if '__pypy__' in sys.builtin_module_names: + _replace_zip_directory_cache_data = \ + _remove_and_clear_zip_directory_cache_data +else: + def _replace_zip_directory_cache_data(normalized_path): + def replace_cached_zip_archive_directory_data(path, old_entry): + # N.B. In theory, we could load the zip directory information just + # once for all updated path spellings, and then copy it locally and + # update its contained path strings to contain the correct + # spelling, but that seems like a way too invasive move (this cache + # structure is not officially documented anywhere and could in + # theory change with new Python releases) for no significant + # benefit. + old_entry.clear() + zipimport.zipimporter(path) + old_entry.update(zipimport._zip_directory_cache[path]) + return old_entry + + _update_zipimporter_cache( + normalized_path, zipimport._zip_directory_cache, + updater=replace_cached_zip_archive_directory_data) + def is_python(text, filename='<string>'): "Is this string a valid Python script?" @@ -1587,94 +1798,181 @@ def is_python(text, filename='<string>'): else: return True + def is_sh(executable): """Determine if the specified executable is a .sh (contains a #! line)""" try: - fp = open(executable) - magic = fp.read(2) - fp.close() - except (OSError,IOError): return executable + with io.open(executable, encoding='latin-1') as fp: + magic = fp.read(2) + except (OSError, IOError): + return executable return magic == '#!' + def nt_quote_arg(arg): """Quote a command line argument according to Windows parsing rules""" + return subprocess.list2cmdline([arg]) - result = [] - needquote = False - nb = 0 - - needquote = (" " in arg) or ("\t" in arg) - if needquote: - result.append('"') - - for c in arg: - if c == '\\': - nb += 1 - elif c == '"': - # double preceding backslashes, then add a \" - result.append('\\' * (nb*2) + '\\"') - nb = 0 - else: - if nb: - result.append('\\' * nb) - nb = 0 - result.append(c) - - if nb: - result.append('\\' * nb) - - if needquote: - result.append('\\' * nb) # double the trailing backslashes - result.append('"') - - return ''.join(result) def is_python_script(script_text, filename): """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc. """ if filename.endswith('.py') or filename.endswith('.pyw'): - return True # extension says it's Python + return True # extension says it's Python if is_python(script_text, filename): - return True # it's syntactically valid Python + return True # it's syntactically valid Python if script_text.startswith('#!'): # It begins with a '#!' line, so check if 'python' is in it somewhere return 'python' in script_text.splitlines()[0].lower() - return False # Not any Python I can recognize + return False # Not any Python I can recognize + try: from os import chmod as _chmod except ImportError: # Jython compatibility - def _chmod(*args): pass + def _chmod(*args): + pass + def chmod(path, mode): log.debug("changing mode of %s to %o", path, mode) try: _chmod(path, mode) - except os.error: - e = sys.exc_info()[1] + except os.error as e: log.debug("chmod failed: %s", e) -def fix_jython_executable(executable, options): - if sys.platform.startswith('java') and is_sh(executable): - # Workaround for Jython is not needed on Linux systems. - import java - if java.lang.System.getProperty("os.name") == "Linux": - return executable - # Workaround Jython's sys.executable being a .sh (an invalid - # shebang line interpreter) - if options: +def fix_jython_executable(executable, options): + warnings.warn("Use JythonCommandSpec", DeprecationWarning, stacklevel=2) + + if not JythonCommandSpec.relevant(): + return executable + + cmd = CommandSpec.best().from_param(executable) + cmd.install_options(options) + return cmd.as_header().lstrip('#!').rstrip('\n') + + +class CommandSpec(list): + """ + A command spec for a #! header, specified as a list of arguments akin to + those passed to Popen. + """ + + options = [] + split_args = dict() + + @classmethod + def best(cls): + """ + Choose the best CommandSpec class based on environmental conditions. + """ + return cls if not JythonCommandSpec.relevant() else JythonCommandSpec + + @classmethod + def _sys_executable(cls): + _default = os.path.normpath(sys.executable) + return os.environ.get('__PYVENV_LAUNCHER__', _default) + + @classmethod + def from_param(cls, param): + """ + Construct a CommandSpec from a parameter to build_scripts, which may + be None. + """ + if isinstance(param, cls): + return param + if isinstance(param, list): + return cls(param) + if param is None: + return cls.from_environment() + # otherwise, assume it's a string. + return cls.from_string(param) + + @classmethod + def from_environment(cls): + return cls([cls._sys_executable()]) + + @classmethod + def from_string(cls, string): + """ + Construct a command spec from a simple string representing a command + line parseable by shlex.split. + """ + items = shlex.split(string, **cls.split_args) + return cls(items) + + def install_options(self, script_text): + self.options = shlex.split(self._extract_options(script_text)) + cmdline = subprocess.list2cmdline(self) + if not isascii(cmdline): + self.options[:0] = ['-x'] + + @staticmethod + def _extract_options(orig_script): + """ + Extract any options from the first line of the script. + """ + first = (orig_script + '\n').splitlines()[0] + match = _first_line_re().match(first) + options = match.group(1) or '' if match else '' + return options.strip() + + def as_header(self): + return self._render(self + list(self.options)) + + @staticmethod + def _render(items): + cmdline = subprocess.list2cmdline(items) + return '#!' + cmdline + '\n' + +# For pbr compat; will be removed in a future version. +sys_executable = CommandSpec._sys_executable() + + +class WindowsCommandSpec(CommandSpec): + split_args = dict(posix=False) + + +class JythonCommandSpec(CommandSpec): + @classmethod + def relevant(cls): + return ( + sys.platform.startswith('java') + and + __import__('java').lang.System.getProperty('os.name') != 'Linux' + ) + + @classmethod + def from_environment(cls): + string = '"' + cls._sys_executable() + '"' + return cls.from_string(string) + + @classmethod + def from_string(cls, string): + return cls([string]) + + def as_header(self): + """ + Workaround Jython's sys.executable being a .sh (an invalid + shebang line interpreter) + """ + if not is_sh(self[0]): + return super(JythonCommandSpec, self).as_header() + + if self.options: # Can't apply the workaround, leave it broken log.warn( "WARNING: Unable to adapt shebang line for Jython," " the following script is NOT executable\n" " see http://bugs.jython.org/issue1112 for" " more information.") - else: - return '/usr/bin/env %s' % executable - return executable + return super(JythonCommandSpec, self).as_header() + + items = ['/usr/bin/env'] + self + list(self.options) + return self._render(items) class ScriptWriter(object): @@ -1695,39 +1993,81 @@ class ScriptWriter(object): ) """).lstrip() + command_spec_class = CommandSpec + @classmethod - def get_script_args(cls, dist, executable=sys_executable, wininst=False): + def get_script_args(cls, dist, executable=None, wininst=False): + # for backward compatibility + warnings.warn("Use get_args", DeprecationWarning) + writer = (WindowsScriptWriter if wininst else ScriptWriter).best() + header = cls.get_script_header("", executable, wininst) + return writer.get_args(dist, header) + + @classmethod + def get_script_header(cls, script_text, executable=None, wininst=False): + # for backward compatibility + warnings.warn("Use get_header", DeprecationWarning) + if wininst: + executable = "python.exe" + cmd = cls.command_spec_class.best().from_param(executable) + cmd.install_options(script_text) + return cmd.as_header() + + @classmethod + def get_args(cls, dist, header=None): """ Yield write_script() argument tuples for a distribution's entrypoints """ - gen_class = cls.get_writer(wininst) + if header is None: + header = cls.get_header() spec = str(dist.as_requirement()) - header = get_script_header("", executable, wininst) for type_ in 'console', 'gui': group = type_ + '_scripts' for name, ep in dist.get_entry_map(group).items(): - script_text = gen_class.template % locals() - for res in gen_class._get_script_args(type_, name, header, + script_text = cls.template % locals() + for res in cls._get_script_args(type_, name, header, script_text): yield res @classmethod def get_writer(cls, force_windows): - if force_windows or sys.platform=='win32': - return WindowsScriptWriter.get_writer() - return cls + # for backward compatibility + warnings.warn("Use best", DeprecationWarning) + return WindowsScriptWriter.best() if force_windows else cls.best() + + @classmethod + def best(cls): + """ + Select the best ScriptWriter for this environment. + """ + return WindowsScriptWriter.best() if sys.platform == 'win32' else cls @classmethod def _get_script_args(cls, type_, name, header, script_text): # Simply write the stub with no extension. - yield (name, header+script_text) + yield (name, header + script_text) + + @classmethod + def get_header(cls, script_text="", executable=None): + """Create a #! line, getting options (if any) from script_text""" + cmd = cls.command_spec_class.best().from_param(executable) + cmd.install_options(script_text) + return cmd.as_header() class WindowsScriptWriter(ScriptWriter): + command_spec_class = WindowsCommandSpec + @classmethod def get_writer(cls): + # for backward compatibility + warnings.warn("Use best", DeprecationWarning) + return cls.best() + + @classmethod + def best(cls): """ - Get a script writer suitable for Windows + Select the best ScriptWriter suitable for Windows """ writer_lookup = dict( executable=WindowsExecutableLauncherWriter, @@ -1743,12 +2083,12 @@ class WindowsScriptWriter(ScriptWriter): ext = dict(console='.pya', gui='.pyw')[type_] if ext not in os.environ['PATHEXT'].lower().split(';'): warnings.warn("%s not listed in PATHEXT; scripts will not be " - "recognized as executables." % ext, UserWarning) + "recognized as executables." % ext, UserWarning) old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe'] old.remove(ext) header = cls._adjust_header(type_, header) - blockers = [name+x for x in old] - yield name+ext, header+script_text, 't', blockers + blockers = [name + x for x in old] + yield name + ext, header + script_text, 't', blockers @staticmethod def _adjust_header(type_, orig_header): @@ -1775,32 +2115,35 @@ class WindowsExecutableLauncherWriter(WindowsScriptWriter): """ For Windows, add a .py extension and an .exe launcher """ - if type_=='gui': + if type_ == 'gui': launcher_type = 'gui' ext = '-script.pyw' old = ['.pyw'] else: launcher_type = 'cli' ext = '-script.py' - old = ['.py','.pyc','.pyo'] + old = ['.py', '.pyc', '.pyo'] hdr = cls._adjust_header(type_, header) - blockers = [name+x for x in old] - yield (name+ext, hdr+script_text, 't', blockers) + blockers = [name + x for x in old] + yield (name + ext, hdr + script_text, 't', blockers) yield ( - name+'.exe', get_win_launcher(launcher_type), - 'b' # write in binary mode + name + '.exe', get_win_launcher(launcher_type), + 'b' # write in binary mode ) if not is_64bit(): # install a manifest for the launcher to prevent Windows - # from detecting it as an installer (which it will for + # from detecting it as an installer (which it will for # launchers like easy_install.exe). Consider only # adding a manifest for launchers detected as installers. # See Distribute #143 for details. m_name = name + '.exe.manifest' yield (m_name, load_launcher_manifest(name), 't') + # for backward-compatibility get_script_args = ScriptWriter.get_script_args +get_script_header = ScriptWriter.get_script_header + def get_win_launcher(type): """ @@ -1811,7 +2154,7 @@ def get_win_launcher(type): Returns the executable as a byte string. """ launcher_fn = '%s.exe' % type - if platform.machine().lower()=='arm': + if platform.machine().lower() == 'arm': launcher_fn = launcher_fn.replace(".", "-arm.") if is_64bit(): launcher_fn = launcher_fn.replace(".", "-64.") @@ -1819,13 +2162,15 @@ def get_win_launcher(type): launcher_fn = launcher_fn.replace(".", "-32.") return resource_string('setuptools', launcher_fn) + def load_launcher_manifest(name): manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml') - if sys.version_info[0] < 3: + if PY2: return manifest % vars() else: return manifest.decode('utf-8') % vars() + def rmtree(path, ignore_errors=False, onerror=auto_chmod): """Recursively delete a directory tree. @@ -1861,55 +2206,61 @@ def rmtree(path, ignore_errors=False, onerror=auto_chmod): except os.error: onerror(os.rmdir, path, sys.exc_info()) + def current_umask(): - tmp = os.umask(0x12) # 022 + tmp = os.umask(0o022) os.umask(tmp) return tmp + def bootstrap(): # This function is called when setuptools*.egg is run using /bin/sh import setuptools + argv0 = os.path.dirname(setuptools.__path__[0]) sys.argv[0] = argv0 sys.argv.append(argv0) main() + def main(argv=None, **kw): from setuptools import setup from setuptools.dist import Distribution - import distutils.core - USAGE = """\ -usage: %(script)s [options] requirement_or_url ... - or: %(script)s --help -""" + class DistributionWithoutHelpCommands(Distribution): + common_usage = "" + + def _show_help(self, *args, **kw): + with _patch_usage(): + Distribution._show_help(self, *args, **kw) + + if argv is None: + argv = sys.argv[1:] + + with _patch_usage(): + setup( + script_args=['-q', 'easy_install', '-v'] + argv, + script_name=sys.argv[0] or 'easy_install', + distclass=DistributionWithoutHelpCommands, **kw + ) + + +@contextlib.contextmanager +def _patch_usage(): + import distutils.core + USAGE = textwrap.dedent(""" + usage: %(script)s [options] requirement_or_url ... + or: %(script)s --help + """).lstrip() def gen_usage(script_name): return USAGE % dict( script=os.path.basename(script_name), ) - def with_ei_usage(f): - old_gen_usage = distutils.core.gen_usage - try: - distutils.core.gen_usage = gen_usage - return f() - finally: - distutils.core.gen_usage = old_gen_usage - - class DistributionWithoutHelpCommands(Distribution): - common_usage = "" - - def _show_help(self,*args,**kw): - with_ei_usage(lambda: Distribution._show_help(self,*args,**kw)) - - if argv is None: - argv = sys.argv[1:] - - with_ei_usage(lambda: - setup( - script_args = ['-q','easy_install', '-v']+argv, - script_name = sys.argv[0] or 'easy_install', - distclass=DistributionWithoutHelpCommands, **kw - ) - ) + saved = distutils.core.gen_usage + distutils.core.gen_usage = gen_usage + try: + yield + finally: + distutils.core.gen_usage = saved diff --git a/awx/lib/site-packages/setuptools/command/egg_info.py b/awx/lib/site-packages/setuptools/command/egg_info.py index 5953aad4f6..a9940677ea 100644 --- a/awx/lib/site-packages/setuptools/command/egg_info.py +++ b/awx/lib/site-packages/setuptools/command/egg_info.py @@ -2,22 +2,30 @@ Create a distribution's .egg-info directory and contents""" +from distutils.filelist import FileList as _FileList +from distutils.util import convert_path +from distutils import log +import distutils.errors +import distutils.filelist import os import re import sys -from setuptools import Command -import distutils.errors -from distutils import log -from setuptools.command.sdist import sdist -from setuptools.compat import basestring -from setuptools import svn_utils -from distutils.util import convert_path -from distutils.filelist import FileList as _FileList -from pkg_resources import (parse_requirements, safe_name, parse_version, - safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename) -from setuptools.command.sdist import walk_revctrl +try: + from setuptools_svn import svn_utils +except ImportError: + pass +from setuptools import Command +from setuptools.command.sdist import sdist +from setuptools.compat import basestring, PY3, StringIO +from setuptools.command.sdist import walk_revctrl +from pkg_resources import ( + parse_requirements, safe_name, parse_version, + safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename) +import setuptools.unicode_utils as unicode_utils + +from pkg_resources import packaging class egg_info(Command): description = "create a distribution's .egg-info directory" @@ -26,11 +34,11 @@ class egg_info(Command): ('egg-base=', 'e', "directory containing .egg-info directories" " (default: top of the source tree)"), ('tag-svn-revision', 'r', - "Add subversion revision ID to version number"), + "Add subversion revision ID to version number"), ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"), ('tag-build=', 'b', "Specify explicit tag to add to version number"), ('no-svn-revision', 'R', - "Don't add subversion revision ID [default]"), + "Don't add subversion revision ID [default]"), ('no-date', 'D', "Don't include date stamp [default]"), ] @@ -51,6 +59,7 @@ class egg_info(Command): def save_version_info(self, filename): from setuptools.command.setopt import edit_config + values = dict( egg_info=dict( tag_svn_revision=0, @@ -65,25 +74,32 @@ class egg_info(Command): self.vtags = self.tags() self.egg_version = self.tagged_version() + parsed_version = parse_version(self.egg_version) + try: + is_version = isinstance(parsed_version, packaging.version.Version) + spec = ( + "%s==%s" if is_version else "%s===%s" + ) list( - parse_requirements('%s==%s' % (self.egg_name,self.egg_version)) + parse_requirements(spec % (self.egg_name, self.egg_version)) ) except ValueError: raise distutils.errors.DistutilsOptionError( "Invalid distribution name or version syntax: %s-%s" % - (self.egg_name,self.egg_version) + (self.egg_name, self.egg_version) ) if self.egg_base is None: dirs = self.distribution.package_dir - self.egg_base = (dirs or {}).get('',os.curdir) + self.egg_base = (dirs or {}).get('', os.curdir) self.ensure_dirname('egg_base') - self.egg_info = to_filename(self.egg_name)+'.egg-info' + self.egg_info = to_filename(self.egg_name) + '.egg-info' if self.egg_base != os.curdir: self.egg_info = os.path.join(self.egg_base, self.egg_info) - if '-' in self.egg_name: self.check_broken_egg_info() + if '-' in self.egg_name: + self.check_broken_egg_info() # Set package version for the benefit of dumber commands # (e.g. sdist, bdist_wininst, etc.) @@ -95,7 +111,7 @@ class egg_info(Command): # to the version info # pd = self.distribution._patched_dist - if pd is not None and pd.key==self.egg_name.lower(): + if pd is not None and pd.key == self.egg_name.lower(): pd._version = self.egg_version pd._parsed_version = parse_version(self.egg_version) self.distribution._patched_dist = None @@ -127,7 +143,7 @@ class egg_info(Command): to the file. """ log.info("writing %s to %s", what, filename) - if sys.version_info >= (3,): + if PY3: data = data.encode("utf-8") if not self.dry_run: f = open(filename, 'wb') @@ -153,7 +169,7 @@ class egg_info(Command): installer = self.distribution.fetch_build_egg for ep in iter_entry_points('egg_info.writers'): writer = ep.load(installer=installer) - writer(self, ep.name, os.path.join(self.egg_info,ep.name)) + writer(self, ep.name, os.path.join(self.egg_info, ep.name)) # Get rid of native_libs.txt if it was put there by older bdist_egg nl = os.path.join(self.egg_info, "native_libs.txt") @@ -165,68 +181,96 @@ class egg_info(Command): def tags(self): version = '' if self.tag_build: - version+=self.tag_build - if self.tag_svn_revision and ( - os.path.exists('.svn') or os.path.exists('PKG-INFO') - ): version += '-r%s' % self.get_svn_revision() + version += self.tag_build + if self.tag_svn_revision: + rev = self.get_svn_revision() + if rev: # is 0 if it's not an svn working copy + version += '-r%s' % rev if self.tag_date: import time + version += time.strftime("-%Y%m%d") return version @staticmethod def get_svn_revision(): + if 'svn_utils' not in globals(): + return "0" return str(svn_utils.SvnInfo.load(os.curdir).get_revision()) def find_sources(self): """Generate SOURCES.txt manifest file""" - manifest_filename = os.path.join(self.egg_info,"SOURCES.txt") + manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") mm = manifest_maker(self.distribution) mm.manifest = manifest_filename mm.run() self.filelist = mm.filelist def check_broken_egg_info(self): - bei = self.egg_name+'.egg-info' + bei = self.egg_name + '.egg-info' if self.egg_base != os.curdir: bei = os.path.join(self.egg_base, bei) if os.path.exists(bei): log.warn( - "-"*78+'\n' + "-" * 78 + '\n' "Note: Your current .egg-info directory has a '-' in its name;" '\nthis will not work correctly with "setup.py develop".\n\n' - 'Please rename %s to %s to correct this problem.\n'+'-'*78, + 'Please rename %s to %s to correct this problem.\n' + '-' * 78, bei, self.egg_info ) self.broken_egg_info = self.egg_info - self.egg_info = bei # make it work for now + self.egg_info = bei # make it work for now + class FileList(_FileList): """File list that accepts only existing, platform-independent paths""" def append(self, item): - if item.endswith('\r'): # Fix older sdists built on Windows + if item.endswith('\r'): # Fix older sdists built on Windows item = item[:-1] path = convert_path(item) - if sys.version_info >= (3,): - try: - if os.path.exists(path) or os.path.exists(path.encode('utf-8')): - self.files.append(path) - except UnicodeEncodeError: - # Accept UTF-8 filenames even if LANG=C - if os.path.exists(path.encode('utf-8')): - self.files.append(path) - else: - log.warn("'%s' not %s encodable -- skipping", path, - sys.getfilesystemencoding()) - else: - if os.path.exists(path): - self.files.append(path) + if self._safe_path(path): + self.files.append(path) + + def extend(self, paths): + self.files.extend(filter(self._safe_path, paths)) + + def _repair(self): + """ + Replace self.files with only safe paths + + Because some owners of FileList manipulate the underlying + ``files`` attribute directly, this method must be called to + repair those paths. + """ + self.files = list(filter(self._safe_path, self.files)) + + def _safe_path(self, path): + enc_warn = "'%s' not %s encodable -- skipping" + + # To avoid accidental trans-codings errors, first to unicode + u_path = unicode_utils.filesys_decode(path) + if u_path is None: + log.warn("'%s' in unexpected encoding -- skipping" % path) + return False + + # Must ensure utf-8 encodability + utf8_path = unicode_utils.try_encode(u_path, "utf-8") + if utf8_path is None: + log.warn(enc_warn, path, 'utf-8') + return False + + try: + # accept is either way checks out + if os.path.exists(u_path) or os.path.exists(utf8_path): + return True + # this will catch any encode errors decoding u_path + except UnicodeEncodeError: + log.warn(enc_warn, path, sys.getfilesystemencoding()) class manifest_maker(sdist): - template = "MANIFEST.in" def initialize_options(self): @@ -241,7 +285,7 @@ class manifest_maker(sdist): def run(self): self.filelist = FileList() if not os.path.exists(self.manifest): - self.write_manifest() # it must exist so it'll get in the list + self.write_manifest() # it must exist so it'll get in the list self.filelist.findall() self.add_defaults() if os.path.exists(self.template): @@ -251,30 +295,23 @@ class manifest_maker(sdist): self.filelist.remove_duplicates() self.write_manifest() + def _manifest_normalize(self, path): + path = unicode_utils.filesys_decode(path) + return path.replace(os.sep, '/') + def write_manifest(self): - """Write the file list in 'self.filelist' (presumably as filled in - by 'add_defaults()' and 'read_template()') to the manifest file + """ + Write the file list in 'self.filelist' to the manifest file named by 'self.manifest'. """ - # The manifest must be UTF-8 encodable. See #303. - if sys.version_info >= (3,): - files = [] - for file in self.filelist.files: - try: - file.encode("utf-8") - except UnicodeEncodeError: - log.warn("'%s' not UTF-8 encodable -- skipping" % file) - else: - files.append(file) - self.filelist.files = files + self.filelist._repair() - files = self.filelist.files - if os.sep!='/': - files = [f.replace(os.sep,'/') for f in files] - self.execute(write_file, (self.manifest, files), - "writing manifest file '%s'" % self.manifest) + # Now _repairs should encodability, but not unicode + files = [self._manifest_normalize(f) for f in self.filelist.files] + msg = "writing manifest file '%s'" % self.manifest + self.execute(write_file, (self.manifest, files), msg) - def warn(self, msg): # suppress missing-file warnings from sdist + def warn(self, msg): # suppress missing-file warnings from sdist if not msg.startswith("standard file not found:"): sdist.warn(self, msg) @@ -288,15 +325,41 @@ class manifest_maker(sdist): elif os.path.exists(self.manifest): self.read_manifest() ei_cmd = self.get_finalized_command('egg_info') + self._add_egg_info(cmd=ei_cmd) self.filelist.include_pattern("*", prefix=ei_cmd.egg_info) + def _add_egg_info(self, cmd): + """ + Add paths for egg-info files for an external egg-base. + + The egg-info files are written to egg-base. If egg-base is + outside the current working directory, this method + searchs the egg-base directory for files to include + in the manifest. Uses distutils.filelist.findall (which is + really the version monkeypatched in by setuptools/__init__.py) + to perform the search. + + Since findall records relative paths, prefix the returned + paths with cmd.egg_base, so add_default's include_pattern call + (which is looking for the absolute cmd.egg_info) will match + them. + """ + if cmd.egg_base == os.curdir: + # egg-info files were already added by something else + return + + discovered = distutils.filelist.findall(cmd.egg_base) + resolved = (os.path.join(cmd.egg_base, path) for path in discovered) + self.filelist.allfiles.extend(resolved) + def prune_file_list(self): build = self.get_finalized_command('build') base_dir = self.distribution.get_fullname() self.filelist.exclude_pattern(None, prefix=build.build_base) self.filelist.exclude_pattern(None, prefix=base_dir) sep = re.escape(os.sep) - self.filelist.exclude_pattern(sep+r'(RCS|CVS|\.svn)'+sep, is_regex=1) + self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep, + is_regex=1) def write_file(filename, contents): @@ -304,11 +367,13 @@ def write_file(filename, contents): sequence of strings without line terminators) to it. """ contents = "\n".join(contents) - if sys.version_info >= (3,): - contents = contents.encode("utf-8") - f = open(filename, "wb") # always write POSIX-style manifest - f.write(contents) - f.close() + + # assuming the contents has been vetted for utf-8 encoding + contents = contents.encode("utf-8") + + with open(filename, "wb") as f: # always write POSIX-style manifest + f.write(contents) + def write_pkg_info(cmd, basename, filename): log.info("writing %s", filename) @@ -323,10 +388,12 @@ def write_pkg_info(cmd, basename, filename): finally: metadata.name, metadata.version = oldname, oldver - safe = getattr(cmd.distribution,'zip_safe',None) + safe = getattr(cmd.distribution, 'zip_safe', None) from setuptools.command import bdist_egg + bdist_egg.write_safety_flag(cmd.egg_info, safe) + def warn_depends_obsolete(cmd, basename, filename): if os.path.exists(filename): log.warn( @@ -335,55 +402,75 @@ def warn_depends_obsolete(cmd, basename, filename): ) +def _write_requirements(stream, reqs): + lines = yield_lines(reqs or ()) + append_cr = lambda line: line + '\n' + lines = map(append_cr, lines) + stream.writelines(lines) + + def write_requirements(cmd, basename, filename): dist = cmd.distribution - data = ['\n'.join(yield_lines(dist.install_requires or ()))] - for extra,reqs in (dist.extras_require or {}).items(): - data.append('\n\n[%s]\n%s' % (extra, '\n'.join(yield_lines(reqs)))) - cmd.write_or_delete_file("requirements", filename, ''.join(data)) + data = StringIO() + _write_requirements(data, dist.install_requires) + extras_require = dist.extras_require or {} + for extra in sorted(extras_require): + data.write('\n[{extra}]\n'.format(**vars())) + _write_requirements(data, extras_require[extra]) + cmd.write_or_delete_file("requirements", filename, data.getvalue()) + + +def write_setup_requirements(cmd, basename, filename): + data = StringIO() + _write_requirements(data, cmd.distribution.setup_requires) + cmd.write_or_delete_file("setup-requirements", filename, data.getvalue()) + def write_toplevel_names(cmd, basename, filename): pkgs = dict.fromkeys( [ - k.split('.',1)[0] + k.split('.', 1)[0] for k in cmd.distribution.iter_distribution_names() ] ) - cmd.write_file("top-level names", filename, '\n'.join(pkgs)+'\n') + cmd.write_file("top-level names", filename, '\n'.join(sorted(pkgs)) + '\n') def overwrite_arg(cmd, basename, filename): write_arg(cmd, basename, filename, True) + def write_arg(cmd, basename, filename, force=False): argname = os.path.splitext(basename)[0] value = getattr(cmd.distribution, argname, None) if value is not None: - value = '\n'.join(value)+'\n' + value = '\n'.join(value) + '\n' cmd.write_or_delete_file(argname, filename, value, force) + def write_entries(cmd, basename, filename): ep = cmd.distribution.entry_points - if isinstance(ep,basestring) or ep is None: + if isinstance(ep, basestring) or ep is None: data = ep elif ep is not None: data = [] - for section, contents in ep.items(): - if not isinstance(contents,basestring): + for section, contents in sorted(ep.items()): + if not isinstance(contents, basestring): contents = EntryPoint.parse_group(section, contents) - contents = '\n'.join(map(str,contents.values())) - data.append('[%s]\n%s\n\n' % (section,contents)) + contents = '\n'.join(sorted(map(str, contents.values()))) + data.append('[%s]\n%s\n\n' % (section, contents)) data = ''.join(data) cmd.write_or_delete_file('entry points', filename, data, True) + def get_pkg_info_revision(): # See if we can get a -r### off of PKG-INFO, in case this is an sdist of # a subversion revision # if os.path.exists('PKG-INFO'): - f = open('PKG-INFO','rU') + f = open('PKG-INFO', 'rU') for line in f: match = re.match(r"Version:.*-r(\d+)\s*$", line) if match: diff --git a/awx/lib/site-packages/setuptools/command/install.py b/awx/lib/site-packages/setuptools/command/install.py index 459cd3cd59..d2bca2ec59 100644 --- a/awx/lib/site-packages/setuptools/command/install.py +++ b/awx/lib/site-packages/setuptools/command/install.py @@ -1,18 +1,26 @@ -import setuptools -import sys -import glob -from distutils.command.install import install as _install from distutils.errors import DistutilsArgError +import inspect +import glob +import warnings +import platform +import distutils.command.install as orig -class install(_install): +import setuptools + +# Prior to numpy 1.9, NumPy relies on the '_install' name, so provide it for +# now. See https://bitbucket.org/pypa/setuptools/issue/199/ +_install = orig.install + + +class install(orig.install): """Use easy_install to install the package, w/dependencies""" - user_options = _install.user_options + [ + user_options = orig.install.user_options + [ ('old-and-unmanageable', None, "Try not to use this!"), ('single-version-externally-managed', None, - "used by system package builders to create 'flat' eggs"), + "used by system package builders to create 'flat' eggs"), ] - boolean_options = _install.boolean_options + [ + boolean_options = orig.install.boolean_options + [ 'old-and-unmanageable', 'single-version-externally-managed', ] new_commands = [ @@ -22,13 +30,12 @@ class install(_install): _nc = dict(new_commands) def initialize_options(self): - _install.initialize_options(self) + orig.install.initialize_options(self) self.old_and_unmanageable = None self.single_version_externally_managed = None - self.no_compile = None # make DISTUTILS_DEBUG work right! def finalize_options(self): - _install.finalize_options(self) + orig.install.finalize_options(self) if self.root: self.single_version_externally_managed = True elif self.single_version_externally_managed: @@ -41,7 +48,7 @@ class install(_install): def handle_extra_path(self): if self.root or self.single_version_externally_managed: # explicit backward-compatibility mode, allow extra_path to work - return _install.handle_extra_path(self) + return orig.install.handle_extra_path(self) # Ignore extra_path when installing an egg (or being run by another # command without --root or --single-version-externally-managed @@ -51,28 +58,41 @@ class install(_install): def run(self): # Explicit request for old-style install? Just do it if self.old_and_unmanageable or self.single_version_externally_managed: - return _install.run(self) + return orig.install.run(self) - # Attempt to detect whether we were called from setup() or by another - # command. If we were called by setup(), our caller will be the - # 'run_command' method in 'distutils.dist', and *its* caller will be - # the 'run_commands' method. If we were called any other way, our - # immediate caller *might* be 'run_command', but it won't have been - # called by 'run_commands'. This is slightly kludgy, but seems to - # work. - # - caller = sys._getframe(2) - caller_module = caller.f_globals.get('__name__','') - caller_name = caller.f_code.co_name - - if caller_module != 'distutils.dist' or caller_name!='run_commands': - # We weren't called from the command line or setup(), so we - # should run in backward-compatibility mode to support bdist_* - # commands. - _install.run(self) + if not self._called_from_setup(inspect.currentframe()): + # Run in backward-compatibility mode to support bdist_* commands. + orig.install.run(self) else: self.do_egg_install() + @staticmethod + def _called_from_setup(run_frame): + """ + Attempt to detect whether run() was called from setup() or by another + command. If called by setup(), the parent caller will be the + 'run_command' method in 'distutils.dist', and *its* caller will be + the 'run_commands' method. If called any other way, the + immediate caller *might* be 'run_command', but it won't have been + called by 'run_commands'. Return True in that case or if a call stack + is unavailable. Return False otherwise. + """ + if run_frame is None: + msg = "Call stack not available. bdist_* commands may fail." + warnings.warn(msg) + if platform.python_implementation() == 'IronPython': + msg = "For best results, pass -X:Frames to enable call stack." + warnings.warn(msg) + return True + res = inspect.getouterframes(run_frame)[2] + caller, = res[:1] + info = inspect.getframeinfo(caller) + caller_module = caller.f_globals.get('__name__', '') + return ( + caller_module == 'distutils.dist' + and info.function == 'run_commands' + ) + def do_egg_install(self): easy_install = self.distribution.get_command_class('easy_install') @@ -97,7 +117,9 @@ class install(_install): cmd.run() setuptools.bootstrap_install_from = None + # XXX Python 3.1 doesn't see _nc if this is inside the class -install.sub_commands = [ - cmd for cmd in _install.sub_commands if cmd[0] not in install._nc - ] + install.new_commands +install.sub_commands = ( + [cmd for cmd in orig.install.sub_commands if cmd[0] not in install._nc] + + install.new_commands +) diff --git a/awx/lib/site-packages/setuptools/command/install_egg_info.py b/awx/lib/site-packages/setuptools/command/install_egg_info.py index f44b34b555..fd0f118b33 100644 --- a/awx/lib/site-packages/setuptools/command/install_egg_info.py +++ b/awx/lib/site-packages/setuptools/command/install_egg_info.py @@ -1,7 +1,10 @@ +from distutils import log, dir_util +import os + from setuptools import Command from setuptools.archive_util import unpack_archive -from distutils import log, dir_util -import os, shutil, pkg_resources +import pkg_resources + class install_egg_info(Command): """Install an .egg-info directory for the package""" @@ -16,26 +19,26 @@ class install_egg_info(Command): self.install_dir = None def finalize_options(self): - self.set_undefined_options('install_lib',('install_dir','install_dir')) + self.set_undefined_options('install_lib', + ('install_dir', 'install_dir')) ei_cmd = self.get_finalized_command("egg_info") basename = pkg_resources.Distribution( None, None, ei_cmd.egg_name, ei_cmd.egg_version - ).egg_name()+'.egg-info' + ).egg_name() + '.egg-info' self.source = ei_cmd.egg_info self.target = os.path.join(self.install_dir, basename) self.outputs = [self.target] def run(self): self.run_command('egg_info') - target = self.target if os.path.isdir(self.target) and not os.path.islink(self.target): dir_util.remove_tree(self.target, dry_run=self.dry_run) elif os.path.exists(self.target): - self.execute(os.unlink,(self.target,),"Removing "+self.target) + self.execute(os.unlink, (self.target,), "Removing " + self.target) if not self.dry_run: pkg_resources.ensure_directory(self.target) - self.execute(self.copytree, (), - "Copying %s to %s" % (self.source, self.target) + self.execute( + self.copytree, (), "Copying %s to %s" % (self.source, self.target) ) self.install_namespaces() @@ -44,82 +47,70 @@ class install_egg_info(Command): def copytree(self): # Copy the .egg-info tree to site-packages - def skimmer(src,dst): + def skimmer(src, dst): # filter out source-control directories; note that 'src' is always # a '/'-separated path, regardless of platform. 'dst' is a # platform-specific path. - for skip in '.svn/','CVS/': - if src.startswith(skip) or '/'+skip in src: + for skip in '.svn/', 'CVS/': + if src.startswith(skip) or '/' + skip in src: return None self.outputs.append(dst) log.debug("Copying %s to %s", src, dst) return dst + unpack_archive(self.source, self.target, skimmer) - - - - - - - - - - - - - - - - - - - - - - - - def install_namespaces(self): nsp = self._get_all_ns_packages() - if not nsp: return - filename,ext = os.path.splitext(self.target) - filename += '-nspkg.pth'; self.outputs.append(filename) - log.info("Installing %s",filename) - if not self.dry_run: - f = open(filename,'wt') - for pkg in nsp: - # ensure pkg is not a unicode string under Python 2.7 - pkg = str(pkg) - pth = tuple(pkg.split('.')) - trailer = '\n' - if '.' in pkg: - trailer = ( - "; m and setattr(sys.modules[%r], %r, m)\n" - % ('.'.join(pth[:-1]), pth[-1]) - ) - f.write( - "import sys,types,os; " - "p = os.path.join(sys._getframe(1).f_locals['sitedir'], " - "*%(pth)r); " - "ie = os.path.exists(os.path.join(p,'__init__.py')); " - "m = not ie and " - "sys.modules.setdefault(%(pkg)r,types.ModuleType(%(pkg)r)); " - "mp = (m or []) and m.__dict__.setdefault('__path__',[]); " - "(p not in mp) and mp.append(p)%(trailer)s" - % locals() - ) - f.close() + if not nsp: + return + filename, ext = os.path.splitext(self.target) + filename += '-nspkg.pth' + self.outputs.append(filename) + log.info("Installing %s", filename) + lines = map(self._gen_nspkg_line, nsp) + + if self.dry_run: + # always generate the lines, even in dry run + list(lines) + return + + with open(filename, 'wt') as f: + f.writelines(lines) + + _nspkg_tmpl = ( + "import sys, types, os", + "p = os.path.join(sys._getframe(1).f_locals['sitedir'], *%(pth)r)", + "ie = os.path.exists(os.path.join(p,'__init__.py'))", + "m = not ie and " + "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))", + "mp = (m or []) and m.__dict__.setdefault('__path__',[])", + "(p not in mp) and mp.append(p)", + ) + "lines for the namespace installer" + + _nspkg_tmpl_multi = ( + 'm and setattr(sys.modules[%(parent)r], %(child)r, m)', + ) + "additional line(s) when a parent package is indicated" + + @classmethod + def _gen_nspkg_line(cls, pkg): + # ensure pkg is not a unicode string under Python 2.7 + pkg = str(pkg) + pth = tuple(pkg.split('.')) + tmpl_lines = cls._nspkg_tmpl + parent, sep, child = pkg.rpartition('.') + if parent: + tmpl_lines += cls._nspkg_tmpl_multi + return ';'.join(tmpl_lines) % locals() + '\n' def _get_all_ns_packages(self): - nsp = {} + """Return sorted list of all package namespaces""" + nsp = set() for pkg in self.distribution.namespace_packages or []: pkg = pkg.split('.') while pkg: - nsp['.'.join(pkg)] = 1 + nsp.add('.'.join(pkg)) pkg.pop() - nsp=list(nsp) - nsp.sort() # set up shorter names first - return nsp - - + return sorted(nsp) diff --git a/awx/lib/site-packages/setuptools/command/install_lib.py b/awx/lib/site-packages/setuptools/command/install_lib.py index 82afa1421b..9b7722276b 100644 --- a/awx/lib/site-packages/setuptools/command/install_lib.py +++ b/awx/lib/site-packages/setuptools/command/install_lib.py @@ -1,21 +1,11 @@ -from distutils.command.install_lib import install_lib as _install_lib import os +import imp +from itertools import product, starmap +import distutils.command.install_lib as orig -class install_lib(_install_lib): +class install_lib(orig.install_lib): """Don't add compiled flags to filenames of non-Python files""" - def _bytecode_filenames (self, py_filenames): - bytecode_files = [] - for py_file in py_filenames: - if not py_file.endswith('.py'): - continue - if self.compile: - bytecode_files.append(py_file + "c") - if self.optimize > 0: - bytecode_files.append(py_file + "o") - - return bytecode_files - def run(self): self.build() outfiles = self.install() @@ -24,30 +14,81 @@ class install_lib(_install_lib): self.byte_compile(outfiles) def get_exclusions(self): - exclude = {} - nsp = self.distribution.namespace_packages + """ + Return a collections.Sized collections.Container of paths to be + excluded for single_version_externally_managed installations. + """ + all_packages = ( + pkg + for ns_pkg in self._get_SVEM_NSPs() + for pkg in self._all_packages(ns_pkg) + ) - if (nsp and self.get_finalized_command('install') - .single_version_externally_managed - ): - for pkg in nsp: - parts = pkg.split('.') - while parts: - pkgdir = os.path.join(self.install_dir, *parts) - for f in '__init__.py', '__init__.pyc', '__init__.pyo': - exclude[os.path.join(pkgdir,f)] = 1 - parts.pop() - return exclude + excl_specs = product(all_packages, self._gen_exclusion_paths()) + return set(starmap(self._exclude_pkg_path, excl_specs)) + + def _exclude_pkg_path(self, pkg, exclusion_path): + """ + Given a package name and exclusion path within that package, + compute the full exclusion path. + """ + parts = pkg.split('.') + [exclusion_path] + return os.path.join(self.install_dir, *parts) + + @staticmethod + def _all_packages(pkg_name): + """ + >>> list(install_lib._all_packages('foo.bar.baz')) + ['foo.bar.baz', 'foo.bar', 'foo'] + """ + while pkg_name: + yield pkg_name + pkg_name, sep, child = pkg_name.rpartition('.') + + def _get_SVEM_NSPs(self): + """ + Get namespace packages (list) but only for + single_version_externally_managed installations and empty otherwise. + """ + # TODO: is it necessary to short-circuit here? i.e. what's the cost + # if get_finalized_command is called even when namespace_packages is + # False? + if not self.distribution.namespace_packages: + return [] + + install_cmd = self.get_finalized_command('install') + svem = install_cmd.single_version_externally_managed + + return self.distribution.namespace_packages if svem else [] + + @staticmethod + def _gen_exclusion_paths(): + """ + Generate file paths to be excluded for namespace packages (bytecode + cache files). + """ + # always exclude the package module itself + yield '__init__.py' + + yield '__init__.pyc' + yield '__init__.pyo' + + if not hasattr(imp, 'get_tag'): + return + + base = os.path.join('__pycache__', '__init__.' + imp.get_tag()) + yield base + '.pyc' + yield base + '.pyo' def copy_tree( - self, infile, outfile, - preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1 + self, infile, outfile, + preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1 ): assert preserve_mode and preserve_times and not preserve_symlinks exclude = self.get_exclusions() if not exclude: - return _install_lib.copy_tree(self, infile, outfile) + return orig.install_lib.copy_tree(self, infile, outfile) # Exclude namespace package __init__.py* files from the output @@ -58,7 +99,8 @@ class install_lib(_install_lib): def pf(src, dst): if dst in exclude: - log.warn("Skipping installation of %s (namespace package)",dst) + log.warn("Skipping installation of %s (namespace package)", + dst) return False log.info("copying %s -> %s", src, os.path.dirname(dst)) @@ -69,14 +111,8 @@ class install_lib(_install_lib): return outfiles def get_outputs(self): - outputs = _install_lib.get_outputs(self) + outputs = orig.install_lib.get_outputs(self) exclude = self.get_exclusions() if exclude: return [f for f in outputs if f not in exclude] return outputs - - - - - - diff --git a/awx/lib/site-packages/setuptools/command/install_scripts.py b/awx/lib/site-packages/setuptools/command/install_scripts.py index 105dabca6a..be66cb2252 100644 --- a/awx/lib/site-packages/setuptools/command/install_scripts.py +++ b/awx/lib/site-packages/setuptools/command/install_scripts.py @@ -1,23 +1,23 @@ -from distutils.command.install_scripts import install_scripts \ - as _install_scripts -from pkg_resources import Distribution, PathMetadata, ensure_directory -import os from distutils import log +import distutils.command.install_scripts as orig +import os -class install_scripts(_install_scripts): +from pkg_resources import Distribution, PathMetadata, ensure_directory + + +class install_scripts(orig.install_scripts): """Do normal script install, plus any egg_info wrapper scripts""" def initialize_options(self): - _install_scripts.initialize_options(self) + orig.install_scripts.initialize_options(self) self.no_ep = False def run(self): - from setuptools.command.easy_install import get_script_args - from setuptools.command.easy_install import sys_executable + import setuptools.command.easy_install as ei self.run_command("egg_info") if self.distribution.scripts: - _install_scripts.run(self) # run first to set up self.outfiles + orig.install_scripts.run(self) # run first to set up self.outfiles else: self.outfiles = [] if self.no_ep: @@ -30,16 +30,23 @@ class install_scripts(_install_scripts): ei_cmd.egg_name, ei_cmd.egg_version, ) bs_cmd = self.get_finalized_command('build_scripts') - executable = getattr(bs_cmd,'executable',sys_executable) - is_wininst = getattr( - self.get_finalized_command("bdist_wininst"), '_is_running', False - ) - for args in get_script_args(dist, executable, is_wininst): + exec_param = getattr(bs_cmd, 'executable', None) + bw_cmd = self.get_finalized_command("bdist_wininst") + is_wininst = getattr(bw_cmd, '_is_running', False) + writer = ei.ScriptWriter + if is_wininst: + exec_param = "python.exe" + writer = ei.WindowsScriptWriter + # resolve the writer to the environment + writer = writer.best() + cmd = writer.command_spec_class.best().from_param(exec_param) + for args in writer.get_args(dist, cmd.as_header()): self.write_script(*args) def write_script(self, script_name, contents, mode="t", *ignored): """Write an executable file to the scripts directory""" from setuptools.command.easy_install import chmod, current_umask + log.info("Installing %s script to %s", script_name, self.install_dir) target = os.path.join(self.install_dir, script_name) self.outfiles.append(target) @@ -47,8 +54,7 @@ class install_scripts(_install_scripts): mask = current_umask() if not self.dry_run: ensure_directory(target) - f = open(target,"w"+mode) + f = open(target, "w" + mode) f.write(contents) f.close() - chmod(target, 0x1FF-mask) # 0777 - + chmod(target, 0o777 - mask) diff --git a/awx/lib/site-packages/setuptools/command/launcher manifest.xml b/awx/lib/site-packages/setuptools/command/launcher manifest.xml index 844d2264cd..5972a96d8d 100644 --- a/awx/lib/site-packages/setuptools/command/launcher manifest.xml +++ b/awx/lib/site-packages/setuptools/command/launcher manifest.xml @@ -1,15 +1,15 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> -<assemblyIdentity version="1.0.0.0" - processorArchitecture="X86" - name="%(name)s" - type="win32"/> + <assemblyIdentity version="1.0.0.0" + processorArchitecture="X86" + name="%(name)s" + type="win32"/> <!-- Identify the application security requirements. --> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> - <security> - <requestedPrivileges> - <requestedExecutionLevel level="asInvoker" uiAccess="false"/> - </requestedPrivileges> - </security> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"/> + </requestedPrivileges> + </security> </trustInfo> </assembly> diff --git a/awx/lib/site-packages/setuptools/command/register.py b/awx/lib/site-packages/setuptools/command/register.py index 3b2e085907..8d6336a14d 100644 --- a/awx/lib/site-packages/setuptools/command/register.py +++ b/awx/lib/site-packages/setuptools/command/register.py @@ -1,10 +1,10 @@ -from distutils.command.register import register as _register +import distutils.command.register as orig -class register(_register): - __doc__ = _register.__doc__ + +class register(orig.register): + __doc__ = orig.register.__doc__ def run(self): # Make sure that we are using valid current name/version info self.run_command('egg_info') - _register.run(self) - + orig.register.run(self) diff --git a/awx/lib/site-packages/setuptools/command/rotate.py b/awx/lib/site-packages/setuptools/command/rotate.py index b10acfb41f..1b073620ea 100644 --- a/awx/lib/site-packages/setuptools/command/rotate.py +++ b/awx/lib/site-packages/setuptools/command/rotate.py @@ -1,18 +1,20 @@ -import distutils, os -from setuptools import Command -from setuptools.compat import basestring from distutils.util import convert_path from distutils import log -from distutils.errors import * +from distutils.errors import DistutilsOptionError +import os + +from setuptools import Command +from setuptools.compat import basestring + class rotate(Command): """Delete older distributions""" description = "delete older distributions, keeping N newest files" user_options = [ - ('match=', 'm', "patterns to match (required)"), + ('match=', 'm', "patterns to match (required)"), ('dist-dir=', 'd', "directory where the distributions are"), - ('keep=', 'k', "number of matching distributions to keep"), + ('keep=', 'k', "number of matching distributions to keep"), ] boolean_options = [] @@ -29,7 +31,7 @@ class rotate(Command): "(e.g. '.zip' or '.egg')" ) if self.keep is None: - raise DistutilsOptionError("Must specify number of files to keep") + raise DistutilsOptionError("Must specify number of files to keep") try: self.keep = int(self.keep) except ValueError: @@ -38,46 +40,22 @@ class rotate(Command): self.match = [ convert_path(p.strip()) for p in self.match.split(',') ] - self.set_undefined_options('bdist',('dist_dir', 'dist_dir')) + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) def run(self): self.run_command("egg_info") from glob import glob + for pattern in self.match: - pattern = self.distribution.get_name()+'*'+pattern - files = glob(os.path.join(self.dist_dir,pattern)) - files = [(os.path.getmtime(f),f) for f in files] + pattern = self.distribution.get_name() + '*' + pattern + files = glob(os.path.join(self.dist_dir, pattern)) + files = [(os.path.getmtime(f), f) for f in files] files.sort() files.reverse() log.info("%d file(s) matching %s", len(files), pattern) files = files[self.keep:] - for (t,f) in files: + for (t, f) in files: log.info("Deleting %s", f) if not self.dry_run: os.unlink(f) - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/awx/lib/site-packages/setuptools/command/saveopts.py b/awx/lib/site-packages/setuptools/command/saveopts.py index 7209be4cd9..611cec5528 100644 --- a/awx/lib/site-packages/setuptools/command/saveopts.py +++ b/awx/lib/site-packages/setuptools/command/saveopts.py @@ -1,7 +1,6 @@ -import distutils, os -from setuptools import Command from setuptools.command.setopt import edit_config, option_base + class saveopts(option_base): """Save command-line options to a file""" @@ -13,12 +12,11 @@ class saveopts(option_base): for cmd in dist.command_options: - if cmd=='saveopts': - continue # don't save our own options! + if cmd == 'saveopts': + continue # don't save our own options! - for opt,(src,val) in dist.get_option_dict(cmd).items(): - if src=="command line": - settings.setdefault(cmd,{})[opt] = val + for opt, (src, val) in dist.get_option_dict(cmd).items(): + if src == "command line": + settings.setdefault(cmd, {})[opt] = val edit_config(self.filename, settings, self.dry_run) - diff --git a/awx/lib/site-packages/setuptools/command/sdist.py b/awx/lib/site-packages/setuptools/command/sdist.py index 76e1c5f18b..851a177524 100644 --- a/awx/lib/site-packages/setuptools/command/sdist.py +++ b/awx/lib/site-packages/setuptools/command/sdist.py @@ -1,16 +1,17 @@ -import os -import re -import sys from glob import glob +from distutils import log +import distutils.command.sdist as orig +import os +import sys + +from setuptools.compat import PY3 +from setuptools.utils import cs_path_exists import pkg_resources -from distutils.command.sdist import sdist as _sdist -from distutils.util import convert_path -from distutils import log -from setuptools import svn_utils -READMES = ('README', 'README.rst', 'README.txt') +READMES = 'README', 'README.rst', 'README.txt' +_default_revctrl = list def walk_revctrl(dirname=''): """Find all files under revision control""" @@ -19,60 +20,7 @@ def walk_revctrl(dirname=''): yield item -#TODO will need test case -class re_finder(object): - """ - Finder that locates files based on entries in a file matched by a - regular expression. - """ - - def __init__(self, path, pattern, postproc=lambda x: x): - self.pattern = pattern - self.postproc = postproc - self.entries_path = convert_path(path) - - def _finder(self, dirname, filename): - f = open(filename,'rU') - try: - data = f.read() - finally: - f.close() - for match in self.pattern.finditer(data): - path = match.group(1) - # postproc was formerly used when the svn finder - # was an re_finder for calling unescape - path = self.postproc(path) - yield svn_utils.joinpath(dirname, path) - - def find(self, dirname=''): - path = svn_utils.joinpath(dirname, self.entries_path) - - if not os.path.isfile(path): - # entries file doesn't exist - return - for path in self._finder(dirname,path): - if os.path.isfile(path): - yield path - elif os.path.isdir(path): - for item in self.find(path): - yield item - __call__ = find - - -def _default_revctrl(dirname=''): - 'Primary svn_cvs entry point' - for finder in finders: - for item in finder(dirname): - yield item - - -finders = [ - re_finder('CVS/Entries', re.compile(r"^\w?/([^/]+)/", re.M)), - svn_utils.svn_finder, -] - - -class sdist(_sdist): +class sdist(orig.sdist): """Smart sdist that finds anything supported by revision control""" user_options = [ @@ -84,7 +32,7 @@ class sdist(_sdist): ('dist-dir=', 'd', "directory to put the source distribution archive(s) in " "[default: dist]"), - ] + ] negative_opt = {} @@ -92,7 +40,7 @@ class sdist(_sdist): self.run_command('egg_info') ei_cmd = self.get_finalized_command('egg_info') self.filelist = ei_cmd.filelist - self.filelist.append(os.path.join(ei_cmd.egg_info,'SOURCES.txt')) + self.filelist.append(os.path.join(ei_cmd.egg_info, 'SOURCES.txt')) self.check_readme() # Run sub commands @@ -102,12 +50,13 @@ class sdist(_sdist): # Call check_metadata only if no 'check' command # (distutils <= 2.6) import distutils.command + if 'check' not in distutils.command.__all__: self.check_metadata() self.make_distribution() - dist_files = getattr(self.distribution,'dist_files',[]) + dist_files = getattr(self.distribution, 'dist_files', []) for file in self.archive_files: data = ('sdist', '', file) if data not in dist_files: @@ -119,17 +68,19 @@ class sdist(_sdist): # Doing so prevents an error when easy_install attempts to delete the # file. try: - _sdist.read_template(self) + orig.sdist.read_template(self) except: - sys.exc_info()[2].tb_next.tb_frame.f_locals['template'].close() + _, _, tb = sys.exc_info() + tb.tb_next.tb_frame.f_locals['template'].close() raise + # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle # has been fixed, so only override the method if we're using an earlier # Python. has_leaky_handle = ( - sys.version_info < (2,7,2) - or (3,0) <= sys.version_info < (3,1,4) - or (3,2) <= sys.version_info < (3,2,1) + sys.version_info < (2, 7, 2) + or (3, 0) <= sys.version_info < (3, 1, 4) + or (3, 2) <= sys.version_info < (3, 2, 1) ) if has_leaky_handle: read_template = __read_template_hack @@ -142,7 +93,7 @@ class sdist(_sdist): alts = fn got_it = 0 for fn in alts: - if os.path.exists(fn): + if cs_path_exists(fn): got_it = 1 self.filelist.append(fn) break @@ -151,14 +102,14 @@ class sdist(_sdist): self.warn("standard file not found: should have one of " + ', '.join(alts)) else: - if os.path.exists(fn): + if cs_path_exists(fn): self.filelist.append(fn) else: self.warn("standard file '%s' not found" % fn) optional = ['test/test*.py', 'setup.cfg'] for pattern in optional: - files = list(filter(os.path.isfile, glob(pattern))) + files = list(filter(cs_path_exists, glob(pattern))) if files: self.filelist.extend(files) @@ -193,15 +144,16 @@ class sdist(_sdist): return else: self.warn( - "standard file not found: should have one of " +', '.join(READMES) + "standard file not found: should have one of " + + ', '.join(READMES) ) def make_release_tree(self, base_dir, files): - _sdist.make_release_tree(self, base_dir, files) + orig.sdist.make_release_tree(self, base_dir, files) # Save any egg_info command line options used to create this sdist dest = os.path.join(base_dir, 'setup.cfg') - if hasattr(os,'link') and os.path.exists(dest): + if hasattr(os, 'link') and os.path.exists(dest): # unlink and re-copy, since it might be hard-linked, and # we don't want to change the source version os.unlink(dest) @@ -219,7 +171,8 @@ class sdist(_sdist): first_line = fp.readline() finally: fp.close() - return first_line != '# file GENERATED by distutils, do NOT edit\n'.encode() + return (first_line != + '# file GENERATED by distutils, do NOT edit\n'.encode()) def read_manifest(self): """Read the manifest file (named by 'self.manifest') and use it to @@ -230,7 +183,7 @@ class sdist(_sdist): manifest = open(self.manifest, 'rbU') for line in manifest: # The manifest must contain UTF-8. See #303. - if sys.version_info >= (3,): + if PY3: try: line = line.decode('UTF-8') except UnicodeDecodeError: diff --git a/awx/lib/site-packages/setuptools/command/setopt.py b/awx/lib/site-packages/setuptools/command/setopt.py index aa468c88fe..a04d6032ad 100644 --- a/awx/lib/site-packages/setuptools/command/setopt.py +++ b/awx/lib/site-packages/setuptools/command/setopt.py @@ -1,8 +1,11 @@ -import distutils, os -from setuptools import Command from distutils.util import convert_path from distutils import log -from distutils.errors import * +from distutils.errors import DistutilsOptionError +import distutils +import os + +from setuptools import Command + __all__ = ['config_file', 'edit_config', 'option_base', 'setopt'] @@ -12,33 +15,20 @@ def config_file(kind="local"): `kind` must be one of "local", "global", or "user" """ - if kind=='local': + if kind == 'local': return 'setup.cfg' - if kind=='global': + if kind == 'global': return os.path.join( - os.path.dirname(distutils.__file__),'distutils.cfg' + os.path.dirname(distutils.__file__), 'distutils.cfg' ) - if kind=='user': - dot = os.name=='posix' and '.' or '' + if kind == 'user': + dot = os.name == 'posix' and '.' or '' return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot)) raise ValueError( "config_file() type must be 'local', 'global', or 'user'", kind ) - - - - - - - - - - - - - def edit_config(filename, settings, dry_run=False): """Edit a configuration file to include `settings` @@ -48,6 +38,7 @@ def edit_config(filename, settings, dry_run=False): A setting of ``None`` means to delete that setting. """ from setuptools.compat import ConfigParser + log.debug("Reading configuration from %s", filename) opts = ConfigParser.RawConfigParser() opts.read([filename]) @@ -59,46 +50,49 @@ def edit_config(filename, settings, dry_run=False): if not opts.has_section(section): log.debug("Adding new section [%s] to %s", section, filename) opts.add_section(section) - for option,value in options.items(): + for option, value in options.items(): if value is None: - log.debug("Deleting %s.%s from %s", + log.debug( + "Deleting %s.%s from %s", section, option, filename ) - opts.remove_option(section,option) + opts.remove_option(section, option) if not opts.options(section): log.info("Deleting empty [%s] section from %s", - section, filename) + section, filename) opts.remove_section(section) else: log.debug( "Setting %s.%s to %r in %s", section, option, value, filename ) - opts.set(section,option,value) + opts.set(section, option, value) log.info("Writing %s", filename) if not dry_run: - f = open(filename,'w'); opts.write(f); f.close() + with open(filename, 'w') as f: + opts.write(f) + class option_base(Command): """Abstract base class for commands that mess with config files""" - + user_options = [ ('global-config', 'g', - "save options to the site-wide distutils.cfg file"), + "save options to the site-wide distutils.cfg file"), ('user-config', 'u', - "save options to the current user's pydistutils.cfg file"), + "save options to the current user's pydistutils.cfg file"), ('filename=', 'f', - "configuration file to use (default=setup.cfg)"), + "configuration file to use (default=setup.cfg)"), ] boolean_options = [ 'global-config', 'user-config', - ] + ] def initialize_options(self): self.global_config = None - self.user_config = None + self.user_config = None self.filename = None def finalize_options(self): @@ -111,14 +105,12 @@ class option_base(Command): filenames.append(self.filename) if not filenames: filenames.append(config_file('local')) - if len(filenames)>1: + if len(filenames) > 1: raise DistutilsOptionError( "Must specify only one configuration file option", filenames ) - self.filename, = filenames - - + self.filename, = filenames class setopt(option_base): @@ -128,9 +120,9 @@ class setopt(option_base): user_options = [ ('command=', 'c', 'command to set an option for'), - ('option=', 'o', 'option to set'), - ('set-value=', 's', 'value of the option'), - ('remove', 'r', 'remove (unset) the value'), + ('option=', 'o', 'option to set'), + ('set-value=', 's', 'value of the option'), + ('remove', 'r', 'remove (unset) the value'), ] + option_base.user_options boolean_options = option_base.boolean_options + ['remove'] @@ -152,13 +144,7 @@ class setopt(option_base): def run(self): edit_config( self.filename, { - self.command: {self.option.replace('-','_'):self.set_value} + self.command: {self.option.replace('-', '_'): self.set_value} }, self.dry_run ) - - - - - - diff --git a/awx/lib/site-packages/setuptools/command/test.py b/awx/lib/site-packages/setuptools/command/test.py index db2fc7b140..42689f7012 100644 --- a/awx/lib/site-packages/setuptools/command/test.py +++ b/awx/lib/site-packages/setuptools/command/test.py @@ -1,12 +1,17 @@ -from setuptools import Command from distutils.errors import DistutilsOptionError +from unittest import TestLoader +import unittest import sys -from pkg_resources import * -from pkg_resources import _namespace_packages -from unittest import TestLoader, main + +from pkg_resources import (resource_listdir, resource_exists, normalize_path, + working_set, _namespace_packages, + add_activation_listener, require, EntryPoint) +from setuptools import Command +from setuptools.compat import PY3 +from setuptools.py31compat import unittest_main + class ScanningLoader(TestLoader): - def loadTestsFromModule(self, module): """Return a suite of all tests cases contained in the given module @@ -15,48 +20,45 @@ class ScanningLoader(TestLoader): the return value to the tests. """ tests = [] - if module.__name__!='setuptools.tests.doctest': # ugh - tests.append(TestLoader.loadTestsFromModule(self,module)) + tests.append(TestLoader.loadTestsFromModule(self, module)) if hasattr(module, "additional_tests"): tests.append(module.additional_tests()) if hasattr(module, '__path__'): for file in resource_listdir(module.__name__, ''): - if file.endswith('.py') and file!='__init__.py': - submodule = module.__name__+'.'+file[:-3] + if file.endswith('.py') and file != '__init__.py': + submodule = module.__name__ + '.' + file[:-3] else: - if resource_exists( - module.__name__, file+'/__init__.py' - ): - submodule = module.__name__+'.'+file + if resource_exists(module.__name__, file + '/__init__.py'): + submodule = module.__name__ + '.' + file else: continue tests.append(self.loadTestsFromName(submodule)) - if len(tests)!=1: + if len(tests) != 1: return self.suiteClass(tests) else: - return tests[0] # don't create a nested suite for only one return + return tests[0] # don't create a nested suite for only one return class test(Command): - """Command to run unit tests after in-place build""" description = "run unit tests after in-place build" user_options = [ - ('test-module=','m', "Run 'test_suite' in specified module"), - ('test-suite=','s', - "Test suite to run (e.g. 'some_module.test_suite')"), + ('test-module=', 'm', "Run 'test_suite' in specified module"), + ('test-suite=', 's', + "Test suite to run (e.g. 'some_module.test_suite')"), + ('test-runner=', 'r', "Test runner to use"), ] def initialize_options(self): self.test_suite = None self.test_module = None self.test_loader = None - + self.test_runner = None def finalize_options(self): @@ -64,7 +66,7 @@ class test(Command): if self.test_module is None: self.test_suite = self.distribution.test_suite else: - self.test_suite = self.test_module+".test_suite" + self.test_suite = self.test_module + ".test_suite" elif self.test_module: raise DistutilsOptionError( "You may specify a module or a suite, but not both" @@ -73,16 +75,18 @@ class test(Command): self.test_args = [self.test_suite] if self.verbose: - self.test_args.insert(0,'--verbose') + self.test_args.insert(0, '--verbose') if self.test_loader is None: - self.test_loader = getattr(self.distribution,'test_loader',None) + self.test_loader = getattr(self.distribution, 'test_loader', None) if self.test_loader is None: self.test_loader = "setuptools.command.test:ScanningLoader" - - + if self.test_runner is None: + self.test_runner = getattr(self.distribution, 'test_runner', None) def with_project_on_sys_path(self, func): - if sys.version_info >= (3,) and getattr(self.distribution, 'use_2to3', False): + with_2to3 = PY3 and getattr(self.distribution, 'use_2to3', False) + + if with_2to3: # If we run 2to3 we can not do this inplace: # Ensure metadata is up-to-date @@ -122,10 +126,10 @@ class test(Command): sys.modules.update(old_modules) working_set.__init__() - def run(self): if self.distribution.install_requires: - self.distribution.fetch_build_eggs(self.distribution.install_requires) + self.distribution.fetch_build_eggs( + self.distribution.install_requires) if self.distribution.tests_require: self.distribution.fetch_build_eggs(self.distribution.tests_require) @@ -137,14 +141,11 @@ class test(Command): self.announce('running "unittest %s"' % cmd) self.with_project_on_sys_path(self.run_tests) - def run_tests(self): - import unittest - # Purge modules under test from sys.modules. The test loader will # re-import them from the build location. Required when 2to3 is used # with namespace packages. - if sys.version_info >= (3,) and getattr(self.distribution, 'use_2to3', False): + if PY3 and getattr(self.distribution, 'use_2to3', False): module = self.test_args[-1].split('.')[0] if module in _namespace_packages: del_modules = [] @@ -156,43 +157,19 @@ class test(Command): del_modules.append(name) list(map(sys.modules.__delitem__, del_modules)) - loader_ep = EntryPoint.parse("x="+self.test_loader) - loader_class = loader_ep.load(require=False) - cks = loader_class() - unittest.main( - None, None, [unittest.__file__]+self.test_args, - testLoader = cks + unittest_main( + None, None, [unittest.__file__] + self.test_args, + testLoader=self._resolve_as_ep(self.test_loader), + testRunner=self._resolve_as_ep(self.test_runner), ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @staticmethod + def _resolve_as_ep(val): + """ + Load the indicated attribute value, called, as a as if it were + specified as an entry point. + """ + if val is None: + return + parsed = EntryPoint.parse("x=" + val) + return parsed.resolve()() diff --git a/awx/lib/site-packages/setuptools/command/upload_docs.py b/awx/lib/site-packages/setuptools/command/upload_docs.py index cad7a52d1b..001ee936e4 100644 --- a/awx/lib/site-packages/setuptools/command/upload_docs.py +++ b/awx/lib/site-packages/setuptools/command/upload_docs.py @@ -5,6 +5,10 @@ Implements a Distutils 'upload_docs' subcommand (upload documentation to PyPI's pythonhosted.org). """ +from base64 import standard_b64encode +from distutils import log +from distutils.errors import DistutilsOptionError +from distutils.command.upload import upload import os import socket import zipfile @@ -12,14 +16,9 @@ import tempfile import sys import shutil -from base64 import standard_b64encode +from setuptools.compat import httplib, urlparse, unicode, iteritems, PY3 from pkg_resources import iter_entry_points -from distutils import log -from distutils.errors import DistutilsOptionError -from distutils.command.upload import upload - -from setuptools.compat import httplib, urlparse, unicode, iteritems, PY3 errors = 'surrogateescape' if PY3 else 'strict' @@ -33,7 +32,6 @@ def b(s, encoding='utf-8'): class upload_docs(upload): - description = 'Upload documentation to PyPI' user_options = [ @@ -42,7 +40,7 @@ class upload_docs(upload): ('show-response', None, 'display full response text from server'), ('upload-dir=', None, 'directory to upload'), - ] + ] boolean_options = upload.boolean_options def has_sphinx(self): @@ -159,7 +157,7 @@ class upload_docs(upload): elif schema == 'https': conn = httplib.HTTPSConnection(netloc) else: - raise AssertionError("unsupported schema "+schema) + raise AssertionError("unsupported schema " + schema) data = '' try: @@ -171,8 +169,7 @@ class upload_docs(upload): conn.putheader('Authorization', auth) conn.endheaders() conn.send(body) - except socket.error: - e = sys.exc_info()[1] + except socket.error as e: self.announce(str(e), log.ERROR) return @@ -190,4 +187,4 @@ class upload_docs(upload): self.announce('Upload failed (%s): %s' % (r.status, r.reason), log.ERROR) if self.show_response: - print('-'*75, r.read(), '-'*75) + print('-' * 75, r.read(), '-' * 75) diff --git a/awx/lib/site-packages/setuptools/compat.py b/awx/lib/site-packages/setuptools/compat.py index 7b824ba2ff..73e6e4aa7e 100644 --- a/awx/lib/site-packages/setuptools/compat.py +++ b/awx/lib/site-packages/setuptools/compat.py @@ -1,15 +1,15 @@ import sys import itertools -if sys.version_info[0] < 3: - PY3 = False +PY3 = sys.version_info >= (3,) +PY2 = not PY3 +if PY2: basestring = basestring import __builtin__ as builtins import ConfigParser from StringIO import StringIO BytesIO = StringIO - execfile = execfile func_code = lambda o: o.func_code func_globals = lambda o: o.func_globals im_func = lambda o: o.im_func @@ -21,8 +21,6 @@ if sys.version_info[0] < 3: iteritems = lambda o: o.iteritems() long_type = long maxsize = sys.maxint - next = lambda o: o.next() - numeric_types = (int, long, float) unichr = unichr unicode = unicode bytes = str @@ -34,9 +32,8 @@ if sys.version_info[0] < 3: exec("""def reraise(tp, value, tb=None): raise tp, value, tb""") -else: - PY3 = True +if PY3: basestring = str import builtins import configparser as ConfigParser @@ -51,8 +48,6 @@ else: iteritems = lambda o: o.items() long_type = int maxsize = sys.maxsize - next = next - numeric_types = (int, float) unichr = chr unicode = str bytes = bytes @@ -65,18 +60,6 @@ else: ) filterfalse = itertools.filterfalse - def execfile(fn, globs=None, locs=None): - if globs is None: - globs = globals() - if locs is None: - locs = globs - f = open(fn, 'rb') - try: - source = f.read() - finally: - f.close() - exec(compile(source, fn, 'exec'), globs, locs) - def reraise(tp, value, tb=None): if value.__traceback__ is not tb: raise value.with_traceback(tb) diff --git a/awx/lib/site-packages/setuptools/depends.py b/awx/lib/site-packages/setuptools/depends.py index 8b9d1217b1..e87ef3f39c 100644 --- a/awx/lib/site-packages/setuptools/depends.py +++ b/awx/lib/site-packages/setuptools/depends.py @@ -1,7 +1,9 @@ -from __future__ import generators -import sys, imp, marshal +import sys +import imp +import marshal from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN -from distutils.version import StrictVersion, LooseVersion +from distutils.version import StrictVersion +from setuptools import compat __all__ = [ 'Require', 'find_module', 'get_module_constant', 'extract_constant' @@ -10,9 +12,8 @@ __all__ = [ class Require: """A prerequisite to building or installing a distribution""" - def __init__(self,name,requested_version,module,homepage='', - attribute=None,format=None - ): + def __init__(self, name, requested_version, module, homepage='', + attribute=None, format=None): if format is None and requested_version is not None: format = StrictVersion @@ -25,20 +26,17 @@ class Require: self.__dict__.update(locals()) del self.self - def full_name(self): """Return full package/distribution name, w/version""" if self.requested_version is not None: return '%s-%s' % (self.name,self.requested_version) return self.name - - def version_ok(self,version): + def version_ok(self, version): """Is 'version' sufficiently up-to-date?""" return self.attribute is None or self.format is None or \ str(version) != "unknown" and version >= self.requested_version - def get_version(self, paths=None, default="unknown"): """Get version number of installed module, 'None', or 'default' @@ -59,20 +57,18 @@ class Require: except ImportError: return None - v = get_module_constant(self.module,self.attribute,default,paths) + v = get_module_constant(self.module, self.attribute, default, paths) if v is not None and v is not default and self.format is not None: return self.format(v) return v - - def is_present(self,paths=None): + def is_present(self, paths=None): """Return true if dependency is present on 'paths'""" return self.get_version(paths) is not None - - def is_current(self,paths=None): + def is_current(self, paths=None): """Return true if dependency is present and up-to-date on 'paths'""" version = self.get_version(paths) if version is None: @@ -103,7 +99,7 @@ def _iter_code(code): ptr += 3 if op==EXTENDED_ARG: - extended_arg = arg * long_type(65536) + extended_arg = arg * compat.long_type(65536) continue else: @@ -113,14 +109,6 @@ def _iter_code(code): yield op,arg - - - - - - - - def find_module(module, paths=None): """Just like 'imp.find_module()', but with package support""" @@ -140,28 +128,6 @@ def find_module(module, paths=None): return info - - - - - - - - - - - - - - - - - - - - - - def get_module_constant(module, symbol, default=-1, paths=None): """Find 'module' by searching 'paths', and extract 'symbol' @@ -171,7 +137,7 @@ def get_module_constant(module, symbol, default=-1, paths=None): constant. Otherwise, return 'default'.""" try: - f, path, (suffix,mode,kind) = find_module(module,paths) + f, path, (suffix, mode, kind) = find_module(module, paths) except ImportError: # Module doesn't exist return None @@ -187,23 +153,17 @@ def get_module_constant(module, symbol, default=-1, paths=None): else: # Not something we can parse; we'll have to import it. :( if module not in sys.modules: - imp.load_module(module,f,path,(suffix,mode,kind)) - return getattr(sys.modules[module],symbol,None) + imp.load_module(module, f, path, (suffix, mode, kind)) + return getattr(sys.modules[module], symbol, None) finally: if f: f.close() - return extract_constant(code,symbol,default) + return extract_constant(code, symbol, default) - - - - - - -def extract_constant(code,symbol,default=-1): +def extract_constant(code, symbol, default=-1): """Extract the constant value of 'symbol' from 'code' If the name 'symbol' is bound to a constant value by the Python code @@ -236,11 +196,20 @@ def extract_constant(code,symbol,default=-1): return const else: const = default - -if sys.platform.startswith('java') or sys.platform == 'cli': - # XXX it'd be better to test assertions about bytecode instead... - del extract_constant, get_module_constant - __all__.remove('extract_constant') - __all__.remove('get_module_constant') +def _update_globals(): + """ + Patch the globals to remove the objects not available on some platforms. + + XXX it'd be better to test assertions about bytecode instead. + """ + + if not sys.platform.startswith('java') and sys.platform != 'cli': + return + incompatible = 'extract_constant', 'get_module_constant' + for name in incompatible: + del globals()[name] + __all__.remove(name) + +_update_globals() diff --git a/awx/lib/site-packages/setuptools/dist.py b/awx/lib/site-packages/setuptools/dist.py index 0801ae74ff..bc29b131b8 100644 --- a/awx/lib/site-packages/setuptools/dist.py +++ b/awx/lib/site-packages/setuptools/dist.py @@ -4,17 +4,23 @@ import re import os import sys import warnings +import numbers import distutils.log import distutils.core import distutils.cmd +import distutils.dist from distutils.core import Distribution as _Distribution from distutils.errors import (DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError) from setuptools.depends import Require -from setuptools.compat import numeric_types, basestring +from setuptools.compat import basestring, PY2 +from setuptools import windows_support import pkg_resources +packaging = pkg_resources.packaging + + def _get_unpatched(cls): """Protect against re-patching the distutils if reloaded @@ -31,6 +37,27 @@ def _get_unpatched(cls): _Distribution = _get_unpatched(_Distribution) +def _patch_distribution_metadata_write_pkg_info(): + """ + Workaround issue #197 - Python 3 prior to 3.2.2 uses an environment-local + encoding to save the pkg_info. Monkey-patch its write_pkg_info method to + correct this undesirable behavior. + """ + environment_local = (3,) <= sys.version_info[:3] < (3, 2, 2) + if not environment_local: + return + + # from Python 3.4 + def write_pkg_info(self, base_dir): + """Write the PKG-INFO file into the release tree. + """ + with open(os.path.join(base_dir, 'PKG-INFO'), 'w', + encoding='UTF-8') as pkg_info: + self.write_pkg_file(pkg_info) + + distutils.dist.DistributionMetadata.write_pkg_info = write_pkg_info +_patch_distribution_metadata_write_pkg_info() + sequence = tuple, list def check_importable(dist, attr, value): @@ -104,8 +131,7 @@ def check_entry_points(dist, attr, value): """Verify that entry_points map is parseable""" try: pkg_resources.EntryPoint.parse_map(value) - except ValueError: - e = sys.exc_info()[1] + except ValueError as e: raise DistutilsSetupError(e) def check_test_suite(dist, attr, value): @@ -236,15 +262,36 @@ class Distribution(_Distribution): self.dependency_links = attrs.pop('dependency_links', []) assert_string_list(self,'dependency_links',self.dependency_links) if attrs and 'setup_requires' in attrs: - self.fetch_build_eggs(attrs.pop('setup_requires')) + self.fetch_build_eggs(attrs['setup_requires']) for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): if not hasattr(self,ep.name): setattr(self,ep.name,None) _Distribution.__init__(self,attrs) - if isinstance(self.metadata.version, numeric_types): + if isinstance(self.metadata.version, numbers.Number): # Some people apparently take "version number" too literally :) self.metadata.version = str(self.metadata.version) + if self.metadata.version is not None: + try: + ver = packaging.version.Version(self.metadata.version) + normalized_version = str(ver) + if self.metadata.version != normalized_version: + warnings.warn( + "The version specified requires normalization, " + "consider using '%s' instead of '%s'." % ( + normalized_version, + self.metadata.version, + ) + ) + self.metadata.version = normalized_version + except (packaging.version.InvalidVersion, TypeError): + warnings.warn( + "The version specified (%r) is an invalid version, this " + "may not work as expected with newer versions of " + "setuptools, pip, and PyPI. Please see PEP 440 for more " + "details." % self.metadata.version + ) + def parse_command_line(self): """Process features after parsing command line options""" result = _Distribution.parse_command_line(self) @@ -258,12 +305,13 @@ class Distribution(_Distribution): def fetch_build_eggs(self, requires): """Resolve pre-setup requirements""" - from pkg_resources import working_set, parse_requirements - for dist in working_set.resolve( - parse_requirements(requires), installer=self.fetch_build_egg, - replace_conflicting=True - ): - working_set.add(dist, replace=True) + resolved_dists = pkg_resources.working_set.resolve( + pkg_resources.parse_requirements(requires), + installer=self.fetch_build_egg, + replace_conflicting=True, + ) + for dist in resolved_dists: + pkg_resources.working_set.add(dist, replace=True) def finalize_options(self): _Distribution.finalize_options(self) @@ -281,6 +329,21 @@ class Distribution(_Distribution): else: self.convert_2to3_doctests = [] + def get_egg_cache_dir(self): + egg_cache_dir = os.path.join(os.curdir, '.eggs') + if not os.path.exists(egg_cache_dir): + os.mkdir(egg_cache_dir) + windows_support.hide_file(egg_cache_dir) + readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt') + with open(readme_txt_filename, 'w') as f: + f.write('This directory contains eggs that were downloaded ' + 'by setuptools to build, test, and run plug-ins.\n\n') + f.write('This directory caches those eggs to prevent ' + 'repeated downloads.\n\n') + f.write('However, it is safe to delete this directory.\n\n') + + return egg_cache_dir + def fetch_build_egg(self, req): """Fetch an egg needed for building""" @@ -304,8 +367,9 @@ class Distribution(_Distribution): if 'find_links' in opts: links = opts['find_links'][1].split() + links opts['find_links'] = ('setup', links) + install_dir = self.get_egg_cache_dir() cmd = easy_install( - dist, args=["x"], install_dir=os.curdir, exclude_scripts=True, + dist, args=["x"], install_dir=install_dir, exclude_scripts=True, always_copy=False, build_directory=None, editable=False, upgrade=False, multi_version=True, no_report=True, user=False ) @@ -369,7 +433,8 @@ class Distribution(_Distribution): def print_commands(self): for ep in pkg_resources.iter_entry_points('distutils.commands'): if ep.name not in self.cmdclass: - cmdclass = ep.load(False) # don't require extras, we're not running + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() self.cmdclass[ep.name] = cmdclass return _Distribution.print_commands(self) @@ -608,7 +673,7 @@ class Distribution(_Distribution): """ import sys - if sys.version_info < (3,) or self.help_commands: + if PY2 or self.help_commands: return _Distribution.handle_display_options(self, option_order) # Stdout may be StringIO (e.g. in tests) diff --git a/awx/lib/site-packages/setuptools/extension.py b/awx/lib/site-packages/setuptools/extension.py index d7892d3d9f..8178ed33d7 100644 --- a/awx/lib/site-packages/setuptools/extension.py +++ b/awx/lib/site-packages/setuptools/extension.py @@ -1,11 +1,17 @@ import sys +import re +import functools import distutils.core +import distutils.errors import distutils.extension -from setuptools.dist import _get_unpatched +from .dist import _get_unpatched +from . import msvc9_support _Extension = _get_unpatched(distutils.core.Extension) +msvc9_support.patch_for_specialized_compiler() + def have_pyrex(): """ Return True if Cython or Pyrex can be imported. @@ -26,16 +32,21 @@ class Extension(_Extension): def __init__(self, *args, **kw): _Extension.__init__(self, *args, **kw) - if not have_pyrex(): - self._convert_pyx_sources_to_c() + self._convert_pyx_sources_to_lang() - def _convert_pyx_sources_to_c(self): - "convert .pyx extensions to .c" - def pyx_to_c(source): - if source.endswith('.pyx'): - source = source[:-4] + '.c' - return source - self.sources = list(map(pyx_to_c, self.sources)) + def _convert_pyx_sources_to_lang(self): + """ + Replace sources with .pyx extensions to sources with the target + language extension. This mechanism allows language authors to supply + pre-converted sources but to prefer the .pyx sources. + """ + if have_pyrex(): + # the build has Cython, so allow it to compile the .pyx files + return + lang = self.language or '' + target_ext = '.cpp' if lang.lower() == 'c++' else '.c' + sub = functools.partial(re.sub, '.pyx$', target_ext) + self.sources = list(map(sub, self.sources)) class Library(Extension): """Just like a regular Extension, but built as a library instead""" diff --git a/awx/lib/site-packages/setuptools/msvc9_support.py b/awx/lib/site-packages/setuptools/msvc9_support.py new file mode 100644 index 0000000000..a69c7474c8 --- /dev/null +++ b/awx/lib/site-packages/setuptools/msvc9_support.py @@ -0,0 +1,63 @@ +try: + import distutils.msvc9compiler +except ImportError: + pass + +unpatched = dict() + +def patch_for_specialized_compiler(): + """ + Patch functions in distutils.msvc9compiler to use the standalone compiler + build for Python (Windows only). Fall back to original behavior when the + standalone compiler is not available. + """ + if 'distutils' not in globals(): + # The module isn't available to be patched + return + + if unpatched: + # Already patched + return + + unpatched.update(vars(distutils.msvc9compiler)) + + distutils.msvc9compiler.find_vcvarsall = find_vcvarsall + distutils.msvc9compiler.query_vcvarsall = query_vcvarsall + +def find_vcvarsall(version): + Reg = distutils.msvc9compiler.Reg + VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' + key = VC_BASE % ('', version) + try: + # Per-user installs register the compiler path here + productdir = Reg.get_value(key, "installdir") + except KeyError: + try: + # All-user installs on a 64-bit system register here + key = VC_BASE % ('Wow6432Node\\', version) + productdir = Reg.get_value(key, "installdir") + except KeyError: + productdir = None + + if productdir: + import os + vcvarsall = os.path.join(productdir, "vcvarsall.bat") + if os.path.isfile(vcvarsall): + return vcvarsall + + return unpatched['find_vcvarsall'](version) + +def query_vcvarsall(version, *args, **kwargs): + try: + return unpatched['query_vcvarsall'](version, *args, **kwargs) + except distutils.errors.DistutilsPlatformError as exc: + if exc and "vcvarsall.bat" in exc.args[0]: + message = 'Microsoft Visual C++ %0.1f is required (%s).' % (version, exc.args[0]) + if int(version) == 9: + # This redirection link is maintained by Microsoft. + # Contact vspython@microsoft.com if it needs updating. + raise distutils.errors.DistutilsPlatformError( + message + ' Get it from http://aka.ms/vcpython27' + ) + raise distutils.errors.DistutilsPlatformError(message) + raise diff --git a/awx/lib/site-packages/setuptools/package_index.py b/awx/lib/site-packages/setuptools/package_index.py index 167c34e5b4..5ed19130d7 100644 --- a/awx/lib/site-packages/setuptools/package_index.py +++ b/awx/lib/site-packages/setuptools/package_index.py @@ -632,16 +632,15 @@ class PackageIndex(Environment): shutil.copy2(filename, dst) filename=dst - file = open(os.path.join(tmpdir, 'setup.py'), 'w') - file.write( - "from setuptools import setup\n" - "setup(name=%r, version=%r, py_modules=[%r])\n" - % ( - dists[0].project_name, dists[0].version, - os.path.splitext(basename)[0] + with open(os.path.join(tmpdir, 'setup.py'), 'w') as file: + file.write( + "from setuptools import setup\n" + "setup(name=%r, version=%r, py_modules=[%r])\n" + % ( + dists[0].project_name, dists[0].version, + os.path.splitext(basename)[0] + ) ) - ) - file.close() return filename elif match: @@ -660,7 +659,7 @@ class PackageIndex(Environment): def _download_to(self, url, filename): self.info("Downloading %s", url) # Download the file - fp, tfp, info = None, None, None + fp, info = None, None try: checker = HashChecker.from_url(url) fp = self.open_url(strip_fragment(url)) @@ -677,21 +676,20 @@ class PackageIndex(Environment): sizes = get_all_headers(headers, 'Content-Length') size = max(map(int, sizes)) self.reporthook(url, filename, blocknum, bs, size) - tfp = open(filename,'wb') - while True: - block = fp.read(bs) - if block: - checker.feed(block) - tfp.write(block) - blocknum += 1 - self.reporthook(url, filename, blocknum, bs, size) - else: - break - self.check_hash(checker, filename, tfp) + with open(filename,'wb') as tfp: + while True: + block = fp.read(bs) + if block: + checker.feed(block) + tfp.write(block) + blocknum += 1 + self.reporthook(url, filename, blocknum, bs, size) + else: + break + self.check_hash(checker, filename, tfp) return headers finally: if fp: fp.close() - if tfp: tfp.close() def reporthook(self, url, filename, blocknum, blksize, size): pass # no-op @@ -701,25 +699,21 @@ class PackageIndex(Environment): return local_open(url) try: return open_with_auth(url, self.opener) - except (ValueError, httplib.InvalidURL): - v = sys.exc_info()[1] + except (ValueError, httplib.InvalidURL) as v: msg = ' '.join([str(arg) for arg in v.args]) if warning: self.warn(warning, msg) else: raise DistutilsError('%s %s' % (url, msg)) - except urllib2.HTTPError: - v = sys.exc_info()[1] + except urllib2.HTTPError as v: return v - except urllib2.URLError: - v = sys.exc_info()[1] + except urllib2.URLError as v: if warning: self.warn(warning, v.reason) else: raise DistutilsError("Download error for %s: %s" % (url, v.reason)) - except httplib.BadStatusLine: - v = sys.exc_info()[1] + except httplib.BadStatusLine as v: if warning: self.warn(warning, v.line) else: @@ -728,8 +722,7 @@ class PackageIndex(Environment): 'down, %s' % (url, v.line) ) - except httplib.HTTPException: - v = sys.exc_info()[1] + except httplib.HTTPException as v: if warning: self.warn(warning, v) else: @@ -1040,9 +1033,8 @@ def local_open(url): files = [] for f in os.listdir(filename): if f=='index.html': - fp = open(os.path.join(filename,f),'r') - body = fp.read() - fp.close() + with open(os.path.join(filename,f),'r') as fp: + body = fp.read() break elif os.path.isdir(os.path.join(filename,f)): f+='/' diff --git a/awx/lib/site-packages/setuptools/py31compat.py b/awx/lib/site-packages/setuptools/py31compat.py index dbb324b0e3..c487ac0439 100644 --- a/awx/lib/site-packages/setuptools/py31compat.py +++ b/awx/lib/site-packages/setuptools/py31compat.py @@ -1,3 +1,6 @@ +import sys +import unittest + __all__ = ['get_config_vars', 'get_path'] try: @@ -9,3 +12,41 @@ except ImportError: if name not in ('platlib', 'purelib'): raise ValueError("Name must be purelib or platlib") return get_python_lib(name=='platlib') + +try: + # Python >=3.2 + from tempfile import TemporaryDirectory +except ImportError: + import shutil + import tempfile + class TemporaryDirectory(object): + """" + Very simple temporary directory context manager. + Will try to delete afterward, but will also ignore OS and similar + errors on deletion. + """ + def __init__(self): + self.name = None # Handle mkdtemp raising an exception + self.name = tempfile.mkdtemp() + + def __enter__(self): + return self.name + + def __exit__(self, exctype, excvalue, exctrace): + try: + shutil.rmtree(self.name, True) + except OSError: #removal errors are not the only possible + pass + self.name = None + + +unittest_main = unittest.main + +_PY31 = (3, 1) <= sys.version_info[:2] < (3, 2) +if _PY31: + # on Python 3.1, translate testRunner==None to TextTestRunner + # for compatibility with Python 2.6, 2.7, and 3.2+ + def unittest_main(*args, **kwargs): + if 'testRunner' in kwargs and kwargs['testRunner'] is None: + kwargs['testRunner'] = unittest.TextTestRunner + return unittest.main(*args, **kwargs) diff --git a/awx/lib/site-packages/setuptools/sandbox.py b/awx/lib/site-packages/setuptools/sandbox.py index 042c595897..83283ca3dc 100644 --- a/awx/lib/site-packages/setuptools/sandbox.py +++ b/awx/lib/site-packages/setuptools/sandbox.py @@ -5,6 +5,8 @@ import operator import functools import itertools import re +import contextlib +import pickle import pkg_resources @@ -20,58 +22,221 @@ _open = open from distutils.errors import DistutilsError from pkg_resources import working_set -from setuptools.compat import builtins, execfile +from setuptools import compat +from setuptools.compat import builtins __all__ = [ "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup", ] +def _execfile(filename, globals, locals=None): + """ + Python 3 implementation of execfile. + """ + mode = 'rb' + # Python 2.6 compile requires LF for newlines, so use deprecated + # Universal newlines support. + if sys.version_info < (2, 7): + mode += 'U' + with open(filename, mode) as stream: + script = stream.read() + if locals is None: + locals = globals + code = compile(script, filename, 'exec') + exec(code, globals, locals) + + +@contextlib.contextmanager +def save_argv(): + saved = sys.argv[:] + try: + yield saved + finally: + sys.argv[:] = saved + + +@contextlib.contextmanager +def save_path(): + saved = sys.path[:] + try: + yield saved + finally: + sys.path[:] = saved + + +@contextlib.contextmanager +def override_temp(replacement): + """ + Monkey-patch tempfile.tempdir with replacement, ensuring it exists + """ + if not os.path.isdir(replacement): + os.makedirs(replacement) + + saved = tempfile.tempdir + + tempfile.tempdir = replacement + + try: + yield + finally: + tempfile.tempdir = saved + + +@contextlib.contextmanager +def pushd(target): + saved = os.getcwd() + os.chdir(target) + try: + yield saved + finally: + os.chdir(saved) + + +class UnpickleableException(Exception): + """ + An exception representing another Exception that could not be pickled. + """ + @classmethod + def dump(cls, type, exc): + """ + Always return a dumped (pickled) type and exc. If exc can't be pickled, + wrap it in UnpickleableException first. + """ + try: + return pickle.dumps(type), pickle.dumps(exc) + except Exception: + return cls.dump(cls, cls(repr(exc))) + + +class ExceptionSaver: + """ + A Context Manager that will save an exception, serialized, and restore it + later. + """ + def __enter__(self): + return self + + def __exit__(self, type, exc, tb): + if not exc: + return + + # dump the exception + self._saved = UnpickleableException.dump(type, exc) + self._tb = tb + + # suppress the exception + return True + + def resume(self): + "restore and re-raise any exception" + + if '_saved' not in vars(self): + return + + type, exc = map(pickle.loads, self._saved) + compat.reraise(type, exc, self._tb) + + +@contextlib.contextmanager +def save_modules(): + """ + Context in which imported modules are saved. + + Translates exceptions internal to the context into the equivalent exception + outside the context. + """ + saved = sys.modules.copy() + with ExceptionSaver() as saved_exc: + yield saved + + sys.modules.update(saved) + # remove any modules imported since + del_modules = ( + mod_name for mod_name in sys.modules + if mod_name not in saved + # exclude any encodings modules. See #285 + and not mod_name.startswith('encodings.') + ) + _clear_modules(del_modules) + + saved_exc.resume() + + +def _clear_modules(module_names): + for mod_name in list(module_names): + del sys.modules[mod_name] + + +@contextlib.contextmanager +def save_pkg_resources_state(): + saved = pkg_resources.__getstate__() + try: + yield saved + finally: + pkg_resources.__setstate__(saved) + + +@contextlib.contextmanager +def setup_context(setup_dir): + temp_dir = os.path.join(setup_dir, 'temp') + with save_pkg_resources_state(): + with save_modules(): + hide_setuptools() + with save_path(): + with save_argv(): + with override_temp(temp_dir): + with pushd(setup_dir): + # ensure setuptools commands are available + __import__('setuptools') + yield + + +def _needs_hiding(mod_name): + """ + >>> _needs_hiding('setuptools') + True + >>> _needs_hiding('pkg_resources') + True + >>> _needs_hiding('setuptools_plugin') + False + >>> _needs_hiding('setuptools.__init__') + True + >>> _needs_hiding('distutils') + True + """ + pattern = re.compile('(setuptools|pkg_resources|distutils)(\.|$)') + return bool(pattern.match(mod_name)) + + +def hide_setuptools(): + """ + Remove references to setuptools' modules from sys.modules to allow the + invocation to import the most appropriate setuptools. This technique is + necessary to avoid issues such as #315 where setuptools upgrading itself + would fail to find a function declared in the metadata. + """ + modules = filter(_needs_hiding, sys.modules) + _clear_modules(modules) + + def run_setup(setup_script, args): """Run a distutils setup script, sandboxed in its directory""" - old_dir = os.getcwd() - save_argv = sys.argv[:] - save_path = sys.path[:] setup_dir = os.path.abspath(os.path.dirname(setup_script)) - temp_dir = os.path.join(setup_dir,'temp') - if not os.path.isdir(temp_dir): os.makedirs(temp_dir) - save_tmp = tempfile.tempdir - save_modules = sys.modules.copy() - pr_state = pkg_resources.__getstate__() - try: - tempfile.tempdir = temp_dir - os.chdir(setup_dir) + with setup_context(setup_dir): try: sys.argv[:] = [setup_script]+list(args) sys.path.insert(0, setup_dir) # reset to include setup dir, w/clean callback list working_set.__init__() working_set.callbacks.append(lambda dist:dist.activate()) - DirectorySandbox(setup_dir).run( - lambda: execfile( - "setup.py", - {'__file__':setup_script, '__name__':'__main__'} - ) - ) - except SystemExit: - v = sys.exc_info()[1] + def runner(): + ns = dict(__file__=setup_script, __name__='__main__') + _execfile(setup_script, ns) + DirectorySandbox(setup_dir).run(runner) + except SystemExit as v: if v.args and v.args[0]: raise # Normal exit, just return - finally: - pkg_resources.__setstate__(pr_state) - sys.modules.update(save_modules) - # remove any modules imported within the sandbox - del_modules = [ - mod_name for mod_name in sys.modules - if mod_name not in save_modules - # exclude any encodings modules. See #285 - and not mod_name.startswith('encodings.') - ] - list(map(sys.modules.__delitem__, del_modules)) - os.chdir(old_dir) - sys.path[:] = save_path - sys.argv[:] = save_argv - tempfile.tempdir = save_tmp class AbstractSandbox: @@ -268,7 +433,7 @@ class DirectorySandbox(AbstractSandbox): self._violation(operation, src, dst, *args, **kw) return (src,dst) - def open(self, file, flags, mode=0x1FF, *args, **kw): # 0777 + def open(self, file, flags, mode=0o777, *args, **kw): """Called for low-level os.open()""" if flags & WRITE_FLAGS and not self._ok(file): self._violation("os.open", file, flags, mode, *args, **kw) diff --git a/awx/lib/site-packages/setuptools/script (dev).tmpl b/awx/lib/site-packages/setuptools/script (dev).tmpl new file mode 100644 index 0000000000..d58b1bb5bf --- /dev/null +++ b/awx/lib/site-packages/setuptools/script (dev).tmpl @@ -0,0 +1,5 @@ +# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').require(%(spec)r) +__file__ = %(dev_path)r +exec(compile(open(__file__).read(), __file__, 'exec')) diff --git a/awx/lib/site-packages/setuptools/script.tmpl b/awx/lib/site-packages/setuptools/script.tmpl new file mode 100644 index 0000000000..ff5efbcab3 --- /dev/null +++ b/awx/lib/site-packages/setuptools/script.tmpl @@ -0,0 +1,3 @@ +# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').run_script(%(spec)r, %(script_name)r) diff --git a/awx/lib/site-packages/setuptools/site-patch.py b/awx/lib/site-packages/setuptools/site-patch.py index a7166f1407..c2168019ad 100644 --- a/awx/lib/site-packages/setuptools/site-patch.py +++ b/awx/lib/site-packages/setuptools/site-patch.py @@ -1,5 +1,6 @@ def __boot(): - import sys, os, os.path + import sys + import os PYTHONPATH = os.environ.get('PYTHONPATH') if PYTHONPATH is None or (sys.platform=='win32' and not PYTHONPATH): PYTHONPATH = [] @@ -49,13 +50,13 @@ def __boot(): addsitedir(item) sys.__egginsert += oldpos # restore effective old position - - d,nd = makepath(stdpath[0]) + + d, nd = makepath(stdpath[0]) insert_at = None new_path = [] for item in sys.path: - p,np = makepath(item) + p, np = makepath(item) if np==nd and insert_at is None: # We've hit the first 'system' path entry, so added entries go here @@ -67,17 +68,9 @@ def __boot(): # new path after the insert point, back-insert it new_path.insert(insert_at, item) insert_at += 1 - + sys.path[:] = new_path -if __name__=='site': +if __name__=='site': __boot() del __boot - - - - - - - - diff --git a/awx/lib/site-packages/setuptools/ssl_support.py b/awx/lib/site-packages/setuptools/ssl_support.py index 7b5f429f8f..cc7db067e9 100644 --- a/awx/lib/site-packages/setuptools/ssl_support.py +++ b/awx/lib/site-packages/setuptools/ssl_support.py @@ -178,12 +178,19 @@ class VerifyingHTTPSConn(HTTPSConnection): if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None): self.sock = sock self._tunnel() + # http://bugs.python.org/issue7776: Python>=3.4.1 and >=2.7.7 + # change self.host to mean the proxy server host when tunneling is + # being used. Adapt, since we are interested in the destination + # host for the match_hostname() comparison. + actual_host = self._tunnel_host + else: + actual_host = self.host self.sock = ssl.wrap_socket( sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle ) try: - match_hostname(self.sock.getpeercert(), self.host) + match_hostname(self.sock.getpeercert(), actual_host) except CertificateError: self.sock.shutdown(socket.SHUT_RDWR) self.sock.close() diff --git a/awx/lib/site-packages/setuptools/tests/__init__.py b/awx/lib/site-packages/setuptools/tests/__init__.py index b5328ce67a..b8a29cbac2 100644 --- a/awx/lib/site-packages/setuptools/tests/__init__.py +++ b/awx/lib/site-packages/setuptools/tests/__init__.py @@ -1,8 +1,6 @@ """Tests for the 'setuptools' package""" import sys import os -import unittest -from setuptools.tests import doctest import distutils.core import distutils.cmd from distutils.errors import DistutilsOptionError, DistutilsPlatformError @@ -11,24 +9,13 @@ from distutils.core import Extension from distutils.version import LooseVersion from setuptools.compat import func_code -from setuptools.compat import func_code +import pytest + import setuptools.dist import setuptools.depends as dep from setuptools import Feature from setuptools.depends import Require -def additional_tests(): - import doctest, unittest - suite = unittest.TestSuite(( - doctest.DocFileSuite( - os.path.join('tests', 'api_tests.txt'), - optionflags=doctest.ELLIPSIS, package='pkg_resources', - ), - )) - if sys.platform == 'win32': - suite.addTest(doctest.DocFileSuite('win_script_wrapper.txt')) - return suite - def makeSetup(**args): """Return distribution from 'setup(**args)', without executing commands""" @@ -43,7 +30,12 @@ def makeSetup(**args): distutils.core._setup_stop_after = None -class DependsTests(unittest.TestCase): +needs_bytecode = pytest.mark.skipif( + not hasattr(dep, 'get_module_constant'), + reason="bytecode support not available", +) + +class TestDepends: def testExtractConst(self): if not hasattr(dep, 'extract_constant'): @@ -56,86 +48,77 @@ class DependsTests(unittest.TestCase): y = z fc = func_code(f1) + # unrecognized name - self.assertEqual(dep.extract_constant(fc,'q', -1), None) + assert dep.extract_constant(fc,'q', -1) is None # constant assigned - self.assertEqual(dep.extract_constant(fc,'x', -1), "test") + dep.extract_constant(fc,'x', -1) == "test" # expression assigned - self.assertEqual(dep.extract_constant(fc,'y', -1), -1) + dep.extract_constant(fc,'y', -1) == -1 # recognized name, not assigned - self.assertEqual(dep.extract_constant(fc,'z', -1), None) + dep.extract_constant(fc,'z', -1) is None def testFindModule(self): - self.assertRaises(ImportError, dep.find_module, 'no-such.-thing') - self.assertRaises(ImportError, dep.find_module, 'setuptools.non-existent') + with pytest.raises(ImportError): + dep.find_module('no-such.-thing') + with pytest.raises(ImportError): + dep.find_module('setuptools.non-existent') f,p,i = dep.find_module('setuptools.tests') f.close() + @needs_bytecode def testModuleExtract(self): - if not hasattr(dep, 'get_module_constant'): - # skip on non-bytecode platforms - return - from email import __version__ - self.assertEqual( - dep.get_module_constant('email','__version__'), __version__ - ) - self.assertEqual( - dep.get_module_constant('sys','version'), sys.version - ) - self.assertEqual( - dep.get_module_constant('setuptools.tests','__doc__'),__doc__ - ) + assert dep.get_module_constant('email','__version__') == __version__ + assert dep.get_module_constant('sys','version') == sys.version + assert dep.get_module_constant('setuptools.tests','__doc__') == __doc__ + @needs_bytecode def testRequire(self): - if not hasattr(dep, 'extract_constant'): - # skip on non-bytecode platformsh - return - req = Require('Email','1.0.3','email') - self.assertEqual(req.name, 'Email') - self.assertEqual(req.module, 'email') - self.assertEqual(req.requested_version, '1.0.3') - self.assertEqual(req.attribute, '__version__') - self.assertEqual(req.full_name(), 'Email-1.0.3') + assert req.name == 'Email' + assert req.module == 'email' + assert req.requested_version == '1.0.3' + assert req.attribute == '__version__' + assert req.full_name() == 'Email-1.0.3' from email import __version__ - self.assertEqual(req.get_version(), __version__) - self.assertTrue(req.version_ok('1.0.9')) - self.assertTrue(not req.version_ok('0.9.1')) - self.assertTrue(not req.version_ok('unknown')) + assert req.get_version() == __version__ + assert req.version_ok('1.0.9') + assert not req.version_ok('0.9.1') + assert not req.version_ok('unknown') - self.assertTrue(req.is_present()) - self.assertTrue(req.is_current()) + assert req.is_present() + assert req.is_current() req = Require('Email 3000','03000','email',format=LooseVersion) - self.assertTrue(req.is_present()) - self.assertTrue(not req.is_current()) - self.assertTrue(not req.version_ok('unknown')) + assert req.is_present() + assert not req.is_current() + assert not req.version_ok('unknown') req = Require('Do-what-I-mean','1.0','d-w-i-m') - self.assertTrue(not req.is_present()) - self.assertTrue(not req.is_current()) + assert not req.is_present() + assert not req.is_current() req = Require('Tests', None, 'tests', homepage="http://example.com") - self.assertEqual(req.format, None) - self.assertEqual(req.attribute, None) - self.assertEqual(req.requested_version, None) - self.assertEqual(req.full_name(), 'Tests') - self.assertEqual(req.homepage, 'http://example.com') + assert req.format is None + assert req.attribute is None + assert req.requested_version is None + assert req.full_name() == 'Tests' + assert req.homepage == 'http://example.com' paths = [os.path.dirname(p) for p in __path__] - self.assertTrue(req.is_present(paths)) - self.assertTrue(req.is_current(paths)) + assert req.is_present(paths) + assert req.is_current(paths) -class DistroTests(unittest.TestCase): +class TestDistro: - def setUp(self): + def setup_method(self, method): self.e1 = Extension('bar.ext',['bar.c']) self.e2 = Extension('c.y', ['y.c']) @@ -147,21 +130,21 @@ class DistroTests(unittest.TestCase): ) def testDistroType(self): - self.assertTrue(isinstance(self.dist,setuptools.dist.Distribution)) + assert isinstance(self.dist,setuptools.dist.Distribution) def testExcludePackage(self): self.dist.exclude_package('a') - self.assertEqual(self.dist.packages, ['b','c']) + assert self.dist.packages == ['b','c'] self.dist.exclude_package('b') - self.assertEqual(self.dist.packages, ['c']) - self.assertEqual(self.dist.py_modules, ['x']) - self.assertEqual(self.dist.ext_modules, [self.e1, self.e2]) + assert self.dist.packages == ['c'] + assert self.dist.py_modules == ['x'] + assert self.dist.ext_modules == [self.e1, self.e2] self.dist.exclude_package('c') - self.assertEqual(self.dist.packages, []) - self.assertEqual(self.dist.py_modules, ['x']) - self.assertEqual(self.dist.ext_modules, [self.e1]) + assert self.dist.packages == [] + assert self.dist.py_modules == ['x'] + assert self.dist.ext_modules == [self.e1] # test removals from unspecified options makeSetup().exclude_package('x') @@ -169,21 +152,21 @@ class DistroTests(unittest.TestCase): def testIncludeExclude(self): # remove an extension self.dist.exclude(ext_modules=[self.e1]) - self.assertEqual(self.dist.ext_modules, [self.e2]) + assert self.dist.ext_modules == [self.e2] # add it back in self.dist.include(ext_modules=[self.e1]) - self.assertEqual(self.dist.ext_modules, [self.e2, self.e1]) + assert self.dist.ext_modules == [self.e2, self.e1] # should not add duplicate self.dist.include(ext_modules=[self.e1]) - self.assertEqual(self.dist.ext_modules, [self.e2, self.e1]) + assert self.dist.ext_modules == [self.e2, self.e1] def testExcludePackages(self): self.dist.exclude(packages=['c','b','a']) - self.assertEqual(self.dist.packages, []) - self.assertEqual(self.dist.py_modules, ['x']) - self.assertEqual(self.dist.ext_modules, [self.e1]) + assert self.dist.packages == [] + assert self.dist.py_modules == ['x'] + assert self.dist.ext_modules == [self.e1] def testEmpty(self): dist = makeSetup() @@ -192,49 +175,41 @@ class DistroTests(unittest.TestCase): dist.exclude(packages=['a'], py_modules=['b'], ext_modules=[self.e2]) def testContents(self): - self.assertTrue(self.dist.has_contents_for('a')) + assert self.dist.has_contents_for('a') self.dist.exclude_package('a') - self.assertTrue(not self.dist.has_contents_for('a')) + assert not self.dist.has_contents_for('a') - self.assertTrue(self.dist.has_contents_for('b')) + assert self.dist.has_contents_for('b') self.dist.exclude_package('b') - self.assertTrue(not self.dist.has_contents_for('b')) + assert not self.dist.has_contents_for('b') - self.assertTrue(self.dist.has_contents_for('c')) + assert self.dist.has_contents_for('c') self.dist.exclude_package('c') - self.assertTrue(not self.dist.has_contents_for('c')) + assert not self.dist.has_contents_for('c') def testInvalidIncludeExclude(self): - self.assertRaises(DistutilsSetupError, - self.dist.include, nonexistent_option='x' - ) - self.assertRaises(DistutilsSetupError, - self.dist.exclude, nonexistent_option='x' - ) - self.assertRaises(DistutilsSetupError, - self.dist.include, packages={'x':'y'} - ) - self.assertRaises(DistutilsSetupError, - self.dist.exclude, packages={'x':'y'} - ) - self.assertRaises(DistutilsSetupError, - self.dist.include, ext_modules={'x':'y'} - ) - self.assertRaises(DistutilsSetupError, - self.dist.exclude, ext_modules={'x':'y'} - ) + with pytest.raises(DistutilsSetupError): + self.dist.include(nonexistent_option='x') + with pytest.raises(DistutilsSetupError): + self.dist.exclude(nonexistent_option='x') + with pytest.raises(DistutilsSetupError): + self.dist.include(packages={'x':'y'}) + with pytest.raises(DistutilsSetupError): + self.dist.exclude(packages={'x':'y'}) + with pytest.raises(DistutilsSetupError): + self.dist.include(ext_modules={'x':'y'}) + with pytest.raises(DistutilsSetupError): + self.dist.exclude(ext_modules={'x':'y'}) - self.assertRaises(DistutilsSetupError, - self.dist.include, package_dir=['q'] - ) - self.assertRaises(DistutilsSetupError, - self.dist.exclude, package_dir=['q'] - ) + with pytest.raises(DistutilsSetupError): + self.dist.include(package_dir=['q']) + with pytest.raises(DistutilsSetupError): + self.dist.exclude(package_dir=['q']) -class FeatureTests(unittest.TestCase): +class TestFeatures: - def setUp(self): + def setup_method(self, method): self.req = Require('Distutils','1.0.3','distutils') self.dist = makeSetup( features={ @@ -256,80 +231,75 @@ class FeatureTests(unittest.TestCase): ) def testDefaults(self): - self.assertTrue(not - Feature( - "test",standard=True,remove='x',available=False - ).include_by_default() - ) - self.assertTrue( - Feature("test",standard=True,remove='x').include_by_default() - ) + assert not Feature( + "test",standard=True,remove='x',available=False + ).include_by_default() + assert Feature("test",standard=True,remove='x').include_by_default() # Feature must have either kwargs, removes, or require_features - self.assertRaises(DistutilsSetupError, Feature, "test") + with pytest.raises(DistutilsSetupError): + Feature("test") def testAvailability(self): - self.assertRaises( - DistutilsPlatformError, - self.dist.features['dwim'].include_in, self.dist - ) + with pytest.raises(DistutilsPlatformError): + self.dist.features['dwim'].include_in(self.dist) def testFeatureOptions(self): dist = self.dist - self.assertTrue( + assert ( ('with-dwim',None,'include DWIM') in dist.feature_options ) - self.assertTrue( + assert ( ('without-dwim',None,'exclude DWIM (default)') in dist.feature_options ) - self.assertTrue( + assert ( ('with-bar',None,'include bar (default)') in dist.feature_options ) - self.assertTrue( + assert ( ('without-bar',None,'exclude bar') in dist.feature_options ) - self.assertEqual(dist.feature_negopt['without-foo'],'with-foo') - self.assertEqual(dist.feature_negopt['without-bar'],'with-bar') - self.assertEqual(dist.feature_negopt['without-dwim'],'with-dwim') - self.assertTrue(not 'without-baz' in dist.feature_negopt) + assert dist.feature_negopt['without-foo'] == 'with-foo' + assert dist.feature_negopt['without-bar'] == 'with-bar' + assert dist.feature_negopt['without-dwim'] == 'with-dwim' + assert (not 'without-baz' in dist.feature_negopt) def testUseFeatures(self): dist = self.dist - self.assertEqual(dist.with_foo,1) - self.assertEqual(dist.with_bar,0) - self.assertEqual(dist.with_baz,1) - self.assertTrue(not 'bar_et' in dist.py_modules) - self.assertTrue(not 'pkg.bar' in dist.packages) - self.assertTrue('pkg.baz' in dist.packages) - self.assertTrue('scripts/baz_it' in dist.scripts) - self.assertTrue(('libfoo','foo/foofoo.c') in dist.libraries) - self.assertEqual(dist.ext_modules,[]) - self.assertEqual(dist.require_features, [self.req]) + assert dist.with_foo == 1 + assert dist.with_bar == 0 + assert dist.with_baz == 1 + assert (not 'bar_et' in dist.py_modules) + assert (not 'pkg.bar' in dist.packages) + assert ('pkg.baz' in dist.packages) + assert ('scripts/baz_it' in dist.scripts) + assert (('libfoo','foo/foofoo.c') in dist.libraries) + assert dist.ext_modules == [] + assert dist.require_features == [self.req] # If we ask for bar, it should fail because we explicitly disabled # it on the command line - self.assertRaises(DistutilsOptionError, dist.include_feature, 'bar') + with pytest.raises(DistutilsOptionError): + dist.include_feature('bar') def testFeatureWithInvalidRemove(self): - self.assertRaises( - SystemExit, makeSetup, features = {'x':Feature('x', remove='y')} - ) + with pytest.raises(SystemExit): + makeSetup(features={'x':Feature('x', remove='y')}) -class TestCommandTests(unittest.TestCase): +class TestCommandTests: def testTestIsCommand(self): test_cmd = makeSetup().get_command_obj('test') - self.assertTrue(isinstance(test_cmd, distutils.cmd.Command)) + assert (isinstance(test_cmd, distutils.cmd.Command)) def testLongOptSuiteWNoDefault(self): ts1 = makeSetup(script_args=['test','--test-suite=foo.tests.suite']) ts1 = ts1.get_command_obj('test') ts1.ensure_finalized() - self.assertEqual(ts1.test_suite, 'foo.tests.suite') + assert ts1.test_suite == 'foo.tests.suite' def testDefaultSuite(self): ts2 = makeSetup(test_suite='bar.tests.suite').get_command_obj('test') ts2.ensure_finalized() - self.assertEqual(ts2.test_suite, 'bar.tests.suite') + assert ts2.test_suite == 'bar.tests.suite' def testDefaultWModuleOnCmdLine(self): ts3 = makeSetup( @@ -337,16 +307,17 @@ class TestCommandTests(unittest.TestCase): script_args=['test','-m','foo.tests'] ).get_command_obj('test') ts3.ensure_finalized() - self.assertEqual(ts3.test_module, 'foo.tests') - self.assertEqual(ts3.test_suite, 'foo.tests.test_suite') + assert ts3.test_module == 'foo.tests' + assert ts3.test_suite == 'foo.tests.test_suite' def testConflictingOptions(self): ts4 = makeSetup( script_args=['test','-m','bar.tests', '-s','foo.tests.suite'] ).get_command_obj('test') - self.assertRaises(DistutilsOptionError, ts4.ensure_finalized) + with pytest.raises(DistutilsOptionError): + ts4.ensure_finalized() def testNoSuite(self): ts5 = makeSetup().get_command_obj('test') ts5.ensure_finalized() - self.assertEqual(ts5.test_suite, None) + assert ts5.test_suite == None diff --git a/awx/lib/site-packages/setuptools/tests/contexts.py b/awx/lib/site-packages/setuptools/tests/contexts.py new file mode 100644 index 0000000000..4a46176557 --- /dev/null +++ b/awx/lib/site-packages/setuptools/tests/contexts.py @@ -0,0 +1,93 @@ +import tempfile +import os +import shutil +import sys +import contextlib +import site + +from ..compat import StringIO + + +@contextlib.contextmanager +def tempdir(cd=lambda dir:None, **kwargs): + temp_dir = tempfile.mkdtemp(**kwargs) + orig_dir = os.getcwd() + try: + cd(temp_dir) + yield temp_dir + finally: + cd(orig_dir) + shutil.rmtree(temp_dir) + + +@contextlib.contextmanager +def environment(**replacements): + """ + In a context, patch the environment with replacements. Pass None values + to clear the values. + """ + saved = dict( + (key, os.environ[key]) + for key in replacements + if key in os.environ + ) + + # remove values that are null + remove = (key for (key, value) in replacements.items() if value is None) + for key in list(remove): + os.environ.pop(key, None) + replacements.pop(key) + + os.environ.update(replacements) + + try: + yield saved + finally: + for key in replacements: + os.environ.pop(key, None) + os.environ.update(saved) + + +@contextlib.contextmanager +def argv(repl): + old_argv = sys.argv[:] + sys.argv[:] = repl + yield + sys.argv[:] = old_argv + + +@contextlib.contextmanager +def quiet(): + """ + Redirect stdout/stderr to StringIO objects to prevent console output from + distutils commands. + """ + + old_stdout = sys.stdout + old_stderr = sys.stderr + new_stdout = sys.stdout = StringIO() + new_stderr = sys.stderr = StringIO() + try: + yield new_stdout, new_stderr + finally: + new_stdout.seek(0) + new_stderr.seek(0) + sys.stdout = old_stdout + sys.stderr = old_stderr + + +@contextlib.contextmanager +def save_user_site_setting(): + saved = site.ENABLE_USER_SITE + try: + yield saved + finally: + site.ENABLE_USER_SITE = saved + + +@contextlib.contextmanager +def suppress_exceptions(*excs): + try: + yield + except excs: + pass diff --git a/awx/lib/site-packages/setuptools/tests/environment.py b/awx/lib/site-packages/setuptools/tests/environment.py index 476d280ae2..a23c0504e7 100644 --- a/awx/lib/site-packages/setuptools/tests/environment.py +++ b/awx/lib/site-packages/setuptools/tests/environment.py @@ -1,119 +1,10 @@ import os -import zipfile import sys -import tempfile -import unittest -import shutil -import stat import unicodedata from subprocess import Popen as _Popen, PIPE as _PIPE -def _extract(self, member, path=None, pwd=None): - """for zipfile py2.5 borrowed from cpython""" - if not isinstance(member, zipfile.ZipInfo): - member = self.getinfo(member) - - if path is None: - path = os.getcwd() - - return _extract_member(self, member, path, pwd) - - -def _extract_from_zip(self, name, dest_path): - dest_file = open(dest_path, 'wb') - try: - dest_file.write(self.read(name)) - finally: - dest_file.close() - - -def _extract_member(self, member, targetpath, pwd): - """for zipfile py2.5 borrowed from cpython""" - # build the destination pathname, replacing - # forward slashes to platform specific separators. - # Strip trailing path separator, unless it represents the root. - if (targetpath[-1:] in (os.path.sep, os.path.altsep) - and len(os.path.splitdrive(targetpath)[1]) > 1): - targetpath = targetpath[:-1] - - # don't include leading "/" from file name if present - if member.filename[0] == '/': - targetpath = os.path.join(targetpath, member.filename[1:]) - else: - targetpath = os.path.join(targetpath, member.filename) - - targetpath = os.path.normpath(targetpath) - - # Create all upper directories if necessary. - upperdirs = os.path.dirname(targetpath) - if upperdirs and not os.path.exists(upperdirs): - os.makedirs(upperdirs) - - if member.filename[-1] == '/': - if not os.path.isdir(targetpath): - os.mkdir(targetpath) - return targetpath - - _extract_from_zip(self, member.filename, targetpath) - - return targetpath - - -def _remove_dir(target): - - #on windows this seems to a problem - for dir_path, dirs, files in os.walk(target): - os.chmod(dir_path, stat.S_IWRITE) - for filename in files: - os.chmod(os.path.join(dir_path, filename), stat.S_IWRITE) - shutil.rmtree(target) - - -class ZippedEnvironment(unittest.TestCase): - - datafile = None - dataname = None - old_cwd = None - - def setUp(self): - if self.datafile is None or self.dataname is None: - return - - if not os.path.isfile(self.datafile): - self.old_cwd = None - return - - self.old_cwd = os.getcwd() - - self.temp_dir = tempfile.mkdtemp() - zip_file, source, target = [None, None, None] - try: - zip_file = zipfile.ZipFile(self.datafile) - for files in zip_file.namelist(): - _extract(zip_file, files, self.temp_dir) - finally: - if zip_file: - zip_file.close() - del zip_file - - os.chdir(os.path.join(self.temp_dir, self.dataname)) - - def tearDown(self): - #Assume setUp was never completed - if self.dataname is None or self.datafile is None: - return - - try: - if self.old_cwd: - os.chdir(self.old_cwd) - _remove_dir(self.temp_dir) - except OSError: - #sigh? - pass - - def _which_dirs(cmd): result = set() for path in os.environ.get('PATH', '').split(os.pathsep): @@ -147,10 +38,13 @@ def run_setup_py(cmd, pypath=None, path=None, cmd = [sys.executable, "setup.py"] + list(cmd) - #regarding the shell argument, see: http://bugs.python.org/issue8557 + # http://bugs.python.org/issue8557 + shell = sys.platform == 'win32' + try: - proc = _Popen(cmd, stdout=_PIPE, stderr=_PIPE, - shell=(sys.platform == 'win32'), env=env) + proc = _Popen( + cmd, stdout=_PIPE, stderr=_PIPE, shell=shell, env=env, + ) data = proc.communicate()[data_stream] except OSError: @@ -158,7 +52,8 @@ def run_setup_py(cmd, pypath=None, path=None, #decode the console string if needed if hasattr(data, "decode"): - data = data.decode() # should use the preffered encoding + # use the default encoding + data = data.decode() data = unicodedata.normalize('NFC', data) #communciate calls wait() diff --git a/awx/lib/site-packages/setuptools/tests/fixtures.py b/awx/lib/site-packages/setuptools/tests/fixtures.py new file mode 100644 index 0000000000..c70c38cb71 --- /dev/null +++ b/awx/lib/site-packages/setuptools/tests/fixtures.py @@ -0,0 +1,27 @@ +try: + from unittest import mock +except ImportError: + import mock +import pytest + +from . import contexts + + +@pytest.yield_fixture +def user_override(): + """ + Override site.USER_BASE and site.USER_SITE with temporary directories in + a context. + """ + with contexts.tempdir() as user_base: + with mock.patch('site.USER_BASE', user_base): + with contexts.tempdir() as user_site: + with mock.patch('site.USER_SITE', user_site): + with contexts.save_user_site_setting(): + yield + + +@pytest.yield_fixture +def tmpdir_cwd(tmpdir): + with tmpdir.as_cwd() as orig: + yield orig diff --git a/awx/lib/site-packages/setuptools/tests/indexes/test_links_priority/external.html b/awx/lib/site-packages/setuptools/tests/indexes/test_links_priority/external.html new file mode 100644 index 0000000000..92e4702f63 --- /dev/null +++ b/awx/lib/site-packages/setuptools/tests/indexes/test_links_priority/external.html @@ -0,0 +1,3 @@ +<html><body> +<a href="/foobar-0.1.tar.gz#md5=1__bad_md5___">bad old link</a> +</body></html> diff --git a/awx/lib/site-packages/setuptools/tests/indexes/test_links_priority/simple/foobar/index.html b/awx/lib/site-packages/setuptools/tests/indexes/test_links_priority/simple/foobar/index.html new file mode 100644 index 0000000000..fefb028bd3 --- /dev/null +++ b/awx/lib/site-packages/setuptools/tests/indexes/test_links_priority/simple/foobar/index.html @@ -0,0 +1,4 @@ +<html><body> +<a href="/foobar-0.1.tar.gz#md5=0_correct_md5">foobar-0.1.tar.gz</a><br/> +<a href="../../external.html" rel="homepage">external homepage</a><br/> +</body></html> diff --git a/awx/lib/site-packages/setuptools/tests/py26compat.py b/awx/lib/site-packages/setuptools/tests/py26compat.py index d4fb891af6..c56808816e 100644 --- a/awx/lib/site-packages/setuptools/tests/py26compat.py +++ b/awx/lib/site-packages/setuptools/tests/py26compat.py @@ -1,14 +1,14 @@ -import unittest +import sys +import tarfile +import contextlib -try: - # provide skipIf for Python 2.4-2.6 - skipIf = unittest.skipIf -except AttributeError: - def skipIf(condition, reason): - def skipper(func): - def skip(*args, **kwargs): - return - if condition: - return skip - return func - return skipper +def _tarfile_open_ex(*args, **kwargs): + """ + Extend result as a context manager. + """ + return contextlib.closing(tarfile.open(*args, **kwargs)) + +if sys.version_info[:2] < (2, 7) or (3, 0) <= sys.version_info[:2] < (3, 2): + tarfile_open = _tarfile_open_ex +else: + tarfile_open = tarfile.open diff --git a/awx/lib/site-packages/setuptools/tests/server.py b/awx/lib/site-packages/setuptools/tests/server.py index ae2381e355..6b21427992 100644 --- a/awx/lib/site-packages/setuptools/tests/server.py +++ b/awx/lib/site-packages/setuptools/tests/server.py @@ -1,11 +1,10 @@ """Basic http server for tests to simulate PyPI or custom indexes """ -import sys + import time import threading from setuptools.compat import BaseHTTPRequestHandler -from setuptools.compat import (urllib2, URLError, HTTPServer, - SimpleHTTPRequestHandler) +from setuptools.compat import HTTPServer, SimpleHTTPRequestHandler class IndexServer(HTTPServer): """Basic single-threaded http server simulating a package index @@ -23,12 +22,8 @@ class IndexServer(HTTPServer): HTTPServer.__init__(self, server_address, RequestHandlerClass) self._run = True - def serve(self): - while self._run: - self.handle_request() - def start(self): - self.thread = threading.Thread(target=self.serve) + self.thread = threading.Thread(target=self.serve_forever) self.thread.start() def stop(self): @@ -37,19 +32,7 @@ class IndexServer(HTTPServer): # Let the server finish the last request and wait for a new one. time.sleep(0.1) - # self.shutdown is not supported on python < 2.6, so just - # set _run to false, and make a request, causing it to - # terminate. - self._run = False - url = 'http://127.0.0.1:%(server_port)s/' % vars(self) - try: - if sys.version_info >= (2, 6): - urllib2.urlopen(url, timeout=5) - else: - urllib2.urlopen(url) - except URLError: - # ignore any errors; all that's important is the request - pass + self.shutdown() self.thread.join() self.socket.close() @@ -77,6 +60,6 @@ class MockServer(HTTPServer, threading.Thread): def run(self): self.serve_forever() + @property def url(self): return 'http://localhost:%(server_port)s/' % vars(self) - url = property(url) diff --git a/awx/lib/site-packages/setuptools/tests/test_bdist_egg.py b/awx/lib/site-packages/setuptools/tests/test_bdist_egg.py index 1a12218645..ccfb2ea76b 100644 --- a/awx/lib/site-packages/setuptools/tests/test_bdist_egg.py +++ b/awx/lib/site-packages/setuptools/tests/test_bdist_egg.py @@ -1,50 +1,32 @@ """develop tests """ -import sys -import os, re, shutil, tempfile, unittest -import tempfile -import site +import os +import re + +import pytest -from distutils.errors import DistutilsError -from setuptools.compat import StringIO -from setuptools.command.bdist_egg import bdist_egg -from setuptools.command import easy_install as easy_install_pkg from setuptools.dist import Distribution +from . import contexts + SETUP_PY = """\ from setuptools import setup setup(name='foo', py_modules=['hi']) """ -class TestDevelopTest(unittest.TestCase): - - def setUp(self): - self.dir = tempfile.mkdtemp() - self.old_cwd = os.getcwd() - os.chdir(self.dir) - f = open('setup.py', 'w') +@pytest.yield_fixture +def setup_context(tmpdir): + with (tmpdir/'setup.py').open('w') as f: f.write(SETUP_PY) - f.close() - f = open('hi.py', 'w') + with (tmpdir/'hi.py').open('w') as f: f.write('1\n') - f.close() - if sys.version >= "2.6": - self.old_base = site.USER_BASE - site.USER_BASE = tempfile.mkdtemp() - self.old_site = site.USER_SITE - site.USER_SITE = tempfile.mkdtemp() + with tmpdir.as_cwd(): + yield tmpdir - def tearDown(self): - os.chdir(self.old_cwd) - shutil.rmtree(self.dir) - if sys.version >= "2.6": - shutil.rmtree(site.USER_BASE) - shutil.rmtree(site.USER_SITE) - site.USER_BASE = self.old_base - site.USER_SITE = self.old_site - def test_bdist_egg(self): +class Test: + def test_bdist_egg(self, setup_context, user_override): dist = Distribution(dict( script_name='setup.py', script_args=['bdist_egg'], @@ -52,18 +34,10 @@ class TestDevelopTest(unittest.TestCase): py_modules=['hi'] )) os.makedirs(os.path.join('build', 'src')) - old_stdout = sys.stdout - sys.stdout = o = StringIO() - try: + with contexts.quiet(): dist.parse_command_line() dist.run_commands() - finally: - sys.stdout = old_stdout # let's see if we got our egg link at the right place [content] = os.listdir('dist') - self.assertTrue(re.match('foo-0.0.0-py[23].\d.egg$', content)) - -def test_suite(): - return unittest.makeSuite(TestDevelopTest) - + assert re.match('foo-0.0.0-py[23].\d.egg$', content) diff --git a/awx/lib/site-packages/setuptools/tests/test_build_ext.py b/awx/lib/site-packages/setuptools/tests/test_build_ext.py index a520ced9d6..0719ba44ae 100644 --- a/awx/lib/site-packages/setuptools/tests/test_build_ext.py +++ b/awx/lib/site-packages/setuptools/tests/test_build_ext.py @@ -1,20 +1,18 @@ -"""build_ext tests -""" -import os, shutil, tempfile, unittest -from distutils.command.build_ext import build_ext as distutils_build_ext +import distutils.command.build_ext as orig + from setuptools.command.build_ext import build_ext from setuptools.dist import Distribution -class TestBuildExtTest(unittest.TestCase): - +class TestBuildExt: def test_get_ext_filename(self): - # setuptools needs to give back the same - # result than distutils, even if the fullname - # is not in ext_map + """ + Setuptools needs to give back the same + result as distutils, even if the fullname + is not in ext_map. + """ dist = Distribution() cmd = build_ext(dist) cmd.ext_map['foo/bar'] = '' res = cmd.get_ext_filename('foo') - wanted = distutils_build_ext.get_ext_filename(cmd, 'foo') + wanted = orig.build_ext.get_ext_filename(cmd, 'foo') assert res == wanted - diff --git a/awx/lib/site-packages/setuptools/tests/test_develop.py b/awx/lib/site-packages/setuptools/tests/test_develop.py index 7b90161a8a..ed1b194a78 100644 --- a/awx/lib/site-packages/setuptools/tests/test_develop.py +++ b/awx/lib/site-packages/setuptools/tests/test_develop.py @@ -1,14 +1,12 @@ """develop tests """ -import sys -import os, shutil, tempfile, unittest -import tempfile +import os +import shutil import site +import sys +import tempfile -from distutils.errors import DistutilsError from setuptools.command.develop import develop -from setuptools.command import easy_install as easy_install_pkg -from setuptools.compat import StringIO from setuptools.dist import Distribution SETUP_PY = """\ @@ -23,10 +21,10 @@ setup(name='foo', INIT_PY = """print "foo" """ -class TestDevelopTest(unittest.TestCase): +class TestDevelopTest: - def setUp(self): - if sys.version < "2.6" or hasattr(sys, 'real_prefix'): + def setup_method(self, method): + if hasattr(sys, 'real_prefix'): return # Directory structure @@ -50,8 +48,8 @@ class TestDevelopTest(unittest.TestCase): self.old_site = site.USER_SITE site.USER_SITE = tempfile.mkdtemp() - def tearDown(self): - if sys.version < "2.6" or hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix): + def teardown_method(self, method): + if hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix): return os.chdir(self.old_cwd) @@ -62,7 +60,7 @@ class TestDevelopTest(unittest.TestCase): site.USER_SITE = self.old_site def test_develop(self): - if sys.version < "2.6" or hasattr(sys, 'real_prefix'): + if hasattr(sys, 'real_prefix'): return dist = Distribution( dict(name='foo', @@ -86,7 +84,7 @@ class TestDevelopTest(unittest.TestCase): # let's see if we got our egg link at the right place content = os.listdir(site.USER_SITE) content.sort() - self.assertEqual(content, ['easy-install.pth', 'foo.egg-link']) + assert content == ['easy-install.pth', 'foo.egg-link'] # Check that we are using the right code. egg_link_file = open(os.path.join(site.USER_SITE, 'foo.egg-link'), 'rt') @@ -100,23 +98,6 @@ class TestDevelopTest(unittest.TestCase): finally: init_file.close() if sys.version < "3": - self.assertEqual(init, 'print "foo"') + assert init == 'print "foo"' else: - self.assertEqual(init, 'print("foo")') - - def notest_develop_with_setup_requires(self): - - wanted = ("Could not find suitable distribution for " - "Requirement.parse('I-DONT-EXIST')") - old_dir = os.getcwd() - os.chdir(self.dir) - try: - try: - dist = Distribution({'setup_requires': ['I_DONT_EXIST']}) - except DistutilsError: - e = sys.exc_info()[1] - error = str(e) - if error == wanted: - pass - finally: - os.chdir(old_dir) + assert init == 'print("foo")' diff --git a/awx/lib/site-packages/setuptools/tests/test_dist_info.py b/awx/lib/site-packages/setuptools/tests/test_dist_info.py index a8adb68c2d..6d0ab58792 100644 --- a/awx/lib/site-packages/setuptools/tests/test_dist_info.py +++ b/awx/lib/site-packages/setuptools/tests/test_dist_info.py @@ -3,28 +3,20 @@ import os import shutil import tempfile -import unittest -import textwrap -try: - import ast -except: - pass +import pytest import pkg_resources +from .textwrap import DALS -from setuptools.tests.py26compat import skipIf -def DALS(s): - "dedent and left-strip" - return textwrap.dedent(s).lstrip() - -class TestDistInfo(unittest.TestCase): +class TestDistInfo: def test_distinfo(self): - dists = {} - for d in pkg_resources.find_distributions(self.tmpdir): - dists[d.project_name] = d + dists = dict( + (d.project_name, d) + for d in pkg_resources.find_distributions(self.tmpdir) + ) assert len(dists) == 2, dists @@ -34,50 +26,45 @@ class TestDistInfo(unittest.TestCase): assert versioned.version == '2.718' # from filename assert unversioned.version == '0.3' # from METADATA - @skipIf('ast' not in globals(), - "ast is used to test conditional dependencies (Python >= 2.6)") + @pytest.mark.importorskip('ast') def test_conditional_dependencies(self): - requires = [pkg_resources.Requirement.parse('splort==4'), - pkg_resources.Requirement.parse('quux>=1.1')] + specs = 'splort==4', 'quux>=1.1' + requires = list(map(pkg_resources.Requirement.parse, specs)) for d in pkg_resources.find_distributions(self.tmpdir): - self.assertEqual(d.requires(), requires[:1]) - self.assertEqual(d.requires(extras=('baz',)), requires) - self.assertEqual(d.extras, ['baz']) + assert d.requires() == requires[:1] + assert d.requires(extras=('baz',)) == requires + assert d.extras == ['baz'] - def setUp(self): + metadata_template = DALS(""" + Metadata-Version: 1.2 + Name: {name} + {version} + Requires-Dist: splort (==4) + Provides-Extra: baz + Requires-Dist: quux (>=1.1); extra == 'baz' + """) + + def setup_method(self, method): self.tmpdir = tempfile.mkdtemp() - versioned = os.path.join(self.tmpdir, - 'VersionedDistribution-2.718.dist-info') + dist_info_name = 'VersionedDistribution-2.718.dist-info' + versioned = os.path.join(self.tmpdir, dist_info_name) os.mkdir(versioned) - metadata_file = open(os.path.join(versioned, 'METADATA'), 'w+') - try: - metadata_file.write(DALS( - """ - Metadata-Version: 1.2 - Name: VersionedDistribution - Requires-Dist: splort (4) - Provides-Extra: baz - Requires-Dist: quux (>=1.1); extra == 'baz' - """)) - finally: - metadata_file.close() - unversioned = os.path.join(self.tmpdir, - 'UnversionedDistribution.dist-info') + with open(os.path.join(versioned, 'METADATA'), 'w+') as metadata_file: + metadata = self.metadata_template.format( + name='VersionedDistribution', + version='', + ).replace('\n\n', '\n') + metadata_file.write(metadata) + dist_info_name = 'UnversionedDistribution.dist-info' + unversioned = os.path.join(self.tmpdir, dist_info_name) os.mkdir(unversioned) - metadata_file = open(os.path.join(unversioned, 'METADATA'), 'w+') - try: - metadata_file.write(DALS( - """ - Metadata-Version: 1.2 - Name: UnversionedDistribution - Version: 0.3 - Requires-Dist: splort (==4) - Provides-Extra: baz - Requires-Dist: quux (>=1.1); extra == 'baz' - """)) - finally: - metadata_file.close() + with open(os.path.join(unversioned, 'METADATA'), 'w+') as metadata_file: + metadata = self.metadata_template.format( + name='UnversionedDistribution', + version='Version: 0.3', + ) + metadata_file.write(metadata) - def tearDown(self): + def teardown_method(self, method): shutil.rmtree(self.tmpdir) diff --git a/awx/lib/site-packages/setuptools/tests/test_easy_install.py b/awx/lib/site-packages/setuptools/tests/test_easy_install.py index d2cc7a0fe6..4331d30e68 100644 --- a/awx/lib/site-packages/setuptools/tests/test_easy_install.py +++ b/awx/lib/site-packages/setuptools/tests/test_easy_install.py @@ -1,29 +1,44 @@ +# -*- coding: utf-8 -*- + """Easy install Tests """ +from __future__ import absolute_import + import sys import os import shutil import tempfile -import unittest import site import contextlib -import textwrap import tarfile import logging -import distutils.core +import itertools +import distutils.errors -from setuptools.compat import StringIO, BytesIO, next, urlparse -from setuptools.sandbox import run_setup, SandboxViolation -from setuptools.command.easy_install import ( - easy_install, fix_jython_executable, get_script_args, nt_quote_arg) +import pytest +try: + from unittest import mock +except ImportError: + import mock + +from setuptools import sandbox +from setuptools import compat +from setuptools.compat import StringIO, BytesIO, urlparse +from setuptools.sandbox import run_setup +import setuptools.command.easy_install as ei from setuptools.command.easy_install import PthDistributions from setuptools.command import easy_install as easy_install_pkg from setuptools.dist import Distribution -from pkg_resources import working_set, VersionConflict +from pkg_resources import working_set from pkg_resources import Distribution as PRDistribution import setuptools.tests.server import pkg_resources +from .py26compat import tarfile_open +from . import contexts +from .textwrap import DALS + + class FakeDist(object): def get_entry_map(self, group): if group != 'console_scripts': @@ -33,134 +48,123 @@ class FakeDist(object): def as_requirement(self): return 'spec' -WANTED = """\ -#!%s -# EASY-INSTALL-ENTRY-SCRIPT: 'spec','console_scripts','name' -__requires__ = 'spec' -import sys -from pkg_resources import load_entry_point +SETUP_PY = DALS(""" + from setuptools import setup -if __name__ == '__main__': - sys.exit( - load_entry_point('spec', 'console_scripts', 'name')() - ) -""" % nt_quote_arg(fix_jython_executable(sys.executable, "")) + setup(name='foo') + """) -SETUP_PY = """\ -from setuptools import setup - -setup(name='foo') -""" - -class TestEasyInstallTest(unittest.TestCase): +class TestEasyInstallTest: def test_install_site_py(self): dist = Distribution() - cmd = easy_install(dist) + cmd = ei.easy_install(dist) cmd.sitepy_installed = False cmd.install_dir = tempfile.mkdtemp() try: cmd.install_site_py() sitepy = os.path.join(cmd.install_dir, 'site.py') - self.assertTrue(os.path.exists(sitepy)) + assert os.path.exists(sitepy) finally: shutil.rmtree(cmd.install_dir) def test_get_script_args(self): + header = ei.CommandSpec.best().from_environment().as_header() + expected = header + DALS(""" + # EASY-INSTALL-ENTRY-SCRIPT: 'spec','console_scripts','name' + __requires__ = 'spec' + import sys + from pkg_resources import load_entry_point + + if __name__ == '__main__': + sys.exit( + load_entry_point('spec', 'console_scripts', 'name')() + ) + """) dist = FakeDist() - old_platform = sys.platform - try: - name, script = [i for i in next(get_script_args(dist))][0:2] - finally: - sys.platform = old_platform + args = next(ei.ScriptWriter.get_args(dist)) + name, script = itertools.islice(args, 2) - self.assertEqual(script, WANTED) + assert script == expected def test_no_find_links(self): # new option '--no-find-links', that blocks find-links added at # the project level dist = Distribution() - cmd = easy_install(dist) + cmd = ei.easy_install(dist) cmd.check_pth_processing = lambda: True cmd.no_find_links = True cmd.find_links = ['link1', 'link2'] cmd.install_dir = os.path.join(tempfile.mkdtemp(), 'ok') cmd.args = ['ok'] cmd.ensure_finalized() - self.assertEqual(cmd.package_index.scanned_urls, {}) + assert cmd.package_index.scanned_urls == {} # let's try without it (default behavior) - cmd = easy_install(dist) + cmd = ei.easy_install(dist) cmd.check_pth_processing = lambda: True cmd.find_links = ['link1', 'link2'] cmd.install_dir = os.path.join(tempfile.mkdtemp(), 'ok') cmd.args = ['ok'] cmd.ensure_finalized() keys = sorted(cmd.package_index.scanned_urls.keys()) - self.assertEqual(keys, ['link1', 'link2']) + assert keys == ['link1', 'link2'] + + def test_write_exception(self): + """ + Test that `cant_write_to_target` is rendered as a DistutilsError. + """ + dist = Distribution() + cmd = ei.easy_install(dist) + cmd.install_dir = os.getcwd() + with pytest.raises(distutils.errors.DistutilsError): + cmd.cant_write_to_target() -class TestPTHFileWriter(unittest.TestCase): +class TestPTHFileWriter: def test_add_from_cwd_site_sets_dirty(self): '''a pth file manager should set dirty if a distribution is in site but also the cwd ''' pth = PthDistributions('does-not_exist', [os.getcwd()]) - self.assertTrue(not pth.dirty) + assert not pth.dirty pth.add(PRDistribution(os.getcwd())) - self.assertTrue(pth.dirty) + assert pth.dirty def test_add_from_site_is_ignored(self): - if os.name != 'nt': - location = '/test/location/does-not-have-to-exist' - else: - location = 'c:\\does_not_exist' + location = '/test/location/does-not-have-to-exist' + # PthDistributions expects all locations to be normalized + location = pkg_resources.normalize_path(location) pth = PthDistributions('does-not_exist', [location, ]) - self.assertTrue(not pth.dirty) + assert not pth.dirty pth.add(PRDistribution(location)) - self.assertTrue(not pth.dirty) + assert not pth.dirty -class TestUserInstallTest(unittest.TestCase): - - def setUp(self): - self.dir = tempfile.mkdtemp() - setup = os.path.join(self.dir, 'setup.py') - f = open(setup, 'w') +@pytest.yield_fixture +def setup_context(tmpdir): + with (tmpdir/'setup.py').open('w') as f: f.write(SETUP_PY) - f.close() - self.old_cwd = os.getcwd() - os.chdir(self.dir) + with tmpdir.as_cwd(): + yield tmpdir - self.old_enable_site = site.ENABLE_USER_SITE - self.old_file = easy_install_pkg.__file__ - self.old_base = site.USER_BASE - site.USER_BASE = tempfile.mkdtemp() - self.old_site = site.USER_SITE - site.USER_SITE = tempfile.mkdtemp() - easy_install_pkg.__file__ = site.USER_SITE - def tearDown(self): - os.chdir(self.old_cwd) - shutil.rmtree(self.dir) - - shutil.rmtree(site.USER_BASE) - shutil.rmtree(site.USER_SITE) - site.USER_BASE = self.old_base - site.USER_SITE = self.old_site - site.ENABLE_USER_SITE = self.old_enable_site - easy_install_pkg.__file__ = self.old_file +@pytest.mark.usefixtures("user_override") +@pytest.mark.usefixtures("setup_context") +class TestUserInstallTest: + @mock.patch('setuptools.command.easy_install.__file__', None) def test_user_install_implied(self): + easy_install_pkg.__file__ = site.USER_SITE site.ENABLE_USER_SITE = True # disabled sometimes #XXX: replace with something meaningfull dist = Distribution() dist.script_name = 'setup.py' - cmd = easy_install(dist) + cmd = ei.easy_install(dist) cmd.args = ['py'] cmd.ensure_finalized() - self.assertTrue(cmd.user, 'user should be implied') + assert cmd.user, 'user should be implied' def test_multiproc_atexit(self): try: @@ -178,10 +182,10 @@ class TestUserInstallTest(unittest.TestCase): #XXX: replace with something meaningfull dist = Distribution() dist.script_name = 'setup.py' - cmd = easy_install(dist) + cmd = ei.easy_install(dist) cmd.args = ['py'] cmd.initialize_options() - self.assertFalse(cmd.user, 'NOT user should be implied') + assert not cmd.user, 'NOT user should be implied' def test_local_index(self): # make sure the local index is used @@ -190,11 +194,8 @@ class TestUserInstallTest(unittest.TestCase): new_location = tempfile.mkdtemp() target = tempfile.mkdtemp() egg_file = os.path.join(new_location, 'foo-1.0.egg-info') - f = open(egg_file, 'w') - try: + with open(egg_file, 'w') as f: f.write('Name: foo\n') - finally: - f.close() sys.path.append(target) old_ppath = os.environ.get('PYTHONPATH') @@ -202,14 +203,15 @@ class TestUserInstallTest(unittest.TestCase): try: dist = Distribution() dist.script_name = 'setup.py' - cmd = easy_install(dist) + cmd = ei.easy_install(dist) cmd.install_dir = target cmd.args = ['foo'] cmd.ensure_finalized() cmd.local_index.scan([new_location]) res = cmd.easy_install('foo') - self.assertEqual(os.path.realpath(res.location), - os.path.realpath(new_location)) + actual = os.path.normcase(os.path.realpath(res.location)) + expected = os.path.normcase(os.path.realpath(new_location)) + assert actual == expected finally: sys.path.remove(target) for basedir in [new_location, target, ]: @@ -224,6 +226,25 @@ class TestUserInstallTest(unittest.TestCase): else: del os.environ['PYTHONPATH'] + @contextlib.contextmanager + def user_install_setup_context(self, *args, **kwargs): + """ + Wrap sandbox.setup_context to patch easy_install in that context to + appear as user-installed. + """ + with self.orig_context(*args, **kwargs): + import setuptools.command.easy_install as ei + ei.__file__ = site.USER_SITE + yield + + def patched_setup_context(self): + self.orig_context = sandbox.setup_context + + return mock.patch( + 'setuptools.sandbox.setup_context', + self.user_install_setup_context, + ) + def test_setup_requires(self): """Regression test for Distribute issue #318 @@ -232,18 +253,37 @@ class TestUserInstallTest(unittest.TestCase): SandboxViolation. """ - test_pkg = create_setup_requires_package(self.dir) + test_pkg = create_setup_requires_package(os.getcwd()) test_setup_py = os.path.join(test_pkg, 'setup.py') try: - with quiet_context(): - with reset_setup_stop_context(): + with contexts.quiet(): + with self.patched_setup_context(): run_setup(test_setup_py, ['install']) - except SandboxViolation: - self.fail('Installation caused SandboxViolation') + except IndexError: + # Test fails in some cases due to bugs in Python + # See https://bitbucket.org/pypa/setuptools/issue/201 + pass -class TestSetupRequires(unittest.TestCase): +@pytest.yield_fixture +def distutils_package(): + distutils_setup_py = SETUP_PY.replace( + 'from setuptools import setup', + 'from distutils.core import setup', + ) + with contexts.tempdir(cd=os.chdir): + with open('setup.py', 'w') as f: + f.write(distutils_setup_py) + yield + + +class TestDistutilsPackage: + def test_bdist_egg_available_on_distutils_pkg(self, distutils_package): + run_setup('setup.py', ['bdist_egg']) + + +class TestSetupRequires: def test_setup_requires_honors_fetch_params(self): """ @@ -260,25 +300,27 @@ class TestSetupRequires(unittest.TestCase): # Some platforms (Jython) don't find a port to which to bind, # so skip this test for them. return - with quiet_context(): + with contexts.quiet(): # create an sdist that has a build-time dependency. with TestSetupRequires.create_sdist() as dist_file: - with tempdir_context() as temp_install_dir: - with environment_context(PYTHONPATH=temp_install_dir): - ei_params = ['--index-url', p_index.url, + with contexts.tempdir() as temp_install_dir: + with contexts.environment(PYTHONPATH=temp_install_dir): + ei_params = [ + '--index-url', p_index.url, '--allow-hosts', p_index_loc, - '--exclude-scripts', '--install-dir', temp_install_dir, - dist_file] - with reset_setup_stop_context(): - with argv_context(['easy_install']): - # attempt to install the dist. It should fail because - # it doesn't exist. - self.assertRaises(SystemExit, - easy_install_pkg.main, ei_params) + '--exclude-scripts', + '--install-dir', temp_install_dir, + dist_file, + ] + with contexts.argv(['easy_install']): + # attempt to install the dist. It should fail because + # it doesn't exist. + with pytest.raises(SystemExit): + easy_install_pkg.main(ei_params) # there should have been two or three requests to the server # (three happens on Python 3.3a) - self.assertTrue(2 <= len(p_index.requests) <= 3) - self.assertEqual(p_index.requests[0].path, '/does-not-exist/') + assert 2 <= len(p_index.requests) <= 3 + assert p_index.requests[0].path == '/does-not-exist/' @staticmethod @contextlib.contextmanager @@ -287,18 +329,17 @@ class TestSetupRequires(unittest.TestCase): Return an sdist with a setup_requires dependency (of something that doesn't exist) """ - with tempdir_context() as dir: + with contexts.tempdir() as dir: dist_path = os.path.join(dir, 'setuptools-test-fetcher-1.0.tar.gz') - make_trivial_sdist( - dist_path, - textwrap.dedent(""" - import setuptools - setuptools.setup( - name="setuptools-test-fetcher", - version="1.0", - setup_requires = ['does-not-exist'], - ) - """).lstrip()) + script = DALS(""" + import setuptools + setuptools.setup( + name="setuptools-test-fetcher", + version="1.0", + setup_requires = ['does-not-exist'], + ) + """) + make_trivial_sdist(dist_path, script) yield dist_path def test_setup_requires_overrides_version_conflict(self): @@ -316,22 +357,17 @@ class TestSetupRequires(unittest.TestCase): working_set.add(fake_dist) try: - with tempdir_context() as temp_dir: + with contexts.tempdir() as temp_dir: test_pkg = create_setup_requires_package(temp_dir) test_setup_py = os.path.join(test_pkg, 'setup.py') - with quiet_context() as (stdout, stderr): - with reset_setup_stop_context(): - try: - # Don't even need to install the package, just - # running the setup.py at all is sufficient - run_setup(test_setup_py, ['--name']) - except VersionConflict: - self.fail('Installing setup.py requirements ' - 'caused a VersionConflict') + with contexts.quiet() as (stdout, stderr): + # Don't even need to install the package, just + # running the setup.py at all is sufficient + run_setup(test_setup_py, ['--name']) lines = stdout.readlines() - self.assertTrue(len(lines) > 0) - self.assertTrue(lines[-1].strip(), 'test_pkg') + assert len(lines) > 0 + assert lines[-1].strip(), 'test_pkg' finally: pkg_resources.__setstate__(pr_state) @@ -352,17 +388,16 @@ def create_setup_requires_package(path): test_setup_py = os.path.join(test_pkg, 'setup.py') os.mkdir(test_pkg) - f = open(test_setup_py, 'w') - f.write(textwrap.dedent("""\ - import setuptools - setuptools.setup(**%r) - """ % test_setup_attrs)) - f.close() + with open(test_setup_py, 'w') as f: + f.write(DALS(""" + import setuptools + setuptools.setup(**%r) + """ % test_setup_attrs)) foobar_path = os.path.join(path, 'foobar-0.1.tar.gz') make_trivial_sdist( foobar_path, - textwrap.dedent("""\ + DALS(""" import setuptools setuptools.setup( name='foobar', @@ -386,71 +421,127 @@ def make_trivial_sdist(dist_path, setup_py): MemFile = StringIO setup_py_bytes = MemFile(setup_py.encode('utf-8')) setup_py_file.size = len(setup_py_bytes.getvalue()) - dist = tarfile.open(dist_path, 'w:gz') - try: + with tarfile_open(dist_path, 'w:gz') as dist: dist.addfile(setup_py_file, fileobj=setup_py_bytes) - finally: - dist.close() -@contextlib.contextmanager -def tempdir_context(cd=lambda dir:None): - temp_dir = tempfile.mkdtemp() - orig_dir = os.getcwd() - try: - cd(temp_dir) - yield temp_dir - finally: - cd(orig_dir) - shutil.rmtree(temp_dir) +class TestScriptHeader: + non_ascii_exe = '/Users/José/bin/python' + exe_with_spaces = r'C:\Program Files\Python33\python.exe' -@contextlib.contextmanager -def environment_context(**updates): - old_env = os.environ.copy() - os.environ.update(updates) - try: - yield - finally: - for key in updates: - del os.environ[key] - os.environ.update(old_env) + @pytest.mark.skipif( + sys.platform.startswith('java') and ei.is_sh(sys.executable), + reason="Test cannot run under java when executable is sh" + ) + def test_get_script_header(self): + expected = '#!%s\n' % ei.nt_quote_arg(os.path.normpath(sys.executable)) + actual = ei.ScriptWriter.get_script_header('#!/usr/local/bin/python') + assert actual == expected -@contextlib.contextmanager -def argv_context(repl): - old_argv = sys.argv[:] - sys.argv[:] = repl - yield - sys.argv[:] = old_argv + expected = '#!%s -x\n' % ei.nt_quote_arg(os.path.normpath + (sys.executable)) + actual = ei.ScriptWriter.get_script_header('#!/usr/bin/python -x') + assert actual == expected -@contextlib.contextmanager -def reset_setup_stop_context(): - """ - When the setuptools tests are run using setup.py test, and then - one wants to invoke another setup() command (such as easy_install) - within those tests, it's necessary to reset the global variable - in distutils.core so that the setup() command will run naturally. - """ - setup_stop_after = distutils.core._setup_stop_after - distutils.core._setup_stop_after = None - yield - distutils.core._setup_stop_after = setup_stop_after + actual = ei.ScriptWriter.get_script_header('#!/usr/bin/python', + executable=self.non_ascii_exe) + expected = '#!%s -x\n' % self.non_ascii_exe + assert actual == expected + + actual = ei.ScriptWriter.get_script_header('#!/usr/bin/python', + executable='"'+self.exe_with_spaces+'"') + expected = '#!"%s"\n' % self.exe_with_spaces + assert actual == expected + + @pytest.mark.xfail( + compat.PY3 and os.environ.get("LC_CTYPE") in ("C", "POSIX"), + reason="Test fails in this locale on Python 3" + ) + @mock.patch.dict(sys.modules, java=mock.Mock(lang=mock.Mock(System= + mock.Mock(getProperty=mock.Mock(return_value=""))))) + @mock.patch('sys.platform', 'java1.5.0_13') + def test_get_script_header_jython_workaround(self, tmpdir): + # Create a mock sys.executable that uses a shebang line + header = DALS(""" + #!/usr/bin/python + # -*- coding: utf-8 -*- + """) + exe = tmpdir / 'exe.py' + with exe.open('w') as f: + f.write(header) + exe = str(exe) + + header = ei.ScriptWriter.get_script_header('#!/usr/local/bin/python', + executable=exe) + assert header == '#!/usr/bin/env %s\n' % exe + + expect_out = 'stdout' if sys.version_info < (2,7) else 'stderr' + + with contexts.quiet() as (stdout, stderr): + # When options are included, generate a broken shebang line + # with a warning emitted + candidate = ei.ScriptWriter.get_script_header('#!/usr/bin/python -x', + executable=exe) + assert candidate == '#!%s -x\n' % exe + output = locals()[expect_out] + assert 'Unable to adapt shebang line' in output.getvalue() + + with contexts.quiet() as (stdout, stderr): + candidate = ei.ScriptWriter.get_script_header('#!/usr/bin/python', + executable=self.non_ascii_exe) + assert candidate == '#!%s -x\n' % self.non_ascii_exe + output = locals()[expect_out] + assert 'Unable to adapt shebang line' in output.getvalue() -@contextlib.contextmanager -def quiet_context(): - """ - Redirect stdout/stderr to StringIO objects to prevent console output from - distutils commands. - """ +class TestCommandSpec: + def test_custom_launch_command(self): + """ + Show how a custom CommandSpec could be used to specify a #! executable + which takes parameters. + """ + cmd = ei.CommandSpec(['/usr/bin/env', 'python3']) + assert cmd.as_header() == '#!/usr/bin/env python3\n' - old_stdout = sys.stdout - old_stderr = sys.stderr - new_stdout = sys.stdout = StringIO() - new_stderr = sys.stderr = StringIO() - try: - yield new_stdout, new_stderr - finally: - new_stdout.seek(0) - new_stderr.seek(0) - sys.stdout = old_stdout - sys.stderr = old_stderr + def test_from_param_for_CommandSpec_is_passthrough(self): + """ + from_param should return an instance of a CommandSpec + """ + cmd = ei.CommandSpec(['python']) + cmd_new = ei.CommandSpec.from_param(cmd) + assert cmd is cmd_new + + def test_from_environment_with_spaces_in_executable(self): + with mock.patch('sys.executable', TestScriptHeader.exe_with_spaces): + cmd = ei.CommandSpec.from_environment() + assert len(cmd) == 1 + assert cmd.as_header().startswith('#!"') + + def test_from_simple_string_uses_shlex(self): + """ + In order to support `executable = /usr/bin/env my-python`, make sure + from_param invokes shlex on that input. + """ + cmd = ei.CommandSpec.from_param('/usr/bin/env my-python') + assert len(cmd) == 2 + assert '"' not in cmd.as_header() + + def test_sys_executable(self): + """ + CommandSpec.from_string(sys.executable) should contain just that param. + """ + writer = ei.ScriptWriter.best() + cmd = writer.command_spec_class.from_string(sys.executable) + assert len(cmd) == 1 + assert cmd[0] == sys.executable + + +class TestWindowsScriptWriter: + def test_header(self): + hdr = ei.WindowsScriptWriter.get_script_header('') + assert hdr.startswith('#!') + assert hdr.endswith('\n') + hdr = hdr.lstrip('#!') + hdr = hdr.rstrip('\n') + # header should not start with an escaped quote + assert not hdr.startswith('\\"') diff --git a/awx/lib/site-packages/setuptools/tests/test_egg_info.py b/awx/lib/site-packages/setuptools/tests/test_egg_info.py index 278543662f..a1caf9fd30 100644 --- a/awx/lib/site-packages/setuptools/tests/test_egg_info.py +++ b/awx/lib/site-packages/setuptools/tests/test_egg_info.py @@ -1,173 +1,98 @@ - import os -import sys -import tempfile -import shutil -import unittest +import stat -import pkg_resources -import warnings -from setuptools.command import egg_info -from setuptools import svn_utils -from setuptools.tests import environment, test_svn -from setuptools.tests.py26compat import skipIf +import pytest -ENTRIES_V10 = pkg_resources.resource_string(__name__, 'entries-v10') -"An entries file generated with svn 1.6.17 against the legacy Setuptools repo" +from . import environment +from .textwrap import DALS +from . import contexts -class TestEggInfo(unittest.TestCase): +class TestEggInfo: - def setUp(self): - self.test_dir = tempfile.mkdtemp() - os.mkdir(os.path.join(self.test_dir, '.svn')) + setup_script = DALS(""" + from setuptools import setup - self.old_cwd = os.getcwd() - os.chdir(self.test_dir) + setup( + name='foo', + py_modules=['hello'], + entry_points={'console_scripts': ['hi = hello.run']}, + zip_safe=False, + ) + """) - def tearDown(self): - os.chdir(self.old_cwd) - shutil.rmtree(self.test_dir) + def _create_project(self): + with open('setup.py', 'w') as f: + f.write(self.setup_script) - def _write_entries(self, entries): - fn = os.path.join(self.test_dir, '.svn', 'entries') - entries_f = open(fn, 'wb') - entries_f.write(entries) - entries_f.close() - - @skipIf(not test_svn._svn_check, "No SVN to text, in the first place") - def test_version_10_format(self): - """ - """ - #keeping this set for 1.6 is a good check on the get_svn_revision - #to ensure I return using svnversion what would had been returned - version_str = svn_utils.SvnInfo.get_svn_version() - version = [int(x) for x in version_str.split('.')[:2]] - if version != [1, 6]: - if hasattr(self, 'skipTest'): - self.skipTest('') - else: - sys.stderr.write('\n Skipping due to SVN Version\n') - return + with open('hello.py', 'w') as f: + f.write(DALS(""" + def run(): + print('hello') + """)) - self._write_entries(ENTRIES_V10) - rev = egg_info.egg_info.get_svn_revision() - self.assertEqual(rev, '89000') + @pytest.yield_fixture + def env(self): + class Environment(str): pass - def test_version_10_format_legacy_parser(self): - """ - """ - path_variable = None - for env in os.environ: - if env.lower() == 'path': - path_variable = env + with contexts.tempdir(prefix='setuptools-test.') as env_dir: + env = Environment(env_dir) + os.chmod(env_dir, stat.S_IRWXU) + subs = 'home', 'lib', 'scripts', 'data', 'egg-base' + env.paths = dict( + (dirname, os.path.join(env_dir, dirname)) + for dirname in subs + ) + list(map(os.mkdir, env.paths.values())) + config = os.path.join(env.paths['home'], '.pydistutils.cfg') + with open(config, 'w') as f: + f.write(DALS(""" + [egg_info] + egg-base = %(egg-base)s + """ % env.paths + )) + yield env - if path_variable: - old_path = os.environ[path_variable] - os.environ[path_variable] = '' - #catch_warnings not available until py26 - warning_filters = warnings.filters - warnings.filters = warning_filters[:] - try: - warnings.simplefilter("ignore", DeprecationWarning) - self._write_entries(ENTRIES_V10) - rev = egg_info.egg_info.get_svn_revision() - finally: - #restore the warning filters - warnings.filters = warning_filters - #restore the os path - if path_variable: - os.environ[path_variable] = old_path + def test_egg_base_installed_egg_info(self, tmpdir_cwd, env): + self._create_project() - self.assertEqual(rev, '89000') - -DUMMY_SOURCE_TXT = """CHANGES.txt -CONTRIBUTORS.txt -HISTORY.txt -LICENSE -MANIFEST.in -README.txt -setup.py -dummy/__init__.py -dummy/test.txt -dummy.egg-info/PKG-INFO -dummy.egg-info/SOURCES.txt -dummy.egg-info/dependency_links.txt -dummy.egg-info/top_level.txt""" - - -class TestSvnDummy(environment.ZippedEnvironment): - - def setUp(self): - version = svn_utils.SvnInfo.get_svn_version() - if not version: # None or Empty - return None - - self.base_version = tuple([int(x) for x in version.split('.')][:2]) - - if not self.base_version: - raise ValueError('No SVN tools installed') - elif self.base_version < (1, 3): - raise ValueError('Insufficient SVN Version %s' % version) - elif self.base_version >= (1, 9): - #trying the latest version - self.base_version = (1, 8) - - self.dataname = "dummy%i%i" % self.base_version - self.datafile = os.path.join('setuptools', 'tests', - 'svn_data', self.dataname + ".zip") - super(TestSvnDummy, self).setUp() - - @skipIf(not test_svn._svn_check, "No SVN to text, in the first place") - def test_sources(self): - code, data = environment.run_setup_py(["sdist"], - pypath=self.old_cwd, - data_stream=1) + environ = os.environ.copy().update( + HOME=env.paths['home'], + ) + cmd = [ + 'install', + '--home', env.paths['home'], + '--install-lib', env.paths['lib'], + '--install-scripts', env.paths['scripts'], + '--install-data', env.paths['data'], + ] + code, data = environment.run_setup_py( + cmd=cmd, + pypath=os.pathsep.join([env.paths['lib'], str(tmpdir_cwd)]), + data_stream=1, + env=environ, + ) if code: raise AssertionError(data) - sources = os.path.join('dummy.egg-info', 'SOURCES.txt') - infile = open(sources, 'r') - try: - read_contents = infile.read() - finally: - infile.close() - del infile + actual = self._find_egg_info_files(env.paths['lib']) - self.assertEqual(DUMMY_SOURCE_TXT, read_contents) + expected = [ + 'PKG-INFO', + 'SOURCES.txt', + 'dependency_links.txt', + 'entry_points.txt', + 'not-zip-safe', + 'top_level.txt', + ] + assert sorted(actual) == expected - return data - - -class TestSvnDummyLegacy(environment.ZippedEnvironment): - - def setUp(self): - self.base_version = (1, 6) - self.dataname = "dummy%i%i" % self.base_version - self.datafile = os.path.join('setuptools', 'tests', - 'svn_data', self.dataname + ".zip") - super(TestSvnDummyLegacy, self).setUp() - - def test_sources(self): - code, data = environment.run_setup_py(["sdist"], - pypath=self.old_cwd, - path="", - data_stream=1) - if code: - raise AssertionError(data) - - sources = os.path.join('dummy.egg-info', 'SOURCES.txt') - infile = open(sources, 'r') - try: - read_contents = infile.read() - finally: - infile.close() - del infile - - self.assertEqual(DUMMY_SOURCE_TXT, read_contents) - - return data - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) + def _find_egg_info_files(self, root): + results = ( + filenames + for dirpath, dirnames, filenames in os.walk(root) + if os.path.basename(dirpath) == 'EGG-INFO' + ) + # expect exactly one result + result, = results + return result diff --git a/awx/lib/site-packages/setuptools/tests/test_find_packages.py b/awx/lib/site-packages/setuptools/tests/test_find_packages.py new file mode 100644 index 0000000000..06a7c02e46 --- /dev/null +++ b/awx/lib/site-packages/setuptools/tests/test_find_packages.py @@ -0,0 +1,170 @@ +"""Tests for setuptools.find_packages().""" +import os +import sys +import shutil +import tempfile +import platform + +import pytest + +import setuptools +from setuptools import find_packages + +find_420_packages = setuptools.PEP420PackageFinder.find + +# modeled after CPython's test.support.can_symlink +def can_symlink(): + TESTFN = tempfile.mktemp() + symlink_path = TESTFN + "can_symlink" + try: + os.symlink(TESTFN, symlink_path) + can = True + except (OSError, NotImplementedError, AttributeError): + can = False + else: + os.remove(symlink_path) + globals().update(can_symlink=lambda: can) + return can + +def has_symlink(): + bad_symlink = ( + # Windows symlink directory detection is broken on Python 3.2 + platform.system() == 'Windows' and sys.version_info[:2] == (3,2) + ) + return can_symlink() and not bad_symlink + +class TestFindPackages: + + def setup_method(self, method): + self.dist_dir = tempfile.mkdtemp() + self._make_pkg_structure() + + def teardown_method(self, method): + shutil.rmtree(self.dist_dir) + + def _make_pkg_structure(self): + """Make basic package structure. + + dist/ + docs/ + conf.py + pkg/ + __pycache__/ + nspkg/ + mod.py + subpkg/ + assets/ + asset + __init__.py + setup.py + + """ + self.docs_dir = self._mkdir('docs', self.dist_dir) + self._touch('conf.py', self.docs_dir) + self.pkg_dir = self._mkdir('pkg', self.dist_dir) + self._mkdir('__pycache__', self.pkg_dir) + self.ns_pkg_dir = self._mkdir('nspkg', self.pkg_dir) + self._touch('mod.py', self.ns_pkg_dir) + self.sub_pkg_dir = self._mkdir('subpkg', self.pkg_dir) + self.asset_dir = self._mkdir('assets', self.sub_pkg_dir) + self._touch('asset', self.asset_dir) + self._touch('__init__.py', self.sub_pkg_dir) + self._touch('setup.py', self.dist_dir) + + def _mkdir(self, path, parent_dir=None): + if parent_dir: + path = os.path.join(parent_dir, path) + os.mkdir(path) + return path + + def _touch(self, path, dir_=None): + if dir_: + path = os.path.join(dir_, path) + fp = open(path, 'w') + fp.close() + return path + + def test_regular_package(self): + self._touch('__init__.py', self.pkg_dir) + packages = find_packages(self.dist_dir) + assert packages == ['pkg', 'pkg.subpkg'] + + def test_exclude(self): + self._touch('__init__.py', self.pkg_dir) + packages = find_packages(self.dist_dir, exclude=('pkg.*',)) + assert packages == ['pkg'] + + def test_include_excludes_other(self): + """ + If include is specified, other packages should be excluded. + """ + self._touch('__init__.py', self.pkg_dir) + alt_dir = self._mkdir('other_pkg', self.dist_dir) + self._touch('__init__.py', alt_dir) + packages = find_packages(self.dist_dir, include=['other_pkg']) + assert packages == ['other_pkg'] + + def test_dir_with_dot_is_skipped(self): + shutil.rmtree(os.path.join(self.dist_dir, 'pkg/subpkg/assets')) + data_dir = self._mkdir('some.data', self.pkg_dir) + self._touch('__init__.py', data_dir) + self._touch('file.dat', data_dir) + packages = find_packages(self.dist_dir) + assert 'pkg.some.data' not in packages + + def test_dir_with_packages_in_subdir_is_excluded(self): + """ + Ensure that a package in a non-package such as build/pkg/__init__.py + is excluded. + """ + build_dir = self._mkdir('build', self.dist_dir) + build_pkg_dir = self._mkdir('pkg', build_dir) + self._touch('__init__.py', build_pkg_dir) + packages = find_packages(self.dist_dir) + assert 'build.pkg' not in packages + + @pytest.mark.skipif(not has_symlink(), reason='Symlink support required') + def test_symlinked_packages_are_included(self): + """ + A symbolically-linked directory should be treated like any other + directory when matched as a package. + + Create a link from lpkg -> pkg. + """ + self._touch('__init__.py', self.pkg_dir) + linked_pkg = os.path.join(self.dist_dir, 'lpkg') + os.symlink('pkg', linked_pkg) + assert os.path.isdir(linked_pkg) + packages = find_packages(self.dist_dir) + assert 'lpkg' in packages + + def _assert_packages(self, actual, expected): + assert set(actual) == set(expected) + + def test_pep420_ns_package(self): + packages = find_420_packages( + self.dist_dir, include=['pkg*'], exclude=['pkg.subpkg.assets']) + self._assert_packages(packages, ['pkg', 'pkg.nspkg', 'pkg.subpkg']) + + def test_pep420_ns_package_no_includes(self): + packages = find_420_packages( + self.dist_dir, exclude=['pkg.subpkg.assets']) + self._assert_packages(packages, ['docs', 'pkg', 'pkg.nspkg', 'pkg.subpkg']) + + def test_pep420_ns_package_no_includes_or_excludes(self): + packages = find_420_packages(self.dist_dir) + expected = [ + 'docs', 'pkg', 'pkg.nspkg', 'pkg.subpkg', 'pkg.subpkg.assets'] + self._assert_packages(packages, expected) + + def test_regular_package_with_nested_pep420_ns_packages(self): + self._touch('__init__.py', self.pkg_dir) + packages = find_420_packages( + self.dist_dir, exclude=['docs', 'pkg.subpkg.assets']) + self._assert_packages(packages, ['pkg', 'pkg.nspkg', 'pkg.subpkg']) + + def test_pep420_ns_package_no_non_package_dirs(self): + shutil.rmtree(self.docs_dir) + shutil.rmtree(os.path.join(self.dist_dir, 'pkg/subpkg/assets')) + packages = find_420_packages(self.dist_dir) + self._assert_packages(packages, ['pkg', 'pkg.nspkg', 'pkg.subpkg']) diff --git a/awx/lib/site-packages/setuptools/tests/test_integration.py b/awx/lib/site-packages/setuptools/tests/test_integration.py new file mode 100644 index 0000000000..90bb43136c --- /dev/null +++ b/awx/lib/site-packages/setuptools/tests/test_integration.py @@ -0,0 +1,99 @@ +"""Run some integration tests. + +Try to install a few packages. +""" + +import glob +import os +import sys + +import pytest + +from setuptools.command.easy_install import easy_install +from setuptools.command import easy_install as easy_install_pkg +from setuptools.dist import Distribution +from setuptools.compat import urlopen + + +def setup_module(module): + packages = 'stevedore', 'virtualenvwrapper', 'pbr', 'novaclient' + for pkg in packages: + try: + __import__(pkg) + tmpl = "Integration tests cannot run when {pkg} is installed" + pytest.skip(tmpl.format(**locals())) + except ImportError: + pass + + try: + urlopen('https://pypi.python.org/pypi') + except Exception as exc: + pytest.skip(reason=str(exc)) + + +@pytest.fixture +def install_context(request, tmpdir, monkeypatch): + """Fixture to set up temporary installation directory. + """ + # Save old values so we can restore them. + new_cwd = tmpdir.mkdir('cwd') + user_base = tmpdir.mkdir('user_base') + user_site = tmpdir.mkdir('user_site') + install_dir = tmpdir.mkdir('install_dir') + + def fin(): + # undo the monkeypatch, particularly needed under + # windows because of kept handle on cwd + monkeypatch.undo() + new_cwd.remove() + user_base.remove() + user_site.remove() + install_dir.remove() + request.addfinalizer(fin) + + # Change the environment and site settings to control where the + # files are installed and ensure we do not overwrite anything. + monkeypatch.chdir(new_cwd) + monkeypatch.setattr(easy_install_pkg, '__file__', user_site.strpath) + monkeypatch.setattr('site.USER_BASE', user_base.strpath) + monkeypatch.setattr('site.USER_SITE', user_site.strpath) + monkeypatch.setattr('sys.path', sys.path + [install_dir.strpath]) + monkeypatch.setenv('PYTHONPATH', os.path.pathsep.join(sys.path)) + + # Set up the command for performing the installation. + dist = Distribution() + cmd = easy_install(dist) + cmd.install_dir = install_dir.strpath + return cmd + + +def _install_one(requirement, cmd, pkgname, modulename): + cmd.args = [requirement] + cmd.ensure_finalized() + cmd.run() + target = cmd.install_dir + dest_path = glob.glob(os.path.join(target, pkgname + '*.egg')) + assert dest_path + assert os.path.exists(os.path.join(dest_path[0], pkgname, modulename)) + + +def test_stevedore(install_context): + _install_one('stevedore', install_context, + 'stevedore', 'extension.py') + + +@pytest.mark.xfail +def test_virtualenvwrapper(install_context): + _install_one('virtualenvwrapper', install_context, + 'virtualenvwrapper', 'hook_loader.py') + + +def test_pbr(install_context): + _install_one('pbr', install_context, + 'pbr', 'core.py') + + +@pytest.mark.xfail +def test_python_novaclient(install_context): + _install_one('python-novaclient', install_context, + 'novaclient', 'base.py') diff --git a/awx/lib/site-packages/setuptools/tests/test_markerlib.py b/awx/lib/site-packages/setuptools/tests/test_markerlib.py index dae71cba46..8197b49dc4 100644 --- a/awx/lib/site-packages/setuptools/tests/test_markerlib.py +++ b/awx/lib/site-packages/setuptools/tests/test_markerlib.py @@ -1,48 +1,43 @@ import os -import unittest -from setuptools.tests.py26compat import skipIf -try: - import ast -except ImportError: - pass +import pytest -class TestMarkerlib(unittest.TestCase): - @skipIf('ast' not in globals(), - "ast not available (Python < 2.6?)") +class TestMarkerlib: + + @pytest.mark.importorskip('ast') def test_markers(self): from _markerlib import interpret, default_environment, compile - + os_name = os.name - - self.assertTrue(interpret("")) - - self.assertTrue(interpret("os.name != 'buuuu'")) - self.assertTrue(interpret("os_name != 'buuuu'")) - self.assertTrue(interpret("python_version > '1.0'")) - self.assertTrue(interpret("python_version < '5.0'")) - self.assertTrue(interpret("python_version <= '5.0'")) - self.assertTrue(interpret("python_version >= '1.0'")) - self.assertTrue(interpret("'%s' in os.name" % os_name)) - self.assertTrue(interpret("'%s' in os_name" % os_name)) - self.assertTrue(interpret("'buuuu' not in os.name")) - - self.assertFalse(interpret("os.name == 'buuuu'")) - self.assertFalse(interpret("os_name == 'buuuu'")) - self.assertFalse(interpret("python_version < '1.0'")) - self.assertFalse(interpret("python_version > '5.0'")) - self.assertFalse(interpret("python_version >= '5.0'")) - self.assertFalse(interpret("python_version <= '1.0'")) - self.assertFalse(interpret("'%s' not in os.name" % os_name)) - self.assertFalse(interpret("'buuuu' in os.name and python_version >= '5.0'")) - self.assertFalse(interpret("'buuuu' in os_name and python_version >= '5.0'")) - + + assert interpret("") + + assert interpret("os.name != 'buuuu'") + assert interpret("os_name != 'buuuu'") + assert interpret("python_version > '1.0'") + assert interpret("python_version < '5.0'") + assert interpret("python_version <= '5.0'") + assert interpret("python_version >= '1.0'") + assert interpret("'%s' in os.name" % os_name) + assert interpret("'%s' in os_name" % os_name) + assert interpret("'buuuu' not in os.name") + + assert not interpret("os.name == 'buuuu'") + assert not interpret("os_name == 'buuuu'") + assert not interpret("python_version < '1.0'") + assert not interpret("python_version > '5.0'") + assert not interpret("python_version >= '5.0'") + assert not interpret("python_version <= '1.0'") + assert not interpret("'%s' not in os.name" % os_name) + assert not interpret("'buuuu' in os.name and python_version >= '5.0'") + assert not interpret("'buuuu' in os_name and python_version >= '5.0'") + environment = default_environment() environment['extra'] = 'test' - self.assertTrue(interpret("extra == 'test'", environment)) - self.assertFalse(interpret("extra == 'doc'", environment)) - + assert interpret("extra == 'test'", environment) + assert not interpret("extra == 'doc'", environment) + def raises_nameError(): try: interpret("python.version == '42'") @@ -50,9 +45,9 @@ class TestMarkerlib(unittest.TestCase): pass else: raise Exception("Expected NameError") - + raises_nameError() - + def raises_syntaxError(): try: interpret("(x for x in (4,))") @@ -60,9 +55,9 @@ class TestMarkerlib(unittest.TestCase): pass else: raise Exception("Expected SyntaxError") - + raises_syntaxError() - + statement = "python_version == '5'" - self.assertEqual(compile(statement).__doc__, statement) - + assert compile(statement).__doc__ == statement + diff --git a/awx/lib/site-packages/setuptools/tests/test_msvc9compiler.py b/awx/lib/site-packages/setuptools/tests/test_msvc9compiler.py new file mode 100644 index 0000000000..09e0460c56 --- /dev/null +++ b/awx/lib/site-packages/setuptools/tests/test_msvc9compiler.py @@ -0,0 +1,179 @@ +""" +Tests for msvc9compiler. +""" + +import os +import contextlib +import distutils.errors + +import pytest +try: + from unittest import mock +except ImportError: + import mock + +from . import contexts + +# importing only setuptools should apply the patch +__import__('setuptools') + +pytest.importorskip("distutils.msvc9compiler") + + +def mock_reg(hkcu=None, hklm=None): + """ + Return a mock for distutils.msvc9compiler.Reg, patched + to mock out the functions that access the registry. + """ + + _winreg = getattr(distutils.msvc9compiler, '_winreg', None) + winreg = getattr(distutils.msvc9compiler, 'winreg', _winreg) + + hives = { + winreg.HKEY_CURRENT_USER: hkcu or {}, + winreg.HKEY_LOCAL_MACHINE: hklm or {}, + } + + @classmethod + def read_keys(cls, base, key): + """Return list of registry keys.""" + hive = hives.get(base, {}) + return [ + k.rpartition('\\')[2] + for k in hive if k.startswith(key.lower()) + ] + + @classmethod + def read_values(cls, base, key): + """Return dict of registry keys and values.""" + hive = hives.get(base, {}) + return dict( + (k.rpartition('\\')[2], hive[k]) + for k in hive if k.startswith(key.lower()) + ) + + return mock.patch.multiple(distutils.msvc9compiler.Reg, + read_keys=read_keys, read_values=read_values) + + +class TestModulePatch: + """ + Ensure that importing setuptools is sufficient to replace + the standard find_vcvarsall function with a version that + recognizes the "Visual C++ for Python" package. + """ + + key_32 = r'software\microsoft\devdiv\vcforpython\9.0\installdir' + key_64 = r'software\wow6432node\microsoft\devdiv\vcforpython\9.0\installdir' + + def test_patched(self): + "Test the module is actually patched" + mod_name = distutils.msvc9compiler.find_vcvarsall.__module__ + assert mod_name == "setuptools.msvc9_support", "find_vcvarsall unpatched" + + def test_no_registry_entryies_means_nothing_found(self): + """ + No registry entries or environment variable should lead to an error + directing the user to download vcpython27. + """ + find_vcvarsall = distutils.msvc9compiler.find_vcvarsall + query_vcvarsall = distutils.msvc9compiler.query_vcvarsall + + with contexts.environment(VS90COMNTOOLS=None): + with mock_reg(): + assert find_vcvarsall(9.0) is None + + expected = distutils.errors.DistutilsPlatformError + with pytest.raises(expected) as exc: + query_vcvarsall(9.0) + assert 'aka.ms/vcpython27' in str(exc) + + @pytest.yield_fixture + def user_preferred_setting(self): + """ + Set up environment with different install dirs for user vs. system + and yield the user_install_dir for the expected result. + """ + with self.mock_install_dir() as user_install_dir: + with self.mock_install_dir() as system_install_dir: + reg = mock_reg( + hkcu={ + self.key_32: user_install_dir, + }, + hklm={ + self.key_32: system_install_dir, + self.key_64: system_install_dir, + }, + ) + with reg: + yield user_install_dir + + def test_prefer_current_user(self, user_preferred_setting): + """ + Ensure user's settings are preferred. + """ + result = distutils.msvc9compiler.find_vcvarsall(9.0) + expected = os.path.join(user_preferred_setting, 'vcvarsall.bat') + assert expected == result + + @pytest.yield_fixture + def local_machine_setting(self): + """ + Set up environment with only the system environment configured. + """ + with self.mock_install_dir() as system_install_dir: + reg = mock_reg( + hklm={ + self.key_32: system_install_dir, + }, + ) + with reg: + yield system_install_dir + + def test_local_machine_recognized(self, local_machine_setting): + """ + Ensure machine setting is honored if user settings are not present. + """ + result = distutils.msvc9compiler.find_vcvarsall(9.0) + expected = os.path.join(local_machine_setting, 'vcvarsall.bat') + assert expected == result + + @pytest.yield_fixture + def x64_preferred_setting(self): + """ + Set up environment with 64-bit and 32-bit system settings configured + and yield the canonical location. + """ + with self.mock_install_dir() as x32_dir: + with self.mock_install_dir() as x64_dir: + reg = mock_reg( + hklm={ + # This *should* only exist on 32-bit machines + self.key_32: x32_dir, + # This *should* only exist on 64-bit machines + self.key_64: x64_dir, + }, + ) + with reg: + yield x32_dir + + def test_ensure_64_bit_preferred(self, x64_preferred_setting): + """ + Ensure 64-bit system key is preferred. + """ + result = distutils.msvc9compiler.find_vcvarsall(9.0) + expected = os.path.join(x64_preferred_setting, 'vcvarsall.bat') + assert expected == result + + @staticmethod + @contextlib.contextmanager + def mock_install_dir(): + """ + Make a mock install dir in a unique location so that tests can + distinguish which dir was detected in a given scenario. + """ + with contexts.tempdir() as result: + vcvarsall = os.path.join(result, 'vcvarsall.bat') + with open(vcvarsall, 'w'): + pass + yield result diff --git a/awx/lib/site-packages/setuptools/tests/test_packageindex.py b/awx/lib/site-packages/setuptools/tests/test_packageindex.py index 664566a36c..dcd90d6fe7 100644 --- a/awx/lib/site-packages/setuptools/tests/test_packageindex.py +++ b/awx/lib/site-packages/setuptools/tests/test_packageindex.py @@ -1,26 +1,24 @@ -"""Package Index Tests -""" import sys -import os -import unittest -import pkg_resources -from setuptools.compat import urllib2, httplib, HTTPError, unicode, pathname2url import distutils.errors + +from setuptools.compat import httplib, HTTPError, unicode, pathname2url + +import pkg_resources import setuptools.package_index from setuptools.tests.server import IndexServer -class TestPackageIndex(unittest.TestCase): + +class TestPackageIndex: def test_bad_url_bad_port(self): index = setuptools.package_index.PackageIndex() url = 'http://127.0.0.1:0/nonesuch/test_package_index' try: v = index.open_url(url) - except Exception: - v = sys.exc_info()[1] - self.assertTrue(url in str(v)) + except Exception as v: + assert url in str(v) else: - self.assertTrue(isinstance(v, HTTPError)) + assert isinstance(v, HTTPError) def test_bad_url_typo(self): # issue 16 @@ -33,11 +31,10 @@ class TestPackageIndex(unittest.TestCase): url = 'url:%20https://svn.plone.org/svn/collective/inquant.contentmirror.plone/trunk' try: v = index.open_url(url) - except Exception: - v = sys.exc_info()[1] - self.assertTrue(url in str(v)) + except Exception as v: + assert url in str(v) else: - self.assertTrue(isinstance(v, HTTPError)) + assert isinstance(v, HTTPError) def test_bad_url_bad_status_line(self): index = setuptools.package_index.PackageIndex( @@ -51,9 +48,8 @@ class TestPackageIndex(unittest.TestCase): url = 'http://example.com' try: v = index.open_url(url) - except Exception: - v = sys.exc_info()[1] - self.assertTrue('line' in str(v)) + except Exception as v: + assert 'line' in str(v) else: raise AssertionError('Should have raise here!') @@ -69,8 +65,7 @@ class TestPackageIndex(unittest.TestCase): url = 'http://http://svn.pythonpaste.org/Paste/wphp/trunk' try: index.open_url(url) - except distutils.errors.DistutilsError: - error = sys.exc_info()[1] + except distutils.errors.DistutilsError as error: msg = unicode(error) assert 'nonnumeric port' in msg or 'getaddrinfo failed' in msg or 'Name or service not known' in msg return @@ -94,7 +89,7 @@ class TestPackageIndex(unittest.TestCase): hosts=('www.example.com',) ) url = 'file:///tmp/test_package_index' - self.assertTrue(index.url_ok(url, True)) + assert index.url_ok(url, True) def test_links_priority(self): """ @@ -127,21 +122,30 @@ class TestPackageIndex(unittest.TestCase): server.stop() # the distribution has been found - self.assertTrue('foobar' in pi) + assert 'foobar' in pi # we have only one link, because links are compared without md5 - self.assertTrue(len(pi['foobar'])==1) + assert len(pi['foobar'])==1 # the link should be from the index - self.assertTrue('correct_md5' in pi['foobar'][0].location) + assert 'correct_md5' in pi['foobar'][0].location def test_parse_bdist_wininst(self): - self.assertEqual(setuptools.package_index.parse_bdist_wininst( - 'reportlab-2.5.win32-py2.4.exe'), ('reportlab-2.5', '2.4', 'win32')) - self.assertEqual(setuptools.package_index.parse_bdist_wininst( - 'reportlab-2.5.win32.exe'), ('reportlab-2.5', None, 'win32')) - self.assertEqual(setuptools.package_index.parse_bdist_wininst( - 'reportlab-2.5.win-amd64-py2.7.exe'), ('reportlab-2.5', '2.7', 'win-amd64')) - self.assertEqual(setuptools.package_index.parse_bdist_wininst( - 'reportlab-2.5.win-amd64.exe'), ('reportlab-2.5', None, 'win-amd64')) + parse = setuptools.package_index.parse_bdist_wininst + + actual = parse('reportlab-2.5.win32-py2.4.exe') + expected = 'reportlab-2.5', '2.4', 'win32' + assert actual == expected + + actual = parse('reportlab-2.5.win32.exe') + expected = 'reportlab-2.5', None, 'win32' + assert actual == expected + + actual = parse('reportlab-2.5.win-amd64-py2.7.exe') + expected = 'reportlab-2.5', '2.7', 'win-amd64' + assert actual == expected + + actual = parse('reportlab-2.5.win-amd64.exe') + expected = 'reportlab-2.5', None, 'win-amd64' + assert actual == expected def test__vcs_split_rev_from_url(self): """ @@ -149,55 +153,51 @@ class TestPackageIndex(unittest.TestCase): """ vsrfu = setuptools.package_index.PackageIndex._vcs_split_rev_from_url url, rev = vsrfu('https://example.com/bar@2995') - self.assertEqual(url, 'https://example.com/bar') - self.assertEqual(rev, '2995') + assert url == 'https://example.com/bar' + assert rev == '2995' - def test_local_index(self): + def test_local_index(self, tmpdir): """ local_open should be able to read an index from the file system. """ - f = open('index.html', 'w') - f.write('<div>content</div>') - f.close() - try: - url = 'file:' + pathname2url(os.getcwd()) + '/' - res = setuptools.package_index.local_open(url) - finally: - os.remove('index.html') + index_file = tmpdir / 'index.html' + with index_file.open('w') as f: + f.write('<div>content</div>') + url = 'file:' + pathname2url(str(tmpdir)) + '/' + res = setuptools.package_index.local_open(url) assert 'content' in res.read() -class TestContentCheckers(unittest.TestCase): +class TestContentCheckers: def test_md5(self): checker = setuptools.package_index.HashChecker.from_url( 'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478') checker.feed('You should probably not be using MD5'.encode('ascii')) - self.assertEqual(checker.hash.hexdigest(), - 'f12895fdffbd45007040d2e44df98478') - self.assertTrue(checker.is_valid()) + assert checker.hash.hexdigest() == 'f12895fdffbd45007040d2e44df98478' + assert checker.is_valid() def test_other_fragment(self): "Content checks should succeed silently if no hash is present" checker = setuptools.package_index.HashChecker.from_url( 'http://foo/bar#something%20completely%20different') checker.feed('anything'.encode('ascii')) - self.assertTrue(checker.is_valid()) + assert checker.is_valid() def test_blank_md5(self): "Content checks should succeed if a hash is empty" checker = setuptools.package_index.HashChecker.from_url( 'http://foo/bar#md5=') checker.feed('anything'.encode('ascii')) - self.assertTrue(checker.is_valid()) + assert checker.is_valid() def test_get_hash_name_md5(self): checker = setuptools.package_index.HashChecker.from_url( 'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478') - self.assertEqual(checker.hash_name, 'md5') + assert checker.hash_name == 'md5' def test_report(self): checker = setuptools.package_index.HashChecker.from_url( 'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478') rep = checker.report(lambda x: x, 'My message about %s') - self.assertEqual(rep, 'My message about md5') + assert rep == 'My message about md5' diff --git a/awx/lib/site-packages/setuptools/tests/test_sandbox.py b/awx/lib/site-packages/setuptools/tests/test_sandbox.py index 3dad137683..6e1e9e1cd2 100644 --- a/awx/lib/site-packages/setuptools/tests/test_sandbox.py +++ b/awx/lib/site-packages/setuptools/tests/test_sandbox.py @@ -1,69 +1,43 @@ """develop tests """ -import sys import os -import shutil -import unittest -import tempfile import types +import pytest + import pkg_resources import setuptools.sandbox -from setuptools.sandbox import DirectorySandbox, SandboxViolation +from setuptools.sandbox import DirectorySandbox -def has_win32com(): - """ - Run this to determine if the local machine has win32com, and if it - does, include additional tests. - """ - if not sys.platform.startswith('win32'): - return False - try: - mod = __import__('win32com') - except ImportError: - return False - return True -class TestSandbox(unittest.TestCase): +class TestSandbox: - def setUp(self): - self.dir = tempfile.mkdtemp() - - def tearDown(self): - shutil.rmtree(self.dir) - - def test_devnull(self): - if sys.version < '2.4': - return - sandbox = DirectorySandbox(self.dir) + def test_devnull(self, tmpdir): + sandbox = DirectorySandbox(str(tmpdir)) sandbox.run(self._file_writer(os.devnull)) + @staticmethod def _file_writer(path): def do_write(): - f = open(path, 'w') - f.write('xxx') - f.close() + with open(path, 'w') as f: + f.write('xxx') return do_write - _file_writer = staticmethod(_file_writer) - - if has_win32com(): - def test_win32com(self): - """ - win32com should not be prevented from caching COM interfaces - in gen_py. - """ - import win32com - gen_py = win32com.__gen_path__ - target = os.path.join(gen_py, 'test_write') - sandbox = DirectorySandbox(self.dir) - try: - try: - sandbox.run(self._file_writer(target)) - except SandboxViolation: - self.fail("Could not create gen_py file due to SandboxViolation") - finally: - if os.path.exists(target): os.remove(target) + def test_win32com(self, tmpdir): + """ + win32com should not be prevented from caching COM interfaces + in gen_py. + """ + win32com = pytest.importorskip('win32com') + gen_py = win32com.__gen_path__ + target = os.path.join(gen_py, 'test_write') + sandbox = DirectorySandbox(str(tmpdir)) + try: + # attempt to create gen_py file + sandbox.run(self._file_writer(target)) + finally: + if os.path.exists(target): + os.remove(target) def test_setup_py_with_BOM(self): """ @@ -72,8 +46,57 @@ class TestSandbox(unittest.TestCase): target = pkg_resources.resource_filename(__name__, 'script-with-bom.py') namespace = types.ModuleType('namespace') - setuptools.sandbox.execfile(target, vars(namespace)) + setuptools.sandbox._execfile(target, vars(namespace)) assert namespace.result == 'passed' -if __name__ == '__main__': - unittest.main() + def test_setup_py_with_CRLF(self, tmpdir): + setup_py = tmpdir / 'setup.py' + with setup_py.open('wb') as stream: + stream.write(b'"degenerate script"\r\n') + setuptools.sandbox._execfile(str(setup_py), globals()) + + +class TestExceptionSaver: + def test_exception_trapped(self): + with setuptools.sandbox.ExceptionSaver(): + raise ValueError("details") + + def test_exception_resumed(self): + with setuptools.sandbox.ExceptionSaver() as saved_exc: + raise ValueError("details") + + with pytest.raises(ValueError) as caught: + saved_exc.resume() + + assert isinstance(caught.value, ValueError) + assert str(caught.value) == 'details' + + def test_exception_reconstructed(self): + orig_exc = ValueError("details") + + with setuptools.sandbox.ExceptionSaver() as saved_exc: + raise orig_exc + + with pytest.raises(ValueError) as caught: + saved_exc.resume() + + assert isinstance(caught.value, ValueError) + assert caught.value is not orig_exc + + def test_no_exception_passes_quietly(self): + with setuptools.sandbox.ExceptionSaver() as saved_exc: + pass + + saved_exc.resume() + + def test_unpickleable_exception(self): + class CantPickleThis(Exception): + "This Exception is unpickleable because it's not in globals" + + with setuptools.sandbox.ExceptionSaver() as saved_exc: + raise CantPickleThis('detail') + + with pytest.raises(setuptools.sandbox.UnpickleableException) as caught: + saved_exc.resume() + + assert str(caught.value) == "CantPickleThis('detail',)" diff --git a/awx/lib/site-packages/setuptools/tests/test_sdist.py b/awx/lib/site-packages/setuptools/tests/test_sdist.py index 71d10757bc..9013b505db 100644 --- a/awx/lib/site-packages/setuptools/tests/test_sdist.py +++ b/awx/lib/site-packages/setuptools/tests/test_sdist.py @@ -6,18 +6,16 @@ import os import shutil import sys import tempfile -import unittest import unicodedata -import re -from setuptools.tests import environment, test_svn -from setuptools.tests.py26compat import skipIf +import contextlib -from setuptools.compat import StringIO, unicode -from setuptools.tests.py26compat import skipIf -from setuptools.command.sdist import sdist, walk_revctrl +import pytest + +import pkg_resources +from setuptools.compat import StringIO, unicode, PY3, PY2 +from setuptools.command.sdist import sdist from setuptools.command.egg_info import manifest_maker from setuptools.dist import Distribution -from setuptools import svn_utils SETUP_ATTRS = { 'name': 'sdist_test', @@ -34,32 +32,33 @@ setup(**%r) """ % SETUP_ATTRS -if sys.version_info >= (3,): +if PY3: LATIN1_FILENAME = 'smörbröd.py'.encode('latin-1') else: LATIN1_FILENAME = 'sm\xf6rbr\xf6d.py' # Cannot use context manager because of Python 2.4 +@contextlib.contextmanager def quiet(): - global old_stdout, old_stderr old_stdout, old_stderr = sys.stdout, sys.stderr sys.stdout, sys.stderr = StringIO(), StringIO() - -def unquiet(): - sys.stdout, sys.stderr = old_stdout, old_stderr + try: + yield + finally: + sys.stdout, sys.stderr = old_stdout, old_stderr # Fake byte literals for Python <= 2.5 def b(s, encoding='utf-8'): - if sys.version_info >= (3,): + if PY3: return s.encode(encoding) return s # Convert to POSIX path def posix(path): - if sys.version_info >= (3,) and not isinstance(path, str): + if PY3 and not isinstance(path, str): return path.replace(os.sep.encode('ascii'), b('/')) else: return path.replace(os.sep, '/') @@ -74,17 +73,18 @@ def decompose(path): path = unicodedata.normalize('NFD', path) path = path.encode('utf-8') except UnicodeError: - pass # Not UTF-8 + pass # Not UTF-8 return path -class TestSdistTest(unittest.TestCase): +class TestSdistTest: - def setUp(self): + def setup_method(self, method): self.temp_dir = tempfile.mkdtemp() f = open(os.path.join(self.temp_dir, 'setup.py'), 'w') f.write(SETUP_PY) f.close() + # Set up the rest of the test package test_pkg = os.path.join(self.temp_dir, 'sdist_test') os.mkdir(test_pkg) @@ -97,7 +97,7 @@ class TestSdistTest(unittest.TestCase): self.old_cwd = os.getcwd() os.chdir(self.temp_dir) - def tearDown(self): + def teardown_method(self, method): os.chdir(self.old_cwd) shutil.rmtree(self.temp_dir) @@ -112,17 +112,40 @@ class TestSdistTest(unittest.TestCase): cmd = sdist(dist) cmd.ensure_finalized() - # squelch output - quiet() - try: + with quiet(): cmd.run() - finally: - unquiet() manifest = cmd.filelist.files - self.assertTrue(os.path.join('sdist_test', 'a.txt') in manifest) - self.assertTrue(os.path.join('sdist_test', 'b.txt') in manifest) - self.assertTrue(os.path.join('sdist_test', 'c.rst') not in manifest) + assert os.path.join('sdist_test', 'a.txt') in manifest + assert os.path.join('sdist_test', 'b.txt') in manifest + assert os.path.join('sdist_test', 'c.rst') not in manifest + + + def test_defaults_case_sensitivity(self): + """ + Make sure default files (README.*, etc.) are added in a case-sensitive + way to avoid problems with packages built on Windows. + """ + + open(os.path.join(self.temp_dir, 'readme.rst'), 'w').close() + open(os.path.join(self.temp_dir, 'SETUP.cfg'), 'w').close() + + dist = Distribution(SETUP_ATTRS) + # the extension deliberately capitalized for this test + # to make sure the actual filename (not capitalized) gets added + # to the manifest + dist.script_name = 'setup.PY' + cmd = sdist(dist) + cmd.ensure_finalized() + + with quiet(): + cmd.run() + + # lowercase all names so we can test in a case-insensitive way to make sure the files are not included + manifest = map(lambda x: x.lower(), cmd.filelist.files) + assert 'readme.rst' not in manifest, manifest + assert 'setup.py' not in manifest, manifest + assert 'setup.cfg' not in manifest, manifest def test_manifest_is_written_with_utf8_encoding(self): # Test for #303. @@ -135,34 +158,31 @@ class TestSdistTest(unittest.TestCase): # UTF-8 filename filename = os.path.join('sdist_test', 'smörbröd.py') + # Must create the file or it will get stripped. + open(filename, 'w').close() + # Add UTF-8 filename and write manifest - quiet() - try: + with quiet(): mm.run() - mm.filelist.files.append(filename) + mm.filelist.append(filename) mm.write_manifest() - finally: - unquiet() manifest = open(mm.manifest, 'rbU') contents = manifest.read() manifest.close() # The manifest should be UTF-8 encoded - try: - u_contents = contents.decode('UTF-8') - except UnicodeDecodeError: - e = sys.exc_info()[1] - self.fail(e) + u_contents = contents.decode('UTF-8') # The manifest should contain the UTF-8 filename - if sys.version_info >= (3,): - self.assertTrue(posix(filename) in u_contents) - else: - self.assertTrue(posix(filename) in contents) + if PY2: + fs_enc = sys.getfilesystemencoding() + filename = filename.decode(fs_enc) + + assert posix(filename) in u_contents # Python 3 only - if sys.version_info >= (3,): + if PY3: def test_write_manifest_allows_utf8_filenames(self): # Test for #303. @@ -175,36 +195,37 @@ class TestSdistTest(unittest.TestCase): # UTF-8 filename filename = os.path.join(b('sdist_test'), b('smörbröd.py')) + # Must touch the file or risk removal + open(filename, "w").close() + # Add filename and write manifest - quiet() - try: + with quiet(): mm.run() u_filename = filename.decode('utf-8') mm.filelist.files.append(u_filename) # Re-write manifest mm.write_manifest() - finally: - unquiet() manifest = open(mm.manifest, 'rbU') contents = manifest.read() manifest.close() # The manifest should be UTF-8 encoded - try: - contents.decode('UTF-8') - except UnicodeDecodeError: - e = sys.exc_info()[1] - self.fail(e) + contents.decode('UTF-8') # The manifest should contain the UTF-8 filename - self.assertTrue(posix(filename) in contents) + assert posix(filename) in contents # The filelist should have been updated as well - self.assertTrue(u_filename in mm.filelist.files) + assert u_filename in mm.filelist.files def test_write_manifest_skips_non_utf8_filenames(self): - # Test for #303. + """ + Files that cannot be encoded to UTF-8 (specifically, those that + weren't originally successfully decoded and have surrogate + escapes) should be omitted from the manifest. + See https://bitbucket.org/tarek/distribute/issue/303 for history. + """ dist = Distribution(SETUP_ATTRS) dist.script_name = 'setup.py' mm = manifest_maker(dist) @@ -215,32 +236,25 @@ class TestSdistTest(unittest.TestCase): filename = os.path.join(b('sdist_test'), LATIN1_FILENAME) # Add filename with surrogates and write manifest - quiet() - try: + with quiet(): mm.run() u_filename = filename.decode('utf-8', 'surrogateescape') - mm.filelist.files.append(u_filename) + mm.filelist.append(u_filename) # Re-write manifest mm.write_manifest() - finally: - unquiet() manifest = open(mm.manifest, 'rbU') contents = manifest.read() manifest.close() # The manifest should be UTF-8 encoded - try: - contents.decode('UTF-8') - except UnicodeDecodeError: - e = sys.exc_info()[1] - self.fail(e) + contents.decode('UTF-8') # The Latin-1 filename should have been skipped - self.assertFalse(posix(filename) in contents) + assert posix(filename) not in contents # The filelist should have been updated as well - self.assertFalse(u_filename in mm.filelist.files) + assert u_filename not in mm.filelist.files def test_manifest_is_read_with_utf8_encoding(self): # Test for #303. @@ -250,17 +264,14 @@ class TestSdistTest(unittest.TestCase): cmd.ensure_finalized() # Create manifest - quiet() - try: + with quiet(): cmd.run() - finally: - unquiet() # Add UTF-8 filename to manifest filename = os.path.join(b('sdist_test'), b('smörbröd.py')) cmd.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') manifest = open(cmd.manifest, 'ab') - manifest.write(b('\n')+filename) + manifest.write(b('\n') + filename) manifest.close() # The file must exist to be included in the filelist @@ -268,19 +279,16 @@ class TestSdistTest(unittest.TestCase): # Re-read manifest cmd.filelist.files = [] - quiet() - try: + with quiet(): cmd.read_manifest() - finally: - unquiet() # The filelist should contain the UTF-8 filename - if sys.version_info >= (3,): + if PY3: filename = filename.decode('utf-8') - self.assertTrue(filename in cmd.filelist.files) + assert filename in cmd.filelist.files # Python 3 only - if sys.version_info >= (3,): + if PY3: def test_read_manifest_skips_non_utf8_filenames(self): # Test for #303. @@ -290,17 +298,14 @@ class TestSdistTest(unittest.TestCase): cmd.ensure_finalized() # Create manifest - quiet() - try: + with quiet(): cmd.run() - finally: - unquiet() # Add Latin-1 filename to manifest filename = os.path.join(b('sdist_test'), LATIN1_FILENAME) cmd.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt') manifest = open(cmd.manifest, 'ab') - manifest.write(b('\n')+filename) + manifest.write(b('\n') + filename) manifest.close() # The file must exist to be included in the filelist @@ -308,22 +313,16 @@ class TestSdistTest(unittest.TestCase): # Re-read manifest cmd.filelist.files = [] - quiet() - try: - try: - cmd.read_manifest() - except UnicodeDecodeError: - e = sys.exc_info()[1] - self.fail(e) - finally: - unquiet() + with quiet(): + cmd.read_manifest() # The Latin-1 filename should have been skipped filename = filename.decode('latin-1') - self.assertFalse(filename in cmd.filelist.files) + assert filename not in cmd.filelist.files - @skipIf(sys.version_info >= (3,) and locale.getpreferredencoding() != 'UTF-8', - 'Unittest fails if locale is not utf-8 but the manifests is recorded correctly') + @pytest.mark.skipif(PY3 and locale.getpreferredencoding() != 'UTF-8', + reason='Unittest fails if locale is not utf-8 but the manifests is ' + 'recorded correctly') def test_sdist_with_utf8_encoded_filename(self): # Test for #303. dist = Distribution(SETUP_ATTRS) @@ -335,31 +334,28 @@ class TestSdistTest(unittest.TestCase): filename = os.path.join(b('sdist_test'), b('smörbröd.py')) open(filename, 'w').close() - quiet() - try: + with quiet(): cmd.run() - finally: - unquiet() if sys.platform == 'darwin': filename = decompose(filename) - if sys.version_info >= (3,): + if PY3: fs_enc = sys.getfilesystemencoding() if sys.platform == 'win32': if fs_enc == 'cp1252': # Python 3 mangles the UTF-8 filename filename = filename.decode('cp1252') - self.assertTrue(filename in cmd.filelist.files) + assert filename in cmd.filelist.files else: filename = filename.decode('mbcs') - self.assertTrue(filename in cmd.filelist.files) + assert filename in cmd.filelist.files else: filename = filename.decode('utf-8') - self.assertTrue(filename in cmd.filelist.files) + assert filename in cmd.filelist.files else: - self.assertTrue(filename in cmd.filelist.files) + assert filename in cmd.filelist.files def test_sdist_with_latin1_encoded_filename(self): # Test for #303. @@ -371,16 +367,13 @@ class TestSdistTest(unittest.TestCase): # Latin-1 filename filename = os.path.join(b('sdist_test'), LATIN1_FILENAME) open(filename, 'w').close() - self.assertTrue(os.path.isfile(filename)) + assert os.path.isfile(filename) - quiet() - try: + with quiet(): cmd.run() - finally: - unquiet() - if sys.version_info >= (3,): - #not all windows systems have a default FS encoding of cp1252 + if PY3: + # not all windows systems have a default FS encoding of cp1252 if sys.platform == 'win32': # Latin-1 is similar to Windows-1252 however # on mbcs filesys it is not in latin-1 encoding @@ -390,146 +383,37 @@ class TestSdistTest(unittest.TestCase): else: filename = filename.decode('latin-1') - self.assertTrue(filename in cmd.filelist.files) + assert filename in cmd.filelist.files else: # The Latin-1 filename should have been skipped filename = filename.decode('latin-1') - self.assertFalse(filename in cmd.filelist.files) + filename not in cmd.filelist.files else: - # No conversion takes place under Python 2 and the file - # is included. We shall keep it that way for BBB. - self.assertTrue(filename in cmd.filelist.files) + # Under Python 2 there seems to be no decoded string in the + # filelist. However, due to decode and encoding of the + # file name to get utf-8 Manifest the latin1 maybe excluded + try: + # fs_enc should match how one is expect the decoding to + # be proformed for the manifest output. + fs_enc = sys.getfilesystemencoding() + filename.decode(fs_enc) + assert filename in cmd.filelist.files + except UnicodeDecodeError: + filename not in cmd.filelist.files -class TestDummyOutput(environment.ZippedEnvironment): +def test_default_revctrl(): + """ + When _default_revctrl was removed from the `setuptools.command.sdist` + module in 10.0, it broke some systems which keep an old install of + setuptools (Distribute) around. Those old versions require that the + setuptools package continue to implement that interface, so this + function provides that interface, stubbed. See #320 for details. - def setUp(self): - self.datafile = os.path.join('setuptools', 'tests', - 'svn_data', "dummy.zip") - self.dataname = "dummy" - super(TestDummyOutput, self).setUp() - - def _run(self): - code, data = environment.run_setup_py(["sdist"], - pypath=self.old_cwd, - data_stream=0) - if code: - info = "DIR: " + os.path.abspath('.') - info += "\n SDIST RETURNED: %i\n\n" % code - info += data - raise AssertionError(info) - - datalines = data.splitlines() - - possible = ( - "running sdist", - "running egg_info", - "creating dummy\.egg-info", - "writing dummy\.egg-info", - "writing top-level names to dummy\.egg-info", - "writing dependency_links to dummy\.egg-info", - "writing manifest file 'dummy\.egg-info", - "reading manifest file 'dummy\.egg-info", - "reading manifest template 'MANIFEST\.in'", - "writing manifest file 'dummy\.egg-info", - "creating dummy-0.1.1", - "making hard links in dummy-0\.1\.1", - "copying files to dummy-0\.1\.1", - "copying \S+ -> dummy-0\.1\.1", - "copying dummy", - "copying dummy\.egg-info", - "hard linking \S+ -> dummy-0\.1\.1", - "hard linking dummy", - "hard linking dummy\.egg-info", - "Writing dummy-0\.1\.1", - "creating dist", - "creating 'dist", - "Creating tar archive", - "running check", - "adding 'dummy-0\.1\.1", - "tar .+ dist/dummy-0\.1\.1\.tar dummy-0\.1\.1", - "gzip .+ dist/dummy-0\.1\.1\.tar", - "removing 'dummy-0\.1\.1' \\(and everything under it\\)", - ) - - print(" DIR: " + os.path.abspath('.')) - for line in datalines: - found = False - for pattern in possible: - if re.match(pattern, line): - print(" READ: " + line) - found = True - break - if not found: - raise AssertionError("Unexpexected: %s\n-in-\n%s" - % (line, data)) - - return data - - def test_sources(self): - self._run() - - -class TestSvn(environment.ZippedEnvironment): - - def setUp(self): - version = svn_utils.SvnInfo.get_svn_version() - if not version: # None or Empty - return - - self.base_version = tuple([int(x) for x in version.split('.')][:2]) - - if not self.base_version: - raise ValueError('No SVN tools installed') - elif self.base_version < (1, 3): - raise ValueError('Insufficient SVN Version %s' % version) - elif self.base_version >= (1, 9): - #trying the latest version - self.base_version = (1, 8) - - self.dataname = "svn%i%i_example" % self.base_version - self.datafile = os.path.join('setuptools', 'tests', - 'svn_data', self.dataname + ".zip") - super(TestSvn, self).setUp() - - @skipIf(not test_svn._svn_check, "No SVN to text, in the first place") - def test_walksvn(self): - if self.base_version >= (1, 6): - folder2 = 'third party2' - folder3 = 'third party3' - else: - folder2 = 'third_party2' - folder3 = 'third_party3' - - #TODO is this right - expected = set([ - os.path.join('a file'), - os.path.join(folder2, 'Changes.txt'), - os.path.join(folder2, 'MD5SUMS'), - os.path.join(folder2, 'README.txt'), - os.path.join(folder3, 'Changes.txt'), - os.path.join(folder3, 'MD5SUMS'), - os.path.join(folder3, 'README.txt'), - os.path.join(folder3, 'TODO.txt'), - os.path.join(folder3, 'fin'), - os.path.join('third_party', 'README.txt'), - os.path.join('folder', folder2, 'Changes.txt'), - os.path.join('folder', folder2, 'MD5SUMS'), - os.path.join('folder', folder2, 'WatashiNiYomimasu.txt'), - os.path.join('folder', folder3, 'Changes.txt'), - os.path.join('folder', folder3, 'fin'), - os.path.join('folder', folder3, 'MD5SUMS'), - os.path.join('folder', folder3, 'oops'), - os.path.join('folder', folder3, 'WatashiNiYomimasu.txt'), - os.path.join('folder', folder3, 'ZuMachen.txt'), - os.path.join('folder', 'third_party', 'WatashiNiYomimasu.txt'), - os.path.join('folder', 'lalala.txt'), - os.path.join('folder', 'quest.txt'), - # The example will have a deleted file - # (or should) but shouldn't return it - ]) - self.assertEqual(set(x for x in walk_revctrl()), expected) - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) + This interface must be maintained until Ubuntu 12.04 is no longer + supported (by Setuptools). + """ + ep_def = 'svn_cvs = setuptools.command.sdist:_default_revctrl' + ep = pkg_resources.EntryPoint.parse(ep_def) + res = ep.resolve() + assert hasattr(res, '__iter__') diff --git a/awx/lib/site-packages/setuptools/tests/test_test.py b/awx/lib/site-packages/setuptools/tests/test_test.py index 7a06a40329..a66294c951 100644 --- a/awx/lib/site-packages/setuptools/tests/test_test.py +++ b/awx/lib/site-packages/setuptools/tests/test_test.py @@ -1,124 +1,91 @@ # -*- coding: UTF-8 -*- -"""develop tests -""" -import sys -import os, shutil, tempfile, unittest -import tempfile +from __future__ import unicode_literals + +import os import site -from distutils.errors import DistutilsError -from setuptools.compat import StringIO +import pytest + from setuptools.command.test import test -from setuptools.command import easy_install as easy_install_pkg from setuptools.dist import Distribution -SETUP_PY = """\ -from setuptools import setup +from .textwrap import DALS +from . import contexts -setup(name='foo', - packages=['name', 'name.space', 'name.space.tests'], - namespace_packages=['name'], - test_suite='name.space.tests.test_suite', -) -""" +SETUP_PY = DALS(""" + from setuptools import setup -NS_INIT = """# -*- coding: Latin-1 -*- -# Söme Arbiträry Ünicode to test Issüé 310 -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - from pkgutil import extend_path - __path__ = extend_path(__path__, __name__) -""" -# Make sure this is Latin-1 binary, before writing: -if sys.version_info < (3,): - NS_INIT = NS_INIT.decode('UTF-8') -NS_INIT = NS_INIT.encode('Latin-1') + setup(name='foo', + packages=['name', 'name.space', 'name.space.tests'], + namespace_packages=['name'], + test_suite='name.space.tests.test_suite', + ) + """) -TEST_PY = """import unittest +NS_INIT = DALS(""" + # -*- coding: Latin-1 -*- + # Söme Arbiträry Ünicode to test Distribute Issüé 310 + try: + __import__('pkg_resources').declare_namespace(__name__) + except ImportError: + from pkgutil import extend_path + __path__ = extend_path(__path__, __name__) + """) -class TestTest(unittest.TestCase): - def test_test(self): - print "Foo" # Should fail under Python 3 unless 2to3 is used +TEST_PY = DALS(""" + import unittest -test_suite = unittest.makeSuite(TestTest) -""" + class TestTest(unittest.TestCase): + def test_test(self): + print "Foo" # Should fail under Python 3 unless 2to3 is used -class TestTestTest(unittest.TestCase): + test_suite = unittest.makeSuite(TestTest) + """) - def setUp(self): - if sys.version < "2.6" or hasattr(sys, 'real_prefix'): - return - # Directory structure - self.dir = tempfile.mkdtemp() - os.mkdir(os.path.join(self.dir, 'name')) - os.mkdir(os.path.join(self.dir, 'name', 'space')) - os.mkdir(os.path.join(self.dir, 'name', 'space', 'tests')) - # setup.py - setup = os.path.join(self.dir, 'setup.py') - f = open(setup, 'wt') +@pytest.fixture +def sample_test(tmpdir_cwd): + os.makedirs('name/space/tests') + + # setup.py + with open('setup.py', 'wt') as f: f.write(SETUP_PY) - f.close() - self.old_cwd = os.getcwd() - # name/__init__.py - init = os.path.join(self.dir, 'name', '__init__.py') - f = open(init, 'wb') - f.write(NS_INIT) - f.close() - # name/space/__init__.py - init = os.path.join(self.dir, 'name', 'space', '__init__.py') - f = open(init, 'wt') + + # name/__init__.py + with open('name/__init__.py', 'wb') as f: + f.write(NS_INIT.encode('Latin-1')) + + # name/space/__init__.py + with open('name/space/__init__.py', 'wt') as f: f.write('#empty\n') - f.close() - # name/space/tests/__init__.py - init = os.path.join(self.dir, 'name', 'space', 'tests', '__init__.py') - f = open(init, 'wt') + + # name/space/tests/__init__.py + with open('name/space/tests/__init__.py', 'wt') as f: f.write(TEST_PY) - f.close() - os.chdir(self.dir) - self.old_base = site.USER_BASE - site.USER_BASE = tempfile.mkdtemp() - self.old_site = site.USER_SITE - site.USER_SITE = tempfile.mkdtemp() - def tearDown(self): - if sys.version < "2.6" or hasattr(sys, 'real_prefix'): - return - - os.chdir(self.old_cwd) - shutil.rmtree(self.dir) - shutil.rmtree(site.USER_BASE) - shutil.rmtree(site.USER_SITE) - site.USER_BASE = self.old_base - site.USER_SITE = self.old_site +@pytest.mark.skipif('hasattr(sys, "real_prefix")') +@pytest.mark.usefixtures('user_override') +@pytest.mark.usefixtures('sample_test') +class TestTestTest: def test_test(self): - if sys.version < "2.6" or hasattr(sys, 'real_prefix'): - return - - dist = Distribution(dict( + params = dict( name='foo', packages=['name', 'name.space', 'name.space.tests'], namespace_packages=['name'], test_suite='name.space.tests.test_suite', use_2to3=True, - )) + ) + dist = Distribution(params) dist.script_name = 'setup.py' cmd = test(dist) cmd.user = 1 cmd.ensure_finalized() cmd.install_dir = site.USER_SITE cmd.user = 1 - old_stdout = sys.stdout - sys.stdout = StringIO() - try: - try: # try/except/finally doesn't work in Python 2.4, so we need nested try-statements. + with contexts.quiet(): + # The test runner calls sys.exit + with contexts.suppress_exceptions(SystemExit): cmd.run() - except SystemExit: # The test runner calls sys.exit, stop that making an error. - pass - finally: - sys.stdout = old_stdout - diff --git a/awx/lib/site-packages/setuptools/tests/test_upload_docs.py b/awx/lib/site-packages/setuptools/tests/test_upload_docs.py index 769f16cc5a..cc71cadb23 100644 --- a/awx/lib/site-packages/setuptools/tests/test_upload_docs.py +++ b/awx/lib/site-packages/setuptools/tests/test_upload_docs.py @@ -1,72 +1,59 @@ -"""build_ext tests -""" -import sys, os, shutil, tempfile, unittest, site, zipfile +import os +import zipfile +import contextlib + +import pytest + from setuptools.command.upload_docs import upload_docs from setuptools.dist import Distribution -SETUP_PY = """\ -from setuptools import setup +from .textwrap import DALS +from . import contexts -setup(name='foo') -""" -class TestUploadDocsTest(unittest.TestCase): - def setUp(self): - self.dir = tempfile.mkdtemp() - setup = os.path.join(self.dir, 'setup.py') - f = open(setup, 'w') +SETUP_PY = DALS( + """ + from setuptools import setup + + setup(name='foo') + """) + + +@pytest.fixture +def sample_project(tmpdir_cwd): + # setup.py + with open('setup.py', 'wt') as f: f.write(SETUP_PY) - f.close() - self.old_cwd = os.getcwd() - os.chdir(self.dir) - self.upload_dir = os.path.join(self.dir, 'build') - os.mkdir(self.upload_dir) + os.mkdir('build') - # A test document. - f = open(os.path.join(self.upload_dir, 'index.html'), 'w') + # A test document. + with open('build/index.html', 'w') as f: f.write("Hello world.") - f.close() - # An empty folder. - os.mkdir(os.path.join(self.upload_dir, 'empty')) + # An empty folder. + os.mkdir('build/empty') - if sys.version >= "2.6": - self.old_base = site.USER_BASE - site.USER_BASE = upload_docs.USER_BASE = tempfile.mkdtemp() - self.old_site = site.USER_SITE - site.USER_SITE = upload_docs.USER_SITE = tempfile.mkdtemp() - def tearDown(self): - os.chdir(self.old_cwd) - shutil.rmtree(self.dir) - if sys.version >= "2.6": - shutil.rmtree(site.USER_BASE) - shutil.rmtree(site.USER_SITE) - site.USER_BASE = self.old_base - site.USER_SITE = self.old_site +@pytest.mark.usefixtures('sample_project') +@pytest.mark.usefixtures('user_override') +class TestUploadDocsTest: def test_create_zipfile(self): - # Test to make sure zipfile creation handles common cases. - # This explicitly includes a folder containing an empty folder. + """ + Ensure zipfile creation handles common cases, including a folder + containing an empty folder. + """ dist = Distribution() cmd = upload_docs(dist) - cmd.upload_dir = self.upload_dir - cmd.target_dir = self.upload_dir - tmp_dir = tempfile.mkdtemp() - tmp_file = os.path.join(tmp_dir, 'foo.zip') - try: + cmd.target_dir = cmd.upload_dir = 'build' + with contexts.tempdir() as tmp_dir: + tmp_file = os.path.join(tmp_dir, 'foo.zip') zip_file = cmd.create_zipfile(tmp_file) assert zipfile.is_zipfile(tmp_file) - zip_file = zipfile.ZipFile(tmp_file) # woh... - - assert zip_file.namelist() == ['index.html'] - - zip_file.close() - finally: - shutil.rmtree(tmp_dir) - + with contextlib.closing(zipfile.ZipFile(tmp_file)) as zip_file: + assert zip_file.namelist() == ['index.html'] diff --git a/awx/lib/site-packages/setuptools/tests/test_windows_wrappers.py b/awx/lib/site-packages/setuptools/tests/test_windows_wrappers.py new file mode 100644 index 0000000000..5b14d07b0e --- /dev/null +++ b/awx/lib/site-packages/setuptools/tests/test_windows_wrappers.py @@ -0,0 +1,183 @@ +""" +Python Script Wrapper for Windows +================================= + +setuptools includes wrappers for Python scripts that allows them to be +executed like regular windows programs. There are 2 wrappers, one +for command-line programs, cli.exe, and one for graphical programs, +gui.exe. These programs are almost identical, function pretty much +the same way, and are generated from the same source file. The +wrapper programs are used by copying them to the directory containing +the script they are to wrap and with the same name as the script they +are to wrap. +""" + +from __future__ import absolute_import + +import sys +import textwrap +import subprocess + +import pytest + +from setuptools.command.easy_install import nt_quote_arg +import pkg_resources + + +pytestmark = pytest.mark.skipif(sys.platform != 'win32', reason="Windows only") + + +class WrapperTester: + + @classmethod + def prep_script(cls, template): + python_exe = nt_quote_arg(sys.executable) + return template % locals() + + @classmethod + def create_script(cls, tmpdir): + """ + Create a simple script, foo-script.py + + Note that the script starts with a Unix-style '#!' line saying which + Python executable to run. The wrapper will use this line to find the + correct Python executable. + """ + + script = cls.prep_script(cls.script_tmpl) + + with (tmpdir / cls.script_name).open('w') as f: + f.write(script) + + # also copy cli.exe to the sample directory + with (tmpdir / cls.wrapper_name).open('wb') as f: + w = pkg_resources.resource_string('setuptools', cls.wrapper_source) + f.write(w) + + +class TestCLI(WrapperTester): + script_name = 'foo-script.py' + wrapper_source = 'cli-32.exe' + wrapper_name = 'foo.exe' + script_tmpl = textwrap.dedent(""" + #!%(python_exe)s + import sys + input = repr(sys.stdin.read()) + print(sys.argv[0][-14:]) + print(sys.argv[1:]) + print(input) + if __debug__: + print('non-optimized') + """).lstrip() + + def test_basic(self, tmpdir): + """ + When the copy of cli.exe, foo.exe in this example, runs, it examines + the path name it was run with and computes a Python script path name + by removing the '.exe' suffix and adding the '-script.py' suffix. (For + GUI programs, the suffix '-script.pyw' is added.) This is why we + named out script the way we did. Now we can run out script by running + the wrapper: + + This example was a little pathological in that it exercised windows + (MS C runtime) quoting rules: + + - Strings containing spaces are surrounded by double quotes. + + - Double quotes in strings need to be escaped by preceding them with + back slashes. + + - One or more backslashes preceding double quotes need to be escaped + by preceding each of them with back slashes. + """ + self.create_script(tmpdir) + cmd = [ + str(tmpdir / 'foo.exe'), + 'arg1', + 'arg 2', + 'arg "2\\"', + 'arg 4\\', + 'arg5 a\\\\b', + ] + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE) + stdout, stderr = proc.communicate('hello\nworld\n'.encode('ascii')) + actual = stdout.decode('ascii').replace('\r\n', '\n') + expected = textwrap.dedent(r""" + \foo-script.py + ['arg1', 'arg 2', 'arg "2\\"', 'arg 4\\', 'arg5 a\\\\b'] + 'hello\nworld\n' + non-optimized + """).lstrip() + assert actual == expected + + def test_with_options(self, tmpdir): + """ + Specifying Python Command-line Options + -------------------------------------- + + You can specify a single argument on the '#!' line. This can be used + to specify Python options like -O, to run in optimized mode or -i + to start the interactive interpreter. You can combine multiple + options as usual. For example, to run in optimized mode and + enter the interpreter after running the script, you could use -Oi: + """ + self.create_script(tmpdir) + tmpl = textwrap.dedent(""" + #!%(python_exe)s -Oi + import sys + input = repr(sys.stdin.read()) + print(sys.argv[0][-14:]) + print(sys.argv[1:]) + print(input) + if __debug__: + print('non-optimized') + sys.ps1 = '---' + """).lstrip() + with (tmpdir / 'foo-script.py').open('w') as f: + f.write(self.prep_script(tmpl)) + cmd = [str(tmpdir / 'foo.exe')] + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout, stderr = proc.communicate() + actual = stdout.decode('ascii').replace('\r\n', '\n') + expected = textwrap.dedent(r""" + \foo-script.py + [] + '' + --- + """).lstrip() + assert actual == expected + + +class TestGUI(WrapperTester): + """ + Testing the GUI Version + ----------------------- + """ + script_name = 'bar-script.pyw' + wrapper_source = 'gui-32.exe' + wrapper_name = 'bar.exe' + + script_tmpl = textwrap.dedent(""" + #!%(python_exe)s + import sys + f = open(sys.argv[1], 'wb') + bytes_written = f.write(repr(sys.argv[2]).encode('utf-8')) + f.close() + """).strip() + + def test_basic(self, tmpdir): + """Test the GUI version with the simple scipt, bar-script.py""" + self.create_script(tmpdir) + + cmd = [ + str(tmpdir / 'bar.exe'), + str(tmpdir / 'test_output.txt'), + 'Test Argument', + ] + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout, stderr = proc.communicate() + assert not stdout + assert not stderr + with (tmpdir / 'test_output.txt').open('rb') as f_out: + actual = f_out.read().decode('ascii') + assert actual == repr('Test Argument') diff --git a/awx/lib/site-packages/setuptools/tests/textwrap.py b/awx/lib/site-packages/setuptools/tests/textwrap.py new file mode 100644 index 0000000000..5cd9e5bca8 --- /dev/null +++ b/awx/lib/site-packages/setuptools/tests/textwrap.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import + +import textwrap + + +def DALS(s): + "dedent and left-strip" + return textwrap.dedent(s).lstrip() diff --git a/awx/lib/site-packages/setuptools/unicode_utils.py b/awx/lib/site-packages/setuptools/unicode_utils.py new file mode 100644 index 0000000000..d2de941a69 --- /dev/null +++ b/awx/lib/site-packages/setuptools/unicode_utils.py @@ -0,0 +1,41 @@ +import unicodedata +import sys +from setuptools.compat import unicode as decoded_string + + +# HFS Plus uses decomposed UTF-8 +def decompose(path): + if isinstance(path, decoded_string): + return unicodedata.normalize('NFD', path) + try: + path = path.decode('utf-8') + path = unicodedata.normalize('NFD', path) + path = path.encode('utf-8') + except UnicodeError: + pass # Not UTF-8 + return path + + +def filesys_decode(path): + """ + Ensure that the given path is decoded, + NONE when no expected encoding works + """ + + fs_enc = sys.getfilesystemencoding() + if isinstance(path, decoded_string): + return path + + for enc in (fs_enc, "utf-8"): + try: + return path.decode(enc) + except UnicodeDecodeError: + continue + + +def try_encode(string, enc): + "turn unicode encoding into a functional routine" + try: + return string.encode(enc) + except UnicodeEncodeError: + return None diff --git a/awx/lib/site-packages/setuptools/utils.py b/awx/lib/site-packages/setuptools/utils.py new file mode 100644 index 0000000000..91e4b87f65 --- /dev/null +++ b/awx/lib/site-packages/setuptools/utils.py @@ -0,0 +1,11 @@ +import os +import os.path + + +def cs_path_exists(fspath): + if not os.path.exists(fspath): + return False + # make absolute so we always have a directory + abspath = os.path.abspath(fspath) + directory, filename = os.path.split(abspath) + return filename in os.listdir(directory) \ No newline at end of file diff --git a/awx/lib/site-packages/setuptools/version.py b/awx/lib/site-packages/setuptools/version.py index 2b9ccf1770..8bb69c5f6d 100644 --- a/awx/lib/site-packages/setuptools/version.py +++ b/awx/lib/site-packages/setuptools/version.py @@ -1 +1 @@ -__version__ = '2.2' +__version__ = '12.0.5' diff --git a/awx/lib/site-packages/setuptools/windows_support.py b/awx/lib/site-packages/setuptools/windows_support.py new file mode 100644 index 0000000000..cb977cff95 --- /dev/null +++ b/awx/lib/site-packages/setuptools/windows_support.py @@ -0,0 +1,29 @@ +import platform +import ctypes + + +def windows_only(func): + if platform.system() != 'Windows': + return lambda *args, **kwargs: None + return func + + +@windows_only +def hide_file(path): + """ + Set the hidden attribute on a file or directory. + + From http://stackoverflow.com/questions/19622133/ + + `path` must be text. + """ + __import__('ctypes.wintypes') + SetFileAttributes = ctypes.windll.kernel32.SetFileAttributesW + SetFileAttributes.argtypes = ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD + SetFileAttributes.restype = ctypes.wintypes.BOOL + + FILE_ATTRIBUTE_HIDDEN = 0x02 + + ret = SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN) + if not ret: + raise ctypes.WinError() From 6712388b23bed86e46ffd5ab4a7ba952e721e649 Mon Sep 17 00:00:00 2001 From: Matthew Jones <mat@matburt.net> Date: Thu, 29 Jan 2015 12:32:31 -0500 Subject: [PATCH 03/10] Upgrade pytz to 2014.10 --- awx/lib/site-packages/pytz/__init__.py | 13 +- awx/lib/site-packages/pytz/tzinfo.py | 17 +- .../site-packages/pytz/zoneinfo/Africa/Accra | Bin 392 -> 840 bytes .../pytz/zoneinfo/Africa/Addis_Ababa | Bin 206 -> 283 bytes .../site-packages/pytz/zoneinfo/Africa/Asmara | Bin 227 -> 283 bytes .../site-packages/pytz/zoneinfo/Africa/Asmera | Bin 227 -> 283 bytes .../site-packages/pytz/zoneinfo/Africa/Bamako | Bin 238 -> 170 bytes .../site-packages/pytz/zoneinfo/Africa/Bangui | Bin 171 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Banjul | Bin 246 -> 170 bytes .../site-packages/pytz/zoneinfo/Africa/Bissau | Bin 208 -> 208 bytes .../pytz/zoneinfo/Africa/Blantyre | Bin 171 -> 171 bytes .../pytz/zoneinfo/Africa/Brazzaville | Bin 171 -> 171 bytes .../pytz/zoneinfo/Africa/Bujumbura | Bin 149 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Cairo | Bin 2795 -> 2779 bytes .../pytz/zoneinfo/Africa/Casablanca | Bin 1693 -> 1657 bytes .../pytz/zoneinfo/Africa/Conakry | Bin 238 -> 170 bytes .../site-packages/pytz/zoneinfo/Africa/Dakar | Bin 208 -> 170 bytes .../pytz/zoneinfo/Africa/Dar_es_Salaam | Bin 243 -> 283 bytes .../pytz/zoneinfo/Africa/Djibouti | Bin 171 -> 283 bytes .../site-packages/pytz/zoneinfo/Africa/Douala | Bin 171 -> 171 bytes .../pytz/zoneinfo/Africa/El_Aaiun | Bin 1523 -> 1487 bytes .../pytz/zoneinfo/Africa/Freetown | Bin 691 -> 170 bytes .../pytz/zoneinfo/Africa/Gaborone | Bin 260 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Harare | Bin 171 -> 171 bytes .../pytz/zoneinfo/Africa/Kampala | Bin 283 -> 283 bytes .../site-packages/pytz/zoneinfo/Africa/Kigali | Bin 171 -> 171 bytes .../pytz/zoneinfo/Africa/Kinshasa | Bin 149 -> 171 bytes .../pytz/zoneinfo/Africa/Libreville | Bin 171 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Lome | Bin 148 -> 170 bytes .../site-packages/pytz/zoneinfo/Africa/Luanda | Bin 204 -> 171 bytes .../pytz/zoneinfo/Africa/Lubumbashi | Bin 149 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Lusaka | Bin 171 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Malabo | Bin 209 -> 171 bytes .../site-packages/pytz/zoneinfo/Africa/Maseru | Bin 218 -> 271 bytes .../pytz/zoneinfo/Africa/Mbabane | Bin 174 -> 271 bytes .../pytz/zoneinfo/Africa/Mogadishu | Bin 236 -> 283 bytes .../site-packages/pytz/zoneinfo/Africa/Niamey | Bin 239 -> 171 bytes .../pytz/zoneinfo/Africa/Nouakchott | Bin 238 -> 170 bytes .../pytz/zoneinfo/Africa/Ouagadougou | Bin 170 -> 170 bytes .../pytz/zoneinfo/Africa/Porto-Novo | Bin 209 -> 171 bytes .../pytz/zoneinfo/Africa/Sao_Tome | Bin 195 -> 170 bytes .../pytz/zoneinfo/Africa/Timbuktu | Bin 238 -> 170 bytes .../pytz/zoneinfo/America/Grand_Turk | Bin 1897 -> 1287 bytes .../pytz/zoneinfo/America/Jamaica | Bin 507 -> 507 bytes .../pytz/zoneinfo/America/Metlakatla | Bin 743 -> 716 bytes .../pytz/zoneinfo/Antarctica/Casey | Bin 269 -> 272 bytes .../pytz/zoneinfo/Antarctica/Macquarie | Bin 1518 -> 1530 bytes .../site-packages/pytz/zoneinfo/Asia/Chita | Bin 0 -> 1236 bytes .../pytz/zoneinfo/Asia/Chongqing | Bin 403 -> 414 bytes .../pytz/zoneinfo/Asia/Chungking | Bin 403 -> 414 bytes .../site-packages/pytz/zoneinfo/Asia/Dacca | Bin 390 -> 390 bytes .../site-packages/pytz/zoneinfo/Asia/Dhaka | Bin 390 -> 390 bytes .../site-packages/pytz/zoneinfo/Asia/Harbin | Bin 477 -> 414 bytes .../pytz/zoneinfo/Asia/Ho_Chi_Minh | Bin 269 -> 373 bytes .../site-packages/pytz/zoneinfo/Asia/Irkutsk | Bin 1229 -> 1259 bytes .../site-packages/pytz/zoneinfo/Asia/Jayapura | Bin 239 -> 241 bytes .../site-packages/pytz/zoneinfo/Asia/Kashgar | Bin 433 -> 171 bytes .../site-packages/pytz/zoneinfo/Asia/Khandyga | Bin 1295 -> 1324 bytes .../pytz/zoneinfo/Asia/Krasnoyarsk | Bin 1196 -> 1226 bytes .../site-packages/pytz/zoneinfo/Asia/Magadan | Bin 1197 -> 1227 bytes .../pytz/zoneinfo/Asia/Novokuznetsk | Bin 1234 -> 1248 bytes .../pytz/zoneinfo/Asia/Novosibirsk | Bin 1210 -> 1208 bytes awx/lib/site-packages/pytz/zoneinfo/Asia/Omsk | Bin 1196 -> 1226 bytes .../pytz/zoneinfo/Asia/Phnom_Penh | Bin 269 -> 204 bytes .../pytz/zoneinfo/Asia/Pyongyang | Bin 284 -> 279 bytes .../site-packages/pytz/zoneinfo/Asia/Riyadh | Bin 171 -> 171 bytes .../site-packages/pytz/zoneinfo/Asia/Saigon | Bin 269 -> 373 bytes .../site-packages/pytz/zoneinfo/Asia/Sakhalin | Bin 1227 -> 1227 bytes .../pytz/zoneinfo/Asia/Samarkand | Bin 691 -> 691 bytes .../site-packages/pytz/zoneinfo/Asia/Seoul | Bin 422 -> 571 bytes .../site-packages/pytz/zoneinfo/Asia/Shanghai | Bin 419 -> 414 bytes .../pytz/zoneinfo/Asia/Srednekolymsk | Bin 0 -> 1237 bytes .../site-packages/pytz/zoneinfo/Asia/Taipei | Bin 750 -> 800 bytes .../site-packages/pytz/zoneinfo/Asia/Tashkent | Bin 681 -> 681 bytes .../site-packages/pytz/zoneinfo/Asia/Tbilisi | Bin 1142 -> 1142 bytes .../site-packages/pytz/zoneinfo/Asia/Tokyo | Bin 353 -> 355 bytes .../site-packages/pytz/zoneinfo/Asia/Urumqi | Bin 403 -> 171 bytes .../site-packages/pytz/zoneinfo/Asia/Ust-Nera | Bin 1263 -> 1293 bytes .../pytz/zoneinfo/Asia/Vientiane | Bin 269 -> 204 bytes .../pytz/zoneinfo/Asia/Vladivostok | Bin 1211 -> 1227 bytes .../site-packages/pytz/zoneinfo/Asia/Yakutsk | Bin 1197 -> 1226 bytes .../pytz/zoneinfo/Asia/Yekaterinburg | Bin 1266 -> 1334 bytes .../pytz/zoneinfo/Atlantic/Azores | Bin 3488 -> 3488 bytes .../pytz/zoneinfo/Atlantic/Madeira | Bin 3478 -> 3478 bytes .../pytz/zoneinfo/Atlantic/St_Helena | Bin 203 -> 170 bytes .../site-packages/pytz/zoneinfo/Australia/ACT | Bin 2209 -> 2223 bytes .../pytz/zoneinfo/Australia/Adelaide | Bin 2224 -> 2238 bytes .../pytz/zoneinfo/Australia/Brisbane | Bin 439 -> 452 bytes .../pytz/zoneinfo/Australia/Broken_Hill | Bin 2259 -> 2274 bytes .../pytz/zoneinfo/Australia/Canberra | Bin 2209 -> 2223 bytes .../pytz/zoneinfo/Australia/Currie | Bin 2209 -> 2223 bytes .../pytz/zoneinfo/Australia/Darwin | Bin 310 -> 323 bytes .../pytz/zoneinfo/Australia/Eucla | Bin 472 -> 487 bytes .../pytz/zoneinfo/Australia/Hobart | Bin 2321 -> 2335 bytes .../site-packages/pytz/zoneinfo/Australia/LHI | Bin 1847 -> 1859 bytes .../pytz/zoneinfo/Australia/Lindeman | Bin 509 -> 522 bytes .../pytz/zoneinfo/Australia/Lord_Howe | Bin 1847 -> 1859 bytes .../pytz/zoneinfo/Australia/Melbourne | Bin 2209 -> 2223 bytes .../site-packages/pytz/zoneinfo/Australia/NSW | Bin 2209 -> 2223 bytes .../pytz/zoneinfo/Australia/North | Bin 310 -> 323 bytes .../pytz/zoneinfo/Australia/Perth | Bin 466 -> 479 bytes .../pytz/zoneinfo/Australia/Queensland | Bin 439 -> 452 bytes .../pytz/zoneinfo/Australia/South | Bin 2224 -> 2238 bytes .../pytz/zoneinfo/Australia/Sydney | Bin 2209 -> 2223 bytes .../pytz/zoneinfo/Australia/Tasmania | Bin 2321 -> 2335 bytes .../pytz/zoneinfo/Australia/Victoria | Bin 2209 -> 2223 bytes .../pytz/zoneinfo/Australia/West | Bin 466 -> 479 bytes .../pytz/zoneinfo/Australia/Yancowinna | Bin 2259 -> 2274 bytes awx/lib/site-packages/pytz/zoneinfo/Egypt | Bin 2795 -> 2779 bytes .../pytz/zoneinfo/Europe/Budapest | Bin 2433 -> 2405 bytes .../pytz/zoneinfo/Europe/Helsinki | Bin 1909 -> 1909 bytes .../pytz/zoneinfo/Europe/Kaliningrad | Bin 1520 -> 1550 bytes .../site-packages/pytz/zoneinfo/Europe/Lisbon | Bin 3453 -> 3453 bytes .../pytz/zoneinfo/Europe/Mariehamn | Bin 1909 -> 1909 bytes .../site-packages/pytz/zoneinfo/Europe/Minsk | Bin 1354 -> 1368 bytes .../site-packages/pytz/zoneinfo/Europe/Moscow | Bin 1490 -> 1528 bytes .../site-packages/pytz/zoneinfo/Europe/Riga | Bin 2235 -> 2235 bytes .../site-packages/pytz/zoneinfo/Europe/Samara | Bin 1344 -> 1394 bytes .../pytz/zoneinfo/Europe/Simferopol | Bin 1474 -> 1504 bytes .../pytz/zoneinfo/Europe/Volgograd | Bin 1248 -> 1317 bytes .../pytz/zoneinfo/Indian/Antananarivo | Bin 241 -> 283 bytes .../site-packages/pytz/zoneinfo/Indian/Comoro | Bin 171 -> 283 bytes .../pytz/zoneinfo/Indian/Mayotte | Bin 171 -> 283 bytes awx/lib/site-packages/pytz/zoneinfo/Jamaica | Bin 507 -> 507 bytes awx/lib/site-packages/pytz/zoneinfo/Japan | Bin 353 -> 355 bytes awx/lib/site-packages/pytz/zoneinfo/NZ-CHAT | Bin 2032 -> 2057 bytes awx/lib/site-packages/pytz/zoneinfo/PRC | Bin 419 -> 414 bytes .../site-packages/pytz/zoneinfo/Pacific/Apia | Bin 1101 -> 1102 bytes .../pytz/zoneinfo/Pacific/Bougainville | Bin 0 -> 280 bytes .../pytz/zoneinfo/Pacific/Chatham | Bin 2032 -> 2057 bytes .../site-packages/pytz/zoneinfo/Pacific/Fiji | Bin 1078 -> 1074 bytes .../pytz/zoneinfo/Pacific/Pago_Pago | Bin 312 -> 272 bytes .../site-packages/pytz/zoneinfo/Pacific/Samoa | Bin 312 -> 272 bytes awx/lib/site-packages/pytz/zoneinfo/Portugal | Bin 3453 -> 3453 bytes awx/lib/site-packages/pytz/zoneinfo/ROC | Bin 750 -> 800 bytes awx/lib/site-packages/pytz/zoneinfo/ROK | Bin 422 -> 571 bytes awx/lib/site-packages/pytz/zoneinfo/US/Samoa | Bin 312 -> 272 bytes awx/lib/site-packages/pytz/zoneinfo/W-SU | Bin 1490 -> 1528 bytes .../site-packages/pytz/zoneinfo/iso3166.tab | 12 +- awx/lib/site-packages/pytz/zoneinfo/zone.tab | 72 ++-- .../site-packages/pytz/zoneinfo/zone1970.tab | 371 ++++++++++++++++++ 141 files changed, 424 insertions(+), 61 deletions(-) create mode 100644 awx/lib/site-packages/pytz/zoneinfo/Asia/Chita create mode 100644 awx/lib/site-packages/pytz/zoneinfo/Asia/Srednekolymsk create mode 100644 awx/lib/site-packages/pytz/zoneinfo/Pacific/Bougainville create mode 100644 awx/lib/site-packages/pytz/zoneinfo/zone1970.tab diff --git a/awx/lib/site-packages/pytz/__init__.py b/awx/lib/site-packages/pytz/__init__.py index b836ae336c..e5cbe56d6b 100644 --- a/awx/lib/site-packages/pytz/__init__.py +++ b/awx/lib/site-packages/pytz/__init__.py @@ -9,8 +9,8 @@ on how to use these modules. ''' # The Olson database is updated several times a year. -OLSON_VERSION = '2014d' -VERSION = '2014.4' # Switching to pip compatible version numbering. +OLSON_VERSION = '2014j' +VERSION = '2014.10' # Switching to pip compatible version numbering. __version__ = VERSION OLSEN_VERSION = OLSON_VERSION # Old releases had this misspelling @@ -735,6 +735,7 @@ all_timezones = \ 'Asia/Bishkek', 'Asia/Brunei', 'Asia/Calcutta', + 'Asia/Chita', 'Asia/Choibalsan', 'Asia/Chongqing', 'Asia/Chungking', @@ -792,6 +793,7 @@ all_timezones = \ 'Asia/Seoul', 'Asia/Shanghai', 'Asia/Singapore', + 'Asia/Srednekolymsk', 'Asia/Taipei', 'Asia/Tashkent', 'Asia/Tbilisi', @@ -1002,6 +1004,7 @@ all_timezones = \ 'PST8PDT', 'Pacific/Apia', 'Pacific/Auckland', + 'Pacific/Bougainville', 'Pacific/Chatham', 'Pacific/Chuuk', 'Pacific/Easter', @@ -1297,8 +1300,8 @@ common_timezones = \ 'Asia/Beirut', 'Asia/Bishkek', 'Asia/Brunei', + 'Asia/Chita', 'Asia/Choibalsan', - 'Asia/Chongqing', 'Asia/Colombo', 'Asia/Damascus', 'Asia/Dhaka', @@ -1306,7 +1309,6 @@ common_timezones = \ 'Asia/Dubai', 'Asia/Dushanbe', 'Asia/Gaza', - 'Asia/Harbin', 'Asia/Hebron', 'Asia/Ho_Chi_Minh', 'Asia/Hong_Kong', @@ -1318,7 +1320,6 @@ common_timezones = \ 'Asia/Kabul', 'Asia/Kamchatka', 'Asia/Karachi', - 'Asia/Kashgar', 'Asia/Kathmandu', 'Asia/Khandyga', 'Asia/Kolkata', @@ -1348,6 +1349,7 @@ common_timezones = \ 'Asia/Seoul', 'Asia/Shanghai', 'Asia/Singapore', + 'Asia/Srednekolymsk', 'Asia/Taipei', 'Asia/Tashkent', 'Asia/Tbilisi', @@ -1460,6 +1462,7 @@ common_timezones = \ 'Indian/Reunion', 'Pacific/Apia', 'Pacific/Auckland', + 'Pacific/Bougainville', 'Pacific/Chatham', 'Pacific/Chuuk', 'Pacific/Easter', diff --git a/awx/lib/site-packages/pytz/tzinfo.py b/awx/lib/site-packages/pytz/tzinfo.py index d53e9ff172..1318872df2 100644 --- a/awx/lib/site-packages/pytz/tzinfo.py +++ b/awx/lib/site-packages/pytz/tzinfo.py @@ -142,7 +142,7 @@ class StaticTzInfo(BaseTzInfo): def __reduce__(self): # Special pickle to zone remains a singleton and to cope with - # database changes. + # database changes. return pytz._p, (self.zone,) @@ -369,13 +369,15 @@ class DstTzInfo(BaseTzInfo): # hints to be passed in (such as the UTC offset or abbreviation), # but that is just getting silly. # - # Choose the earliest (by UTC) applicable timezone. - sorting_keys = {} + # Choose the earliest (by UTC) applicable timezone if is_dst=True + # Choose the latest (by UTC) applicable timezone if is_dst=False + # i.e., behave like end-of-DST transition + dates = {} # utc -> local for local_dt in filtered_possible_loc_dt: - key = local_dt.replace(tzinfo=None) - local_dt.tzinfo._utcoffset - sorting_keys[key] = local_dt - first_key = sorted(sorting_keys)[0] - return sorting_keys[first_key] + utc_time = local_dt.replace(tzinfo=None) - local_dt.tzinfo._utcoffset + assert utc_time not in dates + dates[utc_time] = local_dt + return dates[[min, max][not is_dst](dates)] def utcoffset(self, dt, is_dst=None): '''See datetime.tzinfo.utcoffset @@ -560,4 +562,3 @@ def unpickler(zone, utcoffset=None, dstoffset=None, tzname=None): inf = (utcoffset, dstoffset, tzname) tz._tzinfos[inf] = tz.__class__(inf, tz._tzinfos) return tz._tzinfos[inf] - diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Accra b/awx/lib/site-packages/pytz/zoneinfo/Africa/Accra index da73b243192760cb1df7ac9ad3beeebc556eb28b..6ff8fb6b235d413a87fda2af8e7ea9c4bbcf78d9 100644 GIT binary patch literal 840 zcmcK2J4jn$7>DuK%c3A%R1jU<Tv~(Z<f4-f5kD|48HykT>flfWK@mRe<RT8OAcBM9 z{T3ufja3_hcOxH&Ae~ekMO-W`RO0)5x;Z&`!a2V~-~{r2PAL2(QYEjB9Q}rqBcLbu z1y(O(fk<qky4Oye{Wp_E%QCrI>8Ac%+v(wUGjmZav)#jPE-@<e;ZnCSdTJMIo6S;R zwk((RyXfZ{8-0wMmAZsoxvVv@@;iwoJ6$}d+{VYp&Du??tbaRq8+*Sc5ed7^nF9N> zVbE+1)XR27((QC~*<X1NCK>!^leax4_35Le(u;2QLz~@Qx-xtB-(`QO&>ftW$l=!! zcN7cS<Ce5J`C%npBTllj-t@_2GAH_%B{!Oti;@>?3Q0p_i(d5R`3SvXz`rlg=nrQY z5*gF0gCe7Pby#FvWME`uWN2h;WN>73WO!tJBmfe@t09mWUJZgo@oE?(j#mRAk&sYG zEF>5b4GD+DLjocZk&sACuLeb;dNnK(*Q<e%$Vg};HWD0(j)X_z<GZ~8`T8yd@}B_p C<d}>A delta 69 zcmX@X*1<eMSx|t1fq@x_c^iPlJcG0?6SsIwmSt9*?8vAr377l<lmvnQKmbxSxt6H` Hs7f0E4w4aw diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Addis_Ababa b/awx/lib/site-packages/pytz/zoneinfo/Africa/Addis_Ababa index 4dfa06ab707b070064d6883ce8d313ef170c6fba..750d3dc14cabc52517d6be5d76da4080f213f4fc 100644 GIT binary patch literal 283 zcmWHE%1kq2zyPd35fBCe7+bgj$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lr<PQ7#P&nFz`Y|e0)O~TpdFgoS;N#2uLjygpgqW52&91Kmc+Fhz7X@M1$M| OqN(8~E}%nojky5IzB_vW literal 206 zcmWHE%1kq2zyQoZ5fBCeCLji}c^iPlf%TteFakwXJb)Yql?(<J1_mty22LN}5C%sV rAmQp50+IoO5W+^otl|9u(ZcW_2%KL??f}sss~Cv1iwkJ2t}zz?7HS^a diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Asmara b/awx/lib/site-packages/pytz/zoneinfo/Africa/Asmara index 0bc80c44000736f3986c75eb2e0698583ff11393..750d3dc14cabc52517d6be5d76da4080f213f4fc 100644 GIT binary patch literal 283 zcmWHE%1kq2zyPd35fBCe7+bgj$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lr<PQ7#P&nFz`Y|e0)O~TpdFgoS;N#2uLjygpgqW52&91Kmc+Fhz7X@M1$M| OqN(8~E}%nojky5IzB_vW literal 227 zcmWHE%1kq2zyQoZ5fBCeCLji}c^iPlf%TteFakwXN`M>&l?(<J1_mty22Mxc5C%sV zAmQp50+IoO5bQ<+HGnjM0gNs911j(z2%KL?_JHWjw(UG18e}B{BNNaGP)kcd`hiw+ VfUV~B0a=Y{Jp%(5&@H;gTmbS4COQBB diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Asmera b/awx/lib/site-packages/pytz/zoneinfo/Africa/Asmera index 0bc80c44000736f3986c75eb2e0698583ff11393..750d3dc14cabc52517d6be5d76da4080f213f4fc 100644 GIT binary patch literal 283 zcmWHE%1kq2zyPd35fBCe7+bgj$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lr<PQ7#P&nFz`Y|e0)O~TpdFgoS;N#2uLjygpgqW52&91Kmc+Fhz7X@M1$M| OqN(8~E}%nojky5IzB_vW literal 227 zcmWHE%1kq2zyQoZ5fBCeCLji}c^iPlf%TteFakwXN`M>&l?(<J1_mty22Mxc5C%sV zAmQp50+IoO5bQ<+HGnjM0gNs911j(z2%KL?_JHWjw(UG18e}B{BNNaGP)kcd`hiw+ VfUV~B0a=Y{Jp%(5&@H;gTmbS4COQBB diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Bamako b/awx/lib/site-packages/pytz/zoneinfo/Africa/Bamako index 98a6f9afef9849936e31443bdedb6b185b4f31bd..6fd1af32daec193239ab6b472526fd3d6bdb2f76 100644 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 238 zcmWHE%1kq2zyK^j5fBCe7@Ma7$eHwP8pEDRI~v{zwhJ&YGBN)D{{tip0xbXkfBe9} s0b%?2hA_ATakyg$SO7$XkYLvjsILD&0J0NAgX{&-<k-yxbc_KP08Q;O*8l(j diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Bangui b/awx/lib/site-packages/pytz/zoneinfo/Africa/Bangui index 20ee217573300cb341534a7932e11d9d8689fbd0..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 100644 GIT binary patch delta 37 icmZ3@xSDZ-0oTI7&jAdK3=GT$6DNpF^s_(_kOlzMvkHd* delta 37 icmZ3@xSDZ-0oSBwwIU3R3=D!f6DNpF^s_(_kOlzOy9&bq diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Banjul b/awx/lib/site-packages/pytz/zoneinfo/Africa/Banjul index 0264bdc5bf7847749c54431cb88efcf277dc00e0..6fd1af32daec193239ab6b472526fd3d6bdb2f76 100644 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 246 zcmWHE%1kq2zyK^j5fBCe7+atL$eHwPp3FWi^*LX*nF%m3GBN-E{~?8e0Zg*||Nrp= x0|!V81CNhy2!j(4hdYKaxC3bz2qD3~A5cyIfdFJLhz8jWqRF+N3+NaFE&y3uI$Hn$ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Bissau b/awx/lib/site-packages/pytz/zoneinfo/Africa/Bissau index 33a011a5c02ab0d5f5915d7cdc0b269aa9591806..0696667ce83faeb71e52b4da0531fc59650da77f 100644 GIT binary patch delta 24 fcmcb>c!6<(0n4Okb7dyZ*Pa+}!3<<hoMi?8fP@N^ delta 24 fcmcb>c!6<(0n5ZAlVv8(*Pa+}!3<<hoMi?8eB}x{ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Blantyre b/awx/lib/site-packages/pytz/zoneinfo/Africa/Blantyre index aebba5d9590993136e9a4bc7ffcd34e0c762cc5f..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc 100644 GIT binary patch delta 33 gcmZ3@xSDZ-5y#Ol42%p6ay=6#h)ndeLgGpT0Jk~{eE<Le delta 33 gcmZ3@xSDZ-5y#;T42%p63Ku3$5Si#_g~XKx0JHK6eE<Le diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Brazzaville b/awx/lib/site-packages/pytz/zoneinfo/Africa/Brazzaville index 5d98295190f79395f6cfeecb95d1142bd26a03c5..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 100644 GIT binary patch delta 37 icmZ3@xSDZ-0oTI7&jAdK3=GT$6DNpF^s_(_kOlzMvkHd* delta 37 icmZ3@xSDZ-0oSBw4LS^r3=DiB6DNpF^s_(_kOlzP{|dtZ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Bujumbura b/awx/lib/site-packages/pytz/zoneinfo/Africa/Bujumbura index fff46c52044af2316c46367bcfca609a0770f7bf..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc 100644 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$Z2vr`h|g!fkCbZBqgK3z~bW@!r<%}0^%}+kYL&m Tunq=>|3HA>R4$<Lx<*_8th^MU delta 59 zcmZ3@IF)gNxFRD10|N-d0Eo@Pz#yZ*z~Jl{0_054nOMccmD#rc2S}ZC$HWQJ0MjiA Ai2wiq diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Cairo b/awx/lib/site-packages/pytz/zoneinfo/Africa/Cairo index f69274c8ba5658ff6d7b71a0644bd0134b635d22..0eeed1138f2849ad49240834b8a357467637f1b8 100644 GIT binary patch delta 625 zcmc)GO(+Cm9LMo_E1TOMCJL9yTgpvJuBPOro|>7RW_Fgx?oyJQ0~h2XMQzO$<<4R4 zfrC;GN>cwExjZRFQmasIp5IdrN_#a=|M}K4&m5l5i+yibTC$d=X&5{wa;$3ahrV{W zMc&;R_d7ROFtosfl}`$)C6TkrEOa(S$o5&dN+Nt+r^uKWQIAVeu*{>IBE=8mB7Q%n zyz|KOM<bM6^o!&=X35vKDC~686b<m{#SHPi13r`MV#TFVQ5tMw<*_=SwV&Bs-z`sf zjmv^zHe9-aW&SZgUmE?No|~=NiAi5`T@NoG_t(?9+4f816e6{D>&*lS&VU644GJDr zNu(;7P*9=ZQk7(?l1)|8q2N=MgsPHJRZ^nhL@k)6l}yL5w8REHQJA7|MPZA=7lknj P=h{=o)Bgqbs@eGlp-_rP delta 576 zcmcaD`dV~?xF9P70|N+yz;+;J-Kg=Ev3|YPgWzk&AB3nh1%z5=CxkY>eGs~`>OmMw zN<g?$`-AY%PYL0*^$Fo`8!kjLWj=`1Seg(SV3ZJfHt9mtBku=MzatW&m7XR<uXVW) zb4d3=%=wrHG2dQ3i0xIo5O;FUgZNyI3kh@lA0&pU1|$`PBqW=$2c&p?NJtfZ8IY!R zDPi&)rem=z%=jP^BMT!wc>;2iCvZu~GBC&}FmU?#hA_Cg27`zYP$)1mf=C9mu-O3= zV%;pl@{ySv7&ssWpa7aIz#+;73>*+27(kQtImEbuVFTiV!e?>-P#PFEAU-gBCg*dA zF$05UatDX3H84m(!k}OQ(V(CK(V*Y~(V!p#(V$=g(V(CL(V*bk{D32vk@n#ui8FjA I@8nVf05&3hYybcN diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Casablanca b/awx/lib/site-packages/pytz/zoneinfo/Africa/Casablanca index 2647ad79584cd04536c5551ccf46ee5c08cdc67e..c001c375ffb07c43dd32efde788a832898e8560c 100644 GIT binary patch delta 524 zcmYMwJ1m1?6vpxPQzjPT7O5VW39E{M4iXY9=)GUtPtlHIXyR6FEVf4SSx9ga43-Wm zv53Tgg@h&|k%qxw6$y1&oabG<%kMqo^WU!eu3SG)=URB8I7seM4}0o$_AF)DbC@S@ zR}Xtj{p=fek}nfvf32JR55xh-9tC_F1wNb<JkdD#In1H<Sqj}Zkj@U$uir`kt>f_V z4@ELoiflzGa(712jUpM*7c%B5*x2o)$<!CeTo**Kp&Z4M1)d5&^7Md<XZlV#-uOxh z`wl1GvTPdGvFe+7THd_n)V_mP7LGW*cx677C(I5_x5o2pTDP@LW?1B53d9_UNlKYz zK9||kG6y#%LCjLhG>CahnW&VR5L1;h7h<wfW<yL@%6z3HfXD!mLa>aW2R>*5(FLN7 yQu-*R5kx15R!YgGOcu;bTXT(+!iic+6f4;dTBR6nRD&o7Q4jtX>@`;_n*IPRETK&R delta 561 zcmXBQPbkB27{~GbW^>{+veJ06lH`gUSaDG#vj1jg!)hl*q&6ED4m+&Ab5Q;~DTRwN z<sx#Rq;QcEIXJmVY5p8|K40I<>-!u(@2|4;^4wW^e~Je0P2}$Nu%{}-p2d3d>=ww| z)XLss2m8E@>`NW7ztT<qd*VRD69@Ve9QbIV;E|bwKRF(9I(X>LP9d(P(9H^kigh%6 z_)X!ALE)`#3SZvQNdA!`BQF%0{-Ma)GL5D_IqEtmigy2UbTZ4a;Rhb;a`AZkF;7&! zbKJ4P@z)}$h%sQhzU1WUEvI%WXnyX1(@8t4Q|qRRnVm+Wuw-sFoU+3t4_hGiKy1>= zF7;gENXs7F*aWdlE88IUX=S5Uc0z2`%3g@gTG<V;T`T*w(g30ZL<_;xgCO`I3Pc!) zI9ds$l}HewAYy5ymv%C%E-W=RNre-+v`AL8Y<EgB+{gxz4k8~!LYN8UwF`Y$|IYaT Uo!wI>*0_2zEUMAmroyGwe`G1JEdT%j diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Conakry b/awx/lib/site-packages/pytz/zoneinfo/Africa/Conakry index f6396d8d1c658fa1a3ec6c42d15559b85af5e160..6fd1af32daec193239ab6b472526fd3d6bdb2f76 100644 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 238 zcmWHE%1kq2zyK^j5fBCe7@Ma7$eHwPcFdkhI~v{^h)rN%WMcgP|Fa565fHHa|Nrp= t0|$id;~T=@4#eS(Az%Rz5ki7pKcKq)0|CfR5Dl^yM3ZAT7tk>VTmXg3Gcf=F diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Dakar b/awx/lib/site-packages/pytz/zoneinfo/Africa/Dakar index 8987fe6514469c03d99e4915fd9b62e52bbe2b5d..6fd1af32daec193239ab6b472526fd3d6bdb2f76 100644 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 208 zcmWHE%1kq2zyQoZ5fBCe7@Ma7$eHwP-i=e%0uvY*ng0KOzk-3`|NoC47+65+7&v@< jLm0vxLm1qFGz5f@VEhlLp8r4qvIazxU=<h8Rs${oCipAa diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam b/awx/lib/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam index 2ddddc5f35f2ddaf65902f8c06f979de135b9445..750d3dc14cabc52517d6be5d76da4080f213f4fc 100644 GIT binary patch literal 283 zcmWHE%1kq2zyPd35fBCe7+bgj$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lr<PQ7#P&nFz`Y|e0)O~TpdFgoS;N#2uLjygpgqW52&91Kmc+Fhz7X@M1$M| OqN(8~E}%nojky5IzB_vW literal 243 zcmWHE%1kq2zyK^j5fBCe7@MyF$l12|@|tUN>o2?)O1r|q$i&FNpmGJINXr1EPHhbX x2ZZh88^Yk~7{cJ>>KGaVQUC@aB-r)?s^>otfNTZPAe%undA4%_9i(f_1pwN^Et3EM diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Djibouti b/awx/lib/site-packages/pytz/zoneinfo/Africa/Djibouti index 559aabc163c2d91db0567305afcc46b71325518e..750d3dc14cabc52517d6be5d76da4080f213f4fc 100644 GIT binary patch literal 283 zcmWHE%1kq2zyPd35fBCe7+bgj$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lr<PQ7#P&nFz`Y|e0)O~TpdFgoS;N#2uLjygpgqW52&91Kmc+Fhz7X@M1$M| OqN(8~E}%nojky5IzB_vW literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$eH;05)T6-1A|5hNJ`6qfyKu+gu&G@1jJ<sA;GjC TU>yt$|A7F%sa!zgb&a_IrQ8&W diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Douala b/awx/lib/site-packages/pytz/zoneinfo/Africa/Douala index cd55c303c4d30cfd9ce14e1437f24640b08402d8..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 100644 GIT binary patch delta 37 icmZ3@xSDZ-0oTI7&jAdK3=GT$6DNpF^s_(_kOlzMvkHd* delta 37 icmZ3@xSDZ-0oSBwtr-lA3=EtS6DNpF^s_(_kOlzT3kt&k diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/El_Aaiun b/awx/lib/site-packages/pytz/zoneinfo/Africa/El_Aaiun index 65d99ce6e598968b319e2fedaa0578abbb7a5f4c..805d39e415ab39f1d27f8243b871b8fc6cb73af8 100644 GIT binary patch delta 412 zcmY+<y)Q#y6vy%Q-qvvMV32z;RF9~Mqywpm4iXv>@zUGZ+xDuLj*UU$t=hk!Y4R{I za1uIL8bM+an^=gFh(u~K7zyzb7U$SJ%P-$&I-fW7N-eGDE3G(D8-U=jfkvZ=#&Qvj zy+a6f_F(9<55wa=2p3`)(Si`U1B|+NAR3k+`tF0+v4pXYA&h&n5Wj5#6Ww55yn^|o zW8&x=k_9^?H&c+jK84g;4Xo57SaWq~ZFj(A?hDiYGl2A91=903IF-1^>3%=X^q$~s z^AluTTbOw%qUg4dX_pJIvQfp{t{Ybu4=}%U4mP_Ob%sUR*(E$un>{W9(t|=68$ALE zudK^t5dqnykb%F+A+oZr5`mK$q9ki75xAKl_Nj@$%?weMHH8S=#1PN2u8@F}6r$dt lD|A068HCr-(m<zk^7((u1j|uwCjvJ!c$vb>9NvGVkzYf%jMV@D delta 448 zcmX}nJxD@f6vlCH*Bb5}8tUF$tV2OW1TIliIYi(fQTY9B_93(s6h)wEwKOycuMR=P zAqc9)sKBMQL4tG<A#!SJ3X(8#sB;v0mxup5onJ|<tC?IXzX^`20i1Rhy843XIv57m z)g8FUCehuPMvr?GJ;?%kH79thfWDC$`sUZr_ca0jLI?Vr84L`WF;Fo<5C<Sw%0aL( z2%-BQ2&W|opW7f@tUx6D3em_LM7Np{Jw1ZO<Tu8wj{q^-FUB^GaVhkI%QIG7nR>ug z?GxkXGmO7CK#WTZ+H(;TCuK}t_QKxoEv6DCG)Mv^hsaA^qAoe5h_H3k6v7zj5lC2M zT_%gL$!3KN{7nwAF6$~0IGG_bvZfM&n;GJUnh4y?5M^0Yh`>z@@geI92{=h1x{bO* z_j8g#Sd9HWbUG)W-&!U_jTf^-;ARFdQ+S!f+al4Xec4v;&poww+uPoqYxpNC;;_^H E2dJQ&$N&HU diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Freetown b/awx/lib/site-packages/pytz/zoneinfo/Africa/Freetown index 977d316ce05e0afe7078d04abaacf76fe9c98d05..6fd1af32daec193239ab6b472526fd3d6bdb2f76 100644 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 691 zcmci9ze~eF7{>88T5Bm(uS3B>P*C?!iU>}E=u$yUMC~6S2pu8_f;ePXFo-%kmV%I> zli2!OOX=20imolC+N3T;hx2_7LDa#`3wNI+5D4GbOs%cP>DTJzH`rK1ym241`8agq z>4HDuobLzqi%Q<P+}P2ta=y4;EVwsEqt5MkTff^}7WV^VZgJ&N6yLILX;L_)>XTj` zoEGJL)UEAqi@IUk_41k3NaUz-((;<In%&$Rv7S3=`(-_2wH}ViTc~>eX~k|Q`Yo-y z>&F!g^n6`Xz8(;%Ga%*rycUwu_b5WtC$td%H&Ilbk>s37GrWzYVbao+NwfU$eVKnZ z8Rjoklg{U-l2>Xg(}ZXQ(FvjzL@$VD5Zxf!LG*)Y2+<LuB}7jpH-+e`<hBrfmE0Jj pGem18_l9V$<n9pdmE0d<1`u<Am<7Z<AZ7wF7y8e^gn3qa_yg%DH3I+u diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Gaborone b/awx/lib/site-packages/pytz/zoneinfo/Africa/Gaborone index 424534c49804be58b6a4dc9817e01e65a321676e..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc 100644 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$Z2vr`h|g!fkCbZBqgK3z~bW@!r<%}0^%}+kYL&m Tunq=>|3HA>R4$<Lx<*_8th^MU literal 260 zcmWHE%1kq2zyK^j5fBCe7+a_T$Z2vrpK-1)ui<=MU;!f&GZO=YgbzrOs02uzi~<8E z1A~?UBd?Ed2t%-Aa0r95BM1W-Fc3o6MpmF&kgY;Lpql;zL4tgN35W){07Qda0ir=J PVIa>bTtLU^8gT&tHG?k_ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Harare b/awx/lib/site-packages/pytz/zoneinfo/Africa/Harare index 0e53de0a33f1b960077d29b293c8c786d3636575..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc 100644 GIT binary patch delta 33 gcmZ3@xSDZ-5y#Ol42%p6ay=6#h)ndeLgGpT0Jk~{eE<Le delta 33 fcmZ3@xSDZ-5y$Zq21W)3S(%9wL?-%KA#tSvnX3qY diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Kampala b/awx/lib/site-packages/pytz/zoneinfo/Africa/Kampala index c6b5720e06ed24ac36a5a9eb10a4323f8176335b..750d3dc14cabc52517d6be5d76da4080f213f4fc 100644 GIT binary patch delta 75 zcmbQuG@EIHk@&4YTMo^-aD1Zsjko#_uP`t&F*7nSD78$yYd*2TO8M5G|3Cmz0ir>w JKs1_4I{@P)C>;O* delta 75 zcmbQuG@EIHk@$U?Er(`ZxHh-##`7Nc5C%pjW<~}Exs-`_%_lZkDc_g*4+J0;AR43! JM5C#+0|0EFB~1VT diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Kigali b/awx/lib/site-packages/pytz/zoneinfo/Africa/Kigali index b99c20940b2d7063578f53cd42e0acc194856c34..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc 100644 GIT binary patch delta 37 icmZ3@xSDZ-0augT(Ju^)3=DET6DNpF^s_(_kOlziLJSQ6 delta 37 icmZ3@xSDZ-0oT5dd;tuM3=A>`6DNpF^s_(_kOlzK@(O7H diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Kinshasa b/awx/lib/site-packages/pytz/zoneinfo/Africa/Kinshasa index fd3ced891dc4c0b864d7390f3afb43f2c80352a4..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 100644 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$XOWpIe>wYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$<Lx`tc;I6M;> delta 59 zcmZ3@IF)gNxFRD10|N-d0Eo@Pz`!TKz!2^j0_054nOMccRpG0%0;G;FV&Vj80L5?! AH2?qr diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Libreville b/awx/lib/site-packages/pytz/zoneinfo/Africa/Libreville index d38ab6bdec1d8dd65a5320cffade005a98853414..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 100644 GIT binary patch delta 37 icmZ3@xSDZ-0oTI7&jAdK3=GT$6DNpF^s_(_kOlzMvkHd* delta 37 icmZ3@xSDZ-0oSBwtxFgf85lV3Oq?Jx(a!=!KpFt{zzo3v diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Lome b/awx/lib/site-packages/pytz/zoneinfo/Africa/Lome index a1e9d31a073cfc5a29da6ab4e3857d60f0a7f03e..6fd1af32daec193239ab6b472526fd3d6bdb2f76 100644 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In delta 59 wcmZ3*IE8V7xFRD10|N-d0Eo>3;kf&T02vc>CRXuq<!c{{0jXnDnK(fT0KvTn@&Et; diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Luanda b/awx/lib/site-packages/pytz/zoneinfo/Africa/Luanda index 073b3b295c5d8b7c5b21fe3de058602ecde48d1c..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 100644 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$XOWpIe>wYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$<Lx`tc;I6M;> literal 204 zcmWHE%1kq2zyQoZ5fBCeCLji}c^ZJk#3L0xj6e~d3?PSr$Ap1}fq_qefy2i)gu&52 rgdyB91SA0jA%sna*~0S!qJ`l<5afEANq}gOO$@|Y#Rarg*N_VUnSL71 diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Lubumbashi b/awx/lib/site-packages/pytz/zoneinfo/Africa/Lubumbashi index 05aad3c8a5803fb19d934ed57966edd3b9ee07a0..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc 100644 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$Z2vr`h|g!fkCbZBqgK3z~bW@!r<%}0^%}+kYL&m Tunq=>|3HA>R4$<Lx<*_8th^MU delta 59 zcmZ3@IF)gNxFRD10|N-d0Eo@Pz#yZ*z~Jl{0_054nOMccRpG1X08%G;VB!R60K^~& AKL7v# diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Lusaka b/awx/lib/site-packages/pytz/zoneinfo/Africa/Lusaka index 612a8a07a0b5f05e62416a3efdefa8dd3fa1f476..5b871dbaa7c2969f6b4dfc854184a29010bfb2cc 100644 GIT binary patch delta 33 gcmZ3@xSDZ-5y#Ol42%p6ay=6#h)ndeLgGpT0Jk~{eE<Le delta 33 gcmZ3@xSDZ-5y#0t42%p6QY{lFh)ndeLgGpT0Jq8teE<Le diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Malabo b/awx/lib/site-packages/pytz/zoneinfo/Africa/Malabo index 241f477d7050b382df227dbaa6970168fab4d5cb..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 100644 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$XOWpIe>wYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$<Lx`tc;I6M;> literal 209 zcmWHE%1kq2zyQoZ5fBCe7@Ma7$eHx4&E?DdeGLqZObiShHXwN*U}0e36JX%*@eN^c i2jXzY5QsQK2nojjfa>`V1R!fbGznI50d3Va<N^Sk{~qT6 diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Maseru b/awx/lib/site-packages/pytz/zoneinfo/Africa/Maseru index 7fb3b0a7286c309485c486c6fb77b7567a63cd38..ddf3652e159e4c3cd844bdedf4784dcd29da23c7 100644 GIT binary patch literal 271 zcmWHE%1kq2zyK^j5fBCeHXsJEIU9gPliT@>GwXU9&d$p(IM<igaK0|EfRULA2pJfp z9DoWKL?u9~wG0@6q>KUsi;r&zL$G6T2uKbLLI_*Q4pa!X@&{DUe;~-Mc60#IASZxm ckTXCu$SEKi<QxzUauNfHZsG#DP}hhH09Bqn8vp<R literal 218 zcmWHE%1kq2zyQoZ5fBCe79a+(IU9gPliR5s=lb#*&esJNFfcMPGB8M<017k6D1g*y t88EW=_=Ye9I|he<M1dfL1PgvZv@rY!0+2-@8e|!WCfY(Skmb5YTma9XCqV!J diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Mbabane b/awx/lib/site-packages/pytz/zoneinfo/Africa/Mbabane index 8f0d40f2607c814354df00ea4b82447dedd9c2b0..ddf3652e159e4c3cd844bdedf4784dcd29da23c7 100644 GIT binary patch literal 271 zcmWHE%1kq2zyK^j5fBCeHXsJEIU9gPliT@>GwXU9&d$p(IM<igaK0|EfRULA2pJfp z9DoWKL?u9~wG0@6q>KUsi;r&zL$G6T2uKbLLI_*Q4pa!X@&{DUe;~-Mc60#IASZxm ckTXCu$SEKi<QxzUauNfHZsG#DP}hhH09Bqn8vp<R literal 174 zcmWHE%1kq2zyM4@5fBCe7@M;J$Z2vr9>KuKz#yvul9EwiVDa${VF-2%4gv8QLP#*~ U2UrIK!+#(kU@RBN0$n360C8Uv%>V!Z diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Mogadishu b/awx/lib/site-packages/pytz/zoneinfo/Africa/Mogadishu index 3c278ab236a331541bf960bc18dd07ba4130745b..750d3dc14cabc52517d6be5d76da4080f213f4fc 100644 GIT binary patch literal 283 zcmWHE%1kq2zyPd35fBCe7+bgj$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lr<PQ7#P&nFz`Y|e0)O~TpdFgoS;N#2uLjygpgqW52&91Kmc+Fhz7X@M1$M| OqN(8~E}%nojky5IzB_vW literal 236 zcmWHE%1kq2zyK^j5fBCeW*`Q!c^iPlw#DZHp7(g&U}R!sV9@FSiZEyyfTWc*7&sto yAKwrLSH}<rClCPxA%yLL*~$9@s_8!v6zoa)0ir?nf@qN445V7l1$2q7F&6-Za413m diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Niamey b/awx/lib/site-packages/pytz/zoneinfo/Africa/Niamey index fff84a3b1e73d6e8ee4f78c57b03796572fd0448..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 100644 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$XOWpIe>wYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$<Lx`tc;I6M;> literal 239 zcmWHE%1kq2zyK^j5fBCe7@Ma7$eHx4r)AHiV-wyQa5OM5GBGnSF#cg+`2YXo2dH`u w1_nL>1{NRR5QcEa5C(T34Fe%0*!2Ud=|2#F>;%yudqFfgc5?w8qie_o070BDr2qf` diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Nouakchott b/awx/lib/site-packages/pytz/zoneinfo/Africa/Nouakchott index f70cb4c992eb277d5e5e09e44184a254cbdce211..6fd1af32daec193239ab6b472526fd3d6bdb2f76 100644 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 238 zcmWHE%1kq2zyK^j5fBCe7@Ma7$eHwPZpofWI~v|SJu!iSk%{sD|BpN%ML@s;WPf1b sfUtdhLm1qFINUJ=EC3=xNU-Y%RM&qX0NDwmLH2@Za_r^;I>vwt0M|G+0RR91 diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Ouagadougou b/awx/lib/site-packages/pytz/zoneinfo/Africa/Ouagadougou index c0f20e0874b5e63cd27defff0279f3eb6de70832..6fd1af32daec193239ab6b472526fd3d6bdb2f76 100644 GIT binary patch delta 33 gcmZ3*xQcOt5yvDC2FCyY|5!|%ATrU<3W+NP0Nwx%%m4rY delta 33 gcmZ3*xQcOt5l8<U2FCyY|4o@VL1dzz6%tnp0Q_?g$^ZZW diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Porto-Novo b/awx/lib/site-packages/pytz/zoneinfo/Africa/Porto-Novo index 3e7ca2bbf7ea51dffe20e94b721348f2f0a18ffc..b1c97cc5a77eb187cc8ea8a4031a45a9bf153b35 100644 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$XOWpIe>wYfq~foB*iDdz~bW@!VvBl0^%}+kYL&m Tunq=>|3HA>R4$<Lx`tc;I6M;> literal 209 zcmWHE%1kq2zyQoZ5fBCe7@Ma7$eHx4hiA{E9SsbOObiT6B_MeqU}0e36JX%*@eN^c i2jXzY5QsQK2nojjfa>`V1R!fbGznI50d3Va<N^R&cpgyz diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Sao_Tome b/awx/lib/site-packages/pytz/zoneinfo/Africa/Sao_Tome index 8ce184a9bff29b9bc0cebbdd042bd7fb82ce2a47..6fd1af32daec193239ab6b472526fd3d6bdb2f76 100644 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 195 zcmWHE%1kq2zyQoZ5fBCeCLji}IU0b(q-WCw7=a>e0SpZP|9>w43V{HNk8cQrI}k%a h2w_uUHgNoa>iG`@aW;PqKs3k}2Ex{G0c|wk0sxC|A5{PV diff --git a/awx/lib/site-packages/pytz/zoneinfo/Africa/Timbuktu b/awx/lib/site-packages/pytz/zoneinfo/Africa/Timbuktu index 98a6f9afef9849936e31443bdedb6b185b4f31bd..6fd1af32daec193239ab6b472526fd3d6bdb2f76 100644 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 238 zcmWHE%1kq2zyK^j5fBCe7@Ma7$eHwP8pEDRI~v{zwhJ&YGBN)D{{tip0xbXkfBe9} s0b%?2hA_ATakyg$SO7$XkYLvjsILD&0J0NAgX{&-<k-yxbc_KP08Q;O*8l(j diff --git a/awx/lib/site-packages/pytz/zoneinfo/America/Grand_Turk b/awx/lib/site-packages/pytz/zoneinfo/America/Grand_Turk index c0f75ac68f81e98c41c64559b064588c42786159..331aeac26ea9c9c9c50c36ee025cf99360aae4ee 100644 GIT binary patch delta 196 zcmaFK*UmLTT$Gi8fdPa;zz2vyY>|yR28@i1lQ*(?nXvr-zc+w^;s5^~j0`~b&J7G4 z|NkF9z{mq483cTMLm0e)*fki4T|yWffi%P9)l3Q~2K&Mc-u!?mlL=z7GdU&$&4B<e IphYHJ0IpXyP5=M^ delta 727 zcma*kPe_wt0LSs?l_4=Q?I3lC;mylh+iVcwt-_+-479LW^QkFgx$-Gxyz7r6NCsXM z2Gf(5I&_JW67<k0kvc_(5d?xh7ljVNBV9V}?fJft(5)99KF@o2dExu3gnt~GKhhZz zLU4FId$@NjN8?WU+D^L}ihR;T8++z@^QBI|Xqe%xS$*T#in&=Y=*;MX8CkllrTb3Z zs*KCq$7?E^bLD88r^fnD$g!VkmFqq%b6<K@zV(;Pzlx|kyWiw^?X)R;-P3oA$IQLg z4LxzSY1G_`zMs<O!Nh`|>|8ff{iURyYHq9IshTWqeN^62PkQy|s`NW8A1=+PN8fwp z<LR7wvKo=onG34CD5O(;8ah**51s7x{r6Xd@cmUsgna+=2j_tAue}imFS&!_qCMx% z+A}a%-E_MC2~heQ;B7}szNKv6h+q+f2(&SfAV?G>3=#(kghWC@A+eBPNHioI5)TQ; z{{<D1l7Y4+QZ&$3Mam*|k-|u2q%=|+DUMV}$|LpBE|As1#jb!X5op&y774VgAj=@@ sAPXTYAxj}^A&ZIq$<F`hWPBMsVY^?-?ih7@V#!!M>LwDgL@XZu18l(Vi2wiq diff --git a/awx/lib/site-packages/pytz/zoneinfo/America/Jamaica b/awx/lib/site-packages/pytz/zoneinfo/America/Jamaica index 24ea5dc09ba72f032adfdb753605764f13105849..006689bc895854db5deb33a29ff5d99c6c205fc6 100644 GIT binary patch delta 21 acmey({F`}#2{U`I<V5q^AZoHG<1+wN4hK^J delta 21 acmey({F`}#2{VVn!HMR#LDXbX#%BOnGzZH7 diff --git a/awx/lib/site-packages/pytz/zoneinfo/America/Metlakatla b/awx/lib/site-packages/pytz/zoneinfo/America/Metlakatla index c95eab3b14e35a7954d7e39e4b90e23b4058bc5e..e66cc3417a0d82b9ab182e793ed3ec09f6d7b9be 100644 GIT binary patch delta 129 zcmaFPdWLm^xF{<F0|N+yfD#ac*dh~kRx&b9ye22-;~T;d5DdiOKpX(XE+HU=j1Xdi kGN%fV#RkM8o4pyG85x--_cN)e;m`%q1|+$FMp|$I08H-`H2?qr delta 162 zcmX@Z`kZxw_+(8+9!@0&1_m}DmYk@wl96?C2a}xE|Ns3B3?e?hAq)Y*KpYOl0YK~$ z!r+?<6aWH75CJ473o=TGvIChQ3<4@Z3}Q=ewqtZ=WMrG%#H3<E*gU9#Ac_lQhXoe^ DZqXhr diff --git a/awx/lib/site-packages/pytz/zoneinfo/Antarctica/Casey b/awx/lib/site-packages/pytz/zoneinfo/Antarctica/Casey index 045be68737bc1c1357fac6578983c6dad7a44d09..c2a990564dc93ee0b0410a2c5c66bec405c57cb0 100644 GIT binary patch delta 70 zcmeBWn!q$cn~`s#jy?}314BUr14~s^6@%l%G#jAcVs}+!!SLV^24_bg0R)U7%;g9a I(zW0M07y^|0RR91 delta 67 zcmbQh)XOwMn~`^-jy^XB14BUr14~s^6~n}I8=%+{cV#58@Zb;zXGb6b1dJfe1r*V> G-~s>^T@E<_ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Antarctica/Macquarie b/awx/lib/site-packages/pytz/zoneinfo/Antarctica/Macquarie index 200d519c108f7653fb89e1d522e96032119e7f55..fc7b96fe873af37c6b89262a2ddc04c4a0700262 100644 GIT binary patch delta 107 zcmaFI{fm2oHly%Hog0j*oD5JfYXc*Y-Lrs!g@Iw#1_r*WswxIY*WeH!;WGIGtLS74 QCZL|pDNMf1L~D`*07t19+5i9m delta 91 zcmeyx{f>KrHY4vwog0kuEDTUEYXc*Y-LrrJNY2{8z)@9I#o!t|S(C|uk#}<zlP@zt IrFU560I_@&e*gdg diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Chita b/awx/lib/site-packages/pytz/zoneinfo/Asia/Chita new file mode 100644 index 0000000000000000000000000000000000000000..c09065470ef9cd5a257e56252dd05e416e67bcbc GIT binary patch literal 1236 zcmdVZO-R#W9Ki8sZoZ^Yzk{W<%$2TXzErDZX3KP$%uNa%gh?UvLRrL!qM`_)*Tab4 zp)S$Es0c#3WF5?#3KbH)c(M)yJJiJ_IwTSGeE&-jqC>}?KmY&d;n{ze{k}`=K724} z{#XU}gqzi5Z}x?~_Hp~&OyA=>qh?{CBe|&fO1dcT@^sP6)9&I=gUQ7cQ|TpR4N31% zT$lETwd7WfE=!ea={Zr~QI{_7`l2ghlUi0kuH}`Z>i0g;l?C@T;CU;7uOqVR!?3U7 z^budh_}TR8k-e`f2d+xh-7`{sy+>*;cFCF(aap@REbI0h(%|ukt`E2BhIYShEUD7k zV6N8wn6DvkxrE+NYu)!8*);S<>nA?S=6jzdJorMkTzV}HH~VGlfk)DK;h8oy-;l_@ z2fEFFN}3}n-JabkEoH~FW$L6x-8(h<a+kJF1~vAuPUB-cr0tql6S3#UxZGKp%ac9l z%E|R)x#u4IZJ#&Kn4WI?W13{I@fefpbJ>&g%0Ba)J>h)z9X_@D1)2BbZ3)xa7;_#S z2@`F%Tb3)coPFkz_=gF9`~AJ2b}?yW+AJoHOdXlLqn$od08#-`0#XA~1X2Z322ux7 z2vP}B3Q`MF3{nkJ4pNV!EeNRyDap~+gcOBTg_MQVg%pNVhLncXh7^ZXhm?oZhZN{& zD@00kv^63{B2^+~B6T8#B9$VgBDEsLBGn@0BK0B#BNZbhJKCC&q8)A3NZCl;Na0B3 O`2Urj&%dBLl>ZBWJ_9KL literal 0 HcmV?d00001 diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Chongqing b/awx/lib/site-packages/pytz/zoneinfo/Asia/Chongqing index b5b555fb99b0fa381a332d225ecce5f9a589532b..dbd132f2b0bcc8beab08e04b182751795c853127 100644 GIT binary patch literal 414 zcma)%y$%6E6ov01AsdnK0RGwCh(;k=S&0xTQ;84_wi_?7<`F!PCs;~}D7?f(B^vIT zl7ch2`)zh+C+8E>VAZ0p#Q6&b$@1Vmt@shmEEPQ+dAwxQ={D8*Lz@c0P8P$BDh-yh zJRhox=gVq;O|{%Y*PQ{??_KRC8|0oVI%a(=qV1LMrEqU0h@_&_Xe`L@@k|6ZIO2E7 z93L|!ALb9D7bk4{9*EM0TpUDs5CS+32?Qb_WIzakkOCnFLJol-2uVX01tDw5!t~*5 M#r`q2S-#n^-;pX<T>t<8 literal 403 zcmWHE%1kq2zyK^j5fBCeejo<11sj0GhJP!j2<M&@klSU(AfH)Zpir05py-)cpcLoT zpseX!pyHm+pehvqK~3G0LG6>{2Mu;@28~O~9~c;!nUEj@L-HG-X$(mPAfxLhFmf_5 z6f`jK`uK)0`1t#UFgUvaac~Go4H$%w;LaaVJ^z6K<X#XL<Yo{JayJNo+zz5a?g!Bz rKY(bEKR`6dFCZG^9}ocf2}FbZ1*U<11JNM=foUrEkqhWyT?;M%Q_?~N diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Chungking b/awx/lib/site-packages/pytz/zoneinfo/Asia/Chungking index b5b555fb99b0fa381a332d225ecce5f9a589532b..dbd132f2b0bcc8beab08e04b182751795c853127 100644 GIT binary patch literal 414 zcma)%y$%6E6ov01AsdnK0RGwCh(;k=S&0xTQ;84_wi_?7<`F!PCs;~}D7?f(B^vIT zl7ch2`)zh+C+8E>VAZ0p#Q6&b$@1Vmt@shmEEPQ+dAwxQ={D8*Lz@c0P8P$BDh-yh zJRhox=gVq;O|{%Y*PQ{??_KRC8|0oVI%a(=qV1LMrEqU0h@_&_Xe`L@@k|6ZIO2E7 z93L|!ALb9D7bk4{9*EM0TpUDs5CS+32?Qb_WIzakkOCnFLJol-2uVX01tDw5!t~*5 M#r`q2S-#n^-;pX<T>t<8 literal 403 zcmWHE%1kq2zyK^j5fBCeejo<11sj0GhJP!j2<M&@klSU(AfH)Zpir05py-)cpcLoT zpseX!pyHm+pehvqK~3G0LG6>{2Mu;@28~O~9~c;!nUEj@L-HG-X$(mPAfxLhFmf_5 z6f`jK`uK)0`1t#UFgUvaac~Go4H$%w;LaaVJ^z6K<X#XL<Yo{JayJNo+zz5a?g!Bz rKY(bEKR`6dFCZG^9}ocf2}FbZ1*U<11JNM=foUrEkqhWyT?;M%Q_?~N diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Dacca b/awx/lib/site-packages/pytz/zoneinfo/Asia/Dacca index 3aaf78135c28e60978461712e24e54bdfc3cd3e7..b6b326b20eb4cad1587ac068dfa868e276019a1c 100644 GIT binary patch delta 21 bcmZo;ZeyO{%{XDQ0%QEd)x|)DJYzZlOWX$R delta 21 bcmZo;ZeyO{%@{ISfiZsK>S7>6o-rK&M`#9g diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Dhaka b/awx/lib/site-packages/pytz/zoneinfo/Asia/Dhaka index 3aaf78135c28e60978461712e24e54bdfc3cd3e7..b6b326b20eb4cad1587ac068dfa868e276019a1c 100644 GIT binary patch delta 21 bcmZo;ZeyO{%{XDQ0%QEd)x|)DJYzZlOWX$R delta 21 bcmZo;ZeyO{%@{ISfiZsK>S7>6o-rK&M`#9g diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Harbin b/awx/lib/site-packages/pytz/zoneinfo/Asia/Harbin index a763ba7ea8d0616ca084b7ee0f00014fd7a70e47..dbd132f2b0bcc8beab08e04b182751795c853127 100644 GIT binary patch literal 414 zcma)%y$%6E6ov01AsdnK0RGwCh(;k=S&0xTQ;84_wi_?7<`F!PCs;~}D7?f(B^vIT zl7ch2`)zh+C+8E>VAZ0p#Q6&b$@1Vmt@shmEEPQ+dAwxQ={D8*Lz@c0P8P$BDh-yh zJRhox=gVq;O|{%Y*PQ{??_KRC8|0oVI%a(=qV1LMrEqU0h@_&_Xe`L@@k|6ZIO2E7 z93L|!ALb9D7bk4{9*EM0TpUDs5CS+32?Qb_WIzakkOCnFLJol-2uVX01tDw5!t~*5 M#r`q2S-#n^-;pX<T>t<8 literal 477 zcmWHE%1kq2zyNGO5fBCeAs_~^1sj0GhJRD{?6`cc;`oGL4L`-Feh|*x{6lV+8H0Rg zeStz<MuVbfVu4beSA(*qbAgI`I)kcE{0B94PX@J5jvqAGwHY)nDSu#KWMXDyVnKoo z3}r`vhBK6RFt9K%6f`h!GBDIl0I};PF!Dk~e0)O~oIM<YL@*G$gn-n;K?n)n_yN`R z9|%C+0ns2YfoPDoKs3l}AY~x$foPByK>*}U5DoGwhz5BVM1#BxqCwsU(IBsb0Lc3w a8WaRz8W;>98Wa>@nl{0~1q>ry3oZby1!QOd diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh b/awx/lib/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh index 86fff6b954fc791c7857fe2e55a499eb17120858..c14226570b1de09573c3340af718d12dac021c39 100644 GIT binary patch literal 373 zcmWHE%1kq2zyNGO5fBCeE+7W6MH_%bM~`#E#KqcNXHB0qT#P(daLL;4!&Rf*0#CL* zX?UwYgMrKTI0FMC6Eh1FGY~Q`qyY6WFeHCtU}0cLDq!GbU?^x{;ALQ_o4_Cl5%KX2 zVF&;bp3Xq*62jmW90Jw^BSJ`U;t!~%|3Cn8Du@O-7es@c45C5K2GJm=gJ_WRK{Ut< TAR6Qi5TJoqxPX4tHRl2Vh{9hr literal 269 zcmWHE%1kq2zyPd35fBCe7@Ma7$mz&;YM2=R?!x5OjT5#z?qOhHWMXDwU`PQeWJrF) zz{0?gRKUQ&z);WtB0+2)-w=jiAog?)0jq)#AtYG*1FG*o5P%#2qCt)T(IAI_Xo?)e K1$3LPITrwglr^6K diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Irkutsk b/awx/lib/site-packages/pytz/zoneinfo/Asia/Irkutsk index c7df7ea6c01badcd203cb87e56224b8ce02e4a30..1e94a47987ac6c60308d661c70692d2726e66c5a 100644 GIT binary patch delta 195 zcmX@h`I>WrxGWC?0|N+yfD;gd*uo7!Vv!L4{)r}kSVFw73rsd(bmV4bU`RX&lmL>G zs~IiW7#Io~7&s=+VUc5EWSD%BQArosEN7rXuvtGqT7cj`5QJ@OvIo&1vo|X+{bb|- ZN`Ne2AYg+iBiIZm!Q~m`9inT&1pvCzDail; delta 146 zcmaFOd6sj6xGXmV0|N+yfFlrt*uo7!Vv!L4hKVMBChM^{axpL@UH}RK$;l0j7L)fe w%1yq<s3eH2*9j=iJz0=RnA6}t5P)=V)@Az1h(o_H$T%qA@(l70(Y53P0Ikd)AOHXW diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Jayapura b/awx/lib/site-packages/pytz/zoneinfo/Asia/Jayapura index 83bff56115fe468d66cfff8b4fe6026e65ac8da3..a9d12177d57cb8cf43c94b0406536e57c9ffda70 100644 GIT binary patch delta 42 qcmaFQ_>pmfHY4vu9TP^!i3#RF)(jUBN9W)W1{mN9_YBds<N^TlVF@n) delta 39 ncmey!_?~fsHY3kO9g~TP=0JL;i?DNW2m=gog?onRT5<sZ*XszY diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Kashgar b/awx/lib/site-packages/pytz/zoneinfo/Asia/Kashgar index a4f79ad454b31c8f1fee287ff6405b4f7c47bd7a..964a5c24b7b86f70f2b83760594e894b263b713b 100644 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$l363R|*3o14EDuNGc?OfyKu+gdxH!1jJ<sA;GjC TU>yt$|A7F%sa!zgb<MZ{2!Iw0 literal 433 zcmWHE%1kq2zyPd35fBCe0U!pk1sj0GhJQz0j!%?bA)NcvKyH^AgM4OvfkItIgQ90* zfl{1TgR-V`fr@)NgQ`&c2Q_t12DML)A2ist88j{_e_&u_Vqr#t3=HlzKqDD^BN$j1 z7~BFtWZeWtP6md81_oXq-w+0G$KVhKXBQv_(g+Yjf}?*xwfzSIkmEr#$O9l@kS9Pi z$Ri*C@(hRuc?d*<JO!db9s|)J&w*%=2SEVjNe~V4D3}I%7DR(Q45q2+X)a(G=vr_A E0M_|Qpa1{> diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Khandyga b/awx/lib/site-packages/pytz/zoneinfo/Asia/Khandyga index 356401fabe1d87ff8c5d96b91dd8f47421e9069e..26becb3291eddd822cca86871a984fe9e38bf562 100644 GIT binary patch delta 133 zcmeC@TEjI#T#%1}fdPa;zy*l;HfjhkvV?e_WSH#8;>^f0xth_Bg@K`N!sH7qnoNug jlRq%3U~1Z|$|TFg4%CiAqc|hTd<5W%bo36<wd4W-%qJCR delta 102 zcmZ3()z39ST#%Q6fdPa;z!`{nH);qlPPSomp4`CbH~Afl`sBZiDwwJ^8!^c;O}1rp Uf+-UNn*bxYA|1U$bPWx-0DZg=#Q*>R diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk b/awx/lib/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk index bebf8764dbb67b83c639058d31653eb649a01135..3107809022e4fd7ff95480826ccaaa838394de7f 100644 GIT binary patch delta 181 zcmZ3(d5Uv_xGXmV0|N+yfD;gd*!&GZV&PBTPZLf4u!ML&RhVqR=*Y^#z!1(i*^|YB zje#MlfPrOlBa0*tBTyv_Ob}PaYT6H|g8x7OGIcW#(@#crpdenOMUai=@(ywg(KY7+ E0FId;ZU6uP delta 148 zcmX@bxrTFsxGWa~0|N+yfFlrt*!&GZV&PBT9}`XfOqOJEWMN<k=a?MNVljCxizG}j tP{{;wRjk^70Odg7KM;V7*(}NQlX0>Xivx;5LJ&nDlFK{DF+|sb3jnR~8<hY6 diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Magadan b/awx/lib/site-packages/pytz/zoneinfo/Asia/Magadan index 920cfd50a54b1e021700679e416403f681975864..e09c4dc2e2fb483baf6e7b131b1ff1a0c16bbfd8 100644 GIT binary patch delta 143 zcmZ3>d75*AxF9zJ0|N+yfD;gNZ`9ymWC`(J^I)<8qa!2x<U&RpHU@^C1q>{c8(AcI i7{Mwb1UBuPe=zbgu><9C8X<~o1edR)dx)-~0T%#ZJ{A`M delta 108 zcmX@jxt4Q+xF8n;0|N+yfFlrdZPegkoGi)WI60cdX7XGXNth&14x94LtW3O2lciW3 UVCscICP4s~ucLd2uAvbZ02&kyCIA2c diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Novokuznetsk b/awx/lib/site-packages/pytz/zoneinfo/Asia/Novokuznetsk index ded069002140d88a7e392e8e424c43ee18393c24..11768662734db5b34b3ca8929f787e8483d4d0a4 100644 GIT binary patch delta 115 zcmcb_`G9kRvY-<K0|Pe@OEmzART2sZCYt<V3Gx1HFxi07k&$I`A)^zc&*a%G`ja0s lDoesu{{X56f&V}N(zRKh=_eyQPymZo19tBq#}Hj}E&$cR9)<t_ delta 94 zcmaFBd5Lp^vY;aa0|Pe@OEmzAg+GNICYt=2Y{KX`xs1_?(Qooj#vn<!k{>`NAn+du dKuR~OF#TklY|7{WRlJhLfZfkOEJW9w3jnb58e;$e diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Novosibirsk b/awx/lib/site-packages/pytz/zoneinfo/Asia/Novosibirsk index 4ec582b5720cd0cafd933ec4cd0df032029622ba..ed6d7dc5416fa005cd90cb8d59b51edfdd4a5656 100644 GIT binary patch delta 114 zcmdnRxr1|pxF9D30|N+yfHM$tZq(pmWC`*9Y%p1n#fg!9av7u9<bD>3$!8c9Fcok9 a%P7jk4%CLJK@emj7;yRdhlS{xaRC5n#uIh` delta 113 zcmdnNxr=jxxF8n;0|N+yfD;gNZPegloNU49G`X75jE#XIseplH@<v99$;TO$Fcok9 c#VE=&*^<!_O|>v1*g!DB<>wz3qHE3t03mr2ApigX diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Omsk b/awx/lib/site-packages/pytz/zoneinfo/Asia/Omsk index 5093cd924ff8a8985bc621efcf76a7e286a4906e..760c39106177cdf4e66a10100ee085a67f643717 100644 GIT binary patch delta 181 zcmZ3(d5Uv_xGXmV0|N+yfD;gd*!&GZV&P_oZ4*uYu!MMjHkfR{=*Y^#z~FLfvL}lL z8v{c~0t3tBMixmPMxaU<m>{l-)wCZ_1^<BnWa?%frk{-LKta4liy#}#<?kCDqHD$l E0KeuTG5`Po delta 148 zcmX@bxrTFsxGWa~0|N+yfFlrt*!&GZV&P_o4HHfNOqOJEWMN=%xiC4N#bWYY7D<?5 tpppsVs#vxE0Lp>De;@!EvsseqC*x!(76%lAgdmDQB$vN$aEPus7XZ<U99aMW diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Phnom_Penh b/awx/lib/site-packages/pytz/zoneinfo/Asia/Phnom_Penh index 37c9e15fb9bc06bb3ca2af8e420e6df2f632a176..e8e76276a657ffea33afc25ea56864eddc7f43eb 100644 GIT binary patch literal 204 zcmWHE%1kq2zyQoZ5fBCeCLji}c^ZJkqO9~Ij6jh%8z2WnvM?|t6)<r4_=Yez0kNlZ n2uK15LI|4-vxVmeL<_@zAPC#mdIUs+Y+@kJDlVX{y5?K}zlk2B literal 269 zcmWHE%1kq2zyPd35fBCe7@Ma7$mz&;QJEP3?!x5OjT5#z?qOhHWMXDwU`UDqsZ4&u zzyf3!FmNz16f}TH5ZlK$gdrG+J)J{9il88b1dD$__523{kOM$8$PpkK<PZ=|kz=@k JZqqgA0swKCHJ<<g diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Pyongyang b/awx/lib/site-packages/pytz/zoneinfo/Asia/Pyongyang index 63732b2bc1bcf9533e0404ee558e71d3948b9161..b04bf74efd7eeaf89fdc72cd3f5245de33f454e7 100644 GIT binary patch literal 279 zcmWHE%1kq2zyPd35fBCe7+bIb$mzcRan7V?Vm}UtS{Gc>Pb^?yWMXDvU?_b8Qd!=? z0A$xqVBi3gykL^W$2Ww*J2-^F%NaxfF#?2;VEYfKw*No?as`M6xdcRmTmzyhcM%uR IrMi|}0N&#}>i_@% literal 284 zcmWHE%1kq2zyPd35fBCeHXsJEIU0aO>*TtM4gY#S>}c6i@yK8E!w1uf21X`ECT1oE zhSDcM1q|gK3@i)`brV2jK?98K;~T=@9UKBu00kk0ZDt251>5`ss^>otWVWTw0ns3r efM}3wKs3ljAR6Q<5Djt}19?v40=iV!k_!MDbw?rq diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Riyadh b/awx/lib/site-packages/pytz/zoneinfo/Asia/Riyadh index 2ff300678eecc73fc5bdc9bcbe0223445ed74aa6..c35e42a1216381de994a33b4073ae0090345538a 100644 GIT binary patch delta 21 ZcmZ3@xSDZ-0n=6Ki5)T%{Vc!?WdKt82ZaCt delta 21 ZcmZ3@xSDZ-0n@F-i5)T%{Vc!?WdK+I2pa$Z diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Saigon b/awx/lib/site-packages/pytz/zoneinfo/Asia/Saigon index 86fff6b954fc791c7857fe2e55a499eb17120858..c14226570b1de09573c3340af718d12dac021c39 100644 GIT binary patch literal 373 zcmWHE%1kq2zyNGO5fBCeE+7W6MH_%bM~`#E#KqcNXHB0qT#P(daLL;4!&Rf*0#CL* zX?UwYgMrKTI0FMC6Eh1FGY~Q`qyY6WFeHCtU}0cLDq!GbU?^x{;ALQ_o4_Cl5%KX2 zVF&;bp3Xq*62jmW90Jw^BSJ`U;t!~%|3Cn8Du@O-7es@c45C5K2GJm=gJ_WRK{Ut< TAR6Qi5TJoqxPX4tHRl2Vh{9hr literal 269 zcmWHE%1kq2zyPd35fBCe7@Ma7$mz&;YM2=R?!x5OjT5#z?qOhHWMXDwU`PQeWJrF) zz{0?gRKUQ&z);WtB0+2)-w=jiAog?)0jq)#AtYG*1FG*o5P%#2qCt)T(IAI_Xo?)e K1$3LPITrwglr^6K diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Sakhalin b/awx/lib/site-packages/pytz/zoneinfo/Asia/Sakhalin index 7351186ae5a9a1262612112002b5330fa3eb47f7..ec62afc5995a962bbe321611d86d695c3b33517e 100644 GIT binary patch delta 278 zcmX@jd75*AxB@2w0|N+yfHM$-*b)suqV2=k9fw1$Cz}6d3Gv?bVX`EPlN|>GL+c5k z97Ej%1{N?0RKDT>BQFEPtPKppFcKyL67N~SAnfBC!r<i`Jb5mQ6wE3Hh6&<2AP!6b sZubw6`9Sa=2taNC(Li@>R$%(Y$PN^zqGN=>7J&$^U`Ou|T|)yd01V_nX#fBK delta 277 zcmX@jd75*AxB?dg0|N+yfD;gd*y0U9qV2=k9f!}gPBi~JS)RoSDAjrbD9TVbfq?}~ zaxgHgIKarmz%XkAgAj~_iGaj=7Qn=Pd_x$Vy(Z6Rk>X|qnE?S4#C5P*{sSui9|%B> h0MS5)Y?fpC#W-1k#gR%*5kYbaSFodZh_0a_7XWhrKV<*_ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Samarkand b/awx/lib/site-packages/pytz/zoneinfo/Asia/Samarkand index a836887af840060b76551fe56cebd02a3ce7c322..65fb5b03de72200233f74962f865e3e9e9e85aaf 100644 GIT binary patch delta 35 pcmdnYx|wx?F{AlJlP1QK6Sps6G@l&9_zc9%WakQv3eh#?0s!k|3~~Sf delta 35 pcmdnYx|wx?F=N6+lP1Om6Sps6Oqd+Q_zc9%WakQv3eh#?0s!qN3~~Sf diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Seoul b/awx/lib/site-packages/pytz/zoneinfo/Asia/Seoul index 0b94de84bfc0004b818e7d9196e3ea929ba2131a..fd91d5b729aaa78253bd439c36a103fe88ce33b2 100644 GIT binary patch literal 571 zcmWHE%1kq2zyRz(5fBCeaUce<MH_%b_w^4Ilb(tFI2>wSaLHNy!y|vq4^OhU|9C1a zk?|~vx#GE?&x;rO1r;xzf5~{oA5`(`__d7J?@cP+EZ>pw_PkidyY^WbA504?6c#5; zP|Qo8pw#R%LD|o90s|uxGYcat5@cZmLI#F%4xp_J<sA$_cHIO9AP-3Lf=QrA>kLLg z28NymjDkMCAq?KZAq-y5AOeWJT|z)Qkw6Fue*FQ}_a6vAeg@GXe}ia{-$69U{~#I^ z1|S*~4j>v779biF9v~VNCLkIVE?^oMHXs@lK42OcMj#p#P9Pc-Rv;P_ULYD2W*{0A dZXjoY!VW}(!Vg4)!VpB$D;&9i;jC-P1ptE4#?=4- literal 422 zcmWHE%1kq2zyRz(5fBCeULXdsc^ZI3>*TtM4gY#S>}c6i@yK8E!`p|G8s0T>e)wQo z(eQUE*AIooE(MBtwh2njY6Z%E@(GMgj7%)dER0O7K*+#Q&H*%op}d2Eg@K`N0)%7) ziWM|~*gXqCY>>E*ZwP~TFc7<hfHWY15W)`T11bkQ_y<(qe;~+gOQ`_SAP<0OkS9Pi z$Ri*c<QWhR@(_pyc?v{>JO-jco&y;N@*s!?c@ji}JPM*go@JoAZ@GYhplitm0Hw5X AUjP6A diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Shanghai b/awx/lib/site-packages/pytz/zoneinfo/Asia/Shanghai index 02242f0d9cb9b904f80698a96f0103c4a1d50b72..dbd132f2b0bcc8beab08e04b182751795c853127 100644 GIT binary patch delta 66 zcmZ3?Jdb&TGOr*50|PS<^E3d7i6#!BOpIudfuZpF<QhhWiK{GF>dc%qCqA3X2og{S E07(`N1^@s6 delta 54 zcmbQoyqI}{vY-$H0|PS<^E3d74gY4%o@n4OIgwG6@#*ApMumw>Em**U52u0!)B%=- B5+DEo diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Srednekolymsk b/awx/lib/site-packages/pytz/zoneinfo/Asia/Srednekolymsk new file mode 100644 index 0000000000000000000000000000000000000000..0929f66debc0a884f249971590867672f09c2521 GIT binary patch literal 1237 zcmdVZJ7`l;9DwnYCbh3Y5$(e?+8S%DwU4B=R@2rtHHMl5LwXmh;@|@`%O7zlxCrWG zeGK9dL<N;riPE7Kkq#LI2a8B44#lBh9f}|a>7XLi^WED*K^z=CmwSGPb8j-_e6a@4 zo(ZWxMw!{+W<<=*dc!3%J*{e;fAMg1Zew6is=P9juP8qEzT(IIp2~%LsjAuO{H7^? z$~)O2)wx>n-CZx6huyN};-b`KK1=P<53)7>M*QKIvaR8X)OoYAz3iF<JQF&wIHGsV zkEr^g!>WGfM1JS%$XLU8M(=ubOgG+6>ZU8*y7@x0ZaGz>gU1sRIv<eMt|n<qm&k74 zI%yAnk@jETq{CaJJ3h|H-k%G4-{gdZXW#11$J4s&)id3FbzJYy-qby(@95skIf+Dv zbl=Gva-eQdNBcw$7Ix~GKP|DZN2K4~CjIZia_CdJ#Gm^lF%{Cu>q}zAb92h&E^sbS z;i_v*k*C1DdgE{F;u589Rhu7E4L?vGrAG5Evy&ZT?aV7X?617D{B*7Jej;h9WN*x# z1}rs@j#_-7ayi3ZJCpSfC;WZ+b4zA$(#UDE&50wYj-0%$Ienx6qynS_qz0r2qza@A zqz<GIq!OeQq!y$Yq#C3gq#j#S5K<9?l59;)NKr^tNLff-NMT52NNGrINO4GYNO?$o zNP)JdLZn1nQzKF&QYBI*QYTU<QYlg@QY%s{QY}(0QZG_4QZZ7pt*IF)+SXK!l#SGl S6pmDm|6l2){0ka`!P4KroF5?o literal 0 HcmV?d00001 diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Taipei b/awx/lib/site-packages/pytz/zoneinfo/Asia/Taipei index b38563267733831d204789851e10478c365a6ea8..4810a0b61420871f7b2f39749e10fdf7244b76f7 100644 GIT binary patch delta 384 zcmaFIx`1thxFIV80|N+yfF=-w*rE+U;&7;E!=;eOhRfa64Og7jez@wY#Bj}L|A&bl zjk&iMHVB2>Ens9~VI~SPFciK38p%-5z`(-5P&a{r6GSrdf<**<d_x$#!h?YX5Ieg7 zF_1=p3F4v1j?@CmfF1b*s^mWql$`q@0ir>U2GJmggJ_WBK{Ut%AR6Qe5DoIk=1xXd X#!8@9K<0qF!$2SZZ~?uiYrzEoKF(j& delta 329 zcmZ3$_KtOexFItG0|N+yfF=-w*gOqD;^Oqn43`qC3NBZ&HC%C8`{8Po6~i^<hXoTo z8hvjCFbD;Ae_&!H5;8Cpz5p7@P&a{*g@K`<fq}!vH-y321&D(~ChIfGg(5pc3#bz8 zj2|F9K=2<3O3r<d0MQ_4foPD^Ks3mCAR6RE5DjuBhz2=z^CCu8#sr{aK>*}n1|r?d T$b{F$VDlIlxPXq=wcr8(I{#E{ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Tashkent b/awx/lib/site-packages/pytz/zoneinfo/Asia/Tashkent index a89bcf85bb74f11163fe743e101bf5f0c2ab3bc5..1f59faa5344c42393ea7ed4d8dd2c749d409131e 100644 GIT binary patch delta 33 mcmZ3<x{`H*F(c<hlP1RRlkJ#NCQCC~GjdK2XM6_cX9EDT915EN delta 33 mcmZ3<x{`H*F(b!BlP1O=lkJ#NCQCC~GjdE0XM6_cX9EDT5el0C diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Tbilisi b/awx/lib/site-packages/pytz/zoneinfo/Asia/Tbilisi index f426df7055b5312e621bf5f33ea6f6ceadfbe34d..0d7081e975983fbb2425df33c552d0885ca14664 100644 GIT binary patch delta 59 zcmeyy@r`4G5z{QjjV2t79Gd?bfI##A<TuRClaDi6aqVLK4+N_uXEAQ(X1a-@pbG$v Cj22k{ delta 59 zcmeyy@r`4G5!1{+8%;PEIkZ?9fIy37@*C#n$;TP3xOV>e4+N_uXa3pD&2$q*K^Fjw ClNDb8 diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Tokyo b/awx/lib/site-packages/pytz/zoneinfo/Asia/Tokyo index bb6352bcb9a584eb00ba003039bc1d7dc8c73342..024414031e18e6d8832336887b00a2220d4715fd 100644 GIT binary patch delta 114 zcmaFJ^q6UaHV1D50|Ue1Q0s}tHhi2640RJ27`%c*7`&W=C)QXh2>t-dg1~<uNIkTq r07RFZdkm&Qx~`^Z@`81-`1k^KL39EcE+GsIj3A95f(t0FYsm!w1Ii^^ delta 87 zcmaFN^pI(SHV01w0|Ue1bFCANZFo5t80sc4Fn9%rFgSZnthHnmn7Cb*2`G0hMS}+{ b$KvA~0+k2SE+GsIj6m&Rf(xik*OChWGKLiZ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Urumqi b/awx/lib/site-packages/pytz/zoneinfo/Asia/Urumqi index d62e3bb02a6a5373cf7ba9d87fe33406acff9a12..964a5c24b7b86f70f2b83760594e894b263b713b 100644 GIT binary patch literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$l363R|*3o14EDuNGc?OfyKu+gdxH!1jJ<sA;GjC TU>yt$|A7F%sa!zgb<MZ{2!Iw0 literal 403 zcmWHE%1kq2zyK^j5fBCeejo<11sj0GhJU+KgmbSe$n7#?kk70yP^imjQ1nbJP>S<v zP}X!VP;pOZP!)>*pr-E0p!Uh}g9f`cgT^K04-AaVOh}M{AxH*j8be3|$mqHWjGPP% z1q}?mKE5Fgp+TV`49+e<92^2t0|p@^xbp{8&wn5QxfjF*xfw)*+zkRCw}WVq`$06w r4<H)k4-gIV3y22!2LwQV0?{CUfoY)MKs3mIV44bk<N|tF*MbWG90fou diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Ust-Nera b/awx/lib/site-packages/pytz/zoneinfo/Asia/Ust-Nera index 39b074491bbeaf75eaccf7487d7c1ab39da3669a..0efacd6beae621991e75418bce2ad3398b8830f7 100644 GIT binary patch delta 139 zcmaFQ*~>LST#%Q6fdPa;z!`{nH)`-OvV?f=`Y>6W#fg!7axRMtQ_q6QYgu&p7{RJw e1UAi^#hFBz*nujr8X%5p09TlgV~DPy0T%#3TNWq) delta 101 zcmeC>de1pQT#$!>fdPa;zzK+XHfr!NPIh2%nq1B3GWjT@=Hw5I%9yG)t1yW&O?G5) UgeemRn*b%a!h9S<bPWx;0Bg+<Z2$lO diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Vientiane b/awx/lib/site-packages/pytz/zoneinfo/Asia/Vientiane index 67e90e0cf8c4cf4d0dd3b8ea79a8a4bcfbb3d935..e8e76276a657ffea33afc25ea56864eddc7f43eb 100644 GIT binary patch literal 204 zcmWHE%1kq2zyQoZ5fBCeCLji}c^ZJkqO9~Ij6jh%8z2WnvM?|t6)<r4_=Yez0kNlZ n2uK15LI|4-vxVmeL<_@zAPC#mdIUs+Y+@kJDlVX{y5?K}zlk2B literal 269 zcmWHE%1kq2zyPd35fBCe7@Ma7$mz&;3z!)H?!x5OjT5#z?qOhHWMXDwU`Q|ksZ4&u zz{0?gRKUQ&z);WtB0+2)-w=jiAog?)0V#rl5E3l@0oCtW=1(I7{FXplodG)0c# K0=iAtoC^SZOf{bX diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Vladivostok b/awx/lib/site-packages/pytz/zoneinfo/Asia/Vladivostok index 8cd08b558eaf38ce20101bf3e3202695b37df382..156c8e6f5283b8164b63ef3517babf775f355e12 100644 GIT binary patch delta 252 zcmdnZd75*AxGXmV0|N+yfD;gd*!&GZVtJ%{>_n44EFs>zK1?=XbYx{=V5nX^Ie<mg zgp+}xZUO_4KWhVoWCV)zEMQ>q@eN@J^Kk?d!686H7#J8KfMN1kMnzSumi+*$V_^6X g1RzT{3p4#>WCsdj+U!n_%~0ck6c@;Cx`qZ^0EDkE%m4rY delta 243 zcmX@jxtnu>xGWa~0|N+yfFlrt*kTPpVtJ%{z(kWjlO<UkSr{0qH%yLaQMKh~V5pnG zz{$WcYXbvNbk+t&P9NV8hA<yTFcAzPffNWZf&rKbCMJlhVzuoDRLOrJ0NJ`(lIbVo VWGNO0xV>%^*~<lTp01%G7XTgeE5iT) diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Yakutsk b/awx/lib/site-packages/pytz/zoneinfo/Asia/Yakutsk index 9dbd55781ab98a0020502f0a309b726acdd41160..58ff25ea1f2f12facbdc31a3c2e1702428c1ff3d 100644 GIT binary patch delta 181 zcmZ3>d5Uv_xGXmV0|N+yfD;gd*!&GZV&UyqaT87cu!MM@WSDHg=*Y^#z)-npvL}lL z8v{e#1O}GLjVzKpj6jtzFhN`ut7$)=3jPBD$kfd|Og|affr5CA7C|<eE7H+BMAwoF E03a12IsgCw delta 149 zcmX@bxt4Q+xGWa~0|N+yfFlrt*!&GZV&Uyq1rtsFOqOJEWMN>aoG>|_#bWYY7D<?5 upppsVs#vxE0Lp>De;@!EvsseqC*x!(76%lAgdvJRBv+)PcZjZ`0T%#7@EwT& diff --git a/awx/lib/site-packages/pytz/zoneinfo/Asia/Yekaterinburg b/awx/lib/site-packages/pytz/zoneinfo/Asia/Yekaterinburg index ce21137e24be366d7ef547acd56af2bd97ba3aa6..a1baafaec926ab14464f8cf49623becf0c5b4df0 100644 GIT binary patch delta 494 zcmeywxs7XrxFSCT0|N+yfHM$-*m4a(Vs<>I`a+?N|0kOKsSojCbYNg)Vqu0rRyHKa z&cVaU#mz$)^71e+Slk4f%wTemfd$BRVBlb22uWb%Wngd%0I?w?OavqjQKJqN5(Z04 zf;Awq8Gs@{ZIV8|Aq)YN4=~E|GB5%G1C*Tnj8R1ws~3NO90COYfdJ%H5DoI~W__lg ljP*c?f%LN$Bw&#IiR^z2KP#d58SE_>!4>K19inT>1pu49J~;pY delta 412 zcmdnS^@($WxGXON0|N+yfFlrt*isEZVxiF54-+l^)H5(LGeIB=D-vX5=jPz#;wB7v z7#J)r0L^2taA06zU<gTI<YZuQ3jnbpBuoS(4p+kumK9}S5ClrYIUxxQqCS&vG0Ji> v0s#X9keJNEq@s$|6F)$f0>OVE0C{F}DAP~I`hoRLhyVfKD6$GOnQ;LCCao?g diff --git a/awx/lib/site-packages/pytz/zoneinfo/Atlantic/Azores b/awx/lib/site-packages/pytz/zoneinfo/Atlantic/Azores index bc03b54b53d8d041fc31e49f66198f279d72c04c..1f5325324590a123e9ec7143c20c9fac1e471928 100644 GIT binary patch delta 23 ccmZ1=y+C?`0rRA1D>oYRvx4Z&uB_1<0B)lQ*8l(j delta 23 ccmZ1=y+C?`0rSLze>NKPvx4Z&uB_1<0CCv~F#rGn diff --git a/awx/lib/site-packages/pytz/zoneinfo/Atlantic/Madeira b/awx/lib/site-packages/pytz/zoneinfo/Atlantic/Madeira index ce2f5290f5e4bba4688172266a60e7e47dad9065..3687fd66e3aac0f1271ee64958b0af1187e29112 100644 GIT binary patch delta 23 ccmbOxJxzLo0rRA1^EMjuu!88#POKpu0Bh6;pa1{> delta 23 ccmbOxJxzLo0rSLzA2%BFu!88#POKpu0B;Hi`Tzg` diff --git a/awx/lib/site-packages/pytz/zoneinfo/Atlantic/St_Helena b/awx/lib/site-packages/pytz/zoneinfo/Atlantic/St_Helena index 52cb99bacdbe165a8543aa7a8c956967ca06542d..6fd1af32daec193239ab6b472526fd3d6bdb2f76 100644 GIT binary patch literal 170 zcmWHE%1kq2zyM4@5fBCe7@MO3$eHwPk_Q9h|Nnn1KvF=!;^P~_;10wf5JG}!KfpQ| Q82$qRep9)C#v5<}0M)@5+W-In literal 203 zcmWHE%1kq2zyQoZ5fBCeCLji}c^ZJk9jDn5j7<Ok|60Mo047<0f(#5CKE5FgUO?;) k#1Ifd*kqV3JU^g%{sTc~+k+b*8e|g#aaM5wZ8hKm0Bav95dZ)H diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/ACT b/awx/lib/site-packages/pytz/zoneinfo/Australia/ACT index 733a6bfd2f56ef3f691ce0d23693e17a118bec40..aaed12ca284d69e3a8ba25891701790bde7f6743 100644 GIT binary patch delta 115 zcmZ1|xL$CAHY49go$E~EoD2-JHZZa<F!U^7;PmkgVQ_SH0TPo%m@OIkHv2J4usY*V n;u;*n00fMTAd-R05y;myGyrMW@ijEiGt@KC@ihTa`o>%UyXO~B delta 101 zcmZ24xKMC{HY3MIo$E}3EDQ{@HZTIoo&^jnKE5Fglcks~896qGFiWsnV@SFNhcEyE gBO{1p-~w`W4Gn;#j<2DCo}r$Bj;{%b(l_P;09ZB?{Qv*} diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Adelaide b/awx/lib/site-packages/pytz/zoneinfo/Australia/Adelaide index 8e560a7216e32402b15fbbbc97c60d6f2936a68c..4f331a87df4ed78be0d00b1a82b5c66c773069c9 100644 GIT binary patch delta 143 zcmdlWxKD6`HY3+Yor_HBtPBjTGZ=ti@(M;M+tE2Vgu&6-B?KhQ$Os}CCWucqWfo!N z+w8@x$m+`p*2DtV1ZDg9g7hG1gz0490txF{S{WOF%+&EUG|)5DGtluh0a5zKTmb4| B8ioJ> delta 115 zcmdldxIu7&HY3YMor_GO3=9mdGk^rc<Q0riwsY`g31)Lfj?Dqgima|IU<E)Dr~u0L r@eN^c4h{k7VqgU60s=0efUc#Lu>p|Q@ijEiGt@KC@ihTa`o>%Ub$%8u diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Brisbane b/awx/lib/site-packages/pytz/zoneinfo/Australia/Brisbane index f9525033b710d0866963c6e5aa6ce8ce20bf510a..a327d83b7696f39c01a9b5cdff1d4f0fd4b1f94d 100644 GIT binary patch delta 90 zcmdnae1v&|HY49eoiuSy28LN17+Dw?dKNHn`uK)0IJ&w3iHVCXf%11Z>*0`h4Gv)d S0!Bs<$-w0Z<m(z5Z~*}I;uF9C delta 77 zcmX@Yyq$T1HY3MGoisrf28LN17=dKZ0tOZz-w=k0D=mRCk2kAh$hZcFFaQA~BZy?+ K0&;Z?4Y&a4?hv2= diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Broken_Hill b/awx/lib/site-packages/pytz/zoneinfo/Australia/Broken_Hill index fdc5ffb5c4c7a5c2372c7b36ae7600865a5c02c5..768b167857dd82807b5ef912be31518086c77141 100644 GIT binary patch delta 142 zcmcaC_(*VqHY3+Yooh_etPBjTGZ=ti@(M;M+tE2Vgu&6-WwJQ4Iiv7qe`aIWC{C~f zKCogGwvR7Rtt(gqL{|vNFa`!jMhMNo1u{<8(#qHXXk>_vuc3jSp`L+`uL+3KH|7EW Dv!xt; delta 127 zcmaDPcv*0QHY3YMooh^@3=9mdGk^rc<Q0riwsY`gS!Q!ap3R}m#;k!HU@0I8REEO# t@eN^c4Gv*&24XN^1Q`GVTtFdRODkgoAg$wTXrO1PXQ1P20;2Sdxd7QR80G)~ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Canberra b/awx/lib/site-packages/pytz/zoneinfo/Australia/Canberra index 733a6bfd2f56ef3f691ce0d23693e17a118bec40..aaed12ca284d69e3a8ba25891701790bde7f6743 100644 GIT binary patch delta 115 zcmZ1|xL$CAHY49go$E~EoD2-JHZZa<F!U^7;PmkgVQ_SH0TPo%m@OIkHv2J4usY*V n;u;*n00fMTAd-R05y;myGyrMW@ijEiGt@KC@ihTa`o>%UyXO~B delta 101 zcmZ24xKMC{HY3MIo$E}3EDQ{@HZTIoo&^jnKE5Fglcks~896qGFiWsnV@SFNhcEyE gBO{1p-~w`W4Gn;#j<2DCo}r$Bj;{%b(l_P;09ZB?{Qv*} diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Currie b/awx/lib/site-packages/pytz/zoneinfo/Australia/Currie index e6115974ee11fefa50b27a374f6861a71a3d984e..a3f6f29a49617167750848c71e463faf6f3974fc 100644 GIT binary patch delta 117 zcmZ1|xL$CAHY49go$E}JoD2-JHZTIoo&^jnKE5Fgj;_HV!ez1;vpFN*W<O>LR%e`w lLKuL6kr6~PaDjB{8X5rghUoYj8t5778R+<$fGB-qE&%@;7wP~2 delta 103 zcmZ24xKMC{HY3MIo$E}(EDQ{@HZTIoo&^jnKE5FguECRKn9UhEHis}vuv%l04q*TS hMn(|Hz~veoqHAaXBz1fZ4fG8440L==K$N~Q7XXsc6qf)1 diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Darwin b/awx/lib/site-packages/pytz/zoneinfo/Australia/Darwin index 26d7dc3b43daac52c265d95032132b3c6db03933..c6ae9a7ba253089d4fcdb9668b70aaad20dc94ad 100644 GIT binary patch delta 76 zcmdnSbeL&^HY3+W9SeR|28Pxd3=EFW!687xWn!)|Bj3b@B^sPyaTXt6kT66pgaHP) MKtj5fR>lTg0I`w~3jhEB delta 73 zcmX@iw2f(kHY3YK9ScDQ28Pxd3=Gb}AwU)gOc0+qNraJO;_?zj7O)(Pk8cQ)JOcw4 MP_eG1m9YUA06EnS`~Uy| diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Eucla b/awx/lib/site-packages/pytz/zoneinfo/Australia/Eucla index f3b7cda02f5e453a9b3addf1ed019a2e9bb2cc9f..baba07a310ad1dce77c821f8fd25bcabd093cb17 100644 GIT binary patch delta 96 zcmcb?{G54$Hlx5qodO9i28K=<MivH!Y90nIAKwrLN9S-CAUScZ6;Q#8qsF)tIEM#^ XFaQA~BZy?+0_qD6(Y3HLG35dP5>OL< delta 81 zcmaFPe1my{HY4XmodQ7?28K=<Mj%<u!@%O>8^SPgixp7j{ZVZU8Rzie5C$M%WCW26 NTp+%#g_VgZ7Xa4E53T?J diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Hobart b/awx/lib/site-packages/pytz/zoneinfo/Australia/Hobart index 49e71d6b98705570fc13d6d6c76bd10fc18e1912..07784ce5d751f040ba7ab43713f32cb92ce9afb1 100644 GIT binary patch delta 117 zcmbOzG+$_fHY49go&QXdoD2-JHZTIoo&^jnKE5Fgj;_HV!ez1@vpFN*<}&64R%e`w lLKuL6kr6~PaDjB{8X5rghUoYj8t5778R+<$fGB-qE&wfO7>ob_ delta 103 zcmbO)G*M`RHY3MIo&QY2EDQ{@HZTIoo&^jnKE5FguECRCn9UhEHrFsGuv%l04q*TS hMn(|Hz~veoqHAaXBz1fZ4fG8440L==K$N~Q7XZ7%6*&L^ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/LHI b/awx/lib/site-packages/pytz/zoneinfo/Australia/LHI index f59feb1322c75e7ac83194088839985f4e3c6028..a653e5166d29fd9d586719347d52ae447bfbe58e 100644 GIT binary patch delta 126 zcmdnacbIR2Hly%Hod70DP6md_D;W3~7-nr?<n-|kVQ_Q}4q@=|aGBiCWWy-D`3#dP piw{mkAeBJn2*3s6>lzwZ85;o20J02qd<_ls4D}3jd`&<U7XUr)8w~&e delta 89 zcmX@ix1Dc-HY4vwod70b4hDwFD;R*}tPPADKE5FguECS1GTAWlZob5%%7Rr|fL%^B XI7HXbP{-HMK+jOmK*!evL~#KC$X66S diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Lindeman b/awx/lib/site-packages/pytz/zoneinfo/Australia/Lindeman index 1db8ef7c90558521ef4a6a6cacb3317fc771959d..71ca143f29f2e5799b865478d05a0e88465d92f2 100644 GIT binary patch delta 90 zcmey%+{H3Mn~`s#PQ5rM1H-Hhj4TWcJqs8(eSAY099><2#Kb+8K>2SE^l-?#28S>J R0V5-bWZ-fH@^uXjxBwMH6h#04 delta 77 zcmeBT`O7>(n~`IpPQ4%t1H-Hhj6kwy0RxMVZwSN0LzY09KM&L~WL$$o7=VD05kxX@ K0lB({23!CF$`K_1 diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Lord_Howe b/awx/lib/site-packages/pytz/zoneinfo/Australia/Lord_Howe index f59feb1322c75e7ac83194088839985f4e3c6028..a653e5166d29fd9d586719347d52ae447bfbe58e 100644 GIT binary patch delta 126 zcmdnacbIR2Hly%Hod70DP6md_D;W3~7-nr?<n-|kVQ_Q}4q@=|aGBiCWWy-D`3#dP piw{mkAeBJn2*3s6>lzwZ85;o20J02qd<_ls4D}3jd`&<U7XUr)8w~&e delta 89 zcmX@ix1Dc-HY4vwod70b4hDwFD;R*}tPPADKE5FguECS1GTAWlZob5%%7Rr|fL%^B XI7HXbP{-HMK+jOmK*!evL~#KC$X66S diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Melbourne b/awx/lib/site-packages/pytz/zoneinfo/Australia/Melbourne index a1dc7d6e1cf5a639cbb1ccd59000bbe27cb49ba8..ec8dfe038c2d10aed29763ef8f664c8f0cd35c8c 100644 GIT binary patch delta 115 zcmZ1|xL$CAHY49go$E~EoD2-JHZZa<F!U^7;PmkgVQ_SH0TPo%m@OIkHv2J4usY*V n;u;*n00fMTAd-R05y;myGyrMW@ijEiGt@KC@ihTa`o>%UyXO~B delta 101 zcmZ24xKMC{HY3MIo$E}3EDQ{@HZTIoo&^jnKE5Fglcks~896qGFiWsnV@SFNhcEyE gBO{1p-~w`W4Gn;#j<2DCo}r$Bj;{%b(l_P;09ZB?{Qv*} diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/NSW b/awx/lib/site-packages/pytz/zoneinfo/Australia/NSW index 733a6bfd2f56ef3f691ce0d23693e17a118bec40..aaed12ca284d69e3a8ba25891701790bde7f6743 100644 GIT binary patch delta 115 zcmZ1|xL$CAHY49go$E~EoD2-JHZZa<F!U^7;PmkgVQ_SH0TPo%m@OIkHv2J4usY*V n;u;*n00fMTAd-R05y;myGyrMW@ijEiGt@KC@ihTa`o>%UyXO~B delta 101 zcmZ24xKMC{HY3MIo$E}3EDQ{@HZTIoo&^jnKE5Fglcks~896qGFiWsnV@SFNhcEyE gBO{1p-~w`W4Gn;#j<2DCo}r$Bj;{%b(l_P;09ZB?{Qv*} diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/North b/awx/lib/site-packages/pytz/zoneinfo/Australia/North index 26d7dc3b43daac52c265d95032132b3c6db03933..c6ae9a7ba253089d4fcdb9668b70aaad20dc94ad 100644 GIT binary patch delta 76 zcmdnSbeL&^HY3+W9SeR|28Pxd3=EFW!687xWn!)|Bj3b@B^sPyaTXt6kT66pgaHP) MKtj5fR>lTg0I`w~3jhEB delta 73 zcmX@iw2f(kHY3YK9ScDQ28Pxd3=Gb}AwU)gOc0+qNraJO;_?zj7O)(Pk8cQ)JOcw4 MP_eG1m9YUA06EnS`~Uy| diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Perth b/awx/lib/site-packages/pytz/zoneinfo/Australia/Perth index 6dd4141f902f905d500d31161c511bf36c41f657..85c26d509a81d77ebfd6525b4777ed32cd6c9e1a 100644 GIT binary patch delta 89 zcmcb_e4lxOHY49eodR)A28Ox`j4TWc1q}?GKE5Fgj^QpqV&Ym$p#1Zrx;W&+gF_gA QfRPbIGH^Kp`MMTd0MoV;Q~&?~ delta 76 zcmcc5e2IC2HY3MGodQ7?28Ox`j6kxWfq})xH-us0W=o*V+oNh2GU34?3_!rh2qGD{ JfLvV*E&#~k5D)+W diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Queensland b/awx/lib/site-packages/pytz/zoneinfo/Australia/Queensland index f9525033b710d0866963c6e5aa6ce8ce20bf510a..a327d83b7696f39c01a9b5cdff1d4f0fd4b1f94d 100644 GIT binary patch delta 90 zcmdnae1v&|HY49eoiuSy28LN17+Dw?dKNHn`uK)0IJ&w3iHVCXf%11Z>*0`h4Gv)d S0!Bs<$-w0Z<m(z5Z~*}I;uF9C delta 77 zcmX@Yyq$T1HY3MGoisrf28LN17=dKZ0tOZz-w=k0D=mRCk2kAh$hZcFFaQA~BZy?+ K0&;Z?4Y&a4?hv2= diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/South b/awx/lib/site-packages/pytz/zoneinfo/Australia/South index 8e560a7216e32402b15fbbbc97c60d6f2936a68c..4f331a87df4ed78be0d00b1a82b5c66c773069c9 100644 GIT binary patch delta 143 zcmdlWxKD6`HY3+Yor_HBtPBjTGZ=ti@(M;M+tE2Vgu&6-B?KhQ$Os}CCWucqWfo!N z+w8@x$m+`p*2DtV1ZDg9g7hG1gz0490txF{S{WOF%+&EUG|)5DGtluh0a5zKTmb4| B8ioJ> delta 115 zcmdldxIu7&HY3YMor_GO3=9mdGk^rc<Q0riwsY`g31)Lfj?Dqgima|IU<E)Dr~u0L r@eN^c4h{k7VqgU60s=0efUc#Lu>p|Q@ijEiGt@KC@ihTa`o>%Ub$%8u diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Sydney b/awx/lib/site-packages/pytz/zoneinfo/Australia/Sydney index 733a6bfd2f56ef3f691ce0d23693e17a118bec40..aaed12ca284d69e3a8ba25891701790bde7f6743 100644 GIT binary patch delta 115 zcmZ1|xL$CAHY49go$E~EoD2-JHZZa<F!U^7;PmkgVQ_SH0TPo%m@OIkHv2J4usY*V n;u;*n00fMTAd-R05y;myGyrMW@ijEiGt@KC@ihTa`o>%UyXO~B delta 101 zcmZ24xKMC{HY3MIo$E}3EDQ{@HZTIoo&^jnKE5Fglcks~896qGFiWsnV@SFNhcEyE gBO{1p-~w`W4Gn;#j<2DCo}r$Bj;{%b(l_P;09ZB?{Qv*} diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Tasmania b/awx/lib/site-packages/pytz/zoneinfo/Australia/Tasmania index 49e71d6b98705570fc13d6d6c76bd10fc18e1912..07784ce5d751f040ba7ab43713f32cb92ce9afb1 100644 GIT binary patch delta 117 zcmbOzG+$_fHY49go&QXdoD2-JHZTIoo&^jnKE5Fgj;_HV!ez1@vpFN*<}&64R%e`w lLKuL6kr6~PaDjB{8X5rghUoYj8t5778R+<$fGB-qE&wfO7>ob_ delta 103 zcmbO)G*M`RHY3MIo&QY2EDQ{@HZTIoo&^jnKE5FguECRCn9UhEHrFsGuv%l04q*TS hMn(|Hz~veoqHAaXBz1fZ4fG8440L==K$N~Q7XZ7%6*&L^ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Victoria b/awx/lib/site-packages/pytz/zoneinfo/Australia/Victoria index a1dc7d6e1cf5a639cbb1ccd59000bbe27cb49ba8..ec8dfe038c2d10aed29763ef8f664c8f0cd35c8c 100644 GIT binary patch delta 115 zcmZ1|xL$CAHY49go$E~EoD2-JHZZa<F!U^7;PmkgVQ_SH0TPo%m@OIkHv2J4usY*V n;u;*n00fMTAd-R05y;myGyrMW@ijEiGt@KC@ihTa`o>%UyXO~B delta 101 zcmZ24xKMC{HY3MIo$E}3EDQ{@HZTIoo&^jnKE5Fglcks~896qGFiWsnV@SFNhcEyE gBO{1p-~w`W4Gn;#j<2DCo}r$Bj;{%b(l_P;09ZB?{Qv*} diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/West b/awx/lib/site-packages/pytz/zoneinfo/Australia/West index 6dd4141f902f905d500d31161c511bf36c41f657..85c26d509a81d77ebfd6525b4777ed32cd6c9e1a 100644 GIT binary patch delta 89 zcmcb_e4lxOHY49eodR)A28Ox`j4TWc1q}?GKE5Fgj^QpqV&Ym$p#1Zrx;W&+gF_gA QfRPbIGH^Kp`MMTd0MoV;Q~&?~ delta 76 zcmcc5e2IC2HY3MGodQ7?28Ox`j6kxWfq})xH-us0W=o*V+oNh2GU34?3_!rh2qGD{ JfLvV*E&#~k5D)+W diff --git a/awx/lib/site-packages/pytz/zoneinfo/Australia/Yancowinna b/awx/lib/site-packages/pytz/zoneinfo/Australia/Yancowinna index fdc5ffb5c4c7a5c2372c7b36ae7600865a5c02c5..768b167857dd82807b5ef912be31518086c77141 100644 GIT binary patch delta 142 zcmcaC_(*VqHY3+Yooh_etPBjTGZ=ti@(M;M+tE2Vgu&6-WwJQ4Iiv7qe`aIWC{C~f zKCogGwvR7Rtt(gqL{|vNFa`!jMhMNo1u{<8(#qHXXk>_vuc3jSp`L+`uL+3KH|7EW Dv!xt; delta 127 zcmaDPcv*0QHY3YMooh^@3=9mdGk^rc<Q0riwsY`gS!Q!ap3R}m#;k!HU@0I8REEO# t@eN^c4Gv*&24XN^1Q`GVTtFdRODkgoAg$wTXrO1PXQ1P20;2Sdxd7QR80G)~ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Egypt b/awx/lib/site-packages/pytz/zoneinfo/Egypt index f69274c8ba5658ff6d7b71a0644bd0134b635d22..0eeed1138f2849ad49240834b8a357467637f1b8 100644 GIT binary patch delta 625 zcmc)GO(+Cm9LMo_E1TOMCJL9yTgpvJuBPOro|>7RW_Fgx?oyJQ0~h2XMQzO$<<4R4 zfrC;GN>cwExjZRFQmasIp5IdrN_#a=|M}K4&m5l5i+yibTC$d=X&5{wa;$3ahrV{W zMc&;R_d7ROFtosfl}`$)C6TkrEOa(S$o5&dN+Nt+r^uKWQIAVeu*{>IBE=8mB7Q%n zyz|KOM<bM6^o!&=X35vKDC~686b<m{#SHPi13r`MV#TFVQ5tMw<*_=SwV&Bs-z`sf zjmv^zHe9-aW&SZgUmE?No|~=NiAi5`T@NoG_t(?9+4f816e6{D>&*lS&VU644GJDr zNu(;7P*9=ZQk7(?l1)|8q2N=MgsPHJRZ^nhL@k)6l}yL5w8REHQJA7|MPZA=7lknj P=h{=o)Bgqbs@eGlp-_rP delta 576 zcmcaD`dV~?xF9P70|N+yz;+;J-Kg=Ev3|YPgWzk&AB3nh1%z5=CxkY>eGs~`>OmMw zN<g?$`-AY%PYL0*^$Fo`8!kjLWj=`1Seg(SV3ZJfHt9mtBku=MzatW&m7XR<uXVW) zb4d3=%=wrHG2dQ3i0xIo5O;FUgZNyI3kh@lA0&pU1|$`PBqW=$2c&p?NJtfZ8IY!R zDPi&)rem=z%=jP^BMT!wc>;2iCvZu~GBC&}FmU?#hA_Cg27`zYP$)1mf=C9mu-O3= zV%;pl@{ySv7&ssWpa7aIz#+;73>*+27(kQtImEbuVFTiV!e?>-P#PFEAU-gBCg*dA zF$05UatDX3H84m(!k}OQ(V(CK(V*Y~(V!p#(V$=g(V(CL(V*bk{D32vk@n#ui8FjA I@8nVf05&3hYybcN diff --git a/awx/lib/site-packages/pytz/zoneinfo/Europe/Budapest b/awx/lib/site-packages/pytz/zoneinfo/Europe/Budapest index 497c14eca48117852aed21d15fa6f580003ee55a..3ddf6a528983fc02f9ec0a534756e4d6c17e0e70 100644 GIT binary patch delta 95 zcmZn^ekwFUnQ`Vs6;=M0=@S;rx}>o1z@Z5zKOZibm>|p4wR>Z|3e)7JOy3x1O`gN- mD-Bfh9|%C|Kr~1#hz6;jEW%<7)UY|2#g+xA<MQNGP8k3Wh%sCM delta 119 zcmaDV)F?bbnQ`_+6;<)6y9E}^x}>l$rE<ce0u6=5QAY(%ezch|F+!H9H*RCO3e)5g zj;oXNn3WmlOrFH-s|{5D9|%BtKr~1nhz98e(IEXG8f3=gU(B{ZLpEEo*s=gk`3L|r CS3JZ3 diff --git a/awx/lib/site-packages/pytz/zoneinfo/Europe/Helsinki b/awx/lib/site-packages/pytz/zoneinfo/Europe/Helsinki index 88a6ff42fada443f2a40eb3200123ff7f8ac62ea..29b3c817f4637e98623c5f76a6078f18157b5cfe 100644 GIT binary patch delta 79 zcmey$_myvgF{kwDbAbtG4m?fRXyeGlp2`3O;;EAr*v%*JX0n!?{T~RH6z5BWXpl+} P4N|?CpP7pVNqHy$jFTeE delta 79 zcmey$_myvgF{i}obAbtG_P1WxXyeGlp1}YF;u(__*v%*JX0n!?@gE456z5BTXpl+} P4N|?CpP7pVNqHy$kXs_` diff --git a/awx/lib/site-packages/pytz/zoneinfo/Europe/Kaliningrad b/awx/lib/site-packages/pytz/zoneinfo/Europe/Kaliningrad index 300a58c4e6efdfb52f78915bf4306d616e06866a..4805fe4251e090d867e228ce1efb92f6dbf62be7 100644 GIT binary patch delta 139 zcmeys-N!RQTu_jKfdPa;z#oVOH)_~0vV{0(7fk-i;>XA{*_}0kje$W%fkA5Wa#kZI rMuy2QOzJ4w0zld}*D%#Gu>)CPtv^`&F|<lD0%cJFm#b@tt`QdiMEn&8 delta 103 zcmeC<`M^CvTu^|4fdPa;zz>K8Hfq=~PUd6vn;grUFj<z#XmTKvI*KZPkgCm{OtnnN R%EUniAOkKp*AQJ}E&x*$4*&oF diff --git a/awx/lib/site-packages/pytz/zoneinfo/Europe/Lisbon b/awx/lib/site-packages/pytz/zoneinfo/Europe/Lisbon index 612f04fe61efc7f4636e7cd7e9deb9c3320ea729..b9aff3a51cae6888cbd0dce88d4f2d1ace1e88ae 100644 GIT binary patch delta 35 ocmew>^;c?wF{A88lRy^6<jHL;s~BZB8?qi`2Xpc#C-F)H0NSw&Q2+n{ delta 35 ocmew>^;c?wF{8jnlRy^6g2`<xs~80~8?qi`2Xpc#C-F)H0NMx(Q2+n{ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Europe/Mariehamn b/awx/lib/site-packages/pytz/zoneinfo/Europe/Mariehamn index 88a6ff42fada443f2a40eb3200123ff7f8ac62ea..29b3c817f4637e98623c5f76a6078f18157b5cfe 100644 GIT binary patch delta 79 zcmey$_myvgF{kwDbAbtG4m?fRXyeGlp2`3O;;EAr*v%*JX0n!?{T~RH6z5BWXpl+} P4N|?CpP7pVNqHy$jFTeE delta 79 zcmey$_myvgF{i}obAbtG_P1WxXyeGlp1}YF;u(__*v%*JX0n!?@gE456z5BTXpl+} P4N|?CpP7pVNqHy$kXs_` diff --git a/awx/lib/site-packages/pytz/zoneinfo/Europe/Minsk b/awx/lib/site-packages/pytz/zoneinfo/Europe/Minsk index fa1e2e4ef8e084da48d58d8d1b5b2f492654d826..28ef30a325b6bf018a9dbe68bc9f45cff080141b 100644 GIT binary patch delta 59 zcmX@bb%SeyGNao@6&XgB5Fgou$qtOJj2x3&88<SzZ#HMLWMXGvU;s<lGr9pKwzBlI L`38II8gl^v(C!YK delta 43 tcmcb?b&6|(GNbE86&c3KwJffayBIezx^1>$vSfmC``EeMTtjq?xd1K)44eP} diff --git a/awx/lib/site-packages/pytz/zoneinfo/Europe/Moscow b/awx/lib/site-packages/pytz/zoneinfo/Europe/Moscow index 63ff2abfab5654460716699364a4a5faf91ce02b..bdbbaebe05e0d7dba96718b6448ca13d9a6f7300 100644 GIT binary patch delta 437 zcmcb_{eydgxTydG0|N+yfFBTp*lG<xVs^aT@ws-ND(7jv`#JBsW#;^r@Sh8A<h)$S zAjY}TM}(0j#78z^ass1oA}0fbvL#Rlh-6`4Fl=Y!0J6(LZ2ReqJPZt41`L7>3>FTI zq6`df0gRFi3^ED~vZ&%(28@a@aSI28dXV19-K>(#zQMke<(VXz7#Sv8Fsa2NyW1aV zH`v`jK&}9S|3DD7?Z9ym4e|$w2Kfa<gZu-gfqnwfAb){qkl#Qw$bXx6GifpbJ;4C- WBLn?CDZvQ#1`@&L8|<xX%mo1Y-)F4= delta 396 zcmeyteTjR5xG6sa0|N+yfG-e(*h&pRVs^aTjk$K8X3W!iFEQ`CWyk!M2#EzZayb?< zh-qx}5n-JCm&G@VfkD{@sFp!lgMo#C!7zi71IUg5vF$4uc^DY93>X9%7%UtZMHv{} z0zjmU0)r%~xRwE<EKJ<O0j7TPYF5d~`b-j&J(<*Eksav=v<~dZA0Uf?;6D(AZ98xT zM1vd+qCpM^(ICfzX`lx{G{_Sm8srfW4f4$9GfbLHbn=ZD#K~}y%Qx6t*MtiIcoSaV diff --git a/awx/lib/site-packages/pytz/zoneinfo/Europe/Riga b/awx/lib/site-packages/pytz/zoneinfo/Europe/Riga index 38dfebd0115e8d286669057b23101699e00b7cf3..b729ee8c2ee26c7bd74535ead106e8160afdf181 100644 GIT binary patch delta 116 zcmdljxLa_7kx=`;`7M3_7Ie7PEjZouZ|(Ds_cpp@Gx08B00OZ^3@i)`Dw`(rbM#I2 nVz$<d`ws;3cDDZm(I9;w8l)FY1NDPwkQtlTF^8~V7_tTc;3GU- delta 116 zcmdljxLa_7kx&Q6{FZ)>1s!f33r;t4tbP9R#YUHGCf*qgKp-}QfrWuVWyNHEj=srW m%+{J2|AAoM&JGR`4blgqL3+V7P(O$UnX!2ta|jEDA!`6R1U8fa diff --git a/awx/lib/site-packages/pytz/zoneinfo/Europe/Samara b/awx/lib/site-packages/pytz/zoneinfo/Europe/Samara index d2fa9dfbc6c69f475a56df1840a5bd6d4557c499..79759f537744ca0f4edb212aa22a853f0a74aec1 100644 GIT binary patch delta 373 zcmX@W^@(eOxU3KZ0|N+yfD;gd*xC(1Vj+XtnvEusjJn)RJWRZNgdo2F9|MElm&sL( z+J+(w3|a;Z5+IUMhJiswfk6>0!q33q7Qm<qBP|>lSQr>A92iw6Utm;_^$m7m@D286 zaCHq10TLk$!H&K_78o#2{>>;mS)55i6{~xHKvXgO2Lh10H-|7uG7TPwb24xN{Su;U G!UX{SMl_TF delta 324 zcmeywb%1MvxU3)p0|N+yfD;gd*isEZVj+XtoQ)=ujJh05+)O;YgdiV3F9U-<%j7CX zZEa2l1}y^yeh|qBWXmXk*lq!gA~4dzfq{jA!NP%2WHLXi0(Y>ZZ*U0EN+6i*!zw%3 kkV#w>tGj+c6fyh<0+9PQ=Q2q$(cgg_TtF9x=$dc=06`Ze<p2Nx diff --git a/awx/lib/site-packages/pytz/zoneinfo/Europe/Simferopol b/awx/lib/site-packages/pytz/zoneinfo/Europe/Simferopol index 2abdcd3b70dcce4c7faed3ec5bed32de5d12e425..ebe9017d40aefd10045b205e5fc1db5329eaf678 100644 GIT binary patch delta 146 zcmX@a{eXLdxFA0R0|N+yfFBU^Z`810WC`(+O_-d(=*!44c`aiI3j>3e!Q}spMgojr nbr6CP$U!r}A7sGhbf!`!4j>C;2m=;V#L-RR@(uRZHRb{UMt&5V delta 114 zcmaFBeTaL4xF8<`0|N+yfG-g9ZPc(}ocxi+cd|We$YdTS1DGU80V5*=nifBhmdzzh WrA)|rL_vz70H}w{H`rU(gbM)E?ho?- diff --git a/awx/lib/site-packages/pytz/zoneinfo/Europe/Volgograd b/awx/lib/site-packages/pytz/zoneinfo/Europe/Volgograd index a103eaf80c544e3622f632eca4f2a1ebfba190ac..c62c32a653f1a542515aec6e2e6c1e78bac8b03b 100644 GIT binary patch delta 339 zcmaFBxs+>yxF|mZ0|N+yfD;gd*s>dSSQuGCd}I?Q8!$>~aC33<5Qe-wlM5LgJtP?z zEF2htq?Q2#m<=L9Y#-kchLB*#5Qg9oAQ9&86AUIp7<_}hL6!pnBM?9c28PM^7?rU* eZnGE@ClfnRIav;jrj`T2E`}0ZKtJdja{&OV044MQ delta 272 zcmZ3=^?-ANxF`<;0|N+yfFlrt*peG{SQs4{7@3$^Ss;*&9SS)(IXKxkxIh#k$Tqo? z#gScvfx*IoL1gj;MoFkOj6lG^IQc)LGIq;1n=^4TIZ)ej1)#rx0Ae|W4I#P0{Cz@n GO}GHhHWVBH diff --git a/awx/lib/site-packages/pytz/zoneinfo/Indian/Antananarivo b/awx/lib/site-packages/pytz/zoneinfo/Indian/Antananarivo index 33d59cc974aed5ebf3241db24af1c272281473ac..750d3dc14cabc52517d6be5d76da4080f213f4fc 100644 GIT binary patch literal 283 zcmWHE%1kq2zyPd35fBCe7+bgj$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lr<PQ7#P&nFz`Y|e0)O~TpdFgoS;N#2uLjygpgqW52&91Kmc+Fhz7X@M1$M| OqN(8~E}%nojky5IzB_vW literal 241 zcmWHE%1kq2zyK^j5fBCe7@M~N$eH;0?3YKz2M#=1z0-k#k%^gsL8k|#NXr1E&ccC_ x1H$(44PkI~1mWNipfn>RNKpt0mi+)}0D}KO0J0QBgDeKq<XFxHbdIhu7XXG<EcE~Y diff --git a/awx/lib/site-packages/pytz/zoneinfo/Indian/Comoro b/awx/lib/site-packages/pytz/zoneinfo/Indian/Comoro index 298db9b7dba0d867cd52fe939ebab148652ec904..750d3dc14cabc52517d6be5d76da4080f213f4fc 100644 GIT binary patch literal 283 zcmWHE%1kq2zyPd35fBCe7+bgj$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lr<PQ7#P&nFz`Y|e0)O~TpdFgoS;N#2uLjygpgqW52&91Kmc+Fhz7X@M1$M| OqN(8~E}%nojky5IzB_vW literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$eH;0;s*vs1_q4@ASo>a1{NRR5C&Jr5D=Fkgap%m UfORl1{09R3rg8y|*EQw>06qT}hX4Qo diff --git a/awx/lib/site-packages/pytz/zoneinfo/Indian/Mayotte b/awx/lib/site-packages/pytz/zoneinfo/Indian/Mayotte index c915d90973bfbbb9ad3c7169a80cdb4f9250eab9..750d3dc14cabc52517d6be5d76da4080f213f4fc 100644 GIT binary patch literal 283 zcmWHE%1kq2zyPd35fBCe7+bgj$l3Vr)}JkhW?eWw(f!6-{fAc=7@3$E85opWKq|Ei z7+4q>lr<PQ7#P&nFz`Y|e0)O~TpdFgoS;N#2uLjygpgqW52&91Kmc+Fhz7X@M1$M| OqN(8~E}%nojky5IzB_vW literal 171 zcmWHE%1kq2zyM4@5fBCe7@MO3$eH;0f&>F21A|ruNJ`6qfyKu+gu&G@1jJ<sA;GjC TU>yt$|A7F%sa!zgb&a_Irc@M( diff --git a/awx/lib/site-packages/pytz/zoneinfo/Jamaica b/awx/lib/site-packages/pytz/zoneinfo/Jamaica index 24ea5dc09ba72f032adfdb753605764f13105849..006689bc895854db5deb33a29ff5d99c6c205fc6 100644 GIT binary patch delta 21 acmey({F`}#2{U`I<V5q^AZoHG<1+wN4hK^J delta 21 acmey({F`}#2{VVn!HMR#LDXbX#%BOnGzZH7 diff --git a/awx/lib/site-packages/pytz/zoneinfo/Japan b/awx/lib/site-packages/pytz/zoneinfo/Japan index bb6352bcb9a584eb00ba003039bc1d7dc8c73342..024414031e18e6d8832336887b00a2220d4715fd 100644 GIT binary patch delta 114 zcmaFJ^q6UaHV1D50|Ue1Q0s}tHhi2640RJ27`%c*7`&W=C)QXh2>t-dg1~<uNIkTq r07RFZdkm&Qx~`^Z@`81-`1k^KL39EcE+GsIj3A95f(t0FYsm!w1Ii^^ delta 87 zcmaFN^pI(SHV01w0|Ue1bFCANZFo5t80sc4Fn9%rFgSZnthHnmn7Cb*2`G0hMS}+{ b$KvA~0+k2SE+GsIj6m&Rf(xik*OChWGKLiZ diff --git a/awx/lib/site-packages/pytz/zoneinfo/NZ-CHAT b/awx/lib/site-packages/pytz/zoneinfo/NZ-CHAT index f3a8e4d8a4ece885c9b35d74f0144cc7adbf8472..59bc4ede98742569455aaec33e361c8b2a63d692 100644 GIT binary patch delta 463 zcmeys-zhLbT$YuAfdPa;pb>~cY=H(Kap~5yJsVB_FxE4&Ffk7xG-YODU|9VJ=pu$S zE(|OT3<qNvxfmEW`+(RW(#JQ1!P&zx7)-i^0M#)vGEBb1B%_P$w<e%C*l#~TCIP{J ZAaLC7(gLDEe%&m~{F8ZzdiEf@J^-))GRXh{ delta 441 zcmeAa_`p9wT$Y7_fdPa;pb>~cY=H(K@x1#G%SMwwjP(r6j7$RvjhGl27*_uQx`^Rm z3?tBan|&C#Af%6P2!peSqYIb}4q;$m1S$oB3F4|)z4Zeu%fRp-2teN3tjqk9xqe{1 O$D~7w_a@(B*9QPU<0s1i diff --git a/awx/lib/site-packages/pytz/zoneinfo/PRC b/awx/lib/site-packages/pytz/zoneinfo/PRC index 02242f0d9cb9b904f80698a96f0103c4a1d50b72..dbd132f2b0bcc8beab08e04b182751795c853127 100644 GIT binary patch delta 66 zcmZ3?Jdb&TGOr*50|PS<^E3d7i6#!BOpIudfuZpF<QhhWiK{GF>dc%qCqA3X2og{S E07(`N1^@s6 delta 54 zcmbQoyqI}{vY-$H0|PS<^E3d74gY4%o@n4OIgwG6@#*ApMumw>Em**U52u0!)B%=- B5+DEo diff --git a/awx/lib/site-packages/pytz/zoneinfo/Pacific/Apia b/awx/lib/site-packages/pytz/zoneinfo/Pacific/Apia index 4ff1b93515b9400b3a09a86e3d46c61e1756170b..cc5d2cd2d44390a587c5198a4588c2dfdcbfd24d 100644 GIT binary patch delta 168 zcmX@hagJky6e9}@GYj+Njm#!yYzzz=8W<S<|Bq(?k#QajEdT!(CoppU|DPJbz{<d| z?E(V}1H+LAjJ!U+Aq?Tc!66L6E}J_TRhZz0_>pG_$TXJ_ptZ<=D?E6zA&U$E&EGC# delta 191 zcmX@dah79)6e9~W5Ki96Y+}aBz_6i#f#LuEcm@y|=fS}8|9@%#1Lyz$#R-hO3=Bse zfXHnZ7&v`=Ll}Y`fkb%l<_<;`Cb%J)<QW1o$Rz}5Ei&K=4-U~aGzQ7&_*&|j>KW)8 N>-d`J83Gw5TmVRtGjjj{ diff --git a/awx/lib/site-packages/pytz/zoneinfo/Pacific/Bougainville b/awx/lib/site-packages/pytz/zoneinfo/Pacific/Bougainville new file mode 100644 index 0000000000000000000000000000000000000000..219c78cd24de37ac2cc4f590043f8c1c630d4bab GIT binary patch literal 280 zcmWHE%1kq2zyK^j5fBCe7+bIb$T{O|mT*Zs=R?T6>kW)djLZxSogYAodKNISGBDIl zVBln6n6-g{H^A37gdxB^guyE~guw}jVITy%g+R?91Hga{$`<_r75EPXVcUW<Ky=aD zB@;k2$RQva<QR}Lkb@W)nV6Y?&YgGzBm#68kPUPg&`Cgt@q!&D=mT;WF2^x2Z~@(_ IYiP&?0IhvH^Z)<= literal 0 HcmV?d00001 diff --git a/awx/lib/site-packages/pytz/zoneinfo/Pacific/Chatham b/awx/lib/site-packages/pytz/zoneinfo/Pacific/Chatham index f3a8e4d8a4ece885c9b35d74f0144cc7adbf8472..59bc4ede98742569455aaec33e361c8b2a63d692 100644 GIT binary patch delta 463 zcmeys-zhLbT$YuAfdPa;pb>~cY=H(Kap~5yJsVB_FxE4&Ffk7xG-YODU|9VJ=pu$S zE(|OT3<qNvxfmEW`+(RW(#JQ1!P&zx7)-i^0M#)vGEBb1B%_P$w<e%C*l#~TCIP{J ZAaLC7(gLDEe%&m~{F8ZzdiEf@J^-))GRXh{ delta 441 zcmeAa_`p9wT$Y7_fdPa;pb>~cY=H(K@x1#G%SMwwjP(r6j7$RvjhGl27*_uQx`^Rm z3?tBan|&C#Af%6P2!peSqYIb}4q;$m1S$oB3F4|)z4Zeu%fRp-2teN3tjqk9xqe{1 O$D~7w_a@(B*9QPU<0s1i diff --git a/awx/lib/site-packages/pytz/zoneinfo/Pacific/Fiji b/awx/lib/site-packages/pytz/zoneinfo/Pacific/Fiji index d91c7e5da89de44bf5059988553c7ca9ad7fd197..b75f194e9eb7a32f3ef1cdb9aea1e4e45aabe1bc 100644 GIT binary patch literal 1074 zcmciAT}YE*7>Du4iXcfW3j{GbC^|`(%cY|aA_5PZTVgM=)a;g_GN&d(hFVq>6eM(1 z7=b4ReGm-#QV@a>LG%F`2tricClW*ugiuIP_w{txQ3O5XeSh0KcC!B!w5Gdj-5+PU zJ>lZ)wTt&9r|oui-Q7anu5zuLUy|tNh(xE~N^EVF#`2}o`1qs5v->o0?WG*7c%n^b z^3t?)Lz^?twfW8HY!G~qV5V1FBG07d`guuiSkUCzv>g8NR9jOqX?u5D+xJ(?kw@d& zv8hy!PWG#;-m0DFE=cF65>0jYN$SOC?P^F!*PYkev!zCQ#_wx-WtpTim$i3cQ8K|j z>3g+C`y-cRApb>=t<TBe#W@{ZOiFfOO0#o2Whik)haOZ)uKuCqCZjrBJ|V+n6*}^D zL`K`c>+$(EIkEe_j!o~8la&QMHL+3LvZ8-^Id`*Q|DKzgEn4B+t%6(C7!O>-fkWH^ zzOfVh#TMUw|HS>Y!zO%W7q4xD?BlhKke$4?6|xty8L}I)9kQR-Hbi#x+Lp+kUfUGe z)oa@#`+99-WM^b+WN&11WOrnHWPhXqqyw+Dfb`(CCXg<?)&|mt*BU`O@mecLFGw>; zH%L23KS)DJM_y|Q>B(zNAzgW`Eu=56HHLKNwbqc{kmiu?koJ)NkOuL8by#dkR)@D! VXH`5L4uwNCW~eq4*;c=!_!kUa7>57= literal 1078 zcmciAJ7`l;9LMpSS_f-YL`9H_;A7F)Hs%rwDk`Ew)95k1l-j24DIvBsK0*kkt%-_) z4x*EjkHt4A0i`I4L$IB!!x@C4bU1=Kw9rXWictUG<LD%UC*1qFNyw7lH|Q8R8uk7- z3*-|n&ThGQUUE)u*H=8L#CEK<vB^2zw9(g1&!=>JdDzCw%XG`@X`RULwFhs%)rZ!M zTXnvy)!coX%)YV74<jasKeoZklxf>?)wbOkR_%*(w*5k<Ix>^A9qC=FbHcZ&ed|=$ z=waQxA*6b)MYXP7YkCW-bnnc(Nw<F2>4}df6Me5UkH$=2-8b8J`JU<jIcW#7m&~!L z7d9K*RmWf5uqXVB>g3ImJ+-o5<%&Hv_qAE&Gew<$7gmM+-MTQkR1I$0qX%zoHbV>7 z>!DJu8U9?YM^dxq^!OKD+-XdyTxHMHJvC>qe6n6u=wDu*_n;#Gp7+dzsy**v#aq;p z2)qN$t=s~>krVvI7C(Of#G9AHCcI@Ar)-1l<CKk%ot&~2vKO)$vKz7;vY%5nM0Rw_ zmdKt?*%aB;Dcd6ZI%Q*IXJl(+Z)9_1cVv5Hf20AV1E;ir^x%{xkS?6k2GWO98bLZi zT0we2nnAij+Cln38bUg9N=ryjPH771$|-FjeL1Buq%)_qhV+IshjfRuhxCUui2tj@ e8cA|%WE*vc6OqRHXnmw1;>YA!9{q;xe$6jI`W03H diff --git a/awx/lib/site-packages/pytz/zoneinfo/Pacific/Pago_Pago b/awx/lib/site-packages/pytz/zoneinfo/Pacific/Pago_Pago index f776ed08e78421cb0a9cf6531e64f4c90815032f..1d7649ff71d07a158d69ab0d46a60f89c28683a3 100644 GIT binary patch literal 272 zcmWHE%1kq2zyPd35fBCe79a+(1sZ_FMAqLNzb=JtkkU3VU}Rzj%5AJ*VEF$({s)Lm z4PamalN?}@$HzB>!7n(3!3l_iffxZo2-^#Dg8<NIF!&Dyp(mbnfM}3AKs3lLAW4vW O7$|WN7tno%hFk#Jpg<)6 literal 312 zcmWHE%1kq2zyNGO5fBCeRv-qkMH_&`MAqLNw~|;aeq9RPAf;_!z{teR0#vZEf`Q@x z|M(vuGR}j6<^TWG00vGl$qOb0eSAY0f*pZ`UvLP66A%XjF)|1t>=Kx(M1l5z!G9nK iJ@KRiM1x!gqCu_$(I6Ls6oFjHKs{%20o`qA$OQlmkxvBx diff --git a/awx/lib/site-packages/pytz/zoneinfo/Pacific/Samoa b/awx/lib/site-packages/pytz/zoneinfo/Pacific/Samoa index f776ed08e78421cb0a9cf6531e64f4c90815032f..1d7649ff71d07a158d69ab0d46a60f89c28683a3 100644 GIT binary patch literal 272 zcmWHE%1kq2zyPd35fBCe79a+(1sZ_FMAqLNzb=JtkkU3VU}Rzj%5AJ*VEF$({s)Lm z4PamalN?}@$HzB>!7n(3!3l_iffxZo2-^#Dg8<NIF!&Dyp(mbnfM}3AKs3lLAW4vW O7$|WN7tno%hFk#Jpg<)6 literal 312 zcmWHE%1kq2zyNGO5fBCeRv-qkMH_&`MAqLNw~|;aeq9RPAf;_!z{teR0#vZEf`Q@x z|M(vuGR}j6<^TWG00vGl$qOb0eSAY0f*pZ`UvLP66A%XjF)|1t>=Kx(M1l5z!G9nK iJ@KRiM1x!gqCu_$(I6Ls6oFjHKs{%20o`qA$OQlmkxvBx diff --git a/awx/lib/site-packages/pytz/zoneinfo/Portugal b/awx/lib/site-packages/pytz/zoneinfo/Portugal index 612f04fe61efc7f4636e7cd7e9deb9c3320ea729..b9aff3a51cae6888cbd0dce88d4f2d1ace1e88ae 100644 GIT binary patch delta 35 ocmew>^;c?wF{A88lRy^6<jHL;s~BZB8?qi`2Xpc#C-F)H0NSw&Q2+n{ delta 35 ocmew>^;c?wF{8jnlRy^6g2`<xs~80~8?qi`2Xpc#C-F)H0NMx(Q2+n{ diff --git a/awx/lib/site-packages/pytz/zoneinfo/ROC b/awx/lib/site-packages/pytz/zoneinfo/ROC index b38563267733831d204789851e10478c365a6ea8..4810a0b61420871f7b2f39749e10fdf7244b76f7 100644 GIT binary patch delta 384 zcmaFIx`1thxFIV80|N+yfF=-w*rE+U;&7;E!=;eOhRfa64Og7jez@wY#Bj}L|A&bl zjk&iMHVB2>Ens9~VI~SPFciK38p%-5z`(-5P&a{r6GSrdf<**<d_x$#!h?YX5Ieg7 zF_1=p3F4v1j?@CmfF1b*s^mWql$`q@0ir>U2GJmggJ_WBK{Ut%AR6Qe5DoIk=1xXd X#!8@9K<0qF!$2SZZ~?uiYrzEoKF(j& delta 329 zcmZ3$_KtOexFItG0|N+yfF=-w*gOqD;^Oqn43`qC3NBZ&HC%C8`{8Po6~i^<hXoTo z8hvjCFbD;Ae_&!H5;8Cpz5p7@P&a{*g@K`<fq}!vH-y321&D(~ChIfGg(5pc3#bz8 zj2|F9K=2<3O3r<d0MQ_4foPD^Ks3mCAR6RE5DjuBhz2=z^CCu8#sr{aK>*}n1|r?d T$b{F$VDlIlxPXq=wcr8(I{#E{ diff --git a/awx/lib/site-packages/pytz/zoneinfo/ROK b/awx/lib/site-packages/pytz/zoneinfo/ROK index 0b94de84bfc0004b818e7d9196e3ea929ba2131a..fd91d5b729aaa78253bd439c36a103fe88ce33b2 100644 GIT binary patch literal 571 zcmWHE%1kq2zyRz(5fBCeaUce<MH_%b_w^4Ilb(tFI2>wSaLHNy!y|vq4^OhU|9C1a zk?|~vx#GE?&x;rO1r;xzf5~{oA5`(`__d7J?@cP+EZ>pw_PkidyY^WbA504?6c#5; zP|Qo8pw#R%LD|o90s|uxGYcat5@cZmLI#F%4xp_J<sA$_cHIO9AP-3Lf=QrA>kLLg z28NymjDkMCAq?KZAq-y5AOeWJT|z)Qkw6Fue*FQ}_a6vAeg@GXe}ia{-$69U{~#I^ z1|S*~4j>v779biF9v~VNCLkIVE?^oMHXs@lK42OcMj#p#P9Pc-Rv;P_ULYD2W*{0A dZXjoY!VW}(!Vg4)!VpB$D;&9i;jC-P1ptE4#?=4- literal 422 zcmWHE%1kq2zyRz(5fBCeULXdsc^ZI3>*TtM4gY#S>}c6i@yK8E!`p|G8s0T>e)wQo z(eQUE*AIooE(MBtwh2njY6Z%E@(GMgj7%)dER0O7K*+#Q&H*%op}d2Eg@K`N0)%7) ziWM|~*gXqCY>>E*ZwP~TFc7<hfHWY15W)`T11bkQ_y<(qe;~+gOQ`_SAP<0OkS9Pi z$Ri*c<QWhR@(_pyc?v{>JO-jco&y;N@*s!?c@ji}JPM*go@JoAZ@GYhplitm0Hw5X AUjP6A diff --git a/awx/lib/site-packages/pytz/zoneinfo/US/Samoa b/awx/lib/site-packages/pytz/zoneinfo/US/Samoa index f776ed08e78421cb0a9cf6531e64f4c90815032f..1d7649ff71d07a158d69ab0d46a60f89c28683a3 100644 GIT binary patch literal 272 zcmWHE%1kq2zyPd35fBCe79a+(1sZ_FMAqLNzb=JtkkU3VU}Rzj%5AJ*VEF$({s)Lm z4PamalN?}@$HzB>!7n(3!3l_iffxZo2-^#Dg8<NIF!&Dyp(mbnfM}3AKs3lLAW4vW O7$|WN7tno%hFk#Jpg<)6 literal 312 zcmWHE%1kq2zyNGO5fBCeRv-qkMH_&`MAqLNw~|;aeq9RPAf;_!z{teR0#vZEf`Q@x z|M(vuGR}j6<^TWG00vGl$qOb0eSAY0f*pZ`UvLP66A%XjF)|1t>=Kx(M1l5z!G9nK iJ@KRiM1x!gqCu_$(I6Ls6oFjHKs{%20o`qA$OQlmkxvBx diff --git a/awx/lib/site-packages/pytz/zoneinfo/W-SU b/awx/lib/site-packages/pytz/zoneinfo/W-SU index 63ff2abfab5654460716699364a4a5faf91ce02b..bdbbaebe05e0d7dba96718b6448ca13d9a6f7300 100644 GIT binary patch delta 437 zcmcb_{eydgxTydG0|N+yfFBTp*lG<xVs^aT@ws-ND(7jv`#JBsW#;^r@Sh8A<h)$S zAjY}TM}(0j#78z^ass1oA}0fbvL#Rlh-6`4Fl=Y!0J6(LZ2ReqJPZt41`L7>3>FTI zq6`df0gRFi3^ED~vZ&%(28@a@aSI28dXV19-K>(#zQMke<(VXz7#Sv8Fsa2NyW1aV zH`v`jK&}9S|3DD7?Z9ym4e|$w2Kfa<gZu-gfqnwfAb){qkl#Qw$bXx6GifpbJ;4C- WBLn?CDZvQ#1`@&L8|<xX%mo1Y-)F4= delta 396 zcmeyteTjR5xG6sa0|N+yfG-e(*h&pRVs^aTjk$K8X3W!iFEQ`CWyk!M2#EzZayb?< zh-qx}5n-JCm&G@VfkD{@sFp!lgMo#C!7zi71IUg5vF$4uc^DY93>X9%7%UtZMHv{} z0zjmU0)r%~xRwE<EKJ<O0j7TPYF5d~`b-j&J(<*Eksav=v<~dZA0Uf?;6D(AZ98xT zM1vd+qCpM^(ICfzX`lx{G{_Sm8srfW4f4$9GfbLHbn=ZD#K~}y%Qx6t*MtiIcoSaV diff --git a/awx/lib/site-packages/pytz/zoneinfo/iso3166.tab b/awx/lib/site-packages/pytz/zoneinfo/iso3166.tab index a1e4b42e44..0b0b8426d4 100644 --- a/awx/lib/site-packages/pytz/zoneinfo/iso3166.tab +++ b/awx/lib/site-packages/pytz/zoneinfo/iso3166.tab @@ -3,21 +3,21 @@ # This file is in the public domain, so clarified as of # 2009-05-17 by Arthur David Olson. # -# From Paul Eggert (2013-05-27): +# From Paul Eggert (2014-07-18): +# This file contains a table of two-letter country codes. Columns are +# separated by a single tab. Lines beginning with '#' are comments. +# Although all text currently uses ASCII encoding, this is planned to +# change to UTF-8 soon. The columns of the table are as follows: # -# This file contains a table with the following columns: # 1. ISO 3166-1 alpha-2 country code, current as of -# ISO 3166-1 Newsletter VI-15 (2013-05-10). See: Updates on ISO 3166 +# ISO 3166-1 Newsletter VI-16 (2013-07-11). See: Updates on ISO 3166 # http://www.iso.org/iso/home/standards/country_codes/updates_on_iso_3166.htm # 2. The usual English name for the coded region, # chosen so that alphabetic sorting of subsets produces helpful lists. # This is not the same as the English name in the ISO 3166 tables. # -# Columns are separated by a single tab. # The table is sorted by country code. # -# Lines beginning with `#' are comments. -# # This table is intended as an aid for users, to help them select time # zone data appropriate for their practical needs. It is not intended # to take or endorse any position on legal or territorial claims. diff --git a/awx/lib/site-packages/pytz/zoneinfo/zone.tab b/awx/lib/site-packages/pytz/zoneinfo/zone.tab index 923d6ac5be..a7373f177d 100644 --- a/awx/lib/site-packages/pytz/zoneinfo/zone.tab +++ b/awx/lib/site-packages/pytz/zoneinfo/zone.tab @@ -1,36 +1,24 @@ -# TZ zone descriptions +# tz zone descriptions (deprecated version) # # This file is in the public domain, so clarified as of # 2009-05-17 by Arthur David Olson. # -# From Paul Eggert (2013-08-14): +# From Paul Eggert (2014-07-31): +# This file is intended as a backward-compatibility aid for older programs. +# New programs should use zone1970.tab. This file is like zone1970.tab (see +# zone1970.tab's comments), but with the following additional restrictions: # -# This file contains a table where each row stands for an area that is -# the intersection of a region identified by a country code and of a -# zone where civil clocks have agreed since 1970. The columns of the -# table are as follows: +# 1. This file contains only ASCII characters. +# 2. The first data column contains exactly one country code. # -# 1. ISO 3166 2-character country code. See the file 'iso3166.tab'. -# 2. Latitude and longitude of the area's principal location -# in ISO 6709 sign-degrees-minutes-seconds format, -# either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS, -# first latitude (+ is north), then longitude (+ is east). -# 3. Zone name used in value of TZ environment variable. -# Please see the 'Theory' file for how zone names are chosen. -# If multiple zones overlap a country, each has a row in the -# table, with column 1 being duplicated. -# 4. Comments; present if and only if the country has multiple rows. -# -# Columns are separated by a single tab. -# The table is sorted first by country, then an order within the country that -# (1) makes some geographical sense, and -# (2) puts the most populous areas first, where that does not contradict (1). -# -# Lines beginning with '#' are comments. +# Because of (2), each row stands for an area that is the intersection +# of a region identified by a country code and of a zone where civil +# clocks have agreed since 1970; this is a narrower definition than +# that of zone1970.tab. # # This table is intended as an aid for users, to help them select time -# zone data appropriate for their practical needs. It is not intended -# to take or endorse any position on legal or territorial claims. +# zone data entries appropriate for their practical needs. It is not +# intended to take or endorse any position on legal or territorial claims. # #country- #code coordinates TZ comments @@ -49,7 +37,7 @@ AQ -6736+06253 Antarctica/Mawson Mawson Station, Holme Bay AQ -6835+07758 Antarctica/Davis Davis Station, Vestfold Hills AQ -6617+11031 Antarctica/Casey Casey Station, Bailey Peninsula AQ -7824+10654 Antarctica/Vostok Vostok Station, Lake Vostok -AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Station, Terre Adelie +AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Station, Adelie Land AQ -690022+0393524 Antarctica/Syowa Syowa Station, E Ongul I AQ -720041+0023206 Antarctica/Troll Troll Station, Queen Maud Land AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF) @@ -128,7 +116,7 @@ CA +4901-08816 America/Nipigon Eastern Time - Ontario & Quebec - places that did CA +4823-08915 America/Thunder_Bay Eastern Time - Thunder Bay, Ontario CA +6344-06828 America/Iqaluit Eastern Time - east Nunavut - most locations CA +6608-06544 America/Pangnirtung Eastern Time - Pangnirtung, Nunavut -CA +744144-0944945 America/Resolute Central Standard Time - Resolute, Nunavut +CA +744144-0944945 America/Resolute Central Time - Resolute, Nunavut CA +484531-0913718 America/Atikokan Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut CA +624900-0920459 America/Rankin_Inlet Central Time - central Nunavut CA +4953-09709 America/Winnipeg Central Time - Manitoba & west Ontario @@ -153,13 +141,10 @@ CH +4723+00832 Europe/Zurich CI +0519-00402 Africa/Abidjan CK -2114-15946 Pacific/Rarotonga CL -3327-07040 America/Santiago most locations -CL -2709-10926 Pacific/Easter Easter Island & Sala y Gomez +CL -2709-10926 Pacific/Easter Easter Island CM +0403+00942 Africa/Douala -CN +3114+12128 Asia/Shanghai east China - Beijing, Guangdong, Shanghai, etc. -CN +4545+12641 Asia/Harbin Heilongjiang (except Mohe), Jilin -CN +2934+10635 Asia/Chongqing central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc. -CN +4348+08735 Asia/Urumqi most of Tibet & Xinjiang -CN +3929+07559 Asia/Kashgar west Tibet & Xinjiang +CN +3114+12128 Asia/Shanghai Beijing Time +CN +4348+08735 Asia/Urumqi Xinjiang Time CO +0436-07405 America/Bogota CR +0956-08405 America/Costa_Rica CU +2308-08222 America/Havana @@ -322,7 +307,8 @@ PE -1203-07703 America/Lima PF -1732-14934 Pacific/Tahiti Society Islands PF -0900-13930 Pacific/Marquesas Marquesas Islands PF -2308-13457 Pacific/Gambier Gambier Islands -PG -0930+14710 Pacific/Port_Moresby +PG -0930+14710 Pacific/Port_Moresby most locations +PG -0613+15534 Pacific/Bougainville Bougainville PH +1435+12100 Asia/Manila PK +2452+06703 Asia/Karachi PL +5215+02100 Europe/Warsaw @@ -341,24 +327,26 @@ RE -2052+05528 Indian/Reunion RO +4426+02606 Europe/Bucharest RS +4450+02030 Europe/Belgrade RU +5443+02030 Europe/Kaliningrad Moscow-01 - Kaliningrad -RU +5545+03735 Europe/Moscow Moscow+00 - west Russia -RU +4844+04425 Europe/Volgograd Moscow+00 - Caspian Sea -RU +5312+05009 Europe/Samara Moscow+00 - Samara, Udmurtia +RU +554521+0373704 Europe/Moscow Moscow+00 - west Russia RU +4457+03406 Europe/Simferopol Moscow+00 - Crimea +RU +4844+04425 Europe/Volgograd Moscow+00 - Caspian Sea +RU +5312+05009 Europe/Samara Moscow+00 (Moscow+01 after 2014-10-26) - Samara, Udmurtia RU +5651+06036 Asia/Yekaterinburg Moscow+02 - Urals RU +5500+07324 Asia/Omsk Moscow+03 - west Siberia RU +5502+08255 Asia/Novosibirsk Moscow+03 - Novosibirsk -RU +5345+08707 Asia/Novokuznetsk Moscow+03 - Novokuznetsk +RU +5345+08707 Asia/Novokuznetsk Moscow+03 (Moscow+04 after 2014-10-26) - Kemerovo RU +5601+09250 Asia/Krasnoyarsk Moscow+04 - Yenisei River RU +5216+10420 Asia/Irkutsk Moscow+05 - Lake Baikal +RU +5203+11328 Asia/Chita Moscow+06 (Moscow+05 after 2014-10-26) - Zabaykalsky RU +6200+12940 Asia/Yakutsk Moscow+06 - Lena River RU +623923+1353314 Asia/Khandyga Moscow+06 - Tomponsky, Ust-Maysky RU +4310+13156 Asia/Vladivostok Moscow+07 - Amur River RU +4658+14242 Asia/Sakhalin Moscow+07 - Sakhalin Island RU +643337+1431336 Asia/Ust-Nera Moscow+07 - Oymyakonsky -RU +5934+15048 Asia/Magadan Moscow+08 - Magadan -RU +5301+15839 Asia/Kamchatka Moscow+08 - Kamchatka -RU +6445+17729 Asia/Anadyr Moscow+08 - Bering Sea +RU +5934+15048 Asia/Magadan Moscow+08 (Moscow+07 after 2014-10-26) - Magadan +RU +6728+15343 Asia/Srednekolymsk Moscow+08 - E Sakha, N Kuril Is +RU +5301+15839 Asia/Kamchatka Moscow+08 (Moscow+09 after 2014-10-26) - Kamchatka +RU +6445+17729 Asia/Anadyr Moscow+08 (Moscow+09 after 2014-10-26) - Bering Sea RW -0157+03004 Africa/Kigali SA +2438+04643 Asia/Riyadh SB -0932+16012 Pacific/Guadalcanal @@ -425,13 +413,13 @@ US +394421-1045903 America/Denver Mountain Time US +433649-1161209 America/Boise Mountain Time - south Idaho & east Oregon US +332654-1120424 America/Phoenix Mountain Standard Time - Arizona (except Navajo) US +340308-1181434 America/Los_Angeles Pacific Time +US +550737-1313435 America/Metlakatla Pacific Standard Time - Annette Island, Alaska US +611305-1495401 America/Anchorage Alaska Time US +581807-1342511 America/Juneau Alaska Time - Alaska panhandle US +571035-1351807 America/Sitka Alaska Time - southeast Alaska panhandle US +593249-1394338 America/Yakutat Alaska Time - Alaska panhandle neck US +643004-1652423 America/Nome Alaska Time - west Alaska US +515248-1763929 America/Adak Aleutian Islands -US +550737-1313435 America/Metlakatla Metlakatla Time - Annette Island US +211825-1575130 Pacific/Honolulu Hawaii UY -3453-05611 America/Montevideo UZ +3940+06648 Asia/Samarkand west Uzbekistan diff --git a/awx/lib/site-packages/pytz/zoneinfo/zone1970.tab b/awx/lib/site-packages/pytz/zoneinfo/zone1970.tab new file mode 100644 index 0000000000..e971bc7f5a --- /dev/null +++ b/awx/lib/site-packages/pytz/zoneinfo/zone1970.tab @@ -0,0 +1,371 @@ +# tz zone descriptions +# +# This file is in the public domain. +# +# From Paul Eggert (2014-07-31): +# This file contains a table where each row stands for a zone where +# civil time stamps have agreed since 1970. Columns are separated by +# a single tab. Lines beginning with '#' are comments. All text uses +# UTF-8 encoding. The columns of the table are as follows: +# +# 1. The countries that overlap the zone, as a comma-separated list +# of ISO 3166 2-character country codes. See the file 'iso3166.tab'. +# 2. Latitude and longitude of the zone's principal location +# in ISO 6709 sign-degrees-minutes-seconds format, +# either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS, +# first latitude (+ is north), then longitude (+ is east). +# 3. Zone name used in value of TZ environment variable. +# Please see the 'Theory' file for how zone names are chosen. +# If multiple zones overlap a country, each has a row in the +# table, with each column 1 containing the country code. +# 4. Comments; present if and only if a country has multiple zones. +# +# If a zone covers multiple countries, the most-populous city is used, +# and that country is listed first in column 1; any other countries +# are listed alphabetically by country code. The table is sorted +# first by country code, then (if possible) by an order within the +# country that (1) makes some geographical sense, and (2) puts the +# most populous zones first, where that does not contradict (1). +# +# This table is intended as an aid for users, to help them select time +# zone data entries appropriate for their practical needs. It is not +# intended to take or endorse any position on legal or territorial claims. +# +#country- +#codes coordinates TZ comments +AD +4230+00131 Europe/Andorra +AE,OM +2518+05518 Asia/Dubai +AF +3431+06912 Asia/Kabul +AL +4120+01950 Europe/Tirane +AM +4011+04430 Asia/Yerevan +AQ -6734-06808 Antarctica/Rothera Rothera Station, Adelaide Island +AQ -6448-06406 Antarctica/Palmer Palmer Station, Anvers Island +AQ -6736+06253 Antarctica/Mawson Mawson Station, Holme Bay +AQ -6835+07758 Antarctica/Davis Davis Station, Vestfold Hills +AQ -6617+11031 Antarctica/Casey Casey Station, Bailey Peninsula +AQ -7824+10654 Antarctica/Vostok Vostok Station, Lake Vostok +AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Station, Adélie Land +AQ -690022+0393524 Antarctica/Syowa Syowa Station, E Ongul I +AQ -720041+0023206 Antarctica/Troll Troll Station, Queen Maud Land +AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF) +AR -3124-06411 America/Argentina/Cordoba most locations (CB, CC, CN, ER, FM, MN, SE, SF) +AR -2447-06525 America/Argentina/Salta (SA, LP, NQ, RN) +AR -2411-06518 America/Argentina/Jujuy Jujuy (JY) +AR -2649-06513 America/Argentina/Tucuman Tucumán (TM) +AR -2828-06547 America/Argentina/Catamarca Catamarca (CT), Chubut (CH) +AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR) +AR -3132-06831 America/Argentina/San_Juan San Juan (SJ) +AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ) +AR -3319-06621 America/Argentina/San_Luis San Luis (SL) +AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC) +AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF) +AS,UM -1416-17042 Pacific/Pago_Pago Samoa, Midway +AT +4813+01620 Europe/Vienna +AU -3133+15905 Australia/Lord_Howe Lord Howe Island +AU -5430+15857 Antarctica/Macquarie Macquarie Island +AU -4253+14719 Australia/Hobart Tasmania - most locations +AU -3956+14352 Australia/Currie Tasmania - King Island +AU -3749+14458 Australia/Melbourne Victoria +AU -3352+15113 Australia/Sydney New South Wales - most locations +AU -3157+14127 Australia/Broken_Hill New South Wales - Yancowinna +AU -2728+15302 Australia/Brisbane Queensland - most locations +AU -2016+14900 Australia/Lindeman Queensland - Holiday Islands +AU -3455+13835 Australia/Adelaide South Australia +AU -1228+13050 Australia/Darwin Northern Territory +AU -3157+11551 Australia/Perth Western Australia - most locations +AU -3143+12852 Australia/Eucla Western Australia - Eucla area +AZ +4023+04951 Asia/Baku +BB +1306-05937 America/Barbados +BD +2343+09025 Asia/Dhaka +BE +5050+00420 Europe/Brussels +BG +4241+02319 Europe/Sofia +BM +3217-06446 Atlantic/Bermuda +BN +0456+11455 Asia/Brunei +BO -1630-06809 America/La_Paz +BR -0351-03225 America/Noronha Atlantic islands +BR -0127-04829 America/Belem Amapá, E Pará +BR -0343-03830 America/Fortaleza NE Brazil (MA, PI, CE, RN, PB) +BR -0803-03454 America/Recife Pernambuco +BR -0712-04812 America/Araguaina Tocantins +BR -0940-03543 America/Maceio Alagoas, Sergipe +BR -1259-03831 America/Bahia Bahia +BR -2332-04637 America/Sao_Paulo S & SE Brazil (GO, DF, MG, ES, RJ, SP, PR, SC, RS) +BR -2027-05437 America/Campo_Grande Mato Grosso do Sul +BR -1535-05605 America/Cuiaba Mato Grosso +BR -0226-05452 America/Santarem W Pará +BR -0846-06354 America/Porto_Velho Rondônia +BR +0249-06040 America/Boa_Vista Roraima +BR -0308-06001 America/Manaus E Amazonas +BR -0640-06952 America/Eirunepe W Amazonas +BR -0958-06748 America/Rio_Branco Acre +BS +2505-07721 America/Nassau +BT +2728+08939 Asia/Thimphu +BY +5354+02734 Europe/Minsk +BZ +1730-08812 America/Belize +CA +4734-05243 America/St_Johns Newfoundland Time, including SE Labrador +CA +4439-06336 America/Halifax Atlantic Time - Nova Scotia (most places), PEI +CA +4612-05957 America/Glace_Bay Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971 +CA +4606-06447 America/Moncton Atlantic Time - New Brunswick +CA +5320-06025 America/Goose_Bay Atlantic Time - Labrador - most locations +CA +5125-05707 America/Blanc-Sablon Atlantic Standard Time - Quebec - Lower North Shore +CA +4339-07923 America/Toronto Eastern Time - Ontario & Quebec - most locations +CA +4901-08816 America/Nipigon Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973 +CA +4823-08915 America/Thunder_Bay Eastern Time - Thunder Bay, Ontario +CA +6344-06828 America/Iqaluit Eastern Time - east Nunavut - most locations +CA +6608-06544 America/Pangnirtung Eastern Time - Pangnirtung, Nunavut +CA +744144-0944945 America/Resolute Central Time - Resolute, Nunavut +CA +484531-0913718 America/Atikokan Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut +CA +624900-0920459 America/Rankin_Inlet Central Time - central Nunavut +CA +4953-09709 America/Winnipeg Central Time - Manitoba & west Ontario +CA +4843-09434 America/Rainy_River Central Time - Rainy River & Fort Frances, Ontario +CA +5024-10439 America/Regina Central Standard Time - Saskatchewan - most locations +CA +5017-10750 America/Swift_Current Central Standard Time - Saskatchewan - midwest +CA +5333-11328 America/Edmonton Mountain Time - Alberta, east British Columbia & west Saskatchewan +CA +690650-1050310 America/Cambridge_Bay Mountain Time - west Nunavut +CA +6227-11421 America/Yellowknife Mountain Time - central Northwest Territories +CA +682059-1334300 America/Inuvik Mountain Time - west Northwest Territories +CA +4906-11631 America/Creston Mountain Standard Time - Creston, British Columbia +CA +5946-12014 America/Dawson_Creek Mountain Standard Time - Dawson Creek & Fort Saint John, British Columbia +CA +4916-12307 America/Vancouver Pacific Time - west British Columbia +CA +6043-13503 America/Whitehorse Pacific Time - south Yukon +CA +6404-13925 America/Dawson Pacific Time - north Yukon +CC -1210+09655 Indian/Cocos +CH,DE,LI +4723+00832 Europe/Zurich Swiss time +CI,BF,GM,GN,ML,MR,SH,SL,SN,ST,TG +0519-00402 Africa/Abidjan +CK -2114-15946 Pacific/Rarotonga +CL -3327-07040 America/Santiago most locations +CL -2709-10926 Pacific/Easter Easter Island +CN +3114+12128 Asia/Shanghai Beijing Time +CN +4348+08735 Asia/Urumqi Xinjiang Time +CO +0436-07405 America/Bogota +CR +0956-08405 America/Costa_Rica +CU +2308-08222 America/Havana +CV +1455-02331 Atlantic/Cape_Verde +CW,AW,BQ,SX +1211-06900 America/Curacao +CX -1025+10543 Indian/Christmas +CY +3510+03322 Asia/Nicosia +CZ,SK +5005+01426 Europe/Prague +DE +5230+01322 Europe/Berlin Berlin time +DK +5540+01235 Europe/Copenhagen +DO +1828-06954 America/Santo_Domingo +DZ +3647+00303 Africa/Algiers +EC -0210-07950 America/Guayaquil mainland +EC -0054-08936 Pacific/Galapagos Galápagos Islands +EE +5925+02445 Europe/Tallinn +EG +3003+03115 Africa/Cairo +EH +2709-01312 Africa/El_Aaiun +ES +4024-00341 Europe/Madrid mainland +ES +3553-00519 Africa/Ceuta Ceuta & Melilla +ES +2806-01524 Atlantic/Canary Canary Islands +FI,AX +6010+02458 Europe/Helsinki +FJ -1808+17825 Pacific/Fiji +FK -5142-05751 Atlantic/Stanley +FM +0725+15147 Pacific/Chuuk Chuuk (Truk) and Yap +FM +0658+15813 Pacific/Pohnpei Pohnpei (Ponape) +FM +0519+16259 Pacific/Kosrae Kosrae +FO +6201-00646 Atlantic/Faroe +FR +4852+00220 Europe/Paris +GB,GG,IM,JE +513030-0000731 Europe/London +GE +4143+04449 Asia/Tbilisi +GF +0456-05220 America/Cayenne +GH +0533-00013 Africa/Accra +GI +3608-00521 Europe/Gibraltar +GL +6411-05144 America/Godthab most locations +GL +7646-01840 America/Danmarkshavn east coast, north of Scoresbysund +GL +7029-02158 America/Scoresbysund Scoresbysund / Ittoqqortoormiit +GL +7634-06847 America/Thule Thule / Pituffik +GR +3758+02343 Europe/Athens +GS -5416-03632 Atlantic/South_Georgia +GT +1438-09031 America/Guatemala +GU,MP +1328+14445 Pacific/Guam +GW +1151-01535 Africa/Bissau +GY +0648-05810 America/Guyana +HK +2217+11409 Asia/Hong_Kong +HN +1406-08713 America/Tegucigalpa +HT +1832-07220 America/Port-au-Prince +HU +4730+01905 Europe/Budapest +ID -0610+10648 Asia/Jakarta Java & Sumatra +ID -0002+10920 Asia/Pontianak west & central Borneo +ID -0507+11924 Asia/Makassar east & south Borneo, Sulawesi (Celebes), Bali, Nusa Tengarra, west Timor +ID -0232+14042 Asia/Jayapura west New Guinea (Irian Jaya) & Malukus (Moluccas) +IE +5320-00615 Europe/Dublin +IL +314650+0351326 Asia/Jerusalem +IN +2232+08822 Asia/Kolkata +IO -0720+07225 Indian/Chagos +IQ +3321+04425 Asia/Baghdad +IR +3540+05126 Asia/Tehran +IS +6409-02151 Atlantic/Reykjavik +IT,SM,VA +4154+01229 Europe/Rome +JM +175805-0764736 America/Jamaica +JO +3157+03556 Asia/Amman +JP +353916+1394441 Asia/Tokyo +KE,DJ,ER,ET,KM,MG,SO,TZ,UG,YT -0117+03649 Africa/Nairobi +KG +4254+07436 Asia/Bishkek +KI +0125+17300 Pacific/Tarawa Gilbert Islands +KI -0308-17105 Pacific/Enderbury Phoenix Islands +KI +0152-15720 Pacific/Kiritimati Line Islands +KP +3901+12545 Asia/Pyongyang +KR +3733+12658 Asia/Seoul +KZ +4315+07657 Asia/Almaty most locations +KZ +4448+06528 Asia/Qyzylorda Qyzylorda (Kyzylorda, Kzyl-Orda) +KZ +5017+05710 Asia/Aqtobe Aqtobe (Aktobe) +KZ +4431+05016 Asia/Aqtau Atyrau (Atirau, Gur'yev), Mangghystau (Mankistau) +KZ +5113+05121 Asia/Oral West Kazakhstan +LB +3353+03530 Asia/Beirut +LK +0656+07951 Asia/Colombo +LR +0618-01047 Africa/Monrovia +LT +5441+02519 Europe/Vilnius +LU +4936+00609 Europe/Luxembourg +LV +5657+02406 Europe/Riga +LY +3254+01311 Africa/Tripoli +MA +3339-00735 Africa/Casablanca +MC +4342+00723 Europe/Monaco +MD +4700+02850 Europe/Chisinau +MH +0709+17112 Pacific/Majuro most locations +MH +0905+16720 Pacific/Kwajalein Kwajalein +MM +1647+09610 Asia/Rangoon +MN +4755+10653 Asia/Ulaanbaatar most locations +MN +4801+09139 Asia/Hovd Bayan-Ölgii, Govi-Altai, Hovd, Uvs, Zavkhan +MN +4804+11430 Asia/Choibalsan Dornod, Sükhbaatar +MO +2214+11335 Asia/Macau +MQ +1436-06105 America/Martinique +MT +3554+01431 Europe/Malta +MU -2010+05730 Indian/Mauritius +MV +0410+07330 Indian/Maldives +MX +1924-09909 America/Mexico_City Central Time - most locations +MX +2105-08646 America/Cancun Central Time - Quintana Roo +MX +2058-08937 America/Merida Central Time - Campeche, Yucatán +MX +2540-10019 America/Monterrey Mexican Central Time - Coahuila, Durango, Nuevo León, Tamaulipas away from US border +MX +2550-09730 America/Matamoros US Central Time - Coahuila, Durango, Nuevo León, Tamaulipas near US border +MX +2313-10625 America/Mazatlan Mountain Time - S Baja, Nayarit, Sinaloa +MX +2838-10605 America/Chihuahua Mexican Mountain Time - Chihuahua away from US border +MX +2934-10425 America/Ojinaga US Mountain Time - Chihuahua near US border +MX +2904-11058 America/Hermosillo Mountain Standard Time - Sonora +MX +3232-11701 America/Tijuana US Pacific Time - Baja California near US border +MX +3018-11452 America/Santa_Isabel Mexican Pacific Time - Baja California away from US border +MX +2048-10515 America/Bahia_Banderas Mexican Central Time - Bahía de Banderas +MY +0310+10142 Asia/Kuala_Lumpur peninsular Malaysia +MY +0133+11020 Asia/Kuching Sabah & Sarawak +MZ,BI,BW,CD,MW,RW,ZM,ZW -2558+03235 Africa/Maputo Central Africa Time (UTC+2) +NA -2234+01706 Africa/Windhoek +NC -2216+16627 Pacific/Noumea +NF -2903+16758 Pacific/Norfolk +NG,AO,BJ,CD,CF,CG,CM,GA,GQ,NE +0627+00324 Africa/Lagos West Africa Time (UTC+1) +NI +1209-08617 America/Managua +NL +5222+00454 Europe/Amsterdam +NO,SJ +5955+01045 Europe/Oslo +NP +2743+08519 Asia/Kathmandu +NR -0031+16655 Pacific/Nauru +NU -1901-16955 Pacific/Niue +NZ,AQ -3652+17446 Pacific/Auckland New Zealand time +NZ -4357-17633 Pacific/Chatham Chatham Islands +PA,KY +0858-07932 America/Panama +PE -1203-07703 America/Lima +PF -1732-14934 Pacific/Tahiti Society Islands +PF -0900-13930 Pacific/Marquesas Marquesas Islands +PF -2308-13457 Pacific/Gambier Gambier Islands +PG -0930+14710 Pacific/Port_Moresby most locations +PG -0613+15534 Pacific/Bougainville Bougainville +PH +1435+12100 Asia/Manila +PK +2452+06703 Asia/Karachi +PL +5215+02100 Europe/Warsaw +PM +4703-05620 America/Miquelon +PN -2504-13005 Pacific/Pitcairn +PR +182806-0660622 America/Puerto_Rico +PS +3130+03428 Asia/Gaza Gaza Strip +PS +313200+0350542 Asia/Hebron West Bank +PT +3843-00908 Europe/Lisbon mainland +PT +3238-01654 Atlantic/Madeira Madeira Islands +PT +3744-02540 Atlantic/Azores Azores +PW +0720+13429 Pacific/Palau +PY -2516-05740 America/Asuncion +QA,BH +2517+05132 Asia/Qatar +RE,TF -2052+05528 Indian/Reunion Réunion, Crozet Is, Scattered Is +RO +4426+02606 Europe/Bucharest +RS,BA,HR,ME,MK,SI +4450+02030 Europe/Belgrade +RU +5443+02030 Europe/Kaliningrad Moscow-01 - Kaliningrad +RU +554521+0373704 Europe/Moscow Moscow+00 - west Russia +RU +4457+03406 Europe/Simferopol Moscow+00 - Crimea +RU +4844+04425 Europe/Volgograd Moscow+00 - Caspian Sea +RU +5312+05009 Europe/Samara Moscow+00 (Moscow+01 after 2014-10-26) - Samara, Udmurtia +RU +5651+06036 Asia/Yekaterinburg Moscow+02 - Urals +RU +5500+07324 Asia/Omsk Moscow+03 - west Siberia +RU +5502+08255 Asia/Novosibirsk Moscow+03 - Novosibirsk +RU +5345+08707 Asia/Novokuznetsk Moscow+03 (Moscow+04 after 2014-10-26) - Kemerovo +RU +5601+09250 Asia/Krasnoyarsk Moscow+04 - Yenisei River +RU +5216+10420 Asia/Irkutsk Moscow+05 - Lake Baikal +RU +5203+11328 Asia/Chita Moscow+06 (Moscow+05 after 2014-10-26) - Zabaykalsky +RU +6200+12940 Asia/Yakutsk Moscow+06 - Lena River +RU +623923+1353314 Asia/Khandyga Moscow+06 - Tomponsky, Ust-Maysky +RU +4310+13156 Asia/Vladivostok Moscow+07 - Amur River +RU +4658+14242 Asia/Sakhalin Moscow+07 - Sakhalin Island +RU +643337+1431336 Asia/Ust-Nera Moscow+07 - Oymyakonsky +RU +5934+15048 Asia/Magadan Moscow+08 (Moscow+07 after 2014-10-26) - Magadan +RU +6728+15343 Asia/Srednekolymsk Moscow+08 - E Sakha, N Kuril Is +RU +5301+15839 Asia/Kamchatka Moscow+08 (Moscow+09 after 2014-10-26) - Kamchatka +RU +6445+17729 Asia/Anadyr Moscow+08 (Moscow+09 after 2014-10-26) - Bering Sea +SA,KW,YE +2438+04643 Asia/Riyadh +SB -0932+16012 Pacific/Guadalcanal +SC -0440+05528 Indian/Mahe +SD,SS +1536+03232 Africa/Khartoum +SE +5920+01803 Europe/Stockholm +SG +0117+10351 Asia/Singapore +SR +0550-05510 America/Paramaribo +SV +1342-08912 America/El_Salvador +SY +3330+03618 Asia/Damascus +TC +2128-07108 America/Grand_Turk +TD +1207+01503 Africa/Ndjamena +TF -492110+0701303 Indian/Kerguelen Kerguelen, St Paul I, Amsterdam I +TH,KH,LA,VN +1345+10031 Asia/Bangkok most of Indochina +TJ +3835+06848 Asia/Dushanbe +TK -0922-17114 Pacific/Fakaofo +TL -0833+12535 Asia/Dili +TM +3757+05823 Asia/Ashgabat +TN +3648+01011 Africa/Tunis +TO -2110-17510 Pacific/Tongatapu +TR +4101+02858 Europe/Istanbul +TT,AG,AI,BL,DM,GD,GP,KN,LC,MF,MS,VC,VG,VI +1039-06131 America/Port_of_Spain +TV -0831+17913 Pacific/Funafuti +TW +2503+12130 Asia/Taipei +UA +5026+03031 Europe/Kiev most locations +UA +4837+02218 Europe/Uzhgorod Ruthenia +UA +4750+03510 Europe/Zaporozhye Zaporozh'ye, E Lugansk / Zaporizhia, E Luhansk +UM +1917+16637 Pacific/Wake Wake Island +US +404251-0740023 America/New_York Eastern Time +US +421953-0830245 America/Detroit Eastern Time - Michigan - most locations +US +381515-0854534 America/Kentucky/Louisville Eastern Time - Kentucky - Louisville area +US +364947-0845057 America/Kentucky/Monticello Eastern Time - Kentucky - Wayne County +US +394606-0860929 America/Indiana/Indianapolis Eastern Time - Indiana - most locations +US +384038-0873143 America/Indiana/Vincennes Eastern Time - Indiana - Daviess, Dubois, Knox & Martin Counties +US +410305-0863611 America/Indiana/Winamac Eastern Time - Indiana - Pulaski County +US +382232-0862041 America/Indiana/Marengo Eastern Time - Indiana - Crawford County +US +382931-0871643 America/Indiana/Petersburg Eastern Time - Indiana - Pike County +US +384452-0850402 America/Indiana/Vevay Eastern Time - Indiana - Switzerland County +US +415100-0873900 America/Chicago Central Time +US +375711-0864541 America/Indiana/Tell_City Central Time - Indiana - Perry County +US +411745-0863730 America/Indiana/Knox Central Time - Indiana - Starke County +US +450628-0873651 America/Menominee Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties +US +470659-1011757 America/North_Dakota/Center Central Time - North Dakota - Oliver County +US +465042-1012439 America/North_Dakota/New_Salem Central Time - North Dakota - Morton County (except Mandan area) +US +471551-1014640 America/North_Dakota/Beulah Central Time - North Dakota - Mercer County +US +394421-1045903 America/Denver Mountain Time +US +433649-1161209 America/Boise Mountain Time - south Idaho & east Oregon +US +332654-1120424 America/Phoenix Mountain Standard Time - Arizona (except Navajo) +US +340308-1181434 America/Los_Angeles Pacific Time +US +550737-1313435 America/Metlakatla Pacific Standard Time - Annette Island, Alaska +US +611305-1495401 America/Anchorage Alaska Time +US +581807-1342511 America/Juneau Alaska Time - Alaska panhandle +US +571035-1351807 America/Sitka Alaska Time - southeast Alaska panhandle +US +593249-1394338 America/Yakutat Alaska Time - Alaska panhandle neck +US +643004-1652423 America/Nome Alaska Time - west Alaska +US +515248-1763929 America/Adak Aleutian Islands +US,UM +211825-1575130 Pacific/Honolulu Hawaii time +UY -3453-05611 America/Montevideo +UZ +3940+06648 Asia/Samarkand west Uzbekistan +UZ +4120+06918 Asia/Tashkent east Uzbekistan +VE +1030-06656 America/Caracas +VN +1045+10640 Asia/Ho_Chi_Minh south Vietnam +VU -1740+16825 Pacific/Efate +WF -1318-17610 Pacific/Wallis +WS -1350-17144 Pacific/Apia +ZA,LS,SZ -2615+02800 Africa/Johannesburg From 9f5f7950975da66792dfd76c61b807e9454042a8 Mon Sep 17 00:00:00 2001 From: Matthew Jones <mat@matburt.net> Date: Thu, 29 Jan 2015 12:33:43 -0500 Subject: [PATCH 04/10] Update README indicating pytz version number --- awx/lib/site-packages/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx/lib/site-packages/README b/awx/lib/site-packages/README index 65613ba7e2..414ae5ff7b 100644 --- a/awx/lib/site-packages/README +++ b/awx/lib/site-packages/README @@ -48,7 +48,7 @@ pyrax==1.9.0 (pyrax/*) python-dateutil==2.2 (dateutil/*) python-novaclient==2.18.1 (novaclient/*, excluded bin/nova) python-swiftclient==2.2.0 (swiftclient/*, excluded bin/swift) -pytz==2014.4 (pytz/*) +pytz==2014.10 (pytz/*) rackspace-auth-openstack==1.3 (rackspace_auth_openstack/*) rackspace-novaclient==1.4 (no files) rax-default-network-flags-python-novaclient-ext==0.2.3 (rax_default_network_flags_python_novaclient_ext/*) From 32b614fcc4f773d943d6a19cb5e74ece6084ee9d Mon Sep 17 00:00:00 2001 From: Matthew Jones <mat@matburt.net> Date: Thu, 29 Jan 2015 12:37:56 -0500 Subject: [PATCH 05/10] Upgrade requests to 2.5.1 --- awx/lib/site-packages/README | 2 +- awx/lib/site-packages/requests/__init__.py | 8 +- awx/lib/site-packages/requests/adapters.py | 111 ++- awx/lib/site-packages/requests/api.py | 21 +- awx/lib/site-packages/requests/auth.py | 26 +- awx/lib/site-packages/requests/certs.py | 13 +- awx/lib/site-packages/requests/compat.py | 6 +- awx/lib/site-packages/requests/exceptions.py | 26 +- awx/lib/site-packages/requests/models.py | 100 +- .../requests/packages/charade/__init__.py | 66 -- .../requests/packages/charade/__main__.py | 7 - .../requests/packages/charade/big5freq.py | 925 ------------------ .../requests/packages/charade/big5prober.py | 42 - .../packages/charade/chardistribution.py | 231 ----- .../packages/charade/charsetgroupprober.py | 106 -- .../packages/charade/charsetprober.py | 62 -- .../packages/charade/codingstatemachine.py | 61 -- .../requests/packages/charade/compat.py | 34 - .../requests/packages/charade/constants.py | 39 - .../requests/packages/charade/cp949prober.py | 44 - .../requests/packages/charade/escprober.py | 86 -- .../requests/packages/charade/escsm.py | 242 ----- .../requests/packages/charade/eucjpprober.py | 90 -- .../requests/packages/charade/euckrfreq.py | 596 ----------- .../requests/packages/charade/euckrprober.py | 42 - .../requests/packages/charade/euctwfreq.py | 428 -------- .../requests/packages/charade/euctwprober.py | 41 - .../requests/packages/charade/gb2312freq.py | 472 --------- .../requests/packages/charade/gb2312prober.py | 41 - .../requests/packages/charade/hebrewprober.py | 283 ------ .../requests/packages/charade/jisfreq.py | 569 ----------- .../requests/packages/charade/jpcntx.py | 219 ----- .../packages/charade/langbulgarianmodel.py | 229 ----- .../packages/charade/langcyrillicmodel.py | 329 ------- .../packages/charade/langgreekmodel.py | 225 ----- .../packages/charade/langhebrewmodel.py | 201 ---- .../packages/charade/langhungarianmodel.py | 225 ----- .../packages/charade/langthaimodel.py | 200 ---- .../requests/packages/charade/latin1prober.py | 139 --- .../packages/charade/mbcharsetprober.py | 86 -- .../packages/charade/mbcsgroupprober.py | 54 - .../requests/packages/charade/mbcssm.py | 575 ----------- .../packages/charade/sbcharsetprober.py | 120 --- .../packages/charade/sbcsgroupprober.py | 69 -- .../requests/packages/charade/sjisprober.py | 91 -- .../packages/charade/universaldetector.py | 168 ---- .../requests/packages/charade/utf8prober.py | 76 -- .../requests/packages/chardet/__init__.py | 2 +- .../requests/packages/chardet/chardetect.py | 66 +- .../requests/packages/chardet/jpcntx.py | 8 + .../requests/packages/chardet/latin1prober.py | 6 +- .../requests/packages/chardet/mbcssm.py | 9 +- .../requests/packages/chardet/sjisprober.py | 2 +- .../packages/chardet/universaldetector.py | 4 +- .../requests/packages/urllib3/__init__.py | 24 +- .../requests/packages/urllib3/_collections.py | 15 +- .../requests/packages/urllib3/connection.py | 168 ++-- .../packages/urllib3/connectionpool.py | 307 +++--- .../packages/urllib3/contrib/ntlmpool.py | 6 - .../packages/urllib3/contrib/pyopenssl.py | 257 ++--- .../requests/packages/urllib3/exceptions.py | 69 +- .../requests/packages/urllib3/fields.py | 26 +- .../requests/packages/urllib3/filepost.py | 15 +- .../packages/urllib3/packages/ordered_dict.py | 1 - .../requests/packages/urllib3/poolmanager.py | 43 +- .../requests/packages/urllib3/request.py | 66 +- .../requests/packages/urllib3/response.py | 97 +- .../packages/urllib3/util/__init__.py | 9 +- .../packages/urllib3/util/connection.py | 58 +- .../requests/packages/urllib3/util/request.py | 19 +- .../packages/urllib3/util/response.py | 19 +- .../requests/packages/urllib3/util/retry.py | 285 ++++++ .../requests/packages/urllib3/util/ssl_.py | 207 +++- .../requests/packages/urllib3/util/timeout.py | 100 +- .../requests/packages/urllib3/util/url.py | 64 +- awx/lib/site-packages/requests/sessions.py | 127 ++- .../site-packages/requests/status_codes.py | 3 +- awx/lib/site-packages/requests/structures.py | 25 +- awx/lib/site-packages/requests/utils.py | 38 +- 79 files changed, 1623 insertions(+), 8348 deletions(-) delete mode 100644 awx/lib/site-packages/requests/packages/charade/__init__.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/__main__.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/big5freq.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/big5prober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/chardistribution.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/charsetgroupprober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/charsetprober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/codingstatemachine.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/compat.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/constants.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/cp949prober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/escprober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/escsm.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/eucjpprober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/euckrfreq.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/euckrprober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/euctwfreq.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/euctwprober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/gb2312freq.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/gb2312prober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/hebrewprober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/jisfreq.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/jpcntx.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/langbulgarianmodel.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/langcyrillicmodel.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/langgreekmodel.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/langhebrewmodel.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/langhungarianmodel.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/langthaimodel.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/latin1prober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/mbcharsetprober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/mbcsgroupprober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/mbcssm.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/sbcharsetprober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/sbcsgroupprober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/sjisprober.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/universaldetector.py delete mode 100644 awx/lib/site-packages/requests/packages/charade/utf8prober.py mode change 100644 => 100755 awx/lib/site-packages/requests/packages/chardet/chardetect.py create mode 100644 awx/lib/site-packages/requests/packages/urllib3/util/retry.py diff --git a/awx/lib/site-packages/README b/awx/lib/site-packages/README index 414ae5ff7b..d33d0fb595 100644 --- a/awx/lib/site-packages/README +++ b/awx/lib/site-packages/README @@ -53,7 +53,7 @@ rackspace-auth-openstack==1.3 (rackspace_auth_openstack/*) rackspace-novaclient==1.4 (no files) rax-default-network-flags-python-novaclient-ext==0.2.3 (rax_default_network_flags_python_novaclient_ext/*) rax-scheduled-images-python-novaclient-ext==0.2.1 (rax_scheduled_images_python_novaclient_ext/*) -requests==2.3.0 (requests/*) +requests==2.5.1 (requests/*) setuptools==12.0.5 (setuptools/*, _markerlib/*, pkg_resources/*, easy_install.py) simplejson==3.6.0 (simplejson/*, excluded simplejson/_speedups.so) six==1.7.3 (six.py) diff --git a/awx/lib/site-packages/requests/__init__.py b/awx/lib/site-packages/requests/__init__.py index bba190029e..ac2b06c86c 100644 --- a/awx/lib/site-packages/requests/__init__.py +++ b/awx/lib/site-packages/requests/__init__.py @@ -13,7 +13,7 @@ Requests is an HTTP library, written in Python, for human beings. Basic GET usage: >>> import requests - >>> r = requests.get('http://python.org') + >>> r = requests.get('https://www.python.org') >>> r.status_code 200 >>> 'Python is a programming language' in r.content @@ -22,7 +22,7 @@ usage: ... or POST: >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post("http://httpbin.org/post", data=payload) + >>> r = requests.post('http://httpbin.org/post', data=payload) >>> print(r.text) { ... @@ -42,8 +42,8 @@ is at <http://python-requests.org>. """ __title__ = 'requests' -__version__ = '2.3.0' -__build__ = 0x020300 +__version__ = '2.5.1' +__build__ = 0x020501 __author__ = 'Kenneth Reitz' __license__ = 'Apache 2.0' __copyright__ = 'Copyright 2014 Kenneth Reitz' diff --git a/awx/lib/site-packages/requests/adapters.py b/awx/lib/site-packages/requests/adapters.py index eb7a2d282f..c892853b29 100644 --- a/awx/lib/site-packages/requests/adapters.py +++ b/awx/lib/site-packages/requests/adapters.py @@ -11,20 +11,25 @@ and maintain connections. import socket from .models import Response +from .packages.urllib3 import Retry from .packages.urllib3.poolmanager import PoolManager, proxy_from_url from .packages.urllib3.response import HTTPResponse from .packages.urllib3.util import Timeout as TimeoutSauce -from .compat import urlparse, basestring, urldefrag, unquote +from .compat import urlparse, basestring from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, - prepend_scheme_if_needed, get_auth_from_url) + prepend_scheme_if_needed, get_auth_from_url, urldefragauth) from .structures import CaseInsensitiveDict -from .packages.urllib3.exceptions import MaxRetryError -from .packages.urllib3.exceptions import TimeoutError -from .packages.urllib3.exceptions import SSLError as _SSLError +from .packages.urllib3.exceptions import ConnectTimeoutError from .packages.urllib3.exceptions import HTTPError as _HTTPError +from .packages.urllib3.exceptions import MaxRetryError from .packages.urllib3.exceptions import ProxyError as _ProxyError +from .packages.urllib3.exceptions import ProtocolError +from .packages.urllib3.exceptions import ReadTimeoutError +from .packages.urllib3.exceptions import SSLError as _SSLError +from .packages.urllib3.exceptions import ResponseError from .cookies import extract_cookies_to_jar -from .exceptions import ConnectionError, Timeout, SSLError, ProxyError +from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + ProxyError, RetryError) from .auth import _basic_auth_str DEFAULT_POOLBLOCK = False @@ -56,8 +61,12 @@ class HTTPAdapter(BaseAdapter): :param pool_connections: The number of urllib3 connection pools to cache. :param pool_maxsize: The maximum number of connections to save in the pool. :param int max_retries: The maximum number of retries each connection - should attempt. Note, this applies only to failed connections and - timeouts, never to requests where the server returns a response. + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. :param pool_block: Whether the connection pool should block for connections. Usage:: @@ -73,7 +82,10 @@ class HTTPAdapter(BaseAdapter): def __init__(self, pool_connections=DEFAULT_POOLSIZE, pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, pool_block=DEFAULT_POOLBLOCK): - self.max_retries = max_retries + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) self.config = {} self.proxy_manager = {} @@ -101,14 +113,17 @@ class HTTPAdapter(BaseAdapter): self.init_poolmanager(self._pool_connections, self._pool_maxsize, block=self._pool_block) - def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK): - """Initializes a urllib3 PoolManager. This method should not be called - from user code, and is only exposed for use when subclassing the + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. :param connections: The number of urllib3 connection pools to cache. :param maxsize: The maximum number of connections to save in the pool. :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. """ # save these values for pickling self._pool_connections = connections @@ -116,7 +131,30 @@ class HTTPAdapter(BaseAdapter): self._pool_block = block self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, - block=block) + block=block, strict=True, **pool_kwargs) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + """ + if not proxy in self.proxy_manager: + proxy_headers = self.proxy_headers(proxy) + self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs) + + return self.proxy_manager[proxy] def cert_verify(self, conn, url, verify, cert): """Verify a SSL certificate. This method should not be called from user @@ -204,17 +242,8 @@ class HTTPAdapter(BaseAdapter): if proxy: proxy = prepend_scheme_if_needed(proxy, 'http') - proxy_headers = self.proxy_headers(proxy) - - if not proxy in self.proxy_manager: - self.proxy_manager[proxy] = proxy_from_url( - proxy, - proxy_headers=proxy_headers, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block) - - conn = self.proxy_manager[proxy].connection_from_url(url) + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) else: # Only scheme should be lower case parsed = urlparse(url) @@ -249,7 +278,7 @@ class HTTPAdapter(BaseAdapter): proxy = proxies.get(scheme) if proxy and scheme != 'https': - url, _ = urldefrag(request.url) + url = urldefragauth(request.url) else: url = request.path_url @@ -296,7 +325,10 @@ class HTTPAdapter(BaseAdapter): :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) The timeout on the request. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a (`connect timeout, read + timeout <user/advanced.html#timeouts>`_) tuple. + :type timeout: float or tuple :param verify: (optional) Whether to verify SSL certificates. :param cert: (optional) Any user-provided SSL certificate to be trusted. :param proxies: (optional) The proxies dictionary to apply to the request. @@ -310,7 +342,18 @@ class HTTPAdapter(BaseAdapter): chunked = not (request.body is None or 'Content-Length' in request.headers) - timeout = TimeoutSauce(connect=timeout, read=timeout) + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {0}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) try: if not chunked: @@ -368,10 +411,16 @@ class HTTPAdapter(BaseAdapter): # All is well, return the connection to the pool. conn._put_conn(low_conn) - except socket.error as sockerr: - raise ConnectionError(sockerr, request=request) + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + raise ConnectionError(e, request=request) except _ProxyError as e: @@ -380,8 +429,8 @@ class HTTPAdapter(BaseAdapter): except (_SSLError, _HTTPError) as e: if isinstance(e, _SSLError): raise SSLError(e, request=request) - elif isinstance(e, TimeoutError): - raise Timeout(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) else: raise diff --git a/awx/lib/site-packages/requests/api.py b/awx/lib/site-packages/requests/api.py index 01d853d5ca..1469b05c49 100644 --- a/awx/lib/site-packages/requests/api.py +++ b/awx/lib/site-packages/requests/api.py @@ -22,12 +22,17 @@ def request(method, url, **kwargs): :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of 'name': file-like-objects (or {'name': ('filename', fileobj)}) for multipart encoding upload. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': ('filename', fileobj)}``) for multipart encoding upload. :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) Float describing the timeout of the request in seconds. + :param timeout: (optional) How long to wait for the server to send data + before giving up, as a float, or a (`connect timeout, read timeout + <user/advanced.html#timeouts>`_) tuple. + :type timeout: float or tuple :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed. + :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. :param stream: (optional) if ``False``, the response content will be immediately downloaded. @@ -41,7 +46,12 @@ def request(method, url, **kwargs): """ session = sessions.Session() - return session.request(method=method, url=url, **kwargs) + response = session.request(method=method, url=url, **kwargs) + # By explicitly closing the session, we avoid leaving sockets open which + # can trigger a ResourceWarning in some cases, and look like a memory leak + # in others. + session.close() + return response def get(url, **kwargs): @@ -77,15 +87,16 @@ def head(url, **kwargs): return request('head', url, **kwargs) -def post(url, data=None, **kwargs): +def post(url, data=None, json=None, **kwargs): """Sends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. """ - return request('post', url, data=data, **kwargs) + return request('post', url, data=data, json=json, **kwargs) def put(url, data=None, **kwargs): diff --git a/awx/lib/site-packages/requests/auth.py b/awx/lib/site-packages/requests/auth.py index 9f831b7ad0..b950181d9e 100644 --- a/awx/lib/site-packages/requests/auth.py +++ b/awx/lib/site-packages/requests/auth.py @@ -16,7 +16,8 @@ from base64 import b64encode from .compat import urlparse, str from .cookies import extract_cookies_to_jar -from .utils import parse_dict_header +from .utils import parse_dict_header, to_native_string +from .status_codes import codes CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' CONTENT_TYPE_MULTI_PART = 'multipart/form-data' @@ -25,7 +26,11 @@ CONTENT_TYPE_MULTI_PART = 'multipart/form-data' def _basic_auth_str(username, password): """Returns a Basic Auth string.""" - return 'Basic ' + b64encode(('%s:%s' % (username, password)).encode('latin1')).strip().decode('latin1') + authstr = 'Basic ' + to_native_string( + b64encode(('%s:%s' % (username, password)).encode('latin1')).strip() + ) + + return authstr class AuthBase(object): @@ -62,6 +67,7 @@ class HTTPDigestAuth(AuthBase): self.nonce_count = 0 self.chal = {} self.pos = None + self.num_401_calls = 1 def build_digest_header(self, method, url): @@ -146,6 +152,11 @@ class HTTPDigestAuth(AuthBase): return 'Digest %s' % (base) + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self.num_401_calls = 1 + def handle_401(self, r, **kwargs): """Takes the given response and tries digest-auth, if needed.""" @@ -158,7 +169,7 @@ class HTTPDigestAuth(AuthBase): if 'digest' in s_auth.lower() and num_401_calls < 2: - setattr(self, 'num_401_calls', num_401_calls + 1) + self.num_401_calls += 1 pat = re.compile(r'digest ', flags=re.IGNORECASE) self.chal = parse_dict_header(pat.sub('', s_auth, count=1)) @@ -178,7 +189,7 @@ class HTTPDigestAuth(AuthBase): return _r - setattr(self, 'num_401_calls', 1) + self.num_401_calls = 1 return r def __call__(self, r): @@ -188,6 +199,11 @@ class HTTPDigestAuth(AuthBase): try: self.pos = r.body.tell() except AttributeError: - pass + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self.pos = None r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) return r diff --git a/awx/lib/site-packages/requests/certs.py b/awx/lib/site-packages/requests/certs.py index bc00826191..07e6475070 100644 --- a/awx/lib/site-packages/requests/certs.py +++ b/awx/lib/site-packages/requests/certs.py @@ -11,14 +11,15 @@ If you are packaging Requests, e.g., for a Linux distribution or a managed environment, you can change the definition of where() to return a separately packaged CA bundle. """ - import os.path - -def where(): - """Return the preferred certificate bundle.""" - # vendored bundle inside Requests - return os.path.join(os.path.dirname(__file__), 'cacert.pem') +try: + from certifi import where +except ImportError: + def where(): + """Return the preferred certificate bundle.""" + # vendored bundle inside Requests + return os.path.join(os.path.dirname(__file__), 'cacert.pem') if __name__ == '__main__': print(where()) diff --git a/awx/lib/site-packages/requests/compat.py b/awx/lib/site-packages/requests/compat.py index bdf10d6a9f..c07726ee45 100644 --- a/awx/lib/site-packages/requests/compat.py +++ b/awx/lib/site-packages/requests/compat.py @@ -75,7 +75,9 @@ is_solaris = ('solar==' in str(sys.platform).lower()) # Complete guess. try: import simplejson as json -except ImportError: +except (ImportError, SyntaxError): + # simplejson does not support Python 3.2, it throws a SyntaxError + # because of u'...' Unicode literals. import json # --------- @@ -90,7 +92,6 @@ if is_py2: from Cookie import Morsel from StringIO import StringIO from .packages.urllib3.packages.ordered_dict import OrderedDict - from httplib import IncompleteRead builtin_str = str bytes = str @@ -106,7 +107,6 @@ elif is_py3: from http.cookies import Morsel from io import StringIO from collections import OrderedDict - from http.client import IncompleteRead builtin_str = str str = str diff --git a/awx/lib/site-packages/requests/exceptions.py b/awx/lib/site-packages/requests/exceptions.py index a4ee9d630c..89135a802e 100644 --- a/awx/lib/site-packages/requests/exceptions.py +++ b/awx/lib/site-packages/requests/exceptions.py @@ -44,7 +44,23 @@ class SSLError(ConnectionError): class Timeout(RequestException): - """The request timed out.""" + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" class URLRequired(RequestException): @@ -73,3 +89,11 @@ class ChunkedEncodingError(RequestException): class ContentDecodingError(RequestException, BaseHTTPError): """Failed to decode response content""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed""" + + +class RetryError(RequestException): + """Custom retries logic failed""" diff --git a/awx/lib/site-packages/requests/models.py b/awx/lib/site-packages/requests/models.py index 120968ff51..b728c84e41 100644 --- a/awx/lib/site-packages/requests/models.py +++ b/awx/lib/site-packages/requests/models.py @@ -19,31 +19,35 @@ from .cookies import cookiejar_from_dict, get_cookie_header from .packages.urllib3.fields import RequestField from .packages.urllib3.filepost import encode_multipart_formdata from .packages.urllib3.util import parse_url -from .packages.urllib3.exceptions import DecodeError +from .packages.urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) from .exceptions import ( - HTTPError, RequestException, MissingSchema, InvalidURL, - ChunkedEncodingError, ContentDecodingError) + HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, + ContentDecodingError, ConnectionError, StreamConsumedError) from .utils import ( guess_filename, get_auth_from_url, requote_uri, stream_decode_response_unicode, to_key_val_list, parse_header_links, iter_slices, guess_json_utf, super_len, to_native_string) from .compat import ( cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO, - is_py2, chardet, json, builtin_str, basestring, IncompleteRead) + is_py2, chardet, json, builtin_str, basestring) from .status_codes import codes #: The set of HTTP status codes that indicate an automatically #: processable redirect. REDIRECT_STATI = ( - codes.moved, # 301 - codes.found, # 302 - codes.other, # 303 - codes.temporary_moved, # 307 + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 ) DEFAULT_REDIRECT_LIMIT = 30 CONTENT_CHUNK_SIZE = 10 * 1024 ITER_CHUNK_SIZE = 512 +json_dumps = json.dumps + class RequestEncodingMixin(object): @property @@ -187,7 +191,8 @@ class Request(RequestHooksMixin): :param url: URL to send. :param headers: dictionary of headers to send. :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach the request. If a dictionary is provided, form-encoding will take place. + :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. + :param json: json for the body to attach to the request (if data is not specified). :param params: dictionary of URL parameters to append to the URL. :param auth: Auth handler or (user, pass) tuple. :param cookies: dictionary or CookieJar of cookies to attach to this request. @@ -210,7 +215,8 @@ class Request(RequestHooksMixin): params=None, auth=None, cookies=None, - hooks=None): + hooks=None, + json=None): # Default empty dicts for dict params. data = [] if data is None else data @@ -228,6 +234,7 @@ class Request(RequestHooksMixin): self.headers = headers self.files = files self.data = data + self.json = json self.params = params self.auth = auth self.cookies = cookies @@ -244,6 +251,7 @@ class Request(RequestHooksMixin): headers=self.headers, files=self.files, data=self.data, + json=self.json, params=self.params, auth=self.auth, cookies=self.cookies, @@ -287,14 +295,15 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): self.hooks = default_hooks() def prepare(self, method=None, url=None, headers=None, files=None, - data=None, params=None, auth=None, cookies=None, hooks=None): + data=None, params=None, auth=None, cookies=None, hooks=None, + json=None): """Prepares the entire request with the given parameters.""" self.prepare_method(method) self.prepare_url(url, params) self.prepare_headers(headers) self.prepare_cookies(cookies) - self.prepare_body(data, files) + self.prepare_body(data, files, json) self.prepare_auth(auth, url) # Note that prepare_auth must be last to enable authentication schemes # such as OAuth to work on a fully prepared request. @@ -309,8 +318,8 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): p = PreparedRequest() p.method = self.method p.url = self.url - p.headers = self.headers.copy() - p._cookies = self._cookies.copy() + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = self._cookies.copy() if self._cookies is not None else None p.body = self.body p.hooks = self.hooks return p @@ -324,21 +333,27 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): def prepare_url(self, url, params): """Prepares the given HTTP URL.""" #: Accept objects that have string representations. - try: - url = unicode(url) - except NameError: - # We're on Python 3. - url = str(url) - except UnicodeDecodeError: - pass + #: We're unable to blindy call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/kennethreitz/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode('utf8') + else: + url = unicode(url) if is_py2 else str(url) - # Don't do any URL preparation for oddball schemes + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. if ':' in url and not url.lower().startswith('http'): self.url = url return # Support for unicode domain names and paths. - scheme, auth, host, port, path, query, fragment = parse_url(url) + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) if not scheme: raise MissingSchema("Invalid URL {0!r}: No schema supplied. " @@ -395,7 +410,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): else: self.headers = CaseInsensitiveDict() - def prepare_body(self, data, files): + def prepare_body(self, data, files, json=None): """Prepares the given HTTP body data.""" # Check if file, fo, generator, iterator. @@ -406,6 +421,10 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): content_type = None length = None + if json is not None: + content_type = 'application/json' + body = json_dumps(json) + is_stream = all([ hasattr(data, '__iter__'), not isinstance(data, (basestring, list, tuple, dict)) @@ -431,9 +450,9 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): if files: (body, content_type) = self._encode_files(files, data) else: - if data: + if data and json is None: body = self._encode_params(data) - if isinstance(data, str) or isinstance(data, builtin_str) or hasattr(data, 'read'): + if isinstance(data, basestring) or hasattr(data, 'read'): content_type = None else: content_type = 'application/x-www-form-urlencoded' @@ -441,7 +460,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): self.prepare_content_length(body) # Add content-type if it wasn't explicitly provided. - if (content_type) and (not 'content-type' in self.headers): + if content_type and ('content-type' not in self.headers): self.headers['Content-Type'] = content_type self.body = body @@ -455,7 +474,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): l = super_len(body) if l: self.headers['Content-Length'] = builtin_str(l) - elif self.method not in ('GET', 'HEAD'): + elif (self.method not in ('GET', 'HEAD')) and (self.headers.get('Content-Length') is None): self.headers['Content-Length'] = '0' def prepare_auth(self, auth, url=''): @@ -556,6 +575,10 @@ class Response(object): #: and the arrival of the response (as a timedelta) self.elapsed = datetime.timedelta(0) + #: The :class:`PreparedRequest <PreparedRequest>` object to which this + #: is a response. + self.request = None + def __getstate__(self): # Consume everything; accessing the content attribute makes # sure the content has been fully read. @@ -594,7 +617,7 @@ class Response(object): def ok(self): try: self.raise_for_status() - except RequestException: + except HTTPError: return False return True @@ -605,6 +628,11 @@ class Response(object): """ return ('location' in self.headers and self.status_code in REDIRECT_STATI) + @property + def is_permanent_redirect(self): + """True if this Response one of the permanant versions of redirect""" + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + @property def apparent_encoding(self): """The apparent encoding, provided by the chardet library""" @@ -626,10 +654,12 @@ class Response(object): try: for chunk in self.raw.stream(chunk_size, decode_content=True): yield chunk - except IncompleteRead as e: + except ProtocolError as e: raise ChunkedEncodingError(e) except DecodeError as e: raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) except AttributeError: # Standard file-like object. while True: @@ -640,6 +670,8 @@ class Response(object): self._content_consumed = True + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() # simulate reading small chunks of the content reused_chunks = iter_slices(self._content, chunk_size) @@ -652,7 +684,7 @@ class Response(object): return chunks - def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None): + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None): """Iterates over the response data, one line at a time. When stream=True is set on the request, this avoids reading the content at once into memory for large responses. @@ -664,7 +696,11 @@ class Response(object): if pending is not None: chunk = pending + chunk - lines = chunk.splitlines() + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: pending = lines.pop() diff --git a/awx/lib/site-packages/requests/packages/charade/__init__.py b/awx/lib/site-packages/requests/packages/charade/__init__.py deleted file mode 100644 index 26362e9739..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/__init__.py +++ /dev/null @@ -1,66 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -__version__ = "1.0.3" -from sys import version_info - - -def detect(aBuf): - if ((version_info < (3, 0) and isinstance(aBuf, unicode)) or - (version_info >= (3, 0) and not isinstance(aBuf, bytes))): - raise ValueError('Expected a bytes object, not a unicode object') - - from . import universaldetector - u = universaldetector.UniversalDetector() - u.reset() - u.feed(aBuf) - u.close() - return u.result - -def _description_of(path): - """Return a string describing the probable encoding of a file.""" - from charade.universaldetector import UniversalDetector - - u = UniversalDetector() - for line in open(path, 'rb'): - u.feed(line) - u.close() - result = u.result - if result['encoding']: - return '%s: %s with confidence %s' % (path, - result['encoding'], - result['confidence']) - else: - return '%s: no result' % path - - -def charade_cli(): - """ - Script which takes one or more file paths and reports on their detected - encodings - - Example:: - - % chardetect.py somefile someotherfile - somefile: windows-1252 with confidence 0.5 - someotherfile: ascii with confidence 1.0 - - """ - from sys import argv - for path in argv[1:]: - print(_description_of(path)) - \ No newline at end of file diff --git a/awx/lib/site-packages/requests/packages/charade/__main__.py b/awx/lib/site-packages/requests/packages/charade/__main__.py deleted file mode 100644 index c0d587fa9e..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/__main__.py +++ /dev/null @@ -1,7 +0,0 @@ -''' -support ';python -m charade <file1> [file2] ...' package execution syntax (2.7+) -''' - -from charade import charade_cli - -charade_cli() diff --git a/awx/lib/site-packages/requests/packages/charade/big5freq.py b/awx/lib/site-packages/requests/packages/charade/big5freq.py deleted file mode 100644 index 65bffc04b0..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/big5freq.py +++ /dev/null @@ -1,925 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Big5 frequency table -# by Taiwan's Mandarin Promotion Council -# <http://www.edu.tw:81/mandr/> -# -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -#Char to FreqOrder table -BIG5_TABLE_SIZE = 5376 - -Big5CharToFreqOrder = ( - 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 -3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 -1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 - 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 -3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 -4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 -5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 - 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 - 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 - 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 -2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 -1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 -3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 - 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 -3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 -2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 - 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 -3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 -1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 -5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 - 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 -5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 -1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 - 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 - 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 -3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 -3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 - 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 -2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 -2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 - 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 - 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 -3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 -1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 -1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 -1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 -2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 - 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 -4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 -1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 -5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 -2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 - 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 - 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 - 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 - 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 -5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 - 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 -1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 - 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 - 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 -5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 -1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 - 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 -3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 -4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 -3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 - 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 - 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 -1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 -4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 -3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 -3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 -2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 -5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 -3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 -5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 -1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 -2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 -1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 - 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 -1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 -4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 -3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 - 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 - 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 - 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 -2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 -5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 -1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 -2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 -1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 -1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 -5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 -5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 -5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 -3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 -4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 -4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 -2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 -5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 -3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 - 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 -5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 -5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 -1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 -2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 -3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 -4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 -5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 -3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 -4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 -1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 -1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 -4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 -1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 - 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 -1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 -1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 -3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 - 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 -5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 -2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 -1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 -1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 -5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 - 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 -4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 - 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 -2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 - 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 -1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 -1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 - 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 -4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 -4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 -1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 -3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 -5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 -5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 -1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 -2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 -1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 -3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 -2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 -3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 -2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 -4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 -4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 -3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 - 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 -3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 - 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 -3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 -4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 -3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 -1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 -5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 - 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 -5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 -1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 - 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 -4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 -4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 - 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 -2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 -2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 -3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 -1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 -4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 -2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 -1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 -1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 -2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 -3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 -1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 -5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 -1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 -4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 -1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 - 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 -1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 -4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 -4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 -2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 -1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 -4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 - 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 -5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 -2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 -3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 -4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 - 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 -5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 -5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 -1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 -4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 -4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 -2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 -3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 -3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 -2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 -1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 -4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 -3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 -3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 -2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 -4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 -5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 -3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 -2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 -3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 -1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 -2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 -3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 -4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 -2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 -2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 -5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 -1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 -2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 -1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 -3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 -4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 -2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 -3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 -3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 -2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 -4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 -2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 -3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 -4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 -5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 -3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 - 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 -1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 -4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 -1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 -4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 -5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 - 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 -5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 -5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 -2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 -3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 -2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 -2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 - 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 -1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 -4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 -3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 -3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 - 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 -2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 - 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 -2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 -4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 -1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 -4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 -1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 -3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 - 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 -3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 -5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 -5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 -3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 -3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 -1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 -2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 -5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 -1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 -1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 -3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 - 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 -1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 -4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 -5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 -2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 -3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 - 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 -1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 -2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 -2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 -5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 -5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 -5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 -2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 -2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 -1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 -4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 -3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 -3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 -4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 -4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 -2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 -2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 -5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 -4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 -5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 -4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 - 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 - 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 -1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 -3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 -4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 -1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 -5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 -2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 -2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 -3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 -5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 -1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 -3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 -5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 -1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 -5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 -2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 -3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 -2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 -3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 -3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 -3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 -4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 - 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 -2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 -4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 -3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 -5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 -1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 -5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 - 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 -1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 - 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 -4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 -1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 -4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 -1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 - 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 -3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 -4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 -5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 - 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 -3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 - 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 #last 512 -#Everything below is of no interest for detection purpose -2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392 -2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408 -5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424 -5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440 -5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456 -5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472 -5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488 -5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504 -5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520 -5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536 -5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552 -5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568 -5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584 -5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600 -6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616 -6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632 -6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648 -6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664 -6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680 -6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696 -6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712 -6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728 -6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744 -6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760 -6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776 -6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792 -6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808 -6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824 -6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840 -6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856 -6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872 -6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888 -6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904 -6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920 -6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936 -6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952 -6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968 -6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984 -6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000 -6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016 -6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032 -6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048 -6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064 -6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080 -6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096 -6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112 -6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128 -6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144 -6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160 -6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176 -6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192 -6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208 -6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224 -6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240 -6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256 -3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272 -6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288 -6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304 -3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320 -6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336 -6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352 -6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368 -6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384 -6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400 -6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416 -6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432 -4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448 -6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464 -6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480 -3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496 -6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512 -6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528 -6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544 -6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560 -6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576 -6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592 -6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608 -6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624 -6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640 -6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656 -6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672 -7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688 -7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704 -7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720 -7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736 -7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752 -7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768 -7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784 -7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800 -7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816 -7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832 -7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848 -7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864 -7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880 -7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896 -7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912 -7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928 -7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944 -7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960 -7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976 -7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992 -7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008 -7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024 -7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040 -7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056 -7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072 -7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088 -7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104 -7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120 -7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136 -7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152 -7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168 -7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184 -7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200 -7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216 -7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232 -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248 -7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264 -7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280 -7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296 -7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312 -7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328 -7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344 -7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360 -7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376 -7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392 -7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408 -7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424 -7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440 -3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456 -7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472 -7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488 -7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504 -7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520 -4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536 -7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552 -7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568 -7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584 -7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600 -7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616 -7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632 -7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648 -7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664 -7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680 -7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696 -7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712 -8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728 -8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744 -8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760 -8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776 -8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792 -8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808 -8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824 -8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840 -8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856 -8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872 -8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888 -8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904 -8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920 -8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936 -8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952 -8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968 -8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984 -8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016 -8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032 -8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048 -8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064 -8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080 -8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096 -8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112 -8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128 -8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144 -8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160 -8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176 -8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192 -8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208 -8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224 -8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240 -8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256 -8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272 -8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288 -8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304 -8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320 -8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336 -8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352 -8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368 -8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384 -8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400 -8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416 -8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432 -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448 -8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464 -8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480 -8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496 -8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512 -8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528 -8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544 -8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560 -8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576 -8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592 -8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608 -8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624 -8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640 -8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656 -8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672 -8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688 -4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704 -8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720 -8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736 -8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752 -8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768 -9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784 -9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800 -9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816 -9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832 -9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848 -9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864 -9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880 -9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896 -9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912 -9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928 -9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944 -9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960 -9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976 -9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992 -9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008 -9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024 -9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040 -9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056 -9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072 -9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088 -9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104 -9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120 -9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136 -9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152 -9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168 -9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184 -9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200 -9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216 -9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232 -9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248 -9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264 -9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280 -9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296 -9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312 -9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328 -9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344 -9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360 -9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376 -3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392 -9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408 -9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424 -9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440 -4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456 -9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472 -9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488 -9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504 -9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520 -9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536 -9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552 -9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568 -9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584 -9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600 -9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616 -9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632 -9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648 -9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664 -9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680 -9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696 -9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712 -9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728 -9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744 -9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760 -9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776 -9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792 -9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808 -9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824 -10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840 -10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856 -10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872 -10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888 -10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904 -10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920 -10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936 -10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952 -10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968 -4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984 -10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000 -10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016 -10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032 -10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048 -10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064 -10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080 -10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096 -10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112 -4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128 -10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144 -10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160 -10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176 -10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192 -10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208 -10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224 -10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240 -10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256 -10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272 -10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288 -10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304 -10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320 -10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336 -10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352 -10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368 -10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384 -10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400 -4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416 -10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432 -10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448 -10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464 -10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480 -10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496 -10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512 -10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528 -10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544 -10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560 -10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576 -10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592 -10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608 -10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624 -10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640 -10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656 -10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672 -10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688 -10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704 -10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720 -10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736 -10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752 -10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768 -10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784 -10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800 -10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816 -10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832 -10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848 -10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864 -10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880 -10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896 -11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912 -11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928 -11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944 -4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960 -11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976 -11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992 -11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008 -11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024 -11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040 -11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056 -11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072 -11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088 -11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104 -11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120 -11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136 -11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152 -11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168 -11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184 -11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200 -11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216 -11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232 -11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248 -11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264 -11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280 -11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296 -11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312 -11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328 -11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344 -11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360 -11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376 -11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392 -11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408 -11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424 -11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440 -11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456 -11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472 -4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488 -11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504 -11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520 -11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536 -11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552 -11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568 -11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584 -11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600 -11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616 -11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632 -11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648 -11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664 -11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680 -11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696 -11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712 -11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728 -11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744 -11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760 -11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776 -11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792 -11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808 -11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824 -11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840 -11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856 -11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872 -11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888 -11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904 -11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920 -11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936 -12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952 -12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968 -12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984 -12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000 -12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016 -12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032 -12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048 -12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064 -12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080 -12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096 -12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112 -12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128 -12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144 -12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160 -12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176 -4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192 -4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208 -4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224 -12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240 -12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256 -12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272 -12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288 -12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304 -12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320 -12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336 -12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352 -12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368 -12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384 -12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400 -12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416 -12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432 -12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448 -12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464 -12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480 -12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496 -12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512 -12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528 -12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544 -12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560 -12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576 -12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592 -12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608 -12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624 -12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640 -12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656 -12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672 -12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688 -12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704 -12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720 -12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736 -12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752 -12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768 -12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784 -12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800 -12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816 -12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832 -12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848 -12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864 -12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880 -12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896 -12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912 -12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928 -12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944 -12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960 -12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976 -4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992 -13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008 -13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024 -13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040 -13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056 -13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072 -13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088 -13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104 -4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120 -13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136 -13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152 -13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168 -13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184 -13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200 -13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216 -13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232 -13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248 -13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264 -13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280 -13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296 -13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312 -13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328 -13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344 -13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360 -5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376 -13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392 -13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408 -13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424 -13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440 -13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456 -13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472 -13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488 -13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504 -13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520 -13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536 -13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552 -13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568 -13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584 -13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600 -13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616 -13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632 -13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648 -13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664 -13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680 -13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696 -13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712 -13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728 -13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744 -13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760 -13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776 -13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792 -13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808 -13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824 -13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840 -13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856 -13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872 -13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888 -13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904 -13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920 -13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936 -13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952 -13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968 -13968,13969,13970,13971,13972) #13973 - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/big5prober.py b/awx/lib/site-packages/requests/packages/charade/big5prober.py deleted file mode 100644 index 7382f7c5d4..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/big5prober.py +++ /dev/null @@ -1,42 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import Big5DistributionAnalysis -from .mbcssm import Big5SMModel - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(Big5SMModel) - self._mDistributionAnalyzer = Big5DistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "Big5" diff --git a/awx/lib/site-packages/requests/packages/charade/chardistribution.py b/awx/lib/site-packages/requests/packages/charade/chardistribution.py deleted file mode 100644 index dfd3355e91..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/chardistribution.py +++ /dev/null @@ -1,231 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO) -from .compat import wrap_ord - -ENOUGH_DATA_THRESHOLD = 1024 -SURE_YES = 0.99 -SURE_NO = 0.01 -MINIMUM_DATA_THRESHOLD = 3 - - -class CharDistributionAnalysis: - def __init__(self): - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._mCharToFreqOrder = None - self._mTableSize = None # Size of above table - # This is a constant value which varies from language to language, - # used in calculating confidence. See - # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html - # for further detail. - self._mTypicalDistributionRatio = None - self.reset() - - def reset(self): - """reset analyser, clear any state""" - # If this flag is set to True, detection is done and conclusion has - # been made - self._mDone = False - self._mTotalChars = 0 # Total characters encountered - # The number of characters whose frequency order is less than 512 - self._mFreqChars = 0 - - def feed(self, aBuf, aCharLen): - """feed a character with known length""" - if aCharLen == 2: - # we only care about 2-bytes character in our distribution analysis - order = self.get_order(aBuf) - else: - order = -1 - if order >= 0: - self._mTotalChars += 1 - # order is valid - if order < self._mTableSize: - if 512 > self._mCharToFreqOrder[order]: - self._mFreqChars += 1 - - def get_confidence(self): - """return confidence based on existing data""" - # if we didn't receive any character in our consideration range, - # return negative answer - if self._mTotalChars <= 0 or self._mFreqChars <= MINIMUM_DATA_THRESHOLD: - return SURE_NO - - if self._mTotalChars != self._mFreqChars: - r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars) - * self._mTypicalDistributionRatio)) - if r < SURE_YES: - return r - - # normalize confidence (we don't want to be 100% sure) - return SURE_YES - - def got_enough_data(self): - # It is not necessary to receive all data to draw conclusion. - # For charset detection, certain amount of data is enough - return self._mTotalChars > ENOUGH_DATA_THRESHOLD - - def get_order(self, aBuf): - # We do not handle characters based on the original encoding string, - # but convert this encoding string to a number, here called order. - # This allows multiple encodings of a language to share one frequency - # table. - return -1 - - -class EUCTWDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCTWCharToFreqOrder - self._mTableSize = EUCTW_TABLE_SIZE - self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-TW encoding, we are interested - # first byte range: 0xc4 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = wrap_ord(aBuf[0]) - if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1 - else: - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCKRCharToFreqOrder - self._mTableSize = EUCKR_TABLE_SIZE - self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-KR encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = wrap_ord(aBuf[0]) - if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1 - else: - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = GB2312CharToFreqOrder - self._mTableSize = GB2312_TABLE_SIZE - self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for GB2312 encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if (first_char >= 0xB0) and (second_char >= 0xA1): - return 94 * (first_char - 0xB0) + second_char - 0xA1 - else: - return -1 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = Big5CharToFreqOrder - self._mTableSize = BIG5_TABLE_SIZE - self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for big5 encoding, we are interested - # first byte range: 0xa4 -- 0xfe - # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if first_char >= 0xA4: - if second_char >= 0xA1: - return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 - else: - return 157 * (first_char - 0xA4) + second_char - 0x40 - else: - return -1 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for sjis encoding, we are interested - # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe - # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if (first_char >= 0x81) and (first_char <= 0x9F): - order = 188 * (first_char - 0x81) - elif (first_char >= 0xE0) and (first_char <= 0xEF): - order = 188 * (first_char - 0xE0 + 31) - else: - return -1 - order = order + second_char - 0x40 - if second_char > 0x7F: - order = -1 - return order - - -class EUCJPDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-JP encoding, we are interested - # first byte range: 0xa0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - char = wrap_ord(aBuf[0]) - if char >= 0xA0: - return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1 - else: - return -1 diff --git a/awx/lib/site-packages/requests/packages/charade/charsetgroupprober.py b/awx/lib/site-packages/requests/packages/charade/charsetgroupprober.py deleted file mode 100644 index 2959654748..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/charsetgroupprober.py +++ /dev/null @@ -1,106 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import sys -from .charsetprober import CharSetProber - - -class CharSetGroupProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mActiveNum = 0 - self._mProbers = [] - self._mBestGuessProber = None - - def reset(self): - CharSetProber.reset(self) - self._mActiveNum = 0 - for prober in self._mProbers: - if prober: - prober.reset() - prober.active = True - self._mActiveNum += 1 - self._mBestGuessProber = None - - def get_charset_name(self): - if not self._mBestGuessProber: - self.get_confidence() - if not self._mBestGuessProber: - return None -# self._mBestGuessProber = self._mProbers[0] - return self._mBestGuessProber.get_charset_name() - - def feed(self, aBuf): - for prober in self._mProbers: - if not prober: - continue - if not prober.active: - continue - st = prober.feed(aBuf) - if not st: - continue - if st == constants.eFoundIt: - self._mBestGuessProber = prober - return self.get_state() - elif st == constants.eNotMe: - prober.active = False - self._mActiveNum -= 1 - if self._mActiveNum <= 0: - self._mState = constants.eNotMe - return self.get_state() - return self.get_state() - - def get_confidence(self): - st = self.get_state() - if st == constants.eFoundIt: - return 0.99 - elif st == constants.eNotMe: - return 0.01 - bestConf = 0.0 - self._mBestGuessProber = None - for prober in self._mProbers: - if not prober: - continue - if not prober.active: - if constants._debug: - sys.stderr.write(prober.get_charset_name() - + ' not active\n') - continue - cf = prober.get_confidence() - if constants._debug: - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), cf)) - if bestConf < cf: - bestConf = cf - self._mBestGuessProber = prober - if not self._mBestGuessProber: - return 0.0 - return bestConf -# else: -# self._mBestGuessProber = self._mProbers[0] -# return self._mBestGuessProber.get_confidence() diff --git a/awx/lib/site-packages/requests/packages/charade/charsetprober.py b/awx/lib/site-packages/requests/packages/charade/charsetprober.py deleted file mode 100644 index 97581712c1..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/charsetprober.py +++ /dev/null @@ -1,62 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import re - - -class CharSetProber: - def __init__(self): - pass - - def reset(self): - self._mState = constants.eDetecting - - def get_charset_name(self): - return None - - def feed(self, aBuf): - pass - - def get_state(self): - return self._mState - - def get_confidence(self): - return 0.0 - - def filter_high_bit_only(self, aBuf): - aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf) - return aBuf - - def filter_without_english_letters(self, aBuf): - aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf) - return aBuf - - def filter_with_english_letters(self, aBuf): - # TODO - return aBuf diff --git a/awx/lib/site-packages/requests/packages/charade/codingstatemachine.py b/awx/lib/site-packages/requests/packages/charade/codingstatemachine.py deleted file mode 100644 index 1bda9ff162..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/codingstatemachine.py +++ /dev/null @@ -1,61 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart -from .compat import wrap_ord - - -class CodingStateMachine: - def __init__(self, sm): - self._mModel = sm - self._mCurrentBytePos = 0 - self._mCurrentCharLen = 0 - self.reset() - - def reset(self): - self._mCurrentState = eStart - - def next_state(self, c): - # for each byte we get its class - # if it is first byte, we also get byte length - # PY3K: aBuf is a byte stream, so c is an int, not a byte - byteCls = self._mModel['classTable'][wrap_ord(c)] - if self._mCurrentState == eStart: - self._mCurrentBytePos = 0 - self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] - # from byte's class and stateTable, we get its next state - curr_state = (self._mCurrentState * self._mModel['classFactor'] - + byteCls) - self._mCurrentState = self._mModel['stateTable'][curr_state] - self._mCurrentBytePos += 1 - return self._mCurrentState - - def get_current_charlen(self): - return self._mCurrentCharLen - - def get_coding_state_machine(self): - return self._mModel['name'] diff --git a/awx/lib/site-packages/requests/packages/charade/compat.py b/awx/lib/site-packages/requests/packages/charade/compat.py deleted file mode 100644 index d9e30addf9..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/compat.py +++ /dev/null @@ -1,34 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# Contributor(s): -# Ian Cordasco - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys - - -if sys.version_info < (3, 0): - base_str = (str, unicode) -else: - base_str = (bytes, str) - - -def wrap_ord(a): - if sys.version_info < (3, 0) and isinstance(a, base_str): - return ord(a) - else: - return a diff --git a/awx/lib/site-packages/requests/packages/charade/constants.py b/awx/lib/site-packages/requests/packages/charade/constants.py deleted file mode 100644 index a3d27de250..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/constants.py +++ /dev/null @@ -1,39 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -_debug = 0 - -eDetecting = 0 -eFoundIt = 1 -eNotMe = 2 - -eStart = 0 -eError = 1 -eItsMe = 2 - -SHORTCUT_THRESHOLD = 0.95 diff --git a/awx/lib/site-packages/requests/packages/charade/cp949prober.py b/awx/lib/site-packages/requests/packages/charade/cp949prober.py deleted file mode 100644 index 543501fe09..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/cp949prober.py +++ /dev/null @@ -1,44 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import CP949SMModel - - -class CP949Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(CP949SMModel) - # NOTE: CP949 is a superset of EUC-KR, so the distribution should be - # not different. - self._mDistributionAnalyzer = EUCKRDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "CP949" diff --git a/awx/lib/site-packages/requests/packages/charade/escprober.py b/awx/lib/site-packages/requests/packages/charade/escprober.py deleted file mode 100644 index 0063935ce6..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/escprober.py +++ /dev/null @@ -1,86 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -from .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, - ISO2022KRSMModel) -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .compat import wrap_ord - - -class EscCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = [ - CodingStateMachine(HZSMModel), - CodingStateMachine(ISO2022CNSMModel), - CodingStateMachine(ISO2022JPSMModel), - CodingStateMachine(ISO2022KRSMModel) - ] - self.reset() - - def reset(self): - CharSetProber.reset(self) - for codingSM in self._mCodingSM: - if not codingSM: - continue - codingSM.active = True - codingSM.reset() - self._mActiveSM = len(self._mCodingSM) - self._mDetectedCharset = None - - def get_charset_name(self): - return self._mDetectedCharset - - def get_confidence(self): - if self._mDetectedCharset: - return 0.99 - else: - return 0.00 - - def feed(self, aBuf): - for c in aBuf: - # PY3K: aBuf is a byte array, so c is an int, not a byte - for codingSM in self._mCodingSM: - if not codingSM: - continue - if not codingSM.active: - continue - codingState = codingSM.next_state(wrap_ord(c)) - if codingState == constants.eError: - codingSM.active = False - self._mActiveSM -= 1 - if self._mActiveSM <= 0: - self._mState = constants.eNotMe - return self.get_state() - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - self._mDetectedCharset = codingSM.get_coding_state_machine() # nopep8 - return self.get_state() - - return self.get_state() diff --git a/awx/lib/site-packages/requests/packages/charade/escsm.py b/awx/lib/site-packages/requests/packages/charade/escsm.py deleted file mode 100644 index 1cf3aa6db6..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/escsm.py +++ /dev/null @@ -1,242 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart, eError, eItsMe - -HZ_cls = ( -1,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,0,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,4,0,5,2,0, # 78 - 7f -1,1,1,1,1,1,1,1, # 80 - 87 -1,1,1,1,1,1,1,1, # 88 - 8f -1,1,1,1,1,1,1,1, # 90 - 97 -1,1,1,1,1,1,1,1, # 98 - 9f -1,1,1,1,1,1,1,1, # a0 - a7 -1,1,1,1,1,1,1,1, # a8 - af -1,1,1,1,1,1,1,1, # b0 - b7 -1,1,1,1,1,1,1,1, # b8 - bf -1,1,1,1,1,1,1,1, # c0 - c7 -1,1,1,1,1,1,1,1, # c8 - cf -1,1,1,1,1,1,1,1, # d0 - d7 -1,1,1,1,1,1,1,1, # d8 - df -1,1,1,1,1,1,1,1, # e0 - e7 -1,1,1,1,1,1,1,1, # e8 - ef -1,1,1,1,1,1,1,1, # f0 - f7 -1,1,1,1,1,1,1,1, # f8 - ff -) - -HZ_st = ( -eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f -eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 - 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f - 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 - 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f -) - -HZCharLenTable = (0, 0, 0, 0, 0, 0) - -HZSMModel = {'classTable': HZ_cls, - 'classFactor': 6, - 'stateTable': HZ_st, - 'charLenTable': HZCharLenTable, - 'name': "HZ-GB-2312"} - -ISO2022CN_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,3,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,4,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022CN_st = ( -eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 -eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f -eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 -eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 - 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 -eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f -) - -ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022CNSMModel = {'classTable': ISO2022CN_cls, - 'classFactor': 9, - 'stateTable': ISO2022CN_st, - 'charLenTable': ISO2022CNCharLenTable, - 'name': "ISO-2022-CN"} - -ISO2022JP_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,2,2, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,7,0,0,0, # 20 - 27 -3,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -6,0,4,0,8,0,0,0, # 40 - 47 -0,9,5,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022JP_st = ( -eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 -eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 -eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f -eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 -eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f -eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f -eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 -) - -ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022JPSMModel = {'classTable': ISO2022JP_cls, - 'classFactor': 10, - 'stateTable': ISO2022JP_st, - 'charLenTable': ISO2022JPCharLenTable, - 'name': "ISO-2022-JP"} - -ISO2022KR_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,3,0,0,0, # 20 - 27 -0,4,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,5,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022KR_st = ( -eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f -eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 -eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f -eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 -) - -ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) - -ISO2022KRSMModel = {'classTable': ISO2022KR_cls, - 'classFactor': 6, - 'stateTable': ISO2022KR_st, - 'charLenTable': ISO2022KRCharLenTable, - 'name': "ISO-2022-KR"} - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/eucjpprober.py b/awx/lib/site-packages/requests/packages/charade/eucjpprober.py deleted file mode 100644 index d70cfbbb01..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/eucjpprober.py +++ /dev/null @@ -1,90 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCJPDistributionAnalysis -from .jpcntx import EUCJPContextAnalysis -from .mbcssm import EUCJPSMModel - - -class EUCJPProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCJPSMModel) - self._mDistributionAnalyzer = EUCJPDistributionAnalysis() - self._mContextAnalyzer = EUCJPContextAnalysis() - self.reset() - - def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() - - def get_charset_name(self): - return "EUC-JP" - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar, charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) diff --git a/awx/lib/site-packages/requests/packages/charade/euckrfreq.py b/awx/lib/site-packages/requests/packages/charade/euckrfreq.py deleted file mode 100644 index a179e4c21c..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/euckrfreq.py +++ /dev/null @@ -1,596 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology - -# 128 --> 0.79 -# 256 --> 0.92 -# 512 --> 0.986 -# 1024 --> 0.99944 -# 2048 --> 0.99999 -# -# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 -# Random Distribution Ration = 512 / (2350-512) = 0.279. -# -# Typical Distribution Ratio - -EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 - -EUCKR_TABLE_SIZE = 2352 - -# Char to FreqOrder table , -EUCKRCharToFreqOrder = ( \ - 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, -1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, -1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, - 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, - 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, - 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, -1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, - 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, - 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, -1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, -1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, -1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, -1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, -1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, - 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, -1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, -1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, -1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, -1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, - 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, -1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, - 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, - 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, -1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, - 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, -1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, - 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, - 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, -1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, -1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, -1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, -1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, - 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, -1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, - 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, - 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, -1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, -1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, -1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, -1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, -1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, -1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, - 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, - 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, - 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, -1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, - 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, -1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, - 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, - 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, -2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, - 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, - 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, -2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, -2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, - 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, - 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, -2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, - 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, -1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, -2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, -1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, -2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, -2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, -1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, - 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, -2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, -2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, - 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, - 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, -2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, -1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, -2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, -2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, -2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, -2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, -2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, -2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, -1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, -2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, -2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, -2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, -2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, -2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, -1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, -1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, -2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, -1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, -2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, -1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, - 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, -2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, - 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, -2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, - 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, -2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, -2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, - 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, -2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, -1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, - 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, -1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, -2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, -1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, -2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, - 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, -2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, -1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, -2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, -1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, -2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, -1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, - 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, -2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, -2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, - 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, - 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, -1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, -1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, - 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, -2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, -2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, - 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, - 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, - 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, -2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, - 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, - 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, -2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, -2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, - 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, -2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, -1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, - 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, -2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, -2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, -2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, - 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, - 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, - 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, -2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, -2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, -2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, -1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, -2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, - 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 -#Everything below is of no interest for detection purpose -2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, -2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, -2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, -2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, -2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, -2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, -2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, -2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, -2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, -2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, -2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, -2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, -2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, -2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, -1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, -2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, -2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, -2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, -2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, -2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, -2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, -2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, -2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, -2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, -3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, -3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, -3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, -3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, -3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, -3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, -3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, -3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, -3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, -3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, -3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, -3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, -3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, -3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, -3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, -3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, -3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, -3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, -3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, -3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, -3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, -3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, -3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, -3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, -3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, -3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, -3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, -3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, -3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, -3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, -3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, -3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, -1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, -1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, -3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, -3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, -3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, -3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, -3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, -3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, -3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, -3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, -3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, -3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, -3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, -3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, -3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, -1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, -3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, -3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, -3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, -3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, -3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, -3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, -3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, -1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, -3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, -3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, -3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, -3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, -1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, -3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, -3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, -3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, -3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, -3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, -3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, -3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, -4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, -4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, -1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, -4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, -4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, -4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, -4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, -4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, -4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, -4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, -4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, -4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, -4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, -4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, -4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, -4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, -4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, -4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, -4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, -4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, -4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, -4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, -4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, -4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, -4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, -4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, -4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, -4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, -4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, -4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, -4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, -4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, -4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, -4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, -4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, -4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, -4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, -4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, -4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, -4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, -4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, -4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, -4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, -4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, -4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, -1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, -4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, -4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, -4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, -4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, -4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, -4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, -4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, -4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, -4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, -4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, -4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, -4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, -4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, -4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, -4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, -4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, -4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, -4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, -4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, -4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, -5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, -5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, -1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, -5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, -5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, -5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, -5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, -5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, -1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, -5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, -5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, -5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, -5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, -5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, -1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, -5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, -5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, -5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, -5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, -5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, -5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, -5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, -5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, -5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, -5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, -5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, -5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, -5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, -5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, -5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, -5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, -5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, -5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, -5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, -5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, -5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, -5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, -5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, -1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, -5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, -5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, -5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, -5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, -1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, -5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, -5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, -5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, -5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, -5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, -1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, -5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, -1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, -5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, -5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, -5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, -5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, -5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, -5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, -5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, -5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, -5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, -5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, -5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, -5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, -5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, -5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, -6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, -6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, -6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, -6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, -6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, -6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, -6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, -6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, -6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, -6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, -6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, -6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, -6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, -6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, -6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, -6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, -6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, #1024 -6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, -6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, -6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, -6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, -6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, -6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, -6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, -6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, -6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, -6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, -6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, -6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, -6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, -6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, -6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, -6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, -6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, -6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, -1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, -6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, -6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, -6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, -6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, -6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, -1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, -6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, -1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, -6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, -6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, -6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, -1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, -6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, -6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, -6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, -6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, -6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, -6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, -6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, -6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, -6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, -6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, -6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, -6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, -6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, -6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, -6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, -6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, -6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, -7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, -7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, -7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, -7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, -7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, -7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, -7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, -7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, -7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, -7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, -7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, -7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, -7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, -7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, -7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, -7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, -7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, -7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, -7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, -7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, -7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, -7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, -7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, -7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, -7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, -7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, -7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, -7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, -7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, -7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, -7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, -7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, -7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, -7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, -7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, -7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, -7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, -7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, -7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, -7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, -7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, -7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, -7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, -7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, -7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, -7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, -7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, -7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, -7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, -7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, -7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, -7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, -7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, -7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, -7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, -7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, -7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, -8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, -8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, -8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, -8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, -8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, -8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, -8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, -8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, -8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, -8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, -8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, -8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, -8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, -8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, -8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, -8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, -8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, -8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, -8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, -8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, -8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, -8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, -8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, -8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, -8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, -8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, -8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, -8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, -8736,8737,8738,8739,8740,8741) - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/euckrprober.py b/awx/lib/site-packages/requests/packages/charade/euckrprober.py deleted file mode 100644 index def3e42902..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/euckrprober.py +++ /dev/null @@ -1,42 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKRSMModel - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCKRSMModel) - self._mDistributionAnalyzer = EUCKRDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "EUC-KR" diff --git a/awx/lib/site-packages/requests/packages/charade/euctwfreq.py b/awx/lib/site-packages/requests/packages/charade/euctwfreq.py deleted file mode 100644 index 576e7504dc..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/euctwfreq.py +++ /dev/null @@ -1,428 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# EUCTW frequency table -# Converted from big5 work -# by Taiwan's Mandarin Promotion Council -# <http:#www.edu.tw:81/mandr/> - -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -# Char to FreqOrder table , -EUCTW_TABLE_SIZE = 8102 - -EUCTWCharToFreqOrder = ( - 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 -3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 -1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 - 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 -3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 -4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 -7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 - 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 - 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 - 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 -2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 -1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 -3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 - 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 -3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 -2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 - 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 -3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 -1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 -7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 - 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 -7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 -1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 - 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 - 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 -3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 -3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 - 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 -2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 -2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 - 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 - 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 -3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 -1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 -1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 -1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 -2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 - 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 -4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 -1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 -7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 -2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 - 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 - 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 - 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 - 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 -7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 - 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 -1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 - 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 - 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 -7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 -1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 - 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 -3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 -4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 -3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 - 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 - 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 -1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 -4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 -3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 -3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 -2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 -7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 -3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 -7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 -1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 -2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 -1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 - 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 -1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 -4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 -3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 - 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 - 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 - 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 -2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 -7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 -1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 -2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 -1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 -1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 -7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 -7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 -7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 -3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 -4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 -1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 -7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 -2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 -7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 -3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 -3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 -7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 -2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 -7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 - 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 -4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 -2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 -7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 -3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 -2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 -2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 - 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 -2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 -1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 -1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 -2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 -1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 -7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 -7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 -2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 -4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 -1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 -7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 - 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 -4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 - 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 -2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 - 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 -1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 -1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 - 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 -3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 -3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 -1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 -3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 -7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 -7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 -1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 -2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 -1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 -3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 -2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 -3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 -2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 -4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 -4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 -3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 - 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 -3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 - 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 -3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 -3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 -3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 -1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 -7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 - 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 -7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 -1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 - 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 -4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 -3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 - 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 -2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 -2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 -3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 -1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 -4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 -2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 -1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 -1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 -2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 -3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 -1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 -7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 -1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 -4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 -1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 - 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 -1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 -3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 -3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 -2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 -1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 -4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 - 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 -7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 -2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 -3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 -4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 - 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 -7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 -7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 -1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 -4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 -3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 -2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 -3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 -3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 -2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 -1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 -4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 -3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 -3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 -2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 -4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 -7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 -3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 -2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 -3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 -1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 -2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 -3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 -4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 -2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 -2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 -7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 -1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 -2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 -1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 -3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 -4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 -2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 -3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 -3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 -2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 -4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 -2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 -3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 -4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 -7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 -3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 - 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 -1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 -4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 -1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 -4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 -7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 - 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 -7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 -2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 -1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 -1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 -3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 - 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 - 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 - 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 -3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 -2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 - 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 -7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 -1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 -3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 -7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 -1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 -7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 -4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 -1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 -2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 -2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 -4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 - 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 - 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 -3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 -3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 -1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 -2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 -7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 -1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 -1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 -3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 - 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 -1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 -4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 -7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 -2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 -3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 - 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 -1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 -2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 -2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 -7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 -7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 -7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 -2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 -2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 -1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 -4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 -3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 -3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 -4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 -4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 -2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 -2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 -7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 -4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 -7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 -2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 -1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 -3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 -4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 -2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 - 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 -2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 -1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 -2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 -2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 -4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 -7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 -1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 -3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 -7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 -1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 -8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 -2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 -8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 -2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 -2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 -8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 -8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 -8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 - 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 -8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 -4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 -3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 -8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 -1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 -8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 - 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 -1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 - 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 -4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 -1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 -4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 -1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 - 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 -3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 -4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 -8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 - 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 -3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 - 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 -2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 -#Everything below is of no interest for detection purpose -2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118 -2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134 -8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150 -8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166 -8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182 -8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198 -8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214 -8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230 -8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246 -8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262 -8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294 -8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310 -8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326 -8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342 -8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358 -8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374 -8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390 -8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406 -8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422 -8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438 -8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454 -8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470 -8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486 -8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502 -8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518 -8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534 -8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550 -8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566 -8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582 -8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598 -8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614 -8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630 -8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646 -8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662 -8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678 -8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694 -8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710 -8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726 -8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742 - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/euctwprober.py b/awx/lib/site-packages/requests/packages/charade/euctwprober.py deleted file mode 100644 index e601adfdc6..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/euctwprober.py +++ /dev/null @@ -1,41 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTWSMModel - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCTWSMModel) - self._mDistributionAnalyzer = EUCTWDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "EUC-TW" diff --git a/awx/lib/site-packages/requests/packages/charade/gb2312freq.py b/awx/lib/site-packages/requests/packages/charade/gb2312freq.py deleted file mode 100644 index 1238f510fc..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/gb2312freq.py +++ /dev/null @@ -1,472 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# GB2312 most frequently used character table -# -# Char to FreqOrder table , from hz6763 - -# 512 --> 0.79 -- 0.79 -# 1024 --> 0.92 -- 0.13 -# 2048 --> 0.98 -- 0.06 -# 6768 --> 1.00 -- 0.02 -# -# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 -# Random Distribution Ration = 512 / (3755 - 512) = 0.157 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR - -GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 - -GB2312_TABLE_SIZE = 3760 - -GB2312CharToFreqOrder = ( -1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, -2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, -2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, - 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, -1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, -1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, - 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, -1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, -2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, -3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, - 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, -1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, - 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, -2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, - 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, -2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, -1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, -3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, - 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, -1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, - 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, -2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, -1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, -3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, -1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, -2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, -1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, - 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, -3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, -3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, - 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, -3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, - 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, -1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, -3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, -2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, -1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, - 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, -1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, -4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, - 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, -3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, -3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, - 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, -1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, -2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, -1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, -1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, - 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, -3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, -3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, -4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, - 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, -3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, -1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, -1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, -4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, - 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, - 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, -3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, -1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, - 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, -1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, -2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, - 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, - 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, - 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, -3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, -4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, -3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, - 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, -2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, -2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, -2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, - 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, -2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, - 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, - 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, - 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, -3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, -2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, -2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, -1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, - 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, -2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, - 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, - 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, -1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, -1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, - 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, - 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, -1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, -2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, -3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, -2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, -2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, -2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, -3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, -1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, -1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, -2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, -1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, -3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, -1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, -1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, -3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, - 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, -2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, -1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, -4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, -1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, -1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, -3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, -1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, - 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, - 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, -1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, - 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, -1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, -1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, - 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, -3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, -4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, -3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, -2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, -2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, -1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, -3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, -2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, -1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, -1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, - 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, -2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, -2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, -3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, -4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, -3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, - 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, -3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, -2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, -1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, - 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, - 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, -3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, -4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, -2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, -1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, -1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, - 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, -1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, -3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, - 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, - 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, -1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, - 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, -1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, - 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, -2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, - 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, -2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, -2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, -1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, -1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, -2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, - 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, -1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, -1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, -2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, -2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, -3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, -1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, -4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, - 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, - 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, -3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, -1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, - 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, -3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, -1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, -4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, -1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, -2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, -1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, - 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, -1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, -3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, - 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, -2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, - 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, -1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, -1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, -1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, -3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, -2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, -3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, -3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, -3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, - 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, -2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, - 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, -2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, - 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, -1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, - 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, - 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, -1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, -3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, -3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, -1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, -1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, -3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, -2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, -2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, -1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, -3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, - 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, -4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, -1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, -2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, -3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, -3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, -1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, - 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, - 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, -2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, - 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, -1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, - 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, -1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, -1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, -1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, -1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, -1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, - 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, - 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, # last 512 -#Everything below is of no interest for detection purpose -5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, -5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, -5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, -3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, -4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, -5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, -5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, -4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, -4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, -4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, -4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, -3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, -6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, -4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, -6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, -4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, -4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, -4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, -5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, -3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, -4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, -3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, -4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, -4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, -6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, -6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, -5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, -4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, -6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, -4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, -5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, -5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, -5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, -6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, -3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, -6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, -4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, -5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, -6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, -6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, -4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, -5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, -4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, -5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, -5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, -4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, -4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, -5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, -4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, -4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, -5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, -4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, -4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, -4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, -5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, -5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, -4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, -3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, -4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, -6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, -5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, -5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, -4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, -6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, -5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, -6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, -4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, -5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, -5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, -3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, -5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, -6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, -4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, -6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, -4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, -4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, -6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, -3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, -6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, -4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, -3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, -3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, -3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, -4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, -2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, -5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, -4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, -5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, -5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, -5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, -4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, -5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, -4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, -5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, -1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, -3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, -4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, -4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, -6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, -4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, -5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, -3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, -5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, -5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, -5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, -3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, -5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, -5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, -3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, -5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, -5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, -5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, -6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, -4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, -6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, -4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, -3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, -4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, -5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, -5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, -5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, -3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, -3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, -6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, -6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, -5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, -6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, -6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, -6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, -6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, -6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, -5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, -6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, -6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, -3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, -3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, -4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, -4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, -3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, -5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, -5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, -5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, -5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, -5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, -4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, -5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, -6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, -5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, -4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, -4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, -6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, -3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, -4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, -4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, -5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, -6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, -6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, -4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, -6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, -5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, -5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, -5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, -5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, -5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, -4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, -5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, -5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, -5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, -5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, -6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, -4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, -5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, -4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, -4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, -6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, -4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, -6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, -3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, -5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, -6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, -6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, -6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, -5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, -6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, -6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, -3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, -5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, -4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767) - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/gb2312prober.py b/awx/lib/site-packages/requests/packages/charade/gb2312prober.py deleted file mode 100644 index 643fe2519e..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/gb2312prober.py +++ /dev/null @@ -1,41 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312SMModel - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(GB2312SMModel) - self._mDistributionAnalyzer = GB2312DistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "GB2312" diff --git a/awx/lib/site-packages/requests/packages/charade/hebrewprober.py b/awx/lib/site-packages/requests/packages/charade/hebrewprober.py deleted file mode 100644 index 90d171f302..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/hebrewprober.py +++ /dev/null @@ -1,283 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Shy Shalom -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .constants import eNotMe, eDetecting -from .compat import wrap_ord - -# This prober doesn't actually recognize a language or a charset. -# It is a helper prober for the use of the Hebrew model probers - -### General ideas of the Hebrew charset recognition ### -# -# Four main charsets exist in Hebrew: -# "ISO-8859-8" - Visual Hebrew -# "windows-1255" - Logical Hebrew -# "ISO-8859-8-I" - Logical Hebrew -# "x-mac-hebrew" - ?? Logical Hebrew ?? -# -# Both "ISO" charsets use a completely identical set of code points, whereas -# "windows-1255" and "x-mac-hebrew" are two different proper supersets of -# these code points. windows-1255 defines additional characters in the range -# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific -# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. -# x-mac-hebrew defines similar additional code points but with a different -# mapping. -# -# As far as an average Hebrew text with no diacritics is concerned, all four -# charsets are identical with respect to code points. Meaning that for the -# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters -# (including final letters). -# -# The dominant difference between these charsets is their directionality. -# "Visual" directionality means that the text is ordered as if the renderer is -# not aware of a BIDI rendering algorithm. The renderer sees the text and -# draws it from left to right. The text itself when ordered naturally is read -# backwards. A buffer of Visual Hebrew generally looks like so: -# "[last word of first line spelled backwards] [whole line ordered backwards -# and spelled backwards] [first word of first line spelled backwards] -# [end of line] [last word of second line] ... etc' " -# adding punctuation marks, numbers and English text to visual text is -# naturally also "visual" and from left to right. -# -# "Logical" directionality means the text is ordered "naturally" according to -# the order it is read. It is the responsibility of the renderer to display -# the text from right to left. A BIDI algorithm is used to place general -# punctuation marks, numbers and English text in the text. -# -# Texts in x-mac-hebrew are almost impossible to find on the Internet. From -# what little evidence I could find, it seems that its general directionality -# is Logical. -# -# To sum up all of the above, the Hebrew probing mechanism knows about two -# charsets: -# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are -# backwards while line order is natural. For charset recognition purposes -# the line order is unimportant (In fact, for this implementation, even -# word order is unimportant). -# Logical Hebrew - "windows-1255" - normal, naturally ordered text. -# -# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be -# specifically identified. -# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew -# that contain special punctuation marks or diacritics is displayed with -# some unconverted characters showing as question marks. This problem might -# be corrected using another model prober for x-mac-hebrew. Due to the fact -# that x-mac-hebrew texts are so rare, writing another model prober isn't -# worth the effort and performance hit. -# -#### The Prober #### -# -# The prober is divided between two SBCharSetProbers and a HebrewProber, -# all of which are managed, created, fed data, inquired and deleted by the -# SBCSGroupProber. The two SBCharSetProbers identify that the text is in -# fact some kind of Hebrew, Logical or Visual. The final decision about which -# one is it is made by the HebrewProber by combining final-letter scores -# with the scores of the two SBCharSetProbers to produce a final answer. -# -# The SBCSGroupProber is responsible for stripping the original text of HTML -# tags, English characters, numbers, low-ASCII punctuation characters, spaces -# and new lines. It reduces any sequence of such characters to a single space. -# The buffer fed to each prober in the SBCS group prober is pure text in -# high-ASCII. -# The two SBCharSetProbers (model probers) share the same language model: -# Win1255Model. -# The first SBCharSetProber uses the model normally as any other -# SBCharSetProber does, to recognize windows-1255, upon which this model was -# built. The second SBCharSetProber is told to make the pair-of-letter -# lookup in the language model backwards. This in practice exactly simulates -# a visual Hebrew model using the windows-1255 logical Hebrew model. -# -# The HebrewProber is not using any language model. All it does is look for -# final-letter evidence suggesting the text is either logical Hebrew or visual -# Hebrew. Disjointed from the model probers, the results of the HebrewProber -# alone are meaningless. HebrewProber always returns 0.00 as confidence -# since it never identifies a charset by itself. Instead, the pointer to the -# HebrewProber is passed to the model probers as a helper "Name Prober". -# When the Group prober receives a positive identification from any prober, -# it asks for the name of the charset identified. If the prober queried is a -# Hebrew model prober, the model prober forwards the call to the -# HebrewProber to make the final decision. In the HebrewProber, the -# decision is made according to the final-letters scores maintained and Both -# model probers scores. The answer is returned in the form of the name of the -# charset identified, either "windows-1255" or "ISO-8859-8". - -# windows-1255 / ISO-8859-8 code points of interest -FINAL_KAF = 0xea -NORMAL_KAF = 0xeb -FINAL_MEM = 0xed -NORMAL_MEM = 0xee -FINAL_NUN = 0xef -NORMAL_NUN = 0xf0 -FINAL_PE = 0xf3 -NORMAL_PE = 0xf4 -FINAL_TSADI = 0xf5 -NORMAL_TSADI = 0xf6 - -# Minimum Visual vs Logical final letter score difference. -# If the difference is below this, don't rely solely on the final letter score -# distance. -MIN_FINAL_CHAR_DISTANCE = 5 - -# Minimum Visual vs Logical model score difference. -# If the difference is below this, don't rely at all on the model score -# distance. -MIN_MODEL_DISTANCE = 0.01 - -VISUAL_HEBREW_NAME = "ISO-8859-8" -LOGICAL_HEBREW_NAME = "windows-1255" - - -class HebrewProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mLogicalProber = None - self._mVisualProber = None - self.reset() - - def reset(self): - self._mFinalCharLogicalScore = 0 - self._mFinalCharVisualScore = 0 - # The two last characters seen in the previous buffer, - # mPrev and mBeforePrev are initialized to space in order to simulate - # a word delimiter at the beginning of the data - self._mPrev = ' ' - self._mBeforePrev = ' ' - # These probers are owned by the group prober. - - def set_model_probers(self, logicalProber, visualProber): - self._mLogicalProber = logicalProber - self._mVisualProber = visualProber - - def is_final(self, c): - return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, - FINAL_TSADI] - - def is_non_final(self, c): - # The normal Tsadi is not a good Non-Final letter due to words like - # 'lechotet' (to chat) containing an apostrophe after the tsadi. This - # apostrophe is converted to a space in FilterWithoutEnglishLetters - # causing the Non-Final tsadi to appear at an end of a word even - # though this is not the case in the original text. - # The letters Pe and Kaf rarely display a related behavior of not being - # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' - # for example legally end with a Non-Final Pe or Kaf. However, the - # benefit of these letters as Non-Final letters outweighs the damage - # since these words are quite rare. - return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] - - def feed(self, aBuf): - # Final letter analysis for logical-visual decision. - # Look for evidence that the received buffer is either logical Hebrew - # or visual Hebrew. - # The following cases are checked: - # 1) A word longer than 1 letter, ending with a final letter. This is - # an indication that the text is laid out "naturally" since the - # final letter really appears at the end. +1 for logical score. - # 2) A word longer than 1 letter, ending with a Non-Final letter. In - # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, - # should not end with the Non-Final form of that letter. Exceptions - # to this rule are mentioned above in isNonFinal(). This is an - # indication that the text is laid out backwards. +1 for visual - # score - # 3) A word longer than 1 letter, starting with a final letter. Final - # letters should not appear at the beginning of a word. This is an - # indication that the text is laid out backwards. +1 for visual - # score. - # - # The visual score and logical score are accumulated throughout the - # text and are finally checked against each other in GetCharSetName(). - # No checking for final letters in the middle of words is done since - # that case is not an indication for either Logical or Visual text. - # - # We automatically filter out all 7-bit characters (replace them with - # spaces) so the word boundary detection works properly. [MAP] - - if self.get_state() == eNotMe: - # Both model probers say it's not them. No reason to continue. - return eNotMe - - aBuf = self.filter_high_bit_only(aBuf) - - for cur in aBuf: - if cur == ' ': - # We stand on a space - a word just ended - if self._mBeforePrev != ' ': - # next-to-last char was not a space so self._mPrev is not a - # 1 letter word - if self.is_final(self._mPrev): - # case (1) [-2:not space][-1:final letter][cur:space] - self._mFinalCharLogicalScore += 1 - elif self.is_non_final(self._mPrev): - # case (2) [-2:not space][-1:Non-Final letter][ - # cur:space] - self._mFinalCharVisualScore += 1 - else: - # Not standing on a space - if ((self._mBeforePrev == ' ') and - (self.is_final(self._mPrev)) and (cur != ' ')): - # case (3) [-2:space][-1:final letter][cur:not space] - self._mFinalCharVisualScore += 1 - self._mBeforePrev = self._mPrev - self._mPrev = cur - - # Forever detecting, till the end or until both model probers return - # eNotMe (handled above) - return eDetecting - - def get_charset_name(self): - # Make the decision: is it Logical or Visual? - # If the final letter score distance is dominant enough, rely on it. - finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore - if finalsub >= MIN_FINAL_CHAR_DISTANCE: - return LOGICAL_HEBREW_NAME - if finalsub <= -MIN_FINAL_CHAR_DISTANCE: - return VISUAL_HEBREW_NAME - - # It's not dominant enough, try to rely on the model scores instead. - modelsub = (self._mLogicalProber.get_confidence() - - self._mVisualProber.get_confidence()) - if modelsub > MIN_MODEL_DISTANCE: - return LOGICAL_HEBREW_NAME - if modelsub < -MIN_MODEL_DISTANCE: - return VISUAL_HEBREW_NAME - - # Still no good, back to final letter distance, maybe it'll save the - # day. - if finalsub < 0.0: - return VISUAL_HEBREW_NAME - - # (finalsub > 0 - Logical) or (don't know what to do) default to - # Logical. - return LOGICAL_HEBREW_NAME - - def get_state(self): - # Remain active as long as any of the model probers are active. - if (self._mLogicalProber.get_state() == eNotMe) and \ - (self._mVisualProber.get_state() == eNotMe): - return eNotMe - return eDetecting diff --git a/awx/lib/site-packages/requests/packages/charade/jisfreq.py b/awx/lib/site-packages/requests/packages/charade/jisfreq.py deleted file mode 100644 index 064345b086..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/jisfreq.py +++ /dev/null @@ -1,569 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology -# -# Japanese frequency table, applied to both S-JIS and EUC-JP -# They are sorted in order. - -# 128 --> 0.77094 -# 256 --> 0.85710 -# 512 --> 0.92635 -# 1024 --> 0.97130 -# 2048 --> 0.99431 -# -# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 -# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 -# -# Typical Distribution Ratio, 25% of IDR - -JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 - -# Char to FreqOrder table , -JIS_TABLE_SIZE = 4368 - -JISCharToFreqOrder = ( - 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 -3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 -1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 -2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 -2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 -5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 -1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 -5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 -5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 -5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 -5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 -5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 -5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 -1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 -1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 -1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 -2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 -3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 -3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 - 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 - 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 -1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 - 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 -5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 - 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 - 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 - 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 - 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 - 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 -5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 -5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 -5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 -4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 -5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 -5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 -5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 -5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 -5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 -5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 -5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 -5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 -5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 -3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 -5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 -5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 -5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 -5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 -5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 -5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 -5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 -5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 -5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 -5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 -5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 -5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 -5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 -5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 -5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 -5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 -5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 -5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 -5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 -5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 -5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 -5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 -5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 -5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 -5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 -5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 -5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 -5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 -5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 -5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 -5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 -5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 -5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 -5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 -5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 -5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 -6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 -6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 -6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 -6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 -6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 -6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 -6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 -6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 -4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 - 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 - 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 -1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 -1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 - 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 -3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 -3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 - 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 -3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 -3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 - 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 -2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 - 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 -3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 -1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 - 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 -1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 - 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 -2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 -2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 -2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 -2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 -1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 -1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 -1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 -1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 -2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 -1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 -2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 -1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 -1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 -1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 -1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 -1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 -1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 - 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 - 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 -1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 -2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 -2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 -2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 -3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 -3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 - 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 -3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 -1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 - 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 -2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 -1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 - 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 -3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 -4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 -2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 -1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 -2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 -1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 - 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 - 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 -1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 -2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 -2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 -2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 -3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 -1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 -2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 - 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 - 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 - 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 -1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 -2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 - 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 -1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 -1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 - 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 -1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 -1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 -1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 - 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 -2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 - 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 -2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 -3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 -2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 -1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 -6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 -1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 -2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 -1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 - 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 - 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 -3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 -3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 -1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 -1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 -1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 -1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 - 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 - 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 -2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 - 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 -3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 -2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 - 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 -1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 -2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 - 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 -1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 - 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 -4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 -2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 -1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 - 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 -1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 -2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 - 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 -6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 -1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 -1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 -2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 -3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 - 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 -3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 -1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 - 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 -1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 - 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 -3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 - 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 -2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 - 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 -4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 -2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 -1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 -1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 -1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 - 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 -1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 -3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 -1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 -3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 - 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 - 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 - 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 -2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 -1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 - 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 -1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 - 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 -1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 - 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 - 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 - 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 -1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 -1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 -2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 -4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 - 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 -1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 - 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 -1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 -3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 -1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 -2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 -2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 -1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 -1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 -2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 - 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 -2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 -1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 -1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 -1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 -1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 -3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 -2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 -2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 - 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 -3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 -3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 -1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 -2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 -1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 -2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 -#Everything below is of no interest for detection purpose -2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384 -6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400 -6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416 -6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432 -6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448 -4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464 -4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480 -3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496 -3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512 -4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528 -3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544 -6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560 -4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576 -6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592 -6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608 -6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624 -6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640 -6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656 -6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672 -3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688 -3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704 -6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720 -2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736 -4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752 -4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768 -4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784 -6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800 -3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816 -4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832 -4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848 -6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864 -4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880 -6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896 -3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912 -2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928 -4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944 -2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960 -6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976 -4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992 -6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008 -6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024 -6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040 -4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056 -6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072 -2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088 -6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104 -4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120 -6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136 -4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152 -4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168 -6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184 -6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200 -6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216 -3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232 -1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248 -3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264 -3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280 -4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296 -6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312 -3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328 -6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344 -3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360 -3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376 -2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392 -6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408 -6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424 -3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440 -6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456 -3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472 -6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488 -6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504 -6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520 -4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536 -6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552 -4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568 -3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584 -3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600 -6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616 -6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632 -4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648 -6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664 -6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680 -6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696 -6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712 -6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728 -6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744 -4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760 -4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776 -3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792 -6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808 -4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824 -2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840 -6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856 -6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872 -4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888 -2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904 -4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920 -2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936 -4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952 -4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968 -4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984 -6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000 -3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016 -6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032 -3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048 -6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064 -2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080 -3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096 -7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112 -2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128 -3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144 -3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160 -3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176 -3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192 -7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208 -7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224 -7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240 -7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256 -7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272 -4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288 -3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304 -3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320 -4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336 -3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352 -3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368 -7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384 -4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400 -7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416 -7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432 -7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448 -7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464 -7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480 -4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496 -4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512 -7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528 -3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544 -4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560 -7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576 -7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592 -4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608 -3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624 -3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640 -7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656 -4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672 -4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688 -4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704 -4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720 -4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736 -4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752 -7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768 -7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784 -7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800 -7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816 -7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832 -2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848 -3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864 -7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880 -7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896 -3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912 -4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928 -3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944 -3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960 -2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976 -7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992 -7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008 -4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024 -3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040 -3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056 -7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072 -7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088 -7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104 -4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120 -7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136 -2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152 -3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168 -4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184 -7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200 -4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216 -4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232 -7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248 -7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264 -5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280 -7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296 -7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312 -7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328 -7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344 -7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360 -5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376 -5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392 -7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408 -3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424 -7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440 -7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456 -3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472 -7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488 -7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504 -1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520 -3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536 -4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552 -2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568 -3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584 -2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600 -5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616 -4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632 -4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648 -5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664 -7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680 -7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696 -7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712 -7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728 -3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744 -7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760 -3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776 -7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792 -4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808 -7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824 -7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840 -7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856 -7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872 -7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888 -7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904 -7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920 -7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936 -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952 -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968 -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984 -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000 -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016 -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032 -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048 -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064 -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080 -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096 -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112 -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128 -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144 -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160 -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176 -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192 -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208 -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224 -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240 -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256 -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272 - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/jpcntx.py b/awx/lib/site-packages/requests/packages/charade/jpcntx.py deleted file mode 100644 index e4e9e4da51..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/jpcntx.py +++ /dev/null @@ -1,219 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .compat import wrap_ord - -NUM_OF_CATEGORY = 6 -DONT_KNOW = -1 -ENOUGH_REL_THRESHOLD = 100 -MAX_REL_THRESHOLD = 1000 -MINIMUM_DATA_THRESHOLD = 4 - -# This is hiragana 2-char sequence table, the number in each cell represents its frequency category -jp2CharContext = ( -(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), -(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), -(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), -(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), -(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), -(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), -(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), -(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), -(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), -(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), -(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), -(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), -(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), -(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), -(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), -(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), -(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), -(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), -(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), -(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), -(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), -(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), -(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), -(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), -(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), -(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), -(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), -(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), -(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), -(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), -(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), -(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), -(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), -(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), -(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), -(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), -(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), -(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), -(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), -(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), -(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), -(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), -(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), -(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), -(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), -(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), -(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), -(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), -(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), -(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), -(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), -(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), -(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), -(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), -(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), -(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), -(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), -(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), -(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), -(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), -(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), -(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), -(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), -(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), -(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), -(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), -(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), -(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), -(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), -(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), -(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), -(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), -(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), -(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), -) - -class JapaneseContextAnalysis: - def __init__(self): - self.reset() - - def reset(self): - self._mTotalRel = 0 # total sequence received - # category counters, each interger counts sequence in its category - self._mRelSample = [0] * NUM_OF_CATEGORY - # if last byte in current buffer is not the last byte of a character, - # we need to know how many bytes to skip in next buffer - self._mNeedToSkipCharNum = 0 - self._mLastCharOrder = -1 # The order of previous char - # If this flag is set to True, detection is done and conclusion has - # been made - self._mDone = False - - def feed(self, aBuf, aLen): - if self._mDone: - return - - # The buffer we got is byte oriented, and a character may span in more than one - # buffers. In case the last one or two byte in last buffer is not - # complete, we record how many byte needed to complete that character - # and skip these bytes here. We can choose to record those bytes as - # well and analyse the character once it is complete, but since a - # character will not make much difference, by simply skipping - # this character will simply our logic and improve performance. - i = self._mNeedToSkipCharNum - while i < aLen: - order, charLen = self.get_order(aBuf[i:i + 2]) - i += charLen - if i > aLen: - self._mNeedToSkipCharNum = i - aLen - self._mLastCharOrder = -1 - else: - if (order != -1) and (self._mLastCharOrder != -1): - self._mTotalRel += 1 - if self._mTotalRel > MAX_REL_THRESHOLD: - self._mDone = True - break - self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 - self._mLastCharOrder = order - - def got_enough_data(self): - return self._mTotalRel > ENOUGH_REL_THRESHOLD - - def get_confidence(self): - # This is just one way to calculate confidence. It works well for me. - if self._mTotalRel > MINIMUM_DATA_THRESHOLD: - return float(self._mTotalRel - self._mRelSample[0]) / self._mTotalRel - else: - return DONT_KNOW - - def get_order(self, aBuf): - return -1, 1 - -class SJISContextAnalysis(JapaneseContextAnalysis): - def get_order(self, aBuf): - if not aBuf: - return -1, 1 - # find out current char's byte length - first_char = wrap_ord(aBuf[0]) - if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)): - charLen = 2 - else: - charLen = 1 - - # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) - if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, charLen - - return -1, charLen - -class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, aBuf): - if not aBuf: - return -1, 1 - # find out current char's byte length - first_char = wrap_ord(aBuf[0]) - if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - charLen = 2 - elif first_char == 0x8F: - charLen = 3 - else: - charLen = 1 - - # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) - if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, charLen - - return -1, charLen - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/langbulgarianmodel.py b/awx/lib/site-packages/requests/packages/charade/langbulgarianmodel.py deleted file mode 100644 index ea5a60ba04..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/langbulgarianmodel.py +++ /dev/null @@ -1,229 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -# this table is modified base on win1251BulgarianCharToOrderMap, so -# only number <64 is sure valid - -Latin5_BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 -210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 - 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 - 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 -) - -win1251BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 -221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 - 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 - 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 96.9392% -# first 1024 sequences:3.0618% -# rest sequences: 0.2992% -# negative sequences: 0.0020% -BulgarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, -3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, -0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, -0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, -0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, -0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, -0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, -2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, -3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, -1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, -3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, -1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, -2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, -2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, -3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, -1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, -2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, -2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, -1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, -2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, -2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, -2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, -1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, -2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, -1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, -3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, -1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, -3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, -1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, -2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, -1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, -2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, -1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, -2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, -1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, -2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, -1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, -1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, -1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, -1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, -0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, -1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, -1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -) - -Latin5BulgarianModel = { - 'charToOrderMap': Latin5_BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" -} - -Win1251BulgarianModel = { - 'charToOrderMap': win1251BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" -} - - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/langcyrillicmodel.py b/awx/lib/site-packages/requests/packages/charade/langcyrillicmodel.py deleted file mode 100644 index 15e338fc11..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/langcyrillicmodel.py +++ /dev/null @@ -1,329 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# KOI8-R language model -# Character Mapping Table: -KOI8R_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 -223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 -238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 - 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 - 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 - 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 - 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 -) - -win1251_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -) - -latin5_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -macCyrillic_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, -) - -IBM855_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, -206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, - 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, -220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, -230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, - 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, - 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, -250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, -) - -IBM866_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 97.6601% -# first 1024 sequences: 2.3389% -# rest sequences: 0.1237% -# negative sequences: 0.0009% -RussianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, -1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, -1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, -2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, -1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, -3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, -1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, -2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, -1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, -1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, -1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, -1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, -3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, -1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, -2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, -1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, -2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, -1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, -1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, -1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, -3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, -3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, -1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, -1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, -0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, -1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, -1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, -0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, -1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, -1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, -1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, -2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, -1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, -1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, -1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, -0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, -0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, -0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -) - -Koi8rModel = { - 'charToOrderMap': KOI8R_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "KOI8-R" -} - -Win1251CyrillicModel = { - 'charToOrderMap': win1251_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" -} - -Latin5CyrillicModel = { - 'charToOrderMap': latin5_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" -} - -MacCyrillicModel = { - 'charToOrderMap': macCyrillic_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "MacCyrillic" -}; - -Ibm866Model = { - 'charToOrderMap': IBM866_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM866" -} - -Ibm855Model = { - 'charToOrderMap': IBM855_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM855" -} - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/langgreekmodel.py b/awx/lib/site-packages/requests/packages/charade/langgreekmodel.py deleted file mode 100644 index 93241ce26b..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/langgreekmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin7_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -win1253_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.2851% -# first 1024 sequences:1.7001% -# rest sequences: 0.0359% -# negative sequences: 0.0148% -GreekLangModel = ( -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, -2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, -2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, -2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, -0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, -3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, -2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, -0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, -0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, -0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, -0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, -0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, -0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, -0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, -0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, -0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, -0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, -0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, -0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, -0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, -0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, -0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, -0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, -0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin7GreekModel = { - 'charToOrderMap': Latin7_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-7" -} - -Win1253GreekModel = { - 'charToOrderMap': win1253_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "windows-1253" -} - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/langhebrewmodel.py b/awx/lib/site-packages/requests/packages/charade/langhebrewmodel.py deleted file mode 100644 index d87132446d..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/langhebrewmodel.py +++ /dev/null @@ -1,201 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Simon Montagu -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Shoshannah Forbes - original C code (?) -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Windows-1255 language model -# Character Mapping Table: -win1255_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 - 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 -253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 - 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 -124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, -215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, - 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, -106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, - 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, -238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, - 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, - 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.4004% -# first 1024 sequences: 1.5981% -# rest sequences: 0.087% -# negative sequences: 0.0015% -HebrewLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, -3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, -1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, -1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, -1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, -1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, -0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, -0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, -0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, -0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, -0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, -0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, -0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, -0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, -0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, -0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, -0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, -0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, -0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, -1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, -1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, -2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, -0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, -0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, -) - -Win1255HebrewModel = { - 'charToOrderMap': win1255_CharToOrderMap, - 'precedenceMatrix': HebrewLangModel, - 'mTypicalPositiveRatio': 0.984004, - 'keepEnglishLetter': False, - 'charsetName': "windows-1255" -} - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/langhungarianmodel.py b/awx/lib/site-packages/requests/packages/charade/langhungarianmodel.py deleted file mode 100644 index 6f59c61260..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/langhungarianmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin2_HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, -175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, - 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, - 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, -245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -win1250HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, -177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, - 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, - 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, -245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 94.7368% -# first 1024 sequences:5.2623% -# rest sequences: 0.8894% -# negative sequences: 0.0009% -HungarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, -3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, -0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, -1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, -1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, -3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, -2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, -2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, -2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, -2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, -1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, -1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, -3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, -1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, -1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, -2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, -2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, -2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, -3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, -1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, -1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, -1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, -2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, -1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, -2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, -2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, -1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, -1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, -0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, -2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, -2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, -1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, -1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, -2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, -2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, -2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, -1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, -0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -) - -Latin2HungarianModel = { - 'charToOrderMap': Latin2_HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "ISO-8859-2" -} - -Win1250HungarianModel = { - 'charToOrderMap': win1250HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "windows-1250" -} - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/langthaimodel.py b/awx/lib/site-packages/requests/packages/charade/langthaimodel.py deleted file mode 100644 index df343a7473..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/langthaimodel.py +++ /dev/null @@ -1,200 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# The following result for thai was collected from a limited sample (1M). - -# Character Mapping Table: -TIS620CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 -188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 -253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 - 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 -209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, -223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, -236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, - 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, - 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, - 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, - 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, - 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 92.6386% -# first 1024 sequences:7.3177% -# rest sequences: 1.0230% -# negative sequences: 0.0436% -ThaiLangModel = ( -0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, -0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, -3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, -0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, -3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, -3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, -3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, -3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, -2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, -3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, -1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, -3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, -1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, -0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, -0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, -2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, -0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, -3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, -2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, -2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, -3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, -3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, -3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, -3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, -1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, -0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, -0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, -3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, -3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, -1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, -3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, -3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, -0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, -0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, -1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, -1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, -3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, -0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, -3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, -0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, -0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, -0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, -0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, -0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, -0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, -0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, -3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, -2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, -0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, -3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, -1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -TIS620ThaiModel = { - 'charToOrderMap': TIS620CharToOrderMap, - 'precedenceMatrix': ThaiLangModel, - 'mTypicalPositiveRatio': 0.926386, - 'keepEnglishLetter': False, - 'charsetName': "TIS-620" -} - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/latin1prober.py b/awx/lib/site-packages/requests/packages/charade/latin1prober.py deleted file mode 100644 index 18eefd46a5..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/latin1prober.py +++ /dev/null @@ -1,139 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .constants import eNotMe -from .compat import wrap_ord - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -CLASS_NUM = 8 # total classes - -Latin1_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 - OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F - UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 - OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF - ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF - ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 - ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF - ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 - ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -Latin1ClassModel = ( - # UDF OTH ASC ASS ACV ACO ASV ASO - 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, # ASO -) - - -class Latin1Prober(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self.reset() - - def reset(self): - self._mLastCharClass = OTH - self._mFreqCounter = [0] * FREQ_CAT_NUM - CharSetProber.reset(self) - - def get_charset_name(self): - return "windows-1252" - - def feed(self, aBuf): - aBuf = self.filter_with_english_letters(aBuf) - for c in aBuf: - charClass = Latin1_CharToClass[wrap_ord(c)] - freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) - + charClass] - if freq == 0: - self._mState = eNotMe - break - self._mFreqCounter[freq] += 1 - self._mLastCharClass = charClass - - return self.get_state() - - def get_confidence(self): - if self.get_state() == eNotMe: - return 0.01 - - total = sum(self._mFreqCounter) - if total < 0.01: - confidence = 0.0 - else: - confidence = ((float(self._mFreqCounter[3]) / total) - - (self._mFreqCounter[1] * 20.0 / total)) - if confidence < 0.0: - confidence = 0.0 - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence = confidence * 0.5 - return confidence diff --git a/awx/lib/site-packages/requests/packages/charade/mbcharsetprober.py b/awx/lib/site-packages/requests/packages/charade/mbcharsetprober.py deleted file mode 100644 index 1eee253c04..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/mbcharsetprober.py +++ /dev/null @@ -1,86 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .charsetprober import CharSetProber - - -class MultiByteCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mDistributionAnalyzer = None - self._mCodingSM = None - self._mLastChar = [0, 0] - - def reset(self): - CharSetProber.reset(self) - if self._mCodingSM: - self._mCodingSM.reset() - if self._mDistributionAnalyzer: - self._mDistributionAnalyzer.reset() - self._mLastChar = [0, 0] - - def get_charset_name(self): - pass - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mDistributionAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - return self._mDistributionAnalyzer.get_confidence() diff --git a/awx/lib/site-packages/requests/packages/charade/mbcsgroupprober.py b/awx/lib/site-packages/requests/packages/charade/mbcsgroupprober.py deleted file mode 100644 index 2f6f5e897f..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/mbcsgroupprober.py +++ /dev/null @@ -1,54 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .utf8prober import UTF8Prober -from .sjisprober import SJISProber -from .eucjpprober import EUCJPProber -from .gb2312prober import GB2312Prober -from .euckrprober import EUCKRProber -from .cp949prober import CP949Prober -from .big5prober import Big5Prober -from .euctwprober import EUCTWProber - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - CP949Prober(), - Big5Prober(), - EUCTWProber() - ] - self.reset() diff --git a/awx/lib/site-packages/requests/packages/charade/mbcssm.py b/awx/lib/site-packages/requests/packages/charade/mbcssm.py deleted file mode 100644 index 55c02f0a06..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/mbcssm.py +++ /dev/null @@ -1,575 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart, eError, eItsMe - -# BIG5 - -BIG5_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 4,4,4,4,4,4,4,4, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 4,3,3,3,3,3,3,3, # a0 - a7 - 3,3,3,3,3,3,3,3, # a8 - af - 3,3,3,3,3,3,3,3, # b0 - b7 - 3,3,3,3,3,3,3,3, # b8 - bf - 3,3,3,3,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -BIG5_st = ( - eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 - eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f - eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17 -) - -Big5CharLenTable = (0, 1, 1, 2, 0) - -Big5SMModel = {'classTable': BIG5_cls, - 'classFactor': 5, - 'stateTable': BIG5_st, - 'charLenTable': Big5CharLenTable, - 'name': 'Big5'} - -# CP949 - -CP949_cls = ( - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f - 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f - 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f - 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f - 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f - 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f - 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f - 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f - 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f - 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af - 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf - 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef - 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff -) - -CP949_st = ( -#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = - eError,eStart, 3,eError,eStart,eStart, 4, 5,eError, 6, # eStart - eError,eError,eError,eError,eError,eError,eError,eError,eError,eError, # eError - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe, # eItsMe - eError,eError,eStart,eStart,eError,eError,eError,eStart,eStart,eStart, # 3 - eError,eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 4 - eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 5 - eError,eStart,eStart,eStart,eStart,eError,eError,eStart,eStart,eStart, # 6 -) - -CP949CharLenTable = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) - -CP949SMModel = {'classTable': CP949_cls, - 'classFactor': 10, - 'stateTable': CP949_st, - 'charLenTable': CP949CharLenTable, - 'name': 'CP949'} - -# EUC-JP - -EUCJP_cls = ( - 4,4,4,4,4,4,4,4, # 00 - 07 - 4,4,4,4,4,4,5,5, # 08 - 0f - 4,4,4,4,4,4,4,4, # 10 - 17 - 4,4,4,5,4,4,4,4, # 18 - 1f - 4,4,4,4,4,4,4,4, # 20 - 27 - 4,4,4,4,4,4,4,4, # 28 - 2f - 4,4,4,4,4,4,4,4, # 30 - 37 - 4,4,4,4,4,4,4,4, # 38 - 3f - 4,4,4,4,4,4,4,4, # 40 - 47 - 4,4,4,4,4,4,4,4, # 48 - 4f - 4,4,4,4,4,4,4,4, # 50 - 57 - 4,4,4,4,4,4,4,4, # 58 - 5f - 4,4,4,4,4,4,4,4, # 60 - 67 - 4,4,4,4,4,4,4,4, # 68 - 6f - 4,4,4,4,4,4,4,4, # 70 - 77 - 4,4,4,4,4,4,4,4, # 78 - 7f - 5,5,5,5,5,5,5,5, # 80 - 87 - 5,5,5,5,5,5,1,3, # 88 - 8f - 5,5,5,5,5,5,5,5, # 90 - 97 - 5,5,5,5,5,5,5,5, # 98 - 9f - 5,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,0,5 # f8 - ff -) - -EUCJP_st = ( - 3, 4, 3, 5,eStart,eError,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 - eError,eError,eStart,eError,eError,eError, 3,eError,#18-1f - 3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27 -) - -EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) - -EUCJPSMModel = {'classTable': EUCJP_cls, - 'classFactor': 6, - 'stateTable': EUCJP_st, - 'charLenTable': EUCJPCharLenTable, - 'name': 'EUC-JP'} - -# EUC-KR - -EUCKR_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,3,3,3, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,3,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 2,2,2,2,2,2,2,2, # e0 - e7 - 2,2,2,2,2,2,2,2, # e8 - ef - 2,2,2,2,2,2,2,2, # f0 - f7 - 2,2,2,2,2,2,2,0 # f8 - ff -) - -EUCKR_st = ( - eError,eStart, 3,eError,eError,eError,eError,eError,#00-07 - eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f -) - -EUCKRCharLenTable = (0, 1, 2, 0) - -EUCKRSMModel = {'classTable': EUCKR_cls, - 'classFactor': 4, - 'stateTable': EUCKR_st, - 'charLenTable': EUCKRCharLenTable, - 'name': 'EUC-KR'} - -# EUC-TW - -EUCTW_cls = ( - 2,2,2,2,2,2,2,2, # 00 - 07 - 2,2,2,2,2,2,0,0, # 08 - 0f - 2,2,2,2,2,2,2,2, # 10 - 17 - 2,2,2,0,2,2,2,2, # 18 - 1f - 2,2,2,2,2,2,2,2, # 20 - 27 - 2,2,2,2,2,2,2,2, # 28 - 2f - 2,2,2,2,2,2,2,2, # 30 - 37 - 2,2,2,2,2,2,2,2, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,2, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,6,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,3,4,4,4,4,4,4, # a0 - a7 - 5,5,1,1,1,1,1,1, # a8 - af - 1,1,1,1,1,1,1,1, # b0 - b7 - 1,1,1,1,1,1,1,1, # b8 - bf - 1,1,3,1,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -EUCTW_st = ( - eError,eError,eStart, 3, 3, 3, 4,eError,#00-07 - eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 - eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f - 5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 - eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f -) - -EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) - -EUCTWSMModel = {'classTable': EUCTW_cls, - 'classFactor': 7, - 'stateTable': EUCTW_st, - 'charLenTable': EUCTWCharLenTable, - 'name': 'x-euc-tw'} - -# GB2312 - -GB2312_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 3,3,3,3,3,3,3,3, # 30 - 37 - 3,3,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,4, # 78 - 7f - 5,6,6,6,6,6,6,6, # 80 - 87 - 6,6,6,6,6,6,6,6, # 88 - 8f - 6,6,6,6,6,6,6,6, # 90 - 97 - 6,6,6,6,6,6,6,6, # 98 - 9f - 6,6,6,6,6,6,6,6, # a0 - a7 - 6,6,6,6,6,6,6,6, # a8 - af - 6,6,6,6,6,6,6,6, # b0 - b7 - 6,6,6,6,6,6,6,6, # b8 - bf - 6,6,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 6,6,6,6,6,6,6,6, # e0 - e7 - 6,6,6,6,6,6,6,6, # e8 - ef - 6,6,6,6,6,6,6,6, # f0 - f7 - 6,6,6,6,6,6,6,0 # f8 - ff -) - -GB2312_st = ( - eError,eStart,eStart,eStart,eStart,eStart, 3,eError,#00-07 - eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 - 4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f - eError,eError, 5,eError,eError,eError,eItsMe,eError,#20-27 - eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f -) - -# To be accurate, the length of class 6 can be either 2 or 4. -# But it is not necessary to discriminate between the two since -# it is used for frequency analysis only, and we are validing -# each code range there as well. So it is safe to set it to be -# 2 here. -GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2) - -GB2312SMModel = {'classTable': GB2312_cls, - 'classFactor': 7, - 'stateTable': GB2312_st, - 'charLenTable': GB2312CharLenTable, - 'name': 'GB2312'} - -# Shift_JIS - -SJIS_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 3,3,3,3,3,3,3,3, # 80 - 87 - 3,3,3,3,3,3,3,3, # 88 - 8f - 3,3,3,3,3,3,3,3, # 90 - 97 - 3,3,3,3,3,3,3,3, # 98 - 9f - #0xa0 is illegal in sjis encoding, but some pages does - #contain such byte. We need to be more error forgiven. - 2,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,4,4,4, # e8 - ef - 4,4,4,4,4,4,4,4, # f0 - f7 - 4,4,4,4,4,0,0,0 # f8 - ff -) - - -SJIS_st = ( - eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17 -) - -SJISCharLenTable = (0, 1, 1, 2, 0, 0) - -SJISSMModel = {'classTable': SJIS_cls, - 'classFactor': 6, - 'stateTable': SJIS_st, - 'charLenTable': SJISCharLenTable, - 'name': 'Shift_JIS'} - -# UCS2-BE - -UCS2BE_cls = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2BE_st = ( - 5, 7, 7,eError, 4, 3,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe, 6, 6, 6, 6,eError,eError,#10-17 - 6, 6, 6, 6, 6,eItsMe, 6, 6,#18-1f - 6, 6, 6, 6, 5, 7, 7,eError,#20-27 - 5, 8, 6, 6,eError, 6, 6, 6,#28-2f - 6, 6, 6, 6,eError,eError,eStart,eStart #30-37 -) - -UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) - -UCS2BESMModel = {'classTable': UCS2BE_cls, - 'classFactor': 6, - 'stateTable': UCS2BE_st, - 'charLenTable': UCS2BECharLenTable, - 'name': 'UTF-16BE'} - -# UCS2-LE - -UCS2LE_cls = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2LE_st = ( - 6, 6, 7, 6, 4, 3,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError,#10-17 - 5, 5, 5,eError, 5,eError, 6, 6,#18-1f - 7, 6, 8, 8, 5, 5, 5,eError,#20-27 - 5, 5, 5,eError,eError,eError, 5, 5,#28-2f - 5, 5, 5,eError, 5,eError,eStart,eStart #30-37 -) - -UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) - -UCS2LESMModel = {'classTable': UCS2LE_cls, - 'classFactor': 6, - 'stateTable': UCS2LE_st, - 'charLenTable': UCS2LECharLenTable, - 'name': 'UTF-16LE'} - -# UTF-8 - -UTF8_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 2,2,2,2,3,3,3,3, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 5,5,5,5,5,5,5,5, # a0 - a7 - 5,5,5,5,5,5,5,5, # a8 - af - 5,5,5,5,5,5,5,5, # b0 - b7 - 5,5,5,5,5,5,5,5, # b8 - bf - 0,0,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 7,8,8,8,8,8,8,8, # e0 - e7 - 8,8,8,8,8,9,8,8, # e8 - ef - 10,11,11,11,11,11,11,11, # f0 - f7 - 12,13,13,13,14,15,0,0 # f8 - ff -) - -UTF8_st = ( - eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 - 9, 11, 8, 7, 6, 5, 4, 3,#08-0f - eError,eError,eError,eError,eError,eError,eError,eError,#10-17 - eError,eError,eError,eError,eError,eError,eError,eError,#18-1f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f - eError,eError, 5, 5, 5, 5,eError,eError,#30-37 - eError,eError,eError,eError,eError,eError,eError,eError,#38-3f - eError,eError,eError, 5, 5, 5,eError,eError,#40-47 - eError,eError,eError,eError,eError,eError,eError,eError,#48-4f - eError,eError, 7, 7, 7, 7,eError,eError,#50-57 - eError,eError,eError,eError,eError,eError,eError,eError,#58-5f - eError,eError,eError,eError, 7, 7,eError,eError,#60-67 - eError,eError,eError,eError,eError,eError,eError,eError,#68-6f - eError,eError, 9, 9, 9, 9,eError,eError,#70-77 - eError,eError,eError,eError,eError,eError,eError,eError,#78-7f - eError,eError,eError,eError,eError, 9,eError,eError,#80-87 - eError,eError,eError,eError,eError,eError,eError,eError,#88-8f - eError,eError, 12, 12, 12, 12,eError,eError,#90-97 - eError,eError,eError,eError,eError,eError,eError,eError,#98-9f - eError,eError,eError,eError,eError, 12,eError,eError,#a0-a7 - eError,eError,eError,eError,eError,eError,eError,eError,#a8-af - eError,eError, 12, 12, 12,eError,eError,eError,#b0-b7 - eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf - eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 - eError,eError,eError,eError,eError,eError,eError,eError #c8-cf -) - -UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) - -UTF8SMModel = {'classTable': UTF8_cls, - 'classFactor': 16, - 'stateTable': UTF8_st, - 'charLenTable': UTF8CharLenTable, - 'name': 'UTF-8'} - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/charade/sbcharsetprober.py b/awx/lib/site-packages/requests/packages/charade/sbcharsetprober.py deleted file mode 100644 index da26715cfc..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/sbcharsetprober.py +++ /dev/null @@ -1,120 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .charsetprober import CharSetProber -from .compat import wrap_ord - -SAMPLE_SIZE = 64 -SB_ENOUGH_REL_THRESHOLD = 1024 -POSITIVE_SHORTCUT_THRESHOLD = 0.95 -NEGATIVE_SHORTCUT_THRESHOLD = 0.05 -SYMBOL_CAT_ORDER = 250 -NUMBER_OF_SEQ_CAT = 4 -POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1 -#NEGATIVE_CAT = 0 - - -class SingleByteCharSetProber(CharSetProber): - def __init__(self, model, reversed=False, nameProber=None): - CharSetProber.__init__(self) - self._mModel = model - # TRUE if we need to reverse every pair in the model lookup - self._mReversed = reversed - # Optional auxiliary prober for name decision - self._mNameProber = nameProber - self.reset() - - def reset(self): - CharSetProber.reset(self) - # char order of last character - self._mLastOrder = 255 - self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT - self._mTotalSeqs = 0 - self._mTotalChar = 0 - # characters that fall in our sampling range - self._mFreqChar = 0 - - def get_charset_name(self): - if self._mNameProber: - return self._mNameProber.get_charset_name() - else: - return self._mModel['charsetName'] - - def feed(self, aBuf): - if not self._mModel['keepEnglishLetter']: - aBuf = self.filter_without_english_letters(aBuf) - aLen = len(aBuf) - if not aLen: - return self.get_state() - for c in aBuf: - order = self._mModel['charToOrderMap'][wrap_ord(c)] - if order < SYMBOL_CAT_ORDER: - self._mTotalChar += 1 - if order < SAMPLE_SIZE: - self._mFreqChar += 1 - if self._mLastOrder < SAMPLE_SIZE: - self._mTotalSeqs += 1 - if not self._mReversed: - i = (self._mLastOrder * SAMPLE_SIZE) + order - model = self._mModel['precedenceMatrix'][i] - else: # reverse the order of the letters in the lookup - i = (order * SAMPLE_SIZE) + self._mLastOrder - model = self._mModel['precedenceMatrix'][i] - self._mSeqCounters[model] += 1 - self._mLastOrder = order - - if self.get_state() == constants.eDetecting: - if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD: - cf = self.get_confidence() - if cf > POSITIVE_SHORTCUT_THRESHOLD: - if constants._debug: - sys.stderr.write('%s confidence = %s, we have a' - 'winner\n' % - (self._mModel['charsetName'], cf)) - self._mState = constants.eFoundIt - elif cf < NEGATIVE_SHORTCUT_THRESHOLD: - if constants._debug: - sys.stderr.write('%s confidence = %s, below negative' - 'shortcut threshhold %s\n' % - (self._mModel['charsetName'], cf, - NEGATIVE_SHORTCUT_THRESHOLD)) - self._mState = constants.eNotMe - - return self.get_state() - - def get_confidence(self): - r = 0.01 - if self._mTotalSeqs > 0: - r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs - / self._mModel['mTypicalPositiveRatio']) - r = r * self._mFreqChar / self._mTotalChar - if r >= 1.0: - r = 0.99 - return r diff --git a/awx/lib/site-packages/requests/packages/charade/sbcsgroupprober.py b/awx/lib/site-packages/requests/packages/charade/sbcsgroupprober.py deleted file mode 100644 index b224814568..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/sbcsgroupprober.py +++ /dev/null @@ -1,69 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .sbcharsetprober import SingleByteCharSetProber -from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, - Latin5CyrillicModel, MacCyrillicModel, - Ibm866Model, Ibm855Model) -from .langgreekmodel import Latin7GreekModel, Win1253GreekModel -from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel -from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel -from .langthaimodel import TIS620ThaiModel -from .langhebrewmodel import Win1255HebrewModel -from .hebrewprober import HebrewProber - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ - SingleByteCharSetProber(Win1251CyrillicModel), - SingleByteCharSetProber(Koi8rModel), - SingleByteCharSetProber(Latin5CyrillicModel), - SingleByteCharSetProber(MacCyrillicModel), - SingleByteCharSetProber(Ibm866Model), - SingleByteCharSetProber(Ibm855Model), - SingleByteCharSetProber(Latin7GreekModel), - SingleByteCharSetProber(Win1253GreekModel), - SingleByteCharSetProber(Latin5BulgarianModel), - SingleByteCharSetProber(Win1251BulgarianModel), - SingleByteCharSetProber(Latin2HungarianModel), - SingleByteCharSetProber(Win1250HungarianModel), - SingleByteCharSetProber(TIS620ThaiModel), - ] - hebrewProber = HebrewProber() - logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, - False, hebrewProber) - visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, - hebrewProber) - hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) - self._mProbers.extend([hebrewProber, logicalHebrewProber, - visualHebrewProber]) - - self.reset() diff --git a/awx/lib/site-packages/requests/packages/charade/sjisprober.py b/awx/lib/site-packages/requests/packages/charade/sjisprober.py deleted file mode 100644 index 9bb0cdcf1f..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/sjisprober.py +++ /dev/null @@ -1,91 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import SJISDistributionAnalysis -from .jpcntx import SJISContextAnalysis -from .mbcssm import SJISSMModel -from . import constants - - -class SJISProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(SJISSMModel) - self._mDistributionAnalyzer = SJISDistributionAnalysis() - self._mContextAnalyzer = SJISContextAnalysis() - self.reset() - - def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() - - def get_charset_name(self): - return "SHIFT_JIS" - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:], - charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3 - - charLen], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) diff --git a/awx/lib/site-packages/requests/packages/charade/universaldetector.py b/awx/lib/site-packages/requests/packages/charade/universaldetector.py deleted file mode 100644 index 6a8e68a8a7..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/universaldetector.py +++ /dev/null @@ -1,168 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import sys -import codecs -from .latin1prober import Latin1Prober # windows-1252 -from .mbcsgroupprober import MBCSGroupProber # multi-byte character sets -from .sbcsgroupprober import SBCSGroupProber # single-byte character sets -from .escprober import EscCharSetProber # ISO-2122, etc. -import re - -MINIMUM_THRESHOLD = 0.20 -ePureAscii = 0 -eEscAscii = 1 -eHighbyte = 2 - - -class UniversalDetector: - def __init__(self): - self._highBitDetector = re.compile(b'[\x80-\xFF]') - self._escDetector = re.compile(b'(\033|~{)') - self._mEscCharSetProber = None - self._mCharSetProbers = [] - self.reset() - - def reset(self): - self.result = {'encoding': None, 'confidence': 0.0} - self.done = False - self._mStart = True - self._mGotData = False - self._mInputState = ePureAscii - self._mLastChar = b'' - if self._mEscCharSetProber: - self._mEscCharSetProber.reset() - for prober in self._mCharSetProbers: - prober.reset() - - def feed(self, aBuf): - if self.done: - return - - aLen = len(aBuf) - if not aLen: - return - - if not self._mGotData: - # If the data starts with BOM, we know it is UTF - if aBuf[:3] == codecs.BOM: - # EF BB BF UTF-8 with BOM - self.result = {'encoding': "UTF-8", 'confidence': 1.0} - elif aBuf[:4] in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): - # FF FE 00 00 UTF-32, little-endian BOM - # 00 00 FE FF UTF-32, big-endian BOM - self.result = {'encoding': "UTF-32", 'confidence': 1.0} - elif aBuf[:4] == b'\xFE\xFF\x00\x00': - # FE FF 00 00 UCS-4, unusual octet order BOM (3412) - self.result = { - 'encoding': "X-ISO-10646-UCS-4-3412", - 'confidence': 1.0 - } - elif aBuf[:4] == b'\x00\x00\xFF\xFE': - # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - self.result = { - 'encoding': "X-ISO-10646-UCS-4-2143", - 'confidence': 1.0 - } - elif aBuf[:2] == codecs.BOM_LE or aBuf[:2] == codecs.BOM_BE: - # FF FE UTF-16, little endian BOM - # FE FF UTF-16, big endian BOM - self.result = {'encoding': "UTF-16", 'confidence': 1.0} - - self._mGotData = True - if self.result['encoding'] and (self.result['confidence'] > 0.0): - self.done = True - return - - if self._mInputState == ePureAscii: - if self._highBitDetector.search(aBuf): - self._mInputState = eHighbyte - elif ((self._mInputState == ePureAscii) and - self._escDetector.search(self._mLastChar + aBuf)): - self._mInputState = eEscAscii - - self._mLastChar = aBuf[-1:] - - if self._mInputState == eEscAscii: - if not self._mEscCharSetProber: - self._mEscCharSetProber = EscCharSetProber() - if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: - self.result = { - 'encoding': self._mEscCharSetProber.get_charset_name(), - 'confidence': self._mEscCharSetProber.get_confidence() - } - self.done = True - elif self._mInputState == eHighbyte: - if not self._mCharSetProbers: - self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), - Latin1Prober()] - for prober in self._mCharSetProbers: - if prober.feed(aBuf) == constants.eFoundIt: - self.result = {'encoding': prober.get_charset_name(), - 'confidence': prober.get_confidence()} - self.done = True - break - - def close(self): - if self.done: - return - if not self._mGotData: - if constants._debug: - sys.stderr.write('no data received!\n') - return - self.done = True - - if self._mInputState == ePureAscii: - self.result = {'encoding': 'ascii', 'confidence': 1.0} - return self.result - - if self._mInputState == eHighbyte: - proberConfidence = None - maxProberConfidence = 0.0 - maxProber = None - for prober in self._mCharSetProbers: - if not prober: - continue - proberConfidence = prober.get_confidence() - if proberConfidence > maxProberConfidence: - maxProberConfidence = proberConfidence - maxProber = prober - if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): - self.result = {'encoding': maxProber.get_charset_name(), - 'confidence': maxProber.get_confidence()} - return self.result - - if constants._debug: - sys.stderr.write('no probers hit minimum threshhold\n') - for prober in self._mCharSetProbers[0].mProbers: - if not prober: - continue - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), - prober.get_confidence())) diff --git a/awx/lib/site-packages/requests/packages/charade/utf8prober.py b/awx/lib/site-packages/requests/packages/charade/utf8prober.py deleted file mode 100644 index 72c8d3d6a9..0000000000 --- a/awx/lib/site-packages/requests/packages/charade/utf8prober.py +++ /dev/null @@ -1,76 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8SMModel - -ONE_CHAR_PROB = 0.5 - - -class UTF8Prober(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(UTF8SMModel) - self.reset() - - def reset(self): - CharSetProber.reset(self) - self._mCodingSM.reset() - self._mNumOfMBChar = 0 - - def get_charset_name(self): - return "utf-8" - - def feed(self, aBuf): - for c in aBuf: - codingState = self._mCodingSM.next_state(c) - if codingState == constants.eError: - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - if self._mCodingSM.get_current_charlen() >= 2: - self._mNumOfMBChar += 1 - - if self.get_state() == constants.eDetecting: - if self.get_confidence() > constants.SHORTCUT_THRESHOLD: - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - unlike = 0.99 - if self._mNumOfMBChar < 6: - for i in range(0, self._mNumOfMBChar): - unlike = unlike * ONE_CHAR_PROB - return 1.0 - unlike - else: - return unlike diff --git a/awx/lib/site-packages/requests/packages/chardet/__init__.py b/awx/lib/site-packages/requests/packages/chardet/__init__.py index e4f0799d62..82c2a48d29 100644 --- a/awx/lib/site-packages/requests/packages/chardet/__init__.py +++ b/awx/lib/site-packages/requests/packages/chardet/__init__.py @@ -15,7 +15,7 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -__version__ = "2.2.1" +__version__ = "2.3.0" from sys import version_info diff --git a/awx/lib/site-packages/requests/packages/chardet/chardetect.py b/awx/lib/site-packages/requests/packages/chardet/chardetect.py old mode 100644 new mode 100755 index ecd0163be7..ffe892f25d --- a/awx/lib/site-packages/requests/packages/chardet/chardetect.py +++ b/awx/lib/site-packages/requests/packages/chardet/chardetect.py @@ -12,34 +12,68 @@ Example:: If no paths are provided, it takes its input from stdin. """ -from io import open -from sys import argv, stdin +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys +from io import open + +from chardet import __version__ from chardet.universaldetector import UniversalDetector -def description_of(file, name='stdin'): - """Return a string describing the probable encoding of a file.""" +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ u = UniversalDetector() - for line in file: + for line in lines: u.feed(line) u.close() result = u.result if result['encoding']: - return '%s: %s with confidence %s' % (name, - result['encoding'], - result['confidence']) + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) else: - return '%s: no result' % name + return '{0}: no result'.format(name) -def main(): - if len(argv) <= 1: - print(description_of(stdin)) - else: - for path in argv[1:]: - with open(path, 'rb') as f: - print(description_of(f, path)) +def main(argv=None): + ''' + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + ''' + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + conflict_handler='resolve') + parser.add_argument('input', + help='File whose encoding we would like to determine.', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) if __name__ == '__main__': diff --git a/awx/lib/site-packages/requests/packages/chardet/jpcntx.py b/awx/lib/site-packages/requests/packages/chardet/jpcntx.py index f7f69ba4cd..59aeb6a878 100644 --- a/awx/lib/site-packages/requests/packages/chardet/jpcntx.py +++ b/awx/lib/site-packages/requests/packages/chardet/jpcntx.py @@ -177,6 +177,12 @@ class JapaneseContextAnalysis: return -1, 1 class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + self.charset_name = "SHIFT_JIS" + + def get_charset_name(self): + return self.charset_name + def get_order(self, aBuf): if not aBuf: return -1, 1 @@ -184,6 +190,8 @@ class SJISContextAnalysis(JapaneseContextAnalysis): first_char = wrap_ord(aBuf[0]) if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)): charLen = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self.charset_name = "CP932" else: charLen = 1 diff --git a/awx/lib/site-packages/requests/packages/chardet/latin1prober.py b/awx/lib/site-packages/requests/packages/chardet/latin1prober.py index ad695f57a7..eef3573543 100644 --- a/awx/lib/site-packages/requests/packages/chardet/latin1prober.py +++ b/awx/lib/site-packages/requests/packages/chardet/latin1prober.py @@ -129,11 +129,11 @@ class Latin1Prober(CharSetProber): if total < 0.01: confidence = 0.0 else: - confidence = ((self._mFreqCounter[3] / total) - - (self._mFreqCounter[1] * 20.0 / total)) + confidence = ((self._mFreqCounter[3] - self._mFreqCounter[1] * 20.0) + / total) if confidence < 0.0: confidence = 0.0 # lower the confidence of latin1 so that other more accurate # detector can take priority. - confidence = confidence * 0.5 + confidence = confidence * 0.73 return confidence diff --git a/awx/lib/site-packages/requests/packages/chardet/mbcssm.py b/awx/lib/site-packages/requests/packages/chardet/mbcssm.py index 3f93cfb045..efe678ca03 100644 --- a/awx/lib/site-packages/requests/packages/chardet/mbcssm.py +++ b/awx/lib/site-packages/requests/packages/chardet/mbcssm.py @@ -353,7 +353,7 @@ SJIS_cls = ( 2,2,2,2,2,2,2,2, # 68 - 6f 2,2,2,2,2,2,2,2, # 70 - 77 2,2,2,2,2,2,2,1, # 78 - 7f - 3,3,3,3,3,3,3,3, # 80 - 87 + 3,3,3,3,3,2,2,3, # 80 - 87 3,3,3,3,3,3,3,3, # 88 - 8f 3,3,3,3,3,3,3,3, # 90 - 97 3,3,3,3,3,3,3,3, # 98 - 9f @@ -369,9 +369,8 @@ SJIS_cls = ( 2,2,2,2,2,2,2,2, # d8 - df 3,3,3,3,3,3,3,3, # e0 - e7 3,3,3,3,3,4,4,4, # e8 - ef - 4,4,4,4,4,4,4,4, # f0 - f7 - 4,4,4,4,4,0,0,0 # f8 - ff -) + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff SJIS_st = ( @@ -571,5 +570,3 @@ UTF8SMModel = {'classTable': UTF8_cls, 'stateTable': UTF8_st, 'charLenTable': UTF8CharLenTable, 'name': 'UTF-8'} - -# flake8: noqa diff --git a/awx/lib/site-packages/requests/packages/chardet/sjisprober.py b/awx/lib/site-packages/requests/packages/chardet/sjisprober.py index b173614e68..cd0e9e7078 100644 --- a/awx/lib/site-packages/requests/packages/chardet/sjisprober.py +++ b/awx/lib/site-packages/requests/packages/chardet/sjisprober.py @@ -47,7 +47,7 @@ class SJISProber(MultiByteCharSetProber): self._mContextAnalyzer.reset() def get_charset_name(self): - return "SHIFT_JIS" + return self._mContextAnalyzer.get_charset_name() def feed(self, aBuf): aLen = len(aBuf) diff --git a/awx/lib/site-packages/requests/packages/chardet/universaldetector.py b/awx/lib/site-packages/requests/packages/chardet/universaldetector.py index 9a03ad3d89..476522b999 100644 --- a/awx/lib/site-packages/requests/packages/chardet/universaldetector.py +++ b/awx/lib/site-packages/requests/packages/chardet/universaldetector.py @@ -71,9 +71,9 @@ class UniversalDetector: if not self._mGotData: # If the data starts with BOM, we know it is UTF - if aBuf[:3] == codecs.BOM: + if aBuf[:3] == codecs.BOM_UTF8: # EF BB BF UTF-8 with BOM - self.result = {'encoding': "UTF-8", 'confidence': 1.0} + self.result = {'encoding': "UTF-8-SIG", 'confidence': 1.0} elif aBuf[:4] == codecs.BOM_UTF32_LE: # FF FE 00 00 UTF-32, little-endian BOM self.result = {'encoding': "UTF-32LE", 'confidence': 1.0} diff --git a/awx/lib/site-packages/requests/packages/urllib3/__init__.py b/awx/lib/site-packages/requests/packages/urllib3/__init__.py index 73071f7001..dfc82d0336 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/__init__.py +++ b/awx/lib/site-packages/requests/packages/urllib3/__init__.py @@ -1,9 +1,3 @@ -# urllib3/__init__.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - """ urllib3 - Thread-safe connection pooling and re-using. """ @@ -23,7 +17,10 @@ from . import exceptions from .filepost import encode_multipart_formdata from .poolmanager import PoolManager, ProxyManager, proxy_from_url from .response import HTTPResponse -from .util import make_headers, get_host, Timeout +from .util.request import make_headers +from .util.url import get_host +from .util.timeout import Timeout +from .util.retry import Retry # Set default logging handler to avoid "No handler found" warnings. @@ -51,8 +48,19 @@ def add_stderr_logger(level=logging.DEBUG): handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) logger.addHandler(handler) logger.setLevel(level) - logger.debug('Added an stderr logging handler to logger: %s' % __name__) + logger.debug('Added a stderr logging handler to logger: %s' % __name__) return handler # ... Clean up. del NullHandler + + +# Set security warning to only go off once by default. +import warnings +warnings.simplefilter('always', exceptions.SecurityWarning) + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/awx/lib/site-packages/requests/packages/urllib3/_collections.py b/awx/lib/site-packages/requests/packages/urllib3/_collections.py index 9cea3a44c4..784342a4eb 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/_collections.py +++ b/awx/lib/site-packages/requests/packages/urllib3/_collections.py @@ -1,9 +1,3 @@ -# urllib3/_collections.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - from collections import Mapping, MutableMapping try: from threading import RLock @@ -20,7 +14,7 @@ try: # Python 2.7+ from collections import OrderedDict except ImportError: from .packages.ordered_dict import OrderedDict -from .packages.six import itervalues +from .packages.six import iterkeys, itervalues __all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] @@ -91,8 +85,7 @@ class RecentlyUsedContainer(MutableMapping): def clear(self): with self.lock: # Copy pointers to all values, then wipe the mapping - # under Python 2, this copies the list of values twice :-| - values = list(self._container.values()) + values = list(itervalues(self._container)) self._container.clear() if self.dispose_func: @@ -101,7 +94,7 @@ class RecentlyUsedContainer(MutableMapping): def keys(self): with self.lock: - return self._container.keys() + return list(iterkeys(self._container)) class HTTPHeaderDict(MutableMapping): @@ -116,7 +109,7 @@ class HTTPHeaderDict(MutableMapping): A ``dict`` like container for storing HTTP Headers. Field names are stored and compared case-insensitively in compliance with - RFC 2616. Iteration provides the first case-sensitive key seen for each + RFC 7230. Iteration provides the first case-sensitive key seen for each case-insensitive pair. Using ``__setitem__`` syntax overwrites fields that compare equal diff --git a/awx/lib/site-packages/requests/packages/urllib3/connection.py b/awx/lib/site-packages/requests/packages/urllib3/connection.py index 5feb3322ee..e5de769d8c 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/connection.py +++ b/awx/lib/site-packages/requests/packages/urllib3/connection.py @@ -1,95 +1,142 @@ -# urllib3/connection.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - +import datetime import sys import socket from socket import timeout as SocketTimeout +import warnings +from .packages import six -try: # Python 3 +try: # Python 3 from http.client import HTTPConnection as _HTTPConnection, HTTPException except ImportError: from httplib import HTTPConnection as _HTTPConnection, HTTPException + class DummyConnection(object): "Used to detect a failed ConnectionCls import." pass -try: # Compiled with SSL? - ssl = None + +try: # Compiled with SSL? HTTPSConnection = DummyConnection + import ssl + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. + ssl = None class BaseSSLError(BaseException): pass - try: # Python 3 - from http.client import HTTPSConnection as _HTTPSConnection - except ImportError: - from httplib import HTTPSConnection as _HTTPSConnection - import ssl - BaseSSLError = ssl.SSLError +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: # Python 2: + class ConnectionError(Exception): + pass -except (ImportError, AttributeError): # Platform-specific: No SSL. - pass from .exceptions import ( ConnectTimeoutError, + SystemTimeWarning, + SecurityWarning, ) from .packages.ssl_match_hostname import match_hostname -from .packages import six -from .util import ( - assert_fingerprint, + +from .util.ssl_ import ( resolve_cert_reqs, resolve_ssl_version, ssl_wrap_socket, + assert_fingerprint, ) +from .util import connection + port_by_scheme = { 'http': 80, 'https': 443, } +RECENT_DATE = datetime.date(2014, 1, 1) + class HTTPConnection(_HTTPConnection, object): """ Based on httplib.HTTPConnection but provides an extra constructor backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + + .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x + + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass:: + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). """ default_port = port_by_scheme['http'] - # By default, disable Nagle's Algorithm. - tcp_nodelay = 1 + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False def __init__(self, *args, **kw): if six.PY3: # Python 3 kw.pop('strict', None) - if sys.version_info < (2, 7): # Python 2.6 and older - kw.pop('source_address', None) # Pre-set source_address in case we have an older Python like 2.6. self.source_address = kw.get('source_address') + if sys.version_info < (2, 7): # Python 2.6 + # _HTTPConnection on Python 2.6 will balk at this keyword arg, but + # not newer versions. We can still use it when creating a + # connection though, so we pop it *after* we have saved it as + # self.source_address. + kw.pop('source_address', None) + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop('socket_options', self.default_socket_options) + # Superclass also sets self.source_address in Python 2.7+. - _HTTPConnection.__init__(self, *args, **kw) + _HTTPConnection.__init__(self, *args, **kw) def _new_conn(self): """ Establish a socket connection and set nodelay settings on it. - :return: a new socket connection + :return: New socket connection. """ - extra_args = [] - if self.source_address: # Python 2.7+ - extra_args.append(self.source_address) + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address - conn = socket.create_connection( - (self.host, self.port), self.timeout, *extra_args) - conn.setsockopt( - socket.IPPROTO_TCP, socket.TCP_NODELAY, self.tcp_nodelay) + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = connection.create_connection( + (self.host, self.port), self.timeout, **extra_kw) + + except SocketTimeout: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) return conn @@ -101,6 +148,8 @@ class HTTPConnection(_HTTPConnection, object): if getattr(self, '_tunnel_host', None): # TODO: Fix tunnel so it doesn't depend on self.sock state. self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 def connect(self): conn = self._new_conn() @@ -137,7 +186,7 @@ class VerifiedHTTPSConnection(HTTPSConnection): cert_reqs = None ca_certs = None ssl_version = None - conn_kw = {} + assert_fingerprint = None def set_cert(self, key_file=None, cert_file=None, cert_reqs=None, ca_certs=None, @@ -152,18 +201,7 @@ class VerifiedHTTPSConnection(HTTPSConnection): def connect(self): # Add certificate verification - - try: - sock = socket.create_connection( - address=(self.host, self.port), timeout=self.timeout, - **self.conn_kw) - except SocketTimeout: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) - - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, - self.tcp_nodelay) + conn = self._new_conn() resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs) resolved_ssl_version = resolve_ssl_version(self.ssl_version) @@ -173,29 +211,49 @@ class VerifiedHTTPSConnection(HTTPSConnection): # _tunnel_host was added in Python 2.6.3 # (See: http://hg.python.org/cpython/rev/0f57b30a152f) - self.sock = sock + self.sock = conn # Calls self._set_hostport(), so self.host is # self._tunnel_host below. self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 # Override the host with the one we're requesting data from. hostname = self._tunnel_host + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn(( + 'System time is way off (before {0}). This will probably ' + 'lead to SSL verification errors').format(RECENT_DATE), + SystemTimeWarning + ) + # Wrap socket using verification with the root certs in # trusted_root_certs - self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file, + self.sock = ssl_wrap_socket(conn, self.key_file, self.cert_file, cert_reqs=resolved_cert_reqs, ca_certs=self.ca_certs, server_hostname=hostname, ssl_version=resolved_ssl_version) - if resolved_cert_reqs != ssl.CERT_NONE: - if self.assert_fingerprint: - assert_fingerprint(self.sock.getpeercert(binary_form=True), - self.assert_fingerprint) - elif self.assert_hostname is not False: - match_hostname(self.sock.getpeercert(), - self.assert_hostname or hostname) + if self.assert_fingerprint: + assert_fingerprint(self.sock.getpeercert(binary_form=True), + self.assert_fingerprint) + elif resolved_cert_reqs != ssl.CERT_NONE \ + and self.assert_hostname is not False: + cert = self.sock.getpeercert() + if not cert.get('subjectAltName', ()): + warnings.warn(( + 'Certificate has no `subjectAltName`, falling back to check for a `commonName` for now. ' + 'This feature is being removed by major browsers and deprecated by RFC 2818. ' + '(See https://github.com/shazow/urllib3/issues/497 for details.)'), + SecurityWarning + ) + match_hostname(cert, self.assert_hostname or hostname) + + self.is_verified = (resolved_cert_reqs == ssl.CERT_REQUIRED + or self.assert_fingerprint is not None) if ssl: diff --git a/awx/lib/site-packages/requests/packages/urllib3/connectionpool.py b/awx/lib/site-packages/requests/packages/urllib3/connectionpool.py index 95a53a7df6..70ee4eed5e 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/connectionpool.py +++ b/awx/lib/site-packages/requests/packages/urllib3/connectionpool.py @@ -1,17 +1,12 @@ -# urllib3/connectionpool.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import sys import errno import logging +import sys +import warnings from socket import error as SocketError, timeout as SocketTimeout import socket -try: # Python 3 +try: # Python 3 from queue import LifoQueue, Empty, Full except ImportError: from Queue import LifoQueue, Empty, Full @@ -20,16 +15,16 @@ except ImportError: from .exceptions import ( ClosedPoolError, - ConnectionError, - ConnectTimeoutError, + ProtocolError, EmptyPoolError, HostChangedError, - LocationParseError, + LocationValueError, MaxRetryError, + ProxyError, + ReadTimeoutError, SSLError, TimeoutError, - ReadTimeoutError, - ProxyError, + InsecureRequestWarning, ) from .packages.ssl_match_hostname import CertificateError from .packages import six @@ -37,15 +32,15 @@ from .connection import ( port_by_scheme, DummyConnection, HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, - HTTPException, BaseSSLError, + HTTPException, BaseSSLError, ConnectionError ) from .request import RequestMethods from .response import HTTPResponse -from .util import ( - get_host, - is_connection_dropped, - Timeout, -) + +from .util.connection import is_connection_dropped +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host xrange = six.moves.xrange @@ -54,8 +49,8 @@ log = logging.getLogger(__name__) _Default = object() -## Pool objects +## Pool objects class ConnectionPool(object): """ Base class for all connection pools, such as @@ -66,13 +61,11 @@ class ConnectionPool(object): QueueCls = LifoQueue def __init__(self, host, port=None): - if host is None: - raise LocationParseError(host) + if not host: + raise LocationValueError("No host specified.") # httplib doesn't like it when we include brackets in ipv6 addresses - host = host.strip('[]') - - self.host = host + self.host = host.strip('[]') self.port = port def __str__(self): @@ -82,6 +75,7 @@ class ConnectionPool(object): # This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 _blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK]) + class HTTPConnectionPool(ConnectionPool, RequestMethods): """ Thread-safe connection pool for one host. @@ -126,6 +120,9 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): Headers to include with all requests, unless other headers are given explicitly. + :param retries: + Retry configuration to use by default with requests in this pool. + :param _proxy: Parsed proxy URL, should not be used directly, instead, see :class:`urllib3.connectionpool.ProxyManager`" @@ -133,6 +130,10 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): :param _proxy_headers: A dictionary with proxy headers, should not be used directly, instead, see :class:`urllib3.connectionpool.ProxyManager`" + + :param \**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. """ scheme = 'http' @@ -140,18 +141,22 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): def __init__(self, host, port=None, strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, - headers=None, _proxy=None, _proxy_headers=None, **conn_kw): + headers=None, retries=None, + _proxy=None, _proxy_headers=None, + **conn_kw): ConnectionPool.__init__(self, host, port) RequestMethods.__init__(self, headers) self.strict = strict - # This is for backwards compatibility and can be removed once a timeout - # can only be set to a Timeout object if not isinstance(timeout, Timeout): timeout = Timeout.from_float(timeout) + if retries is None: + retries = Retry.DEFAULT + self.timeout = timeout + self.retries = retries self.pool = self.QueueCls(maxsize) self.block = block @@ -166,11 +171,14 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): # These are mostly for testing and debugging purposes. self.num_connections = 0 self.num_requests = 0 - - if sys.version_info < (2, 7): # Python 2.6 and older - conn_kw.pop('source_address', None) self.conn_kw = conn_kw + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault('socket_options', []) + def _new_conn(self): """ Return a fresh :class:`HTTPConnection`. @@ -182,10 +190,6 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): conn = self.ConnectionCls(host=self.host, port=self.port, timeout=self.timeout.connect_timeout, strict=self.strict, **self.conn_kw) - if self.proxy is not None: - # Enable Nagle's algorithm for proxies, to avoid packet - # fragmentation. - conn.tcp_nodelay = 0 return conn def _get_conn(self, timeout=None): @@ -204,7 +208,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): try: conn = self.pool.get(block=self.block, timeout=timeout) - except AttributeError: # self.pool is None + except AttributeError: # self.pool is None raise ClosedPoolError(self, "Pool is closed.") except Empty: @@ -218,6 +222,11 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): if conn and is_connection_dropped(conn): log.info("Resetting dropped connection: %s" % self.host) conn.close() + if getattr(conn, 'auto_open', 1) == 0: + # This is a proxied connection that has been mutated by + # httplib._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None return conn or self._new_conn() @@ -237,7 +246,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): """ try: self.pool.put(conn, block=False) - return # Everything is dandy, done. + return # Everything is dandy, done. except AttributeError: # self.pool is None. pass @@ -251,6 +260,12 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): if conn: conn.close() + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + def _get_timeout(self, timeout): """ Helper that always returns a :class:`urllib3.util.Timeout` """ if timeout is _Default: @@ -263,6 +278,23 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): # can be removed later return Timeout.from_float(timeout) + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, 'errno') and err.errno in _blocking_errnos: + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python 2.6 + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + def _make_request(self, conn, method, url, timeout=_Default, **httplib_request_kw): """ @@ -282,23 +314,26 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): self.num_requests += 1 timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + # Trigger any extra validation we need to do. try: - timeout_obj.start_connect() - conn.timeout = timeout_obj.connect_timeout - # conn.request() calls httplib.*.request, not the method in - # urllib3.request. It also calls makefile (recv) on the socket. - conn.request(method, url, **httplib_request_kw) - except SocketTimeout: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, timeout_obj.connect_timeout)) + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls httplib.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + conn.request(method, url, **httplib_request_kw) # Reset the timeout for the recv() on the socket read_timeout = timeout_obj.read_timeout # App Engine doesn't have a sock attr - if hasattr(conn, 'sock'): + if getattr(conn, 'sock', None): # In Python 3 socket.py will catch EAGAIN and return None when you # try and read into the file pointer created by http.client, which # instead raises a BadStatusLine exception. Instead of catching @@ -306,41 +341,20 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): # timeouts, check for a zero timeout before making the request. if read_timeout == 0: raise ReadTimeoutError( - self, url, - "Read timed out. (read timeout=%s)" % read_timeout) + self, url, "Read timed out. (read timeout=%s)" % read_timeout) if read_timeout is Timeout.DEFAULT_TIMEOUT: conn.sock.settimeout(socket.getdefaulttimeout()) - else: # None or a value + else: # None or a value conn.sock.settimeout(read_timeout) # Receive the response from the server try: - try: # Python 2.7+, use buffering of HTTP responses + try: # Python 2.7+, use buffering of HTTP responses httplib_response = conn.getresponse(buffering=True) - except TypeError: # Python 2.6 and older + except TypeError: # Python 2.6 and older httplib_response = conn.getresponse() - except SocketTimeout: - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % read_timeout) - - except BaseSSLError as e: - # Catch possible read timeouts thrown as SSL errors. If not the - # case, rethrow the original. We need to do this because of: - # http://bugs.python.org/issue10272 - if 'timed out' in str(e) or \ - 'did not complete (read)' in str(e): # Python 2.6 - raise ReadTimeoutError(self, url, "Read timed out.") - - raise - - except SocketError as e: # Platform-specific: Python 2 - # See the above comment about EAGAIN in Python 3. In Python 2 we - # have to specifically catch it and throw the timeout error - if e.errno in _blocking_errnos: - raise ReadTimeoutError( - self, url, - "Read timed out. (read timeout=%s)" % read_timeout) - + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) raise # AppEngine doesn't have a version attr. @@ -364,7 +378,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): conn.close() except Empty: - pass # Done. + pass # Done. def is_same_host(self, url): """ @@ -385,7 +399,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): return (scheme, host, port) == (self.scheme, self.host, self.port) - def urlopen(self, method, url, body=None, headers=None, retries=3, + def urlopen(self, method, url, body=None, headers=None, retries=None, redirect=True, assert_same_host=True, timeout=_Default, pool_timeout=None, release_conn=None, **response_kw): """ @@ -419,9 +433,20 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): these headers completely replace any pool-specific headers. :param retries: - Number of retries to allow before raising a MaxRetryError exception. - If `False`, then retries are disabled and any exception is raised - immediately. + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. :param redirect: If True, automatically handle redirects (status codes 301, 302, @@ -460,15 +485,15 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): if headers is None: headers = self.headers - if retries < 0 and retries is not False: - raise MaxRetryError(self, url) + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) if release_conn is None: release_conn = response_kw.get('preload_content', True) # Check host if assert_same_host and not self.is_same_host(url): - raise HostChangedError(self, url, retries - 1) + raise HostChangedError(self, url, retries) conn = None @@ -484,10 +509,10 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): err = None try: - # Request a connection from the queue + # Request a connection from the queue. conn = self._get_conn(timeout=pool_timeout) - # Make the request on the httplib connection object + # Make the request on the httplib connection object. httplib_response = self._make_request(conn, method, url, timeout=timeout, body=body, headers=headers) @@ -514,33 +539,30 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): raise EmptyPoolError(self, "No pool connections are available.") except (BaseSSLError, CertificateError) as e: - # Release connection unconditionally because there is no way to - # close it externally in case of exception. - release_conn = True + # Close the connection. If a connection is reused on which there + # was a Certificate error, the next request will certainly raise + # another Certificate error. + if conn: + conn.close() + conn = None raise SSLError(e) - except (TimeoutError, HTTPException, SocketError) as e: + except (TimeoutError, HTTPException, SocketError, ConnectionError) as e: if conn: # Discard the connection for these exceptions. It will be # be replaced during the next _get_conn() call. conn.close() conn = None - if not retries: - if isinstance(e, TimeoutError): - # TimeoutError is exempt from MaxRetryError-wrapping. - # FIXME: ... Not sure why. Add a reason here. - raise + stacktrace = sys.exc_info()[2] + if isinstance(e, SocketError) and self.proxy: + e = ProxyError('Cannot connect to proxy.', e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError('Connection aborted.', e) - # Wrap unexpected exceptions with the most appropriate - # module-level exception and re-raise. - if isinstance(e, SocketError) and self.proxy: - raise ProxyError('Cannot connect to proxy.', e) - - if retries is False: - raise ConnectionError('Connection failed.', e) - - raise MaxRetryError(self, url, e) + retries = retries.increment(method, url, error=e, + _pool=self, _stacktrace=stacktrace) + retries.sleep() # Keep track of the error for the retry warning. err = e @@ -554,23 +576,43 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): if not conn: # Try again - log.warning("Retrying (%d attempts remain) after connection " + log.warning("Retrying (%r) after connection " "broken by '%r': %s" % (retries, err, url)) - return self.urlopen(method, url, body, headers, retries - 1, + return self.urlopen(method, url, body, headers, retries, redirect, assert_same_host, timeout=timeout, pool_timeout=pool_timeout, release_conn=release_conn, **response_kw) # Handle redirect? redirect_location = redirect and response.get_redirect_location() - if redirect_location and retries is not False: + if redirect_location: if response.status == 303: method = 'GET' + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + raise + return response + log.info("Redirecting %s -> %s" % (url, redirect_location)) return self.urlopen(method, redirect_location, body, headers, - retries - 1, redirect, assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, **response_kw) + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, **response_kw) + + # Check if we should retry the HTTP response. + if retries.is_forced_retry(method, status_code=response.status): + retries = retries.increment(method, url, response=response, _pool=self) + retries.sleep() + log.info("Forced retry: %s" % url) + return self.urlopen(method, url, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, **response_kw) return response @@ -597,19 +639,17 @@ class HTTPSConnectionPool(HTTPConnectionPool): ConnectionCls = HTTPSConnection def __init__(self, host, port=None, - strict=False, timeout=None, maxsize=1, - block=False, headers=None, + strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, + block=False, headers=None, retries=None, _proxy=None, _proxy_headers=None, key_file=None, cert_file=None, cert_reqs=None, ca_certs=None, ssl_version=None, assert_hostname=None, assert_fingerprint=None, **conn_kw): - if sys.version_info < (2, 7): # Python 2.6 or older - conn_kw.pop('source_address', None) - HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, - block, headers, _proxy, _proxy_headers, **conn_kw) + block, headers, retries, _proxy, _proxy_headers, + **conn_kw) self.key_file = key_file self.cert_file = cert_file self.cert_reqs = cert_reqs @@ -617,7 +657,6 @@ class HTTPSConnectionPool(HTTPConnectionPool): self.ssl_version = ssl_version self.assert_hostname = assert_hostname self.assert_fingerprint = assert_fingerprint - self.conn_kw = conn_kw def _prepare_conn(self, conn): """ @@ -633,7 +672,6 @@ class HTTPSConnectionPool(HTTPConnectionPool): assert_hostname=self.assert_hostname, assert_fingerprint=self.assert_fingerprint) conn.ssl_version = self.ssl_version - conn.conn_kw = self.conn_kw if self.proxy is not None: # Python 2.7+ @@ -641,7 +679,12 @@ class HTTPSConnectionPool(HTTPConnectionPool): set_tunnel = conn.set_tunnel except AttributeError: # Platform-specific: Python 2.6 set_tunnel = conn._set_tunnel - set_tunnel(self.host, self.port, self.proxy_headers) + + if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older + set_tunnel(self.host, self.port) + else: + set_tunnel(self.host, self.port, self.proxy_headers) + # Establish tunnel connection early, because otherwise httplib # would improperly set Host: header to proxy's IP:port. conn.connect() @@ -667,21 +710,29 @@ class HTTPSConnectionPool(HTTPConnectionPool): actual_host = self.proxy.host actual_port = self.proxy.port - extra_params = {} - if not six.PY3: # Python 2 - extra_params['strict'] = self.strict - extra_params.update(self.conn_kw) - conn = self.ConnectionCls(host=actual_host, port=actual_port, timeout=self.timeout.connect_timeout, - **extra_params) - if self.proxy is not None: - # Enable Nagle's algorithm for proxies, to avoid packet - # fragmentation. - conn.tcp_nodelay = 0 + strict=self.strict, **self.conn_kw) return self._prepare_conn(conn) + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn(( + 'Unverified HTTPS request is being made. ' + 'Adding certificate verification is strongly advised. See: ' + 'https://urllib3.readthedocs.org/en/latest/security.html'), + InsecureRequestWarning) + def connection_from_url(url, **kw): """ @@ -698,7 +749,7 @@ def connection_from_url(url, **kw): :class:`.ConnectionPool`. Useful for specifying things like timeout, maxsize, headers, etc. - Example: :: + Example:: >>> conn = connection_from_url('http://google.com/') >>> r = conn.request('GET', '/') diff --git a/awx/lib/site-packages/requests/packages/urllib3/contrib/ntlmpool.py b/awx/lib/site-packages/requests/packages/urllib3/contrib/ntlmpool.py index b8cd933034..c6b266f5d1 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/contrib/ntlmpool.py +++ b/awx/lib/site-packages/requests/packages/urllib3/contrib/ntlmpool.py @@ -1,9 +1,3 @@ -# urllib3/contrib/ntlmpool.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - """ NTLM authenticating pool, contributed by erikcederstran diff --git a/awx/lib/site-packages/requests/packages/urllib3/contrib/pyopenssl.py b/awx/lib/site-packages/requests/packages/urllib3/contrib/pyopenssl.py index 21a12c68ad..8229090cb6 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/contrib/pyopenssl.py +++ b/awx/lib/site-packages/requests/packages/urllib3/contrib/pyopenssl.py @@ -29,7 +29,7 @@ Now you can use :mod:`urllib3` as you normally would, and it will support SNI when the required modules are installed. Activating this module also has the positive side effect of disabling SSL/TLS -encryption in Python 2 (see `CRIME attack`_). +compression in Python 2 (see `CRIME attack`_). If you want to configure the default list of supported cipher suites, you can set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. @@ -46,15 +46,18 @@ Module Variables ''' -from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT -from ndg.httpsclient.subj_alt_name import SubjectAltName as BaseSubjectAltName +try: + from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT + from ndg.httpsclient.subj_alt_name import SubjectAltName as BaseSubjectAltName +except SyntaxError as e: + raise ImportError(e) + import OpenSSL.SSL from pyasn1.codec.der import decoder as der_decoder from pyasn1.type import univ, constraint from socket import _fileobject, timeout import ssl import select -from cStringIO import StringIO from .. import connection from .. import util @@ -67,9 +70,14 @@ HAS_SNI = SUBJ_ALT_NAME_SUPPORT # Map from urllib3 to PyOpenSSL compatible parameter-values. _openssl_versions = { ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, - ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD, ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, } + +try: + _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) +except AttributeError: + pass + _openssl_verify = { ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, @@ -155,205 +163,68 @@ def get_subj_alt_name(peer_cert): return dns_name -class fileobject(_fileobject): - - def _wait_for_sock(self): - rd, wd, ed = select.select([self._sock], [], [], - self._sock.gettimeout()) - if not rd: - raise timeout() - - - def read(self, size=-1): - # Use max, disallow tiny reads in a loop as they are very inefficient. - # We never leave read() with any leftover data from a new recv() call - # in our internal buffer. - rbufsize = max(self._rbufsize, self.default_bufsize) - # Our use of StringIO rather than lists of string objects returned by - # recv() minimizes memory usage and fragmentation that occurs when - # rbufsize is large compared to the typical return value of recv(). - buf = self._rbuf - buf.seek(0, 2) # seek end - if size < 0: - # Read until EOF - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - while True: - try: - data = self._sock.recv(rbufsize) - except OpenSSL.SSL.WantReadError: - self._wait_for_sock() - continue - if not data: - break - buf.write(data) - return buf.getvalue() - else: - # Read until size bytes or EOF seen, whichever comes first - buf_len = buf.tell() - if buf_len >= size: - # Already have size bytes in our buffer? Extract and return. - buf.seek(0) - rv = buf.read(size) - self._rbuf = StringIO() - self._rbuf.write(buf.read()) - return rv - - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - while True: - left = size - buf_len - # recv() will malloc the amount of memory given as its - # parameter even though it often returns much less data - # than that. The returned data string is short lived - # as we copy it into a StringIO and free it. This avoids - # fragmentation issues on many platforms. - try: - data = self._sock.recv(left) - except OpenSSL.SSL.WantReadError: - self._wait_for_sock() - continue - if not data: - break - n = len(data) - if n == size and not buf_len: - # Shortcut. Avoid buffer data copies when: - # - We have no data in our buffer. - # AND - # - Our call to recv returned exactly the - # number of bytes we were asked to read. - return data - if n == left: - buf.write(data) - del data # explicit free - break - assert n <= left, "recv(%d) returned %d bytes" % (left, n) - buf.write(data) - buf_len += n - del data # explicit free - #assert buf_len == buf.tell() - return buf.getvalue() - - def readline(self, size=-1): - buf = self._rbuf - buf.seek(0, 2) # seek end - if buf.tell() > 0: - # check if we already have it in our buffer - buf.seek(0) - bline = buf.readline(size) - if bline.endswith('\n') or len(bline) == size: - self._rbuf = StringIO() - self._rbuf.write(buf.read()) - return bline - del bline - if size < 0: - # Read until \n or EOF, whichever comes first - if self._rbufsize <= 1: - # Speed up unbuffered case - buf.seek(0) - buffers = [buf.read()] - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - data = None - recv = self._sock.recv - while True: - try: - while data != "\n": - data = recv(1) - if not data: - break - buffers.append(data) - except OpenSSL.SSL.WantReadError: - self._wait_for_sock() - continue - break - return "".join(buffers) - - buf.seek(0, 2) # seek end - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - while True: - try: - data = self._sock.recv(self._rbufsize) - except OpenSSL.SSL.WantReadError: - self._wait_for_sock() - continue - if not data: - break - nl = data.find('\n') - if nl >= 0: - nl += 1 - buf.write(data[:nl]) - self._rbuf.write(data[nl:]) - del data - break - buf.write(data) - return buf.getvalue() - else: - # Read until size bytes or \n or EOF seen, whichever comes first - buf.seek(0, 2) # seek end - buf_len = buf.tell() - if buf_len >= size: - buf.seek(0) - rv = buf.read(size) - self._rbuf = StringIO() - self._rbuf.write(buf.read()) - return rv - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - while True: - try: - data = self._sock.recv(self._rbufsize) - except OpenSSL.SSL.WantReadError: - self._wait_for_sock() - continue - if not data: - break - left = size - buf_len - # did we just receive a newline? - nl = data.find('\n', 0, left) - if nl >= 0: - nl += 1 - # save the excess data to _rbuf - self._rbuf.write(data[nl:]) - if buf_len: - buf.write(data[:nl]) - break - else: - # Shortcut. Avoid data copy through buf when returning - # a substring of our first recv(). - return data[:nl] - n = len(data) - if n == size and not buf_len: - # Shortcut. Avoid data copy through buf when - # returning exactly all of our first recv(). - return data - if n >= left: - buf.write(data[:left]) - self._rbuf.write(data[left:]) - break - buf.write(data) - buf_len += n - #assert buf_len == buf.tell() - return buf.getvalue() - - class WrappedSocket(object): - '''API-compatibility wrapper for Python OpenSSL's Connection-class.''' + '''API-compatibility wrapper for Python OpenSSL's Connection-class. - def __init__(self, connection, socket): + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + ''' + + def __init__(self, connection, socket, suppress_ragged_eofs=True): self.connection = connection self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 def fileno(self): return self.socket.fileno() def makefile(self, mode, bufsize=-1): - return fileobject(self.connection, mode, bufsize) + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return b'' + else: + raise + except OpenSSL.SSL.WantReadError: + rd, wd, ed = select.select( + [self.socket], [], [], self.socket.gettimeout()) + if not rd: + raise timeout('The read operation timed out') + else: + return self.recv(*args, **kwargs) + else: + return data def settimeout(self, timeout): return self.socket.settimeout(timeout) + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + _, wlist, _ = select.select([], [self.socket], [], + self.socket.gettimeout()) + if not wlist: + raise timeout() + continue + def sendall(self, data): - return self.connection.sendall(data) + while len(data): + sent = self._send_until_done(data) + data = data[sent:] def close(self): - return self.connection.shutdown() + if self._makefile_refs < 1: + return self.connection.shutdown() + else: + self._makefile_refs -= 1 def getpeercert(self, binary_form=False): x509 = self.connection.get_peer_certificate() @@ -376,6 +247,15 @@ class WrappedSocket(object): ] } + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + def _verify_callback(cnx, x509, err_no, err_depth, return_code): return err_no == 0 @@ -386,6 +266,7 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, ssl_version=None): ctx = OpenSSL.SSL.Context(_openssl_versions[ssl_version]) if certfile: + keyfile = keyfile or certfile # Match behaviour of the normal python ssl library ctx.use_certificate_file(certfile) if keyfile: ctx.use_privatekey_file(keyfile) diff --git a/awx/lib/site-packages/requests/packages/urllib3/exceptions.py b/awx/lib/site-packages/requests/packages/urllib3/exceptions.py index b4df831fec..0c6fd3c51b 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/exceptions.py +++ b/awx/lib/site-packages/requests/packages/urllib3/exceptions.py @@ -1,9 +1,3 @@ -# urllib3/exceptions.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - ## Base Exceptions @@ -11,6 +5,11 @@ class HTTPError(Exception): "Base exception used by this module." pass +class HTTPWarning(Warning): + "Base warning used by this module." + pass + + class PoolError(HTTPError): "Base exception for errors caused within a pool." @@ -44,29 +43,37 @@ class ProxyError(HTTPError): pass -class ConnectionError(HTTPError): - "Raised when a normal connection fails." - pass - - class DecodeError(HTTPError): "Raised when automatic decoding based on Content-Type fails." pass +class ProtocolError(HTTPError): + "Raised when something unexpected happens mid-request/response." + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + ## Leaf Exceptions class MaxRetryError(RequestError): - "Raised when the maximum number of retries is exceeded." + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ def __init__(self, pool, url, reason=None): self.reason = reason - message = "Max retries exceeded with url: %s" % url - if reason: - message += " (Caused by %s: %s)" % (type(reason), reason) - else: - message += " (Caused by redirect)" + message = "Max retries exceeded with url: %s (Caused by %r)" % ( + url, reason) RequestError.__init__(self, pool, url, message) @@ -116,7 +123,12 @@ class ClosedPoolError(PoolError): pass -class LocationParseError(ValueError, HTTPError): +class LocationValueError(ValueError, HTTPError): + "Raised when there is something wrong with a given URL input." + pass + + +class LocationParseError(LocationValueError): "Raised when get_host or similar fails to parse the URL input." def __init__(self, location): @@ -124,3 +136,24 @@ class LocationParseError(ValueError, HTTPError): HTTPError.__init__(self, message) self.location = location + + +class ResponseError(HTTPError): + "Used as a container for an error reason supplied in a MaxRetryError." + GENERIC_ERROR = 'too many error responses' + SPECIFIC_ERROR = 'too many {status_code} error responses' + + +class SecurityWarning(HTTPWarning): + "Warned when perfoming security reducing actions" + pass + + +class InsecureRequestWarning(SecurityWarning): + "Warned when making an unverified HTTPS request." + pass + + +class SystemTimeWarning(SecurityWarning): + "Warned when system time is suspected to be wrong" + pass diff --git a/awx/lib/site-packages/requests/packages/urllib3/fields.py b/awx/lib/site-packages/requests/packages/urllib3/fields.py index da79e929be..c853f8d56b 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/fields.py +++ b/awx/lib/site-packages/requests/packages/urllib3/fields.py @@ -1,9 +1,3 @@ -# urllib3/fields.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - import email.utils import mimetypes @@ -78,9 +72,10 @@ class RequestField(object): """ A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. - Supports constructing :class:`~urllib3.fields.RequestField` from parameter - of key/value strings AND key/filetuple. A filetuple is a (filename, data, MIME type) - tuple where the MIME type is optional. For example: :: + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: 'foo': 'bar', 'fakefile': ('foofile.txt', 'contents of foofile'), @@ -125,8 +120,8 @@ class RequestField(object): 'Content-Disposition' fields. :param header_parts: - A sequence of (k, v) typles or a :class:`dict` of (k, v) to format as - `k1="v1"; k2="v2"; ...`. + A sequence of (k, v) typles or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. """ parts = [] iterable = header_parts @@ -158,7 +153,8 @@ class RequestField(object): lines.append('\r\n') return '\r\n'.join(lines) - def make_multipart(self, content_disposition=None, content_type=None, content_location=None): + def make_multipart(self, content_disposition=None, content_type=None, + content_location=None): """ Makes this request field into a multipart request field. @@ -172,6 +168,10 @@ class RequestField(object): """ self.headers['Content-Disposition'] = content_disposition or 'form-data' - self.headers['Content-Disposition'] += '; '.join(['', self._render_parts((('name', self._name), ('filename', self._filename)))]) + self.headers['Content-Disposition'] += '; '.join([ + '', self._render_parts( + (('name', self._name), ('filename', self._filename)) + ) + ]) self.headers['Content-Type'] = content_type self.headers['Content-Location'] = content_location diff --git a/awx/lib/site-packages/requests/packages/urllib3/filepost.py b/awx/lib/site-packages/requests/packages/urllib3/filepost.py index e8b30bddf2..0fbf488dfe 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/filepost.py +++ b/awx/lib/site-packages/requests/packages/urllib3/filepost.py @@ -1,11 +1,4 @@ -# urllib3/filepost.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - import codecs -import mimetypes from uuid import uuid4 from io import BytesIO @@ -38,10 +31,10 @@ def iter_field_objects(fields): i = iter(fields) for field in i: - if isinstance(field, RequestField): - yield field - else: - yield RequestField.from_tuples(*field) + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) def iter_fields(fields): diff --git a/awx/lib/site-packages/requests/packages/urllib3/packages/ordered_dict.py b/awx/lib/site-packages/requests/packages/urllib3/packages/ordered_dict.py index 7f8ee15436..4479363cc4 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/packages/ordered_dict.py +++ b/awx/lib/site-packages/requests/packages/urllib3/packages/ordered_dict.py @@ -2,7 +2,6 @@ # Passes Python2.7's test suite and incorporates all the latest updates. # Copyright 2009 Raymond Hettinger, released under the MIT License. # http://code.activestate.com/recipes/576693/ - try: from thread import get_ident as _get_ident except ImportError: diff --git a/awx/lib/site-packages/requests/packages/urllib3/poolmanager.py b/awx/lib/site-packages/requests/packages/urllib3/poolmanager.py index f18ff2bb7e..515dc96219 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/poolmanager.py +++ b/awx/lib/site-packages/requests/packages/urllib3/poolmanager.py @@ -1,9 +1,3 @@ -# urllib3/poolmanager.py -# Copyright 2008-2014 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - import logging try: # Python 3 @@ -14,8 +8,10 @@ except ImportError: from ._collections import RecentlyUsedContainer from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool from .connectionpool import port_by_scheme +from .exceptions import LocationValueError from .request import RequestMethods -from .util import parse_url +from .util.url import parse_url +from .util.retry import Retry __all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] @@ -49,7 +45,7 @@ class PoolManager(RequestMethods): Additional parameters are used to create fresh :class:`urllib3.connectionpool.ConnectionPool` instances. - Example: :: + Example:: >>> manager = PoolManager(num_pools=2) >>> r = manager.request('GET', 'http://google.com/') @@ -102,10 +98,11 @@ class PoolManager(RequestMethods): ``urllib3.connectionpool.port_by_scheme``. """ + if not host: + raise LocationValueError("No host specified.") + scheme = scheme or 'http' - port = port or port_by_scheme.get(scheme, 80) - pool_key = (scheme, host, port) with self.pools.lock: @@ -118,6 +115,7 @@ class PoolManager(RequestMethods): # Make a fresh ConnectionPool of the desired type pool = self._new_pool(scheme, host, port) self.pools[pool_key] = pool + return pool def connection_from_url(self, url): @@ -161,13 +159,18 @@ class PoolManager(RequestMethods): # Support relative URLs for redirecting. redirect_location = urljoin(url, redirect_location) - # RFC 2616, Section 10.3.4 + # RFC 7231, Section 6.4.4 if response.status == 303: method = 'GET' - log.info("Redirecting %s -> %s" % (url, redirect_location)) - kw['retries'] = kw.get('retries', 3) - 1 # Persist retries countdown + retries = kw.get('retries') + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + kw['retries'] = retries.increment(method, redirect_location) kw['redirect'] = redirect + + log.info("Redirecting %s -> %s" % (url, redirect_location)) return self.urlopen(method, redirect_location, **kw) @@ -208,12 +211,16 @@ class ProxyManager(PoolManager): if not proxy.port: port = port_by_scheme.get(proxy.scheme, 80) proxy = proxy._replace(port=port) + + assert proxy.scheme in ("http", "https"), \ + 'Not supported proxy scheme %s' % proxy.scheme + self.proxy = proxy self.proxy_headers = proxy_headers or {} - assert self.proxy.scheme in ("http", "https"), \ - 'Not supported proxy scheme %s' % self.proxy.scheme + connection_pool_kw['_proxy'] = self.proxy connection_pool_kw['_proxy_headers'] = self.proxy_headers + super(ProxyManager, self).__init__( num_pools, headers, **connection_pool_kw) @@ -248,10 +255,10 @@ class ProxyManager(PoolManager): # For proxied HTTPS requests, httplib sets the necessary headers # on the CONNECT to the proxy. For HTTP, we'll definitely # need to set 'Host' at the very least. - kw['headers'] = self._set_proxy_headers(url, kw.get('headers', - self.headers)) + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) - return super(ProxyManager, self).urlopen(method, url, redirect, **kw) + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) def proxy_from_url(url, **kw): diff --git a/awx/lib/site-packages/requests/packages/urllib3/request.py b/awx/lib/site-packages/requests/packages/urllib3/request.py index 2a92cc2083..b08d6c9274 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/request.py +++ b/awx/lib/site-packages/requests/packages/urllib3/request.py @@ -1,9 +1,3 @@ -# urllib3/request.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - try: from urllib.parse import urlencode except ImportError: @@ -26,8 +20,8 @@ class RequestMethods(object): Specifically, - :meth:`.request_encode_url` is for sending requests whose fields are encoded - in the URL (such as GET, HEAD, DELETE). + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). :meth:`.request_encode_body` is for sending requests whose fields are encoded in the *body* of the request using multipart or www-form-urlencoded @@ -51,7 +45,7 @@ class RequestMethods(object): def urlopen(self, method, url, body=None, headers=None, encode_multipart=True, multipart_boundary=None, - **kw): # Abstract + **kw): # Abstract raise NotImplemented("Classes extending RequestMethods must implement " "their own ``urlopen`` method.") @@ -61,8 +55,8 @@ class RequestMethods(object): ``fields`` based on the ``method`` used. This is a convenience method that requires the least amount of manual - effort. It can be used in most situations, while still having the option - to drop down to more specific methods when necessary, such as + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as :meth:`request_encode_url`, :meth:`request_encode_body`, or even the lowest level :meth:`urlopen`. """ @@ -70,12 +64,12 @@ class RequestMethods(object): if method in self._encode_url_methods: return self.request_encode_url(method, url, fields=fields, - headers=headers, - **urlopen_kw) + headers=headers, + **urlopen_kw) else: return self.request_encode_body(method, url, fields=fields, - headers=headers, - **urlopen_kw) + headers=headers, + **urlopen_kw) def request_encode_url(self, method, url, fields=None, **urlopen_kw): """ @@ -94,18 +88,18 @@ class RequestMethods(object): the body. This is useful for request methods like POST, PUT, PATCH, etc. When ``encode_multipart=True`` (default), then - :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode the - payload with the appropriate content type. Otherwise + :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise :meth:`urllib.urlencode` is used with the 'application/x-www-form-urlencoded' content type. Multipart encoding must be used when posting files, and it's reasonably - safe to use it in other times too. However, it may break request signing, - such as with OAuth. + safe to use it in other times too. However, it may break request + signing, such as with OAuth. Supports an optional ``fields`` parameter of key/value strings AND key/filetuple. A filetuple is a (filename, data, MIME type) tuple where - the MIME type is optional. For example: :: + the MIME type is optional. For example:: fields = { 'foo': 'bar', @@ -119,23 +113,29 @@ class RequestMethods(object): When uploading a file, providing a filename (the first parameter of the tuple) is optional but recommended to best mimick behavior of browsers. - Note that if ``headers`` are supplied, the 'Content-Type' header will be - overwritten because it depends on the dynamic random boundary string + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string which is used to compose the body of the request. The random boundary string can be explicitly set with the ``multipart_boundary`` parameter. """ - if encode_multipart: - body, content_type = encode_multipart_formdata(fields or {}, - boundary=multipart_boundary) - else: - body, content_type = (urlencode(fields or {}), - 'application/x-www-form-urlencoded') - if headers is None: headers = self.headers - headers_ = {'Content-Type': content_type} - headers_.update(headers) + extra_kw = {'headers': {}} - return self.urlopen(method, url, body=body, headers=headers_, - **urlopen_kw) + if fields: + if 'body' in urlopen_kw: + raise TypeError('request got values for both \'fields\' and \'body\', can only specify one.') + + if encode_multipart: + body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) + else: + body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' + + extra_kw['body'] = body + extra_kw['headers'] = {'Content-Type': content_type} + + extra_kw['headers'].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/awx/lib/site-packages/requests/packages/urllib3/response.py b/awx/lib/site-packages/requests/packages/urllib3/response.py index db441828aa..e69de95733 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/response.py +++ b/awx/lib/site-packages/requests/packages/urllib3/response.py @@ -1,22 +1,14 @@ -# urllib3/response.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - - -import logging import zlib import io +from socket import timeout as SocketTimeout from ._collections import HTTPHeaderDict -from .exceptions import DecodeError +from .exceptions import ProtocolError, DecodeError, ReadTimeoutError from .packages.six import string_types as basestring, binary_type -from .util import is_fp_closed +from .connection import HTTPException, BaseSSLError +from .util.response import is_fp_closed -log = logging.getLogger(__name__) - class DeflateDecoder(object): @@ -56,7 +48,10 @@ class HTTPResponse(io.IOBase): HTTP Response container. Backwards-compatible to httplib's HTTPResponse but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. Extra parameters for behaviour not present in httplib.HTTPResponse: @@ -91,11 +86,14 @@ class HTTPResponse(io.IOBase): self.decode_content = decode_content self._decoder = None - self._body = body if body and isinstance(body, basestring) else None + self._body = None self._fp = None self._original_response = original_response self._fp_bytes_read = 0 + if body and isinstance(body, (basestring, binary_type)): + self._body = body + self._pool = pool self._connection = connection @@ -163,8 +161,8 @@ class HTTPResponse(io.IOBase): after having ``.read()`` the file object. (Overridden if ``amt`` is set.) """ - # Note: content-encoding value should be case-insensitive, per RFC 2616 - # Section 3.5 + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 content_encoding = self.headers.get('content-encoding', '').lower() if self._decoder is None: if content_encoding in self.CONTENT_DECODERS: @@ -178,23 +176,42 @@ class HTTPResponse(io.IOBase): flush_decoder = False try: - if amt is None: - # cStringIO doesn't like amt=None - data = self._fp.read() - flush_decoder = True - else: - cache_content = False - data = self._fp.read(amt) - if amt != 0 and not data: # Platform-specific: Buggy versions of Python. - # Close the connection when no data is returned - # - # This is redundant to what httplib/http.client _should_ - # already do. However, versions of python released before - # December 15, 2012 (http://bugs.python.org/issue16298) do not - # properly close the connection in all cases. There is no harm - # in redundantly calling close. - self._fp.close() + try: + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() flush_decoder = True + else: + cache_content = False + data = self._fp.read(amt) + if amt != 0 and not data: # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if not 'read operation timed out' in str(e): # Defensive: + # This shouldn't happen but just in case we're missing an edge + # case, let's avoid swallowing SSL errors. + raise + + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except HTTPException as e: + # This includes IncompleteRead. + raise ProtocolError('Connection broken: %r' % e, e) self._fp_bytes_read += len(data) @@ -204,8 +221,7 @@ class HTTPResponse(io.IOBase): except (IOError, zlib.error) as e: raise DecodeError( "Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding, - e) + "failed to decode it." % content_encoding, e) if flush_decoder and decode_content and self._decoder: buf = self._decoder.decompress(binary_type()) @@ -242,7 +258,6 @@ class HTTPResponse(io.IOBase): if data: yield data - @classmethod def from_httplib(ResponseCls, r, **response_kw): """ @@ -297,7 +312,7 @@ class HTTPResponse(io.IOBase): elif hasattr(self._fp, "fileno"): return self._fp.fileno() else: - raise IOError("The file-like object this HTTPResponse is wrapped " + raise IOError("The file-like object this HTTPResponse is wrapped " "around has no file descriptor") def flush(self): @@ -305,4 +320,14 @@ class HTTPResponse(io.IOBase): return self._fp.flush() def readable(self): + # This method is required for `io` module compatibility. return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[:len(temp)] = temp + return len(temp) diff --git a/awx/lib/site-packages/requests/packages/urllib3/util/__init__.py b/awx/lib/site-packages/requests/packages/urllib3/util/__init__.py index a40185eeaf..8becc81433 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/util/__init__.py +++ b/awx/lib/site-packages/requests/packages/urllib3/util/__init__.py @@ -1,9 +1,4 @@ -# urllib3/util/__init__.py -# Copyright 2008-2014 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - +# For backwards compatibility, provide imports that used to be here. from .connection import is_connection_dropped from .request import make_headers from .response import is_fp_closed @@ -19,6 +14,8 @@ from .timeout import ( current_time, Timeout, ) + +from .retry import Retry from .url import ( get_host, parse_url, diff --git a/awx/lib/site-packages/requests/packages/urllib3/util/connection.py b/awx/lib/site-packages/requests/packages/urllib3/util/connection.py index 8deeab5cc0..2156993a0c 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/util/connection.py +++ b/awx/lib/site-packages/requests/packages/urllib3/util/connection.py @@ -1,4 +1,4 @@ -from socket import error as SocketError +import socket try: from select import poll, POLLIN except ImportError: # `poll` doesn't exist on OSX and other platforms @@ -8,6 +8,7 @@ except ImportError: # `poll` doesn't exist on OSX and other platforms except ImportError: # `select` doesn't exist on AppEngine. select = False + def is_connection_dropped(conn): # Platform-specific """ Returns True if the connection is dropped and should be closed. @@ -22,7 +23,7 @@ def is_connection_dropped(conn): # Platform-specific if sock is False: # Platform-specific: AppEngine return False if sock is None: # Connection already closed (such as by httplib). - return False + return True if not poll: if not select: # Platform-specific: AppEngine @@ -30,7 +31,7 @@ def is_connection_dropped(conn): # Platform-specific try: return select([sock], [], [], 0.0)[0] - except SocketError: + except socket.error: return True # This version is better on platforms that support it. @@ -42,4 +43,55 @@ def is_connection_dropped(conn): # Platform-specific return True +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, socket_options=None): + """Connect to *address* and return the socket object. + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + err = None + for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + # This is the only addition urllib3 makes to this function. + _set_socket_options(sock, socket_options) + + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error as _: + err = _ + if sock is not None: + sock.close() + + if err is not None: + raise err + else: + raise socket.error("getaddrinfo returns an empty list") + + +def _set_socket_options(sock, options): + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) diff --git a/awx/lib/site-packages/requests/packages/urllib3/util/request.py b/awx/lib/site-packages/requests/packages/urllib3/util/request.py index d48d6513b1..bc64f6b1fb 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/util/request.py +++ b/awx/lib/site-packages/requests/packages/urllib3/util/request.py @@ -1,13 +1,12 @@ from base64 import b64encode -from ..packages import six - +from ..packages.six import b ACCEPT_ENCODING = 'gzip,deflate' def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, - basic_auth=None, proxy_basic_auth=None): + basic_auth=None, proxy_basic_auth=None, disable_cache=None): """ Shortcuts for generating request headers. @@ -32,7 +31,10 @@ def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, Colon-separated username:password string for 'proxy-authorization: basic ...' auth header. - Example: :: + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: >>> make_headers(keep_alive=True, user_agent="Batman/1.0") {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} @@ -57,12 +59,13 @@ def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, if basic_auth: headers['authorization'] = 'Basic ' + \ - b64encode(six.b(basic_auth)).decode('utf-8') + b64encode(b(basic_auth)).decode('utf-8') if proxy_basic_auth: headers['proxy-authorization'] = 'Basic ' + \ - b64encode(six.b(proxy_basic_auth)).decode('utf-8') + b64encode(b(proxy_basic_auth)).decode('utf-8') + + if disable_cache: + headers['cache-control'] = 'no-cache' return headers - - diff --git a/awx/lib/site-packages/requests/packages/urllib3/util/response.py b/awx/lib/site-packages/requests/packages/urllib3/util/response.py index d0325bc6b5..45fff55246 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/util/response.py +++ b/awx/lib/site-packages/requests/packages/urllib3/util/response.py @@ -5,9 +5,18 @@ def is_fp_closed(obj): :param obj: The file-like object to check. """ - if hasattr(obj, 'fp'): - # Object is a container for another file-like object that gets released - # on exhaustion (e.g. HTTPResponse) - return obj.fp is None - return obj.closed + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") diff --git a/awx/lib/site-packages/requests/packages/urllib3/util/retry.py b/awx/lib/site-packages/requests/packages/urllib3/util/retry.py new file mode 100644 index 0000000000..aeaf8a0253 --- /dev/null +++ b/awx/lib/site-packages/requests/packages/urllib3/util/retry.py @@ -0,0 +1,285 @@ +import time +import logging + +from ..exceptions import ( + ConnectTimeoutError, + MaxRetryError, + ProtocolError, + ReadTimeoutError, + ResponseError, +) +from ..packages import six + + +log = logging.getLogger(__name__) + + +class Retry(object): + """ Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. It's a good idea to set this to some sensibly-high value to + account for unexpected edge cases and avoid infinite retry loops. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param iterable method_whitelist: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + indempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. + + :param iterable status_forcelist: + A set of HTTP status codes that we should force a retry on. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts. urllib3 will sleep for:: + + {backoff factor} * (2 ^ ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.1s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.MAX_BACKOFF`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + #: Maximum backoff time. + BACKOFF_MAX = 120 + + def __init__(self, total=10, connect=None, read=None, redirect=None, + method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, + backoff_factor=0, raise_on_redirect=True, _observed_errors=0): + + self.total = total + self.connect = connect + self.read = read + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.method_whitelist = method_whitelist + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self._observed_errors = _observed_errors # TODO: use .history instead? + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, read=self.read, redirect=self.redirect, + method_whitelist=self.method_whitelist, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + _observed_errors=self._observed_errors, + ) + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """ Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r" % (retries, new_retries)) + return new_retries + + def get_backoff_time(self): + """ Formula for computing the current backoff + + :rtype: float + """ + if self._observed_errors <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (self._observed_errors - 1)) + return min(self.BACKOFF_MAX, backoff_value) + + def sleep(self): + """ Sleep between retry attempts using an exponential backoff. + + By default, the backoff factor is 0 and this method will return + immediately. + """ + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def _is_connection_error(self, err): + """ Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """ Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def is_forced_retry(self, method, status_code): + """ Is this method/response retryable? (Based on method/codes whitelists) + """ + if self.method_whitelist and method.upper() not in self.method_whitelist: + return False + + return self.status_forcelist and status_code in self.status_forcelist + + def is_exhausted(self): + """ Are we out of retries? """ + retry_counts = (self.total, self.connect, self.read, self.redirect) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, method=None, url=None, response=None, error=None, _pool=None, _stacktrace=None): + """ Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + _observed_errors = self._observed_errors + connect = self.connect + read = self.read + redirect = self.redirect + cause = 'unknown' + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + _observed_errors += 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False: + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + _observed_errors += 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = 'too many redirects' + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + _observed_errors += 1 + cause = ResponseError.GENERIC_ERROR + if response and response.status: + cause = ResponseError.SPECIFIC_ERROR.format( + status_code=response.status) + + new_retry = self.new( + total=total, + connect=connect, read=read, redirect=redirect, + _observed_errors=_observed_errors) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r" % (url, new_retry)) + + return new_retry + + + def __repr__(self): + return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' + 'read={self.read}, redirect={self.redirect})').format( + cls=type(self), self=self) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/awx/lib/site-packages/requests/packages/urllib3/util/ssl_.py b/awx/lib/site-packages/requests/packages/urllib3/util/ssl_.py index dee4b87629..a788b1b98c 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/util/ssl_.py +++ b/awx/lib/site-packages/requests/packages/urllib3/util/ssl_.py @@ -4,18 +4,84 @@ from hashlib import md5, sha1 from ..exceptions import SSLError -try: # Test for SSL features - SSLContext = None - HAS_SNI = False +SSLContext = None +HAS_SNI = False +create_default_context = None - import ssl +import errno +import ssl + +try: # Test for SSL features from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 - from ssl import SSLContext # Modern SSL? from ssl import HAS_SNI # Has SNI? except ImportError: pass +try: + from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + +try: + from ssl import _DEFAULT_CIPHERS +except ImportError: + _DEFAULT_CIPHERS = ( + 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:' + 'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:ECDH+RC4:' + 'DH+RC4:RSA+RC4:!aNULL:!eNULL:!MD5' + ) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + import sys + + class SSLContext(object): # Platform-specific: Python 2 & 3.1 + supports_set_ciphers = sys.version_info >= (2, 7) + + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, location): + self.ca_certs = location + + def set_ciphers(self, cipher_suite): + if not self.supports_set_ciphers: + raise TypeError( + 'Your version of Python does not support setting ' + 'a custom cipher suite. Please upgrade to Python ' + '2.7, 3.2, or later if you need this functionality.' + ) + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None): + kwargs = { + 'keyfile': self.keyfile, + 'certfile': self.certfile, + 'ca_certs': self.ca_certs, + 'cert_reqs': self.verify_mode, + 'ssl_version': self.protocol, + } + if self.supports_set_ciphers: # Platform-specific: Python 2.7+ + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + else: # Platform-specific: Python 2.6 + return wrap_socket(socket, **kwargs) + + def assert_fingerprint(cert, fingerprint): """ Checks if given fingerprint matches the supplied certificate. @@ -34,10 +100,9 @@ def assert_fingerprint(cert, fingerprint): } fingerprint = fingerprint.replace(':', '').lower() + digest_length, odd = divmod(len(fingerprint), 2) - digest_length, rest = divmod(len(fingerprint), 2) - - if rest or digest_length not in hashfunc_map: + if odd or digest_length not in hashfunc_map: raise SSLError('Fingerprint is of invalid length.') # We need encode() here for py32; works on py2 and p33. @@ -92,42 +157,98 @@ def resolve_ssl_version(candidate): return candidate -if SSLContext is not None: # Python 3.2+ - def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, - ca_certs=None, server_hostname=None, - ssl_version=None): - """ - All arguments except `server_hostname` have the same meaning as for - :func:`ssl.wrap_socket` +def create_urllib3_context(ssl_version=None, cert_reqs=ssl.CERT_REQUIRED, + options=None, ciphers=None): + """All arguments have the same meaning as ``ssl_wrap_socket``. - :param server_hostname: - Hostname of the expected certificate - """ - context = SSLContext(ssl_version) - context.verify_mode = cert_reqs + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: - # Disable TLS compression to migitate CRIME attack (issue #309) - OP_NO_COMPRESSION = 0x20000 - context.options |= OP_NO_COMPRESSION + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers - if ca_certs: - try: - context.load_verify_locations(ca_certs) - # Py32 raises IOError - # Py33 raises FileNotFoundError - except Exception as e: # Reraise as SSLError + If you wish to enable SSLv3, you can do:: + + from urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + + context.options |= options + + if getattr(context, 'supports_set_ciphers', True): # Platform-specific: Python 2.6 + context.set_ciphers(ciphers or _DEFAULT_CIPHERS) + + context.verify_mode = cert_reqs + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 + context.check_hostname = (context.verify_mode == ssl.CERT_REQUIRED) + return context + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None, ciphers=None, ssl_context=None): + """ + All arguments except for server_hostname and ssl_context have the same + meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. This is not + supported on Python 2.6 as the ssl module does not support it. + """ + context = ssl_context + if context is None: + context = create_urllib3_context(ssl_version, cert_reqs, + ciphers=ciphers) + + if ca_certs: + try: + context.load_verify_locations(ca_certs) + except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2 + raise SSLError(e) + # Py33 raises FileNotFoundError which subclasses OSError + # These are not equivalent unless we check the errno attribute + except OSError as e: # Platform-specific: Python 3.3 and beyond + if e.errno == errno.ENOENT: raise SSLError(e) - if certfile: - # FIXME: This block needs a test. - context.load_cert_chain(certfile, keyfile) - if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI - return context.wrap_socket(sock, server_hostname=server_hostname) - return context.wrap_socket(sock) - -else: # Python 3.1 and earlier - def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, - ca_certs=None, server_hostname=None, - ssl_version=None): - return wrap_socket(sock, keyfile=keyfile, certfile=certfile, - ca_certs=ca_certs, cert_reqs=cert_reqs, - ssl_version=ssl_version) + raise + if certfile: + context.load_cert_chain(certfile, keyfile) + if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI + return context.wrap_socket(sock, server_hostname=server_hostname) + return context.wrap_socket(sock) diff --git a/awx/lib/site-packages/requests/packages/urllib3/util/timeout.py b/awx/lib/site-packages/requests/packages/urllib3/util/timeout.py index 4f947cb249..ea7027f3f5 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/util/timeout.py +++ b/awx/lib/site-packages/requests/packages/urllib3/util/timeout.py @@ -1,32 +1,49 @@ +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user from socket import _GLOBAL_DEFAULT_TIMEOUT import time from ..exceptions import TimeoutStateError +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() def current_time(): """ - Retrieve the current time, this function is mocked out in unit testing. + Retrieve the current time. This function is mocked out in unit testing. """ return time.time() -_Default = object() -# The default timeout to use for socket connections. This is the attribute used -# by httplib to define the default timeout - - class Timeout(object): - """ - Utility object for storing timeout values. + """ Timeout configuration. - Example usage: + Timeouts can be defined as a default for a pool:: - .. code-block:: python + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') - timeout = urllib3.util.Timeout(connect=2.0, read=7.0) - pool = HTTPConnectionPool('www.google.com', 80, timeout=timeout) - pool.request(...) # Etc, etc + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``:: + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: integer, float, or None :param connect: The maximum amount of time to wait for a connection attempt to a server @@ -47,25 +64,15 @@ class Timeout(object): :type read: integer, float, or None - :param total: - This combines the connect and read timeouts into one; the read timeout - will be set to the time leftover from the connect attempt. In the - event that both a connect timeout and a total are specified, or a read - timeout and a total are specified, the shorter timeout will be applied. - - Defaults to None. - - :type total: integer, float, or None - .. note:: Many factors can affect the total amount of time for urllib3 to return - an HTTP response. Specifically, Python's DNS resolver does not obey the - timeout specified on the socket. Other factors that can affect total - request time include high CPU load, high swap, the program running at a - low priority level, or other behaviors. The observed running time for - urllib3 to return a response may be greater than the value passed to - `total`. + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. In addition, the read and total timeouts only measure the time between read operations on the socket connecting the client and the server, @@ -73,8 +80,8 @@ class Timeout(object): response. For most requests, the timeout is raised because the server has not sent the first byte in the specified time. This is not always the case; if a server streams one byte every fifteen seconds, a timeout - of 20 seconds will not ever trigger, even though the request will - take several minutes to complete. + of 20 seconds will not trigger, even though the request will take + several minutes to complete. If your goal is to cut off any request after a set amount of wall clock time, consider having a second "watcher" thread to cut off a slow @@ -94,17 +101,16 @@ class Timeout(object): return '%s(connect=%r, read=%r, total=%r)' % ( type(self).__name__, self._connect, self._read, self.total) - @classmethod def _validate_timeout(cls, value, name): - """ Check that a timeout attribute is valid + """ Check that a timeout attribute is valid. :param value: The timeout value to validate - :param name: The name of the timeout attribute to validate. This is used - for clear error messages - :return: the value - :raises ValueError: if the type is not an integer or a float, or if it - is a numeric value less than zero + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If the type is not an integer or a float, or if it + is a numeric value less than zero. """ if value is _Default: return cls.DEFAULT_TIMEOUT @@ -123,7 +129,7 @@ class Timeout(object): raise ValueError("Attempted to set %s timeout to %s, but the " "timeout cannot be set to a value less " "than 0." % (name, value)) - except TypeError: # Python 3 + except TypeError: # Python 3 raise ValueError("Timeout value %s was %s, but it must be an " "int or float." % (name, value)) @@ -135,12 +141,12 @@ class Timeout(object): The timeout value used by httplib.py sets the same timeout on the connect(), and recv() socket requests. This creates a :class:`Timeout` - object that sets the individual timeouts to the ``timeout`` value passed - to this function. + object that sets the individual timeouts to the ``timeout`` value + passed to this function. - :param timeout: The legacy timeout value + :param timeout: The legacy timeout value. :type timeout: integer, float, sentinel default object, or None - :return: a Timeout object + :return: Timeout object :rtype: :class:`Timeout` """ return Timeout(read=timeout, connect=timeout) @@ -174,7 +180,7 @@ class Timeout(object): def get_connect_duration(self): """ Gets the time elapsed since the call to :meth:`start_connect`. - :return: the elapsed time + :return: Elapsed time. :rtype: float :raises urllib3.exceptions.TimeoutStateError: if you attempt to get duration for a timer that hasn't been started. @@ -191,7 +197,7 @@ class Timeout(object): This will be a positive float or integer, the value None (never timeout), or the default system timeout. - :return: the connect timeout + :return: Connect timeout. :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None """ if self.total is None: @@ -214,7 +220,7 @@ class Timeout(object): established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be raised. - :return: the value to use for the read timeout + :return: Value to use for the read timeout. :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` has not yet been called on this object. @@ -223,7 +229,7 @@ class Timeout(object): self.total is not self.DEFAULT_TIMEOUT and self._read is not None and self._read is not self.DEFAULT_TIMEOUT): - # in case the connect timeout has not yet been established. + # In case the connect timeout has not yet been established. if self._start_connect is None: return self._read return max(0, min(self.total - self.get_connect_duration(), diff --git a/awx/lib/site-packages/requests/packages/urllib3/util/url.py b/awx/lib/site-packages/requests/packages/urllib3/util/url.py index 362d216089..b2ec834fe7 100644 --- a/awx/lib/site-packages/requests/packages/urllib3/util/url.py +++ b/awx/lib/site-packages/requests/packages/urllib3/util/url.py @@ -3,15 +3,20 @@ from collections import namedtuple from ..exceptions import LocationParseError -class Url(namedtuple('Url', ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'])): +url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] + + +class Url(namedtuple('Url', url_attrs)): """ Datastructure for representing an HTTP URL. Used as a return value for :func:`parse_url`. """ slots = () - def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, query=None, fragment=None): - return super(Url, cls).__new__(cls, scheme, auth, host, port, path, query, fragment) + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, + query=None, fragment=None): + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, + query, fragment) @property def hostname(self): @@ -35,6 +40,48 @@ class Url(namedtuple('Url', ['scheme', 'auth', 'host', 'port', 'path', 'query', return '%s:%d' % (self.host, self.port) return self.host + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = '' + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + '://' + if auth is not None: + url += auth + '@' + if host is not None: + url += host + if port is not None: + url += ':' + str(port) + if path is not None: + url += path + if query is not None: + url += '?' + query + if fragment is not None: + url += '#' + fragment + + return url + + def __str__(self): + return self.url def split_first(s, delims): """ @@ -43,7 +90,7 @@ def split_first(s, delims): If not found, then the first part is the full input string. - Example: :: + Example:: >>> split_first('foo/bar?baz', '?/=') ('foo', 'bar?baz', '/') @@ -76,10 +123,10 @@ def parse_url(url): Partly backwards-compatible with :mod:`urlparse`. - Example: :: + Example:: >>> parse_url('http://google.com/mail/') - Url(scheme='http', host='google.com', port=None, path='/', ...) + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) >>> parse_url('google.com:80') Url(scheme=None, host='google.com', port=80, path=None, ...) >>> parse_url('/foo?bar') @@ -91,6 +138,10 @@ def parse_url(url): # Additionally, this implementations does silly things to be optimal # on CPython. + if not url: + # Empty + return Url() + scheme = None auth = None host = None @@ -153,7 +204,6 @@ def parse_url(url): return Url(scheme, auth, host, port, path, query, fragment) - def get_host(url): """ Deprecated. Use :func:`.parse_url` instead. diff --git a/awx/lib/site-packages/requests/sessions.py b/awx/lib/site-packages/requests/sessions.py index df85a25c11..4f30696353 100644 --- a/awx/lib/site-packages/requests/sessions.py +++ b/awx/lib/site-packages/requests/sessions.py @@ -13,7 +13,7 @@ from collections import Mapping from datetime import datetime from .auth import _basic_auth_str -from .compat import cookielib, OrderedDict, urljoin, urlparse, builtin_str +from .compat import cookielib, OrderedDict, urljoin, urlparse from .cookies import ( cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT @@ -21,6 +21,7 @@ from .hooks import default_hooks, dispatch_hook from .utils import to_key_val_list, default_headers, to_native_string from .exceptions import ( TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) +from .packages.urllib3._collections import RecentlyUsedContainer from .structures import CaseInsensitiveDict from .adapters import HTTPAdapter @@ -35,6 +36,8 @@ from .status_codes import codes # formerly defined here, reexposed here for backward compatibility from .models import REDIRECT_STATI +REDIRECT_CACHE_SIZE = 1000 + def merge_setting(request_setting, session_setting, dict_class=OrderedDict): """ @@ -91,10 +94,17 @@ class SessionRedirectMixin(object): """Receives a Response. Returns a generator of Responses.""" i = 0 + hist = [] # keep track of history while resp.is_redirect: prepared_request = req.copy() + if i > 0: + # Update history and keep track of redirects. + hist.append(resp) + new_hist = list(hist) + resp.history = new_hist + try: resp.content # Consume socket so it can be released except (ChunkedEncodingError, ContentDecodingError, RuntimeError): @@ -118,17 +128,20 @@ class SessionRedirectMixin(object): parsed = urlparse(url) url = parsed.geturl() - # Facilitate non-RFC2616-compliant 'location' headers + # Facilitate relative 'location' headers, as allowed by RFC 7231. # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') # Compliant with RFC3986, we percent encode the url. - if not urlparse(url).netloc: + if not parsed.netloc: url = urljoin(resp.url, requote_uri(url)) else: url = requote_uri(url) prepared_request.url = to_native_string(url) + # Cache the url, unless it redirects to itself. + if resp.is_permanent_redirect and req.url != prepared_request.url: + self.redirect_cache[req.url] = prepared_request.url - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4 + # http://tools.ietf.org/html/rfc7231#section-6.4.4 if (resp.status_code == codes.see_other and method != 'HEAD'): method = 'GET' @@ -146,7 +159,7 @@ class SessionRedirectMixin(object): prepared_request.method = method # https://github.com/kennethreitz/requests/issues/1084 - if resp.status_code not in (codes.temporary, codes.resume): + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): if 'Content-Length' in prepared_request.headers: del prepared_request.headers['Content-Length'] @@ -261,9 +274,10 @@ class Session(SessionRedirectMixin): """ __attrs__ = [ - 'headers', 'cookies', 'auth', 'timeout', 'proxies', 'hooks', - 'params', 'verify', 'cert', 'prefetch', 'adapters', 'stream', - 'trust_env', 'max_redirects'] + 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', + 'max_redirects', + ] def __init__(self): @@ -316,6 +330,9 @@ class Session(SessionRedirectMixin): self.mount('https://', HTTPAdapter()) self.mount('http://', HTTPAdapter()) + # Only store 1000 redirects to prevent using infinite memory + self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE) + def __enter__(self): return self @@ -353,6 +370,7 @@ class Session(SessionRedirectMixin): url=request.url, files=request.files, data=request.data, + json=request.json, headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), params=merge_setting(request.params, self.params), auth=merge_setting(auth, self.auth), @@ -374,7 +392,8 @@ class Session(SessionRedirectMixin): hooks=None, stream=None, verify=None, - cert=None): + cert=None, + json=None): """Constructs a :class:`Request <Request>`, prepares it and sends it. Returns :class:`Response <Response>` object. @@ -384,17 +403,22 @@ class Session(SessionRedirectMixin): string for the :class:`Request`. :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of 'filename': file-like-objects + :param files: (optional) Dictionary of ``'filename': file-like-objects`` for multipart encoding upload. :param auth: (optional) Auth tuple or callable to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) Float describing the timeout of the - request in seconds. - :param allow_redirects: (optional) Boolean. Set to True by default. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a (`connect timeout, read + timeout <user/advanced.html#timeouts>`_) tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. :param stream: (optional) whether to immediately download the response @@ -405,7 +429,7 @@ class Session(SessionRedirectMixin): If Tuple, ('cert', 'key') pair. """ - method = builtin_str(method) + method = to_native_string(method) # Create the Request. req = Request( @@ -414,6 +438,7 @@ class Session(SessionRedirectMixin): headers = headers, files = files, data = data or {}, + json = json, params = params or {}, auth = auth, cookies = cookies, @@ -423,36 +448,16 @@ class Session(SessionRedirectMixin): proxies = proxies or {} - # Gather clues from the surrounding environment. - if self.trust_env: - # Set environment's proxies. - env_proxies = get_environ_proxies(url) or {} - for (k, v) in env_proxies.items(): - proxies.setdefault(k, v) - - # Look for configuration. - if not verify and verify is not False: - verify = os.environ.get('REQUESTS_CA_BUNDLE') - - # Curl compatibility. - if not verify and verify is not False: - verify = os.environ.get('CURL_CA_BUNDLE') - - # Merge all the kwargs. - proxies = merge_setting(proxies, self.proxies) - stream = merge_setting(stream, self.stream) - verify = merge_setting(verify, self.verify) - cert = merge_setting(cert, self.cert) + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) # Send the request. send_kwargs = { - 'stream': stream, 'timeout': timeout, - 'verify': verify, - 'cert': cert, - 'proxies': proxies, 'allow_redirects': allow_redirects, } + send_kwargs.update(settings) resp = self.send(prep, **send_kwargs) return resp @@ -487,15 +492,16 @@ class Session(SessionRedirectMixin): kwargs.setdefault('allow_redirects', False) return self.request('HEAD', url, **kwargs) - def post(self, url, data=None, **kwargs): + def post(self, url, data=None, json=None, **kwargs): """Sends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. """ - return self.request('POST', url, data=data, **kwargs) + return self.request('POST', url, data=data, json=json, **kwargs) def put(self, url, data=None, **kwargs): """Sends a PUT request. Returns :class:`Response` object. @@ -540,6 +546,14 @@ class Session(SessionRedirectMixin): if not isinstance(request, PreparedRequest): raise ValueError('You can only send PreparedRequests.') + checked_urls = set() + while request.url in self.redirect_cache: + checked_urls.add(request.url) + new_url = self.redirect_cache.get(request.url) + if new_url in checked_urls: + break + request.url = new_url + # Set up variables needed for resolve_redirects and dispatching of hooks allow_redirects = kwargs.pop('allow_redirects', True) stream = kwargs.get('stream') @@ -597,6 +611,30 @@ class Session(SessionRedirectMixin): return r + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """Check the environment and merge it with some settings.""" + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + env_proxies = get_environ_proxies(url) or {} + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + def get_adapter(self, url): """Returns the appropriate connnection adapter for the given URL.""" for (prefix, adapter) in self.adapters.items(): @@ -624,12 +662,19 @@ class Session(SessionRedirectMixin): self.adapters[key] = self.adapters.pop(key) def __getstate__(self): - return dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) + state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) + state['redirect_cache'] = dict(self.redirect_cache) + return state def __setstate__(self, state): + redirect_cache = state.pop('redirect_cache', {}) for attr, value in state.items(): setattr(self, attr, value) + self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE) + for redirect, to in redirect_cache.items(): + self.redirect_cache[redirect] = to + def session(): """Returns a :class:`Session` for context-management.""" diff --git a/awx/lib/site-packages/requests/status_codes.py b/awx/lib/site-packages/requests/status_codes.py index ed7a8660a6..e0887f210a 100644 --- a/awx/lib/site-packages/requests/status_codes.py +++ b/awx/lib/site-packages/requests/status_codes.py @@ -30,7 +30,8 @@ _codes = { 305: ('use_proxy',), 306: ('switch_proxy',), 307: ('temporary_redirect', 'temporary_moved', 'temporary'), - 308: ('resume_incomplete', 'resume'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 # Client Error. 400: ('bad_request', 'bad'), diff --git a/awx/lib/site-packages/requests/structures.py b/awx/lib/site-packages/requests/structures.py index 9fd78187f2..3e5f2faa2e 100644 --- a/awx/lib/site-packages/requests/structures.py +++ b/awx/lib/site-packages/requests/structures.py @@ -8,30 +8,7 @@ Data structures that power Requests. """ -import os import collections -from itertools import islice - - -class IteratorProxy(object): - """docstring for IteratorProxy""" - def __init__(self, i): - self.i = i - # self.i = chain.from_iterable(i) - - def __iter__(self): - return self.i - - def __len__(self): - if hasattr(self.i, '__len__'): - return len(self.i) - if hasattr(self.i, 'len'): - return self.i.len - if hasattr(self.i, 'fileno'): - return os.fstat(self.i.fileno()).st_size - - def read(self, n): - return "".join(islice(self.i, None, n)) class CaseInsensitiveDict(collections.MutableMapping): @@ -46,7 +23,7 @@ class CaseInsensitiveDict(collections.MutableMapping): case of the last key to be set, and ``iter(instance)``, ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` will contain case-sensitive keys. However, querying and contains - testing is case insensitive: + testing is case insensitive:: cid = CaseInsensitiveDict() cid['Accept'] = 'application/json' diff --git a/awx/lib/site-packages/requests/utils.py b/awx/lib/site-packages/requests/utils.py index 68e50cf0a9..7467941447 100644 --- a/awx/lib/site-packages/requests/utils.py +++ b/awx/lib/site-packages/requests/utils.py @@ -19,6 +19,7 @@ import re import sys import socket import struct +import warnings from . import __version__ from . import certs @@ -114,7 +115,7 @@ def get_netrc_auth(url): def guess_filename(obj): """Tries to guess the filename of the given object.""" name = getattr(obj, 'name', None) - if name and name[0] != '<' and name[-1] != '>': + if name and isinstance(name, builtin_str) and name[0] != '<' and name[-1] != '>': return os.path.basename(name) @@ -287,6 +288,11 @@ def get_encodings_from_content(content): :param content: bytestring to extract encodings from. """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I) @@ -351,12 +357,14 @@ def get_unicode_from_response(r): Tried: 1. charset from content-type - - 2. every encodings from ``<meta ... charset=XXX>`` - - 3. fall back and replace all unicode characters + 2. fall back and replace all unicode characters """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) tried_encodings = [] @@ -554,7 +562,8 @@ def default_headers(): return CaseInsensitiveDict({ 'User-Agent': default_user_agent(), 'Accept-Encoding': ', '.join(('gzip', 'deflate')), - 'Accept': '*/*' + 'Accept': '*/*', + 'Connection': 'keep-alive', }) @@ -569,7 +578,7 @@ def parse_header_links(value): replace_chars = " '\"" - for val in value.split(","): + for val in re.split(", *<", value): try: url, params = val.split(";", 1) except ValueError: @@ -671,3 +680,18 @@ def to_native_string(string, encoding='ascii'): out = string.decode(encoding) return out + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) From 48a7b5f80e243031ef71e29f94baff2f3d091ea3 Mon Sep 17 00:00:00 2001 From: Matthew Jones <mat@matburt.net> Date: Thu, 29 Jan 2015 12:41:26 -0500 Subject: [PATCH 06/10] Upgrade six to 1.9.0 --- awx/lib/site-packages/README | 2 +- awx/lib/site-packages/six.py | 111 +++++++++++++++++++++++++++++++---- 2 files changed, 102 insertions(+), 11 deletions(-) diff --git a/awx/lib/site-packages/README b/awx/lib/site-packages/README index d33d0fb595..4cbbec613b 100644 --- a/awx/lib/site-packages/README +++ b/awx/lib/site-packages/README @@ -56,5 +56,5 @@ rax-scheduled-images-python-novaclient-ext==0.2.1 (rax_scheduled_images_python_n requests==2.5.1 (requests/*) setuptools==12.0.5 (setuptools/*, _markerlib/*, pkg_resources/*, easy_install.py) simplejson==3.6.0 (simplejson/*, excluded simplejson/_speedups.so) -six==1.7.3 (six.py) +six==1.9.0 (six.py) South==0.8.4 (south/*) diff --git a/awx/lib/site-packages/six.py b/awx/lib/site-packages/six.py index f8f7d402ff..ffa3fe166a 100644 --- a/awx/lib/site-packages/six.py +++ b/awx/lib/site-packages/six.py @@ -1,6 +1,6 @@ """Utilities for writing code that runs on Python 2 and 3""" -# Copyright (c) 2010-2014 Benjamin Peterson +# Copyright (c) 2010-2015 Benjamin Peterson # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,13 +20,16 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +from __future__ import absolute_import + import functools +import itertools import operator import sys import types __author__ = "Benjamin Peterson <benjamin@python.org>" -__version__ = "1.7.3" +__version__ = "1.9.0" # Useful for very coarse version differentiation. @@ -86,8 +89,12 @@ class _LazyDescr(object): def __get__(self, obj, tp): result = self._resolve() setattr(obj, self.name, result) # Invokes __set__. - # This is a bit ugly, but it avoids running this again. - delattr(obj.__class__, self.name) + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass return result @@ -225,10 +232,12 @@ _moved_attributes = [ MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), MovedAttribute("map", "itertools", "builtins", "imap", "map"), MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("reload_module", "__builtin__", "imp", "reload"), MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), MovedAttribute("StringIO", "StringIO", "io"), MovedAttribute("UserDict", "UserDict", "collections"), MovedAttribute("UserList", "UserList", "collections"), @@ -248,6 +257,7 @@ _moved_attributes = [ MovedModule("html_parser", "HTMLParser", "html.parser"), MovedModule("http_client", "httplib", "http.client"), MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), @@ -317,6 +327,13 @@ _urllib_parse_moved_attributes = [ MovedAttribute("unquote_plus", "urllib", "urllib.parse"), MovedAttribute("urlencode", "urllib", "urllib.parse"), MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), ] for attr in _urllib_parse_moved_attributes: setattr(Module_six_moves_urllib_parse, attr.name, attr) @@ -542,6 +559,12 @@ if PY3: def iterlists(d, **kw): return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") else: def iterkeys(d, **kw): return iter(d.iterkeys(**kw)) @@ -555,6 +578,12 @@ else: def iterlists(d, **kw): return iter(d.iterlists(**kw)) + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + _add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") _add_doc(itervalues, "Return an iterator over the values of a dictionary.") _add_doc(iteritems, @@ -581,6 +610,9 @@ if PY3: import io StringIO = io.StringIO BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" else: def b(s): return s @@ -593,19 +625,35 @@ else: return ord(bs[0]) def indexbytes(buf, i): return ord(buf[i]) - def iterbytes(buf): - return (ord(byte) for byte in buf) + iterbytes = functools.partial(itertools.imap, ord) import StringIO StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" _add_doc(b, """Byte literal""") _add_doc(u, """Text literal""") +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + if PY3: exec_ = getattr(moves.builtins, "exec") def reraise(tp, value, tb=None): + if value is None: + value = tp() if value.__traceback__ is not tb: raise value.with_traceback(tb) raise value @@ -629,6 +677,21 @@ else: """) +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + print_ = getattr(moves.builtins, "print", None) if print_ is None: def print_(*args, **kwargs): @@ -683,13 +746,22 @@ if print_ is None: write(sep) write(arg) write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() _add_doc(reraise, """Reraise an exception.""") if sys.version_info[0:2] < (3, 4): - def wraps(wrapped): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): def wrapper(f): - f = functools.wraps(wrapped)(f) + f = functools.wraps(wrapped, assigned, updated)(f) f.__wrapped__ = wrapped return f return wrapper @@ -711,17 +783,36 @@ def add_metaclass(metaclass): """Class decorator for creating a class with a metaclass.""" def wrapper(cls): orig_vars = cls.__dict__.copy() - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) slots = orig_vars.get('__slots__') if slots is not None: if isinstance(slots, str): slots = [slots] for slots_var in slots: orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) return metaclass(cls.__name__, cls.__bases__, orig_vars) return wrapper + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + # Complete the moves implementation. # This code is at the end of this module to speed up module loading. # Turn this module into a package. From 6c65ba826d35a462005b09110280831f447bc791 Mon Sep 17 00:00:00 2001 From: Matthew Jones <mat@matburt.net> Date: Thu, 29 Jan 2015 12:55:37 -0500 Subject: [PATCH 07/10] Upgrade python dateutil to 2.4.0 --- awx/lib/site-packages/README | 2 +- awx/lib/site-packages/dateutil/__init__.py | 10 +- awx/lib/site-packages/dateutil/easter.py | 36 +- awx/lib/site-packages/dateutil/parser.py | 142 ++-- .../site-packages/dateutil/relativedelta.py | 104 +-- awx/lib/site-packages/dateutil/rrule.py | 614 ++++++++++++------ awx/lib/site-packages/dateutil/tz.py | 308 +++++---- awx/lib/site-packages/dateutil/tzwin.py | 85 +-- .../dateutil/zoneinfo/__init__.py | 151 +++-- .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 0 -> 139808 bytes .../dateutil/zoneinfo/zoneinfo--latest.tar.gz | Bin 198578 -> 0 bytes 11 files changed, 863 insertions(+), 589 deletions(-) create mode 100644 awx/lib/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz delete mode 100644 awx/lib/site-packages/dateutil/zoneinfo/zoneinfo--latest.tar.gz diff --git a/awx/lib/site-packages/README b/awx/lib/site-packages/README index 4cbbec613b..089bda6d94 100644 --- a/awx/lib/site-packages/README +++ b/awx/lib/site-packages/README @@ -45,7 +45,7 @@ pexpect==3.1 (pexpect/*, excluded pxssh.py, fdpexpect.py, FSM.py, screen.py, pip==1.5.4 (pip/*, excluded bin/pip*) prettytable==0.7.2 (prettytable.py) pyrax==1.9.0 (pyrax/*) -python-dateutil==2.2 (dateutil/*) +python-dateutil==2.4.0 (dateutil/*) python-novaclient==2.18.1 (novaclient/*, excluded bin/nova) python-swiftclient==2.2.0 (swiftclient/*, excluded bin/swift) pytz==2014.10 (pytz/*) diff --git a/awx/lib/site-packages/dateutil/__init__.py b/awx/lib/site-packages/dateutil/__init__.py index 1020e72919..f8fde9ba08 100644 --- a/awx/lib/site-packages/dateutil/__init__.py +++ b/awx/lib/site-packages/dateutil/__init__.py @@ -1,10 +1,2 @@ # -*- coding: utf-8 -*- -""" -Copyright (c) 2003-2010 Gustavo Niemeyer <gustavo@niemeyer.net> - -This module offers extensions to the standard Python -datetime module. -""" -__author__ = "Tomi Pieviläinen <tomi.pievilainen@iki.fi>" -__license__ = "Simplified BSD" -__version__ = "2.2" +__version__ = "2.4.0" diff --git a/awx/lib/site-packages/dateutil/easter.py b/awx/lib/site-packages/dateutil/easter.py index d8a38844f9..8d30c4ebda 100644 --- a/awx/lib/site-packages/dateutil/easter.py +++ b/awx/lib/site-packages/dateutil/easter.py @@ -1,18 +1,17 @@ +# -*- coding: utf-8 -*- """ -Copyright (c) 2003-2007 Gustavo Niemeyer <gustavo@niemeyer.net> - -This module offers extensions to the standard Python -datetime module. +This module offers a generic easter computing method for any given year, using +Western, Orthodox or Julian algorithms. """ -__license__ = "Simplified BSD" import datetime __all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"] -EASTER_JULIAN = 1 +EASTER_JULIAN = 1 EASTER_ORTHODOX = 2 -EASTER_WESTERN = 3 +EASTER_WESTERN = 3 + def easter(year, method=EASTER_WESTERN): """ @@ -24,7 +23,7 @@ def easter(year, method=EASTER_WESTERN): This algorithm implements three different easter calculation methods: - + 1 - Original calculation in Julian calendar, valid in dates after 326 AD 2 - Original method, with date converted to Gregorian @@ -39,7 +38,7 @@ def easter(year, method=EASTER_WESTERN): EASTER_WESTERN = 3 The default method is method 3. - + More about the algorithm may be found at: http://users.chariot.net.au/~gmarts/eastalg.htm @@ -68,24 +67,23 @@ def easter(year, method=EASTER_WESTERN): e = 0 if method < 3: # Old method - i = (19*g+15)%30 - j = (y+y//4+i)%7 + i = (19*g + 15) % 30 + j = (y + y//4 + i) % 7 if method == 2: # Extra dates to convert Julian to Gregorian date e = 10 if y > 1600: - e = e+y//100-16-(y//100-16)//4 + e = e + y//100 - 16 - (y//100 - 16)//4 else: # New method c = y//100 - h = (c-c//4-(8*c+13)//25+19*g+15)%30 - i = h-(h//28)*(1-(h//28)*(29//(h+1))*((21-g)//11)) - j = (y+y//4+i+2-c+c//4)%7 + h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30 + i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11)) + j = (y + y//4 + i + 2 - c + c//4) % 7 # p can be from -6 to 56 corresponding to dates 22 March to 23 May # (later dates apply to method 2, although 23 May never actually occurs) - p = i-j+e - d = 1+(p+27+(p+6)//40)%31 - m = 3+(p+26)//30 + p = i - j + e + d = 1 + (p + 27 + (p + 6)//40) % 31 + m = 3 + (p + 26)//30 return datetime.date(int(y), int(m), int(d)) - diff --git a/awx/lib/site-packages/dateutil/parser.py b/awx/lib/site-packages/dateutil/parser.py index aef836238c..8b6c2d28b8 100644 --- a/awx/lib/site-packages/dateutil/parser.py +++ b/awx/lib/site-packages/dateutil/parser.py @@ -1,32 +1,21 @@ # -*- coding:iso-8859-1 -*- """ -Copyright (c) 2003-2007 Gustavo Niemeyer <gustavo@niemeyer.net> - -This module offers extensions to the standard Python -datetime module. +This module offers a generic date/time string parser which is able to parse +most known formats to represent a date and/or time. """ from __future__ import unicode_literals -__license__ = "Simplified BSD" - import datetime import string import time -import sys -import os import collections - -try: - from io import StringIO -except ImportError: - from io import StringIO +from io import StringIO from six import text_type, binary_type, integer_types from . import relativedelta from . import tz - __all__ = ["parse", "parserinfo"] @@ -83,9 +72,9 @@ class _timelex(object): state = '0' elif nextchar in whitespace: token = ' ' - break # emit token + break # emit token else: - break # emit token + break # emit token elif state == 'a': seenletters = True if nextchar in wordchars: @@ -95,7 +84,7 @@ class _timelex(object): state = 'a.' else: self.charstack.append(nextchar) - break # emit token + break # emit token elif state == '0': if nextchar in numchars: token += nextchar @@ -104,7 +93,7 @@ class _timelex(object): state = '0.' else: self.charstack.append(nextchar) - break # emit token + break # emit token elif state == 'a.': seenletters = True if nextchar == '.' or nextchar in wordchars: @@ -114,7 +103,7 @@ class _timelex(object): state = '0.' else: self.charstack.append(nextchar) - break # emit token + break # emit token elif state == '0.': if nextchar == '.' or nextchar in numchars: token += nextchar @@ -123,9 +112,9 @@ class _timelex(object): state = 'a.' else: self.charstack.append(nextchar) - break # emit token - if (state in ('a.', '0.') and - (seenletters or token.count('.') > 1 or token[-1] == '.')): + break # emit token + if (state in ('a.', '0.') and (seenletters or token.count('.') > 1 or + token[-1] == '.')): l = token.split('.') token = l[0] for tok in l[1:]: @@ -183,18 +172,18 @@ class parserinfo(object): ("Fri", "Friday"), ("Sat", "Saturday"), ("Sun", "Sunday")] - MONTHS = [("Jan", "January"), - ("Feb", "February"), - ("Mar", "March"), - ("Apr", "April"), - ("May", "May"), - ("Jun", "June"), - ("Jul", "July"), - ("Aug", "August"), - ("Sep", "Sept", "September"), - ("Oct", "October"), - ("Nov", "November"), - ("Dec", "December")] + MONTHS = [("Jan", "January"), + ("Feb", "February"), + ("Mar", "March"), + ("Apr", "April"), + ("May", "May"), + ("Jun", "June"), + ("Jul", "July"), + ("Aug", "August"), + ("Sep", "Sept", "September"), + ("Oct", "October"), + ("Nov", "November"), + ("Dec", "December")] HMS = [("h", "hour", "hours"), ("m", "minute", "minutes"), ("s", "second", "seconds")] @@ -299,15 +288,16 @@ class parser(object): def __init__(self, info=None): self.info = info or parserinfo() - def parse(self, timestr, default=None, - ignoretz=False, tzinfos=None, - **kwargs): + def parse(self, timestr, default=None, ignoretz=False, tzinfos=None, + **kwargs): if not default: default = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) - - res, skipped_tokens = self._parse(timestr, **kwargs) + if kwargs.get('fuzzy_with_tokens', False): + res, skipped_tokens = self._parse(timestr, **kwargs) + else: + res = self._parse(timestr, **kwargs) if res is None: raise ValueError("unknown string format") @@ -321,7 +311,8 @@ class parser(object): if res.weekday is not None and not res.day: ret = ret+relativedelta.relativedelta(weekday=res.weekday) if not ignoretz: - if isinstance(tzinfos, collections.Callable) or tzinfos and res.tzname in tzinfos: + if (isinstance(tzinfos, collections.Callable) or + tzinfos and res.tzname in tzinfos): if isinstance(tzinfos, collections.Callable): tzdata = tzinfos(res.tzname, res.tzoffset) else: @@ -333,8 +324,8 @@ class parser(object): elif isinstance(tzdata, integer_types): tzinfo = tz.tzoffset(res.tzname, tzdata) else: - raise ValueError("offset must be tzinfo subclass, " \ - "tz string, or int offset") + raise ValueError("offset must be tzinfo subclass, " + "tz string, or int offset") ret = ret.replace(tzinfo=tzinfo) elif res.tzname and res.tzname in time.tzname: ret = ret.replace(tzinfo=tz.tzlocal()) @@ -343,17 +334,18 @@ class parser(object): elif res.tzoffset: ret = ret.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset)) - if skipped_tokens: + if kwargs.get('fuzzy_with_tokens', False): return ret, skipped_tokens - - return ret + else: + return ret class _result(_resultbase): __slots__ = ["year", "month", "day", "weekday", "hour", "minute", "second", "microsecond", "tzname", "tzoffset"] - def _parse(self, timestr, dayfirst=None, yearfirst=None, fuzzy=False, fuzzy_with_tokens=False): + def _parse(self, timestr, dayfirst=None, yearfirst=None, fuzzy=False, + fuzzy_with_tokens=False): if fuzzy_with_tokens: fuzzy = True @@ -365,7 +357,6 @@ class parser(object): res = self._result() l = _timelex.split(timestr) - # keep up with the last token skipped so we can recombine # consecutively skipped tokens (-2 for when i begins at 0). last_skipped_token_i = -2 @@ -440,12 +431,12 @@ class parser(object): while True: if idx == 0: res.hour = int(value) - if value%1: - res.minute = int(60*(value%1)) + if value % 1: + res.minute = int(60*(value % 1)) elif idx == 1: res.minute = int(value) - if value%1: - res.second = int(60*(value%1)) + if value % 1: + res.second = int(60*(value % 1)) elif idx == 2: res.second, res.microsecond = \ _parsems(value_repr) @@ -465,16 +456,17 @@ class parser(object): newidx = info.hms(l[i]) if newidx is not None: idx = newidx - elif i == len_l and l[i-2] == ' ' and info.hms(l[i-3]) is not None: + elif (i == len_l and l[i-2] == ' ' and + info.hms(l[i-3]) is not None): # X h MM or X m SS idx = info.hms(l[i-3]) + 1 if idx == 1: res.minute = int(value) - if value%1: - res.second = int(60*(value%1)) + if value % 1: + res.second = int(60*(value % 1)) elif idx == 2: res.second, res.microsecond = \ - _parsems(value_repr) + _parsems(value_repr) i += 1 elif i+1 < len_l and l[i] == ':': # HH:MM[:SS[.ss]] @@ -482,8 +474,8 @@ class parser(object): i += 1 value = float(l[i]) res.minute = int(value) - if value%1: - res.second = int(60*(value%1)) + if value % 1: + res.second = int(60*(value % 1)) i += 1 if i < len_l and l[i] == ':': res.second, res.microsecond = _parsems(l[i+1]) @@ -597,8 +589,9 @@ class parser(object): # Check for a timezone name if (res.hour is not None and len(l[i]) <= 5 and - res.tzname is None and res.tzoffset is None and - not [x for x in l[i] if x not in string.ascii_uppercase]): + res.tzname is None and res.tzoffset is None and + not [x for x in l[i] if x not in + string.ascii_uppercase]): res.tzname = l[i] res.tzoffset = info.tzoffset(res.tzname) i += 1 @@ -643,7 +636,7 @@ class parser(object): info.jump(l[i]) and l[i+1] == '(' and l[i+3] == ')' and 3 <= len(l[i+2]) <= 5 and not [x for x in l[i+2] - if x not in string.ascii_uppercase]): + if x not in string.ascii_uppercase]): # -0300 (BRST) res.tzname = l[i+2] i += 4 @@ -732,10 +725,12 @@ class parser(object): if fuzzy_with_tokens: return res, tuple(skipped_tokens) - - return res, None + else: + return res DEFAULTPARSER = parser() + + def parse(timestr, parserinfo=None, **kwargs): # Python 2.x support: datetimes return their string presentation as # bytes in 2.x and unicode in 3.x, so it's reasonable to expect that @@ -779,7 +774,7 @@ class _tzparser(object): # BRST+3[BRDT[+2]] j = i while j < len_l and not [x for x in l[j] - if x in "0123456789:,-+"]: + if x in "0123456789:,-+"]: j += 1 if j != i: if not res.stdabbr: @@ -789,8 +784,8 @@ class _tzparser(object): offattr = "dstoffset" res.dstabbr = "".join(l[i:j]) i = j - if (i < len_l and - (l[i] in ('+', '-') or l[i][0] in "0123456789")): + if (i < len_l and (l[i] in ('+', '-') or l[i][0] in + "0123456789")): if l[i] in ('+', '-'): # Yes, that's right. See the TZ variable # documentation. @@ -801,8 +796,8 @@ class _tzparser(object): len_li = len(l[i]) if len_li == 4: # -0300 - setattr(res, offattr, - (int(l[i][:2])*3600+int(l[i][2:])*60)*signal) + setattr(res, offattr, (int(l[i][:2])*3600 + + int(l[i][2:])*60)*signal) elif i+1 < len_l and l[i+1] == ':': # -03:00 setattr(res, offattr, @@ -822,7 +817,8 @@ class _tzparser(object): if i < len_l: for j in range(i, len_l): - if l[j] == ';': l[j] = ',' + if l[j] == ';': + l[j] = ',' assert l[i] == ',' @@ -831,7 +827,7 @@ class _tzparser(object): if i >= len_l: pass elif (8 <= l.count(',') <= 9 and - not [y for x in l[i:] if x != ',' + not [y for x in l[i:] if x != ',' for y in x if y not in "0123456789"]): # GMT0BST,3,0,30,3600,10,0,26,7200[,3600] for x in (res.start, res.end): @@ -845,7 +841,7 @@ class _tzparser(object): i += 2 if value: x.week = value - x.weekday = (int(l[i])-1)%7 + x.weekday = (int(l[i])-1) % 7 else: x.day = int(l[i]) i += 2 @@ -861,7 +857,7 @@ class _tzparser(object): elif (l.count(',') == 2 and l[i:].count('/') <= 2 and not [y for x in l[i:] if x not in (',', '/', 'J', 'M', '.', '-', ':') - for y in x if y not in "0123456789"]): + for y in x if y not in "0123456789"]): for x in (res.start, res.end): if l[i] == 'J': # non-leap year day (1 based) @@ -880,7 +876,7 @@ class _tzparser(object): i += 1 assert l[i] in ('-', '.') i += 1 - x.weekday = (int(l[i])-1)%7 + x.weekday = (int(l[i])-1) % 7 else: # year day (zero based) x.yday = int(l[i])+1 @@ -921,6 +917,8 @@ class _tzparser(object): DEFAULTTZPARSER = _tzparser() + + def _parsetz(tzstr): return DEFAULTTZPARSER.parse(tzstr) diff --git a/awx/lib/site-packages/dateutil/relativedelta.py b/awx/lib/site-packages/dateutil/relativedelta.py index 4393bcbcde..2b5557a96f 100644 --- a/awx/lib/site-packages/dateutil/relativedelta.py +++ b/awx/lib/site-packages/dateutil/relativedelta.py @@ -1,11 +1,4 @@ -""" -Copyright (c) 2003-2010 Gustavo Niemeyer <gustavo@niemeyer.net> - -This module offers extensions to the standard Python -datetime module. -""" -__license__ = "Simplified BSD" - +# -*- coding: utf-8 -*- import datetime import calendar @@ -13,6 +6,7 @@ from six import integer_types __all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + class weekday(object): __slots__ = ["weekday", "n"] @@ -43,25 +37,35 @@ class weekday(object): MO, TU, WE, TH, FR, SA, SU = weekdays = tuple([weekday(x) for x in range(7)]) + class relativedelta(object): """ -The relativedelta type is based on the specification of the excelent -work done by M.-A. Lemburg in his mx.DateTime extension. However, -notice that this type does *NOT* implement the same algorithm as +The relativedelta type is based on the specification of the excellent +work done by M.-A. Lemburg in his +`mx.DateTime <http://www.egenix.com/files/python/mxDateTime.html>`_ extension. +However, notice that this type does *NOT* implement the same algorithm as his work. Do *NOT* expect it to behave like mx.DateTime's counterpart. -There's two different ways to build a relativedelta instance. The -first one is passing it two date/datetime classes: +There are two different ways to build a relativedelta instance. The +first one is passing it two date/datetime classes:: relativedelta(datetime1, datetime2) -And the other way is to use the following keyword arguments: +The second one is passing it any number of the following keyword arguments:: + + relativedelta(arg1=x,arg2=y,arg3=z...) year, month, day, hour, minute, second, microsecond: - Absolute information. + Absolute information (argument is singular); adding or subtracting a + relativedelta with absolute information does not perform an aritmetic + operation, but rather REPLACES the corresponding value in the + original datetime with the value(s) in relativedelta. years, months, weeks, days, hours, minutes, seconds, microseconds: - Relative information, may be negative. + Relative information, may be negative (argument is plural); adding + or subtracting a relativedelta with relative information performs + the corresponding aritmetic operation on the original datetime value + with the information in the relativedelta. weekday: One of the weekday instances (MO, TU, etc). These instances may @@ -80,26 +84,26 @@ And the other way is to use the following keyword arguments: Here is the behavior of operations with relativedelta: -1) Calculate the absolute year, using the 'year' argument, or the +1. Calculate the absolute year, using the 'year' argument, or the original datetime year, if the argument is not present. -2) Add the relative 'years' argument to the absolute year. +2. Add the relative 'years' argument to the absolute year. -3) Do steps 1 and 2 for month/months. +3. Do steps 1 and 2 for month/months. -4) Calculate the absolute day, using the 'day' argument, or the +4. Calculate the absolute day, using the 'day' argument, or the original datetime day, if the argument is not present. Then, subtract from the day until it fits in the year and month found after their operations. -5) Add the relative 'days' argument to the absolute day. Notice +5. Add the relative 'days' argument to the absolute day. Notice that the 'weeks' argument is multiplied by 7 and added to 'days'. -6) Do steps 1 and 2 for hour/hours, minute/minutes, second/seconds, +6. Do steps 1 and 2 for hour/hours, minute/minutes, second/seconds, microsecond/microseconds. -7) If the 'weekday' argument is present, calculate the weekday, +7. If the 'weekday' argument is present, calculate the weekday, with the given (wday, nth) tuple. wday is the index of the weekday (0-6, 0=Mon), and nth is the number of weeks to add forward or backward, depending on its signal. Notice that if @@ -114,9 +118,14 @@ Here is the behavior of operations with relativedelta: yearday=None, nlyearday=None, hour=None, minute=None, second=None, microsecond=None): if dt1 and dt2: - if (not isinstance(dt1, datetime.date)) or (not isinstance(dt2, datetime.date)): + # datetime is a subclass of date. So both must be date + if not (isinstance(dt1, datetime.date) and + isinstance(dt2, datetime.date)): raise TypeError("relativedelta only diffs datetime/date") - if not type(dt1) == type(dt2): #isinstance(dt1, type(dt2)): + # We allow two dates, or two datetimes, so we coerce them to be + # of the same type + if (isinstance(dt1, datetime.datetime) != + isinstance(dt2, datetime.datetime)): if not isinstance(dt1, datetime.datetime): dt1 = datetime.datetime.fromordinal(dt1.toordinal()) elif not isinstance(dt2, datetime.datetime): @@ -185,7 +194,8 @@ Here is the behavior of operations with relativedelta: if yearday > 59: self.leapdays = -1 if yday: - ydayidx = [31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 366] + ydayidx = [31, 59, 90, 120, 151, 181, 212, + 243, 273, 304, 334, 366] for idx, ydays in enumerate(ydayidx): if yday <= ydays: self.month = idx+1 @@ -225,9 +235,9 @@ Here is the behavior of operations with relativedelta: div, mod = divmod(self.months*s, 12) self.months = mod*s self.years += div*s - if (self.hours or self.minutes or self.seconds or self.microseconds or - self.hour is not None or self.minute is not None or - self.second is not None or self.microsecond is not None): + if (self.hours or self.minutes or self.seconds or self.microseconds + or self.hour is not None or self.minute is not None or + self.second is not None or self.microsecond is not None): self._has_time = 1 else: self._has_time = 0 @@ -245,21 +255,23 @@ Here is the behavior of operations with relativedelta: def __add__(self, other): if isinstance(other, relativedelta): return relativedelta(years=other.years+self.years, - months=other.months+self.months, - days=other.days+self.days, - hours=other.hours+self.hours, - minutes=other.minutes+self.minutes, - seconds=other.seconds+self.seconds, - microseconds=other.microseconds+self.microseconds, - leapdays=other.leapdays or self.leapdays, - year=other.year or self.year, - month=other.month or self.month, - day=other.day or self.day, - weekday=other.weekday or self.weekday, - hour=other.hour or self.hour, - minute=other.minute or self.minute, - second=other.second or self.second, - microsecond=other.microsecond or self.microsecond) + months=other.months+self.months, + days=other.days+self.days, + hours=other.hours+self.hours, + minutes=other.minutes+self.minutes, + seconds=other.seconds+self.seconds, + microseconds=(other.microseconds + + self.microseconds), + leapdays=other.leapdays or self.leapdays, + year=other.year or self.year, + month=other.month or self.month, + day=other.day or self.day, + weekday=other.weekday or self.weekday, + hour=other.hour or self.hour, + minute=other.minute or self.minute, + second=other.second or self.second, + microsecond=(other.microsecond or + self.microsecond)) if not isinstance(other, datetime.date): raise TypeError("unsupported type for add operation") elif self._has_time and not isinstance(other, datetime.datetime): @@ -295,9 +307,9 @@ Here is the behavior of operations with relativedelta: weekday, nth = self.weekday.weekday, self.weekday.n or 1 jumpdays = (abs(nth)-1)*7 if nth > 0: - jumpdays += (7-ret.weekday()+weekday)%7 + jumpdays += (7-ret.weekday()+weekday) % 7 else: - jumpdays += (ret.weekday()-weekday)%7 + jumpdays += (ret.weekday()-weekday) % 7 jumpdays *= -1 ret += datetime.timedelta(days=jumpdays) return ret diff --git a/awx/lib/site-packages/dateutil/rrule.py b/awx/lib/site-packages/dateutil/rrule.py index ad4d3ba70c..401bc8ab03 100644 --- a/awx/lib/site-packages/dateutil/rrule.py +++ b/awx/lib/site-packages/dateutil/rrule.py @@ -1,21 +1,19 @@ +# -*- coding: utf-8 -*- """ -Copyright (c) 2003-2010 Gustavo Niemeyer <gustavo@niemeyer.net> - -This module offers extensions to the standard Python -datetime module. +The rrule module offers a small, complete, and very fast, implementation of +the recurrence rules documented in the +`iCalendar RFC <http://www.ietf.org/rfc/rfc2445.txt>`_, +including support for caching of results. """ -__license__ = "Simplified BSD" - import itertools import datetime import calendar -try: - import _thread -except ImportError: - import thread as _thread import sys +from fractions import gcd + from six import advance_iterator, integer_types +from six.moves import _thread __all__ = ["rrule", "rruleset", "rrulestr", "YEARLY", "MONTHLY", "WEEKLY", "DAILY", @@ -23,7 +21,7 @@ __all__ = ["rrule", "rruleset", "rrulestr", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] # Every mask is 7 days longer to handle cross-year weekly periods. -M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30+ +M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30 + [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7) M365MASK = list(M366MASK) M29, M30, M31 = list(range(1, 30)), list(range(1, 31)), list(range(1, 32)) @@ -51,6 +49,7 @@ M365MASK = tuple(M365MASK) easter = None parser = None + class weekday(object): __slots__ = ["weekday", "n"] @@ -83,12 +82,13 @@ class weekday(object): MO, TU, WE, TH, FR, SA, SU = weekdays = tuple([weekday(x) for x in range(7)]) + class rrulebase(object): def __init__(self, cache=False): if cache: self._cache = [] self._cache_lock = _thread.allocate_lock() - self._cache_gen = self._iter() + self._cache_gen = self._iter() self._cache_complete = False else: self._cache = None @@ -163,11 +163,17 @@ class rrulebase(object): # __len__() introduces a large performance penality. def count(self): + """ Returns the number of recurrences in this set. It will have go + trough the whole recurrence, if this hasn't been done before. """ if self._len is None: - for x in self: pass + for x in self: + pass return self._len def before(self, dt, inc=False): + """ Returns the last recurrence before the given datetime instance. The + inc keyword defines what happens if dt is an occurrence. With + inc=True, if dt itself is an occurrence, it will be returned. """ if self._cache_complete: gen = self._cache else: @@ -186,6 +192,9 @@ class rrulebase(object): return last def after(self, dt, inc=False): + """ Returns the first recurrence after the given datetime instance. The + inc keyword defines what happens if dt is an occurrence. With + inc=True, if dt itself is an occurrence, it will be returned. """ if self._cache_complete: gen = self._cache else: @@ -201,6 +210,10 @@ class rrulebase(object): return None def between(self, after, before, inc=False): + """ Returns all the occurrences of the rrule between after and before. + The inc keyword defines what happens if after and/or before are + themselves occurrences. With inc=True, they will be included in the + list, if they are found in the recurrence set. """ if self._cache_complete: gen = self._cache else: @@ -229,7 +242,93 @@ class rrulebase(object): l.append(i) return l + class rrule(rrulebase): + """ + That's the base of the rrule operation. It accepts all the keywords + defined in the RFC as its constructor parameters (except byday, + which was renamed to byweekday) and more. The constructor prototype is:: + + rrule(freq) + + Where freq must be one of YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, + or SECONDLY. + + Additionally, it supports the following keyword arguments: + + :param cache: + If given, it must be a boolean value specifying to enable or disable + caching of results. If you will use the same rrule instance multiple + times, enabling caching will improve the performance considerably. + :param dtstart: + The recurrence start. Besides being the base for the recurrence, + missing parameters in the final recurrence instances will also be + extracted from this date. If not given, datetime.now() will be used + instead. + :param interval: + The interval between each freq iteration. For example, when using + YEARLY, an interval of 2 means once every two years, but with HOURLY, + it means once every two hours. The default interval is 1. + :param wkst: + The week start day. Must be one of the MO, TU, WE constants, or an + integer, specifying the first day of the week. This will affect + recurrences based on weekly periods. The default week start is got + from calendar.firstweekday(), and may be modified by + calendar.setfirstweekday(). + :param count: + How many occurrences will be generated. + :param until: + If given, this must be a datetime instance, that will specify the + limit of the recurrence. If a recurrence instance happens to be the + same as the datetime instance given in the until keyword, this will + be the last occurrence. + :param bysetpos: + If given, it must be either an integer, or a sequence of integers, + positive or negative. Each given integer will specify an occurrence + number, corresponding to the nth occurrence of the rule inside the + frequency period. For example, a bysetpos of -1 if combined with a + MONTHLY frequency, and a byweekday of (MO, TU, WE, TH, FR), will + result in the last work day of every month. + :param bymonth: + If given, it must be either an integer, or a sequence of integers, + meaning the months to apply the recurrence to. + :param bymonthday: + If given, it must be either an integer, or a sequence of integers, + meaning the month days to apply the recurrence to. + :param byyearday: + If given, it must be either an integer, or a sequence of integers, + meaning the year days to apply the recurrence to. + :param byweekno: + If given, it must be either an integer, or a sequence of integers, + meaning the week numbers to apply the recurrence to. Week numbers + have the meaning described in ISO8601, that is, the first week of + the year is that containing at least four days of the new year. + :param byweekday: + If given, it must be either an integer (0 == MO), a sequence of + integers, one of the weekday constants (MO, TU, etc), or a sequence + of these constants. When given, these variables will define the + weekdays where the recurrence will be applied. It's also possible to + use an argument n for the weekday instances, which will mean the nth + occurrence of this weekday in the period. For example, with MONTHLY, + or with YEARLY and BYMONTH, using FR(+1) in byweekday will specify the + first friday of the month where the recurrence happens. Notice that in + the RFC documentation, this is specified as BYDAY, but was renamed to + avoid the ambiguity of that keyword. + :param byhour: + If given, it must be either an integer, or a sequence of integers, + meaning the hours to apply the recurrence to. + :param byminute: + If given, it must be either an integer, or a sequence of integers, + meaning the minutes to apply the recurrence to. + :param bysecond: + If given, it must be either an integer, or a sequence of integers, + meaning the seconds to apply the recurrence to. + :param byeaster: + If given, it must be either an integer, or a sequence of integers, + positive or negative. Each integer will define an offset from the + Easter Sunday. Passing the offset 0 to byeaster will yield the Easter + Sunday itself. This is an extension to the RFC specification. + """ def __init__(self, freq, dtstart=None, interval=1, wkst=None, count=None, until=None, bysetpos=None, bymonth=None, bymonthday=None, byyearday=None, byeaster=None, @@ -249,15 +348,18 @@ class rrule(rrulebase): self._freq = freq self._interval = interval self._count = count + if until and not isinstance(until, datetime.datetime): until = datetime.datetime.fromordinal(until.toordinal()) self._until = until + if wkst is None: self._wkst = calendar.firstweekday() elif isinstance(wkst, integer_types): self._wkst = wkst else: self._wkst = wkst.weekday + if bysetpos is None: self._bysetpos = None elif isinstance(bysetpos, integer_types): @@ -271,30 +373,36 @@ class rrule(rrulebase): if pos == 0 or not (-366 <= pos <= 366): raise ValueError("bysetpos must be between 1 and 366, " "or between -366 and -1") - if not (byweekno or byyearday or bymonthday or - byweekday is not None or byeaster is not None): + + if (byweekno is None and byyearday is None and bymonthday is None and + byweekday is None and byeaster is None): if freq == YEARLY: - if not bymonth: + if bymonth is None: bymonth = dtstart.month bymonthday = dtstart.day elif freq == MONTHLY: bymonthday = dtstart.day elif freq == WEEKLY: byweekday = dtstart.weekday() + # bymonth - if not bymonth: + if bymonth is None: self._bymonth = None - elif isinstance(bymonth, integer_types): - self._bymonth = (bymonth,) else: - self._bymonth = tuple(bymonth) + if isinstance(bymonth, integer_types): + bymonth = (bymonth,) + + self._bymonth = set(bymonth) + # byyearday - if not byyearday: + if byyearday is None: self._byyearday = None - elif isinstance(byyearday, integer_types): - self._byyearday = (byyearday,) else: - self._byyearday = tuple(byyearday) + if isinstance(byyearday, integer_types): + byyearday = (byyearday,) + + self._byyearday = set(byyearday) + # byeaster if byeaster is not None: if not easter: @@ -305,87 +413,104 @@ class rrule(rrulebase): self._byeaster = tuple(byeaster) else: self._byeaster = None + # bymonthay - if not bymonthday: + if bymonthday is None: self._bymonthday = () self._bynmonthday = () - elif isinstance(bymonthday, integer_types): - if bymonthday < 0: - self._bynmonthday = (bymonthday,) - self._bymonthday = () - else: - self._bymonthday = (bymonthday,) - self._bynmonthday = () else: - self._bymonthday = tuple([x for x in bymonthday if x > 0]) - self._bynmonthday = tuple([x for x in bymonthday if x < 0]) + if isinstance(bymonthday, integer_types): + bymonthday = (bymonthday,) + + self._bymonthday = set([x for x in bymonthday if x > 0]) + self._bynmonthday = set([x for x in bymonthday if x < 0]) + # byweekno if byweekno is None: self._byweekno = None - elif isinstance(byweekno, integer_types): - self._byweekno = (byweekno,) else: - self._byweekno = tuple(byweekno) + if isinstance(byweekno, integer_types): + byweekno = (byweekno,) + + self._byweekno = set(byweekno) + # byweekday / bynweekday if byweekday is None: self._byweekday = None self._bynweekday = None - elif isinstance(byweekday, integer_types): - self._byweekday = (byweekday,) - self._bynweekday = None - elif hasattr(byweekday, "n"): - if not byweekday.n or freq > MONTHLY: - self._byweekday = (byweekday.weekday,) - self._bynweekday = None - else: - self._bynweekday = ((byweekday.weekday, byweekday.n),) - self._byweekday = None else: - self._byweekday = [] - self._bynweekday = [] + if isinstance(byweekday, integer_types): + byweekday = (byweekday,) + elif hasattr(byweekday, "n"): + byweekday = (byweekday.weekday,) + + self._byweekday = set() + self._bynweekday = set() for wday in byweekday: if isinstance(wday, integer_types): - self._byweekday.append(wday) + self._byweekday.add(wday) elif not wday.n or freq > MONTHLY: - self._byweekday.append(wday.weekday) + self._byweekday.add(wday.weekday) else: - self._bynweekday.append((wday.weekday, wday.n)) - self._byweekday = tuple(self._byweekday) - self._bynweekday = tuple(self._bynweekday) + self._bynweekday.add((wday.weekday, wday.n)) + if not self._byweekday: self._byweekday = None elif not self._bynweekday: self._bynweekday = None + # byhour if byhour is None: if freq < HOURLY: - self._byhour = (dtstart.hour,) + self._byhour = set((dtstart.hour,)) else: self._byhour = None - elif isinstance(byhour, integer_types): - self._byhour = (byhour,) else: - self._byhour = tuple(byhour) + if isinstance(byhour, integer_types): + byhour = (byhour,) + + if freq == HOURLY: + self._byhour = self.__construct_byset(start=dtstart.hour, + byxxx=byhour, + base=24) + else: + self._byhour = set(byhour) + # byminute if byminute is None: if freq < MINUTELY: - self._byminute = (dtstart.minute,) + self._byminute = set((dtstart.minute,)) else: self._byminute = None - elif isinstance(byminute, integer_types): - self._byminute = (byminute,) else: - self._byminute = tuple(byminute) + if isinstance(byminute, integer_types): + byminute = (byminute,) + + if freq == MINUTELY: + self._byminute = self.__construct_byset(start=dtstart.minute, + byxxx=byminute, + base=60) + else: + self._byminute = set(byminute) + # bysecond if bysecond is None: if freq < SECONDLY: - self._bysecond = (dtstart.second,) + self._bysecond = ((dtstart.second,)) else: self._bysecond = None - elif isinstance(bysecond, integer_types): - self._bysecond = (bysecond,) else: - self._bysecond = tuple(bysecond) + if isinstance(bysecond, integer_types): + bysecond = (bysecond,) + + self._bysecond = set(bysecond) + + if freq == SECONDLY: + self._bysecond = self.__construct_byset(start=dtstart.second, + byxxx=bysecond, + base=60) + else: + self._bysecond = set(bysecond) if self._freq >= HOURLY: self._timeset = None @@ -395,8 +520,8 @@ class rrule(rrulebase): for minute in self._byminute: for second in self._bysecond: self._timeset.append( - datetime.time(hour, minute, second, - tzinfo=self._tzinfo)) + datetime.time(hour, minute, second, + tzinfo=self._tzinfo)) self._timeset.sort() self._timeset = tuple(self._timeset) @@ -424,20 +549,20 @@ class rrule(rrulebase): ii = _iterinfo(self) ii.rebuild(year, month) - getdayset = {YEARLY:ii.ydayset, - MONTHLY:ii.mdayset, - WEEKLY:ii.wdayset, - DAILY:ii.ddayset, - HOURLY:ii.ddayset, - MINUTELY:ii.ddayset, - SECONDLY:ii.ddayset}[freq] - + getdayset = {YEARLY: ii.ydayset, + MONTHLY: ii.mdayset, + WEEKLY: ii.wdayset, + DAILY: ii.ddayset, + HOURLY: ii.ddayset, + MINUTELY: ii.ddayset, + SECONDLY: ii.ddayset}[freq] + if freq < HOURLY: timeset = self._timeset else: - gettimeset = {HOURLY:ii.htimeset, - MINUTELY:ii.mtimeset, - SECONDLY:ii.stimeset}[freq] + gettimeset = {HOURLY: ii.htimeset, + MINUTELY: ii.mtimeset, + SECONDLY: ii.stimeset}[freq] if ((freq >= HOURLY and self._byhour and hour not in self._byhour) or (freq >= MINUTELY and @@ -466,11 +591,10 @@ class rrule(rrulebase): ii.mdaymask[i] not in bymonthday and ii.nmdaymask[i] not in bynmonthday) or (byyearday and - ((i < ii.yearlen and i+1 not in byyearday - and -ii.yearlen+i not in byyearday) or - (i >= ii.yearlen and i+1-ii.yearlen not in byyearday - and -ii.nextyearlen+i-ii.yearlen - not in byyearday)))): + ((i < ii.yearlen and i+1 not in byyearday and + -ii.yearlen+i not in byyearday) or + (i >= ii.yearlen and i+1-ii.yearlen not in byyearday and + -ii.nextyearlen+i-ii.yearlen not in byyearday)))): dayset[i] = None filtered = True @@ -484,7 +608,7 @@ class rrule(rrulebase): daypos, timepos = divmod(pos-1, len(timeset)) try: i = [x for x in dayset[start:end] - if x is not None][daypos] + if x is not None][daypos] time = timeset[timepos] except IndexError: pass @@ -559,60 +683,86 @@ class rrule(rrulebase): if filtered: # Jump to one iteration before next day hour += ((23-hour)//interval)*interval - while True: - hour += interval - div, mod = divmod(hour, 24) - if div: - hour = mod - day += div - fixday = True - if not byhour or hour in byhour: - break + + if byhour: + ndays, hour = self.__mod_distance(value=hour, + byxxx=self._byhour, + base=24) + else: + ndays, hour = divmod(hour+interval, 24) + + if ndays: + day += ndays + fixday = True + timeset = gettimeset(hour, minute, second) elif freq == MINUTELY: if filtered: # Jump to one iteration before next day minute += ((1439-(hour*60+minute))//interval)*interval - while True: - minute += interval - div, mod = divmod(minute, 60) + + valid = False + rep_rate = (24*60) + for j in range(rep_rate // gcd(interval, rep_rate)): + if byminute: + nhours, minute = \ + self.__mod_distance(value=minute, + byxxx=self._byminute, + base=60) + else: + nhours, minute = divmod(minute+interval, 60) + + div, hour = divmod(hour+nhours, 24) if div: - minute = mod - hour += div - div, mod = divmod(hour, 24) - if div: - hour = mod - day += div - fixday = True - filtered = False - if ((not byhour or hour in byhour) and - (not byminute or minute in byminute)): + day += div + fixday = True + filtered = False + + if not byhour or hour in byhour: + valid = True break + + if not valid: + raise ValueError('Invalid combination of interval and ' + + 'byhour resulting in empty rule.') + timeset = gettimeset(hour, minute, second) elif freq == SECONDLY: if filtered: # Jump to one iteration before next day second += (((86399-(hour*3600+minute*60+second)) - //interval)*interval) - while True: - second += self._interval - div, mod = divmod(second, 60) + // interval)*interval) + + rep_rate = (24*3600) + valid = False + for j in range(0, rep_rate // gcd(interval, rep_rate)): + if bysecond: + nminutes, second = \ + self.__mod_distance(value=second, + byxxx=self._bysecond, + base=60) + else: + nminutes, second = divmod(second+interval, 60) + + div, minute = divmod(minute+nminutes, 60) if div: - second = mod - minute += div - div, mod = divmod(minute, 60) + hour += div + div, hour = divmod(hour, 24) if div: - minute = mod - hour += div - div, mod = divmod(hour, 24) - if div: - hour = mod - day += div - fixday = True + day += div + fixday = True + if ((not byhour or hour in byhour) and - (not byminute or minute in byminute) and - (not bysecond or second in bysecond)): + (not byminute or minute in byminute) and + (not bysecond or second in bysecond)): + valid = True break + + if not valid: + raise ValueError('Invalid combination of interval, ' + + 'byhour and byminute resulting in empty' + + ' rule.') + timeset = gettimeset(hour, minute, second) if fixday and day > 28: @@ -630,6 +780,80 @@ class rrule(rrulebase): daysinmonth = calendar.monthrange(year, month)[1] ii.rebuild(year, month) + def __construct_byset(self, start, byxxx, base): + """ + If a `BYXXX` sequence is passed to the constructor at the same level as + `FREQ` (e.g. `FREQ=HOURLY,BYHOUR={2,4,7},INTERVAL=3`), there are some + specifications which cannot be reached given some starting conditions. + + This occurs whenever the interval is not coprime with the base of a + given unit and the difference between the starting position and the + ending position is not coprime with the greatest common denominator + between the interval and the base. For example, with a FREQ of hourly + starting at 17:00 and an interval of 4, the only valid values for + BYHOUR would be {21, 1, 5, 9, 13, 17}, because 4 and 24 are not + coprime. + + :param:`start` specifies the starting position. + :param:`byxxx` is an iterable containing the list of allowed values. + :param:`base` is the largest allowable value for the specified + frequency (e.g. 24 hours, 60 minutes). + + This does not preserve the type of the iterable, returning a set, since + the values should be unique and the order is irrelevant, this will + speed up later lookups. + + In the event of an empty set, raises a :exception:`ValueError`, as this + results in an empty rrule. + """ + + cset = set() + + # Support a single byxxx value. + if isinstance(byxxx, integer_types): + byxxx = (byxxx) + + for num in byxxx: + i_gcd = gcd(self._interval, base) + # Use divmod rather than % because we need to wrap negative nums. + if i_gcd == 1 or divmod(num - start, i_gcd)[1] == 0: + cset.add(num) + + if len(cset) == 0: + raise ValueError("Invalid rrule byxxx generates an empty set.") + + return cset + + def __mod_distance(self, value, byxxx, base): + """ + Calculates the next value in a sequence where the `FREQ` parameter is + specified along with a `BYXXX` parameter at the same "level" + (e.g. `HOURLY` specified with `BYHOUR`). + + :param:`value` is the old value of the component. + :param:`byxxx` is the `BYXXX` set, which should have been generated + by `rrule._construct_byset`, or something else which + checks that a valid rule is present. + :param:`base` is the largest allowable value for the specified + frequency (e.g. 24 hours, 60 minutes). + + If a valid value is not found after `base` iterations (the maximum + number before the sequence would start to repeat), this raises a + :exception:`ValueError`, as no valid values were found. + + This returns a tuple of `divmod(n*interval, base)`, where `n` is the + smallest number of `interval` repetitions until the next specified + value in `byxxx` is found. + """ + accumulator = 0 + for ii in range(1, base + 1): + # Using divmod() over % to account for negative intervals + div, value = divmod(value + self._interval, base) + accumulator += div + if value in byxxx: + return (accumulator, value) + + class _iterinfo(object): __slots__ = ["rrule", "lastyear", "lastmonth", "yearlen", "nextyearlen", "yearordinal", "yearweekday", @@ -669,13 +893,13 @@ class _iterinfo(object): self.wnomask = None else: self.wnomask = [0]*(self.yearlen+7) - #no1wkst = firstwkst = self.wdaymask.index(rr._wkst) - no1wkst = firstwkst = (7-self.yearweekday+rr._wkst)%7 + # no1wkst = firstwkst = self.wdaymask.index(rr._wkst) + no1wkst = firstwkst = (7-self.yearweekday+rr._wkst) % 7 if no1wkst >= 4: no1wkst = 0 # Number of days in the year, plus the days we got # from last year. - wyearlen = self.yearlen+(self.yearweekday-rr._wkst)%7 + wyearlen = self.yearlen+(self.yearweekday-rr._wkst) % 7 else: # Number of days in the year, minus the days we # left in last year. @@ -721,22 +945,22 @@ class _iterinfo(object): # this year. if -1 not in rr._byweekno: lyearweekday = datetime.date(year-1, 1, 1).weekday() - lno1wkst = (7-lyearweekday+rr._wkst)%7 + lno1wkst = (7-lyearweekday+rr._wkst) % 7 lyearlen = 365+calendar.isleap(year-1) if lno1wkst >= 4: lno1wkst = 0 - lnumweeks = 52+(lyearlen+ - (lyearweekday-rr._wkst)%7)%7//4 + lnumweeks = 52+(lyearlen + + (lyearweekday-rr._wkst) % 7) % 7//4 else: - lnumweeks = 52+(self.yearlen-no1wkst)%7//4 + lnumweeks = 52+(self.yearlen-no1wkst) % 7//4 else: lnumweeks = -1 if lnumweeks in rr._byweekno: for i in range(no1wkst): self.wnomask[i] = 1 - if (rr._bynweekday and - (month != self.lastmonth or year != self.lastyear)): + if (rr._bynweekday and (month != self.lastmonth or + year != self.lastyear)): ranges = [] if rr._freq == YEARLY: if rr._bymonth: @@ -755,10 +979,10 @@ class _iterinfo(object): for wday, n in rr._bynweekday: if n < 0: i = last+(n+1)*7 - i -= (self.wdaymask[i]-wday)%7 + i -= (self.wdaymask[i]-wday) % 7 else: i = first+(n-1)*7 - i += (7-self.wdaymask[i]+wday)%7 + i += (7-self.wdaymask[i]+wday) % 7 if first <= i <= last: self.nwdaymask[i] = 1 @@ -775,50 +999,50 @@ class _iterinfo(object): return list(range(self.yearlen)), 0, self.yearlen def mdayset(self, year, month, day): - set = [None]*self.yearlen + dset = [None]*self.yearlen start, end = self.mrange[month-1:month+1] for i in range(start, end): - set[i] = i - return set, start, end + dset[i] = i + return dset, start, end def wdayset(self, year, month, day): # We need to handle cross-year weeks here. - set = [None]*(self.yearlen+7) + dset = [None]*(self.yearlen+7) i = datetime.date(year, month, day).toordinal()-self.yearordinal start = i for j in range(7): - set[i] = i + dset[i] = i i += 1 - #if (not (0 <= i < self.yearlen) or + # if (not (0 <= i < self.yearlen) or # self.wdaymask[i] == self.rrule._wkst): # This will cross the year boundary, if necessary. if self.wdaymask[i] == self.rrule._wkst: break - return set, start, i + return dset, start, i def ddayset(self, year, month, day): - set = [None]*self.yearlen + dset = [None]*self.yearlen i = datetime.date(year, month, day).toordinal()-self.yearordinal - set[i] = i - return set, i, i+1 + dset[i] = i + return dset, i, i+1 def htimeset(self, hour, minute, second): - set = [] + tset = [] rr = self.rrule for minute in rr._byminute: for second in rr._bysecond: - set.append(datetime.time(hour, minute, second, + tset.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) - set.sort() - return set + tset.sort() + return tset def mtimeset(self, hour, minute, second): - set = [] + tset = [] rr = self.rrule for second in rr._bysecond: - set.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) - set.sort() - return set + tset.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) + tset.sort() + return tset def stimeset(self, hour, minute, second): return (datetime.time(hour, minute, second, @@ -826,6 +1050,12 @@ class _iterinfo(object): class rruleset(rrulebase): + """ The rruleset type allows more complex recurrence setups, mixing + multiple rules, dates, exclusion rules, and exclusion dates. The type + constructor takes the following keyword arguments: + + :param cache: If True, caching of results will be enabled, improving + performance of multiple queries considerably. """ class _genitem(object): def __init__(self, genlist, gen): @@ -865,15 +1095,26 @@ class rruleset(rrulebase): self._exdate = [] def rrule(self, rrule): + """ Include the given :py:class:`rrule` instance in the recurrence set + generation. """ self._rrule.append(rrule) def rdate(self, rdate): + """ Include the given :py:class:`datetime` instance in the recurrence + set generation. """ self._rdate.append(rdate) def exrule(self, exrule): + """ Include the given rrule instance in the recurrence set exclusion + list. Dates which are part of the given recurrence rules will not + be generated, even if some inclusive rrule or rdate matches them. + """ self._exrule.append(exrule) def exdate(self, exdate): + """ Include the given datetime instance in the recurrence set + exclusion list. Dates included that way will not be generated, + even if some inclusive rrule or rdate matches them. """ self._exdate.append(exdate) def _iter(self): @@ -905,6 +1146,7 @@ class rruleset(rrulebase): rlist.sort() self._len = total + class _rrulestr(object): _freq_map = {"YEARLY": YEARLY, @@ -915,7 +1157,8 @@ class _rrulestr(object): "MINUTELY": MINUTELY, "SECONDLY": SECONDLY} - _weekday_map = {"MO":0,"TU":1,"WE":2,"TH":3,"FR":4,"SA":5,"SU":6} + _weekday_map = {"MO": 0, "TU": 1, "WE": 2, "TH": 3, + "FR": 4, "SA": 5, "SU": 6} def _handle_int(self, rrkwargs, name, value, **kwargs): rrkwargs[name.lower()] = int(value) @@ -923,17 +1166,17 @@ class _rrulestr(object): def _handle_int_list(self, rrkwargs, name, value, **kwargs): rrkwargs[name.lower()] = [int(x) for x in value.split(',')] - _handle_INTERVAL = _handle_int - _handle_COUNT = _handle_int - _handle_BYSETPOS = _handle_int_list - _handle_BYMONTH = _handle_int_list + _handle_INTERVAL = _handle_int + _handle_COUNT = _handle_int + _handle_BYSETPOS = _handle_int_list + _handle_BYMONTH = _handle_int_list _handle_BYMONTHDAY = _handle_int_list - _handle_BYYEARDAY = _handle_int_list - _handle_BYEASTER = _handle_int_list - _handle_BYWEEKNO = _handle_int_list - _handle_BYHOUR = _handle_int_list - _handle_BYMINUTE = _handle_int_list - _handle_BYSECOND = _handle_int_list + _handle_BYYEARDAY = _handle_int_list + _handle_BYEASTER = _handle_int_list + _handle_BYWEEKNO = _handle_int_list + _handle_BYHOUR = _handle_int_list + _handle_BYMINUTE = _handle_int_list + _handle_BYSECOND = _handle_int_list def _handle_FREQ(self, rrkwargs, name, value, **kwargs): rrkwargs["freq"] = self._freq_map[value] @@ -944,8 +1187,8 @@ class _rrulestr(object): from dateutil import parser try: rrkwargs["until"] = parser.parse(value, - ignoretz=kwargs.get("ignoretz"), - tzinfos=kwargs.get("tzinfos")) + ignoretz=kwargs.get("ignoretz"), + tzinfos=kwargs.get("tzinfos")) except ValueError: raise ValueError("invalid until date") @@ -960,7 +1203,8 @@ class _rrulestr(object): break n = wday[:i] or None w = wday[i:] - if n: n = int(n) + if n: + n = int(n) l.append(weekdays[self._weekday_map[w]](n)) rrkwargs["byweekday"] = l @@ -1021,8 +1265,8 @@ class _rrulestr(object): i += 1 else: lines = s.split() - if (not forceset and len(lines) == 1 and - (s.find(':') == -1 or s.startswith('RRULE:'))): + if (not forceset and len(lines) == 1 and (s.find(':') == -1 or + s.startswith('RRULE:'))): return self._parse_rfc_rrule(lines[0], cache=cache, dtstart=dtstart, ignoretz=ignoretz, tzinfos=tzinfos) @@ -1071,32 +1315,32 @@ class _rrulestr(object): tzinfos=tzinfos) else: raise ValueError("unsupported property: "+name) - if (forceset or len(rrulevals) > 1 or - rdatevals or exrulevals or exdatevals): + if (forceset or len(rrulevals) > 1 or rdatevals + or exrulevals or exdatevals): if not parser and (rdatevals or exdatevals): from dateutil import parser - set = rruleset(cache=cache) + rset = rruleset(cache=cache) for value in rrulevals: - set.rrule(self._parse_rfc_rrule(value, dtstart=dtstart, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in rdatevals: - for datestr in value.split(','): - set.rdate(parser.parse(datestr, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in exrulevals: - set.exrule(self._parse_rfc_rrule(value, dtstart=dtstart, + rset.rrule(self._parse_rfc_rrule(value, dtstart=dtstart, ignoretz=ignoretz, tzinfos=tzinfos)) - for value in exdatevals: + for value in rdatevals: for datestr in value.split(','): - set.exdate(parser.parse(datestr, + rset.rdate(parser.parse(datestr, ignoretz=ignoretz, tzinfos=tzinfos)) + for value in exrulevals: + rset.exrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exdatevals: + for datestr in value.split(','): + rset.exdate(parser.parse(datestr, + ignoretz=ignoretz, + tzinfos=tzinfos)) if compatible and dtstart: - set.rdate(dtstart) - return set + rset.rdate(dtstart) + return rset else: return self._parse_rfc_rrule(rrulevals[0], dtstart=dtstart, diff --git a/awx/lib/site-packages/dateutil/tz.py b/awx/lib/site-packages/dateutil/tz.py index e849fc24b5..31879e8be9 100644 --- a/awx/lib/site-packages/dateutil/tz.py +++ b/awx/lib/site-packages/dateutil/tz.py @@ -1,19 +1,25 @@ +# -*- coding: utf-8 -*- """ -Copyright (c) 2003-2007 Gustavo Niemeyer <gustavo@niemeyer.net> - -This module offers extensions to the standard Python -datetime module. +This module offers timezone implementations subclassing the abstract +:py:`datetime.tzinfo` type. There are classes to handle tzfile format files +(usually are in :file:`/etc/localtime`, :file:`/usr/share/zoneinfo`, etc), TZ +environment string (in all known formats), given ranges (with help from +relative deltas), local machine timezone, fixed offset timezone, and UTC +timezone. """ -__license__ = "Simplified BSD" - -from six import string_types, PY3 - import datetime import struct import time import sys import os +from six import string_types, PY3 + +try: + from dateutil.tzwin import tzwin, tzwinlocal +except ImportError: + tzwin = tzwinlocal = None + relativedelta = None parser = None rrule = None @@ -21,10 +27,6 @@ rrule = None __all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange", "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz"] -try: - from dateutil.tzwin import tzwin, tzwinlocal -except (ImportError, OSError): - tzwin, tzwinlocal = None, None def tzname_in_python2(myfunc): """Change unicode output into bytestrings in Python 2 @@ -42,11 +44,12 @@ def tzname_in_python2(myfunc): ZERO = datetime.timedelta(0) EPOCHORDINAL = datetime.datetime.utcfromtimestamp(0).toordinal() + class tzutc(datetime.tzinfo): def utcoffset(self, dt): return ZERO - + def dst(self, dt): return ZERO @@ -66,6 +69,7 @@ class tzutc(datetime.tzinfo): __reduce__ = object.__reduce__ + class tzoffset(datetime.tzinfo): def __init__(self, name, offset): @@ -96,6 +100,7 @@ class tzoffset(datetime.tzinfo): __reduce__ = object.__reduce__ + class tzlocal(datetime.tzinfo): _std_offset = datetime.timedelta(seconds=-time.timezone) @@ -123,25 +128,25 @@ class tzlocal(datetime.tzinfo): def _isdst(self, dt): # We can't use mktime here. It is unstable when deciding if # the hour near to a change is DST or not. - # + # # timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour, # dt.minute, dt.second, dt.weekday(), 0, -1)) # return time.localtime(timestamp).tm_isdst # # The code above yields the following result: # - #>>> import tz, datetime - #>>> t = tz.tzlocal() - #>>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - #'BRDT' - #>>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname() - #'BRST' - #>>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - #'BRST' - #>>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname() - #'BRDT' - #>>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - #'BRDT' + # >>> import tz, datetime + # >>> t = tz.tzlocal() + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRDT' + # >>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname() + # 'BRST' + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRST' + # >>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname() + # 'BRDT' + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRDT' # # Here is a more stable implementation: # @@ -166,6 +171,7 @@ class tzlocal(datetime.tzinfo): __reduce__ = object.__reduce__ + class _ttinfo(object): __slots__ = ["offset", "delta", "isdst", "abbr", "isstd", "isgmt"] @@ -205,15 +211,20 @@ class _ttinfo(object): if name in state: setattr(self, name, state[name]) + class tzfile(datetime.tzinfo): # http://www.twinsun.com/tz/tz-link.htm # ftp://ftp.iana.org/tz/tz*.tar.gz - - def __init__(self, fileobj): + + def __init__(self, fileobj, filename=None): + file_opened_here = False if isinstance(fileobj, string_types): self._filename = fileobj fileobj = open(fileobj, 'rb') + file_opened_here = True + elif filename is not None: + self._filename = filename elif hasattr(fileobj, "name"): self._filename = fileobj.name else: @@ -228,125 +239,128 @@ class tzfile(datetime.tzinfo): # six four-byte values of type long, written in a # ``standard'' byte order (the high-order byte # of the value is written first). + try: + if fileobj.read(4).decode() != "TZif": + raise ValueError("magic not found") - if fileobj.read(4).decode() != "TZif": - raise ValueError("magic not found") + fileobj.read(16) - fileobj.read(16) + ( + # The number of UTC/local indicators stored in the file. + ttisgmtcnt, - ( - # The number of UTC/local indicators stored in the file. - ttisgmtcnt, + # The number of standard/wall indicators stored in the file. + ttisstdcnt, - # The number of standard/wall indicators stored in the file. - ttisstdcnt, - - # The number of leap seconds for which data is - # stored in the file. - leapcnt, + # The number of leap seconds for which data is + # stored in the file. + leapcnt, - # The number of "transition times" for which data - # is stored in the file. - timecnt, + # The number of "transition times" for which data + # is stored in the file. + timecnt, - # The number of "local time types" for which data - # is stored in the file (must not be zero). - typecnt, + # The number of "local time types" for which data + # is stored in the file (must not be zero). + typecnt, - # The number of characters of "time zone - # abbreviation strings" stored in the file. - charcnt, + # The number of characters of "time zone + # abbreviation strings" stored in the file. + charcnt, - ) = struct.unpack(">6l", fileobj.read(24)) + ) = struct.unpack(">6l", fileobj.read(24)) - # The above header is followed by tzh_timecnt four-byte - # values of type long, sorted in ascending order. - # These values are written in ``standard'' byte order. - # Each is used as a transition time (as returned by - # time(2)) at which the rules for computing local time - # change. + # The above header is followed by tzh_timecnt four-byte + # values of type long, sorted in ascending order. + # These values are written in ``standard'' byte order. + # Each is used as a transition time (as returned by + # time(2)) at which the rules for computing local time + # change. - if timecnt: - self._trans_list = struct.unpack(">%dl" % timecnt, - fileobj.read(timecnt*4)) - else: - self._trans_list = [] + if timecnt: + self._trans_list = struct.unpack(">%dl" % timecnt, + fileobj.read(timecnt*4)) + else: + self._trans_list = [] - # Next come tzh_timecnt one-byte values of type unsigned - # char; each one tells which of the different types of - # ``local time'' types described in the file is associated - # with the same-indexed transition time. These values - # serve as indices into an array of ttinfo structures that - # appears next in the file. - - if timecnt: - self._trans_idx = struct.unpack(">%dB" % timecnt, - fileobj.read(timecnt)) - else: - self._trans_idx = [] - - # Each ttinfo structure is written as a four-byte value - # for tt_gmtoff of type long, in a standard byte - # order, followed by a one-byte value for tt_isdst - # and a one-byte value for tt_abbrind. In each - # structure, tt_gmtoff gives the number of - # seconds to be added to UTC, tt_isdst tells whether - # tm_isdst should be set by localtime(3), and - # tt_abbrind serves as an index into the array of - # time zone abbreviation characters that follow the - # ttinfo structure(s) in the file. + # Next come tzh_timecnt one-byte values of type unsigned + # char; each one tells which of the different types of + # ``local time'' types described in the file is associated + # with the same-indexed transition time. These values + # serve as indices into an array of ttinfo structures that + # appears next in the file. - ttinfo = [] + if timecnt: + self._trans_idx = struct.unpack(">%dB" % timecnt, + fileobj.read(timecnt)) + else: + self._trans_idx = [] - for i in range(typecnt): - ttinfo.append(struct.unpack(">lbb", fileobj.read(6))) + # Each ttinfo structure is written as a four-byte value + # for tt_gmtoff of type long, in a standard byte + # order, followed by a one-byte value for tt_isdst + # and a one-byte value for tt_abbrind. In each + # structure, tt_gmtoff gives the number of + # seconds to be added to UTC, tt_isdst tells whether + # tm_isdst should be set by localtime(3), and + # tt_abbrind serves as an index into the array of + # time zone abbreviation characters that follow the + # ttinfo structure(s) in the file. - abbr = fileobj.read(charcnt).decode() + ttinfo = [] - # Then there are tzh_leapcnt pairs of four-byte - # values, written in standard byte order; the - # first value of each pair gives the time (as - # returned by time(2)) at which a leap second - # occurs; the second gives the total number of - # leap seconds to be applied after the given time. - # The pairs of values are sorted in ascending order - # by time. + for i in range(typecnt): + ttinfo.append(struct.unpack(">lbb", fileobj.read(6))) - # Not used, for now - if leapcnt: - leap = struct.unpack(">%dl" % (leapcnt*2), - fileobj.read(leapcnt*8)) + abbr = fileobj.read(charcnt).decode() - # Then there are tzh_ttisstdcnt standard/wall - # indicators, each stored as a one-byte value; - # they tell whether the transition times associated - # with local time types were specified as standard - # time or wall clock time, and are used when - # a time zone file is used in handling POSIX-style - # time zone environment variables. + # Then there are tzh_leapcnt pairs of four-byte + # values, written in standard byte order; the + # first value of each pair gives the time (as + # returned by time(2)) at which a leap second + # occurs; the second gives the total number of + # leap seconds to be applied after the given time. + # The pairs of values are sorted in ascending order + # by time. - if ttisstdcnt: - isstd = struct.unpack(">%db" % ttisstdcnt, - fileobj.read(ttisstdcnt)) + # Not used, for now + # if leapcnt: + # leap = struct.unpack(">%dl" % (leapcnt*2), + # fileobj.read(leapcnt*8)) - # Finally, there are tzh_ttisgmtcnt UTC/local - # indicators, each stored as a one-byte value; - # they tell whether the transition times associated - # with local time types were specified as UTC or - # local time, and are used when a time zone file - # is used in handling POSIX-style time zone envi- - # ronment variables. + # Then there are tzh_ttisstdcnt standard/wall + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as standard + # time or wall clock time, and are used when + # a time zone file is used in handling POSIX-style + # time zone environment variables. - if ttisgmtcnt: - isgmt = struct.unpack(">%db" % ttisgmtcnt, - fileobj.read(ttisgmtcnt)) + if ttisstdcnt: + isstd = struct.unpack(">%db" % ttisstdcnt, + fileobj.read(ttisstdcnt)) - # ** Everything has been read ** + # Finally, there are tzh_ttisgmtcnt UTC/local + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as UTC or + # local time, and are used when a time zone file + # is used in handling POSIX-style time zone envi- + # ronment variables. + + if ttisgmtcnt: + isgmt = struct.unpack(">%db" % ttisgmtcnt, + fileobj.read(ttisgmtcnt)) + + # ** Everything has been read ** + finally: + if file_opened_here: + fileobj.close() # Build ttinfo list self._ttinfo_list = [] for i in range(typecnt): - gmtoff, isdst, abbrind = ttinfo[i] + gmtoff, isdst, abbrind = ttinfo[i] # Round to full-minutes if that's not the case. Python's # datetime doesn't accept sub-minute timezones. Check # http://python.org/sf/1447945 for some information. @@ -464,7 +478,7 @@ class tzfile(datetime.tzinfo): # However, this class stores historical changes in the # dst offset, so I belive that this wouldn't be the right # way to implement this. - + @tzname_in_python2 def tzname(self, dt): if not self._ttinfo_std: @@ -481,7 +495,6 @@ class tzfile(datetime.tzinfo): def __ne__(self, other): return not self.__eq__(other) - def __repr__(self): return "%s(%s)" % (self.__class__.__name__, repr(self._filename)) @@ -490,8 +503,8 @@ class tzfile(datetime.tzinfo): raise ValueError("Unpickable %s class" % self.__class__.__name__) return (self.__class__, (self._filename,)) -class tzrange(datetime.tzinfo): +class tzrange(datetime.tzinfo): def __init__(self, stdabbr, stdoffset=None, dstabbr=None, dstoffset=None, start=None, end=None): @@ -512,12 +525,12 @@ class tzrange(datetime.tzinfo): self._dst_offset = ZERO if dstabbr and start is None: self._start_delta = relativedelta.relativedelta( - hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) + hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) else: self._start_delta = start if dstabbr and end is None: self._end_delta = relativedelta.relativedelta( - hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) + hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) else: self._end_delta = end @@ -570,8 +583,9 @@ class tzrange(datetime.tzinfo): __reduce__ = object.__reduce__ + class tzstr(tzrange): - + def __init__(self, s): global parser if not parser: @@ -645,9 +659,10 @@ class tzstr(tzrange): def __repr__(self): return "%s(%s)" % (self.__class__.__name__, repr(self._s)) + class _tzicalvtzcomp(object): def __init__(self, tzoffsetfrom, tzoffsetto, isdst, - tzname=None, rrule=None): + tzname=None, rrule=None): self.tzoffsetfrom = datetime.timedelta(seconds=tzoffsetfrom) self.tzoffsetto = datetime.timedelta(seconds=tzoffsetto) self.tzoffsetdiff = self.tzoffsetto-self.tzoffsetfrom @@ -655,6 +670,7 @@ class _tzicalvtzcomp(object): self.tzname = tzname self.rrule = rrule + class _tzicalvtz(datetime.tzinfo): def __init__(self, tzid, comps=[]): self._tzid = tzid @@ -718,6 +734,7 @@ class _tzicalvtz(datetime.tzinfo): __reduce__ = object.__reduce__ + class tzical(object): def __init__(self, fileobj): global rrule @@ -726,7 +743,8 @@ class tzical(object): if isinstance(fileobj, string_types): self._s = fileobj - fileobj = open(fileobj, 'r') # ical should be encoded in UTF-8 with CRLF + # ical should be encoded in UTF-8 with CRLF + fileobj = open(fileobj, 'r') elif hasattr(fileobj, "name"): self._s = fileobj.name else: @@ -754,7 +772,7 @@ class tzical(object): if not s: raise ValueError("empty offset") if s[0] in ('+', '-'): - signal = (-1, +1)[s[0]=='+'] + signal = (-1, +1)[s[0] == '+'] s = s[1:] else: signal = +1 @@ -815,7 +833,8 @@ class tzical(object): if not tzid: raise ValueError("mandatory TZID not found") if not comps: - raise ValueError("at least one component is needed") + raise ValueError( + "at least one component is needed") # Process vtimezone self._vtz[tzid] = _tzicalvtz(tzid, comps) invtz = False @@ -823,9 +842,11 @@ class tzical(object): if not founddtstart: raise ValueError("mandatory DTSTART not found") if tzoffsetfrom is None: - raise ValueError("mandatory TZOFFSETFROM not found") + raise ValueError( + "mandatory TZOFFSETFROM not found") if tzoffsetto is None: - raise ValueError("mandatory TZOFFSETFROM not found") + raise ValueError( + "mandatory TZOFFSETFROM not found") # Process component rr = None if rrulelines: @@ -848,15 +869,18 @@ class tzical(object): rrulelines.append(line) elif name == "TZOFFSETFROM": if parms: - raise ValueError("unsupported %s parm: %s "%(name, parms[0])) + raise ValueError( + "unsupported %s parm: %s " % (name, parms[0])) tzoffsetfrom = self._parse_offset(value) elif name == "TZOFFSETTO": if parms: - raise ValueError("unsupported TZOFFSETTO parm: "+parms[0]) + raise ValueError( + "unsupported TZOFFSETTO parm: "+parms[0]) tzoffsetto = self._parse_offset(value) elif name == "TZNAME": if parms: - raise ValueError("unsupported TZNAME parm: "+parms[0]) + raise ValueError( + "unsupported TZNAME parm: "+parms[0]) tzname = value elif name == "COMMENT": pass @@ -865,7 +889,8 @@ class tzical(object): else: if name == "TZID": if parms: - raise ValueError("unsupported TZID parm: "+parms[0]) + raise ValueError( + "unsupported TZID parm: "+parms[0]) tzid = value elif name in ("TZURL", "LAST-MODIFIED", "COMMENT"): pass @@ -886,6 +911,7 @@ else: TZFILES = [] TZPATHS = [] + def gettz(name=None): tz = None if not name: @@ -933,11 +959,11 @@ def gettz(name=None): pass else: tz = None - if tzwin: + if tzwin is not None: try: tz = tzwin(name) - except OSError: - pass + except WindowsError: + tz = None if not tz: from dateutil.zoneinfo import gettz tz = gettz(name) diff --git a/awx/lib/site-packages/dateutil/tzwin.py b/awx/lib/site-packages/dateutil/tzwin.py index 041c6cc3d6..e8a82d7587 100644 --- a/awx/lib/site-packages/dateutil/tzwin.py +++ b/awx/lib/site-packages/dateutil/tzwin.py @@ -1,8 +1,8 @@ # This code was originally contributed by Jeffrey Harris. import datetime import struct -import winreg +from six.moves import winreg __all__ = ["tzwin", "tzwinlocal"] @@ -12,8 +12,8 @@ TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones" TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" + def _settzkeyname(): - global TZKEYNAME handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) try: winreg.OpenKey(handle, TZKEYNAMENT).Close() @@ -21,8 +21,10 @@ def _settzkeyname(): except WindowsError: TZKEYNAME = TZKEYNAME9X handle.Close() + return TZKEYNAME + +TZKEYNAME = _settzkeyname() -_settzkeyname() class tzwinbase(datetime.tzinfo): """tzinfo class based on win32's timezones available in the registry.""" @@ -39,7 +41,7 @@ class tzwinbase(datetime.tzinfo): return datetime.timedelta(minutes=minutes) else: return datetime.timedelta(0) - + def tzname(self, dt): if self._isdst(dt): return self._dstname @@ -59,8 +61,11 @@ class tzwinbase(datetime.tzinfo): def display(self): return self._display - + def _isdst(self, dt): + if not self._dstmonth: + # dstmonth == 0 signals the zone has no daylight saving time + return False dston = picknthweekday(dt.year, self._dstmonth, self._dstdayofweek, self._dsthour, self._dstminute, self._dstweeknumber) @@ -78,31 +83,33 @@ class tzwin(tzwinbase): def __init__(self, name): self._name = name - handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - tzkey = winreg.OpenKey(handle, "%s\%s" % (TZKEYNAME, name)) - keydict = valuestodict(tzkey) - tzkey.Close() - handle.Close() + # multiple contexts only possible in 2.7 and 3.1, we still support 2.6 + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + with winreg.OpenKey(handle, + "%s\%s" % (TZKEYNAME, name)) as tzkey: + keydict = valuestodict(tzkey) self._stdname = keydict["Std"].encode("iso-8859-1") self._dstname = keydict["Dlt"].encode("iso-8859-1") self._display = keydict["Display"] - + # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm tup = struct.unpack("=3l16h", keydict["TZI"]) - self._stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 - self._dstoffset = self._stdoffset-tup[2] # + DaylightBias * -1 - + self._stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 + self._dstoffset = self._stdoffset-tup[2] # + DaylightBias * -1 + + # for the meaning see the win32 TIME_ZONE_INFORMATION structure docs + # http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx (self._stdmonth, - self._stddayofweek, # Sunday = 0 - self._stdweeknumber, # Last = 5 + self._stddayofweek, # Sunday = 0 + self._stdweeknumber, # Last = 5 self._stdhour, self._stdminute) = tup[4:9] (self._dstmonth, - self._dstdayofweek, # Sunday = 0 - self._dstweeknumber, # Last = 5 + self._dstdayofweek, # Sunday = 0 + self._dstweeknumber, # Last = 5 self._dsthour, self._dstminute) = tup[12:17] @@ -114,61 +121,59 @@ class tzwin(tzwinbase): class tzwinlocal(tzwinbase): - + def __init__(self): - handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - tzlocalkey = winreg.OpenKey(handle, TZLOCALKEYNAME) - keydict = valuestodict(tzlocalkey) - tzlocalkey.Close() + with winreg.OpenKey(handle, TZLOCALKEYNAME) as tzlocalkey: + keydict = valuestodict(tzlocalkey) - self._stdname = keydict["StandardName"].encode("iso-8859-1") - self._dstname = keydict["DaylightName"].encode("iso-8859-1") + self._stdname = keydict["StandardName"].encode("iso-8859-1") + self._dstname = keydict["DaylightName"].encode("iso-8859-1") - try: - tzkey = winreg.OpenKey(handle, "%s\%s"%(TZKEYNAME, self._stdname)) - _keydict = valuestodict(tzkey) - self._display = _keydict["Display"] - tzkey.Close() - except OSError: - self._display = None + try: + with winreg.OpenKey( + handle, "%s\%s" % (TZKEYNAME, self._stdname)) as tzkey: + _keydict = valuestodict(tzkey) + self._display = _keydict["Display"] + except OSError: + self._display = None - handle.Close() - self._stdoffset = -keydict["Bias"]-keydict["StandardBias"] self._dstoffset = self._stdoffset-keydict["DaylightBias"] - # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm tup = struct.unpack("=8h", keydict["StandardStart"]) (self._stdmonth, - self._stddayofweek, # Sunday = 0 - self._stdweeknumber, # Last = 5 + self._stddayofweek, # Sunday = 0 + self._stdweeknumber, # Last = 5 self._stdhour, self._stdminute) = tup[1:6] tup = struct.unpack("=8h", keydict["DaylightStart"]) (self._dstmonth, - self._dstdayofweek, # Sunday = 0 - self._dstweeknumber, # Last = 5 + self._dstdayofweek, # Sunday = 0 + self._dstweeknumber, # Last = 5 self._dsthour, self._dstminute) = tup[1:6] def __reduce__(self): return (self.__class__, ()) + def picknthweekday(year, month, dayofweek, hour, minute, whichweek): """dayofweek == 0 means Sunday, whichweek 5 means last instance""" first = datetime.datetime(year, month, 1, hour, minute) - weekdayone = first.replace(day=((dayofweek-first.isoweekday())%7+1)) + weekdayone = first.replace(day=((dayofweek-first.isoweekday()) % 7+1)) for n in range(whichweek): dt = weekdayone+(whichweek-n)*ONEWEEK if dt.month == month: return dt + def valuestodict(key): """Convert a registry key's values to a dictionary.""" dict = {} diff --git a/awx/lib/site-packages/dateutil/zoneinfo/__init__.py b/awx/lib/site-packages/dateutil/zoneinfo/__init__.py index 81db1405b1..53d9dfee0c 100644 --- a/awx/lib/site-packages/dateutil/zoneinfo/__init__.py +++ b/awx/lib/site-packages/dateutil/zoneinfo/__init__.py @@ -1,109 +1,108 @@ # -*- coding: utf-8 -*- -""" -Copyright (c) 2003-2005 Gustavo Niemeyer <gustavo@niemeyer.net> - -This module offers extensions to the standard Python -datetime module. -""" import logging import os -from subprocess import call +import warnings +import tempfile +import shutil +from subprocess import check_call from tarfile import TarFile +from pkgutil import get_data +from io import BytesIO +from contextlib import closing from dateutil.tz import tzfile -__author__ = "Tomi Pieviläinen <tomi.pievilainen@iki.fi>" -__license__ = "Simplified BSD" - __all__ = ["setcachesize", "gettz", "rebuild"] -CACHE = [] -CACHESIZE = 10 +_ZONEFILENAME = "dateutil-zoneinfo.tar.gz" + +# python2.6 compatability. Note that TarFile.__exit__ != TarFile.close, but +# it's close enough for python2.6 +_tar_open = TarFile.open +if not hasattr(TarFile, '__exit__'): + def _tar_open(*args, **kwargs): + return closing(TarFile.open(*args, **kwargs)) + class tzfile(tzfile): def __reduce__(self): return (gettz, (self._filename,)) -def getzoneinfofile(): - filenames = sorted(os.listdir(os.path.join(os.path.dirname(__file__)))) - filenames.reverse() - for entry in filenames: - if entry.startswith("zoneinfo") and ".tar." in entry: - return os.path.join(os.path.dirname(__file__), entry) - return None -ZONEINFOFILE = getzoneinfofile() +def getzoneinfofile_stream(): + try: + return BytesIO(get_data(__name__, _ZONEFILENAME)) + except IOError as e: # TODO switch to FileNotFoundError? + warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror)) + return None -del getzoneinfofile -def setcachesize(size): - global CACHESIZE, CACHE - CACHESIZE = size - del CACHE[size:] +class ZoneInfoFile(object): + def __init__(self, zonefile_stream=None): + if zonefile_stream is not None: + with _tar_open(fileobj=zonefile_stream, mode='r') as tf: + # dict comprehension does not work on python2.6 + # TODO: get back to the nicer syntax when we ditch python2.6 + # self.zones = {zf.name: tzfile(tf.extractfile(zf), + # filename = zf.name) + # for zf in tf.getmembers() if zf.isfile()} + self.zones = dict((zf.name, tzfile(tf.extractfile(zf), + filename=zf.name)) + for zf in tf.getmembers() if zf.isfile()) + # deal with links: They'll point to their parent object. Less + # waste of memory + # links = {zl.name: self.zones[zl.linkname] + # for zl in tf.getmembers() if zl.islnk() or zl.issym()} + links = dict((zl.name, self.zones[zl.linkname]) + for zl in tf.getmembers() if + zl.islnk() or zl.issym()) + self.zones.update(links) + else: + self.zones = dict() + + +# The current API has gettz as a module function, although in fact it taps into +# a stateful class. So as a workaround for now, without changing the API, we +# will create a new "global" class instance the first time a user requests a +# timezone. Ugly, but adheres to the api. +# +# TODO: deprecate this. +_CLASS_ZONE_INSTANCE = list() + def gettz(name): - tzinfo = None - if ZONEINFOFILE: - for cachedname, tzinfo in CACHE: - if cachedname == name: - break - else: - tf = TarFile.open(ZONEINFOFILE) - try: - zonefile = tf.extractfile(name) - except KeyError: - tzinfo = None - else: - tzinfo = tzfile(zonefile) - tf.close() - CACHE.insert(0, (name, tzinfo)) - del CACHE[CACHESIZE:] - return tzinfo + if len(_CLASS_ZONE_INSTANCE) == 0: + _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) + return _CLASS_ZONE_INSTANCE[0].zones.get(name) -def rebuild(filename, tag=None, format="gz"): + +def rebuild(filename, tag=None, format="gz", zonegroups=[]): """Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar* filename is the timezone tarball from ftp.iana.org/tz. """ - import tempfile, shutil tmpdir = tempfile.mkdtemp() zonedir = os.path.join(tmpdir, "zoneinfo") moduledir = os.path.dirname(__file__) - if tag: tag = "-"+tag - targetname = "zoneinfo%s.tar.%s" % (tag, format) try: - tf = TarFile.open(filename) - # The "backwards" zone file contains links to other files, so must be - # processed as last - for name in sorted(tf.getnames(), - key=lambda k: k != "backward" and k or "z"): - if not (name.endswith(".sh") or - name.endswith(".tab") or - name == "leapseconds"): + with _tar_open(filename) as tf: + for name in zonegroups: tf.extract(name, tmpdir) - filepath = os.path.join(tmpdir, name) - try: - # zic will return errors for nontz files in the package - # such as the Makefile or README, so check_call cannot - # be used (or at least extra checks would be needed) - call(["zic", "-d", zonedir, filepath]) - except OSError as e: - if e.errno == 2: - logging.error( - "Could not find zic. Perhaps you need to install " - "libc-bin or some other package that provides it, " - "or it's not in your PATH?") + filepaths = [os.path.join(tmpdir, n) for n in zonegroups] + try: + check_call(["zic", "-d", zonedir] + filepaths) + except OSError as e: + if e.errno == 2: + logging.error( + "Could not find zic. Perhaps you need to install " + "libc-bin or some other package that provides it, " + "or it's not in your PATH?") raise - tf.close() - target = os.path.join(moduledir, targetname) - for entry in os.listdir(moduledir): - if entry.startswith("zoneinfo") and ".tar." in entry: - os.unlink(os.path.join(moduledir, entry)) - tf = TarFile.open(target, "w:%s" % format) - for entry in os.listdir(zonedir): - entrypath = os.path.join(zonedir, entry) - tf.add(entrypath, entry) - tf.close() + target = os.path.join(moduledir, _ZONEFILENAME) + with _tar_open(target, "w:%s" % format) as tf: + for entry in os.listdir(zonedir): + entrypath = os.path.join(zonedir, entry) + tf.add(entrypath, entry) finally: shutil.rmtree(tmpdir) diff --git a/awx/lib/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz b/awx/lib/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..4c95eda3e48312f2f61debfe657a7d64513b96b7 GIT binary patch literal 139808 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¨>zWxfLp5OVcYCUz0kQjFX6n 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 LD9HW(v)q3Hd6!}% literal 0 HcmV?d00001 diff --git a/awx/lib/site-packages/dateutil/zoneinfo/zoneinfo--latest.tar.gz b/awx/lib/site-packages/dateutil/zoneinfo/zoneinfo--latest.tar.gz deleted file mode 100644 index 039d06f979b1a1f0c6e689122391ffd19816e694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198578 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⪙h=K*kHPNCKcaba{TV>1T7dghc4cjo2y?#eI^MdE5zaR zEHSS!pPS3&i8@;fs#%1?$MW`JYY0AwL%o5Chf7COedZ%d_CAM?t>VtF5PT*um81Ey z<pGD!YsH<B5PT&J>!5VotzS!hhPg{lio?fEaR(oQ?*)eF<BfT_`nA<(GEuU!96mk= z;ePKJe$l6%^|RmV<(#UHknxk0I^}ddaCSZDm|L1|_juKCOv&2HlP-{t@jboqS0}nH zP2#{KGq0d}1^NVgjD;y>JcT5WRy|6f+42!6qYz46kSw;;o>U3^E62T0lOBUov2A%} z+^LoR>4nbqL-rO)#Kg{lG4<ZD_Zi&QPSM{zoh{;r&BA>4P8_8ABlr-xFZugqQvk~R zi7Z`^Jgw_AW`3Xl=^$w_QrM(ukFt<8l%EvUmKYKCO~T1n8UGx@GyJ^~;>luuh<s<$ zICx-V+-!g(9h~68b3<fJNQc|o-~w7~VBl*af`KH~=@nOP`F<#-)8WEnA-^$3rPr<< zd=19RB3@4(<Xc2W5+S=oLe0iTKHV7(k30;)f8={r0=e8>YKC$wS)pb36I`&51Iq`C z%WOPGUYobJ@h9wWn$-xsnRP>_4;Fc$AM|?hHYe$Hpg*Y)%`+(J>xADizO&=;o3noS z3DTe~T=v;HS*Cq<o42cwMIU5kK5n+F*6}sS(tCYN-onEe^4Xi2vhOjwa?a;$u*D%? z7XC8<2YvthYL6GnQmzjS*HDkpKh9Evm(us<*ermXJP>^R1a}c0oYh1^$R8kGUp!Bw z-p1i@cDG41(HiaDcvu7$cDB1DR&=IwmW7Z+_F6!@7jBzDVW|tf{Er2o-7;uW`ORZ> z&G6WJXjO>v#$N0A37iI=J^}rO>Ryh{W3uFBpdY=kGp(h>h6}Y2v`>Uf_p$U3Ld^zm z8yld=nNhW2<naWQeZq7r33cPl1xLPGxzC<Oxe2X=ox%(E+4F~yT%9flb<CyA*?&Tw zhxE}K__?0;ju{j3o}{MM46u3yKl1qUEI8ok{UhOhsU(Qw<r4$wlWqh#bjGq)xqu{k z3?a#h!>4fR1Ze!#!Yd~~&6_x<)z<oDZ&q!#96?i((KW62J->)^%R(BjUd~huHYrN3 z$DA@A<l?r%%~_)|F0x)j*x@NV49*Ascam?;I+cl;&v}@NSwPBo7(7>;8G6h11DR9K z(YcQ#A(9}GHYis}qgBGwZL>-oS(7XnFkotl#+j0qREw7z8AdLt4U{m{YgZdhY~_{h zR4q0Mcr2|IY1gh6MW=q={qSVS5GkT(oZ}Hv_A;`r$uyeyrdDutc$j~wu-NQ&yXhg5 zl|##JZRvh&a<#;mW!Hr3zLP^v2i&CP6-&KDpig=2<DHAefwR0uS<9H=n{>u&QT_g3 zb~ohpmyK=9`fzvkmXR*aA{7Id9cKBf%T}i6MqXOI|C^Te*U4%75pqq;>Opm#Klj+g zYcE@e-=EV)W>eBvP3r~!yK>Xy@#xnB6^BWbUy~Pwmzk2or$3>V=+A4Pr%Tpc|4S)b zXjEy^?nzmFxH<Xail0qUSx*(kNZI!G!@;4Hl4;+T*Bfk1wpVDvt5rR()*kTTIwq=h z104Fzd>uBcHauG}{I(mrPvk6c;&8Jpxz#d1k<whk@vyPy*-zZiewLd8?;*TMEVjjw z_4n&ik)7j!k)Yw3VHLURsfPtyuSWg~7&+|aAxiEY(v?=CRi9C2eW<wlY^Oxrx%2My zZ*0HG0-S1;yWODL)N*_9%G!uxic~?f2sXb+q;bQgDKY-m^cIh8>5q+9Z|+3ms$zbP zePw>LVYX&BN!i47)!&+Rm%z9-w&+p1pekG!gS2Vhr==I&S&d6Qo{We07B^_qA<Tm7 z3B$>OP{VjRmt2H}p55)qTqf{#daNo8s~t3D1jAawurFa)XBgHCh7E*a-@~vmFl;gm z`w52q3d5GcuyrtOD-8P+hV6r4M}nqiVAv%XmH@*Zz_27(1bIk1x#Bz-$M$)`dyjW0 z??>uWx48nZ(Wy~I@P@QA++L>UaJ$&$qoh8?!9}`87e*DK7ShhGI8V>v_5tM`D%I8) z>PxrG#Nif&@>W$hzr)o^OSk+s0};|LcYB$g!wrS<R#!LY;*zJM<Ap_}gtTiZ&hv7( zC8E49!8;o@)cv`+`pBeRU=e7AJ}brfyBymeQ4N~v{ybdT^mOI0h{=$47sYugj_nLo zgSNUqFIOKu-6kyJRG|+U!b~8i!qQxe7ro7eR8W@>LJ`S0jxQ?i(1hUcP+@hh#h0J6 zZ@}E<$_m=*JiEwoeD(Grdk9|X?Nlt#;ow3ls>_F>h?h8y85MU#Lm+nlC>f-RPWgjN zVgnf^Jo3?P{(CixBuoLcqd{6+J+V4h1}z3l8LlB?POPe=<@@;8pqo)AENjS<fqiyE zNJa~KWflFo)Mj#_RN~CcabrR<ARS|bX?YyE$7<WZhVVUrO{DUVdrdpD)tv50Pkyp7 ze0ShH<vdw0A!dhxE(C<e9|jAsjQ>~cZIf=Cmq)&zL=!M;xH#-}QuO3gts(O|J6`<w zrrCbXr$^$?i^gA%VCW5sTV51f;9opt%_=&12zR_(WUQA{jyUr64LE%k5Nyai!2Hs2 zP%=$kbb9h2sMYQHYhU`c7cH%)Z#}bgBc0waEd)meSXLez-KRVjkFGqPz5=^c@cR#= zYqr<ZS(j)>EezlFq4mj&H+%CpbWI&$;&Nh+sRQoT0s6(Q=*7=Wk!kPJ1BB`&ti(eN z{4Jd6{eKTFX}_B)JJHZbFHGYP2&ZBbF04hK4b7Z63)y8F`ErBzA7b!1L|fZSB{bWI z)W*b(cZ{j2==uoV-|@_h)*|n?(<-IJoS@35)n-z$HX9E^2ld<GYuI(fj`Q-ENW_Qr z+<0cHLgUIn^37)@xNm+;Ym!@RKTobSr~Iq3zrE@7uQmhan~C!Mgz{xqVRk+r@`B>& z)D&IF4r9GEPvqO3C8P6;y~5<(>1LFPlJ(d4T%5U|&P?fjZf>kq@bQQY+9?w?3gqqy z+F2SQU)%_u%(LtI@VVj1>-LSPM)5}g@eWW>019eA!2~Go0t#C|F`(e-?DTXdhcR;U zrblt`4&nd0CxDoOtdW5(o|~*uToLGp0DTzHrw97HK>sPw&->@Xm*&$C`z&40=f0;$ zfKT@?&4T~R?}Da2{5hVA51LAYVY7qGI()Cb7=Jnw*$zJEfL?bVCS2%OEYjV{=x)!i z<6U;aI1ih{t~$0x%1_jhn0PzCknau;2zyL#qW)s&Aepp<(=hN-*p6jC;-UD_Dc%I? zDHwq=Z$j1O(0&v6CBNRZ{Gb}+`)H<CLURUDncxhmEtXO;zW;kw`*7H{*~ARNSD8WB zdaKyPZtVT6Txg{P{c!E(bS*ae&8V8u;JA%v6LSmqw9Xg!iu1*c!87wi!D-RO`nAB} z@zVOV>qFC3>~+Zxw_;j6O_(iiF0dAxz9PB|-L$_q7^Xswz3I^88aJn6oEN!fw<xkL zWO=;1f34_RNX;9efDaC{NVDi)W%0P*FU(FJY@3!!2?ccDB*&Koy`29QBr(4Z{w{NJ zG1Af{P(^5kwDXxC&6jX;y`-f>Q$<*ZwBJ{Jev6|r8g)ZWz2pwp5-r^+RYZ`9VOBK? z^^pqim@BFh#l>YrM<+HcP;6>zSX@%3Z<}|0=gZpl`>&>)!y|X@-<o@>`!=t!b^clN z&hlD=I+S01_G41dIvIoCpx=3AD^V;msmyTdlLw*IqHo<Fla=*SZ(W1JhLHhec0@#2 z7awWmV$lhl{RHmqsrcMr=2xY+CUknb1{SZ+w+uUx55*wCrK7y8gqV#>gA&k;pI1Kr z$oOG@UT>;d`$NQ`|6235i^;O6T=tVSmr9Y3roWr+9x<(DAB~noI*g3A;NB!S+kej< z$%7+HPG1~KOz+SHdkPM`H*rdM{nto4wZzQU-u~=?TjiTtY){k3H5&`#dB3%$UpXWD zqX-kp^%IT5#ios>=v}J{=d}GVA^~+_&bwXwO~Utb-kAB({Bd$HoNki4t685jp5K(& zf_R1q^c!t5TYWJdkQ4f*e|)>CC5!v-f#u`T^(WDP)@2$W*Fzi5O=o5~`ZQe511w{K zZN7Iq3S=7AZM9SnDbk`2F*R(fx<&}Q)!V(+Kc1xhpkFqN-8<GkGz|OEl%rLCF~9=y z{4L3F^&+caJe%iwebOTwsp9Tm{7K?x{o;WE9np;Bz?UbHE8UTgS8&`{HQ_R!)lM1- z8v_^@R#f23Q_(ZU=u0b1g0)wg42Ix;2d0}I!HIuwdLApseP%zLf;H_N$38Mn`E<GI zV21R0t=#!?Rjehgr;V%WZ=E>5L6`R~>X0-(Vb3aRcK}&>{PLu9pm3$W_Q!w=js-=y zhi)x9a$tDFZRzYV%zbM1<Z6k7FoP~{sb@Op$o<yP!R`^FaH;u9kNsjT??5+hDrL#X zxxBP3Zqc5hzE7vP#=6{i(U!Tn=+|+3@#>I|<?zqul|_b>Rl~DJYfJHmG+RaEoKwX{ zITDt&f~P*i{6?L{&Oy%hZ;<wxMw`v|N=biA?XT3OXz6<_6S0~0Z-$Wm4zZMh(4QRF z?~1Yh*WE<ZjAMWO+TAZ;^#36e;kHN^uje3tGJBI;ro*aZEv;(Y%BA1%g{zgRcszUo z>z0T6!k4#>Q1ez6*qj3cQ9ouwAo0?n-&Z<48}~r<#YXZA?!4jXG*>ls^*$7eg_A>C zWojctMpe;0CIo*QhJ8#IpTouV>aqG&`mRhK4ry&g_fH{sg-RAFM7GJ*3>iHk%Dzng zWb);!3_U^V%7t%P1e4E}`WU)cg_5BqZN{E}O}e~u?sX=FbQyD@!`@7h<kO`Xrk((g z<;ca>M)IGFoP-d!#&DVE<|6ZbH&P-Slz!TB5)y-^?k(J>Mf52UKL2aA2dy!;x-!Kz z?i9|K-No1Fa?ZstcV$Xya8Cu1H`1$NLuA}<BbN9wUBj;8wOP5Z6UKt38gmlcSY=(a z|BAZrnRugQ{1n}fLhyTTDYpnmFzhk8&$-*Vw-wZb-lE=}XB5Go4??{o<Dj^xc<HLi zN)#oP;w8F}>wHxFCfD@7ecQPqYj;g=_T0{FkgdMYIgZ@h@8Yk~aPh&m|NAHK0pasM zK?n%5|Af0hxE&0H2mdht1gU?RV7+TJvLV;~-%55Yie6F-xgJi%e}h&}fiw4W2pt`b zCLhQ4>_6dYcF3Mt8Xt#+Ha&MPJ(<rpI_}&S30+0gPdpmxyMxLw`|=b%4yS7=)IPTX z!p9Qezk-@P-w3*ayP~>^w`RFD)aO9;(9b7{C}OiRtS|<&zj*@CBlg)LFEoK*3IqcQ zEn$vA?p$a{K~9+I7IdVlLPI3wsKqIUvLCyOnhKS(O(jh{ws&pW?&P8^yZ7N0?)?M4 z=vVhba~r(hvlO7t-V~Y2X?VzLdOlT&Bn?u!bl-A3dZpWwTCGRwf`0rW&v{Otc@M(j zL}xh;kw%?JX)#E2^{BTSvPZAh^h$b@AjQ@7Q?*i$r75jUw4do}^LAn3Zi@40?mj!J zX|{H<kUCiOtH=lT^rnWF+`Xq3#;=nZ8&aC~mK)P_yvqLwLBBsgi#zZya?-om+s&UN zUMzGnq(lGeYneonhK0l5^ro`*(ZaR+h_7XsR*^S9%2?AxM@xqtGvE*243;3oS2k^5 zOT_v=s^;baDZ+=lX-=gY`OY+sdE<Z91A6;rvhoSUgV(FhE2%@%lDF~+(lVOWhho() zH<OYM0ty4xPqoX2){!#G)kp{So*?D)vu_7yg_QcQ9j=NzseI*`<=pR$R9XGP7WyFU z>p>N}1lJ^uPDZkCZa;0WF>9TDjD%bc)D-xhlzu6Fzw<-M0Q;#^9BGpM<zJn$*pVz# z@o6vLxhHjEg9%REk-Bx8bbb?kSE*_<*Vyb%Ti*ms`Y5SPhTc+fViKhIE6PxskMXR3 zM+#$~-cO0e4MPpfA4uKH`FqAGY`?AiToOnp#S$$6dt_(P-v{^MDuMRso2^p^9$o&E zqN>FkqiOVx^%}er&JK5+>RnXFWM3N3R~6q#F+X3}g!e7vrZiF)W|*@VW_6d`pBwGN zXzG_|79T@4I}j(~_-GdPSWeB=^Hi)J@<2Dl>>x=|j#m2H<^6lUGHjkd-c5!q+|;p- z**>Gmg<^F`)y6V9(sd5uc#Nk@91-Wr1&QW<z*}+s!BeR0z=aLDpu$4VV_X?67CKjh z75jjPo)@W;I=_CvW8zi0Ai*HKFu)n#iHF2*#Sxhwa2_M&fs!o{*h^`#n12N^eU%+6 z0U!hb0jgCXSg7n^L_k>vpsb1k^>2eXA|_J8#{ztOro|#N0Cm5E@{ZL*fGYh*Y6UFx z19hZ0sOhJ|&phLTet-r^YWyctz<lA;_2uB^I(5>iiSmw1btE2%1b#XIj;!ZQSjaPI zDkl<;K>^;Db<SfQMk(DrCLf<TqRU`79*VN$f^PbP!U)hyQXrgxE-8t|Lv}6dr2I+c z9VlLl3&Kjo5!J?(cW{F|@zB$BbrQJ~=W)3UJr=0~3Xv1aJM5pCut>QeS@&=}j#Zsj znF})B<2;7v0sH3xljMrZj>{mh5CqH(?sFbP1Au7}(Dv6y;Bl|%vCsv;L=R|VuXp9d zs*?omm3Kt#l;YI6p!t#7>v76En-N^WoP!C`?8o=DSmD_`(CZxt_k^@dNNZDKQ+zo) zF6?&;8g&xk)mV5ob*_2UDr@D9#woj?l)J#y(X1CAoz7CcJ)VEkgnZXeXaWO&vW!9j zLu(MY>Ezd7gC3%E?jOfoYF#vZ_{%CM<_}4ylwvOA&)C$lX$Ql9ogc2=;OFysf%|#m z`>Y5u6<z8xRj?j5AyQ~uWmOR1{NuSnHAa<nxTHwWFsTVYK?{in3_$hb+*Q5MCQe>J zL}2FTA>`Xdge$!*f-(vqwx*b6>`1jAxK@N9nONuDDV@7{&^3vXU5`O_w7>h@eJ}C1 zUB2czL;pMPkHqu<s7AxiB*fRHzj+?HR?z;1pFGp;Z1e`ogIFJz9|Eo}c0%ACEhv@A zVY6a$zV-b=b7jdve3_4#SAFaQ21C`Zj@Hb$xwsiMk=8(O)reTV>(l5KF%9jNyu@3> zLOGs}`gxjJ-8XGz4D`AwX8QT8Hb2cj%ZV>koC7;7t$Zq+kH#%(;4<$S%6poYRrypG zu6BDiPP|j$DNoEwT&3qpd%bt0Q7G;GNL3gkuCWm#YCFU)^Q3U{wm=TytRH_u_;Pb! z2XjZV!5p45_fywB=gx-a%<iWoW~6EV(2FUtDv~fFLC2H51LfWE;<8iOkr({GonkYU zZOJjs^Auu9-!x9|lZpE0KWIVA=8VUbYV6XFL@^3pKTZ{;6EkgXRB;xU;k?6VUCBb+ zxvRfcR^G)y{zJ<tt-Z@>@+fs;#$N}vPe`WqeGxVA{l~{YbAy2zoyE3d4|{zc5s0<l zuS+cXH1?$3|60~x8?WU8y<Q#3Zkm!?{K(&2Wfb#wyODpM;M16oW6|&5jUPa-Hbu=$ z_VEW0Fe!f!+g^*~gEsd+`5h}Q9!H<uKe>{Ty_dz5$PpHBJDpd~<<_j+vzRDn+gpF{ znZ#Twb^g#a@hqmSSX^b(MW~Ze*5$*QGA~VQ#o&V%FYj;@W*eiv{D>6X7OZ>4wO1jS zED8U0V+mpMSo33ioPk$u{L~wD)txh?ovm-!uXFkEBsJfw646sfb+W5ouLl46+`%)& zh)YD@993gOYrncRTHYv2%FNQ#X>Gz{h+V&?CZaey`u0jxxcKxg4E~oPLECuuwYkW` z`{>U<qM0>fnWZ?dO1j^c^o;s2`!i-ObZXY^W(c#KNU-aVPTOnF#D>dlu(v(8GcEuj z;%!Jm!g&}k?*%$-?Mqx488_4)NK2#a+~3{)gXembjg26~zj)M!g#`oLMS!~saBKjl zpe`jHfpT@{<e0<1Py~Qb0JsDIi~u0Qm6q|Jg7$szVW*%i0pP9xz5?L$0FGAz@NfXX z)*44o3siE{rOH2R<z9y^pRb9?;GC=ZqQ%7kTb5^u?Gm8tTePFMS820XN$(P*>r<|Y zXy=@ZQb_L-qU*CBgU6Y2Wz0P<ysqsGjLa%%y91Md6|}v;$CiS&FQ_~MmXG6H-6=s& zWzKVDOwrz+!}pzo@gk_yr5g1W+OVwTblL=#|1eXJ&NU_|WMf$=P%_k9X;aqc>NAzn zStvoPEO4Fj9U!0u1abceE&u|)e*_>ntkeKv{tp78By$r${+w&92Ek*!ijrXkOxx!g zcmLt80bB^csf7UC9f0Ei;n0QwDosG;0m8_79YAvbK`8Kjmm+u&Cf^3%mE#-UGE-P# zgE;0gc#kw<F2k0kz8kyS{WGuBb_{h?Htv2Eb<uOT|5js?^;2Fa$@G24)u{Wt+{-Ih zX5HN&N$6aQFBD5W!mdJu%A8;1He}=(pCNV$Xw<m8zX`Ij47^_pvHyh>QdW>Z$j{gd z4v_MDNPSSkQJ!E5Cm^5gK?&Kma;NlgS-GDJBgh<i<ZTjjz|bjNs+yD#ka<?mI@#pI zZczIRBC1JmFhtva_d8u|N!UpKA&#tLN!}DdI3L#GT87Mz&rHNlTPzF{PuBz{#o+jr zNtwfqf!xjO5{i`$!iTn!$Di`vK8~Zlm|1y!z$K2l#qztJa=nSj4)!t{ea6sOaQ~0q z`ef(_HQ$=Nqmz^*I`)<qqb)M({L<Xrmah%`@;n_2S~RmRYK&jq-&jmz)bAb@eSKJ> zYgP92sHlZgP{5dooz`1H7rQSi84DRouqPIm$^KVZ_g~(+xVcTa{G4#3YHamETCg!+ zEwOIg0g>@_i2pRG#W|QOk8oC+d_s^*Jjut^KWJe2{9sB7JMdRMWL-{lWZ+02*@$h> zW;`?dRHfrtGmY|AlX&k{aq0!<KOJ_mJCt-xB){Y{MlQ%|OeShxFWG{AWM8*{YB`SZ z(THRi73%koE2{Aq`!VqP;2bxfbrSc{;<o!*nV1j<d9Qmq&ktdz$&fB57m>;^-$P@? z*yh)pv$Q3iM-TdDwqI-I4QB8s_gPV5t!>_$G?f%`AOb{wJx^QVK{)(rACOyo$70!- z%bndRB0W#gdZL5LbMN2fUT-NTJoR-!TW@+GBL)!Lw5QeiR)$~>6g%BzUPufi$5kF? zjjF``Ff#j<@V<+@`IRYW&JTPL+Z|!uFIxD5;sD`4Z=Q7jIW;qRPCb)o1224i(|@i& z_Qgvvzp3xc-M{COHns(0_+WB`Nnw}3ua|fA*CSw?e2;DG#}d#ndhwfCm6vHU_-WuR z<M#(Va%J5YIC}~v0~Y`6@|apmjVQ8-iA>!0vM}^9$6QU`u6|IZI-ss8Xm7sy=<&yP z{mOlbD<caG)JYm0UAhAln7Wpua(>RW`S3k1uC}{w+FY0EmtXu7_<)ex=4z)cbXk81 zPv-uPmJUl5VHct-p~%U?p{@pJ|Ih@BqhWWCFG#-z)1_KaZl}b*;Nntzj=#Xm%|T1w zh2>wh&URMhV%Wc{E6Gvy!FNniW#~t?a5mdP73Zq8=(viUBMJz*Ub-|6<>9_21r|d; zZt-Qa8L>NYN~~IEOaak~alfM2j{Z+j#(FlJmmw$#GV0RE@J0HLosTRCD^*U<cv}$G z!VSvL(4hQOS<W#X@O<S5W`ckauWS(|1Jk8h`x5Rub_#T<|3Tt`C!8;IX(DUGeLrG^ zR;@FIve}mSBYjP3fDWN6n{DK~$f`B3EpW|_X}==cE+K(-zhWU<<Y#7dL6{TZSVsZm z5-{V{3p!Ewp&-oG1Ten^g<?P^VF`S_3G9jWfWj20<@l$ZSP-_)^yVI+L|IPAWT>NI zkZ!*s4d`lBf&id^BT7KmND1iPt-*eY@HL?ay|h57$d%**m%SpIZXn#V+3E~{YBl|S z1?xY~PX%GZy1=1u;E<&u5X3+vI)G<9$&y@Qe83+Na|va@nfkB)2_WwO$kM_ASu(Ju z_s@^(`xWW`$np!qSd)OcR6yqZ?_i9BIH+CMrJ?ud?i5(H1{3RlfFKeyt41`91%NrV z0XQ@cI(SC~gxU&(S}@Z0<E)_c^ZzS_fljghCiP3bM1(b;9j@9!wOJ)!dbEci)u!<^ zt9|(NIptvp6vsP}QC^Nr+a@gby^Vy#d_#-sV|e|`>T0$JZQ3RlLGYJGzjHtE-qYvP zbuN0E9cz*K^WGyZi&+!aOC`EtWa#;)|1o*0L76h0Z^GGcIK;TbFQ06}%Aph8GpiO- zy2}}kU*O)u(Dz80g_GFte^We&`Mwa7@gE2o1<5<Jp-wudM!a~UC;$G*5vSeY{N$}> zknNA}n>v19pOyA?nHl_|zNhQs6~()Z`BPxriA1wNyfn>Q_g!uv!{%w|5W`n!u&fY! zqZp!fZlibyjyqzfOSqAqC_9vazfL;En?wCpix{zEQR%?y`f2Z5ujlxEHp9(-%N0(k z;dYrg1@ENSQZ+?dxHauw**up-=)+^AA9C==#%!CAC}kT+l=&D_2*Crsft;$h65Z;T z{)%Q)JtiihHmf~laA87!r@lBSiyUao1RX>r9K{|G`XpP<3=!L+I~YF$4Sz?)=7ggx zF=!M#@I*x1JA*q}>1&J!h>vso9o97tLa|e+GPtMv$kru@KcW&_$*=tfQpLQbJl=G8 zdb}yHjd^P`Y14f~RxL|yeq~2Cu3+<XW}&Cl*2{}aW%dsOQ<T4bO_y=MzpxZzEoWEQ z%tqTNMfc!5{8o#)+J&8*w&%xjK{}qEh}J^iM9d=6)xS#mlhL^-)=wyico^^$I$aq) z!GPQ00e`DTDmU(JERnMMZw(Ii2R6&AKPN7#>aT2G*}Ju+Eg)1E5#SWOB56LQa{4%y z+~-?tC_}>W_S;6OuQJFEvlg3mcq9a##7NlvOQ%q_2V&+ScZL-Eksx`i{l&ezk#8CY zpxBAj?kQp!#C=&yUGsOtB`A9J$SMU7amcs~Rg+|h$o4)161cV>%X~v-O8O8QVJ2Ro z`T75w$z?yGVy(Kq`Dlq4N3#V+RUfbZsZwanqt{<&sw%{*yXv4jYr4WkC@>)aN^Cnc zprlxQMvVPc-GhW?PoUs^c#g~4TTmtz!ZeZ~A>%a;j>bk3{Ht1K2QjqOQ|!@1bOR|% zd@9Vv`&3e_h<<nHEI-nx!N*l`hHU{mirn6%UxQzX)`*IJAPI|&sO92OzN&i+l|wZ& zh!dhtODs|$<~Zy8>Y0^!AN1-a5B3>j!sKD2$CmC{a}V)jQ<zjHBz=Y{kA>LRFrl3v z7jkTVRe}cx=JVBLbx!FMez}PZL#lAARfvt&$0Y+=IAg!XI9H00CNbZIdY1eB;00&k zkp-uOJLz^iU!W{kQvRnANPii*qyr_;Y~6bp3teov*Ll+KTT5DdeFA=bSMw+-UpDE{ zZys(59dpDYht0oH9O3RhU63W6UH~^vhWm|Kp_SJ}(T}OeFTp-t4%jo9@1*xZ!sLdl z=u41=7I=(dzlhXdPtu9{@PVC{`R2mIefBiE60qF*iG=g+K-Sy1f>k6_6tw2V`QcP< zSVo0-=ujB5=$c8y%^Hv>3y2W%8#4N9Rf_uj6`g(UxHD!`UuFZ!*-OO!wH~3yKTsl6 zJc`^Ygp@eVYak_qvn-txT<7o}<{_z*0!&brcX~|SA?+_vfayuW9FF@4C&?|+QA@=9 znO!UX2@!umWEo=+O%LQhd<=<vg#Mf$pN+(yB0dmBKj$^!v)2A%zG^Q*N@Y;dNk7Ft z?!x!yCQk@B{ynR~WG%xJv^HrOM1y(neZ~T2Xqz1jF~!tWT^=>Y<y}vgH!t4GQW$tB zjQ)mNMZQAA`$!92i1H$gVe`~r^ZE&{KCg)_Yi$euyW?oH7~EogN374i#7HSWEJFd2 zoB0-#D_FdTNM%2f;t=8yY0zn-x`g|1^E&a+rLb&n^WibZ;}}A%VMqdyMKqL}%AOy= zH3JpS@K+(BWPvk_Fi6#S0aFB7pdhsluD<s_^L_JYF_n1__Xpn`xwwjxz$ONuZTb55 z=RfpY^tW)o^;k(8|7go0I2UvXo-p-2hNOzS=F@>oDkNM@Uj4&!-)xUImtPZ&%OUh_ zXfh)5XeJOGnD0nT^6K-MvK%mplSaX$4MB=fKZ9<w^*2EM7kZn#x@9#Q0m--aEkH`6 zNPTb-1H|f9uS7>>c>3mG%Wx%_=bw;@AD(};3ojo%*VlUj4-8x-mizBRK1UHAi_q{% zIrRxtXn&Qr4B1rwkcjzoirlw6C-NO?elTYK3mQH>EnLGa7DI?tVpiA@a{mMa@Q039 zc?tiH#SxO701d+w%DzGG`-YLyOVDxQA(&uDk*88;*1|g5Mx8`>z!O7K<3(t9$kHPR z@&^w}>>5KiGe#krVdUx&4bu?v$p9;7-xi?z3nw2%uHL?z@*CNg37vt%@c*MgAtr{n zL?^iyP=vU&zdWhevbUgkoTU%?Jc86+MmGIN8Wrq{Yrpx4P#Qz*|E+fgD$9m4Z$ack zM-X(I<nW;5%~e{+VAHbzDMB*b0cTM(IR0;lDbzcdAj^ueBQS7?l68AVyl<PLNQlNY zNVS%f&JJgdr|Z>q^YM!^kAkSboos%8T)D(UtLt_a9M*Z&_!KT0xN|b0LpZ_xNA<K5 z!uP~tS#HYkNmM<yJVbs=*vG(oq1~QX`p*aO6Zo$TDIsnFYzF=UiP@jM1Uf#sIYh*z zo@9Y<zw5G2OsUqZQ<mMoSeOg`ym%QC^QYm>5=mO9!LOZulRp8H^>rcC4A-RUva-j+ zi8SIgtk;;6{w5x|+?D?bot_jNLY^w5dc;Ch=H2%<WWICWV7|qYY(|2=25Na_G;uCO zm#k}9*HY9D&-=Nb^~dc%Y;#%@>1rQsYz#@uZ=m#FZcEKguqm4}OzdXxK0DG7k{*WO zB_Gy!jJEIXfAGHVV)e24ObQ7J5<}f=|BCucZXG-~o*Li1^5)*{{2h2(MweV^!jVgt zE_8+JX*twz3!;{~=;rm87;^P<xa+yRgKZ|p=bt%nu_(XiR$PZi$q#P~MeJvd1>O0T zlko$IW7)=~JW)u3wDFkqe^18|6uXP-sEzfT2`mKb;<2aYDGxLSo!3<c{kS9@nSOdy zip<fbi8ygSD3yL6rY1}9reML0*Y|vLx*$9G2^Dh%-^rWXuK-2$f9Dd0duP4bdvx@D zddrQ4{X+jkcM0TST*Kj9FZ3rO{26hRE}bsPxYL^jik6q2$CPJ1g!)s7qYneC6(2gG zGcRu^yutdBaVMwp=hKd#)FPg059X=0!w>mPJL|eGlW{(zADCH*ou`_r>?*cjCMq~f zp<G2#SCDK`9x0MTkK1*6A+O3{o6H}`taI#E$Rwz&2TG1{iapdQ*F1EwwA_Z4VpvRi zjIWye=@AU7;s)$}V2!)UJ?<vYD+X-m<QpA2oIb2{ELN@bQED7=_$3lLc?D@Rllf`0 zXpDR%{FPQ3?c%4<1u83NdL>iKodgYBm-bGzUqI5bV)Np%F(Tn~Scu~=%Q|uK`4t8a z_h;k&9ZC_GG2Ci|mNMm=n4}ze`CMgVl1fD2hCcVwp-bWzhl^maPMPt0<&yXXiC;$V zPx?>`%Tb1O-Ir5@ZB7J}v;2A@bZzkM<!M-~(<v5PEZFnIffD;;`J%ub>LHX`Old*X z!%d#pKmuYh)QJgyPgq;fCPmEFe9_aExP}wd^i2y>-L-z0`BVI6JoEi5PJG+Mo6Gt6 z;mD~g6ROXq75d_v-dW}m&h3bB<T{_<DdWf`oZk`Q%ys6>E#u53aOR2x%gjz+#9OGT zPgCM8!uzpk+AefFs)@b}orr2;=t3u>no>|rA5l%<q4+dZQ#z_C1J#s?YWjp~V(-#= zi~4o0ODhQV>wK5iJJc_-E-mts#id8;Jc{Zs71h5gsxK+3^C+pmR8s${q`pLs=TTOF zc>(`bS$*jOo<~LfB?bPgiuw`-o<~*vrK<W@RrMuRbsjbKmtmJ~O3EqThqn!p<!>SB z-xC!4+K#pCFxTrYY^2nQD)?m|7Tf9gL)<mINvBU|+xcekR{7`hl|#v_&U~r1YDMC_ zaYN$Pc9@w4;R%;tj_(fAJJzzDSS{(C)@nKJbT&7IU7^@-H%m3B%*}2<lGUqMYF_nS z_d4u5yJOdXOJtoeJ(%_7%u>f1QH@}`*tcCzwj9`SORC(Q)0LE)N+uRMEga4kaqv#8 zjldXspyKz3#~QIY>J)Tvx*IwjP_QQK>MuP@=O;F+cIHf;^3vd9;FRUqbQQzlA5v~v z1$xm%z^<H+YrQYIg2HLCL-e=h@M+YyOpl;qa!KkM7}{*1k!nNS$Qt3`qND7WsWLWw zV)Mri=}hN!*s+xImU-`8xs^ybne))_1?RMD0$Y;Si1gn5KQqMA3Uujrl|M60z?xTi zv7Jj6_quaF8vQK}{T3bAKsM#X=vDvf@O;hTMQZfqVceCCv*FNb){pmDH-h6U&{6G+ zWSB^DHi9!lLnHN;pi=g?yf#9s2t&}pX!#}d=@KupCiV)W*Wre>PE9Q0x))-enuAVf z1Ot;5N6T(`#^rny%R$l~B~+j{Pd+J}qJOjz`ovG^Hav<$rZdZ>*f(|uagR>352%A8 za^9x&^-_?wN-EGjW}P`_HXhapW5(1!t)`F1rfX9af46!Wk7defGkRwWY~}ZrQUrcE zPns%7{?^e(2oyHDwqa#O=Y?47d}4=-0Y`3fM$QfgqxC`@F4)>ZmLB&e4qvX5&5X8^ z{nE4)*t)c?9nbky;9Ee2%;PoY*gCJ9>)HZOe};Gk6|(*o@pj>>cxtZn-<-Zhkjg{9 zbJLi;^Njn!(~morl2s>jgaB54iK!+Mx{OZn><<X8BNPYQrM&jjpIuG*cE2|EQU*0T zp_{=Z(yOtuLZ*;-jQDfl&*sHzI7T9yV90u`iXPZ`_O08{m#nz?p6P6h!hf|#%NH!) zPCp(-*C?Y;u8w6IR97-hh{HiuZKPO@gHCg>SEiX^(3>1>vbBJm^CK>3+Ohw7pZ)ja zCou3wv)vGjmRi?-Ez9C&_}c%97w?K6XPL$cIsI>m8egl~9re#HwU5bgLDP=|Q^Skn zA*!*=>#i5w3@@!ypcB%Z70r{<D27zg$MILcF)mV{&q|$oI$I7uXV&3OW$+(D&y{b! z=z25Ei#K#g#XL!I=?5XVF7%plUfqH<LQlr;;@ujE`P;$G@M68N1K>~26*t3G1D!F8 zSAsy#$YjidiF&?hXfeJ*MnCIC5c={rf|lPUbG?f<bUB{RKCni}1uB^*`Cg^>8eO{q zfRkM7W&ID^4GYV`xUHrpkYx>)Qp&^U5*1Dz|3mKb1mP~B#VGHTX)Nux5jcy15Vv^= z9T^WiD$woEk^8%I;XltTqi-MOfJcrF)`;K~5Dlf*ROm=Q1~<c7-67K*G^*xF^Zl35 z)ghy_4aa`}Wmi^wqmX%v%@d*aHypF*)(I~j*!tc^P-Ou?Rj=z_lCK%&iykxuRiK$( zf^1@&DUhyQDca1j^|b=M-4FN|VyV#Szrg`W+bXO;rwDMAX^6If^DWy<G6>{C4hZ6a zT0#@<oc7H71_3R5j&;JY3b5jk6f&(900Vly#$(gWaiEHsH)Q&m4D!wv$Q-lx&Dke= z6??9aPr_`rr;RYv`mRBsmxXVgkQo4=B@&>@0uZ(sgADq#Gl{*72c00#IxU@!YpbXN zeJlr}a(oJAs4Wm<Mj?8y`hv^zMKyMyt>X~%;cx*YTGMC)Z`r*psmyn{=Zp5@vMSJd z9<;`Ju|1d2W)h5UhNcIRV4ms+q3($VL90#Y+!6!68D?^j;mT;tE$(X0N?9YaEELR> zM)rUWFG^seEUyB+zX^1*jKRhLt=`ok-~3L4tbXFIdB3J`)la!YhM+=EPTg=boFIa@ zmUaM(rRAW?3k;wMd60)Uv3&*bR9jqd9W`w?v`5feBm8C_nI|12U-PPWxd7TWn<~)c zEufF&l%O+FpI?%tfG~%(2vGYkNNuU}fZhyKStHc?Z<lFU9fBFNm#5uu#pG=T+GQDd z*4YElygV+9-VU-`22tU~`K|ZJ`)ioo_B8?V=4wR4iA7ok+9OoOTrNdmopAbuv+NT{ zfX$^217VANMDaGo=tIMaQh+rgB_DuoXu-54#93z9$hA&Ld)z+kfd0J9<u@oumLfz! zGI-QJoW-L<F+<b>LKqBvx@bmgjNIT^Cye;g8oQiQp-(p~XpJ`$LqKkM>qow=_iWxS zZ^MfZW2n(Rj>7Y=mzFDJc!m|sZ3p}+WWFX{Gfwroz8=$f22waL?SX`3ibIentEe?f zMlGshZmaV88{y+=ad>eFU+{G0^I%%zXO-0zGDgjJ<^=>>DZDy8e>Rda$x{m%`Zj-K z$~vFi8qv_*eK}~lvP$im@v}y4fF<d-8!nAs^Xe364sGZbU<4VnNk50^ypM${x;-c; z*Z}x-FCeZ3-;O1|-0g-&XToEw#coV)NyD1&rYlXsu&<n$11Z>j5}<MP26;*S4bWD8 z8EtdLQq|n{N?_P@r7Ag~$VsS>8ELpOFW}I8-m7zO#)6^`bm<}udk{G8zq}dTl8#ls z6F%bPfk(KDUY%sg9A#DCOo7s#6G+eg1#;}gb)*HhPV3+H@0kd?!q;PJca+R+OXY!+ zvsK~6LPu}LSRKx&=LM*5UP9YAX#>~ltbuFOs_ll1s}{6lfo$^vYfrCwbv}#%imXTm zuhB+!P~~qhW|8s=#3ZHv^YX{SGS%5hpyv0znyeFsrpCN&=;l0uq1P(O-IDel`Pa)v zDM8Q?hSrFH8GozU0FV>w*v1u<KS`Fgc}vhWzXDCt0%Q<P=yd9n+hzB6xvUZ7Wp~P| zy6k`u3$maKK(epnZ!ifmmNI!U?OvT1h!o~nciy6EH<UO6L$kpWbcgV{0)2E2U@%~3 zfoIJ|F#ka^&7oh{KK^F?n0vdd3P00E&>NsN9^X>1M%)>=W<0JAj#7>us3`#cuZNB) z1mTF6SSG(@f9q`{{2T>+UKj+^5noh8H&5;*wBI(}ynx?hklZWE4$^t)L7x1Wpde7^ zDzE&89R!4loNWY4*7ptFmS>N~riYxviyc>;tr0Fqz`Ue9&>8s<N0x6usf`Y9=>FRI zI>?1p&D>V3i5l&9>H+#PcpFS)2*6kp4<<5JFvMnBK-%(4ng*e*-*mH6Bc~SvMb@1I zuK+A0XN{n~F)v_t*K};Uts0opwE~&h-l8B|9rNtfEG0XLAdR5JMG>DXZb<>T3|{q~ zQ~>U)4HjG406q@ZP(94Rvqg}~`>|B>S&%5(`Lbp(=#8$>dL6FNwj0(pfz?XCJUDqA zZh^V)lo99~8-Nwpy)_CFILlhSo$J1}1iZDXyCLXWTY=U}0=|E}*+v*Zf_|kZgibq2 z1HL*{FpbrLG-xNu8L(3eyIazRQ0X~@mM8rYx&kc+M*H}ugf_xK?IUyBQwb`x%u{N& zB-W2$SAzSpUQ{f*_qTo<wi|j$X^c(BorM>#7uU5BVglbabhnlXuM^Tofqo?!Sc|dB zE6@6X{OjyjAHQv=1mzRKJXLExHl6AY<|!YgvCN&w@M7E*1~0@xL3r_UTgY?(24vx9 z9)d&4v=q_cTbWUTezKr!-m+H=R$ga7Ac9^A3agm6RH=fMSCbe;A4m;9P`pEN^^kI= zfp30Q=PY!3dWwI3wZAlE`fTS*crnI^-V5OnA6{Hfphlne>OGsa2R_w<i3cI+d~U{p zbAGi240YS&Yi{BmbnDv1jWG>HN!iv2Q?F}ohQ(JxKMgjOf_!Yo0`QJSVJT`iLo;<s z^dKW!L_?9VW7xF)wBMbw*VAJEAts&&g%?jeml(^e^WJ|N1h#G|)h-gfJI7gpM}P*s z000?S0n+`T3K^&I2knMV(mDX_FEC$JM|1*`;`;fZPLM{P^l<Eg^ZRN0;vqHjVWVf~ z(1S*T?;46qCC+>0@1L9pE=*rW4~|HI7e1EW{P(XGBzc>mefj^({Kwx!0Q@b=fWM^& zNWoy>Ph3P>BPLYkfuzd*olp}kNaAq?ueGehvbGzR${$#K?so&i7nyZ!2O?M}tU0`$ zwm+LuG9Nxkc{goOt_u1{9thsnClSpex&>ZcSmzV|Y?i4)W<yMz*0{F+7x3219!RBN zsc0YE$Kc!DBe$vq_F$GJ{prv`yzzYB6AS&dWt*?rwxYQS^-2zJvum?J+u_@|mUl9X z&cu4&Xz0^!$~G=0z>VpV+3JxC*w6ZxtQ7aX?~jRxVoNt5r>C3Hq9zF*_0u`E+~EG> zd2Nw4hLGCWqx|5ms*7<Cd4iK3bGKhTwi?j8cd`Ae+v%YAi;eVTGQ0Ao_svVleA=b& zOAQ5M-n?57$1XDZ<Xm)$j%6TU5`<hq>MLqCa|^h<KL>9l?e1?Ik0QMuovD@KhH9S> z_OeFrliH%fg^Xii-=14NAphu6C`s<Y11<C>%XXjhn1jyji5Q(gDc)gd;d*^E`;8>2 z+uUx6^e4EF9;E!NA}DheV&|ErPF!6{p2?kc@J)kMdX6Jgtqh0@UPG-8B0O&+x~~1U zx!t0U=Di;F`{m1nETzs_HFwRkwm9Xfqg}h}GTuFtY8IMD_D8r*M{KnXKAWVbuV_d@ zXOMEzy~AoY<7Cc^Ux_2<qWkukTG_Y8Dn<LOC-ht{5@bn~X3u-I=P{2q*-_P`@-hgo zNn-LO4(Nas!a{qBz)=?VS;jG+Knt@mnJY;mHvQcegqGxyHz8rqZ+Tj+@JOQ2_4<ih zpP#!cX9{b?z8=MYqF@q~6BEN*GFj^SW<BFR9H-6Mn|`1a=+&Wo+{i7lcr2N-7?_YR zct-!Q%U!eTIbq@{+wazVy76`;HWSgO5dwi0Yz9?fvVXmFxldHzvh4O6avwaU@Y$LO z?!Go@Ax+3k>VCS$FCEx!rt!`;!7<Khr$U}LvHkOkyWXH^(u?vJ(s^zEwhdqNWr_8$ zZYu7lY{yQy_XS$AWqkw87DHo+N%yEJyKM5k1r{tF@5IJ7=D2QuuW_bu-=0lVS@_5# z`rrwzkjmVbKaTo;Q`eZxZ(qr`z3LY_=#n0e9AFP+!R!rARa$(QdL3)AtgDgN%8^U@ zg3OlZ%njtsZ6(_wapuaCLzEE_szZp7A!Nu<*pcj;cI7*(PZU>m{^Q{Zv@5WJ6}rF* zk+8y8SYZ~dupCy1ffe?{3URQ)O;{lW!(ODqUZuh^QeoMsusm<;J1$68UHQGoeD8a- zV+d+J1mzftS`S4zzDKRUM>&R}*27Sa;i&a+lw$;H9p)T7d7WdNVM|hz_!|{K8y`&@ zpGg~EN*muo8{bPCKTR9ILHlsMKYG&YySeOxTV?_`X9v?bEaIqnb+wT8*GFn9t!x75 zZF277e#-kRwYcHHb<(h}AHyC#f%GfkohLM_`(R5~D6ISFCCAx|$6V(X+rmK3IUPOQ zcCI}<`7Yn?^g#gUy)9Mkw=Mb;o3R{Z2}ZA2Df&Yz&CL%MB5F8z%(a+FS4fBtT2Wdt ztgp3W-jG2aBM^~%XboOw46SV^e0}`A($WB8E}<=M{R96!6w=4qgl{E{$}{Z4Tm5vQ z93@w^Yn1$ACU+P;b0oL!d~rr?*iFHng7biZTjvK<x0H*QH6_8BMv-Ju2GAiaA|g7{ z-M{AQW4EQFAaF;g08)Ccr}y5@JP$e}21Jj8TLZRkrW?qNdDq?F7pm9xFf^r*Hh4wT z;<DZ;Tn6gJ-t$Q$Tlxy^%R;*=1EVsz0j@JM<k}m^N|K+Ve~t9G<6}2P=+wOun%zg{ zfU~*~WV>{lcU4-vK<GI*e4G9q_3e(0SXv{4g!mJ4rXk{#t$rk7lR~#w&pqKmn$EQ% zd-Zcg(az)bcbZh~IGZ?;DY<HF@YDUUwiqWGU17eO7?eEqS)4o#M*xoj?a?yXPQR*p zR_xt1F~<KWyybTv`}syA4LU!P`8T(X*Yo#u9k@Y9&9@H2p`rhR9rrOoOAYEC&C(*c zW0$)p%MDQRzxy}CtH{t-p5oez(e=o$#?|j#-`5AuPa>_ae!GKM>XRJ$^Z6KyOpt!~ z1uob4o<x23ui;r%))}r(wmkzRCGosnd`?QCnTE9XA(2IBx@pR9l*g8R@8%!=lwGj0 z)BMU*sg#^Lj(jl!ZdtI*r`EdYnP(2oW%~3&mP-u{V_eZ5N1F@zGf-#k5hQsC{UC07 zHKHM_Ic{R8ZOe)%QWJ7c5kEy|KKwC=J<gKubDZ1hzj=t1T=m$(8D~Pv1|+zUr(eml zDe2mxWeNJwb=zB)#@C!Yoepd|x1#DeJjs{)XdB1G8>uGbT8=J+x#l||hh2!&$5xK+ zxzZB%bY7amB}k{s1<<YGQw-Yjtg~Eet<4<Ld2fmoGhBGNO84bnDBSJpQ%(H2Xx)?V z+R~F&{HlJ7r(Qo=zaOlh=KEOA(FO^O?!Jd;mp+c+Wt+&yY>qe6ZNSi@0Cy{*AeEON zeM=UIIunaGPPljWW)F1C&;6_@SKIuTN*$DW{1b|S-P;Bk=GqYuO)AvyL8c2ixv*Ks zL>nGwjh^ASIozHqn$JX?^J^ycxSjQXK0%HSB6)*d@^^lkzp$qsv7c)C-C{Dis0SUV zWJOK34rm`+Eyd&_=l=Ql1*+Q2BJ61xa%R0$6&E0$5?y4vGBS**-^#~8=cSjS)8bvo z;wwpCqF7z*EJe6jkfk+A*R5xJPotC4*1)oXqosS@O3TnHBgJwf)P|>=!|H+|^1wqs zTH7P|wM3Rp(Xgxk(+!OU%{L#?f>)=KwB8^u!-@{iK1Q9;H&KWmeF;!is=oL4OV1?_ zctvbXGgszMnwD4e)eL?IRNw-yxxc&ngT0j%m6MAhd%{#J>DLD8IdWY>?q7$DLiT#8 zRwii&B)M|I)&jUhRI4yYfQ{nGhytk>wlYaSaPxL<wSxMqcUvoc@BRAO8gJd(?%c;E zdhdQtY{s7Ra69WP=z|af5WCwMZ}uxf8Fc+L6I0QyWm0u#axFD!eczxQl6nTE>(lA) z{Jjy|LR!cYBNgu=GrOVng#D_zNa3cj-%gvWS{q`f=|bFA9+Mrx^s!|gKVRgL-|CeT zj2`LzA6r)$)<zSpYZR$Kptu#cQlJ!f2yQJ}pvB$YA*EPa++B)>V#S@{?(Qzd-IMIi z_uS{XzwV#OJF~N!O?KzZIdk4QC&we{7?c`0Z+;-!U(shVc80Z=9OU}-zHo_RF$136 zm@GR5A-J%;*S7Bg?(S}37x42cAW)q)bZhw8;MZZ`l5YZ$wdT3P7t>!6v%_c<W5n|F zDZvzKwCdhqV2rs6Jv<I}(_9cqXn{idAG<De7g&r9Gq_#S$k`>{Yov5hVt87HNjf1o zACYPIu1}*z_~j_e_3YQH_U0NzIerndER75LED6)|#aQ&8{4VIy3u}*Cg8Fn+S}rT% z)JiN%$N{BoL1%gfZxZ05N!fX{BL?_gwxW0RYnK8I=<HoNCX3(dO4M3nOGPi<@mT-R z-m^aOOxz>b(`0msw`eG^YZ>_F?UQKn$|ZHT3{=Hh8D0HL@qXx!YpuKPcK@)2=DZqn zskKsq&NLAsdWSGop!hzh#frz5)n|snx4$^?xYgn)(x=&ak#Mx}RifAQ@Z84TO&$5* zQ20Sc&9R*M&OefV_B{0<#ys_hQ>HJzd9fx<^&}w^PQ<>Lfc+^Y;sG?_L7#VmenSZR z;2bo57H@%-pv&a|#KUIZnaiWC-N%^QyH7M_{6#;RZS6io1O5NNb2RY(4`87|=6?VO z4O;&LFZ)Kx|AZly9^c)?RUe*ErKAKt-J3d_{P#rzqY$L6M<tw4-K@rRMTP)mP{j6; zHOUwMMA@QB0dxdZpj;d6g8T)HHrndZUnD#V`;z}^nn?LNf2~6aqLX?=Ehkua7+W^v zv8eLvgH!HqSH|xr(dR-$!JGQ5*+ex=90eBsj&+!`AwFwQv2OCqUf-zRIVi{}9aASp zlO%jJ)bPJpU3*wVh=~PyBWH^cK-z&=mxsD#&`v+*&CS<I;@JTF^7pl|K(cch%Iw#2 zg?65P0jD<((xuq}Hn4)&fD{Jhfve(<fs5!X>MK`(4;=x35O^_mM20j7drfO`x~u%Q z+r6-Cy+I!shgUkxEWh20;(xZR>pdgdyFytPjBv?-+RASF|IppH1~oij%lNg(XHq>i zY0iY998T#_4@HR4a@0vW9<>PTKsvvnhK6tEB|z{E;QHss0$gCLL~{2|_8wS9o=}^Q zgpFRqSAe6Tn0{<8=h-?YDDW7!4E<PdG<Si9RMZV9ErWn|*h#;?LMpdehN(-|>(#c! zn2mV6wwgv|orl^R2oLXs4NO2Z7)a`-piD5pbaFV$bFePjAxd47`047kJdJkY!O4J& zDxirzFF6$4Lr>2n)CugS1A7)42Vx_a0IuT9FJ(9<pI7IlThZ*uN#%y|QiQP%Fj9B) z1*T4iU;RmUnSq~HJG7m_-=A4hkizKw>%9?!Pm~C;Er^W^VlBR2Sg;2z_0gQEa*1gO z+L^q3`Qn1r!S<8K$fym%tzH66`TnN3Gdkb@CA@ELK|+Ss%>FflZ(H*~kgHtBS1PTm zr@(jM2tPL`mO!RUC=d{Ro~t@?2j9Okus9ccxL?$yTx3|SCEMU#!K$`T)&G>`zomGv zvo(9Er?om}cT_Q6YiG`W;0|P63dvl~99@>!El%&o+s|g?*NP0g&4@6m9NcKy=Puru z$uD*nnYbo(sH<}vEgCi)HtD+D#T{I;nQ;{8dsP)|?;q7q*>om;DTAaHRCtIP!O!ku zrm}n$zc`0KWfi}X9r89cUrCoht(D2+qq3ng>R*|#lQsf&X^$-J)<@O_GCJv0B(C-B zwOnkI7{sPLE@Rn(Tm{#%ZdqvZCMD$xL!wo1X)<Uf1(kzb|6uL8f+kq#@+M{E3SalB zQqyEez7>lIa%BxbxZ+Q+Fyu|*Y!xO(t8heT8A}Qdi~Ik<-gA}GJ5yJYE6j*i5uwTO zm)!r6F7*q?9DZh{MSW_)cL_GS48ru5yxon>5$jVFtK`!NJ$ebO3b>0KPo2)y*TWF# z4Hto2y|>h2E$A&5djPdyl*@ha&oBmE%pdyfWiBP_r0GpptN+VXE7czx?7fddYYIl+ z<7R;KVJ={i1TS0vf0<^V$}b0OdLafa+b!W4laf*2?9P|9g-JJGmYsb-sy`J$8Vq~K zM@;L;#ANBW$7ZBYmQt#U&^miro|CwGO5S6QDI!e7dxep*PP-i5fNB}%@fzf`Eucak z8HkyTnS7B2JO|P*#HP+5?}>r1yz*NsB8RD8PJc_p9mz3^s45EKlpqr4q9?~&K`rO- zsSc5p+mYqJF5y^+!N;g1tJK|lF(XTjOv=r(1Gq3hYSwb9_(JSIauq3{C`M}pQESK= zbL@3NU=(R-nT|G^=9(kW)D39-ZFA#8uNVy2Ne1jR(Bdo-Ren5ooy?flcx=h5Ge7T> z*?a+hWi~pGWp=_;aqUMew08~BSZRbP3JjzCc$Wi${Zj)c{oF{^M_5Af2lrlkurT=? z3Y&0<nx*7-O$4}qbCy<&kRCqd(VME8wbp3YZ>nr+Q3)$eY{b~t)n)RTlhVzzUYKgN zv?F&`oh@s#x3L`NZXB~AcBQONbJNwm-5%XP>C{p*A(7IU4^wFCcFUnq8om7Wb4Q@| z6<V#Z<#R(|YMzqmXgZ#o`z<7(Qldw&6zUNrZyDAtp7)KuR;We1G{PYFPyAH5ZSgC5 zgeW?T>#dkgkn0ZC-l0)9x&L$Qy?6K%DPYosEafTXTT+I+Dg`+UBI?AfZ<2zYpEMEg z2qsb(^Qx5PEYhP#1Zgt7?tfRQ%87`}wLDrK^?B0g6Bz9cb~e#XEG0>InPEwaR0mP` zGKZYnGl#!F>+>$q?m|QzW?WdDST5bYuohtEKtjk}i~(34YJG?Q0uCYg$CL%^72=|o zH8zw0;BVM@_v|~t%EN<(P42QJvP(in%c=YQQE$ZzGYto??1>3FZEb*yE9<q49A?*a z(GrD*G6`UXWU_(@aFrid-QC_9hziUCnzI1PVG2Sea~d0YKdR9&r#(aTQ1!YC$S3N_ zKDXebP{gAkjtq234AO`Mgw7z2hu?$Hh7=#)EW{5neE>%@iaI9ksowXHU&U5Eaop{l z1RP#SqS=uHd%inpY3S>!pucRs-GAqB$p^b%-M$q=cFcWf{*1rbmF17<rE@Qc1o|vc zp{bbk^o(7y0>NlHomAxQN#P6x{bC+!+f~(u!RL+*hXVLE)NvyZ%q3X$XVf)xi-ecN zIS8?F3pT!SB1QYH@pKmR`#Ach-+g)Y<8??Zv)EgO9DZ2h1McX^C8NLX8-k+B!Kett zno)1zK8*+C{=jO~7UYX$wU?o-n$j<IG*xD+87L+Lz6Ar25_IsN@yC<hMU+wU=p6%` zeG1_-w=R~`1lkXrBwdw8Yj&TngbeXb7VeDtx<4i(ENWC=?hSAyE3!Wm76F>N(By^f zX;wURx}4n-fE2xSHL?Y)4gneW=OKGSCE8cP>Yt0^{0rr&(Q$ep><Dd|tic9I<Q-hy zfan6^u_kHt{&mp~o@yHq$?|jvO`+`_1qNdP@+VUd0GfPh!(XddrsMiGH$_`NM&==P zZf^C>5m4j7@cpxfe3R7c*yy00knj9IC}=yjWV9J5)|Cw3;BBP`Ji`jg%b+JY-Io@h zs$a}zW1V%xf_`Pi>GNA95yu11>Yt>!e}g#O74Kgud4G_XGiKyoJK()=W8}hKK6%jB zZ1L8lV|;_5L#-8fa@)vEKmTW@b;T5$$4$F4NJ4tOBf|O?LRB^OS!xQ31SR%;%PRiN z;m-c&LG7<*dWKCA-!8We5}PfIOi9?-Zti3!N5)UTmbcX_JYW8yutb?|hmhyRa0Tzf zPBz1R6VvpLG?JZNMfr2N&-QxGd*@$8hxcpu*n;C~=I&D8+vN?zutd^TBo(&z3F_^i zR;jO;opc;!k3C<)uS{60jZSVa{Z0L-4in@6qFrGGH*4k@I5y#(CB|5`+tCH-g+l9a zK@K#uD>69AZKdF@#h=i+Hy{T#+7(@Ja|_fntl#FxVmP#p4CKH^yW$LPJ_>R?0G(aa zZP2|nz@>UhD~bc=5P5AsF#Q*GGdeVqVL4cHCkYH!WL}Ax;NPMg4E7<UcW^_SJ+6g; z5T6$lf@L9mIU#3`<znYz)4Vjj+IR5$QlN|J{5Fc?&VV&4Y2~T~LlpaCQqTGTj%0&a z_zTHb7jPd`9)iW>q9yK$R`8uz<ScO6dq=J0Q8~?~dNVZN<o|;&Rh^&MUkR@Y>DG8b zNJf1jHq5xayY0E>p}_zIjshq?VDz6GdJd5v?3m#Hsw2UC6Y3-ZGeX@wT7}pqviqdt z-i!5g_r#X~l+@IN2awxXpa%&dy?1M|IJx&)Zy$WME!8=r5c=MiE=!-R_?yxfny-l3 zjB6WmpYw7b4*B1476ZRA3oYG5qwr{LTWb2~zHP%G2<<;UJMVRD>%RV4X;!nG|0sJf zd8FPjTC1f7pBa~g7mg?(R~Oj}Bk#cqX>e&OJOkLPum2psNY)9w<KjquN1!Ee?Clt` zS$5G&;epBFzLb%0Kob9PnafhD%xX;Nhn3?#UT-ub9i^0cHP0)rJ)TJs$~cM}glD12 zKM_g_De8qok{QdtR&zp(y)8$p9!oYUTlF`g;K|eB8j4PcCIy|Y!7hnYZIM;pruSrD z9m<UC&V+3erVLM(8GKwYK6sxjLoHxKb}{6`c#s^WG}COLJQM7qR2%B=9Dd~8_OW)< ztoKXN7?=H2Q{*MpH%d|uTaR#uOM~8^10o?t-?Ln+jgv~ci&K+G`I9I&CH;)OKEYe4 z)j&Eb@-Tr{eWXi|V&agh;Nf`RqB6?CWFTVCa^OI7G2Vb<;A4%8O|OPBH{sMP_cw1c zc$FWnxqB}o(v)!1g*QA;?`V6aipf){GOzz^#$cui3I~>IzwFgQHT&KbMx~?`Bu&3? zv0v`Aab9v<Tp4?_JJX^NUZ%ABuS5Q^EXh$}(C40O^|Jg4SN;V{fG(ULOyL&9d5-6F z3F^S=qW+Z|jVD7(8!02~2&UbD<w5YmmB17kP<}~}Q~X8%9U(}TjVAmHn4%_#(;4J+ zNxOk1)AczVN=FKk<))3alq8uB;;aNYxe{brd=o=2X?MuUc8#lG(PiSvh%6hB+(G&8 zu>&3lwLJlwKB4*h7(^<8RU!^H$9p1#7ef=&hA(M|Lt7b)M-m7vp?S9RmevO=Kq9D( z7Ho=7Tlo`@L>j9^5^PRG+k_Qh6x8+sY)VF38G%P4%Um%M*e47&rIsh;!~^L-p-S}6 zcw?bY>8!>cvw>n#pnWP}Q)b%AH=vYXP+Mtm4=t??D5e40rw=yeRAy~62Ah7M`AZ5S zRmLij0h`m&Hi2T+p?%I^Q$gBFN)Txj^XkLP^;OKjXXiIXog^#p9u2x*r-d3c6e}M# zX9Wwo-4y<r9w!r-$Q%x7`}&#zSJle3^L~Ut1b44@7sLydrFsOPK<_=@@oT&lCd!rG zH_$!G4Bbo#P*2G!NqP`HdFP>5vD!A+qhWxU<?ZI3*FK{jMNvCBw%?sdp^{>Nn-X!P z*uDs(8h2!t>294i1c<W0s6$aF0100yS=)j36!o4R)sev)Y(V5ej6n_PO-{vQS^<8Z z!zY>M3rtNP7y+jDyd!i#XfJ^1LAmJ5jy!0nl#8K6izF5ydR8tn8ZUMLfk8n5<?7$s zODN6#QHu_a!p*c>A3U~;CeIo1ggddmL~irHb=KeYosb;uRVb-<tH8P<DyahSX~klk zi;A6m#yxXd64WGn0LgU#mWQx##on~y8%ubUUuF$Q2$c6ioX_oaTK@oD2V!5@5m`JS zQEZ$2^q+t!5LF2w$?CUB29S2@^yS#%n)eX;a|FcT93GCMrmk+=A>Sn$76o*SPTEWM zWE3lBZSsI#O!jc3*y*UDPd9Lxb)Iwrj6-sUGn3-Px|t9h3@Cy)5(Bi)XnzNtiu5;< z`mUk2A7u)hApw*HF#OMLi|>{`wecPD4l(NNPcjOW7@=^7hg7nX<GALD5mD$zcMK?P z9Y9*Q;1w6`a>&NV=-98Vt)E0I_+_ohD-~MI#*?fIhlq@KLtF8N{7`r%jL!xujx@Q- zW-Xk3TUO(PYGt>APEe)v!OicOG8Rf*?=D&HX0#Jo>L`a|0A7y*=Z6r<^~i@FHV+iH z-akRaXD)$WTGu9asY6jtt$(0py~Fv2-(wd^X<hoC0j5juy2!bQ!h7c|zoYop6NKt< zov_j#{4PCRaFZ?AS*ADh)AJSJhwWagM8jaCPJPq#SF=y&7aePY2i-IUm_alKEE}JU z;yEvqzflyp6CV3{{pI()dDQ`BBIu6cSf+_eUDBXH-d>$2x1asu;TEs$=F{rAzLTSx zU1MTsK|U5hK6oUYU5UQw$(k=yy0wRMIz3=;T}&w$O?238Y-#Ucp|fk_7Y=36n@0J9 zhZ;CEqwVW{-n`0UUevq9b8$Fe+Qo?ae4Z;baF^w(UVy@9ScPQQs5wf+6}FI+D6M+y z`Wx<83<M6o$Hq0o{E0it&mbIo&GO#!`EyLK-Am>bBBj}Nbd+$~C}Bgq#?7)+YpDpH z=>bx~p4R@{%L7K(tvb~|1H+QT5UHQ325pWV4m~u%&`umsC=u;z4r7v+Twn@wDE}0m zQ$5W_v{aXoES3~5D3qG!r39EF1j_#g<it<A5e@D#`ic2k8BCGsxrQg*Wu!2HEky_l zWuxLZ1v$;(cZ^AQtt(<lk$^(EXkVLwDMq0Dc_61RbQ@zbt_*P<c(Pqakx(g0P^b_U z{}%d;$%}yBQP9pTJm&BG@l;{r8scEVwSahWu<lyG)LYb3k$*-{r14@Hp>l-ayce`; z&p}p!&?yP<J>HXGycn4vaRzW60n58jI3TNFOtlxFJ#_gJWEFy`_6oFzE?<MJLZMSq z;CmWc4EeKwkRWksa2_448a~MCCv*x7_NJwk2E`P3zSRW9lzDOvJfFeA!M+}0!J^$3 zif8tdE42$^Hn#UOw&x_2dY9EQ@|N8Hx5+|jhA}5DH&sB|H;BkXxxoln&)r?-c+U4B zi0lT~z!!OdpCaL+H9+{Fd;7iH-*J=+I+&r4J(tOoE@;XdC658*tDdQHJfvWF3ifjB z;0FR>oQ{2DeokDN+qkAFbDt*uOupwW=?$CWI;3uig;ewaP}4<l@c!mU?N0A}6h@(g z&0Ea(+`j{6DS9s;NNwQN9Z=<ia_Cnf#Spu^Hm1Z3<DTMvT6g|mGp!ba?^JWcdJ{18 zDTt3t*dsvocBLxL01=qVYls^fAYvv(9$r>=3HP!0g)Fjd!1c<jP=#yNw^^efrc?zz z5=6cB>hGt&2kLHmEte`wLgG^q&Q%MSgRga~!c0oWd-*JfJ$!BLDy$mamtz^N2MZ76 zW=C<Yh!x`R1s!^p=r{Q;inc-X^~6rOIjaHj7)sx`*gg(oP}-`L{vxf6T@&I=%&R z^m$m=#||!yVx6o(-qO?QC>7UVvCRdP4CPgoTPh5!u_8B%%n6qsft#_Ro^*I;=6D^i zB)ZZhvG|^Y9A2Y1n<b#0aaijzG#kT`UF0E9zE>az3S{8g4$a0Za90`>$`^~0t51P? zN`cM_Xg4CHyVAm-e95$Sj&UqMp7W*BS~^z!2hwR3!@fMjb`X|MY<9ZnTqm#(d-#d+ zs9P*hty3Nz8W@0~MSLls7n`yR+^GSBeL$R$F{7x{?dUF$aM4+Brj7Q@WC^q<ZmS|! zjXhDJt7nj1kI!E!tAbO8FCg!M+$HLs3o&a!6rX+iEUm5f7DN)i99Zi;%WAxL+cLhm zRrXPXB;NRnELWCKvUju+9Q=AcRWpD&1N1t7@{!@s`}j`Kw;;u_3*|dLu3U6pA;I*n z7hrh7gdap3wZN4W6<1s{t|JuEA>{X5v+_sKfrFHMI~*4T$VlD_fzBKlg5bm;z+CdS zsc7L1;z+{`2jve&@V(uD2ePWQ!7)I9NHy(afKfLFwgDf^;^l6*hnp?B6qw&z1Ld+v z_#6opaMpBNZlW~P@pcjL3+qILMmaUD;9jIp>r5EB7Os4Ie4VIu9`J*yv#>mG!Qoc# zANd|1Mx+09@0at({xocNcmd7lh<x8d!|B_sREI&88y%E~amg-9Yy<+Y0(Or%<bqXc zH!|M))CFi?0)t<VQzrN-Sgrzksc{T`Cd*Yv^1Z(yfr#Sbcuu26Q=?OiMz62|lMVFX zn}G}o1HDNIKE|_^Yy-Ybo0^wj$C||TPE};B)~_2Ta+dw7yQ2Uab|=>{iW%aXeCMFr z5_LbjyGso_>5kPJLOsd6z$B?Wsm_&n+!pd3PaFN_FPA}Y(<}LiRB`J+dpAMs_Tu6! zf=*=Zr>qGN$DjC6%+RiS%R+T$)r<8wzoJzOwwbI2DQnKwrX|OrK;zs1lOS<EpR{~g z%;%j=G@c-Ql9wL{IxmarSs8rnjBudzc15GD)=uT0ia0)FJ$|g+D)RdtldAOcz*3{C zKlEYZ7w!rxxcOU<;~?HyEzL$LT@r>pHSLPz2mdwR2?c^B1#oi))Kd|3R*T<JY8LEF zy1~vEw5Zho*|8XO=1#Z4UihTZaS?PjGl@gE<PY|JMn8T^B3HZq`R&GLb`y3~5Q5$F zo#$GvL|1PhGztquO+YL9=X<tpKuBDE_w(SkrkXQ!3`#6S>&?Hq9?of8!<&y2cQ~pg zR3a5UhsFF%@n=&@)M<FH9nKqaHtxkZS9#kLGvmZ)nBYBEt1kx()Bu7wwB3h(useSD zqvcQE8=y8x3)!>-?m4zgfOzzfA^2~|m{ctulIq`6YU%>(NC+|#;P$3e2vsf1Rj`Hl z0}cXW;pM=TE5f71u7q8vQx<Vk0;Ij^MT$W-AtayNNz`gvVk*mC5hdKoH$IBLn7q}B zAlrs0%p}{_4k2s}PQ`dxR;o~Rqrf=}5K;WG^XkBR@xjtML!CUK(p%^(Q)PN`lI88+ z#H5kIB)G>L4^8IR_4U8@1fQ}ckWl4fNQHcS4e})j#WrFf=Qxv5Y#ztom>#q2_xV_g zuUR~!**^_%O&*sXK{V$8QtGTn7Z9a^AS*ShEWoA>r8rETCT3Q`?qOVjn+ah-!U@nX z>1@)qLCp>DUapCTbj7kZEz}3`0cA2c{CC%9&*Li>Fd7Ir{X7#!9iY|7nJhY6netq{ zbT=^=lWbL|3U5^<IRlQp#*Rf5bZnfRicpmG)W@^rpXvpCac<~RzSeg2bkzmP_nswl z7IIp5>+r8xb@vLp-uJHV{RnegmL9;q8+vxNO11-M=*>)W8T_7JBp|v5w?HP{-tuPx z>l_#G-zY_+XS}9euFJY!-M`!R{{U(v>$Z1a(Aqe`kKzbmxyp9lYw}QZAJ}dH#29}* z0RI2k)HM!tzQ(Mq!=dHAC|UGV!+d6)3ZyhN@MhfsnaEWFFH|Tn47l8gEz{cmQ0_uP zR`azz01w38t$8=(=?(s$2tdTS(k||3(zgo|g(&yDeLe!A{!iIGc_EYIhKgvYkQ|<a z!^iKArdI*Kb~zK^h83Yu_Bvr5g7!|8??bxMME239I}>^uMk}aJz-s5c8?t-%JfA_a zs?_EOhrEp_d2XptrGg&(Pfcw**QbTsFMqEGHsflv^R*_5ffP1ip(hh@u%f8;Z!5+5 zUptGgj)2K{nl=vm3&OK|OyGTL<>AIFy566qYM5cA4yquB!(`@Kt8o=u@^KAY;w34o z8>!|AR2=VsvIRLC<?AUe`<2VM38!x20rt`6V%JnJrM>jJZ(N1t>c%qP@Jx=<y6S~$ zf1Y`Wu`zzFlT!+3$0LA1z=snE()_^(-m@8lLe{#Ye>AA04bJWB1e187+U0^Jfu^(x zH;ESvUcNT@i$i+d$1Oh+sP=}tGwnpx)w~h!uW>|kF71&4a}SHE-K_yWU9C*GVMtNk z_tyq+86}ZcMfnHW-~5J0YG#J+wU#Wt8Vxr82nLpQNC&d>-kCXCJDADEJsuFDbWl6K z8!vfjGo^@5n&7v+LcI{yxq6%RVZ*kbf8w($Ma`a#(<R+%m`SDpi*9c^p&hPYQTS1# z4h7$SeXKw7!nlX>AmQwHIU7NldOUX4s5T?YUi$;Csybtf*q4-M@1R(>Q&FdZbfNge zgut%!pR;TehtJMho9u~?Hq)RDT<qP=@mbvn?;rd%E_7ypu77{QyUJDjRBe!ceS~3l z-;=QMl&OvdR}`-8Wr?KSUbkY4mqndH@!#^tskH^WWJ<Kt@VE$u(l3tfEzGdIAx@d9 za|<!z9s0BzDZW4^xA^2LBjE94!nvV4sQ)qvQ${F39ZDwcqtVhNqcX_@lplp1@D$qj z6uk9>_WUtOKq7)IfEe2MN^%X8);S2zQxbyZ7>sxO<IDV(z!pAL9}{@%4edD&s391N zkOW84(2nB8*g*UEz*`jSxFzE+oN+;Sp->7in2MH`7!(r)?UM&@G04+95`gZ0LMf!d znY6UppqO%KpH9cBPA>7*`}K$aP9p(%g+sr}fJNzO3qdin&^|lx7T>U6n-h3TfYzB3 zbQcLtmj$oT(cWMO08rTDpzNnm7zPxE358)pVK1PtSLkd6P#6dbBY?sPp)lgS;cQYU zj2sH149cd4!f1lB>7XzMD2xdTV}ZihpfGkQi~|beg2K3=Fdit34+;~2!i1nO5hzRy z3X=%Rmij3DgNP=FiYA8<9g>13hnFTtlqN@pCP#%PM~fy$pC-qgCdZy8$9+8h)qOCO zOa@CZ1ga~8<sAY|4S_a>Ko>%w_aRU+SptfG6fx8_Wm@8fctWoph61ImXNRzj@l0R( zn9O9c-9%w@L_Fl^@EWpIT8xQ^*OE8Nnz=l^b2_57BE?AAbQbiv^2ioR*Fd{d=Yr<I z?eT3#K&m&Yg}ajbu=d?*7eqJ<q9*zB3X&4rUOD+Miei$E+kp&%()U6w+r`-io*(&N zAciX{dUhSs><0(WRlM;bsF7W<w`ke8&NM1El5XmWVwrCso##E7DtrhN1E}sy>{d{e zXlWnw{Y-53;>0A)dhmK8>y8+LV!6AfVCe)7;kP9A!1US$yf+aOe4&hTkPNp#GPyh% z1#Zj`t8;)~gg<5NTdVxqwZo=`j;FoV(&Y{oH2{%8H0*k{b1~11E-r7o=qSHa2Ycac z^gfJ9-#RD#>x@)hBc!JHOIT%-qQ(QqRki!h2+8(QYhicQERs2+$*R@;m`z83`nu%S zW$9pHl=!+BUdzvpY;?=NUvx;zTg}SKMV-mVxO?@4X|1;v>$c7HmedfvPI}U`%7HPQ z`UhiGSn*ZAzwV!J7C*>RozsZ!H4S*0CqJ<u=1O(JQ>AKMgTpm_QJU=gKUZrSnf#Nw znk|b~8gcXP1O4Onv(n3X<PKPP!ylxrrtaDDodR#-83UN&8COp<QvItXtlWEkgHO_m zKd!b)*;cr>crJG^&>EDVo?PK{vSMVCw3#GjHra;3**Tf(cT{n<D-yy#lz-!S&6U|} z>`kaU@TJ&bvK1lZUMn2QYzK+QD^kL8Eoh7vxB8=qUF}}1h<*8A@v#uy<c4l?EsVVr z_hOB}tuCCn757^hczWqkEQ|d?97}CYD+!<eF~}@nU;WyQa{3b$-e+1Y2}ZontazW_ zV@Z6lWWg{E#LIgM+I|XRcot(CG=VFjaQaB#w-8S34`}5N=!7JVb~G_Ko@7EgnpBq> zqv$vJYiB8}*g$Bd6xM{4BHvrFptlm$K~Fz`75U#vqk;2(Kpx7h2xV3ddaDX${tRVS zhcatInYE$JIzeyspv>Q(%m&pTpW%l<KZHQlLZHq)N#VD#AcGJ01d1{Y7KC3#jFU2d z86fO<Y70z-F@BFQ>guj^)w)z&G59GL#oK%}XcQXG9eZz}+o<(=86f}Qw-H3)qteKM zfO}T$qN3*L^?|`8ltB<mA{AyJOZ~b@_3ZRuE2%_Uk+`@}^zNI@l)dKX&4LpKKI|4t zt8>NWWo39ctF?QDtn=krVOXkzhb8;W$aI+=zm$zma`897u+e;gEN7XsGHHgDN8ZNI z$LFXga=4n8y`zRV%!S=9Yd^2%;dj$!K^?r-eGW+6-ce>MrPOXVZrDzVm{H-*s&!oL zS8UMN&@ylw(GF>#`-1f<m%BNVPbJminG|3+>z1_jopb3Xikra4?4+6#`wB)SPPfa} zx~cF(j(mzh^j>{*{msCyY@I=Vzk~xtX`B&-OT*XyX3^o1k}r>B_P_pcg+-4(eM9ps zHG1>{y9yce-n8?nS)V)R0^Sq1z7Wj&=vTOJXvwK8yKFr}du(qTO4vSr`Za&rKvuOr z$z$G$JD&V%RndgkHx_;H8r_&yQ8p$nAel`$e=aU!-s#~Hef0Vb{UW7hpY2VYmU$E0 z*r@hFhOKHD{o58Z7LT>H8;MB|ACK5hF8nUzrhoe`eMAtn!rz_*d^Mz@%4Ilid>&!q ztvz}-u<{rUW{2*6o&0@&V8&{&Hxarc#ABq&!n-Qe+wk(%)4mNbJA^2z2+pC?sx(*j zd1E|?z31wwLItLr0H;Y;Sx<KFN5^%s|AZpNawEQ6Dt>phw)*YqEnYeC(JZ`cR=G@N zG3#mu-+Fx~GW8pV(N635KfczDhwg^qvZ0+1>>ist`BwKlJXlnIO*5fn_Z{M8(c7;B z)9{}2>l}0T=@6Hi5}AdzkK`UL8SfJLywW`^DgG+{_ILo+uZ~CN%ECJrQP6lsxaz^( zvs{;b_pSbG9nffD8d10HT{PoNcn%m>pe&S5j+aoyDZ8seVx5^8X<WkwnGj!Nw9MtX zMNHaW4~74%WtkWCL^)wQQK1aJqRrzyMS$ZAkS&yFAY0ZqY~_8p^=)Re$()eK8riy3 z-!9)EzxKYN|AyS`_~KiJXjW_Ibi;0qxr&6P<nl^IB6l}OXZWn&#N}Tzg<mdgHUcA= zTxwjJ@Pha{35Qz0NL_|bm~>Z+q6&4mexl@6>yR2uW#C<~HL(=Q@KVvH3Z=)swP^64 zf=v~rkhKKDL?(_%c5b2a@gz1Dxw6|yp1<B3m%w?ia`ilS^X6lH764O8Z1h&F9N1BO z7$uSPTOyTQZa#DUHzNeEvu~*$yWhc7)v0T_`s?<vo-{?Nr~k>L%wKK!YAJC4SU`PB z1S5C4g#h!<LkL6h!$TJgv$0wYx7Hz>%9<>1M$cnF7ZPo46|GeWGx{1cJsJ6xl~0IU zHFD(!w&eTpJlTwrvvVYP-tGBNNdsqbL1(z&GxJG(&N#;QcMDYJW9FPbA)P}hZ|i(a z;}(uX9c><>AT^aszi&$4c~~Z0C6ZHGJE6veiv>hh@wu&A$ZR0l(8aiE6IHU}g8FxZ zu_x<A@FKmS6|7kvcIL&NkNO@SaUPwtUct3G!ZakcI;Ji8YECAm|L3ic0PlSAk}|}l z{eT7134$s~f_Z6ZbMay{p?&Ybro^-#UV?N&ph}%$ujfOc;Zook8rln1^QRmMDX)Z8 z&3R9AKU4+qVGTVmcu8Z-Toqt}h9iW@uZBJ-#8eDDKW5-0=a)C+<#YoWo^z8Y52yB- zN*Z!k1$XY9NNY6}(ziIcsmd=%LzOs0c&suL=DY5Q%n8c1Q<M?npt_$8%7@y#PLBP< z*2fQ+FNLsO4Yf-7cwcd{1kZjr+KT0^YJw#$eQc|WL=2&*lhd|quCp|u025>PCnWK^ z``9FbG8Zwu>*SA%)h{`M3cV22S&&ggg-*&mTA$e5jB`XXF-$5_%HLjaoFUlV7lRNl zSA~IFewQ3sppIk(=uSexx&ENy*Gd4q@h*ic>h~quM5UhJbec6kCk~~T$2W2?`&2ty zFPNQOP6TX_HeeKAMK4GTdrUH(WkinC+OM_Zz5Pkt%8b|TFp=-QcNBjgn8w;n)LEky z_WNTPPaAPJ5vz{<<5$xP@p`v~T(8F}Pnxs72(Kwhnnvn1U>M>h=shC(j0X5<z^iF( z1Ns||PY_@gpNwUj`vIqozYbjpYsnZ9(0myCBJ(&!?iS<1B_`&L*dr}9#G~Z?4b0}3 zj}4?Y&z?ZONwFzkKJoi(@hI?ljLWHN;4F?d+249?GG;A9eXF*?Ye1y-60s+G4s7CY zh}?@Y(VwFnTC0JGh?Ii;StHprCHzQ#&n(BoUXAtJ6^SQx<K-FNR{1)6D<W*B-?cf< zirbQJ-EyxPYP1_pj-uzQ7coQFX<mL)cow*>*u(SE$iB;&E|I(fm58+y*7xXQQ_7!Z zQP=IgO~T(#<@N^}b-=xaxzg42y=t>SPcAyk674E*gdU$?fIWX?<94cf@q~fF_>lJ{ zxRBPQ`DW|qw3^$j|At$Zb>p!*rxyE5qr%@W6-vKz3btro6?IEi{#JTdBW|cmF44#) zXwXDoMW!lgc~+x`jLSw@y_<YAm{~t9A<uFgYIgWj)Belsm%AcyxP36uricTDLSYX? z{27@3sZOFe^t_`+4zKbfvU!7`{IZLE&}OExgplM(qQ0S>`+m*g>B|yAmBPAx;XRzX zXq`luQMM^4&qZmSOwd4LF;xJ*-~76M<n9;1v5>7j)i}`=Y4PnWm*N3ZZ}&sQq=b4K zVgy7br!uQ_UqDWYaC4ps`Ix&$8VCb<U-khFf?=!Mi(b7YK0Y=Rr4dh(r}L;&1i{c8 z@N*UdtJuvlSFE!r_-{d?2p|wW#6QdG0<Qr5NoUk1=9A9I#{P~I9;@*Y>ilj8s<A|V zLCZ)8MM5IVuezG?Hnw`Fiff^fuDJTDSl5P};%R<F6o$>*4VBLd+&qiUuJW0@k2b)3 zM9wR|2swDaCr(`Dep+i$BgK~|AL@S_>V6ms(Tfs$XuRrbMa{$wrv7nYhj;5<PI(;^ z$sXvc>SZO3gd<1p-Rm;;gA-e(US!#iOVX*regkPt!N}F5nbW$9Ji$d>*wn67cd6F? z#YZ;9d{I^5^3(FM&Hm|wpBVu)OF0j%1K)q*yWxhjJBA3X1{^S-17sxSMWI4AJN94A zupFn4+4(F93m|J1l5qRT_CmCExb=C2=5LboYmdrAg+Ai}foF{BVN8bHHJ(po)T3W~ zQN|jQ0lU-Dc7kHIp?$7kQz6<9R3M!w=ulxxSn>RcG)8tySoRa!lbjS$S)TteR!}xh z_16~z;_W=2FmcKPB>%4IsxKTs6(ky>vx(wgVE_6LkfFiAe}F1}6AMQYi&at$Q$Z5T zT9Oa{4F*UP1C$UfxiLbdlFbP%Lzf@_D}^m$F)_S8o&LeXnZaR3zBIM?l)aef-1$fD zRb~<gpe5%`_xzba0u^I~+^&%0w=BkJ#vYrOZxXqF$0vXGv}T9`+*F49RYuQpkq|Df zW|WDtC}8hJz+LI$7Y~3eR8E%w;z1;Y`W}#R*l<ENo;|sH?sX7o0Mo;@XBIqPb=v>z zR1<tIK9gs?RV9|e;x}ekaTPeco``1k>m7VVX4Q=RyprsSWH98xjmgE4?RT?a?BB>+ z?egBkwY)mf&*k~Y)49NDUmpChJ*y%jkLHeiQshhP%lYF~h23*-v{g%DjjI1}zn`G_ z0+v=`8~i(@&TuJAt(JhQ46=3><WCtfVy-{C>pk&YJR6Vj*%LC*lLWjNm3a9l@y>(v zkF6U7n#8%ld89O-B5rY9=`0ADWwEO13JGDo=`%DRNMpn$oY4!RTh&hpQzq{p2~^3+ zqw9%7R?9Z)Dr_FQ4U_v80uv;&&!$Ww;(6@ktcre57FC?;=5XRM+li<x$ZQj0v&z~< zI1jpLH^Wg$aYFBR{ed$8251kB={<k7ehpC;2K-6g9o!(WRDgOA38ea>ZcNQhEf#&z zQ;5mtrZ5t+0xY5@3MUt{-;TleVv0bMqAsI!*q~1&a|_W}IPV6FkIC5-9m~dE*x5pg z)3A<6w%$#{^i%8T85I+r0Izpz3q?qiIo%QioX6UbJ!+GH!@_4$QSIqwCW6}eTez`U zpr1id(?1$4Z(Fo!@FVd0WCqv7`E{RTPBbJudvczji4SGhtDF4ttWAeCS@x0Vv+uHx z5T^5FVFl!k*XW$0*)|c^(j`7gZ%MpsLK56Ebd4{n2fKIK##(EE2UF8+b92>^O9Fs{ zWrV^Y9XOfZaa{r?A0R4!7bmz8+jqT;U8hJfwCeZJ@vV<4Eo&QXadUAoK0bi#nlCgz z6rSylW&(zKT3Y6{N%-H(-T*)470#hRiWd^spa-(QPi^{hf0mti)o0L2dq}okM>i%d z&f9bIV1GRDf}M&htJ%c*YU&x+rThKw(j`<J<GHeh)b{HKNTS2aW&V;=xAa}2MdV<H z`Ej(+ZfVl+p5j*W=iW9uJ?!_3f{wF0-;1wRX}C-ayV(;bjnf7;`L=r<o;<b2Mz1R+ zw}HN<Wt7#x)qZ(_rNJ`Kq-8WlS+JBh6uk*mAV1jY_g{odgq**<S{e-ed*aG2ypJLE zoV*2ZSM+}4=;D1+SN)?RxF(Sv7#WD*LF#glI3xHme7+0hKll4C?Hx6tfph&Rjrr9x z63yS)xPQZcaQmx&$qN@%Y5Pi)Zbe(QhR!unnT%o48n5HHlQZ;#yVr~;eV(RjZOA(X z!y>Wo9lwi`VS7r#lNTc;1YaCOtVi%SS(u-eaPY}JWo--O5+=DQoZ$Lljq&_h=v2>` zyBxDnXUA1l{I9oebh)&FxwOT*t^@SVi7>t0AvXf%S!K&D#Gm3GIl3D%x<jFi)sqsz zA2exfSmpx1ej03~kZT7bvr<!pW}?mkf(?^#pl)mK;+$!&vf1ltJrFty$80uLtyVsj z2`y!NfK)I%pjlpBF6da6Gk`_I44_A(OPs!}<67VQsi=epHOcpDAjPVxt1hiveI!z! zDHAD9xVq;D_Oh7OuR!(Rk*$V8hL1Wu*bXSy9$H0v%#dQMv%6gFW3x;y*LrENYR|5G zPu(R<nZMGgjQF0YA=rSiNM#7oUVuQg9PZ(7X>UV3n!iwVT|TId5wRKl*|s9{gljkK zYDw&J(bbQy1?N(kCswfcO!dd?2edaZ#i7J~CGckRF6<V9v_tE7Df9KuziwVbY-0<N zS#Ji9AP^lu-lYuC_yaI~;g^O#lPg5=OnTq{bW5BhUi>qyN!MzZVNm1Vew61f_A$Xy z<lhlQPw;Rx?rYIi_ME&S#u6q`n{C73L!jYK7V~N?-D7iv|M?NyN$kno%;#1Y_w*$< ziTHHk)|e%`ongtFc<ODcy%^3kgJ^Z{uRnBr)0Ud9Sdv>tJBN^DLkkWa;Yg0;QsNFJ z<gfJWs89?O3(7J7LW-uNT%2+OkWP&8-e)tW3U^L!8{+aNdd#s*Ex#1{%G-=bMC&$R z&vl{hMZ!H-oUOYHiPLQP{5`!}V%f%0ef7*A+Ul8Ot8Bs4<-FZf5jGV5rly^E^mODQ zG=osP1B)=m5;CFJHs<toamg`D8qRtj1B^z{yE^E7+{T~5+QYXVo|)5+CZ@y;-80Z= zCdZ_|<)mxK8VcWPGBv07h);>3VB)3|P%xKqrb{91=bHpVU5#Zvu+>IY8_S$C1d#SG zqWfjxC&&2e8_Jy9ybQ1(l0zl6g`2WgD^HoooOk}nWa%G?Uc=kHcGUi!iLpnQ%c?d& z4*n~V6dM-XW3!p*yq0d0GEwufpNN))hy$F|Or+b$AeY$Q<y^!Z)XBH3M*1*F3S`8K z@!G@=3+a9T6AfS_2?NE?kKolqhfDn{_mtX|z*>dRB}8fM0q$!BkUjvHQ{{T4R<#8$ zt^iVYLa#ZW^_r6D`KPeC+D=jN6Fua3t%-=s4+WdlO<s7s%gp184bC*RKNFA8nI&tK z*y>n<jP_5z<d=#Qq`yHnvJYAbEM)Su>r8f+V!samg_B~zsfHLwIP-R%eQZisc3P=( zt|~S*Pg=2MsIRtXBeZ*k@y1dHPKu?rJ;G836ca9J5z@-<y(?-qbJH9K0-bv-7JNSf zy=ig6y8u7hf4hxvC;_hj`hSBDkwhV7)LWdA-d%;dYLe$ovsfoP1}?xh`J^Mr4--?- z4AH5rhY07%sKkNck)gQU8xdB%)z-&Ti)iNnv4+ocX7~3nH$mnryfrJ1PygsY?Oy-T zJ3gUHn{pQm(p!WeBJvMczF(B=T>2^w!LF=JkO8!<J$m0-9#_!6hjM062|da%$ett* zUJ~!p$sVkCY{z*mEeIbd3tM$6X4Xib*NdUGce}(DHbn}i>WDHqfU8d)U{(oFKDQAd ze)kdTwqUgWon90)oqy}l_u<Jg8ZVpvd>cBqe<YJqy7E3@e*Z`q4MbVF2Q35J-qD4& zy~}NQQWb8FHT1!lP&CE{{W0wp?Si%_@srJ_^bHd~lg>A{Nt?3-$4LjJyVk|CE{Hm2 zCg>=jO-Ghe?UejWagagxc5%J`j3}N7v^}5Sr*V+jn4fJQrHOc^=^4c@S}{k$d;jxr zf$-ByH+^Dw;B&{->h^q=+)&>0SQ|*i)oPPVfvM+_hlUYgp=2w30%!$}!kZ|Mo$M3s z{tR<uLe#=5fUIu&wCI!4_5LieBVf3Cv69=j6YzBL6)p#k4N#E3sDR#gNWt@Yo-+bm zRj;9h2S4LMVg<_wy_zva58ckd7uBaZ4^x5$FXL%>uPS6RGfSjJCfjvAHXUM<iH%AN z5qf{b{^{8~wW^ysb<it~xVKFp<MW(epx-H(*{X}P=3XZ)n(yYC`L{{_F%$4h=zgvs z5;nWs;{SsU`E`%xNwazJes_29)iGZJ>D|AU&3}a--x!Kpt%y}V2AE8r(fs}Kq_^#* zq#<T7@pqc)uIKN52NN0MAkW%}6k4A2d_uka8<K<3M)8a2kq@)(+X~pDN+`NcPsHw- zASx>ZdQ!}+@My^RfZ3$PmeMS+CkI1#Hcb}WGd|lp_nCGv*}3g8yc%$*nCEVpM(zDV zW)Tcip^FVKzyi__%$FGOW!cmSH)MMR)UIVjPIMf(<V!a_ScXvpQaSo#|BvsVShg-v zt5$wYt41%olxjxHyXabKL2<Q5z5HL&YK5f@u3MAw=)c(q_nDP{h@xr%Ud;uyo4?iD z=UP?=`8*S8yCn;?7nn6ip?o$%wIws|?@8&7ypOT%ZeFC;7QR(n6mp7}X(?!WPJEL} zRjVa<X`j65s3kOQ!tSyLnab&fPg>$0d^gP>snx@nQT0y8zcQ`<;$i-ac87trIqR}! zulHGkh+7iZ@7bR2(XqC%zY9i$%2q`vbv*0tzYVSR0<Z@+r(U*M8<U%xvjt;Y;{6Y} zFb7yG?^_bVki=av(u<zjf3vf>kdJqca3;`aY33v9_#nKgpb0?YGc%G}BNz>ImhRO9 zJ3bB5e<Ed#f2AN5Tv=E}qyyuJ!UUl(VJJ)#3KNIIB!jZSJ*XL&92BN7J$^!#@B%db z0z~){q#2GEAFlg7AeAO3hbHF_O-?0EP9sfD2TjfZP0j>O&cbJi-6!EX)Izpz{`Ks0 zLi%S6^bn${zmmoC+0jASvGzVm672ou7~OeAozqM{6fIHv^8W11%ojEU*j`z-$Ft7x zYt}QHz~x`U8f!0cy8Y~pB#hSUTZXj@UA%*|7xD=3_S18h%EQtU8uW9QS9@(-GX~R` z6|-27iw*8O5S5V_#yd-7VfEE&ULJibQ20CxQpeKZMSAVJ_{QKCz&^vKLbG-@8h{fi zVAT@6s#2ay40gTuZl8CdBi5h8udwVcgLW4$fZwI8@^}1pW&0|4RR}dxJLuTHX(q4e z!2fz{ym1Xpu#<UHW?fh4c=ay|$KX#(^J%_AsBFodt=9U2JGD%S$j9G~%Y2)3Gv)hw z_3K*~!Q|9U4W|j(x<sw4S3f=NR+d3&?<i^YM>8~ULj-7zFV;#ydi(z56+8{ujtBWU zP&?%lwk3DeLC298oTS2Ju)ibYB$H$5YN@AVSxAQPm?c@e-ebC=qva%mtij<+W;GCl zTmx3=D63I0%EtCG%Hz8~`9lkuhW#?`x8F8I0fQnj&0v*<Vf;4*yZ6$!6YJ&hClO)U z7GpVF`j~cICGh*Er?lzi`3pP|=_i{9-z7@055B)akZjd{5a0WLD3;5vo@fl-qxNhr zGpGXtf3=WJm2>WZib2&8YFDQ62&G4hu6_%GF>aj%=0wAB|45=lnP1q1Pp68?2Gc;O zH9`=6pU8GjqL@ulC@M(}%AFGq3#|Q41XAZx;1Ax#4b#{zOlD~HL@_Iul?#F<FljLD zoZS3AkxDQ|`D03Iu$|vXRP?Q4P8*|8bwM!wp;eBY(a+t<aDa#A59!5?>clS0dT4c3 z4!YliKzaqioP)AmhfYT6;8cWBcgPz&bh>dk?!GMgwhR-j<M;eUS?O<18X%*{2b;3r zUxHPB`Cx_~EDF&1?Jae7F^$oafM<Un&vMdK7JYJU?TGJXY&SnHKlJmJCWbf5S6u4E z?0+@Lc=2!Kp85`h6iq_jT4cI4M)J+%0xrhyMuE$Gz@mBwJtQM6-s{z6Oh5A1*1O$i zbsPV+%V6>9FT=k7&zbMksIK;z@7&V0&zCffY}#ysrYWCPCt1VaR`RUbu5Vuq=GBD0 zd!qL=l5md9Q7WMHahe&rYyX+|>Usg+P>zYqp+;|FBj9G+fQT_U$giVx$n=@0K0<gD z9EFN~JeqUvsdnk#jQlp*V!zOm-C(8K?mM~i(?#haM49{OWMSSZdk|}~eepW^^(&#> zY@W4a^SDsz<f`#)%*>Rucdg5Co*PU+5|y0^)AY_7oZu^*X>ZXfA+-SKm8(c#t*8<? zk(w3dbUh*(EIRQuJ89ECnDme#(^ov0-ox>H5t3odV9_?fjD1f4V?5@Gzxv>q{cecE zSD&@?B?W85qBkdV<b$_k!M|3jB~2#-Tz$G|2$pphqLUbWbG2rBFNh9nj?4Z7-KAs= z-Q|;`0WR<0@j-hAg{_EZ{m;A5oWN2{RX0xH6#i0TIvH|Xi>`}V8Kc%c7;C8zztKI= z)33;_6Xpf3LE-4<t7HiOYS&EQZgR2#|1cT|386s;8r&q$d7lb|{&z<v!3e2OgRv-@ z>A%mn^T=k9dM=Qdhp;7sW?rPUsJfO{!6lRScmv9&YLU@QY4|J-Eo<sY^nnWVEZ_~v z<5nFY3c~?zie|jwj{?{EfPpIT_Nh2LQlGW@+wJ`?!NiOrI}bkV8^m#svTABtP^O&y zxnf&SfdNia+BYRmS?a8srn_q|>#&-rKeOyZ>Uu=xuvszBDC>d!(iP6ium#pD#+s|6 z@%;$O16cmdIniruzLu8RB_kk=QESyIDPh_}*V^nVgQ}+TUL~s7$%EM%u^cxYbZ}^G zY@3>T`(Rk3cp*RY{)FjI9V*qj#ZFfJ%7Iu&$H5@Q5M#67d-srWri=qIo0@)BRkJw6 zT;nq!Z4>2`x==Oz+D0L2(z<+&VP>V2uc!sSTyXu$SL?{fIcDJ`_el+KFFQ50IhbD! z*|L0GlkW7X?(Y4&YOM^MA)C)`M*IJi<{K!7p47bWp4Cr$^oJzeY-Yarg0dyn;~VQ% zdumo?Ij?JLW!9tB`LSDWCpEGli6NBKF(tVCQXtHz(fcZ4qM|%j>IV;(T~jpSj}oaD ziu}TThM_c)&xKwRe3&wV;dMCD1X6~)Bt7J`MIZRx`SRL}m3xj_Go?MV@I#=8l-ctK z5p;u3@sQz3&WAuGV*=^nIJ)5gHe^_C=x0ab9mI+Fhuw~68q!o1KK`DKdnv;#JW)4g z{rH{9B`ksTc;tgjRPm6bwuX7Vs#eOny>`laW)EHnJNFWk4jRHfbc#$5yu2x3<z5o{ zuffnPq{-4O#D_qVV!^b&^VB@V=M56VKh*CS`g`Q%4W*WOeHQvUtz82zJ+x-9L&dn4 zvdpkP8ix1;pf4kf{u+*?<aJb1wlqH~s_v^zf<yY1*!iTLnv8uW#}05C<QauJsW>Id z0{r*@@&};hE&l_Ma0nPtF|zBs#hLWOYkx-mPhsEv&*uC6-=d|ZR?SkPt=gkSz08nW zwP~qU@iJ?xl^Uf+OGjeVtUY1{L5QNHwKr9<HHcAr3nIxkulMH<`2KP|&h<R^eID0O z_jNy>=XuWIHqJ^bF?pKyWZP&UPLMSr91=FIrkN{aY64W43GJ>k4{6zT-`}btb_OVV zv*X-P3SX;lS?`0Y)cW7aT<?Tn)+_BU0%K1X>##Gr5YpuNe$noeyv_zQ;1Dt4#JW|n zGLJ=FDx5rT57)FQ{DI$_w6y0clg&wq;B*)qXU_&7XqNu0<E!DoJk8XJX*gz4<@!7M z%*%1C5!p~?n!u3{FvxBG5Z$P!eH})7yYCULe%*5U$&r%zO}2GwID4ALi|Z#eZ^Wh; zIZ7O4Ml)`4(xkE_4Ud<xibCV-b+kNg(zLQAEye2vXca5p8N1CUmJnaBtF>|W4vEc- zh5<8+poiYPA|Su2=_DY3^84Q1HL|ro*W4J)&eoHvM7f~zJ;5K~+lL|M2K8EjP1m2h zU%TOUArsJl%Ji+j?;wgKh&Q7M2^fI<h&adzrk316dmc2PFl3ogGuu;}U#fbJ`QA|c z$tH&co>9j>k*FFbN`<j-1$|YLXbSja_(|yv$bV2&Hwi^=xRn$aGDPq|Y+AbdX1$eF zUH3j6<g?|kcH75@H*|{me3mPl^AW7R(%he}@Y)pP)Ag}^m&Ik<&obllwqN2s&f1!! ze<W=-@~E45NpYLnr5!y}*MebvSFR01MwF?@Jvm0KS?6f06mxRAZRMQfF{*Ia1^u9c z6DHDnBQNA`3+X&B9^-*+5#%Ij6#gKj9@WTeF27qqZg*Has)=}lV36iWa0m$~{b(Y9 zqS#0wb&*XbkXcfsg2^zMygcup@9e#uJn9tvFJ%l-zMicb?LN8vJUh`R#I<zXef4U2 zK<?v*r6Z}1I^L6x+lLL`RJc6%Att}stG_gKPO;f6?K(9`4>1-??-Is+NI~BMXJP0W zob(^*`L?>az#eqkSPp7d?*%u5`N8Rod1Izj{f-z|Ppz9&aO@ResJ~v|(HcGZq}6s8 z8yXp=waNDlv>A5bQian+QHMz6jeVRX)8<4iusYq{O&s-WjQHb{E##n8C2Eh4eU5JC z)$vR-3!EQ4+X$xzFRJh<gZB}lt1<LJwAzA9G6W_=>Zc~=-I9f&P<{nVW?}bUzV-DZ zuTQUB1O?Br^>tt`RGX{oqs=gOl(mW8pzFNY1KXgOPA`kNPA_Z|JIbulb5JJ-`CvA% zw%hBs`z@4_3v{~VE>Ana8SNg`>GeC83dI==KJrF9m^}*qFkPZ{&ov93lHon0<A^Q? zJeaLVQ=j6xW!pyqIZB*Gz8rj{cK^ZbGi-);v#}$3-JTjwSKc+N+JPbF>vRc9!8J=A z9#XvwhR3M#V?r4f^(y2kgkgTqMwg$4e`C&oLSoXxPGm)qy)&H21cinAC&FF-V$I4= zda8a;3gz_c;~Q8PBezo8U_$UeuC4Ai%EyX5b)Vmrtg!G0SMt<!?K@6_jU;BRj1V)o z<*Rl^f7PEO^7uVt<zNbKe3|xSkX)5oii-_ox!#>rak=CM%pC?z$TUI@O89>lhb!Bo zFdL%YINZc}$5b0eh7P^EyJSjTQh{>>k`X0mo7m#{uBQ!C1f3PvUBe;xRj}qt5fog? zO(aAAlTF!usg=iYYJN1j#oCy3OCoppq9f3C&Ir~>tSCWA`TAvVlUw{xXf0F~9jeyn z1fyVwIplwpDTf%tU7aT-5X|{Z;Qp8UFaj(`z7<1p>%l0#SwD4n<Micx@KsOb)*F67 z<6*fsfe`who*2#^ky<vG$*z^#dF7c=$p{~F@Sfc}gxd3hWH+hFK6QzeFd9!~WE5IS zwvJDtyTu}YoB7b!H{(kSL4GG*=FcC~0{*y|bA=Tsvl^#>R?`iDL@Yom1%K(F-Jk!2 zt#GiWUG`V3sA8q;psyERu$Ot|(c7cZZeXI|%qcy4=OePUkry7Pd2{x3GD%2}UE4=9 zjY0Ek@5Yr7M?OlOA@!93xJEhEE>W852BOWFT|RkV7zEWoBazDDsC^cfA#ZBbtXXPA zrABBZ077jPNP8AAdrJS%DhV1X3XKIMaQwXbp_t)O?>+4rO>wd48~#s{JQEH3Z(N?1 z_o34|E9PfQH0@{O?eTwVsxPKXx17RyFO}6f)n7-$=9;Fxm>b=_G*;&{e{BsaH}3P_ zmYdCmn+?v*w!+OO%){ow!v@drH`IWM_0ZkRq#9{dqxe4~_dn#Tzkx<c$PPn7=b_&B z1Vw(!4W_`HEtGkiNLk6DAyqWKqNpkR>}Bcdgs?$_lEF}#I{sG4+(xg`s|m`W@kni$ zC+!sH1%}!vE8#qEwez1H%GoG|aSW&@a<tjo*z$to8`!^L*_Uo&e4SrTm}t~w(Hkr+ zZJEDmpBC|g1&WNj2@ZSzS(hhlu53w%Q?a6=we$@%`v<9Vsp-n{&zI+>p`dF`3($3s zhh&_SqpOcAS_;Q~0$!&Uo|D!Lh{$Sklx{)9yvP2sFk6;lF7tfo8eyU;oy!Jyu^_gI zZWKWK056i8ody^;hOs6UExBQ)^J;D%n@b()n;}aYLAV;{pvXL)V~upnjh`ns#vdES zjCaiDp#@qgLL<ssv>cudtE_}?sIqw$Z<h)Q2hyC4jryz7OcPt`M5}N{gv8#Z5us{n zKKZiZavsAM|F(Bbx$8j~<9rpUHBUtqM2^_M6tmIlw^9c5qZb{ZxzqkX`;{4ggn3nd z2Ffx@<sgS4*}ww&=D#U6it#IxO)C@s*5%kbWw5IZ4AjSKlV}r4k2cYgi>G@g99;B| z%>Uu#d9vu_Ak27I=AKrtIS(&S|3*)1ah>b|V{ES_mrg_?tMx#8Z;^#1&?mpYy|*v6 z*O5!dM?2oDWbc9O*NyJW2(fUc!RpZokV6YtL_H={HX*-iP?e_Dkd8W|j=j+A-wd|} z$(u>O|K>)a3_EF6_cOz;My&GErOPioE<1Y{@a26$sP64k%g2dw6+S_E8bKb|D>MRH zG{%{um+J*%`xM&hAgU7KF?Mq6J}cotZTO38^>8H39edbEaI5uLGYL3%e`PA5ggVK2 zk(P+tnx=>)%~B%1P*jZkwkftg-P=aGli{mq%I-2Oz&vPr+voU)I=R~%Jv5B({xeH> z-jBwN&iw0z2fuB+#h2O3bdG8vhcfMtRb$qpXR9%9&Z{viuJ~$Tu}(<0jCq$J^v^@j zqRUqhu3HDP|0o6{D_%svy$%=|Z@A4~c!VHgpdU_7qYf;73t%KF1abJD1oJJ5ydjw| zvHQ)Oj8Q6ZCP&(VB&n?vWX>pvD{drAaq2BBMa9q1_UJs=dmkUEXTSv>C6c|qq(Kdn z(@N3l%x=OjT~4fw)T(lt<lbXREjzmFb4G^^0pPytTnt2|ouKVCMj{q$o1GRh-)v6W zZZsO(9T_pBoEGb~sN%H|ehU^-4qHwWHjHrwQS-a$(XK|=Xy07;d##=)4IREIpe*?` z5DuE&9^q9My9-U(%%;}ZI<5;V9Y7ED$8jcoL3wYUvUwx>j!UGUZ9s_Wa{!mvshSQ1 z4U+G*_v+H5e_>d&{s)Lh+h>Pq3%XBKsb`6uX6Z+lDa<{d3I=_Z;o_&RYOIr09|5cx z54WN^>r*ail`w??P+^`q-bYI8SyXV2V`IdzDo}hL#L;WQy9l`CV?nFQV1@m0b`-=x z=Y-YZxC&yW*WzFRv0l^SxUR*)sKw5tYAXMd@i$_5KL0hK@GYP)-c*N%;hKw3R7T=? zRQ@RRidliY5i1vnm0OF0M~j13i{sYEuWzRkXBna&^O^ya>%U%af9$CYP>&bYh!+LL zi)zJ->MY+rsCYN0vizqY(lwV}`ImP{@v@2nxRce{O^7i+)xM+VGfd(AwfAneBo`89 zhxep%&<l4OSwGzpOG$Tzt&#IsNElNREsHh=c2GvCCPb+52j`imVIUh&w|Bogg8NI; znK?|rpC^YudsaKR{XjM5KFrD4%k&Qps@7=0spzy|Bao5)ZQVqKeOS=^3%5kp_`Iu| zoPS<4=y>c&&aybY(9UkvRt>Kc5OY6=U44E>BXig~gGwdak($-d?<);>0WHcp!#<Ep zd(jpDfP1z4+uuTCf9Qc6gl9`;?OvU1JHzKpYPXwzn1dWDY~3LaUe@sWz9yx<kE?s? zxpPg6!%)F=XGqS^j2b=;o<eRnnbw3-h>2!=#?#!Jw8{MI;Zhw1zq+Q4a+=%%go!|) zqFfkA2Q9NjF+Y#IfB%PVH93zkHFj7UK*S-=BF|0+U)_9zr=*@-I3+ut9U_0O0Yzop z=9WJwSw9WmyP#@`@M;^FuKi;$_?+6If%5ctv*wBvV;^NL;!Gj!P;A_;_L9@|ThZF7 z@c`ZcPHA2TLo?A)WV!Q?1(ZRV^N*Ov{yoV~H##QP9RlJ~REp<>jyLTFZPfp6@<=i) zP1ZZ&>YPJp2zRc;=yQnq!CmdDcHlmg8x7L|-UK3)l;>c4i73;Z{KaL!c<m&QkQZrV zjP|yJ`Q}D~K%nHFbFkr^M#`I)l(<d7*IvJnStAWLSEc{H$d`IuT2${xv~&Npqb^B5 z{!6on-&6@?J5k<-4iBwB-&x$9`BY?UATfLIC1OTu)RM(hqV*Y3XdCW}hb!bkf7wU$ z6jrH?8`(mfQ_&F?p58G|`Sts?4%?|cBA!V7s^ZD5fMTOG!1{4pPJ^Oyq_{WCC>1@f zCh6Vu-C`!x9eT8?gg|d!XnGSDhh|_>h=v@4ZawO?1ezs9mu!pmj-43u!~dtw!6{fN zk9Jkw{=RL!JzCSij(zL%5TtUx=x{vMY&fEdrBc_TCP5l?=5Di9p#Q1EIq@lFB1K)z za!)xP$e5L<|1mBHek*S$<$DgWT(9;@>RXx$*-o6{T!$^>{KsD>?k`D7@UDKpiWeR` zW44<Vd0g^ge+HDAezo?%;PF${hcR~djhjAY|Ca|sZ%|3>5rs3q>t~Llx0hq0!datZ zM;%3a8Ki=vQ@*(rMi>9L)SKQH?`5PKou*Z8iM$oZOy(UPYN)|yDf|`tOm#8wV~-gQ z9urSAqRS@adRY<2b4E@LxzF7zCjva7*iZq{TAPudM@s!SsUCgDhTJthswc72Lk&`b zEOMqg%h?gf;Tb}`+!AB8?^#_wV?));YVX|6Qm`zJIsU0*?WC=on?GXq$0`XX3FTbp zfm5Bd3}!o4NzABj4>cfy8pBh#(Pjh?6$^-Yw#i#u1NzhtNbuop1$>deq#?eq(WIr- zS1fd`?nC_8hxmgJ@$CAaIsrv<B5UeOgg(-g2ur!wOXL)i`JMZNx#y*T*u<wSsJlwX zmnDm&#zKa^^3^~VnjZ|s4?!pY9;7Qi4mD1CZY%nON==Q73=Q@6AAg{v|6Qc?^xWSk zN0OH)-dN-&a1w?54k&~^vtj<5`~{f#f_Q1*;IazcOHRV&fgM_EwnMj)Wwc4eS}?yu zuufgWKmf8!EB}gllXkoTrAq}#Uo%z1F>EcB!vY#Fr?ROmq2nVv=Qy134lUWjgUdYG zV_SdgyTf{=Bov!&3{cUxT$FBOjt^XW&70aB*F5ouhUW9NXO}reIqQuuFjob0^;3>l z{oK|PY-Z|K?Vfz)53eCbrQkdIm6b9K2l(6I8jm-TrrmSr<hR*P$E3^F0h>hH14|#A zV4_N68xRo2xlW8Rw-Um!EZ5dY07X+%G?@I?4FUHN*PXu*qvyDn+ZGxuB;w{;YV@6t z>s;%WS+0hbzP9SR{`rdbQ;(<h3m$DwlCrB2P<R*Jnn0N;o>062zhjUkuU2C8^&ir- z&^QUxA}8{?>SBPCK<Vo4NwK4RGFTwz$&fIjq?p%8aHGxlAmhKunG~j=!F7e6S6jbE zsn;UmZ1KkWM3Ix6Bz&79VJ?6yX-*t+7`qX7O;Ix#8vx`JhfGmW;ndmED=-P^{zlaR zyB+y}xH%=?Rxe}lou1Fi_d83xxgCM$=2E{ELl2YtNrfL*8649b7@jog!t0aGZ9k=6 zt#&D6zYsC0A?Mz;^$OBRm4GWzWY&)70ZZjE;+8U1&Rw{NtwK(CI%~|t06H(D_j{I7 z!C=doh*0teRt9Z*`oxcw{s6A3(MwI@sCkwrx|S&1vkb5MvWU!~AU#J{g>+E_bL@Qt zuijAQs*H=P0yrfT8*b-ndB~h;J+w&$WRj@B=Lq%WT-JE7@FuTTl<m-*N3}hI*VgoE zZN9lFRdu589;4|7*tBA^${CW$2yORdbr<z~!KNwRH)vCmYm|e`&zk%{rDMS<#oxZ@ zf!%}KQjhgQwx3{XD7$@w{lkNV;e!#*Z3@o_IqyNODrF@7BvOqO!(oE)Y4BS(PJ^S) z)f%@{Q0VaRsN=nv#^NGEu;@VzX$VqgUrrA;Yr(a#mym*FS4P;DCb!UO^~Bvu+>ie4 zi#p=_x)1$Mxd+(@zmFAsq7zjxs?go5SjnUC0WHoOc3rAtm|Jb@f?<vDjgtL#^L@J= z76`rK^KlK~zbc+EU12zYX(MZPM@3ZGl6%6&l<7y~CS=}%>Ld1V5Bvg&Cv~v|-uWab zY9aJV@Z~Bvjm+uM_q-9#BJajUR*teh4d9_!k#JluV)8S{wLM7n$?R{Qx)N9WTk2?0 zpn-vUBH^ppn+QCe`WGigab7KPcLp#X!yQ;tAQZpt-lup}v#kApC*v!-?b(%5=T%+| zY4VN?nxe$WZKLhPL<YD|BE^W9<WXTiY~-FtfK3~P(Rcst;47u3OnV!e3J@t_%8E+f zEtnka<ej8Pl4;+EQT~^?{+yW``A9YERY)e@E9ZANd}a1`!091!wFok^kTn!RxNyR= z*N~s?*8fx`<LB>6xzr%f1byGT?T{~=*l#+8T#Ur+1D!~DO3^5?3FijI(H}69LuQ;H z94}g1zQD=*gKrRn#pO;t>z*M4o(qp;uVkWB{a<@)F(Z{<F`0B!V&&~+318LC<$8=! zA!m?haPk)=HWFn&_=rS5D+kZ6H1wey#t2?4&;w6@vPA6t|I8Hs3*fEk-@2Ekm@oZ5 DL;O@8 From 692dcc1317d68a19dbc1e568f6691b010f5c7dbb Mon Sep 17 00:00:00 2001 From: Matthew Jones <mat@matburt.net> Date: Thu, 29 Jan 2015 13:04:30 -0500 Subject: [PATCH 08/10] Upgrade Markdown to 2.5.2 --- awx/lib/site-packages/README | 2 +- awx/lib/site-packages/markdown/__init__.py | 128 +++++++--- awx/lib/site-packages/markdown/__main__.py | 56 +++-- awx/lib/site-packages/markdown/__version__.py | 2 +- .../site-packages/markdown/blockprocessors.py | 6 +- .../markdown/extensions/__init__.py | 54 +++- .../site-packages/markdown/extensions/abbr.py | 25 +- .../markdown/extensions/admonition.py | 44 +--- .../markdown/extensions/attr_list.py | 17 +- .../markdown/extensions/codehilite.py | 56 ++--- .../markdown/extensions/def_list.py | 19 +- .../markdown/extensions/extra.py | 37 +-- .../markdown/extensions/fenced_code.py | 87 +------ .../markdown/extensions/footnotes.py | 58 ++--- .../markdown/extensions/headerid.py | 81 +----- .../site-packages/markdown/extensions/meta.py | 41 +--- .../markdown/extensions/nl2br.py | 19 +- .../markdown/extensions/sane_lists.py | 19 +- .../markdown/extensions/smart_strong.py | 23 +- .../markdown/extensions/smarty.py | 230 +++++++++++------- .../markdown/extensions/tables.py | 20 +- .../site-packages/markdown/extensions/toc.py | 149 ++++++------ .../markdown/extensions/wikilinks.py | 93 ++----- .../site-packages/markdown/inlinepatterns.py | 49 ++-- awx/lib/site-packages/markdown/odict.py | 4 +- .../site-packages/markdown/postprocessors.py | 2 +- .../site-packages/markdown/preprocessors.py | 7 +- awx/lib/site-packages/markdown/serializers.py | 18 +- .../site-packages/markdown/treeprocessors.py | 44 ++-- awx/lib/site-packages/markdown/util.py | 22 +- 30 files changed, 663 insertions(+), 749 deletions(-) diff --git a/awx/lib/site-packages/README b/awx/lib/site-packages/README index 089bda6d94..42de7bf67e 100644 --- a/awx/lib/site-packages/README +++ b/awx/lib/site-packages/README @@ -33,7 +33,7 @@ importlib==1.0.3 (importlib/*, needed for Python 2.6 support) iso8601==0.1.10 (iso8601/*) keyring==4.0 (keyring/*, excluded bin/keyring) kombu==3.0.21 (kombu/*) -Markdown==2.4.1 (markdown/*, excluded bin/markdown_py) +Markdown==2.5.2 (markdown/*, excluded bin/markdown_py) mock==1.0.1 (mock.py) ordereddict==1.1 (ordereddict.py, needed for Python 2.6 support) os-diskconfig-python-novaclient-ext==0.1.2 (os_diskconfig_python_novaclient_ext/*) diff --git a/awx/lib/site-packages/markdown/__init__.py b/awx/lib/site-packages/markdown/__init__.py index 4943388ed0..3ea8e05ec7 100644 --- a/awx/lib/site-packages/markdown/__init__.py +++ b/awx/lib/site-packages/markdown/__init__.py @@ -10,7 +10,7 @@ called from the command line. import markdown html = markdown.markdown(your_text_string) -See <http://packages.python.org/Markdown/> for more +See <https://pythonhosted.org/Markdown/> for more information and instructions on how to extend the functionality of Python Markdown. Read that before you try modifying this file. @@ -36,6 +36,8 @@ from .__version__ import version, version_info import codecs import sys import logging +import warnings +import importlib from . import util from .preprocessors import build_preprocessors from .blockprocessors import build_block_parser @@ -48,6 +50,7 @@ from .serializers import to_html_string, to_xhtml_string __all__ = ['Markdown', 'markdown', 'markdownFromFile'] logger = logging.getLogger('MARKDOWN') +logging.captureWarnings(True) class Markdown(object): @@ -96,8 +99,8 @@ class Markdown(object): Note that it is suggested that the more specific formats ("xhtml1" and "html4") be used as "xhtml" or "html" may change in the future if it makes sense at that time. - * safe_mode: Disallow raw html. One of "remove", "replace" or "escape". - * html_replacement_text: Text used when safe_mode is set to "replace". + * safe_mode: Deprecated! Disallow raw html. One of "remove", "replace" or "escape". + * html_replacement_text: Deprecated! Text used when safe_mode is set to "replace". * tab_length: Length of tabs in the source. Default: 4 * enable_attributes: Enable the conversion of attributes. Default: True * smart_emphasis: Treat `_connected_words_` intelligently Default: True @@ -107,14 +110,16 @@ class Markdown(object): # For backward compatibility, loop through old positional args pos = ['extensions', 'extension_configs', 'safe_mode', 'output_format'] - c = 0 - for arg in args: + for c, arg in enumerate(args): if pos[c] not in kwargs: kwargs[pos[c]] = arg - c += 1 - if c == len(pos): + if c+1 == len(pos): #pragma: no cover # ignore any additional args break + if len(args): + warnings.warn('Positional arguments are pending depreacted in Markdown ' + 'and will be deprecated in version 2.6. Use keyword ' + 'arguments only.', PendingDeprecationWarning) # Loop through kwargs and assign defaults for option, default in self.option_defaults.items(): @@ -125,6 +130,18 @@ class Markdown(object): # Disable attributes in safeMode when not explicitly set self.enable_attributes = False + if 'safe_mode' in kwargs: + warnings.warn('"safe_mode" is pending deprecation in Python-Markdown ' + 'and will be deprecated in version 2.6. Use an HTML ' + 'sanitizer (like Bleach http://bleach.readthedocs.org/) ' + 'if you are parsing untrusted markdown text. See the ' + '2.5 release notes for more info', PendingDeprecationWarning) + + if 'html_replacement_text' in kwargs: + warnings.warn('The "html_replacement_text" keyword is pending deprecation ' + 'in Python-Markdown and will be deprecated in version 2.6 ' + 'along with "safe_mode".', PendingDeprecationWarning) + self.registeredExtensions = [] self.docType = "" self.stripTopLevelTags = True @@ -160,9 +177,11 @@ class Markdown(object): """ for ext in extensions: if isinstance(ext, util.string_type): - ext = self.build_extension(ext, configs.get(ext, [])) + ext = self.build_extension(ext, configs.get(ext, {})) if isinstance(ext, Extension): ext.extendMarkdown(self, globals()) + logger.debug('Successfully loaded extension "%s.%s".' + % (ext.__class__.__module__, ext.__class__.__name__)) elif ext is not None: raise TypeError( 'Extension "%s.%s" must be of type: "markdown.Extension"' @@ -170,52 +189,87 @@ class Markdown(object): return self - def build_extension(self, ext_name, configs = []): + def build_extension(self, ext_name, configs): """Build extension by name, then return the module. The extension name may contain arguments as part of the string in the following format: "extname(key1=value1,key2=value2)" """ - - # Parse extensions config params (ignore the order) + configs = dict(configs) + + # Parse extensions config params (ignore the order) pos = ext_name.find("(") # find the first "(" if pos > 0: ext_args = ext_name[pos+1:-1] ext_name = ext_name[:pos] pairs = [x.split("=") for x in ext_args.split(",")] configs.update([(x.strip(), y.strip()) for (x, y) in pairs]) + warnings.warn('Setting configs in the Named Extension string is pending deprecation. ' + 'It is recommended that you pass an instance of the extension class to ' + 'Markdown or use the "extension_configs" keyword. The current behavior ' + 'will be deprecated in version 2.6 and raise an error in version 2.7. ' + 'See the Release Notes for Python-Markdown version 2.5 for more info.', + PendingDeprecationWarning) - # Setup the module name - module_name = ext_name - if '.' not in ext_name: - module_name = '.'.join(['markdown.extensions', ext_name]) + # Get class name (if provided): `path.to.module:ClassName` + ext_name, class_name = ext_name.split(':', 1) if ':' in ext_name else (ext_name, '') # Try loading the extension first from one place, then another - try: # New style (markdown.extensions.<extension>) - module = __import__(module_name, {}, {}, [module_name.rpartition('.')[0]]) + try: + # Assume string uses dot syntax (`path.to.some.module`) + module = importlib.import_module(ext_name) + logger.debug('Successfuly imported extension module "%s".' % ext_name) + # For backward compat (until deprecation) check that this is an extension + if '.' not in ext_name and not (hasattr(module, 'extendMarkdown') or (class_name and hasattr(module, class_name))): + # We have a name conflict (eg: extensions=['tables'] and PyTables is installed) + raise ImportError except ImportError: - module_name_old_style = '_'.join(['mdx', ext_name]) - try: # Old style (mdx_<extension>) - module = __import__(module_name_old_style) - except ImportError as e: - message = "Failed loading extension '%s' from '%s' or '%s'" \ - % (ext_name, module_name, module_name_old_style) + # Preppend `markdown.extensions.` to name + module_name = '.'.join(['markdown.extensions', ext_name]) + try: + module = importlib.import_module(module_name) + logger.debug('Successfuly imported extension module "%s".' % module_name) + warnings.warn('Using short names for Markdown\'s builtin extensions is pending deprecation. ' + 'Use the full path to the extension with Python\'s dot notation ' + '(eg: "%s" instead of "%s"). The current behavior will be deprecated in ' + 'version 2.6 and raise an error in version 2.7. See the Release Notes for ' + 'Python-Markdown version 2.5 for more info.' % (module_name, ext_name), + PendingDeprecationWarning) + except ImportError: + # Preppend `mdx_` to name + module_name_old_style = '_'.join(['mdx', ext_name]) + try: + module = importlib.import_module(module_name_old_style) + logger.debug('Successfuly imported extension module "%s".' % module_name_old_style) + warnings.warn('Markdown\'s behavuor of appending "mdx_" to an extension name ' + 'is pending deprecation. Use the full path to the extension with ' + 'Python\'s dot notation (eg: "%s" instead of "%s"). The ' + 'current behavior will be deprecated in version 2.6 and raise an ' + 'error in version 2.7. See the Release Notes for Python-Markdown ' + 'version 2.5 for more info.' % (module_name_old_style, ext_name), + PendingDeprecationWarning) + except ImportError as e: + message = "Failed loading extension '%s' from '%s', '%s' or '%s'" \ + % (ext_name, ext_name, module_name, module_name_old_style) + e.args = (message,) + e.args[1:] + raise + + if class_name: + # Load given class name from module. + return getattr(module, class_name)(**configs) + else: + # Expect makeExtension() function to return a class. + try: + return module.makeExtension(**configs) + except AttributeError as e: + message = e.args[0] + message = "Failed to initiate extension " \ + "'%s': %s" % (ext_name, message) e.args = (message,) + e.args[1:] raise - # If the module is loaded successfully, we expect it to define a - # function called makeExtension() - try: - return module.makeExtension(configs.items()) - except AttributeError as e: - message = e.args[0] - message = "Failed to initiate extension " \ - "'%s': %s" % (ext_name, message) - e.args = (message,) + e.args[1:] - raise - def registerExtension(self, extension): """ This gets called by the extension """ self.registeredExtensions.append(extension) @@ -303,7 +357,7 @@ class Markdown(object): start = output.index('<%s>'%self.doc_tag)+len(self.doc_tag)+2 end = output.rindex('</%s>'%self.doc_tag) output = output[start:end].strip() - except ValueError: + except ValueError: #pragma: no cover if output.strip().endswith('<%s />'%self.doc_tag): # We have an empty document output = '' @@ -434,6 +488,10 @@ def markdownFromFile(*args, **kwargs): c += 1 if c == len(pos): break + if len(args): + warnings.warn('Positional arguments are pending depreacted in Markdown ' + 'and will be deprecated in version 2.6. Use keyword ' + 'arguments only.', PendingDeprecationWarning) md = Markdown(**kwargs) md.convertFile(kwargs.get('input', None), diff --git a/awx/lib/site-packages/markdown/__main__.py b/awx/lib/site-packages/markdown/__main__.py index 8ee8c8222e..d085540bce 100644 --- a/awx/lib/site-packages/markdown/__main__.py +++ b/awx/lib/site-packages/markdown/__main__.py @@ -7,20 +7,25 @@ COMMAND-LINE SPECIFIC STUFF import markdown import sys import optparse +import codecs +try: + import yaml +except ImportError: #pragma: no cover + import json as yaml import logging from logging import DEBUG, INFO, CRITICAL logger = logging.getLogger('MARKDOWN') -def parse_options(): +def parse_options(args=None, values=None): """ Define and parse `optparse` options for command-line usage. """ usage = """%prog [options] [INPUTFILE] (STDIN is assumed if no INPUTFILE is given)""" desc = "A Python implementation of John Gruber's Markdown. " \ - "http://packages.python.org/Markdown/" + "https://pythonhosted.org/Markdown/" ver = "%%prog %s" % markdown.version parser = optparse.OptionParser(usage=usage, description=desc, version=ver) @@ -29,28 +34,36 @@ def parse_options(): metavar="OUTPUT_FILE") parser.add_option("-e", "--encoding", dest="encoding", help="Encoding for input and output files.",) + parser.add_option("-s", "--safe", dest="safe", default=False, + metavar="SAFE_MODE", + help="Deprecated! 'replace', 'remove' or 'escape' HTML tags in input") + parser.add_option("-o", "--output_format", dest="output_format", + default='xhtml1', metavar="OUTPUT_FORMAT", + help="'xhtml1' (default), 'html4' or 'html5'.") + parser.add_option("-n", "--no_lazy_ol", dest="lazy_ol", + action='store_false', default=True, + help="Observe number of first item of ordered lists.") + parser.add_option("-x", "--extension", action="append", dest="extensions", + help = "Load extension EXTENSION.", metavar="EXTENSION") + parser.add_option("-c", "--extension_configs", dest="configfile", default=None, + help="Read extension configurations from CONFIG_FILE. " + "CONFIG_FILE must be of JSON or YAML format. YAML format requires " + "that a python YAML library be installed. The parsed JSON or YAML " + "must result in a python dictionary which would be accepted by the " + "'extension_configs' keyword on the markdown.Markdown class. " + "The extensions must also be loaded with the `--extension` option.", + metavar="CONFIG_FILE") parser.add_option("-q", "--quiet", default = CRITICAL, action="store_const", const=CRITICAL+10, dest="verbose", help="Suppress all warnings.") parser.add_option("-v", "--verbose", action="store_const", const=INFO, dest="verbose", help="Print all warnings.") - parser.add_option("-s", "--safe", dest="safe", default=False, - metavar="SAFE_MODE", - help="'replace', 'remove' or 'escape' HTML tags in input") - parser.add_option("-o", "--output_format", dest="output_format", - default='xhtml1', metavar="OUTPUT_FORMAT", - help="'xhtml1' (default), 'html4' or 'html5'.") parser.add_option("--noisy", action="store_const", const=DEBUG, dest="verbose", help="Print debug messages.") - parser.add_option("-x", "--extension", action="append", dest="extensions", - help = "Load extension EXTENSION.", metavar="EXTENSION") - parser.add_option("-n", "--no_lazy_ol", dest="lazy_ol", - action='store_false', default=True, - help="Observe number of first item of ordered lists.") - (options, args) = parser.parse_args() + (options, args) = parser.parse_args(args, values) if len(args) == 0: input_file = None @@ -60,15 +73,26 @@ def parse_options(): if not options.extensions: options.extensions = [] + extension_configs = {} + if options.configfile: + with codecs.open(options.configfile, mode="r", encoding=options.encoding) as fp: + try: + extension_configs = yaml.load(fp) + except Exception as e: + message = "Failed parsing extension config file: %s" % options.configfile + e.args = (message,) + e.args[1:] + raise + return {'input': input_file, 'output': options.filename, 'safe_mode': options.safe, 'extensions': options.extensions, + 'extension_configs': extension_configs, 'encoding': options.encoding, 'output_format': options.output_format, 'lazy_ol': options.lazy_ol}, options.verbose -def run(): +def run(): #pragma: no cover """Run Markdown from the command line.""" # Parse options and adjust logging level if necessary @@ -80,7 +104,7 @@ def run(): # Run markdown.markdownFromFile(**options) -if __name__ == '__main__': +if __name__ == '__main__': #pragma: no cover # Support running module as a commandline command. # Python 2.5 & 2.6 do: `python -m markdown.__main__ [options] [args]`. # Python 2.7 & 3.x do: `python -m markdown [options] [args]`. diff --git a/awx/lib/site-packages/markdown/__version__.py b/awx/lib/site-packages/markdown/__version__.py index 2132ce6631..397dfb3491 100644 --- a/awx/lib/site-packages/markdown/__version__.py +++ b/awx/lib/site-packages/markdown/__version__.py @@ -5,7 +5,7 @@ # (major, minor, micro, alpha/beta/rc/final, #) # (1, 1, 2, 'alpha', 0) => "1.1.2.dev" # (1, 2, 0, 'beta', 2) => "1.2b2" -version_info = (2, 4, 1, 'final', 0) +version_info = (2, 5, 2, 'final', 0) def _get_version(): " Returns a PEP 386-compliant version number from version_info. " diff --git a/awx/lib/site-packages/markdown/blockprocessors.py b/awx/lib/site-packages/markdown/blockprocessors.py index 147ff0ff9a..08fbcf86b3 100644 --- a/awx/lib/site-packages/markdown/blockprocessors.py +++ b/awx/lib/site-packages/markdown/blockprocessors.py @@ -99,7 +99,7 @@ class BlockProcessor: * ``block``: A block of text from the source which has been split at blank lines. """ - pass + pass #pragma: no cover def run(self, parent, blocks): """ Run processor. Must be overridden by subclasses. @@ -123,7 +123,7 @@ class BlockProcessor: * ``parent``: A etree element which is the parent of the current block. * ``blocks``: A list of all remaining blocks of the document. """ - pass + pass #pragma: no cover class ListIndentProcessor(BlockProcessor): @@ -433,7 +433,7 @@ class HashHeaderProcessor(BlockProcessor): if after: # Insert remaining lines as first block for future parsing. blocks.insert(0, after) - else: + else: #pragma: no cover # This should never happen, but just in case... logger.warn("We've got a problem header: %r" % block) diff --git a/awx/lib/site-packages/markdown/extensions/__init__.py b/awx/lib/site-packages/markdown/extensions/__init__.py index 184c4d1b1d..03b2a4cf32 100644 --- a/awx/lib/site-packages/markdown/extensions/__init__.py +++ b/awx/lib/site-packages/markdown/extensions/__init__.py @@ -4,17 +4,45 @@ Extensions """ from __future__ import unicode_literals +from ..util import parseBoolValue +import warnings class Extension(object): """ Base class for extensions to subclass. """ - def __init__(self, configs = {}): - """Create an instance of an Extention. + + # Default config -- to be overriden by a subclass + # Must be of the following format: + # { + # 'key': ['value', 'description'] + # } + # Note that Extension.setConfig will raise a KeyError + # if a default is not set here. + config = {} + + def __init__(self, *args, **kwargs): + """ Initiate Extension and set up configs. """ - Keyword arguments: - - * configs: A dict of configuration setting used by an Extension. - """ - self.config = configs + # check for configs arg for backward compat. + # (there only ever used to be one so we use arg[0]) + if len(args): + self.setConfigs(args[0]) + warnings.warn('Extension classes accepting positional args is pending Deprecation. ' + 'Each setting should be passed into the Class as a keyword. Positional ' + 'args will be deprecated in version 2.6 and raise an error in version ' + '2.7. See the Release Notes for Python-Markdown version 2.5 for more info.', + PendingDeprecationWarning) + # check for configs kwarg for backward compat. + if 'configs' in kwargs.keys(): + self.setConfigs(kwargs.pop('configs', {})) + warnings.warn('Extension classes accepting a dict on the single keyword "config" is ' + 'pending Deprecation. Each setting should be passed into the Class as ' + 'a keyword directly. The "config" keyword will be deprecated in version ' + '2.6 and raise an error in version 2.7. See the Release Notes for ' + 'Python-Markdown version 2.5 for more info.', + PendingDeprecationWarning) + # finally, use kwargs + self.setConfigs(kwargs) + def getConfig(self, key, default=''): """ Return a setting for the given key or an empty string. """ @@ -33,8 +61,20 @@ class Extension(object): def setConfig(self, key, value): """ Set a config setting for `key` with the given `value`. """ + if isinstance(self.config[key][0], bool): + value = parseBoolValue(value) + if self.config[key][0] is None: + value = parseBoolValue(value, preserve_none=True) self.config[key][0] = value + def setConfigs(self, items): + """ Set multiple config settings given a dict or list of tuples. """ + if hasattr(items, 'items'): + # it's a dict + items = items.items() + for key, value in items: + self.setConfig(key, value) + def extendMarkdown(self, md, md_globals): """ Add the various proccesors and patterns to the Markdown Instance. diff --git a/awx/lib/site-packages/markdown/extensions/abbr.py b/awx/lib/site-packages/markdown/extensions/abbr.py index 3f8a443585..58dd0aaad1 100644 --- a/awx/lib/site-packages/markdown/extensions/abbr.py +++ b/awx/lib/site-packages/markdown/extensions/abbr.py @@ -4,22 +4,15 @@ Abbreviation Extension for Python-Markdown This extension adds abbreviation handling to Python-Markdown. -Simple Usage: +See <https://pythonhosted.org/Markdown/extensions/abbreviations.html> +for documentation. - >>> import markdown - >>> text = """ - ... Some text with an ABBR and a REF. Ignore REFERENCE and ref. - ... - ... *[ABBR]: Abbreviation - ... *[REF]: Abbreviation Reference - ... """ - >>> print markdown.markdown(text, ['abbr']) - <p>Some text with an <abbr title="Abbreviation">ABBR</abbr> and a <abbr title="Abbreviation Reference">REF</abbr>. Ignore REFERENCE and ref.</p> +Oringinal code Copyright 2007-2008 [Waylan Limberg](http://achinghead.com/) and + [Seemant Kulleen](http://www.kulleen.org/) -Copyright 2007-2008 -* [Waylan Limberg](http://achinghead.com/) -* [Seemant Kulleen](http://www.kulleen.org/) - +All changes Copyright 2008-2014 The Python Markdown Project + +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) ''' @@ -92,5 +85,5 @@ class AbbrPattern(Pattern): abbr.set('title', self.title) return abbr -def makeExtension(configs=None): - return AbbrExtension(configs=configs) +def makeExtension(*args, **kwargs): + return AbbrExtension(*args, **kwargs) diff --git a/awx/lib/site-packages/markdown/extensions/admonition.py b/awx/lib/site-packages/markdown/extensions/admonition.py index 9a45b9249c..189f2c2dd9 100644 --- a/awx/lib/site-packages/markdown/extensions/admonition.py +++ b/awx/lib/site-packages/markdown/extensions/admonition.py @@ -4,39 +4,16 @@ Admonition extension for Python-Markdown Adds rST-style admonitions. Inspired by [rST][] feature with the same name. -The syntax is (followed by an indented block with the contents): - !!! [type] [optional explicit title] - -Where `type` is used as a CSS class name of the div. If not present, `title` -defaults to the capitalized `type`, so "note" -> "Note". - -rST suggests the following `types`, but you're free to use whatever you want: - attention, caution, danger, error, hint, important, note, tip, warning - - -A simple example: - !!! note - This is the first line inside the box. - -Outputs: - <div class="admonition note"> - <p class="admonition-title">Note</p> - <p>This is the first line inside the box</p> - </div> - -You can also specify the title and CSS class of the admonition: - !!! custom "Did you know?" - Another line here. - -Outputs: - <div class="admonition custom"> - <p class="admonition-title">Did you know?</p> - <p>Another line here.</p> - </div> - [rST]: http://docutils.sourceforge.net/docs/ref/rst/directives.html#specific-admonitions -By [Tiago Serafim](http://www.tiagoserafim.com/). +See <https://pythonhosted.org/Markdown/extensions/admonition.html> +for documentation. + +Original code Copyright [Tiago Serafim](http://www.tiagoserafim.com/). + +All changes Copyright The Python Markdown Project + +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) """ @@ -114,5 +91,6 @@ class AdmonitionProcessor(BlockProcessor): return klass, title -def makeExtension(configs={}): - return AdmonitionExtension(configs=configs) +def makeExtension(*args, **kwargs): + return AdmonitionExtension(*args, **kwargs) + diff --git a/awx/lib/site-packages/markdown/extensions/attr_list.py b/awx/lib/site-packages/markdown/extensions/attr_list.py index 8b65f5661d..59da3b42de 100644 --- a/awx/lib/site-packages/markdown/extensions/attr_list.py +++ b/awx/lib/site-packages/markdown/extensions/attr_list.py @@ -6,15 +6,14 @@ Adds attribute list syntax. Inspired by [maruku](http://maruku.rubyforge.org/proposal.html#attribute_lists)'s feature of the same name. -Copyright 2011 [Waylan Limberg](http://achinghead.com/). +See <https://pythonhosted.org/Markdown/extensions/attr_list.html> +for documentation. -Contact: markdown@freewisdom.org +Original code Copyright 2011 [Waylan Limberg](http://achinghead.com/). -License: BSD (see ../LICENSE.md for details) +All changes Copyright 2011-2014 The Python Markdown Project -Dependencies: -* [Python 2.4+](http://python.org) -* [Markdown 2.1+](http://packages.python.org/Markdown/) +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) """ @@ -27,7 +26,7 @@ import re try: Scanner = re.Scanner -except AttributeError: +except AttributeError: #pragma: no cover # must be on Python 2.4 from sre import Scanner @@ -164,5 +163,5 @@ class AttrListExtension(Extension): md.treeprocessors.add('attr_list', AttrListTreeprocessor(md), '>prettify') -def makeExtension(configs={}): - return AttrListExtension(configs=configs) +def makeExtension(*args, **kwargs): + return AttrListExtension(*args, **kwargs) diff --git a/awx/lib/site-packages/markdown/extensions/codehilite.py b/awx/lib/site-packages/markdown/extensions/codehilite.py index 428bd0cb2b..0c3df7e92f 100644 --- a/awx/lib/site-packages/markdown/extensions/codehilite.py +++ b/awx/lib/site-packages/markdown/extensions/codehilite.py @@ -4,17 +4,14 @@ CodeHilite Extension for Python-Markdown Adds code/syntax highlighting to standard Python-Markdown code blocks. -Copyright 2006-2008 [Waylan Limberg](http://achinghead.com/). +See <https://pythonhosted.org/Markdown/extensions/code_hilite.html> +for documentation. -Project website: <http://packages.python.org/Markdown/extensions/code_hilite.html> -Contact: markdown@freewisdom.org +Original code Copyright 2006-2008 [Waylan Limberg](http://achinghead.com/). -License: BSD (see ../LICENSE.md for details) +All changes Copyright 2008-2014 The Python Markdown Project -Dependencies: -* [Python 2.3+](http://python.org/) -* [Markdown 2.0+](http://packages.python.org/Markdown/) -* [Pygments](http://pygments.org/) +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) """ @@ -25,8 +22,8 @@ from ..treeprocessors import Treeprocessor import warnings try: from pygments import highlight - from pygments.lexers import get_lexer_by_name, guess_lexer, TextLexer - from pygments.formatters import HtmlFormatter + from pygments.lexers import get_lexer_by_name, guess_lexer + from pygments.formatters import get_formatter_by_name pygments = True except ImportError: pygments = False @@ -112,14 +109,15 @@ class CodeHilite(object): if self.guess_lang: lexer = guess_lexer(self.src) else: - lexer = TextLexer() + lexer = get_lexer_by_name('text') except ValueError: - lexer = TextLexer() - formatter = HtmlFormatter(linenos=self.linenums, - cssclass=self.css_class, - style=self.style, - noclasses=self.noclasses, - hl_lines=self.hl_lines) + lexer = get_lexer_by_name('text') + formatter = get_formatter_by_name('html', + linenos=self.linenums, + cssclass=self.css_class, + style=self.style, + noclasses=self.noclasses, + hl_lines=self.hl_lines) return highlight(self.src, lexer, formatter) else: # just escape and build markup usable by JS highlighting libs @@ -225,7 +223,7 @@ class HiliteTreeprocessor(Treeprocessor): class CodeHiliteExtension(Extension): """ Add source code hilighting to markdown codeblocks. """ - def __init__(self, configs): + def __init__(self, *args, **kwargs): # define default configs self.config = { 'linenums': [None, "Use lines numbers. True=yes, False=no, None=auto"], @@ -237,22 +235,7 @@ class CodeHiliteExtension(Extension): 'noclasses': [False, 'Use inline styles instead of CSS classes - Default false'] } - # Override defaults with user settings - for key, value in configs: - # convert strings to booleans - if value == 'True': value = True - if value == 'False': value = False - if value == 'None': value = None - - if key == 'force_linenos': - warnings.warn('The "force_linenos" config setting' - ' to the CodeHilite extension is deprecrecated.' - ' Use "linenums" instead.', DeprecationWarning) - if value: - # Carry 'force_linenos' over to new 'linenos'. - self.setConfig('linenums', True) - - self.setConfig(key, value) + super(CodeHiliteExtension, self).__init__(*args, **kwargs) def extendMarkdown(self, md, md_globals): """ Add HilitePostprocessor to Markdown instance. """ @@ -263,6 +246,5 @@ class CodeHiliteExtension(Extension): md.registerExtension(self) -def makeExtension(configs={}): - return CodeHiliteExtension(configs=configs) - +def makeExtension(*args, **kwargs): + return CodeHiliteExtension(*args, **kwargs) diff --git a/awx/lib/site-packages/markdown/extensions/def_list.py b/awx/lib/site-packages/markdown/extensions/def_list.py index df639df931..22e2491a66 100644 --- a/awx/lib/site-packages/markdown/extensions/def_list.py +++ b/awx/lib/site-packages/markdown/extensions/def_list.py @@ -2,19 +2,16 @@ Definition List Extension for Python-Markdown ============================================= -Added parsing of Definition Lists to Python-Markdown. +Adds parsing of Definition Lists to Python-Markdown. -A simple example: +See <https://pythonhosted.org/Markdown/extensions/definition_lists.html> +for documentation. - Apple - : Pomaceous fruit of plants of the genus Malus in - the family Rosaceae. - : An american computer company. +Original code Copyright 2008 [Waylan Limberg](http://achinghead.com) - Orange - : The fruit of an evergreen tree of the genus Citrus. +All changes Copyright 2008-2014 The Python Markdown Project -Copyright 2008 - [Waylan Limberg](http://achinghead.com) +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) """ @@ -113,6 +110,6 @@ class DefListExtension(Extension): '>ulist') -def makeExtension(configs={}): - return DefListExtension(configs=configs) +def makeExtension(*args, **kwargs): + return DefListExtension(*args, **kwargs) diff --git a/awx/lib/site-packages/markdown/extensions/extra.py b/awx/lib/site-packages/markdown/extensions/extra.py index 8986ba683f..4044a874e4 100644 --- a/awx/lib/site-packages/markdown/extensions/extra.py +++ b/awx/lib/site-packages/markdown/extensions/extra.py @@ -11,10 +11,6 @@ convenience so that only one extension needs to be listed when initiating Markdown. See the documentation for each individual extension for specifics about that extension. -In the event that one or more of the supported extensions are not -available for import, Markdown will issue a warning and simply continue -without that extension. - There may be additional extensions that are distributed with Python-Markdown that are not included here in Extra. Those extensions are not part of PHP Markdown Extra, and therefore, not part of @@ -24,6 +20,13 @@ under a differant name. You could also edit the `extensions` global variable defined below, but be aware that such changes may be lost when you upgrade to any future version of Python-Markdown. +See <https://pythonhosted.org/Markdown/extensions/extra.html> +for documentation. + +Copyright The Python Markdown Project + +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) + """ from __future__ import absolute_import @@ -33,19 +36,25 @@ from ..blockprocessors import BlockProcessor from .. import util import re -extensions = ['smart_strong', - 'fenced_code', - 'footnotes', - 'attr_list', - 'def_list', - 'tables', - 'abbr', - ] +extensions = [ + 'markdown.extensions.smart_strong', + 'markdown.extensions.fenced_code', + 'markdown.extensions.footnotes', + 'markdown.extensions.attr_list', + 'markdown.extensions.def_list', + 'markdown.extensions.tables', + 'markdown.extensions.abbr' +] class ExtraExtension(Extension): """ Add various extensions to Markdown class.""" + def __init__(self, *args, **kwargs): + """ config is just a dumb holder which gets passed to actual ext later. """ + self.config = kwargs.pop('configs', {}) + self.config.update(kwargs) + def extendMarkdown(self, md, md_globals): """ Register extension instances. """ md.registerExtensions(extensions, self.config) @@ -60,8 +69,8 @@ class ExtraExtension(Extension): r'^(p|h[1-6]|li|dd|dt|td|th|legend|address)$', re.IGNORECASE) -def makeExtension(configs={}): - return ExtraExtension(configs=dict(configs)) +def makeExtension(*args, **kwargs): + return ExtraExtension(*args, **kwargs) class MarkdownInHtmlProcessor(BlockProcessor): diff --git a/awx/lib/site-packages/markdown/extensions/fenced_code.py b/awx/lib/site-packages/markdown/extensions/fenced_code.py index d6e043c99b..2aacca639b 100644 --- a/awx/lib/site-packages/markdown/extensions/fenced_code.py +++ b/awx/lib/site-packages/markdown/extensions/fenced_code.py @@ -4,87 +4,15 @@ Fenced Code Extension for Python Markdown This extension adds Fenced Code Blocks to Python-Markdown. - >>> import markdown - >>> text = ''' - ... A paragraph before a fenced code block: - ... - ... ~~~ - ... Fenced code block - ... ~~~ - ... ''' - >>> html = markdown.markdown(text, extensions=['fenced_code']) - >>> print html - <p>A paragraph before a fenced code block:</p> - <pre><code>Fenced code block - </code></pre> +See <https://pythonhosted.org/Markdown/extensions/fenced_code_blocks.html> +for documentation. -Works with safe_mode also (we check this because we are using the HtmlStash): +Original code Copyright 2007-2008 [Waylan Limberg](http://achinghead.com/). - >>> print markdown.markdown(text, extensions=['fenced_code'], safe_mode='replace') - <p>A paragraph before a fenced code block:</p> - <pre><code>Fenced code block - </code></pre> -Include tilde's in a code block and wrap with blank lines: - - >>> text = ''' - ... ~~~~~~~~ - ... - ... ~~~~ - ... ~~~~~~~~''' - >>> print markdown.markdown(text, extensions=['fenced_code']) - <pre><code> - ~~~~ - </code></pre> - -Language tags: - - >>> text = ''' - ... ~~~~{.python} - ... # Some python code - ... ~~~~''' - >>> print markdown.markdown(text, extensions=['fenced_code']) - <pre><code class="python"># Some python code - </code></pre> - -Optionally backticks instead of tildes as per how github's code block markdown is identified: - - >>> text = ''' - ... ````` - ... # Arbitrary code - ... ~~~~~ # these tildes will not close the block - ... `````''' - >>> print markdown.markdown(text, extensions=['fenced_code']) - <pre><code># Arbitrary code - ~~~~~ # these tildes will not close the block - </code></pre> - -If the codehighlite extension and Pygments are installed, lines can be highlighted: - - >>> text = ''' - ... ```hl_lines="1 3" - ... line 1 - ... line 2 - ... line 3 - ... ```''' - >>> print markdown.markdown(text, extensions=['codehilite', 'fenced_code']) - <pre><code><span class="hilight">line 1</span> - line 2 - <span class="hilight">line 3</span> - </code></pre> - -Copyright 2007-2008 [Waylan Limberg](http://achinghead.com/). - -Project website: <http://packages.python.org/Markdown/extensions/fenced_code_blocks.html> -Contact: markdown@freewisdom.org - -License: BSD (see ../docs/LICENSE for details) - -Dependencies: -* [Python 2.4+](http://python.org) -* [Markdown 2.0+](http://packages.python.org/Markdown/) -* [Pygments (optional)](http://pygments.org) +All changes Copyright 2008-2014 The Python Markdown Project +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) """ from __future__ import absolute_import @@ -175,5 +103,6 @@ class FencedBlockPreprocessor(Preprocessor): return txt -def makeExtension(configs=None): - return FencedCodeExtension(configs=configs) +def makeExtension(*args, **kwargs): + return FencedCodeExtension(*args, **kwargs) + diff --git a/awx/lib/site-packages/markdown/extensions/footnotes.py b/awx/lib/site-packages/markdown/extensions/footnotes.py index 9f93ad1b5d..a59de970b4 100644 --- a/awx/lib/site-packages/markdown/extensions/footnotes.py +++ b/awx/lib/site-packages/markdown/extensions/footnotes.py @@ -1,25 +1,15 @@ """ -========================= FOOTNOTES ================================= +Footnotes Extension for Python-Markdown +======================================= -This section adds footnote handling to markdown. It can be used as -an example for extending python-markdown with relatively complex -functionality. While in this case the extension is included inside -the module itself, it could just as easily be added from outside the -module. Not that all markdown classes above are ignorant about -footnotes. All footnote functionality is provided separately and -then added to the markdown instance at the run time. +Adds footnote handling to Python-Markdown. -Footnote functionality is attached by calling extendMarkdown() -method of FootnoteExtension. The method also registers the -extension to allow it's state to be reset by a call to reset() -method. +See <https://pythonhosted.org/Markdown/extensions/footnotes.html> +for documentation. -Example: - Footnotes[^1] have a label[^label] and a definition[^!DEF]. +Copyright The Python Markdown Project - [^1]: This is a footnote - [^label]: A footnote on "label" - [^!DEF]: The footnote for definition +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) """ @@ -42,23 +32,23 @@ TABBED_RE = re.compile(r'((\t)|( ))(.*)') class FootnoteExtension(Extension): """ Footnote Extension. """ - def __init__ (self, configs): + def __init__ (self, *args, **kwargs): """ Setup configs. """ - self.config = {'PLACE_MARKER': - ["///Footnotes Go Here///", - "The text string that marks where the footnotes go"], - 'UNIQUE_IDS': - [False, - "Avoid name collisions across " - "multiple calls to reset()."], - "BACKLINK_TEXT": - ["↩", - "The text string that links from the footnote to the reader's place."] - } - - for key, value in configs: - self.config[key][0] = value + self.config = { + 'PLACE_MARKER': + ["///Footnotes Go Here///", + "The text string that marks where the footnotes go"], + 'UNIQUE_IDS': + [False, + "Avoid name collisions across " + "multiple calls to reset()."], + "BACKLINK_TEXT": + ["↩", + "The text string that links from the footnote to the reader's place."] + } + super(FootnoteExtension, self).__init__(*args, **kwargs) + # In multiple invocations, emit links that don't get tangled. self.unique_prefix = 0 @@ -309,7 +299,7 @@ class FootnotePostprocessor(Postprocessor): text = text.replace(FN_BACKLINK_TEXT, self.footnotes.getConfig("BACKLINK_TEXT")) return text.replace(NBSP_PLACEHOLDER, " ") -def makeExtension(configs=[]): +def makeExtension(*args, **kwargs): """ Return an instance of the FootnoteExtension """ - return FootnoteExtension(configs=configs) + return FootnoteExtension(*args, **kwargs) diff --git a/awx/lib/site-packages/markdown/extensions/headerid.py b/awx/lib/site-packages/markdown/extensions/headerid.py index 8221fe1d52..f7b7805bf8 100644 --- a/awx/lib/site-packages/markdown/extensions/headerid.py +++ b/awx/lib/site-packages/markdown/extensions/headerid.py @@ -4,73 +4,14 @@ HeaderID Extension for Python-Markdown Auto-generate id attributes for HTML headers. -Basic usage: +See <https://pythonhosted.org/Markdown/extensions/header_id.html> +for documentation. - >>> import markdown - >>> text = "# Some Header #" - >>> md = markdown.markdown(text, ['headerid']) - >>> print md - <h1 id="some-header">Some Header</h1> +Original code Copyright 2007-2011 [Waylan Limberg](http://achinghead.com/). -All header IDs are unique: +All changes Copyright 2011-2014 The Python Markdown Project - >>> text = ''' - ... #Header - ... #Header - ... #Header''' - >>> md = markdown.markdown(text, ['headerid']) - >>> print md - <h1 id="header">Header</h1> - <h1 id="header_1">Header</h1> - <h1 id="header_2">Header</h1> - -To fit within a html template's hierarchy, set the header base level: - - >>> text = ''' - ... #Some Header - ... ## Next Level''' - >>> md = markdown.markdown(text, ['headerid(level=3)']) - >>> print md - <h3 id="some-header">Some Header</h3> - <h4 id="next-level">Next Level</h4> - -Works with inline markup. - - >>> text = '#Some *Header* with [markup](http://example.com).' - >>> md = markdown.markdown(text, ['headerid']) - >>> print md - <h1 id="some-header-with-markup">Some <em>Header</em> with <a href="http://example.com">markup</a>.</h1> - -Turn off auto generated IDs: - - >>> text = ''' - ... # Some Header - ... # Another Header''' - >>> md = markdown.markdown(text, ['headerid(forceid=False)']) - >>> print md - <h1>Some Header</h1> - <h1>Another Header</h1> - -Use with MetaData extension: - - >>> text = '''header_level: 2 - ... header_forceid: Off - ... - ... # A Header''' - >>> md = markdown.markdown(text, ['headerid', 'meta']) - >>> print md - <h2>A Header</h2> - -Copyright 2007-2011 [Waylan Limberg](http://achinghead.com/). - -Project website: <http://packages.python.org/Markdown/extensions/header_id.html> -Contact: markdown@freewisdom.org - -License: BSD (see ../docs/LICENSE for details) - -Dependencies: -* [Python 2.3+](http://python.org) -* [Markdown 2.0+](http://packages.python.org/Markdown/) +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) """ @@ -127,7 +68,7 @@ def stashedHTML2text(text, md): def _html_sub(m): """ Substitute raw html with plain text. """ try: - raw, safe = md.htmlStash.rawHtmlBlocks[int(m.group(1))] + raw, safe = md.htmlStash.rawHtmlBlocks[int(m.group(1))] except (IndexError, TypeError): return m.group(0) if md.safeMode and not safe: @@ -176,7 +117,7 @@ class HeaderIdTreeprocessor(Treeprocessor): class HeaderIdExtension(Extension): - def __init__(self, configs): + def __init__(self, *args, **kwargs): # set defaults self.config = { 'level' : ['1', 'Base level for headers.'], @@ -185,8 +126,7 @@ class HeaderIdExtension(Extension): 'slugify' : [slugify, 'Callable to generate anchors'], } - for key, value in configs: - self.setConfig(key, value) + super(HeaderIdExtension, self).__init__(*args, **kwargs) def extendMarkdown(self, md, md_globals): md.registerExtension(self) @@ -204,5 +144,6 @@ class HeaderIdExtension(Extension): self.processor.IDs = set() -def makeExtension(configs=None): - return HeaderIdExtension(configs=configs) +def makeExtension(*args, **kwargs): + return HeaderIdExtension(*args, **kwargs) + diff --git a/awx/lib/site-packages/markdown/extensions/meta.py b/awx/lib/site-packages/markdown/extensions/meta.py index c4a4b210f9..bcc25a09b5 100644 --- a/awx/lib/site-packages/markdown/extensions/meta.py +++ b/awx/lib/site-packages/markdown/extensions/meta.py @@ -4,38 +4,14 @@ Meta Data Extension for Python-Markdown This extension adds Meta Data handling to markdown. -Basic Usage: +See <https://pythonhosted.org/Markdown/extensions/meta_data.html> +for documentation. - >>> import markdown - >>> text = '''Title: A Test Doc. - ... Author: Waylan Limberg - ... John Doe - ... Blank_Data: - ... - ... The body. This is paragraph one. - ... ''' - >>> md = markdown.Markdown(['meta']) - >>> print md.convert(text) - <p>The body. This is paragraph one.</p> - >>> print md.Meta - {u'blank_data': [u''], u'author': [u'Waylan Limberg', u'John Doe'], u'title': [u'A Test Doc.']} +Original code Copyright 2007-2008 [Waylan Limberg](http://achinghead.com). -Make sure text without Meta Data still works (markdown < 1.6b returns a <p>). +All changes Copyright 2008-2014 The Python Markdown Project - >>> text = ' Some Code - not extra lines of meta data.' - >>> md = markdown.Markdown(['meta']) - >>> print md.convert(text) - <pre><code>Some Code - not extra lines of meta data. - </code></pre> - >>> md.Meta - {} - -Copyright 2007-2008 [Waylan Limberg](http://achinghead.com). - -Project website: <http://packages.python.org/Markdown/meta_data.html> -Contact: markdown@freewisdom.org - -License: BSD (see ../LICENSE.md for details) +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) """ @@ -55,7 +31,7 @@ class MetaExtension (Extension): def extendMarkdown(self, md, md_globals): """ Add MetaPreprocessor to Markdown instance. """ - md.preprocessors.add("meta", MetaPreprocessor(md), "_begin") + md.preprocessors.add("meta", MetaPreprocessor(md), ">normalize_whitespace") class MetaPreprocessor(Preprocessor): @@ -89,5 +65,6 @@ class MetaPreprocessor(Preprocessor): return lines -def makeExtension(configs={}): - return MetaExtension(configs=configs) +def makeExtension(*args, **kwargs): + return MetaExtension(*args, **kwargs) + diff --git a/awx/lib/site-packages/markdown/extensions/nl2br.py b/awx/lib/site-packages/markdown/extensions/nl2br.py index da4b339958..062a7e6e2e 100644 --- a/awx/lib/site-packages/markdown/extensions/nl2br.py +++ b/awx/lib/site-packages/markdown/extensions/nl2br.py @@ -5,18 +5,14 @@ NL2BR Extension A Python-Markdown extension to treat newlines as hard breaks; like GitHub-flavored Markdown does. -Usage: +See <https://pythonhosted.org/Markdown/extensions/nl2br.html> +for documentation. - >>> import markdown - >>> print markdown.markdown('line 1\\nline 2', extensions=['nl2br']) - <p>line 1<br /> - line 2</p> +Oringinal code Copyright 2011 [Brian Neal](http://deathofagremmie.com/) -Copyright 2011 [Brian Neal](http://deathofagremmie.com/) +All changes Copyright 2011-2014 The Python Markdown Project -Dependencies: -* [Python 2.4+](http://python.org) -* [Markdown 2.1+](http://packages.python.org/Markdown/) +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) """ @@ -34,5 +30,6 @@ class Nl2BrExtension(Extension): md.inlinePatterns.add('nl', br_tag, '_end') -def makeExtension(configs=None): - return Nl2BrExtension(configs) +def makeExtension(*args, **kwargs): + return Nl2BrExtension(*args, **kwargs) + diff --git a/awx/lib/site-packages/markdown/extensions/sane_lists.py b/awx/lib/site-packages/markdown/extensions/sane_lists.py index fda663828e..9eb3a11f88 100644 --- a/awx/lib/site-packages/markdown/extensions/sane_lists.py +++ b/awx/lib/site-packages/markdown/extensions/sane_lists.py @@ -2,19 +2,16 @@ Sane List Extension for Python-Markdown ======================================= -Modify the behavior of Lists in Python-Markdown t act in a sane manor. +Modify the behavior of Lists in Python-Markdown to act in a sane manor. -In standard Markdown syntax, the following would constitute a single -ordered list. However, with this extension, the output would include -two lists, the first an ordered list and the second and unordered list. +See <https://pythonhosted.org/Markdown/extensions/sane_lists.html> +for documentation. - 1. ordered - 2. list +Original code Copyright 2011 [Waylan Limberg](http://achinghead.com) - * unordered - * list +All changes Copyright 2011-2014 The Python Markdown Project -Copyright 2011 - [Waylan Limberg](http://achinghead.com) +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) """ @@ -46,6 +43,6 @@ class SaneListExtension(Extension): md.parser.blockprocessors['ulist'] = SaneUListProcessor(md.parser) -def makeExtension(configs={}): - return SaneListExtension(configs=configs) +def makeExtension(*args, **kwargs): + return SaneListExtension(*args, **kwargs) diff --git a/awx/lib/site-packages/markdown/extensions/smart_strong.py b/awx/lib/site-packages/markdown/extensions/smart_strong.py index 4818cf9ea8..331dae8aeb 100644 --- a/awx/lib/site-packages/markdown/extensions/smart_strong.py +++ b/awx/lib/site-packages/markdown/extensions/smart_strong.py @@ -4,21 +4,14 @@ Smart_Strong Extension for Python-Markdown This extention adds smarter handling of double underscores within words. -Simple Usage: +See <https://pythonhosted.org/Markdown/extensions/smart_strong.html> +for documentation. - >>> import markdown - >>> print markdown.markdown('Text with double__underscore__words.', - ... extensions=['smart_strong']) - <p>Text with double__underscore__words.</p> - >>> print markdown.markdown('__Strong__ still works.', - ... extensions=['smart_strong']) - <p><strong>Strong</strong> still works.</p> - >>> print markdown.markdown('__this__works__too__.', - ... extensions=['smart_strong']) - <p><strong>this__works__too</strong>.</p> +Original code Copyright 2011 [Waylan Limberg](http://achinghead.com) -Copyright 2011 -[Waylan Limberg](http://achinghead.com) +All changes Copyright 2011-2014 The Python Markdown Project + +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) ''' @@ -38,5 +31,5 @@ class SmartEmphasisExtension(Extension): md.inlinePatterns['strong'] = SimpleTagPattern(STRONG_RE, 'strong') md.inlinePatterns.add('strong2', SimpleTagPattern(SMART_STRONG_RE, 'strong'), '>emphasis2') -def makeExtension(configs={}): - return SmartEmphasisExtension(configs=dict(configs)) +def makeExtension(*args, **kwargs): + return SmartEmphasisExtension(*args, **kwargs) diff --git a/awx/lib/site-packages/markdown/extensions/smarty.py b/awx/lib/site-packages/markdown/extensions/smarty.py index 2f946f8294..00c330f1f0 100644 --- a/awx/lib/site-packages/markdown/extensions/smarty.py +++ b/awx/lib/site-packages/markdown/extensions/smarty.py @@ -1,73 +1,91 @@ # -*- coding: utf-8 -*- -# Smarty extension for Python-Markdown -# Author: 2013, Dmitry Shachnev <mitya57@gmail.com> +''' +Smarty extension for Python-Markdown +==================================== + +Adds conversion of ASCII dashes, quotes and ellipses to their HTML +entity equivalents. + +See <https://pythonhosted.org/Markdown/extensions/smarty.html> +for documentation. + +Author: 2013, Dmitry Shachnev <mitya57@gmail.com> + +All changes Copyright 2013-2014 The Python Markdown Project + +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) + +SmartyPants license: + + Copyright (c) 2003 John Gruber <http://daringfireball.net/> + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name "SmartyPants" nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + This software is provided by the copyright holders and contributors "as + is" and any express or implied warranties, including, but not limited + to, the implied warranties of merchantability and fitness for a + particular purpose are disclaimed. In no event shall the copyright + owner or contributors be liable for any direct, indirect, incidental, + special, exemplary, or consequential damages (including, but not + limited to, procurement of substitute goods or services; loss of use, + data, or profits; or business interruption) however caused and on any + theory of liability, whether in contract, strict liability, or tort + (including negligence or otherwise) arising in any way out of the use + of this software, even if advised of the possibility of such damage. + + +smartypants.py license: + + smartypants.py is a derivative work of SmartyPants. + Copyright (c) 2004, 2007 Chad Miller <http://web.chad.org/> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + This software is provided by the copyright holders and contributors "as + is" and any express or implied warranties, including, but not limited + to, the implied warranties of merchantability and fitness for a + particular purpose are disclaimed. In no event shall the copyright + owner or contributors be liable for any direct, indirect, incidental, + special, exemplary, or consequential damages (including, but not + limited to, procurement of substitute goods or services; loss of use, + data, or profits; or business interruption) however caused and on any + theory of liability, whether in contract, strict liability, or tort + (including negligence or otherwise) arising in any way out of the use + of this software, even if advised of the possibility of such damage. + +''' -# SmartyPants license: -# -# Copyright (c) 2003 John Gruber <http://daringfireball.net/> -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# * Neither the name "SmartyPants" nor the names of its contributors -# may be used to endorse or promote products derived from this -# software without specific prior written permission. -# -# This software is provided by the copyright holders and contributors "as -# is" and any express or implied warranties, including, but not limited -# to, the implied warranties of merchantability and fitness for a -# particular purpose are disclaimed. In no event shall the copyright -# owner or contributors be liable for any direct, indirect, incidental, -# special, exemplary, or consequential damages (including, but not -# limited to, procurement of substitute goods or services; loss of use, -# data, or profits; or business interruption) however caused and on any -# theory of liability, whether in contract, strict liability, or tort -# (including negligence or otherwise) arising in any way out of the use -# of this software, even if advised of the possibility of such damage. -# -# -# smartypants.py license: -# -# smartypants.py is a derivative work of SmartyPants. -# Copyright (c) 2004, 2007 Chad Miller <http://web.chad.org/> -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# This software is provided by the copyright holders and contributors "as -# is" and any express or implied warranties, including, but not limited -# to, the implied warranties of merchantability and fitness for a -# particular purpose are disclaimed. In no event shall the copyright -# owner or contributors be liable for any direct, indirect, incidental, -# special, exemplary, or consequential damages (including, but not -# limited to, procurement of substitute goods or services; loss of use, -# data, or profits; or business interruption) however caused and on any -# theory of liability, whether in contract, strict liability, or tort -# (including negligence or otherwise) arising in any way out of the use -# of this software, even if advised of the possibility of such damage. from __future__ import unicode_literals from . import Extension from ..inlinepatterns import HtmlPattern +from ..odict import OrderedDict +from ..treeprocessors import InlineProcessor from ..util import parseBoolValue # Constants for quote education. @@ -83,12 +101,25 @@ openingQuotesBase = ( '|&[mn]dash;' # or named dash entities '|–|—' # or decimal entities ')' -) +) + +substitutions = { + 'mdash': '—', + 'ndash': '–', + 'ellipsis': '…', + 'left-angle-quote': '«', + 'right-angle-quote': '»', + 'left-single-quote': '‘', + 'right-single-quote': '’', + 'left-double-quote': '“', + 'right-double-quote': '”', +} + # Special case if the very first character is a quote # followed by punctuation at a non-word-break. Close the quotes by brute force: -singleQuoteStartRe = r"^'(?=%s\\B)" % punctClass -doubleQuoteStartRe = r'^"(?=%s\\B)' % punctClass +singleQuoteStartRe = r"^'(?=%s\B)" % punctClass +doubleQuoteStartRe = r'^"(?=%s\B)' % punctClass # Special case for double sets of quotes, e.g.: # <p>He said, "'Quoted' words in a larger quote."</p> @@ -113,8 +144,6 @@ closingSingleQuotesRegex2 = r"(?<=%s)'(\s|s\b)" % closeClass remainingSingleQuotesRegex = "'" remainingDoubleQuotesRegex = '"' -lsquo, rsquo, ldquo, rdquo = '‘', '’', '“', '”' - class SubstituteTextPattern(HtmlPattern): def __init__(self, pattern, replace, markdown_instance): """ Replaces matches with some text. """ @@ -132,35 +161,56 @@ class SubstituteTextPattern(HtmlPattern): return result class SmartyExtension(Extension): - def __init__(self, configs): + def __init__(self, *args, **kwargs): self.config = { 'smart_quotes': [True, 'Educate quotes'], + 'smart_angled_quotes': [False, 'Educate angled quotes'], 'smart_dashes': [True, 'Educate dashes'], - 'smart_ellipses': [True, 'Educate ellipses'] + 'smart_ellipses': [True, 'Educate ellipses'], + 'substitutions' : [{}, 'Overwrite default substitutions'], } - for key, value in configs: - self.setConfig(key, parseBoolValue(value)) + super(SmartyExtension, self).__init__(*args, **kwargs) + self.substitutions = dict(substitutions) + self.substitutions.update(self.getConfig('substitutions', default={})) def _addPatterns(self, md, patterns, serie): for ind, pattern in enumerate(patterns): pattern += (md,) pattern = SubstituteTextPattern(*pattern) - after = ('>smarty-%s-%d' % (serie, ind - 1) if ind else '>entity') + after = ('>smarty-%s-%d' % (serie, ind - 1) if ind else '_begin') name = 'smarty-%s-%d' % (serie, ind) - md.inlinePatterns.add(name, pattern, after) + self.inlinePatterns.add(name, pattern, after) def educateDashes(self, md): - emDashesPattern = SubstituteTextPattern(r'(?<!-)---(?!-)', ('—',), md) - enDashesPattern = SubstituteTextPattern(r'(?<!-)--(?!-)', ('–',), md) - md.inlinePatterns.add('smarty-em-dashes', emDashesPattern, '>entity') - md.inlinePatterns.add('smarty-en-dashes', enDashesPattern, + emDashesPattern = SubstituteTextPattern(r'(?<!-)---(?!-)', + (self.substitutions['mdash'],), md) + enDashesPattern = SubstituteTextPattern(r'(?<!-)--(?!-)', + (self.substitutions['ndash'],), md) + self.inlinePatterns.add('smarty-em-dashes', emDashesPattern, '_begin') + self.inlinePatterns.add('smarty-en-dashes', enDashesPattern, '>smarty-em-dashes') def educateEllipses(self, md): - ellipsesPattern = SubstituteTextPattern(r'(?<!\.)\.{3}(?!\.)', ('…',), md) - md.inlinePatterns.add('smarty-ellipses', ellipsesPattern, '>entity') + ellipsesPattern = SubstituteTextPattern(r'(?<!\.)\.{3}(?!\.)', + (self.substitutions['ellipsis'],), md) + self.inlinePatterns.add('smarty-ellipses', ellipsesPattern, '_begin') + + def educateAngledQuotes(self, md): + leftAngledQuotePattern = SubstituteTextPattern(r'\<\<', + (self.substitutions['left-angle-quote'],), md) + rightAngledQuotePattern = SubstituteTextPattern(r'\>\>', + (self.substitutions['right-angle-quote'],), md) + self.inlinePatterns.add('smarty-left-angle-quotes', + leftAngledQuotePattern, '_begin') + self.inlinePatterns.add('smarty-right-angle-quotes', + rightAngledQuotePattern, '>smarty-left-angle-quotes') def educateQuotes(self, md): + configs = self.getConfigs() + lsquo = self.substitutions['left-single-quote'] + rsquo = self.substitutions['right-single-quote'] + ldquo = self.substitutions['left-double-quote'] + rdquo = self.substitutions['right-double-quote'] patterns = ( (singleQuoteStartRe, (rsquo,)), (doubleQuoteStartRe, (rdquo,)), @@ -179,13 +229,19 @@ class SmartyExtension(Extension): def extendMarkdown(self, md, md_globals): configs = self.getConfigs() - if configs['smart_quotes']: - self.educateQuotes(md) - if configs['smart_dashes']: - self.educateDashes(md) + self.inlinePatterns = OrderedDict() if configs['smart_ellipses']: self.educateEllipses(md) + if configs['smart_quotes']: + self.educateQuotes(md) + if configs['smart_angled_quotes']: + self.educateAngledQuotes(md) + if configs['smart_dashes']: + self.educateDashes(md) + inlineProcessor = InlineProcessor(md) + inlineProcessor.inlinePatterns = self.inlinePatterns + md.treeprocessors.add('smarty', inlineProcessor, '_end') md.ESCAPED_CHARS.extend(['"', "'"]) -def makeExtension(configs=None): - return SmartyExtension(configs) +def makeExtension(*args, **kwargs): + return SmartyExtension(*args, **kwargs) diff --git a/awx/lib/site-packages/markdown/extensions/tables.py b/awx/lib/site-packages/markdown/extensions/tables.py index ad52ec11c7..57507e96d8 100644 --- a/awx/lib/site-packages/markdown/extensions/tables.py +++ b/awx/lib/site-packages/markdown/extensions/tables.py @@ -4,14 +4,15 @@ Tables Extension for Python-Markdown Added parsing of tables to Python-Markdown. -A simple example: +See <https://pythonhosted.org/Markdown/extensions/tables.html> +for documentation. - First Header | Second Header - ------------- | ------------- - Content Cell | Content Cell - Content Cell | Content Cell +Original code Copyright 2009 [Waylan Limberg](http://achinghead.com) + +All changes Copyright 2008-2014 The Python Markdown Project + +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) -Copyright 2009 - [Waylan Limberg](http://achinghead.com) """ from __future__ import absolute_import @@ -71,7 +72,7 @@ class TableProcessor(BlockProcessor): c = etree.SubElement(tr, tag) try: c.text = cells[i].strip() - except IndexError: + except IndexError: #pragma: no cover c.text = "" if a: c.set('align', a) @@ -96,5 +97,6 @@ class TableExtension(Extension): '<hashheader') -def makeExtension(configs={}): - return TableExtension(configs=configs) +def makeExtension(*args, **kwargs): + return TableExtension(*args, **kwargs) + diff --git a/awx/lib/site-packages/markdown/extensions/toc.py b/awx/lib/site-packages/markdown/extensions/toc.py index 89468d60c7..f7fb675b84 100644 --- a/awx/lib/site-packages/markdown/extensions/toc.py +++ b/awx/lib/site-packages/markdown/extensions/toc.py @@ -1,11 +1,15 @@ """ Table of Contents Extension for Python-Markdown -* * * +=============================================== -(c) 2008 [Jack Miller](http://codezen.org) +See <https://pythonhosted.org/Markdown/extensions/toc.html> +for documentation. -Dependencies: -* [Markdown 2.1+](http://packages.python.org/Markdown/) +Oringinal code Copyright 2008 [Jack Miller](http://codezen.org) + +All changes Copyright 2008-2014 The Python Markdown Project + +License: [BSD](http://www.opensource.org/licenses/bsd-license.php) """ @@ -23,60 +27,59 @@ def order_toc_list(toc_list): [{'level': 1}, {'level': 2}] => [{'level': 1, 'children': [{'level': 2, 'children': []}]}] - + A wrong list is also converted: [{'level': 2}, {'level': 1}] => [{'level': 2, 'children': []}, {'level': 1, 'children': []}] """ - - def build_correct(remaining_list, prev_elements=[{'level': 1000}]): - - if not remaining_list: - return [], [] - - current = remaining_list.pop(0) - if not 'children' in current.keys(): - current['children'] = [] - - if not prev_elements: - # This happens for instance with [8, 1, 1], ie. when some - # header level is outside a scope. We treat it as a - # top-level - next_elements, children = build_correct(remaining_list, [current]) - current['children'].append(children) - return [current] + next_elements, [] - - prev_element = prev_elements.pop() - children = [] - next_elements = [] - # Is current part of the child list or next list? - if current['level'] > prev_element['level']: - #print "%d is a child of %d" % (current['level'], prev_element['level']) - prev_elements.append(prev_element) - prev_elements.append(current) - prev_element['children'].append(current) - next_elements2, children2 = build_correct(remaining_list, prev_elements) - children += children2 - next_elements += next_elements2 - else: - #print "%d is ancestor of %d" % (current['level'], prev_element['level']) - if not prev_elements: - #print "No previous elements, so appending to the next set" - next_elements.append(current) - prev_elements = [current] - next_elements2, children2 = build_correct(remaining_list, prev_elements) - current['children'].extend(children2) + + ordered_list = [] + if len(toc_list): + # Initialize everything by processing the first entry + last = toc_list.pop(0) + last['children'] = [] + levels = [last['level']] + ordered_list.append(last) + parents = [] + + # Walk the rest nesting the entries properly + while toc_list: + t = toc_list.pop(0) + current_level = t['level'] + t['children'] = [] + + # Reduce depth if current level < last item's level + if current_level < levels[-1]: + # Pop last level since we know we are less than it + levels.pop() + + # Pop parents and levels we are less than or equal to + to_pop = 0 + for p in reversed(parents): + if current_level <= p['level']: + to_pop += 1 + else: + break + if to_pop: + levels = levels[:-to_pop] + parents = parents[:-to_pop] + + # Note current level as last + levels.append(current_level) + + # Level is the same, so append to the current parent (if available) + if current_level == levels[-1]: + (parents[-1]['children'] if parents else ordered_list).append(t) + + # Current level is > last item's level, + # So make last item a parent and append current as child else: - #print "Previous elements, comparing to those first" - remaining_list.insert(0, current) - next_elements2, children2 = build_correct(remaining_list, prev_elements) - children.extend(children2) - next_elements += next_elements2 - - return next_elements, children - - ordered_list, __ = build_correct(toc_list) + last['children'].append(t) + parents.append(last) + levels.append(current_level) + last = t + return ordered_list @@ -204,26 +207,26 @@ class TocExtension(Extension): TreeProcessorClass = TocTreeprocessor - def __init__(self, configs=[]): - self.config = { "marker" : ["[TOC]", - "Text to find and replace with Table of Contents -" - "Defaults to \"[TOC]\""], - "slugify" : [slugify, - "Function to generate anchors based on header text-" - "Defaults to the headerid ext's slugify function."], - "title" : [None, - "Title to insert into TOC <div> - " - "Defaults to None"], - "anchorlink" : [0, - "1 if header should be a self link" - "Defaults to 0"], - "permalink" : [0, - "1 or link text if a Sphinx-style permalink should be added", - "Defaults to 0"] - } + def __init__(self, *args, **kwargs): + self.config = { + "marker" : ["[TOC]", + "Text to find and replace with Table of Contents - " + "Defaults to \"[TOC]\""], + "slugify" : [slugify, + "Function to generate anchors based on header text - " + "Defaults to the headerid ext's slugify function."], + "title" : ["", + "Title to insert into TOC <div> - " + "Defaults to an empty string"], + "anchorlink" : [0, + "1 if header should be a self link - " + "Defaults to 0"], + "permalink" : [0, + "1 or link text if a Sphinx-style permalink should be added - " + "Defaults to 0"] + } - for key, value in configs: - self.setConfig(key, value) + super(TocExtension, self).__init__(*args, **kwargs) def extendMarkdown(self, md, md_globals): tocext = self.TreeProcessorClass(md) @@ -236,5 +239,5 @@ class TocExtension(Extension): md.treeprocessors.add("toc", tocext, "_end") -def makeExtension(configs={}): - return TocExtension(configs=configs) +def makeExtension(*args, **kwargs): + return TocExtension(*args, **kwargs) diff --git a/awx/lib/site-packages/markdown/extensions/wikilinks.py b/awx/lib/site-packages/markdown/extensions/wikilinks.py index ba1947c0b1..64377cf3e2 100644 --- a/awx/lib/site-packages/markdown/extensions/wikilinks.py +++ b/awx/lib/site-packages/markdown/extensions/wikilinks.py @@ -2,78 +2,17 @@ WikiLinks Extension for Python-Markdown ====================================== -Converts [[WikiLinks]] to relative links. Requires Python-Markdown 2.0+ +Converts [[WikiLinks]] to relative links. -Basic usage: +See <https://pythonhosted.org/Markdown/extensions/wikilinks.html> +for documentation. - >>> import markdown - >>> text = "Some text with a [[WikiLink]]." - >>> html = markdown.markdown(text, ['wikilinks']) - >>> print html - <p>Some text with a <a class="wikilink" href="/WikiLink/">WikiLink</a>.</p> +Original code Copyright [Waylan Limberg](http://achinghead.com/). -Whitespace behavior: - - >>> print markdown.markdown('[[ foo bar_baz ]]', ['wikilinks']) - <p><a class="wikilink" href="/foo_bar_baz/">foo bar_baz</a></p> - >>> print markdown.markdown('foo [[ ]] bar', ['wikilinks']) - <p>foo bar</p> - -To define custom settings the simple way: - - >>> print markdown.markdown(text, - ... ['wikilinks(base_url=/wiki/,end_url=.html,html_class=foo)'] - ... ) - <p>Some text with a <a class="foo" href="/wiki/WikiLink.html">WikiLink</a>.</p> - -Custom settings the complex way: - - >>> md = markdown.Markdown( - ... extensions = ['wikilinks'], - ... extension_configs = {'wikilinks': [ - ... ('base_url', 'http://example.com/'), - ... ('end_url', '.html'), - ... ('html_class', '') ]}, - ... safe_mode = True) - >>> print md.convert(text) - <p>Some text with a <a href="http://example.com/WikiLink.html">WikiLink</a>.</p> - -Use MetaData with mdx_meta.py (Note the blank html_class in MetaData): - - >>> text = """wiki_base_url: http://example.com/ - ... wiki_end_url: .html - ... wiki_html_class: - ... - ... Some text with a [[WikiLink]].""" - >>> md = markdown.Markdown(extensions=['meta', 'wikilinks']) - >>> print md.convert(text) - <p>Some text with a <a href="http://example.com/WikiLink.html">WikiLink</a>.</p> - -MetaData should not carry over to next document: - - >>> print md.convert("No [[MetaData]] here.") - <p>No <a class="wikilink" href="/MetaData/">MetaData</a> here.</p> - -Define a custom URL builder: - - >>> def my_url_builder(label, base, end): - ... return '/bar/' - >>> md = markdown.Markdown(extensions=['wikilinks'], - ... extension_configs={'wikilinks' : [('build_url', my_url_builder)]}) - >>> print md.convert('[[foo]]') - <p><a class="wikilink" href="/bar/">foo</a></p> - -From the command line: - - python markdown.py -x wikilinks(base_url=http://example.com/,end_url=.html,html_class=foo) src.txt - -By [Waylan Limberg](http://achinghead.com/). +All changes Copyright The Python Markdown Project License: [BSD](http://www.opensource.org/licenses/bsd-license.php) -Dependencies: -* [Python 2.3+](http://python.org) -* [Markdown 2.0+](http://packages.python.org/Markdown/) ''' from __future__ import absolute_import @@ -90,19 +29,17 @@ def build_url(label, base, end): class WikiLinkExtension(Extension): - def __init__(self, configs): - # set extension defaults + + def __init__ (self, *args, **kwargs): self.config = { - 'base_url' : ['/', 'String to append to beginning or URL.'], - 'end_url' : ['/', 'String to append to end of URL.'], - 'html_class' : ['wikilink', 'CSS hook. Leave blank for none.'], - 'build_url' : [build_url, 'Callable formats URL from label.'], + 'base_url' : ['/', 'String to append to beginning or URL.'], + 'end_url' : ['/', 'String to append to end of URL.'], + 'html_class' : ['wikilink', 'CSS hook. Leave blank for none.'], + 'build_url' : [build_url, 'Callable formats URL from label.'], } - configs = dict(configs) or {} - # Override defaults with user settings - for key, value in configs.items(): - self.setConfig(key, value) + super(WikiLinkExtension, self).__init__(*args, **kwargs) + def extendMarkdown(self, md, md_globals): self.md = md @@ -147,5 +84,5 @@ class WikiLinks(Pattern): return base_url, end_url, html_class -def makeExtension(configs=None) : - return WikiLinkExtension(configs=configs) +def makeExtension(*args, **kwargs) : + return WikiLinkExtension(*args, **kwargs) diff --git a/awx/lib/site-packages/markdown/inlinepatterns.py b/awx/lib/site-packages/markdown/inlinepatterns.py index 9335748730..c9d82fdc75 100644 --- a/awx/lib/site-packages/markdown/inlinepatterns.py +++ b/awx/lib/site-packages/markdown/inlinepatterns.py @@ -46,13 +46,13 @@ from __future__ import unicode_literals from . import util from . import odict import re -try: +try: #pragma: no cover from urllib.parse import urlparse, urlunparse -except ImportError: +except ImportError: #pragma: no cover from urlparse import urlparse, urlunparse -try: +try: #pragma: no cover from html import entities -except ImportError: +except ImportError: #pragma: no cover import htmlentitydefs as entities @@ -75,7 +75,8 @@ def build_inlinepatterns(md_instance, **kwargs): inlinePatterns["html"] = HtmlPattern(HTML_RE, md_instance) inlinePatterns["entity"] = HtmlPattern(ENTITY_RE, md_instance) inlinePatterns["not_strong"] = SimpleTextPattern(NOT_STRONG_RE) - inlinePatterns["strong_em"] = DoubleTagPattern(STRONG_EM_RE, 'strong,em') + inlinePatterns["em_strong"] = DoubleTagPattern(EM_STRONG_RE, 'strong,em') + inlinePatterns["strong_em"] = DoubleTagPattern(STRONG_EM_RE, 'em,strong') inlinePatterns["strong"] = SimpleTagPattern(STRONG_RE, 'strong') inlinePatterns["emphasis"] = SimpleTagPattern(EMPHASIS_RE, 'em') if md_instance.smart_emphasis: @@ -100,7 +101,8 @@ BACKTICK_RE = r'(?<!\\)(`+)(.+?)(?<!`)\2(?!`)' # `e=f()` or ``e=f("`")`` ESCAPE_RE = r'\\(.)' # \< EMPHASIS_RE = r'(\*)([^\*]+)\2' # *emphasis* STRONG_RE = r'(\*{2}|_{2})(.+?)\2' # **strong** -STRONG_EM_RE = r'(\*{3}|_{3})(.+?)\2' # ***strong*** +EM_STRONG_RE = r'(\*|_)\2{2}(.+?)\2(.*?)\2{2}' # ***strongem*** or ***em*strong** +STRONG_EM_RE = r'(\*|_)\2{2}(.+?)\2{2}(.*?)\2' # ***strong**em* SMART_EMPHASIS_RE = r'(?<!\w)(_)(?!_)(.+?)(?<!_)\2(?!\w)' # _smart_emphasis_ EMPHASIS_2_RE = r'(_)(.+?)\2' # _emphasis_ LINK_RE = NOIMG + BRK + \ @@ -156,7 +158,7 @@ class Pattern(object): """ self.pattern = pattern - self.compiled_re = re.compile("^(.*?)%s(.*?)$" % pattern, + self.compiled_re = re.compile("^(.*?)%s(.*?)$" % pattern, re.DOTALL | re.UNICODE) # Api for Markdown to pass safe_mode into instance @@ -178,7 +180,7 @@ class Pattern(object): * m: A re match object containing a match of the pattern. """ - pass + pass #pragma: no cover def type(self): """ Return class name, to define pattern type """ @@ -188,9 +190,9 @@ class Pattern(object): """ Return unescaped text given text with an inline placeholder. """ try: stash = self.markdown.treeprocessors['inline'].stashed_nodes - except KeyError: + except KeyError: #pragma: no cover return text - def itertext(el): + def itertext(el): #pragma: no cover ' Reimplement Element.itertext for older python versions ' tag = el.tag if not isinstance(tag, util.string_type) and tag is not None: @@ -210,17 +212,14 @@ class Pattern(object): return value else: # An etree Element - return text content only - return ''.join(itertext(value)) + return ''.join(itertext(value)) return util.INLINE_PLACEHOLDER_RE.sub(get_stash, text) class SimpleTextPattern(Pattern): """ Return a simple text of group(2) of a Pattern. """ def handleMatch(self, m): - text = m.group(2) - if text == util.INLINE_PLACEHOLDER_PREFIX: - return None - return text + return m.group(2) class EscapePattern(Pattern): @@ -231,7 +230,7 @@ class EscapePattern(Pattern): if char in self.markdown.ESCAPED_CHARS: return '%s%s%s' % (util.STX, ord(char), util.ETX) else: - return None + return None class SimpleTagPattern(Pattern): @@ -279,6 +278,8 @@ class DoubleTagPattern(SimpleTagPattern): el1 = util.etree.Element(tag1) el2 = util.etree.SubElement(el1, tag2) el2.text = m.group(3) + if len(m.groups())==5: + el2.tail = m.group(4) return el1 @@ -293,7 +294,7 @@ class HtmlPattern(Pattern): """ Return unescaped text given text with an inline placeholder. """ try: stash = self.markdown.treeprocessors['inline'].stashed_nodes - except KeyError: + except KeyError: #pragma: no cover return text def get_stash(m): id = m.group(1) @@ -303,7 +304,7 @@ class HtmlPattern(Pattern): return self.markdown.serializer(value) except: return '\%s' % value - + return util.INLINE_PLACEHOLDER_RE.sub(get_stash, text) @@ -323,7 +324,7 @@ class LinkPattern(Pattern): el.set("href", "") if title: - title = dequote(self.unescape(title)) + title = dequote(self.unescape(title)) el.set("title", title) return el @@ -347,20 +348,20 @@ class LinkPattern(Pattern): if not self.markdown.safeMode: # Return immediately bipassing parsing. return url - + try: scheme, netloc, path, params, query, fragment = url = urlparse(url) - except ValueError: + except ValueError: #pragma: no cover # Bad url - so bad it couldn't be parsed. return '' - + locless_schemes = ['', 'mailto', 'news'] allowed_schemes = locless_schemes + ['http', 'https', 'ftp', 'ftps'] if scheme not in allowed_schemes: # Not a known (allowed) scheme. Not safe. return '' - - if netloc == '' and scheme not in locless_schemes: + + if netloc == '' and scheme not in locless_schemes: #pragma: no cover # This should not happen. Treat as suspect. return '' diff --git a/awx/lib/site-packages/markdown/odict.py b/awx/lib/site-packages/markdown/odict.py index 68c12593f7..b158e06a24 100644 --- a/awx/lib/site-packages/markdown/odict.py +++ b/awx/lib/site-packages/markdown/odict.py @@ -82,11 +82,11 @@ class OrderedDict(dict): for key in self.keyOrder: yield self[key] - if util.PY3: + if util.PY3: #pragma: no cover items = _iteritems keys = _iterkeys values = _itervalues - else: + else: #pragma: no cover iteritems = _iteritems iterkeys = _iterkeys itervalues = _itervalues diff --git a/awx/lib/site-packages/markdown/postprocessors.py b/awx/lib/site-packages/markdown/postprocessors.py index 5f3f032c15..7b568adac5 100644 --- a/awx/lib/site-packages/markdown/postprocessors.py +++ b/awx/lib/site-packages/markdown/postprocessors.py @@ -42,7 +42,7 @@ class Postprocessor(util.Processor): (possibly modified) string. """ - pass + pass #pragma: no cover class RawHtmlPostprocessor(Postprocessor): diff --git a/awx/lib/site-packages/markdown/preprocessors.py b/awx/lib/site-packages/markdown/preprocessors.py index 5bfca55530..ed11c39031 100644 --- a/awx/lib/site-packages/markdown/preprocessors.py +++ b/awx/lib/site-packages/markdown/preprocessors.py @@ -41,7 +41,7 @@ class Preprocessor(util.Processor): the (possibly modified) list of lines. """ - pass + pass #pragma: no cover class NormalizeWhitespace(Preprocessor): @@ -174,9 +174,10 @@ class HtmlBlockPreprocessor(Preprocessor): else: # raw html if len(items) - right_listindex <= 1: # last element right_listindex -= 1 + offset = 1 if i == right_listindex else 0 placeholder = self.markdown.htmlStash.store('\n\n'.join( - items[i:right_listindex + 1])) - del items[i:right_listindex + 1] + items[i:right_listindex + offset])) + del items[i:right_listindex + offset] items.insert(i, placeholder) return items diff --git a/awx/lib/site-packages/markdown/serializers.py b/awx/lib/site-packages/markdown/serializers.py index aa828066b4..f53ae31db8 100644 --- a/awx/lib/site-packages/markdown/serializers.py +++ b/awx/lib/site-packages/markdown/serializers.py @@ -42,9 +42,9 @@ from __future__ import unicode_literals from . import util ElementTree = util.etree.ElementTree QName = util.etree.QName -if hasattr(util.etree, 'test_comment'): +if hasattr(util.etree, 'test_comment'): #pragma: no cover Comment = util.etree.test_comment -else: +else: #pragma: no cover Comment = util.etree.Comment PI = util.etree.PI ProcessingInstruction = util.etree.ProcessingInstruction @@ -56,7 +56,7 @@ HTML_EMPTY = ("area", "base", "basefont", "br", "col", "frame", "hr", try: HTML_EMPTY = set(HTML_EMPTY) -except NameError: +except NameError: #pragma: no cover pass _namespace_map = { @@ -73,7 +73,7 @@ _namespace_map = { } -def _raise_serialization_error(text): +def _raise_serialization_error(text): #pragma: no cover raise TypeError( "cannot serialize %r (type %s)" % (text, type(text).__name__) ) @@ -81,7 +81,7 @@ def _raise_serialization_error(text): def _encode(text, encoding): try: return text.encode(encoding, "xmlcharrefreplace") - except (TypeError, AttributeError): + except (TypeError, AttributeError): #pragma: no cover _raise_serialization_error(text) def _escape_cdata(text): @@ -97,7 +97,7 @@ def _escape_cdata(text): if ">" in text: text = text.replace(">", ">") return text - except (TypeError, AttributeError): + except (TypeError, AttributeError): #pragma: no cover _raise_serialization_error(text) @@ -115,7 +115,7 @@ def _escape_attrib(text): if "\n" in text: text = text.replace("\n", " ") return text - except (TypeError, AttributeError): + except (TypeError, AttributeError): #pragma: no cover _raise_serialization_error(text) def _escape_attrib_html(text): @@ -130,7 +130,7 @@ def _escape_attrib_html(text): if "\"" in text: text = text.replace("\"", """) return text - except (TypeError, AttributeError): + except (TypeError, AttributeError): #pragma: no cover _raise_serialization_error(text) @@ -240,7 +240,7 @@ def _namespaces(elem, default_namespace=None): "default_namespace option" ) qnames[qname] = qname - except TypeError: + except TypeError: #pragma: no cover _raise_serialization_error(qname) # populate qname and namespaces table diff --git a/awx/lib/site-packages/markdown/treeprocessors.py b/awx/lib/site-packages/markdown/treeprocessors.py index ef0a2aa00c..303e4600cd 100644 --- a/awx/lib/site-packages/markdown/treeprocessors.py +++ b/awx/lib/site-packages/markdown/treeprocessors.py @@ -34,11 +34,11 @@ class Treeprocessor(util.Processor): def run(self, root): """ Subclasses of Treeprocessor should implement a `run` method, which - takes a root ElementTree. This method can return another ElementTree - object, and the existing root ElementTree will be replaced, or it can + takes a root ElementTree. This method can return another ElementTree + object, and the existing root ElementTree will be replaced, or it can modify the current tree and return None. """ - pass + pass #pragma: no cover class InlineProcessor(Treeprocessor): @@ -53,6 +53,7 @@ class InlineProcessor(Treeprocessor): + len(self.__placeholder_suffix) self.__placeholder_re = util.INLINE_PLACEHOLDER_RE self.markdown = md + self.inlinePatterns = md.inlinePatterns def __makePlaceholder(self, type): """ Generate a placeholder """ @@ -70,7 +71,7 @@ class InlineProcessor(Treeprocessor): * index: index, from which we start search Returns: placeholder id and string index, after the found placeholder. - + """ m = self.__placeholder_re.search(data, index) if m: @@ -99,9 +100,9 @@ class InlineProcessor(Treeprocessor): """ if not isinstance(data, util.AtomicString): startIndex = 0 - while patternIndex < len(self.markdown.inlinePatterns): + while patternIndex < len(self.inlinePatterns): data, matched, startIndex = self.__applyPattern( - self.markdown.inlinePatterns.value_for_index(patternIndex), + self.inlinePatterns.value_for_index(patternIndex), data, patternIndex, startIndex) if not matched: patternIndex += 1 @@ -128,11 +129,10 @@ class InlineProcessor(Treeprocessor): text = subnode.tail subnode.tail = None - childResult = self.__processPlaceholders(text, subnode) + childResult = self.__processPlaceholders(text, subnode, isText) if not isText and node is not subnode: - pos = list(node).index(subnode) - node.remove(subnode) + pos = list(node).index(subnode) + 1 else: pos = 0 @@ -140,7 +140,7 @@ class InlineProcessor(Treeprocessor): for newChild in childResult: node.insert(pos, newChild) - def __processPlaceholders(self, data, parent): + def __processPlaceholders(self, data, parent, isText=True): """ Process string with placeholders and generate ElementTree tree. @@ -150,7 +150,7 @@ class InlineProcessor(Treeprocessor): * parent: Element, which contains processing inline data Returns: list with ElementTree elements with applied inline patterns. - + """ def linkText(text): if text: @@ -159,6 +159,11 @@ class InlineProcessor(Treeprocessor): result[-1].tail += text else: result[-1].tail = text + elif not isText: + if parent.tail: + parent.tail += text + else: + parent.tail = text else: if parent.text: parent.text += text @@ -182,7 +187,7 @@ class InlineProcessor(Treeprocessor): for child in [node] + list(node): if child.tail: if child.tail.strip(): - self.__processElementText(node, child,False) + self.__processElementText(node, child, False) if child.text: if child.text.strip(): self.__processElementText(child, child) @@ -239,7 +244,7 @@ class InlineProcessor(Treeprocessor): # We need to process current node too for child in [node] + list(node): if not isString(node): - if child.text: + if child.text: child.text = self.__handleInline(child.text, patternIndex + 1) if child.tail: @@ -287,11 +292,10 @@ class InlineProcessor(Treeprocessor): if child.tail: tail = self.__handleInline(child.tail) dumby = util.etree.Element('d') - tailResult = self.__processPlaceholders(tail, dumby) - if dumby.text: - child.tail = dumby.text - else: - child.tail = None + child.tail = None + tailResult = self.__processPlaceholders(tail, dumby, False) + if dumby.tail: + child.tail = dumby.tail pos = list(currElement).index(child) + 1 tailResult.reverse() for newChild in tailResult: @@ -303,7 +307,7 @@ class InlineProcessor(Treeprocessor): if self.markdown.enable_attributes: if element.text and isString(element.text): element.text = \ - inlinepatterns.handleAttributes(element.text, + inlinepatterns.handleAttributes(element.text, element) i = 0 for newChild in lst: @@ -357,4 +361,4 @@ class PrettifyTreeprocessor(Treeprocessor): pres = root.getiterator('pre') for pre in pres: if len(pre) and pre[0].tag == 'code': - pre[0].text = pre[0].text.rstrip() + '\n' + pre[0].text = util.AtomicString(pre[0].text.rstrip() + '\n') diff --git a/awx/lib/site-packages/markdown/util.py b/awx/lib/site-packages/markdown/util.py index edb25886ad..0541e7b409 100644 --- a/awx/lib/site-packages/markdown/util.py +++ b/awx/lib/site-packages/markdown/util.py @@ -10,11 +10,11 @@ Python 3 Stuff """ PY3 = sys.version_info[0] == 3 -if PY3: +if PY3: #pragma: no cover string_type = str text_type = str int2str = chr -else: +else: #pragma: no cover string_type = basestring text_type = unicode int2str = unichr @@ -58,14 +58,15 @@ RTL_BIDI_RANGES = ( ('\u0590', '\u07FF'), # Extensions should use "markdown.util.etree" instead of "etree" (or do `from # markdown.util import etree`). Do not import it by yourself. -try: # Is the C implementation of ElementTree available? +try: #pragma: no cover + # Is the C implementation of ElementTree available? import xml.etree.cElementTree as etree from xml.etree.ElementTree import Comment # Serializers (including ours) test with non-c Comment etree.test_comment = Comment if etree.VERSION < "1.0.5": raise RuntimeError("cElementTree version 1.0.5 or higher is required.") -except (ImportError, RuntimeError): +except (ImportError, RuntimeError): #pragma: no cover # Use the Python implementation of ElementTree? import xml.etree.ElementTree as etree if etree.VERSION < "1.1": @@ -85,15 +86,20 @@ def isBlockLevel(tag): # Some ElementTree tags are not strings, so return False. return False -def parseBoolValue(value, fail_on_errors=True): +def parseBoolValue(value, fail_on_errors=True, preserve_none=False): """Parses a string representing bool value. If parsing was successful, - returns True or False. If parsing was not successful, raises - ValueError, or, if fail_on_errors=False, returns None.""" + returns True or False. If preserve_none=True, returns True, False, + or None. If parsing was not successful, raises ValueError, or, if + fail_on_errors=False, returns None.""" if not isinstance(value, string_type): + if preserve_none and value is None: + return value return bool(value) + elif preserve_none and value.lower() == 'none': + return None elif value.lower() in ('true', 'yes', 'y', 'on', '1'): return True - elif value.lower() in ('false', 'no', 'n', 'off', '0'): + elif value.lower() in ('false', 'no', 'n', 'off', '0', 'none'): return False elif fail_on_errors: raise ValueError('Cannot parse bool value: %r' % value) From a8516c4ededb3f9e36144b35476973731419648e Mon Sep 17 00:00:00 2001 From: Matthew Jones <mat@matburt.net> Date: Thu, 29 Jan 2015 13:09:26 -0500 Subject: [PATCH 09/10] Upgrade keyring to 4.1 --- awx/lib/site-packages/README | 2 +- awx/lib/site-packages/keyring/backend.py | 42 ++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/awx/lib/site-packages/README b/awx/lib/site-packages/README index 42de7bf67e..e5db657b74 100644 --- a/awx/lib/site-packages/README +++ b/awx/lib/site-packages/README @@ -31,7 +31,7 @@ gevent-websocket==0.9.3 (geventwebsocket/*) httplib2==0.9 (httplib2/*) importlib==1.0.3 (importlib/*, needed for Python 2.6 support) iso8601==0.1.10 (iso8601/*) -keyring==4.0 (keyring/*, excluded bin/keyring) +keyring==4.1 (keyring/*, excluded bin/keyring) kombu==3.0.21 (kombu/*) Markdown==2.5.2 (markdown/*, excluded bin/markdown_py) mock==1.0.1 (mock.py) diff --git a/awx/lib/site-packages/keyring/backend.py b/awx/lib/site-packages/keyring/backend.py index 2563829039..1161774eae 100644 --- a/awx/lib/site-packages/keyring/backend.py +++ b/awx/lib/site-packages/keyring/backend.py @@ -5,17 +5,27 @@ Keyring implementation support from __future__ import absolute_import import abc +import logging try: import importlib except ImportError: pass +try: + import pkg_resources +except ImportError: + pass + from . import errors, util from . import backends from .util import properties from .py27compat import add_metaclass, filter + +log = logging.getLogger(__name__) + + class KeyringBackendMeta(abc.ABCMeta): """ A metaclass that's both an ABCMeta and a type that keeps a registry of @@ -127,6 +137,38 @@ def _load_backends(): backends = ('file', 'Gnome', 'Google', 'keyczar', 'kwallet', 'multi', 'OS_X', 'pyfs', 'SecretService', 'Windows') list(map(_load_backend, backends)) + _load_plugins() + +def _load_plugins(): + """ + Locate all setuptools entry points by the name 'keyring backends' + and initialize them. + Any third-party library may register an entry point by adding the + following to their setup.py:: + + entry_points = { + 'keyring backends': [ + 'plugin_name = mylib.mymodule:initialize_func', + ], + }, + + `plugin_name` can be anything, and is only used to display the name + of the plugin at initialization time. + + `initialize_func` is optional, but will be invoked if callable. + """ + if 'pkg_resources' not in globals(): + return + group = 'keyring backends' + entry_points = pkg_resources.iter_entry_points(group=group) + for ep in entry_points: + try: + log.info('Loading %s', ep.name) + init_func = ep.load() + if callable(init_func): + init_func() + except Exception: + log.exception("Error initializing plugin %s." % ep) @util.once def get_all_keyring(): From bd542bc336a79b700e56b23d4d6f0c638dfc55b6 Mon Sep 17 00:00:00 2001 From: Matthew Jones <mat@matburt.net> Date: Fri, 30 Jan 2015 10:52:35 -0500 Subject: [PATCH 10/10] Update some of the dev requirements stuff --- Makefile | 4 ++-- .../commands/run_socketio_service.py | 2 ++ requirements/dev_local.txt | 2 +- requirements/setuptools-12.0.5.tar.gz | Bin 0 -> 626973 bytes requirements/setuptools-2.2.tar.gz | Bin 786831 -> 0 bytes 5 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 requirements/setuptools-12.0.5.tar.gz delete mode 100644 requirements/setuptools-2.2.tar.gz diff --git a/Makefile b/Makefile index 807f0ba732..0bc3af431d 100644 --- a/Makefile +++ b/Makefile @@ -110,7 +110,7 @@ push: # locally downloaded packages). requirements: @if [ "$(VIRTUAL_ENV)" ]; then \ - (cd requirements && pip install --no-index setuptools-2.2.tar.gz); \ + (cd requirements && pip install --no-index setuptools-12.0.5.tar.gz); \ (cd requirements && pip install --no-index Django-1.6.7.tar.gz); \ (cd requirements && pip install --no-index -r dev_local.txt); \ $(PYTHON) fix_virtualenv_setuptools.py; \ @@ -122,7 +122,7 @@ requirements: # (downloading from PyPI if necessary). requirements_pypi: @if [ "$(VIRTUAL_ENV)" ]; then \ - pip install setuptools==2.2; \ + pip install setuptools==12.0.5; \ pip install Django\>=1.6.7,\<1.7; \ pip install -r requirements/dev.txt; \ $(PYTHON) fix_virtualenv_setuptools.py; \ diff --git a/awx/main/management/commands/run_socketio_service.py b/awx/main/management/commands/run_socketio_service.py index 0788217a21..7fc892b46b 100644 --- a/awx/main/management/commands/run_socketio_service.py +++ b/awx/main/management/commands/run_socketio_service.py @@ -122,7 +122,9 @@ def notification_handler(server): 'type': 'event', } for session_id, socket in list(server.sockets.iteritems()): + print("Going to emit an event, here are our sessions: %s" % valid_sockets) if session_id in valid_sockets: + print("Sending to session: %s" % str(session_id)) socket.send_packet(packet) class Command(NoArgsCommand): diff --git a/requirements/dev_local.txt b/requirements/dev_local.txt index 315c1e3869..82968bc54d 100644 --- a/requirements/dev_local.txt +++ b/requirements/dev_local.txt @@ -2,7 +2,7 @@ # packages). Install using "pip --no-index -r dev_local.txt". # May need to install these packages separately the first time: -setuptools-2.2.tar.gz +setuptools-12.0.5.tar.gz distribute-0.7.3.zip Django-1.6.7.tar.gz diff --git a/requirements/setuptools-12.0.5.tar.gz b/requirements/setuptools-12.0.5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..c70e2d768743ada8d1becd5fe059eedb3cb0b30f GIT binary patch literal 626973 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%0DTFwKF+u{n0H)!T%M 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 BUMBzm literal 0 HcmV?d00001 diff --git a/requirements/setuptools-2.2.tar.gz b/requirements/setuptools-2.2.tar.gz deleted file mode 100644 index 3ae2530d9e4ec542dc73710ebb02e9a5f449d061..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 786831 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%0Dk!uFBfaCcD3lZ`ZO@npNQ)hP&NcwMd}}+k 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%0D4u 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 i1{p71K&XRRZil)x%J#=1oa0{Sa55obcPsafH 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%0D7yi(gM)c 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�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ű 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