#!/usr/bin/env python import sys import yaml import yaml.constructor as yamlc import json import optparse yamlc.SafeConstructor.add_constructor(u'tag:yaml.org,2002:timestamp', yamlc.SafeConstructor.construct_yaml_str) def construct_yaml_set(self, node): data = [] yield data value = self.construct_mapping(node) data.extend(value.keys()) yamlc.SafeConstructor.add_constructor(u'tag:yaml.org,2002:set', construct_yaml_set) parser = optparse.OptionParser() parser.add_option('-i', '--input', metavar='FILE') parser.add_option('-o', '--output', metavar='FILE') parser.add_option('-p', '--pretty', action='store_true', default=False) options, args = parser.parse_args() if len(args) >= 3: parser.exit(1, 'Too many inputs!\n') if args and (options.input or options.output): parser.exit(1, "Can't specify both args and options\n") def open_file(name, mode): try: return open(name, mode, 1) except: parser.exit(2, "Could not open file %s\n" % name) if options.input: input = open_file(options.input,'r') elif len(args) >= 1: input = open_file(args[0],'r') else: input = sys.stdin if options.output: out = open_file(options.output,'w') elif len(args) == 2: out = open_file(args[1],'w') else: out = sys.stdout indent = 2 if options.pretty else None with input, out: try: value = yaml.safe_load(input) json.dump(value, out, indent=indent) out.write('\n') except: import traceback traceback.print_exception(*sys.exc_info()) sys.exit(3) sys.exit(0)