Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/boto3/utils.py: 52%
27 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:51 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:51 +0000
1# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"). You
4# may not use this file except in compliance with the License. A copy of
5# the License is located at
6#
7# https://aws.amazon.com/apache2.0/
8#
9# or in the "license" file accompanying this file. This file is
10# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11# ANY KIND, either express or implied. See the License for the specific
12# language governing permissions and limitations under the License.
13import sys
14from collections import namedtuple
16_ServiceContext = namedtuple(
17 'ServiceContext',
18 [
19 'service_name',
20 'service_model',
21 'service_waiter_model',
22 'resource_json_definitions',
23 ],
24)
27class ServiceContext(_ServiceContext):
28 """Provides important service-wide, read-only information about a service
30 :type service_name: str
31 :param service_name: The name of the service
33 :type service_model: :py:class:`botocore.model.ServiceModel`
34 :param service_model: The model of the service.
36 :type service_waiter_model: :py:class:`botocore.waiter.WaiterModel` or
37 a waiter model-like object such as
38 :py:class:`boto3.utils.LazyLoadedWaiterModel`
39 :param service_waiter_model: The waiter model of the service.
41 :type resource_json_definitions: dict
42 :param resource_json_definitions: The loaded json models of all resource
43 shapes for a service. It is equivalient of loading a
44 ``resource-1.json`` and retrieving the value at the key "resources".
45 """
47 pass
50def import_module(name):
51 """Import module given a name.
53 Does not support relative imports.
55 """
56 __import__(name)
57 return sys.modules[name]
60def lazy_call(full_name, **kwargs):
61 parent_kwargs = kwargs
63 def _handler(**kwargs):
64 module, function_name = full_name.rsplit('.', 1)
65 module = import_module(module)
66 kwargs.update(parent_kwargs)
67 return getattr(module, function_name)(**kwargs)
69 return _handler
72def inject_attribute(class_attributes, name, value):
73 if name in class_attributes:
74 raise RuntimeError(
75 f'Cannot inject class attribute "{name}", attribute '
76 f'already exists in class dict.'
77 )
78 else:
79 class_attributes[name] = value
82class LazyLoadedWaiterModel:
83 """A lazily loaded waiter model
85 This does not load the service waiter model until an attempt is made
86 to retrieve the waiter model for a specific waiter. This is helpful
87 in docstring generation where we do not need to actually need to grab
88 the waiter-2.json until it is accessed through a ``get_waiter`` call
89 when the docstring is generated/accessed.
90 """
92 def __init__(self, bc_session, service_name, api_version):
93 self._session = bc_session
94 self._service_name = service_name
95 self._api_version = api_version
97 def get_waiter(self, waiter_name):
98 return self._session.get_waiter_model(
99 self._service_name, self._api_version
100 ).get_waiter(waiter_name)