@@ -364,46 +364,75 @@ def urlretrieve(url, fname):
364364def subset_meta (meta , params ):
365365 """Extract subset of parameters from meta object returned by hapi().
366366
367- ``metar = subset_meta(meta, parameters)`` modifies ``meta["parameters"]`` array
368- so that it only contains elements for the time variable and the parameters
369- in the comma-separated string ``parameters``.
367+ ``subset_meta(meta, parameters)`` modifies ``meta["parameters"]`` list
368+ in place so that it only contains elements for the time variable and the
369+ parameters in the comma-separated string ``parameters``.
370370 """
371371
372+ # Note that tests for subset_meta() are in test_subset_meta.py, which also
373+ # has tests for error message strings. If error message strings change,
374+ # update tests in test_subset_meta.py.
375+
372376 if params == '' :
373377 return meta
374378
375- p = params .split (',' )
376- pm = [] # Parameter names in metadata
379+ pw = params .split (',' ) # Wanted parameters names as list
380+
381+ # Check for duplicate parameters in pw
382+ if len (pw ) != len (set (pw )):
383+ # Print duplicate parameters
384+ duplicates = ',' .join ([x for x in pw if pw .count (x ) > 1 ])
385+ error ("Duplicate parameters in requested parameter list: '" + duplicates + "'" )
386+
387+ # Check for errors in pw
388+ for p in pw :
389+ if p == '' :
390+ error ("Empty parameter name in requested parameter list: '" + params + "'" )
391+ if p .startswith (' ' ):
392+ error ("Leading space before parameter name '" + p + "'" )
393+ if p .endswith (' ' ):
394+ error ("Trailing space after parameter name '" + p + "'" )
395+
396+ pa = [] # Available parameter names in metadata as list
377397 for i in range (0 , len (meta ['parameters' ])):
378- pm .append (meta ['parameters' ][i ]['name' ])
398+ pa .append (meta ['parameters' ][i ]['name' ])
399+
400+ # Check if meta has duplicate parameter names.
401+ if len (pa ) != len (set (pa )):
402+ duplicates = ',' .join ([x for x in pa if pa .count (x ) > 1 ])
403+ error ('Duplicate parameter names in metadata returned by server: ' + duplicates )
379404
380- # Check for parameters requested that are not in metadata
381- for i in range (0 , len (p )):
382- if p [i ] not in pm :
383- error (' Parameter %s is not in meta' % p [i ] + ' \n ' )
405+ # Check for parameters wanted that are not available
406+ for i in range (0 , len (pw )):
407+ if pw [i ] not in pa :
408+ error (" Parameter '%s' is not in metadata from server" % pw [i ])
384409 return
385410
386- pa = [meta ['parameters' ][0 ]] # First parameter is always the time parameter
411+ # Keep first parameter, which is always the primary time parameter
412+ pa = [meta ['parameters' ][0 ]]
387413
388- params_reordered = [] # Re-ordered params
389- # If time parameter explicitly requested, put it first in params_reordered .
390- if meta ['parameters' ][0 ]['name' ] in p :
391- params_reordered = [meta ['parameters' ][0 ]['name' ]]
414+ pw_reordered = [] # Re-ordered params
415+ # If time parameter explicitly requested, put it first in pw_reordered .
416+ if meta ['parameters' ][0 ]['name' ] in pw :
417+ pw_reordered = [meta ['parameters' ][0 ]['name' ]]
392418
393419 # Create subset of parameter metadata
394- for i in range (1 , len (pm )):
395- if pm [ i ] in p :
420+ for i in range (1 , len (meta [ 'parameters' ] )):
421+ if meta [ 'parameters' ][ i ][ 'name' ] in pw :
396422 pa .append (meta ['parameters' ][i ])
397- params_reordered .append (pm [i ])
398- meta ['parameters' ] = pa
423+ pw_reordered .append (meta ['parameters' ][i ]['name' ])
424+
425+ pw_reordered_str = ',' .join (pw_reordered )
399426
400- params_reordered_str = ',' .join (params_reordered )
427+ if not params == pw_reordered_str :
428+ msg = 'Order of requested parameters does not match order of '
429+ msg += 'parameters in server info metadata. '
430+ msg += "\n " + "Order requested: " + params
431+ msg += "\n " + "Order required: " + pw_reordered_str
432+ error (msg )
401433
402- if not params == params_reordered_str :
403- msg = "\n " + "Order requested: " + params
404- msg = msg + "\n " + "Order required: " + params_reordered_str
405- error ('Order of requested parameters does not match order of ' \
406- 'parameters in server info metadata.' + msg + '\n ' )
434+ # Modify meta to only include time parameter and parameters in pw.
435+ meta ['parameters' ] = pa
407436
408437 return meta
409438
0 commit comments