2015-10-08 20:15:29 +02:00
|
|
|
# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
|
2015-10-08 20:15:31 +02:00
|
|
|
# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
2015-10-08 20:15:29 +02:00
|
|
|
#
|
2015-10-08 20:15:31 +02:00
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
|
|
|
# may not use this file except in compliance with the License. A copy of
|
|
|
|
# the License is located at
|
2015-10-08 20:15:29 +02:00
|
|
|
#
|
2015-10-08 20:15:31 +02:00
|
|
|
# http://aws.amazon.com/apache2.0/
|
2015-10-08 20:15:29 +02:00
|
|
|
#
|
2015-10-08 20:15:31 +02:00
|
|
|
# or in the "license" file accompanying this file. This file 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
|
2015-10-08 20:15:29 +02:00
|
|
|
import re
|
|
|
|
import logging
|
|
|
|
|
2019-10-03 12:21:31 +02:00
|
|
|
__version__ = '1.12.241'
|
2015-10-08 20:15:29 +02:00
|
|
|
|
|
|
|
|
|
|
|
class NullHandler(logging.Handler):
|
|
|
|
def emit(self, record):
|
|
|
|
pass
|
|
|
|
|
|
|
|
# Configure default logger to do nothing
|
|
|
|
log = logging.getLogger('botocore')
|
|
|
|
log.addHandler(NullHandler())
|
|
|
|
|
|
|
|
|
|
|
|
_first_cap_regex = re.compile('(.)([A-Z][a-z]+)')
|
|
|
|
_end_cap_regex = re.compile('([a-z0-9])([A-Z])')
|
2015-11-24 12:34:53 +01:00
|
|
|
# The regex below handles the special case where some acryonym
|
|
|
|
# name is pluralized, e.g GatewayARNs, ListWebACLs, SomeCNAMEs.
|
|
|
|
_special_case_transform = re.compile('[A-Z]{3,}s$')
|
2015-10-08 20:15:31 +02:00
|
|
|
# Prepopulate the cache with special cases that don't match
|
|
|
|
# our regular transformation.
|
|
|
|
_xform_cache = {
|
|
|
|
('CreateCachediSCSIVolume', '_'): 'create_cached_iscsi_volume',
|
|
|
|
('CreateCachediSCSIVolume', '-'): 'create-cached-iscsi-volume',
|
|
|
|
('DescribeCachediSCSIVolumes', '_'): 'describe_cached_iscsi_volumes',
|
|
|
|
('DescribeCachediSCSIVolumes', '-'): 'describe-cached-iscsi-volumes',
|
|
|
|
('DescribeStorediSCSIVolumes', '_'): 'describe_stored_iscsi_volumes',
|
|
|
|
('DescribeStorediSCSIVolumes', '-'): 'describe-stored-iscsi-volumes',
|
|
|
|
('CreateStorediSCSIVolume', '_'): 'create_stored_iscsi_volume',
|
|
|
|
('CreateStorediSCSIVolume', '-'): 'create-stored-iscsi-volume',
|
2017-06-27 11:52:19 +02:00
|
|
|
('ListHITsForQualificationType', '_'): 'list_hits_for_qualification_type',
|
|
|
|
('ListHITsForQualificationType', '-'): 'list-hits-for-qualification-type',
|
2015-10-08 20:15:31 +02:00
|
|
|
}
|
2017-02-02 09:27:08 +01:00
|
|
|
# The items in this dict represent partial renames to apply globally to all
|
|
|
|
# services which might have a matching argument or operation. This way a
|
|
|
|
# common mis-translation can be fixed without having to call out each
|
|
|
|
# individual case.
|
2015-10-08 20:15:29 +02:00
|
|
|
ScalarTypes = ('string', 'integer', 'boolean', 'timestamp', 'float', 'double')
|
|
|
|
|
2015-10-08 20:15:31 +02:00
|
|
|
BOTOCORE_ROOT = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
|
2017-07-04 08:22:29 +02:00
|
|
|
|
2015-11-24 12:34:53 +01:00
|
|
|
# Used to specify anonymous (unsigned) request signature
|
2017-07-04 08:22:29 +02:00
|
|
|
class UNSIGNED(object):
|
|
|
|
def __copy__(self):
|
|
|
|
return self
|
|
|
|
|
|
|
|
def __deepcopy__(self, memodict):
|
|
|
|
return self
|
|
|
|
|
|
|
|
|
|
|
|
UNSIGNED = UNSIGNED()
|
2015-11-24 12:34:53 +01:00
|
|
|
|
2015-10-08 20:15:31 +02:00
|
|
|
|
2018-07-11 08:25:50 +02:00
|
|
|
def xform_name(name, sep='_', _xform_cache=_xform_cache):
|
2015-10-08 20:15:31 +02:00
|
|
|
"""Convert camel case to a "pythonic" name.
|
|
|
|
|
|
|
|
If the name contains the ``sep`` character, then it is
|
|
|
|
returned unchanged.
|
2015-10-08 20:15:29 +02:00
|
|
|
|
|
|
|
"""
|
2015-10-08 20:15:31 +02:00
|
|
|
if sep in name:
|
|
|
|
# If the sep is in the name, assume that it's already
|
|
|
|
# transformed and return the string unchanged.
|
|
|
|
return name
|
|
|
|
key = (name, sep)
|
|
|
|
if key not in _xform_cache:
|
2015-11-24 12:34:53 +01:00
|
|
|
if _special_case_transform.search(name) is not None:
|
|
|
|
is_special = _special_case_transform.search(name)
|
|
|
|
matched = is_special.group()
|
|
|
|
# Replace something like ARNs, ACLs with _arns, _acls.
|
|
|
|
name = name[:-len(matched)] + sep + matched.lower()
|
2015-10-08 20:15:31 +02:00
|
|
|
s1 = _first_cap_regex.sub(r'\1' + sep + r'\2', name)
|
2018-07-11 08:25:50 +02:00
|
|
|
transformed = _end_cap_regex.sub(r'\1' + sep + r'\2', s1).lower()
|
2015-10-08 20:15:31 +02:00
|
|
|
_xform_cache[key] = transformed
|
|
|
|
return _xform_cache[key]
|