@@ -843,7 +843,8 @@ def __init__(self,
843
843
choices = None ,
844
844
required = False ,
845
845
help = None ,
846
- metavar = None ):
846
+ metavar = None ,
847
+ deprecated = False ):
847
848
self .option_strings = option_strings
848
849
self .dest = dest
849
850
self .nargs = nargs
@@ -854,6 +855,7 @@ def __init__(self,
854
855
self .required = required
855
856
self .help = help
856
857
self .metavar = metavar
858
+ self .deprecated = deprecated
857
859
858
860
def _get_kwargs (self ):
859
861
names = [
@@ -867,6 +869,7 @@ def _get_kwargs(self):
867
869
'required' ,
868
870
'help' ,
869
871
'metavar' ,
872
+ 'deprecated' ,
870
873
]
871
874
return [(name , getattr (self , name )) for name in names ]
872
875
@@ -889,7 +892,8 @@ def __init__(self,
889
892
choices = _deprecated_default ,
890
893
required = False ,
891
894
help = None ,
892
- metavar = _deprecated_default ):
895
+ metavar = _deprecated_default ,
896
+ deprecated = False ):
893
897
894
898
_option_strings = []
895
899
for option_string in option_strings :
@@ -927,7 +931,8 @@ def __init__(self,
927
931
choices = choices ,
928
932
required = required ,
929
933
help = help ,
930
- metavar = metavar )
934
+ metavar = metavar ,
935
+ deprecated = deprecated )
931
936
932
937
933
938
def __call__ (self , parser , namespace , values , option_string = None ):
@@ -950,7 +955,8 @@ def __init__(self,
950
955
choices = None ,
951
956
required = False ,
952
957
help = None ,
953
- metavar = None ):
958
+ metavar = None ,
959
+ deprecated = False ):
954
960
if nargs == 0 :
955
961
raise ValueError ('nargs for store actions must be != 0; if you '
956
962
'have nothing to store, actions such as store '
@@ -967,7 +973,8 @@ def __init__(self,
967
973
choices = choices ,
968
974
required = required ,
969
975
help = help ,
970
- metavar = metavar )
976
+ metavar = metavar ,
977
+ deprecated = deprecated )
971
978
972
979
def __call__ (self , parser , namespace , values , option_string = None ):
973
980
setattr (namespace , self .dest , values )
@@ -982,15 +989,17 @@ def __init__(self,
982
989
default = None ,
983
990
required = False ,
984
991
help = None ,
985
- metavar = None ):
992
+ metavar = None ,
993
+ deprecated = False ):
986
994
super (_StoreConstAction , self ).__init__ (
987
995
option_strings = option_strings ,
988
996
dest = dest ,
989
997
nargs = 0 ,
990
998
const = const ,
991
999
default = default ,
992
1000
required = required ,
993
- help = help )
1001
+ help = help ,
1002
+ deprecated = deprecated )
994
1003
995
1004
def __call__ (self , parser , namespace , values , option_string = None ):
996
1005
setattr (namespace , self .dest , self .const )
@@ -1003,14 +1012,16 @@ def __init__(self,
1003
1012
dest ,
1004
1013
default = False ,
1005
1014
required = False ,
1006
- help = None ):
1015
+ help = None ,
1016
+ deprecated = False ):
1007
1017
super (_StoreTrueAction , self ).__init__ (
1008
1018
option_strings = option_strings ,
1009
1019
dest = dest ,
1010
1020
const = True ,
1011
- default = default ,
1021
+ deprecated = deprecated ,
1012
1022
required = required ,
1013
- help = help )
1023
+ help = help ,
1024
+ default = default )
1014
1025
1015
1026
1016
1027
class _StoreFalseAction (_StoreConstAction ):
@@ -1020,14 +1031,16 @@ def __init__(self,
1020
1031
dest ,
1021
1032
default = True ,
1022
1033
required = False ,
1023
- help = None ):
1034
+ help = None ,
1035
+ deprecated = False ):
1024
1036
super (_StoreFalseAction , self ).__init__ (
1025
1037
option_strings = option_strings ,
1026
1038
dest = dest ,
1027
1039
const = False ,
1028
1040
default = default ,
1029
1041
required = required ,
1030
- help = help )
1042
+ help = help ,
1043
+ deprecated = deprecated )
1031
1044
1032
1045
1033
1046
class _AppendAction (Action ):
@@ -1042,7 +1055,8 @@ def __init__(self,
1042
1055
choices = None ,
1043
1056
required = False ,
1044
1057
help = None ,
1045
- metavar = None ):
1058
+ metavar = None ,
1059
+ deprecated = False ):
1046
1060
if nargs == 0 :
1047
1061
raise ValueError ('nargs for append actions must be != 0; if arg '
1048
1062
'strings are not supplying the value to append, '
@@ -1059,7 +1073,8 @@ def __init__(self,
1059
1073
choices = choices ,
1060
1074
required = required ,
1061
1075
help = help ,
1062
- metavar = metavar )
1076
+ metavar = metavar ,
1077
+ deprecated = deprecated )
1063
1078
1064
1079
def __call__ (self , parser , namespace , values , option_string = None ):
1065
1080
items = getattr (namespace , self .dest , None )
@@ -1077,7 +1092,8 @@ def __init__(self,
1077
1092
default = None ,
1078
1093
required = False ,
1079
1094
help = None ,
1080
- metavar = None ):
1095
+ metavar = None ,
1096
+ deprecated = False ):
1081
1097
super (_AppendConstAction , self ).__init__ (
1082
1098
option_strings = option_strings ,
1083
1099
dest = dest ,
@@ -1086,7 +1102,8 @@ def __init__(self,
1086
1102
default = default ,
1087
1103
required = required ,
1088
1104
help = help ,
1089
- metavar = metavar )
1105
+ metavar = metavar ,
1106
+ deprecated = deprecated )
1090
1107
1091
1108
def __call__ (self , parser , namespace , values , option_string = None ):
1092
1109
items = getattr (namespace , self .dest , None )
@@ -1102,14 +1119,16 @@ def __init__(self,
1102
1119
dest ,
1103
1120
default = None ,
1104
1121
required = False ,
1105
- help = None ):
1122
+ help = None ,
1123
+ deprecated = False ):
1106
1124
super (_CountAction , self ).__init__ (
1107
1125
option_strings = option_strings ,
1108
1126
dest = dest ,
1109
1127
nargs = 0 ,
1110
1128
default = default ,
1111
1129
required = required ,
1112
- help = help )
1130
+ help = help ,
1131
+ deprecated = deprecated )
1113
1132
1114
1133
def __call__ (self , parser , namespace , values , option_string = None ):
1115
1134
count = getattr (namespace , self .dest , None )
@@ -1124,13 +1143,15 @@ def __init__(self,
1124
1143
option_strings ,
1125
1144
dest = SUPPRESS ,
1126
1145
default = SUPPRESS ,
1127
- help = None ):
1146
+ help = None ,
1147
+ deprecated = False ):
1128
1148
super (_HelpAction , self ).__init__ (
1129
1149
option_strings = option_strings ,
1130
1150
dest = dest ,
1131
1151
default = default ,
1132
1152
nargs = 0 ,
1133
- help = help )
1153
+ help = help ,
1154
+ deprecated = deprecated )
1134
1155
1135
1156
def __call__ (self , parser , namespace , values , option_string = None ):
1136
1157
parser .print_help ()
@@ -1144,7 +1165,8 @@ def __init__(self,
1144
1165
version = None ,
1145
1166
dest = SUPPRESS ,
1146
1167
default = SUPPRESS ,
1147
- help = "show program's version number and exit" ):
1168
+ help = "show program's version number and exit" ,
1169
+ deprecated = False ):
1148
1170
super (_VersionAction , self ).__init__ (
1149
1171
option_strings = option_strings ,
1150
1172
dest = dest ,
@@ -1188,6 +1210,7 @@ def __init__(self,
1188
1210
self ._parser_class = parser_class
1189
1211
self ._name_parser_map = {}
1190
1212
self ._choices_actions = []
1213
+ self ._deprecated = set ()
1191
1214
1192
1215
super (_SubParsersAction , self ).__init__ (
1193
1216
option_strings = option_strings ,
@@ -1198,7 +1221,7 @@ def __init__(self,
1198
1221
help = help ,
1199
1222
metavar = metavar )
1200
1223
1201
- def add_parser (self , name , ** kwargs ):
1224
+ def add_parser (self , name , * , deprecated = False , * *kwargs ):
1202
1225
# set prog from the existing prefix
1203
1226
if kwargs .get ('prog' ) is None :
1204
1227
kwargs ['prog' ] = '%s %s' % (self ._prog_prefix , name )
@@ -1226,6 +1249,10 @@ def add_parser(self, name, **kwargs):
1226
1249
for alias in aliases :
1227
1250
self ._name_parser_map [alias ] = parser
1228
1251
1252
+ if deprecated :
1253
+ self ._deprecated .add (name )
1254
+ self ._deprecated .update (aliases )
1255
+
1229
1256
return parser
1230
1257
1231
1258
def _get_subactions (self ):
@@ -1241,21 +1268,25 @@ def __call__(self, parser, namespace, values, option_string=None):
1241
1268
1242
1269
# select the parser
1243
1270
try :
1244
- parser = self ._name_parser_map [parser_name ]
1271
+ subparser = self ._name_parser_map [parser_name ]
1245
1272
except KeyError :
1246
1273
args = {'parser_name' : parser_name ,
1247
1274
'choices' : ', ' .join (self ._name_parser_map )}
1248
1275
msg = _ ('unknown parser %(parser_name)r (choices: %(choices)s)' ) % args
1249
1276
raise ArgumentError (self , msg )
1250
1277
1278
+ if parser_name in self ._deprecated :
1279
+ parser ._warning (_ ("command '%(parser_name)s' is deprecated" ) %
1280
+ {'parser_name' : parser_name })
1281
+
1251
1282
# parse all the remaining options into the namespace
1252
1283
# store any unrecognized options on the object, so that the top
1253
1284
# level parser can decide what to do with them
1254
1285
1255
1286
# In case this subparser defines new defaults, we parse them
1256
1287
# in a new namespace object and then update the original
1257
1288
# namespace for the relevant parts.
1258
- subnamespace , arg_strings = parser .parse_known_args (arg_strings , None )
1289
+ subnamespace , arg_strings = subparser .parse_known_args (arg_strings , None )
1259
1290
for key , value in vars (subnamespace ).items ():
1260
1291
setattr (namespace , key , value )
1261
1292
@@ -1975,6 +2006,7 @@ def _parse_known_args(self, arg_strings, namespace):
1975
2006
# converts arg strings to the appropriate and then takes the action
1976
2007
seen_actions = set ()
1977
2008
seen_non_default_actions = set ()
2009
+ warned = set ()
1978
2010
1979
2011
def take_action (action , argument_strings , option_string = None ):
1980
2012
seen_actions .add (action )
@@ -2070,6 +2102,10 @@ def consume_optional(start_index):
2070
2102
# the Optional's string args stopped
2071
2103
assert action_tuples
2072
2104
for action , args , option_string in action_tuples :
2105
+ if action .deprecated and option_string not in warned :
2106
+ self ._warning (_ ("option '%(option)s' is deprecated" ) %
2107
+ {'option' : option_string })
2108
+ warned .add (option_string )
2073
2109
take_action (action , args , option_string )
2074
2110
return stop
2075
2111
@@ -2089,6 +2125,10 @@ def consume_positionals(start_index):
2089
2125
for action , arg_count in zip (positionals , arg_counts ):
2090
2126
args = arg_strings [start_index : start_index + arg_count ]
2091
2127
start_index += arg_count
2128
+ if args and action .deprecated and action .dest not in warned :
2129
+ self ._warning (_ ("argument '%(argument_name)s' is deprecated" ) %
2130
+ {'argument_name' : action .dest })
2131
+ warned .add (action .dest )
2092
2132
take_action (action , args )
2093
2133
2094
2134
# slice off the Positionals that we just parsed and return the
@@ -2650,3 +2690,7 @@ def error(self, message):
2650
2690
self .print_usage (_sys .stderr )
2651
2691
args = {'prog' : self .prog , 'message' : message }
2652
2692
self .exit (2 , _ ('%(prog)s: error: %(message)s\n ' ) % args )
2693
+
2694
+ def _warning (self , message ):
2695
+ args = {'prog' : self .prog , 'message' : message }
2696
+ self ._print_message (_ ('%(prog)s: warning: %(message)s\n ' ) % args , _sys .stderr )
0 commit comments