edit-csv-as-yaml: preserve column order in the YAML and use >- for long text.

This commit is contained in:
Eevee 2010-12-12 19:57:55 -08:00
parent d280cfac94
commit b2746e2045

View file

@ -24,6 +24,29 @@ except ImportError:
sys.stderr.write("Please install PyYAML.\n") sys.stderr.write("Please install PyYAML.\n")
sys.exit(13) sys.exit(13)
# Try to use ordered dicts, so the YAML keys are in database table order
odict = dict # fall back to regular dict
try:
from collections import OrderedDict as odict
except ImportError:
try:
# This is a library for 2.4-2.6
from ordereddict import OrderedDict as odict
except ImportError:
pass
# Tell PyYAML how to dump our ordered dict.
# The items() is to avoid the sorting the library does automatically.
# Needs to be added to SafeDumper manually, because we use safe_dump below, and
# every Representer class has its own independent goddamn dict of these things
from yaml.dumper import SafeDumper
yaml.add_representer(
odict,
lambda dumper, data: dumper.represent_dict(data.items()),
Dumper=SafeDumper,
)
### Do actual work!
infilename, = sys.argv[1:] infilename, = sys.argv[1:]
data = [] data = []
@ -33,7 +56,7 @@ with open(infilename) as infile:
# Read data... # Read data...
for row in reader: for row in reader:
datum = dict() datum = odict()
for col, value in zip(column_names, row): for col, value in zip(column_names, row):
datum[col] = value.decode('utf-8') datum[col] = value.decode('utf-8')
@ -46,7 +69,7 @@ orig_choose_scalar_style = Emitter.choose_scalar_style
def new_choose_scalar_style(self): def new_choose_scalar_style(self):
if self.analysis is None: if self.analysis is None:
self.analysis = self.analyze_scalar(self.event.value) self.analysis = self.analyze_scalar(self.event.value)
if self.analysis.multiline: if self.analysis.multiline or len(self.analysis.scalar) > 80:
return '>' return '>'
return orig_choose_scalar_style(self) return orig_choose_scalar_style(self)
Emitter.choose_scalar_style = new_choose_scalar_style Emitter.choose_scalar_style = new_choose_scalar_style