Skip to content

Instantly share code, notes, and snippets.

@CodyKochmann
Created October 4, 2023 13:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CodyKochmann/9f3965515ad9051cab514f5a6d5656fb to your computer and use it in GitHub Desktop.
Save CodyKochmann/9f3965515ad9051cab514f5a6d5656fb to your computer and use it in GitHub Desktop.
This script takes a json object from stdin and turns it into a directory tree of files.
#!/usr/bin/env python3
# by: Cody Kochmann
# created: 2023-10-01
# license: MIT
'''
This script takes a json object from stdin and turns it into a directory tree of files.
'''
import sys, json, os, contextlib
@contextlib.contextmanager
def pushd(dir):
assert isinstance(dir, str), dir
assert os.path.isdir(dir), dir
current_directory = os.getcwd()
try:
print(f'{current_directory} -> {dir}', file=sys.stderr)
os.chdir(dir)
yield
finally:
print(f'{current_directory} <- {dir}', file=sys.stderr)
os.chdir(current_directory)
def is_collection(o):
return isinstance(o, (list, dict))
def write_to_file(obj, key):
assert isinstance(obj, str), obj
assert isinstance(key, str), key
print(f'writing {obj} to {key}', file=sys.stderr)
with open(key, 'w') as f:
f.write(obj)
def materialize_str(obj, key):
assert isinstance(obj, str), obj
assert isinstance(key, str), key
return write_to_file(obj, key)
def materialize_int(obj, key):
assert isinstance(obj, int), obj
assert isinstance(key, str), key
return write_to_file(str(obj), key)
def materialize_float(obj, key):
assert isinstance(obj, float), obj
assert isinstance(key, str), key
return write_to_file(str(obj), key)
def materialize_bool(obj, key):
assert isinstance(obj, bool), obj
assert isinstance(key, str), key
return write_to_file(str(obj), key)
def materialize_none(obj, key):
assert isinstance(obj, type(None)), obj
assert isinstance(key, str), key
return write_to_file(str(obj), key)
def materialize_list(obj):
assert isinstance(obj, list), obj
for i, v in enumerate(obj):
if is_collection(v):
os.mkdir(str(i))
with pushd(str(i)):
materialize(v)
else:
materialize(v, str(i))
def materialize_dict(obj):
assert isinstance(obj, dict), obj
for i, v in obj.items():
if is_collection(v):
os.mkdir(str(i))
with pushd(str(i)):
materialize(v)
else:
materialize(v, str(i))
def materialize(o, *key):
assert isinstance(o, (list,dict,int,str,bool,float,type(None))), o
materializer = {
list: materialize_list,
dict: materialize_dict,
int: materialize_int,
float: materialize_float,
str: materialize_str,
bool: materialize_bool,
type(None): materialize_none
}[type(o)]
if len(key) == 0:
return materializer(o)
else:
assert len(key) == 1, key
return materializer(o, *key)
def main():
data = json.loads(sys.stdin.read())
return materialize(data)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment