python-botocore/botocore/__init__.py

140 lines
4.8 KiB
Python
Raw Normal View History

# 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: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:31 +02:00
# http://aws.amazon.com/apache2.0/
#
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.
2022-05-26 00:10:07 +02:00
import logging
2015-10-08 20:15:31 +02:00
import os
import re
2022-12-12 17:14:19 +01:00
__version__ = '1.29.27'
class NullHandler(logging.Handler):
def emit(self, record):
pass
2021-11-03 18:14:15 +01:00
# Configure default logger to do nothing
log = logging.getLogger('botocore')
log.addHandler(NullHandler())
2022-12-12 17:14:19 +01:00
_INITIALIZERS = []
_first_cap_regex = re.compile('(.)([A-Z][a-z]+)')
_end_cap_regex = re.compile('([a-z0-9])([A-Z])')
2021-08-18 17:45:16 +02:00
# The regex below handles the special case where some acronym
# name is pluralized, e.g GatewayARNs, ListWebACLs, SomeCNAMEs.
2021-08-18 17:45:16 +02:00
_special_case_transform = re.compile('[A-Z]{2,}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',
2021-01-26 16:12:20 +01:00
('ExecutePartiQLStatement', '_'): 'execute_partiql_statement',
('ExecutePartiQLStatement', '-'): 'execute-partiql-statement',
('ExecutePartiQLTransaction', '_'): 'execute_partiql_transaction',
('ExecutePartiQLTransaction', '-'): 'execute-partiql-transaction',
('ExecutePartiQLBatch', '_'): 'execute_partiql_batch',
('ExecutePartiQLBatch', '-'): 'execute-partiql-batch',
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.
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
# Used to specify anonymous (unsigned) request signature
2022-05-26 00:10:07 +02:00
class UNSIGNED:
2017-07-04 08:22:29 +02:00
def __copy__(self):
return self
def __deepcopy__(self, memodict):
return self
UNSIGNED = UNSIGNED()
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: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:
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.
2022-05-26 00:10:07 +02:00
name = f"{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]
2022-12-12 17:14:19 +01:00
def register_initializer(callback):
"""Register an initializer function for session creation.
This initializer function will be invoked whenever a new
`botocore.session.Session` is instantiated.
:type callback: callable
:param callback: A callable that accepts a single argument
of type `botocore.session.Session`.
"""
_INITIALIZERS.append(callback)
def unregister_initializer(callback):
"""Unregister an initializer function.
:type callback: callable
:param callback: A callable that was previously registered
with `botocore.register_initializer`.
:raises ValueError: If a callback is provided that is not currently
registered as an initializer.
"""
_INITIALIZERS.remove(callback)
def invoke_initializers(session):
"""Invoke all initializers for a session.
:type session: botocore.session.Session
:param session: The session to initialize.
"""
for initializer in _INITIALIZERS:
initializer(session)