Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aws
GitHub Repository: aws/aws-cli
Path: blob/develop/awscli/customizations/binaryhoist.py
1566 views
1
# Copyright 2023 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
# http://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.
13
import copy
14
15
from dataclasses import dataclass
16
from typing import Optional
17
from awscli.arguments import CustomArgument, CLIArgument
18
19
20
@dataclass
21
class ArgumentParameters:
22
name: str
23
member: Optional[str] = None
24
help_text: Optional[str] = None
25
required: Optional[bool] = False
26
27
28
class InjectingArgument(CustomArgument):
29
def __init__(self, serialized_name, original_member_name, **kwargs):
30
self._serialized_name = serialized_name
31
self._original_member_name = original_member_name
32
super().__init__(**kwargs)
33
34
def add_to_params(self, parameters, value):
35
if value is None:
36
pass
37
wrapped_value = {self._original_member_name: value}
38
if parameters.get(self._serialized_name):
39
parameters[self._serialized_name].update(wrapped_value)
40
else:
41
parameters[self._serialized_name] = wrapped_value
42
43
44
class OriginalArgument(CLIArgument):
45
def __init__(self, original_member_name, error_message, **kwargs):
46
self._serialized_name = kwargs.get("serialized_name")
47
self._original_member_name = original_member_name
48
self._error_message = error_message
49
super().__init__(**kwargs)
50
51
def add_to_params(self, parameters, value):
52
if value is None:
53
return
54
55
unpacked = self._unpack_argument(value)
56
if self._original_member_name in unpacked and self._error_message:
57
raise ValueError(self._error_message)
58
59
if parameters.get(self._serialized_name):
60
parameters[self._serialized_name].update(unpacked)
61
else:
62
parameters[self._serialized_name] = unpacked
63
64
65
class BinaryBlobArgumentHoister:
66
def __init__(
67
self,
68
new_argument: ArgumentParameters,
69
original_argument: ArgumentParameters,
70
error_if_original_used: Optional[str] = None,
71
):
72
self._new_argument = new_argument
73
self._original_argument = original_argument
74
self._error_message = error_if_original_used
75
76
def __call__(self, session, argument_table, **kwargs):
77
argument = argument_table[self._original_argument.name]
78
model = copy.deepcopy(argument.argument_model)
79
del model.members[self._original_argument.member]
80
81
argument_table[self._new_argument.name] = InjectingArgument(
82
argument._serialized_name,
83
self._original_argument.member,
84
name=self._new_argument.name,
85
help_text=self._new_argument.help_text,
86
cli_type_name="blob",
87
required=self._new_argument.required,
88
)
89
argument_table[self._original_argument.name] = OriginalArgument(
90
self._original_argument.member,
91
self._error_message,
92
name=self._original_argument.name,
93
argument_model=model,
94
operation_model=argument._operation_model,
95
is_required=self._original_argument.required,
96
event_emitter=session.get_component("event_emitter"),
97
serialized_name=argument._serialized_name,
98
)
99
100