FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
aws-cli/awscli/argparser.py at develop · bhalothia/aws-cli · GitHub
bhalothia
/
aws-cli
Public
forked from
aws/aws-cli
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
aws-cli
/
awscli
/
argparser.py
Copy path
More file actions
More file actions
Latest commit
History
History
History
148 lines (128 loc) · 5.9 KB
Breadcrumbs
aws-cli
/
awscli
/
argparser.py
Copy path
File metadata and controls
148 lines (128 loc) · 5.9 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# Copyright 2013 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
argparse
import
sys
import
six
from
difflib
import
get_close_matches
class
CLIArgParser
(
argparse
.
ArgumentParser
):
Formatter
=
argparse
.
RawTextHelpFormatter
# When displaying invalid choice error messages,
# this controls how many options to show per line.
ChoicesPerLine
=
2
def
_check_value
(
self
,
action
,
value
):
"""
It's probably not a great idea to override a "hidden" method
but the default behavior is pretty ugly and there doesn't
seem to be any other way to change it.
"""
# converted value must be one of the choices (if specified)
if
action
.
choices
is
not
None
and
value
not
in
action
.
choices
:
msg
=
[
'Invalid choice, valid choices are:
\n
'
]
for
i
in
range
(
len
(
action
.
choices
))[::
self
.
ChoicesPerLine
]:
current
=
[]
for
choice
in
action
.
choices
[
i
:
i
+
self
.
ChoicesPerLine
]:
current
.
append
(
'%-40s'
%
choice
)
msg
.
append
(
' | '
.
join
(
current
))
possible
=
get_close_matches
(
value
,
action
.
choices
,
cutoff
=
0.8
)
if
possible
:
extra
=
[
'
\n
\n
Invalid choice: %r, maybe you meant:
\n
'
%
value
]
for
word
in
possible
:
extra
.
append
(
' * %s'
%
word
)
msg
.
extend
(
extra
)
raise
argparse
.
ArgumentError
(
action
,
'
\n
'
.
join
(
msg
))
def
parse_known_args
(
self
,
args
,
namespace
=
None
):
parsed
,
remaining
=
super
(
CLIArgParser
,
self
).
parse_known_args
(
args
,
namespace
)
terminal_encoding
=
getattr
(
sys
.
stdin
,
'encoding'
,
'utf-8'
)
if
terminal_encoding
is
None
:
# In some cases, sys.stdin won't have an encoding set,
# (e.g if it's set to a StringIO). In this case we just
# default to utf-8.
terminal_encoding
=
'utf-8'
for
arg
,
value
in
vars
(
parsed
).
items
():
if
isinstance
(
value
,
six
.
binary_type
):
setattr
(
parsed
,
arg
,
value
.
decode
(
terminal_encoding
))
elif
isinstance
(
value
,
list
):
encoded
=
[]
for
v
in
value
:
if
isinstance
(
v
,
six
.
binary_type
):
encoded
.
append
(
v
.
decode
(
terminal_encoding
))
else
:
encoded
.
append
(
v
)
setattr
(
parsed
,
arg
,
encoded
)
return
parsed
,
remaining
class
MainArgParser
(
CLIArgParser
):
Formatter
=
argparse
.
RawTextHelpFormatter
def
__init__
(
self
,
command_table
,
version_string
,
description
,
usage
,
argument_table
):
super
(
MainArgParser
,
self
).
__init__
(
formatter_class
=
self
.
Formatter
,
add_help
=
False
,
conflict_handler
=
'resolve'
,
description
=
description
,
usage
=
usage
)
self
.
_build
(
command_table
,
version_string
,
argument_table
)
def
_create_choice_help
(
self
,
choices
):
help_str
=
''
for
choice
in
sorted
(
choices
):
help_str
+=
'* %s
\n
'
%
choice
return
help_str
def
_build
(
self
,
command_table
,
version_string
,
argument_table
):
for
argument_name
in
argument_table
:
argument
=
argument_table
[
argument_name
]
argument
.
add_to_parser
(
self
)
self
.
add_argument
(
'--version'
,
action
=
"version"
,
version
=
version_string
,
help
=
'Display the version of this tool'
)
self
.
add_argument
(
'command'
,
choices
=
list
(
command_table
.
keys
()))
class
ServiceArgParser
(
CLIArgParser
):
Usage
=
(
"aws [options] <command> <subcommand> [parameters]"
)
def
__init__
(
self
,
operations_table
,
service_name
):
super
(
ServiceArgParser
,
self
).
__init__
(
formatter_class
=
argparse
.
RawTextHelpFormatter
,
add_help
=
False
,
conflict_handler
=
'resolve'
,
usage
=
self
.
Usage
)
self
.
_build
(
operations_table
)
self
.
_service_name
=
service_name
def
_build
(
self
,
operations_table
):
self
.
add_argument
(
'operation'
,
choices
=
list
(
operations_table
.
keys
()))
class
ArgTableArgParser
(
CLIArgParser
):
"""CLI arg parser based on an argument table."""
Usage
=
(
"aws [options] <command> <subcommand> [parameters]"
)
def
__init__
(
self
,
argument_table
,
command_table
=
None
):
# command_table is an optional subcommand_table. If it's passed
# in, then we'll update the argparse to parse a 'subcommand' argument
# and populate the choices field with the command table keys.
super
(
ArgTableArgParser
,
self
).
__init__
(
formatter_class
=
self
.
Formatter
,
add_help
=
False
,
usage
=
self
.
Usage
,
conflict_handler
=
'resolve'
)
if
command_table
is
None
:
command_table
=
{}
self
.
_build
(
argument_table
,
command_table
)
def
_build
(
self
,
argument_table
,
command_table
):
for
arg_name
in
argument_table
:
argument
=
argument_table
[
arg_name
]
argument
.
add_to_parser
(
self
)
if
command_table
:
self
.
add_argument
(
'subcommand'
,
choices
=
list
(
command_table
.
keys
()),
nargs
=
'?'
)
def
parse_known_args
(
self
,
args
,
namespace
=
None
):
if
len
(
args
)
==
1
and
args
[
0
]
==
'help'
:
namespace
=
argparse
.
Namespace
()
namespace
.
help
=
'help'
return
namespace
, []
else
:
return
super
(
ArgTableArgParser
,
self
).
parse_known_args
(
args
,
namespace
)
Back
|
FazBrowse Home
|
New Git URL