Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
7 changes: 3 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,14 +94,13 @@ The latest changes to the CLI are in the `develop` branch on github. This is the

Additionally, the [`botocore`](https://github.com/boto/botocore) package is developed in lockstep with the CLI.

If you just want to install a snapshot of the latest development version of the CLI, you can use the `requirements.txt` file included in this repo. This file points to the development version of the above packages:
Since `botocore` and `s3transfer` are vendored directly into the `awscli`
package, you do not need to install them separately. Simply install the CLI
in editable mode:

$ cd <path_to_awscli>
$ python -m pip install -r requirements.txt
$ python -m pip install -e .

However, to keep up to date, you will continually have to run the `python -m pip install -r requirements.txt` file to pull in the latest changes from the develop branch of botocore.

You can optionally clone each of those repositories and run \"python -m pip install -e .\":

$ git clone <botocore> && cd botocore/
Expand Down
3 changes: 2 additions & 1 deletion MANIFEST.in
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
include README.rst
include LICENSE.txt
include requirements.txt
include UPGRADE_PY3.md
include .pre-commit-config.yaml
recursive-include awscli/examples *.rst *.txt
recursive-include awscli/data *.json
recursive-include awscli/topics *.rst *.json
recursive-include awscli/botocore/data *.json
recursive-include awscli/botocore *.pem
52 changes: 52 additions & 0 deletions awscli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,55 @@
]
)
COMPLEX_TYPES = set(['structure', 'map', 'list'])
import importlib.abc
import os
import sys


class TopLevelImportAliasFinder(importlib.abc.MetaPathFinder):
"""Finder to allow missing awscli namespace in package imports

This allows packages that used to be dependencies of the AWS CLI and are
now maintained in the AWS CLI codebase to still be importable as a
top-level import and minimize churn on the codebase. For example, both of
these import statements result in the import of the same module on disk::

>> import awscli.botocore
>> import botocore

Note: That this import alias only comes into affect if anything is
imported from the awscli package.
"""

_PACKAGES = [
'botocore',
's3transfer',
]
_TARGET_FINDERS = [
'_frozen_importlib_external.PathFinder',
]

def __init__(self, underlying_finder):
self._underlying_finder = underlying_finder
self._parent_path = [os.path.dirname(__file__)]

@classmethod
def add_alias_finder(cls, meta_path):
"""Wrap known MetaPathFinders that search for aliased packages"""
for i, finder in enumerate(meta_path):
if isinstance(finder, type):
finder_name = finder.__name__
else:
finder_name = finder.__class__.__name__
full_cls_name = f'{finder.__module__}.{finder_name}'
if full_cls_name in cls._TARGET_FINDERS:
meta_path.insert(i, cls(finder))
return

def find_spec(self, fullname, path, target=None):
if fullname in self._PACKAGES:
path = self._parent_path
return self._underlying_finder.find_spec(fullname, path, target)


TopLevelImportAliasFinder.add_alias_finder(sys.meta_path)
241 changes: 241 additions & 0 deletions awscli/botocore/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
# Copyright (c) 2012-2013 Mitch Garnaat http://garnaat.org/
# Copyright 2012-2014 Amazon.com, Inc. or its affiliates. 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. A copy of
# the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# 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 logging
import os
import re
from logging import NullHandler

__version__ = '1.43.32'


# Configure default logger to do nothing
log = logging.getLogger('botocore')
log.addHandler(NullHandler())

_INITIALIZERS = []

