1 """Command line interface to f90nml. 3 :copyright: Copyright 2017 Marshall Ward, see AUTHORS for details. 4 :license: Apache License, Version 2.0, see LICENSE for details 6 from __future__
import print_function
13 from StringIO
import StringIO
15 from io
import StringIO
17 from collections
import OrderedDict
19 from ordereddict
import OrderedDict
28 represent_dict_order = (
lambda self, data:
29 self.represent_mapping(
'tag:yaml.org,2002:map',
31 yaml.add_representer(OrderedDict, represent_dict_order)
38 """Parse the command line input arguments.""" 39 parser = argparse.ArgumentParser()
41 parser.add_argument(
'--version', action=
'version',
42 version=
'f90nml {0}'.format(f90nml.__version__))
44 parser.add_argument(
'--group',
'-g', action=
'store')
45 parser.add_argument(
'--variable',
'-v', action=
'append')
46 parser.add_argument(
'--patch',
'-p', action=
'store_true')
47 parser.add_argument(
'--format',
'-f', action=
'store')
48 parser.add_argument(
'--output',
'-o', action=
'store')
50 parser.add_argument(
'input', nargs=
'?')
51 parser.add_argument(
'output', nargs=
'?')
53 if len(sys.argv) == 1:
57 args = parser.parse_args()
59 input_fname = args.input
60 output_fname = args.output
65 _, input_ext = os.path.splitext(input_fname)
66 if input_ext ==
'.json':
68 elif input_ext ==
'.yaml':
76 valid_formats = (
'json',
'yaml',
'nml')
77 if args.format
and args.format
not in valid_formats:
78 print(
'f90nml: error: format must be one of the following: {0}' 79 ''.format(valid_formats), file=sys.stderr)
86 _, output_ext = os.path.splitext(output_fname)
87 if output_ext ==
'.json':
89 elif output_ext
in (
'.yaml',
'.yml'):
96 output_fmt = args.format
99 if (input_fmt ==
'yaml' or output_fmt ==
'yaml')
and not has_yaml:
100 print(
'f90nml: error: YAML module could not be found.',
105 if any(fmt !=
'nml' for fmt
in (input_fmt, output_fmt))
and args.patch:
106 print(
'f90nml: error: Only namelist files can be patched.',
112 if input_fmt
in (
'json',
'yaml'):
113 if input_fmt ==
'json':
114 with open(input_fname)
as input_file:
115 input_data = json.load(input_file)
116 elif input_ext ==
'.yaml':
117 with open(input_fname)
as input_file:
118 input_data = yaml.safe_load(input_file)
131 grp = list(input_data.keys())[0]
132 print(
'f90nml: warning: Assuming variables are in group \'{0}\'.' 133 ''.format(grp), file=sys.stderr)
137 update_nml_str =
'&{0} {1} /\n'.format(grp,
', '.join(args.variable))
138 update_io = StringIO(update_nml_str)
143 output_file = open(output_fname,
'w')
if output_fname
else sys.stdout
156 input_data[grp].update(update_nml[grp])
158 input_data[grp] = update_nml[grp]
162 if output_fmt
in (
'json',
'yaml'):
163 if output_fmt ==
'json':
164 input_data = input_data.todict(complex_tuple=
True)
165 json.dump(input_data, output_file,
166 indent=4, separators=(
',',
': '))
167 output_file.write(
'\n')
169 elif output_fmt ==
'yaml':
170 input_data = input_data.todict(complex_tuple=
True)
171 yaml.dump(input_data, output_file,
172 default_flow_style=
False)
178 if output_file != sys.stdout:
def patch(nml_path, nml_patch, out_path=None)
def write(nml, nml_path, force=False, sort=False)