Methods to work with `crop_tree` representation: load/dump from/to a directory.
%load_ext autoreload
%autoreload 2
logger = logging.getLogger()
# def _cut_to_chunks(L: List[Any], n) -> List[List[Any]]:
# assert n > 0
# return [
# L[i: i+n] + [None]*(n - len(L[i: i+n]))
# for i in range(0, len(L), n)
# ]
# assert res == [[1, 2, 3, 4], [5, 6, 7, None]]
# res = _cut_to_chunks([1,2,3,4,5,6,7], 3)
# assert res == [[1, 2, 3], [4, 5, 6], [7, None, None]], res
# res = _cut_to_chunks([1,2,3,4,5,6,7], 2)
# assert res == [[1, 2], [3, 4], [5, 6], [7, None]], res
# res = _cut_to_chunks([1,2,3,4,5,6,7], 1)
# assert res == [[1], [2], [3], [4], [5], [6], [7]], res
# res = _cut_to_chunks([], 2)
# assert res == []
crop_files = ! ls {DST}/crops
some_crops = ! ls {DST}/crops/{crop_files[0]}
! echo {some_crops}
deleted_crop = some_crops[0]
! rm {DST}/crops/{crop_files[0]}/{deleted_crop}
! ls {DST}/crops/{crop_files[0]}
d2 = load_crop_tree(DST, d)
assert deleted_crop not in d2.to_json(), (deleted_crop, d2.to_json())