2626
2727class ParamError (Exception ):
2828 def __init__ (self , param , message ):
29- full_message = ("Error parsing parameter %s, should be : %s" %
29+ full_message = ("Error parsing parameter %s: %s" %
3030 (param .cli_name , message ))
3131 super (ParamError , self ).__init__ (full_message )
3232 self .param = param
33+ self .message = message
3334
3435
3536class ParamSyntaxError (Exception ):
@@ -129,7 +130,7 @@ def __call__(self, param, value, **kwargs):
129130 if doc_fn is None :
130131 raise e
131132 else :
132- raise ParamError (param , doc_fn (param ))
133+ raise ParamError (param , "should be: %s" % doc_fn (param ))
133134 return parsed
134135
135136 def get_parse_method_for_param (self , param , value = None ):
@@ -353,12 +354,13 @@ def unpack_cli_arg(parameter, value):
353354def unpack_complex_cli_arg (parameter , value ):
354355 if parameter .type == 'structure' or parameter .type == 'map' :
355356 if value .lstrip ()[0 ] == '{' :
356- d = json .loads (value , object_pairs_hook = OrderedDict )
357- else :
358- msg = 'The value for parameter "%s" must be JSON or path to file.' % (
359- parameter .cli_name )
360- raise ValueError (msg )
361- return d
357+ try :
358+ return json .loads (value , object_pairs_hook = OrderedDict )
359+ except ValueError as e :
360+ raise ParamError (
361+ parameter , "Invalid JSON: %s\n JSON received: %s"
362+ % (e , value ))
363+ raise ParamError (parameter , "Invalid JSON:\n %s" % value )
362364 elif parameter .type == 'list' :
363365 if isinstance (value , six .string_types ):
364366 if value .lstrip ()[0 ] == '[' :
@@ -367,7 +369,14 @@ def unpack_complex_cli_arg(parameter, value):
367369 single_value = value [0 ].strip ()
368370 if single_value and single_value [0 ] == '[' :
369371 return json .loads (value [0 ], object_pairs_hook = OrderedDict )
370- return [unpack_cli_arg (parameter .members , v ) for v in value ]
372+ try :
373+ return [unpack_cli_arg (parameter .members , v ) for v in value ]
374+ except ParamError as e :
375+ # The list params don't have a name/cli_name attached to them
376+ # so they will have bad error messages. We're going to
377+ # attach the parent parmeter to this error message to provide
378+ # a more helpful error message.
379+ raise ParamError (parameter , e .message )
371380
372381
373382def unpack_scalar_cli_arg (parameter , value ):
@@ -381,7 +390,7 @@ def unpack_scalar_cli_arg(parameter, value):
381390 file_path = os .path .expanduser (file_path )
382391 if not os .path .isfile (file_path ):
383392 msg = 'Blob values must be a path to a file.'
384- raise ValueError ( msg )
393+ raise ParamError ( parameter , msg )
385394 return open (file_path , 'rb' )
386395 elif parameter .type == 'boolean' :
387396 if isinstance (value , str ) and value .lower () == 'false' :
0 commit comments