Change all of the explicit backslash line continuations into implicit line continuations. This isn't strictly required by flake8 Clean up all the issues with overly long lines introduced since my last cleanup. Fix some whitespace issues. Ignore py2-specific code causing an issue for the py3 lint in tests/decoding_test.py
57 lines
1.5 KiB
Python
Executable File
57 lines
1.5 KiB
Python
Executable File
"""Decodes toml and outputs it as tagged JSON"""
|
|
|
|
import datetime
|
|
import json
|
|
import sys
|
|
import toml
|
|
|
|
if sys.version_info < (3,):
|
|
_range = xrange # noqa: F821
|
|
iteritems = dict.iteritems
|
|
else:
|
|
unicode = str
|
|
_range = range
|
|
basestring = str
|
|
unichr = chr
|
|
iteritems = dict.items
|
|
long = int
|
|
|
|
|
|
def tag(value):
|
|
if isinstance(value, dict):
|
|
d = {}
|
|
for k, v in iteritems(value):
|
|
d[k] = tag(v)
|
|
return d
|
|
elif isinstance(value, list):
|
|
a = []
|
|
for v in value:
|
|
a.append(tag(v))
|
|
try:
|
|
a[0]["value"]
|
|
except KeyError:
|
|
return a
|
|
except IndexError:
|
|
pass
|
|
return {'type': 'array', 'value': a}
|
|
elif isinstance(value, basestring):
|
|
return {'type': 'string', 'value': value}
|
|
elif isinstance(value, bool):
|
|
return {'type': 'bool', 'value': str(value).lower()}
|
|
elif isinstance(value, int):
|
|
return {'type': 'integer', 'value': str(value)}
|
|
elif isinstance(value, long):
|
|
return {'type': 'integer', 'value': str(value)}
|
|
elif isinstance(value, float):
|
|
return {'type': 'float', 'value': repr(value)}
|
|
elif isinstance(value, datetime.datetime):
|
|
sdate = value.strftime('%Y-%m-%dT%H:%M:%SZ')
|
|
return {'type': 'datetime', 'value': sdate}
|
|
assert False, 'Unknown type: %s' % type(value)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
tdata = toml.loads(sys.stdin.read())
|
|
tagged = tag(tdata)
|
|
print(json.dumps(tagged))
|