# Copyright 2015 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 # # https://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 sys from collections import namedtuple _ServiceContext = namedtuple( 'ServiceContext', [ 'service_name', 'service_model', 'service_waiter_model', 'resource_json_definitions', ], ) class ServiceContext(_ServiceContext): """Provides important service-wide, read-only information about a service :type service_name: str :param service_name: The name of the service :type service_model: :py:class:`botocore.model.ServiceModel` :param service_model: The model of the service. :type service_waiter_model: :py:class:`botocore.waiter.WaiterModel` or a waiter model-like object such as :py:class:`boto3.utils.LazyLoadedWaiterModel` :param service_waiter_model: The waiter model of the service. :type resource_json_definitions: dict :param resource_json_definitions: The loaded json models of all resource shapes for a service. It is equivalient of loading a ``resource-1.json`` and retrieving the value at the key "resources". """ pass def import_module(name): """Import module given a name. Does not support relative imports. """ __import__(name) return sys.modules[name] def lazy_call(full_name, **kwargs): parent_kwargs = kwargs def _handler(**kwargs): module, function_name = full_name.rsplit('.', 1) module = import_module(module) kwargs.update(parent_kwargs) return getattr(module, function_name)(**kwargs) return _handler def inject_attribute(class_attributes, name, value): if name in class_attributes: raise RuntimeError( f'Cannot inject class attribute "{name}", attribute ' f'already exists in class dict.' ) else: class_attributes[name] = value class LazyLoadedWaiterModel: """A lazily loaded waiter model This does not load the service waiter model until an attempt is made to retrieve the waiter model for a specific waiter. This is helpful in docstring generation where we do not need to actually need to grab the waiter-2.json until it is accessed through a ``get_waiter`` call when the docstring is generated/accessed. """ def __init__(self, bc_session, service_name, api_version): self._session = bc_session self._service_name = service_name self._api_version = api_version def get_waiter(self, waiter_name): return self._session.get_waiter_model( self._service_name, self._api_version ).get_waiter(waiter_name)