PKIIG22 jsonfile.py""" jsonfile - incrementally write files in JSON format. """ import json import enum from functools import partial, update_wrapper __version__ = "1.0.1" @enum.unique class State(enum.Enum): List = ('', ',', 'List', ']') ListStart = ('[', '', 'List', ']') DictBeforeKey = ('', ',', 'DictBeforeValue', '}') DictBeforeValue = ('', ':', 'DictBeforeKey', NotImplemented) DictStart = ('{', '', 'DictBeforeValue', '}') TopLevel = ('', '', 'ExtraTopLevel', '') ExtraTopLevel = ('', NotImplemented, 'ExtraTopLevel', '') def __init__(self, on_enter, before_item, state_on_item_str, on_exit): self.on_enter = on_enter self.before_item = before_item self.state_on_item_str = state_on_item_str self.on_exit = on_exit @property def state_on_item(self): return type(self)[self.state_on_item_str] class JsonProto: """ Incrementally generate a file in JSON format. """ def __init__(self): """ """ self.context = [State.TopLevel] def _before_item(self): old = self.swap_state(self.top_state.state_on_item) return old.before_item def _start_container(self, state): self.push_state(state) return state.on_enter def start_list(self): return ( self._before_item() + self._start_container(State.ListStart) ) def toplevel_item(self, item): """ If your file only contains one item, why are using this library? But in any case, you can write one item using this. """ assert self.top_state == State.TopLevel return self._any_item(item) def _any_item(self, item): return ( self._before_item() + json.dumps(item) ) def list_item(self, item): assert self.top_state in (State.List, State.ListStart) return self._any_item(item) def _end_container(self): return self.context.pop().on_exit def end_list(self): assert self.top_state in (State.List, State.ListStart) return self._end_container() def start_dict(self): return ( self._before_item() + self._start_container(State.DictStart) ) def dict_item(self, key, value): assert self.top_state in (State.DictStart, State.DictBeforeKey) return (self.dict_key(key) + self.dict_value(value)) def dict_key(self, key): assert self.top_state in (State.DictStart, State.DictBeforeKey) return self._any_item(key) def dict_value(self, value): assert self.top_state == State.DictBeforeValue return self._any_item(value) def end_dict(self): assert self.top_state in (State.DictBeforeKey, State.DictStart) return self._end_container() @property def top_state(self): return self.context[-1] def swap_state(self, new_state): old = self.top_state self.context[-1] = new_state return old def push_state(self, new_state): self.context.append(new_state) @property def done(self): return len(self.context) == 1 def finish_all(self): parts = [] while not self.done: parts.append(self._end_container()) return ''.join(parts) class JsonWriter: def __init__(self, out): self.protocol = JsonProto() self.out = out def _write_proto_result(self, method, *args, **kwargs): result = method(*args, **kwargs) assert type(result) is str self.out.write(result) def __getattr__(self, name): value = getattr(self.protocol, name) if callable(value): writer = partial(self._write_proto_result, value) update_wrapper(writer, value) return writer else: return value PK!H;@QPjsonfile-1.0.1.dist-info/WHEEL1 0 RZq+D-Dv;_[*7Fp ܦpv/fݞoL(*IPK!H jk !jsonfile-1.0.1.dist-info/METADATAQS6)v܍cz{qZ\Shal-$99w'a#/\z9SF.: UQH[? `J ^y k<O9OsX[H?MRf`}⃃Le5RSl~V)jG:~=_eA R18ٯ:HE2J*eэ.jS0'c[.S dq ,W)wDQq\N07%eiG{aMfeQ(gn7ӮΔ1P6Ux8: x5jι"IJUNIB뒋baS.U͚e8Inx+Pj~)}-P2EBm*H:Gb*o#m_dXU*''U*ӫ#?H%/ ӓ-m"}=abqZ3ktD \ qxyI8PEi?wWv&DT_ooTۜٛ }+nOḧ?ӵ*ݱ><5pAWoMˋ]m _^y^r{kc.G!yfar[# öI:G[G4y ~a2"*- (<~3ꖦ"ڣ`*_V,(I#3Yh>rpNhS9"\2w#=^ʋ6!\eKf3[cƿ2;si49kLA6ڞ Ix&š {#)mjz6vi5ShҶ}pSC9j"qf͜5#M')'(|D2JK攠Fƌ΅cMAE=!FYԄIsD ްap*Q?PK!H jsonfile-1.0.1.dist-info/RECORD}^02ͅx0aЈRNfwc}5p4RG/ɣ|T%gmWSĕ,~`3XLӁuX74qgQs;,lml\,ea\p.Ig1})xrIϘ2vs/VD!*Օյ1|Z[Ԓ"ԡ)^S/PKIIG22 jsonfile.pyPK!H;@QP[jsonfile-1.0.1.dist-info/WHEELPK!H jk !jsonfile-1.0.1.dist-info/METADATAPK!H jsonfile-1.0.1.dist-info/RECORDPK!