1212# language governing permissions and limitations under the License.
1313"""Module for processing CLI args."""
1414import os
15- import json
1615import logging
1716import six
1817
18+ from botocore .compat import OrderedDict , json
19+
1920from awscli import utils
2021from awscli import SCALAR_TYPES , COMPLEX_TYPES
2122
@@ -243,7 +244,7 @@ def _key_value_parse(self, param, value):
243244 # that is, csv key value pairs, where the key and values
244245 # are separated by '='. All of this should be whitespace
245246 # insensitive.
246- parsed = {}
247+ parsed = OrderedDict ()
247248 parts = self ._split_on_commas (value )
248249 valid_names = self ._create_name_to_params (param )
249250 for part in parts :
@@ -253,18 +254,19 @@ def _key_value_parse(self, param, value):
253254 raise ParamSyntaxError (part )
254255 key = key .strip ()
255256 value = value .strip ()
256- if key not in valid_names :
257+ if valid_names and key not in valid_names :
257258 raise ParamUnknownKeyError (param , key , valid_names )
258- sub_param = valid_names [key ]
259- if sub_param is not None :
260- value = unpack_scalar_cli_arg (sub_param , value )
259+ if valid_names :
260+ sub_param = valid_names [key ]
261+ if sub_param is not None :
262+ value = unpack_scalar_cli_arg (sub_param , value )
261263 parsed [key ] = value
262264 return parsed
263265
264266 def _create_name_to_params (self , param ):
265267 if param .type == 'structure' :
266268 return dict ([(p .name , p ) for p in param .members ])
267- elif param .type == 'map' :
269+ elif param .type == 'map' and hasattr ( param . keys , 'enum' ) :
268270 return dict ([(v , None ) for v in param .keys .enum ])
269271
270272 def _docs_list_scalar_list_parse (self , param ):
@@ -351,7 +353,7 @@ def unpack_cli_arg(parameter, value):
351353def unpack_complex_cli_arg (parameter , value ):
352354 if parameter .type == 'structure' or parameter .type == 'map' :
353355 if value .lstrip ()[0 ] == '{' :
354- d = json .loads (value )
356+ d = json .loads (value , object_pairs_hook = OrderedDict )
355357 else :
356358 msg = 'The value for parameter "%s" must be JSON or path to file.' % (
357359 parameter .cli_name )
@@ -360,11 +362,11 @@ def unpack_complex_cli_arg(parameter, value):
360362 elif parameter .type == 'list' :
361363 if isinstance (value , six .string_types ):
362364 if value .lstrip ()[0 ] == '[' :
363- return json .loads (value )
365+ return json .loads (value , object_pairs_hook = OrderedDict )
364366 elif isinstance (value , list ) and len (value ) == 1 :
365367 single_value = value [0 ].strip ()
366368 if single_value and single_value [0 ] == '[' :
367- return json .loads (value [0 ])
369+ return json .loads (value [0 ], object_pairs_hook = OrderedDict )
368370 return [unpack_cli_arg (parameter .members , v ) for v in value ]
369371
370372
0 commit comments