_first_cap_regex = re.compile('(.)([A-Z][a-z]+)')
_end_cap_regex = re.compile('([a-z0-9])([A-Z])')
# The regex below handles the special case where some acronym
# name is pluralized, e.g GatewayARNs, ListWebACLs, SomeCNAMEs.
_special_case_transform = re.compile('[A-Z]{2,}s$')
# 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',
('ListHITsForQualificationType', '_'): 'list_hits_for_qualification_type',
('ListHITsForQualificationType', '-'): 'list-hits-for-qualification-type',
('ExecutePartiQLStatement', '_'): 'execute_partiql_statement',
('ExecutePartiQLStatement', '-'): 'execute-partiql-statement',
('ExecutePartiQLTransaction', '_'): 'execute_partiql_transaction',
('ExecutePartiQLTransaction', '-'): 'execute-partiql-transaction',
('ExecutePartiQLBatch', '_'): 'execute_partiql_batch',
('ExecutePartiQLBatch', '-'): 'execute-partiql-batch',
(
'AssociateWhatsAppBusinessAccount',
'_',
): 'associate_whatsapp_business_account',
(
'AssociateWhatsAppBusinessAccount',
'-',
): 'associate-whatsapp-business-account',
('CreateWhatsAppFlow', '_'): 'create_whatsapp_flow',
('CreateWhatsAppFlow', '-'): 'create-whatsapp-flow',
('CreateWhatsAppMessageTemplate', '_'): 'create_whatsapp_message_template',
('CreateWhatsAppMessageTemplate', '-'): 'create-whatsapp-message-template',
(
'CreateWhatsAppMessageTemplateFromLibrary',
'_',
): 'create_whatsapp_message_template_from_library',
(
'CreateWhatsAppMessageTemplateFromLibrary',
'-',
): 'create-whatsapp-message-template-from-library',
(
'CreateWhatsAppMessageTemplateMedia',
'_',
): 'create_whatsapp_message_template_media',
(
'CreateWhatsAppMessageTemplateMedia',
'-',
): 'create-whatsapp-message-template-media',
('DeleteWhatsAppFlow', '_'): 'delete_whatsapp_flow',
('DeleteWhatsAppFlow', '-'): 'delete-whatsapp-flow',
('DeleteWhatsAppMessageMedia', '_'): 'delete_whatsapp_message_media',
('DeleteWhatsAppMessageMedia', '-'): 'delete-whatsapp-message-media',
('DeleteWhatsAppMessageTemplate', '_'): 'delete_whatsapp_message_template',
('DeleteWhatsAppMessageTemplate', '-'): 'delete-whatsapp-message-template',
('DeprecateWhatsAppFlow', '_'): 'deprecate_whatsapp_flow',
('DeprecateWhatsAppFlow', '-'): 'deprecate-whatsapp-flow',
(
'DisassociateWhatsAppBusinessAccount',
'_',
): 'disassociate_whatsapp_business_account',
(
'DisassociateWhatsAppBusinessAccount',
'-',
): 'disassociate-whatsapp-business-account',
(
'GetLinkedWhatsAppBusinessAccount',
'_',
): 'get_linked_whatsapp_business_account',
(
'GetLinkedWhatsAppBusinessAccount',
'-',
): 'get-linked-whatsapp-business-account',
(
'GetLinkedWhatsAppBusinessAccountPhoneNumber',
'_',
): 'get_linked_whatsapp_business_account_phone_number',
(
'GetLinkedWhatsAppBusinessAccountPhoneNumber',
'-',
): 'get-linked-whatsapp-business-account-phone-number',
('GetOTelEnrichment', '_'): 'get_otel_enrichment',
('GetOTelEnrichment', '-'): 'get-otel-enrichment',
('GetWhatsAppFlow', '_'): 'get_whatsapp_flow',
('GetWhatsAppFlow', '-'): 'get-whatsapp-flow',
('GetWhatsAppFlowPreview', '_'): 'get_whatsapp_flow_preview',
('GetWhatsAppFlowPreview', '-'): 'get-whatsapp-flow-preview',
('GetWhatsAppMessageMedia', '_'): 'get_whatsapp_message_media',
('GetWhatsAppMessageMedia', '-'): 'get-whatsapp-message-media',
('GetWhatsAppMessageTemplate', '_'): 'get_whatsapp_message_template',
('GetWhatsAppMessageTemplate', '-'): 'get-whatsapp-message-template',
(
'ListLinkedWhatsAppBusinessAccounts',
'_',
): 'list_linked_whatsapp_business_accounts',
(
'ListLinkedWhatsAppBusinessAccounts',
'-',
): 'list-linked-whatsapp-business-accounts',
('ListWhatsAppFlowAssets', '_'): 'list_whatsapp_flow_assets',
('ListWhatsAppFlowAssets', '-'): 'list-whatsapp-flow-assets',
('ListWhatsAppFlows', '_'): 'list_whatsapp_flows',
('ListWhatsAppFlows', '-'): 'list-whatsapp-flows',
('ListWhatsAppMessageTemplates', '_'): 'list_whatsapp_message_templates',
('ListWhatsAppMessageTemplates', '-'): 'list-whatsapp-message-templates',
('ListWhatsAppTemplateLibrary', '_'): 'list_whatsapp_template_library',
('ListWhatsAppTemplateLibrary', '-'): 'list-whatsapp-template-library',
('PostWhatsAppMessageMedia', '_'): 'post_whatsapp_message_media',
('PostWhatsAppMessageMedia', '-'): 'post-whatsapp-message-media',
('PublishWhatsAppFlow', '_'): 'publish_whatsapp_flow',
('PublishWhatsAppFlow', '-'): 'publish-whatsapp-flow',
(
'PutWhatsAppBusinessAccountEventDestinations',
'_',
): 'put_whatsapp_business_account_event_destinations',
(
'PutWhatsAppBusinessAccountEventDestinations',
'-',
): 'put-whatsapp-business-account-event-destinations',
('SendWhatsAppMessage', '_'): 'send_whatsapp_message',
('SendWhatsAppMessage', '-'): 'send-whatsapp-message',
('StartOTelEnrichment', '_'): 'start_otel_enrichment',
('StartOTelEnrichment', '-'): 'start-otel-enrichment',
('StopOTelEnrichment', '_'): 'stop_otel_enrichment',
('StopOTelEnrichment', '-'): 'stop-otel-enrichment',
('UpdateWhatsAppFlow', '_'): 'update_whatsapp_flow',
('UpdateWhatsAppFlow', '-'): 'update-whatsapp-flow',
('UpdateWhatsAppFlowAssets', '_'): 'update_whatsapp_flow_assets',
('UpdateWhatsAppFlowAssets', '-'): 'update-whatsapp-flow-assets',
('UpdateWhatsAppMessageTemplate', '_'): 'update_whatsapp_message_template',
('UpdateWhatsAppMessageTemplate', '-'): 'update-whatsapp-message-template',
}
ScalarTypes = ('string', 'integer', 'boolean', 'timestamp', 'float', 'double')

BOTOCORE_ROOT = os.path.dirname(os.path.abspath(__file__))


# Used to specify anonymous (unsigned) request signature
class UNSIGNED:
def __copy__(self):
return self

def __deepcopy__(self, memodict):
return self


UNSIGNED = UNSIGNED()


def xform_name(name, sep='_', _xform_cache=_xform_cache):
"""Convert camel case to a "pythonic" name.

If the name contains the ``sep`` character, then it is
returned unchanged.

"""
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.
name = f"{name[: -len(matched)]}{sep}{matched.lower()}"
s1 = _first_cap_regex.sub(r'\1' + sep + r'\2', name)
transformed = _end_cap_regex.sub(r'\1' + sep + r'\2', s1).lower()
_xform_cache[key] = transformed
return _xform_cache[key]


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)
Loading
Loading