Last active
November 21, 2018 10:58
-
-
Save saily/f8a9f72c6b064d51f09040d66e981240 to your computer and use it in GitHub Desktop.
Restore JSON hierarchy in Weblate PRE_COMMIT_SCRIPTS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python2.7 | |
# -*- coding: utf-8 -*- | |
import argparse | |
import codecs | |
import json | |
__author__ = 'Daniel Widerin <[email protected]>' | |
__license__ = 'MIT' | |
class HierarchicalDict(dict): | |
def __init__(self, *args, **kwargs): | |
self.update(*args, **kwargs) | |
def __setitem__(self, key, val): | |
dict.__setitem__(self, key, val) | |
def update(self, *args, **kwargs): | |
for key, val in dict(*args, **kwargs).items(): | |
keys = key.split('.') | |
if len(keys) > 1: | |
self._decode(keys, val) | |
else: | |
self[key] = val | |
def _decode(self, keys, value): | |
storage = self | |
for key0 in keys[:-1]: | |
if key not in storage: | |
storage[key] = {} | |
storage = storage[key] | |
storage[keys[-1]] = value | |
def main(): | |
parser = argparse.ArgumentParser( | |
description='Recover flattened json file.') | |
parser.add_argument( | |
'files', metavar='FILE', type=str, nargs='+', | |
help='Files to process') | |
parser.add_argument( | |
'--indent', default=4, type=int, dest='indent', | |
help='json indentation for outfile') | |
args = parser.parse_args() | |
for filename in args.files: | |
try: | |
raw = codecs.open(filename, 'r', encoding='utf-8').read() | |
data = json.loads(raw, object_pairs_hook=HierarchicalDict) | |
with codecs.open(filename, 'w', encoding='utf-8') as outfile: | |
json.dump(data, outfile, | |
sort_keys=True, | |
indent=args.indent, | |
ensure_ascii=False) | |
except Exception as ex: | |
print('Error processing {0:s}'.format(filename), ex) | |
if __name__ == '__main__': | |
main() |
@rolinh should work fine on python3
Thanks for the script!
But line 30 should be:
for key in keys[:-1]:
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for this script!
What about changing this line:
#!/usr/bin/env python2.7
into
#!/usr/bin/env python
And using 2to3 to make it possible to run it on either version of python?