PKSyGHPWWtransito/__init__.pyfrom . import transito def main(): '''main cli entry point''' transito.main() PKrzGb[\transito/transito.py# -*- coding: utf-8 -*- '''Command Line Tool to Work with Transit Format''' from __future__ import print_function import sys import json import argparse import pprint from StringIO import StringIO import requests from . import edn from transit.writer import Writer from transit.reader import Reader import transit.transit_types def get_arg_parser(): '''build the cli arg parser''' parser = argparse.ArgumentParser(description='Transit CLI') subparsers = parser.add_subparsers() p_t2j = subparsers.add_parser('t2j', help='convert transit to json') p_j2t = subparsers.add_parser('j2t', help='convert json to transit') p_e2t = subparsers.add_parser('e2t', help='convert edn to transit') p_t2e = subparsers.add_parser('t2e', help='convert transit to edn') p_http = subparsers.add_parser('http', help='make http requests with transit data') p_http.set_defaults(action='http') p_http.add_argument('method', help='http method to user') p_http.add_argument('url', help='url for the request') p_http.add_argument('conversion', help='input convertion (e2t etc)') p_http.add_argument('path', help='path to data file, use - to read from stdin') p_t2j.set_defaults(action='t2j') p_t2j.add_argument('path', help='path to transit file, use - to read from stdin') p_j2t.set_defaults(action='j2t') p_j2t.add_argument('path', help='path to json file, use - to read from stdin') p_e2t.set_defaults(action='e2t') p_e2t.add_argument('path', help='path to edn file, use - to read from stdin') p_t2e.set_defaults(action='t2e') p_t2e.add_argument('path', help='path to transit file, use - to read from stdin') return parser def parse_args(): '''parse arguments and return them''' parser = get_arg_parser() args = parser.parse_args() return args class EdnListHandler(object): @staticmethod def from_rep(l): return transit.transit_types.TaggedValue("list", l) class JsonListHandler(object): @staticmethod def from_rep(l): return list(l) class JsonFromRep(object): @staticmethod def from_rep(rep): return rep EDN_HANDLERS = { "list": EdnListHandler } JSON_HANDLERS = { "list": JsonListHandler, "char": JsonFromRep } def json_encode_transit(obj): if isinstance(obj, transit.transit_types.Keyword): return ":" + obj.str elif isinstance(obj, transit.transit_types.Symbol): return "~" + obj.str elif obj is transit.transit_types.true: return True elif obj is transit.transit_types.false: return False raise TypeError(repr(obj) + " is not JSON serializable") def read_transit(path, handlers=None): if path == '-': handle = sys.stdin else: handle = open(path) return read_transit_handle(handle, handlers) def read_transit_string(transit_str, handlers=None): return read_transit_handle(StringIO(transit_str), handlers) def read_transit_handle(handle, handlers=None): reader = Reader("json") if handlers: for tag, handler in handlers.items(): reader.register(tag, handler) return reader.read(handle) def read_edn(path): if path == '-': handle = sys.stdin else: handle = open(path) return edn.loads(handle.read()) def write_transit(value): sio = StringIO() writer = Writer(sio, "json") writer.write(value) return sio.getvalue() def write_json(value): return json.dumps(value, default=json_encode_transit) def write_edn(value): return edn.dumps(value) def read_json(path): if path == '-': handle = sys.stdin else: handle = open(path) return json.load(handle) def transit_to_json(args): '''handler for transit to json action''' value = read_transit(args.path, JSON_HANDLERS) return write_json(value) def transit_to_edn(args): '''handler for transit to edn action''' value = read_transit(args.path, EDN_HANDLERS) return write_edn(value) def json_to_transit(args): '''handler for json to transit action''' value = read_json(args.path) return write_transit(value) def edn_to_transit(args): '''handler for edn to transit action''' value = read_edn(args.path) return write_transit(value) def format_response(resp): lines = ["Status: " + str(resp.status_code)] for name, value in resp.headers.items(): lines.append(name + ": " + str(value)) lines.append("") try: data = read_transit_string(resp.text, EDN_HANDLERS) lines.append(write_edn(data)) except Exception: lines.append(resp.text) return "\n".join(lines) def http_req(args): '''handler for http requests''' handler = HANDLERS.get(args.conversion) if handler: body = handler(args) content_type = CONTENT_TYPE_FOR_CHAR[args.conversion[-1]] headers = {'Content-Type': content_type} req_method = getattr(requests, args.method) resp = req_method(args.url, data=body, headers=headers) return format_response(resp) else: print("handler not found for %s" % args.conversion, file=sys.stderr) return "" CONTENT_TYPE_FOR_CHAR = { 'j': 'application/json', 't': 'application/transit+json', 'e': 'application/edn' } HANDLERS = { 't2j': transit_to_json, 'j2t': json_to_transit, 'e2t': edn_to_transit, 't2e': transit_to_edn, 'http': http_req } def main(): '''cli entry point''' args = parse_args() handler = HANDLERS[args.action] print(handler(args)) PKJGE 3#3#transito/edn.pyfrom __future__ import print_function import re import ast import collections from transit.transit_types import Keyword, Symbol, TaggedValue import transit.transit_types transit_true = transit.transit_types.true transit_false = transit.transit_types.false from rply import ParserGenerator, LexerGenerator lg = LexerGenerator() SYMBOL_RE = r"[\.\*\+\!\-\_\?\$%&=a-zA-Z][\.\*\+\!\-\_\?\$%&=a-zA-Z0-9:#]*" NS_SYMBOL = SYMBOL_RE + "/" + SYMBOL_RE lg.add("boolean", r"(true|false)") lg.add("nil", r"nil") lg.add("float", r"\d+\.\d+") lg.add("number", r"[-+]?\d+") lg.add("olist", r"\(") lg.add("clist", r"\)") lg.add("omap", r"{") lg.add("cmap", r"}") lg.add("ovec", r"\[") lg.add("cvec", r"\]") lg.add("oset", r"#{") lg.add("colon", r":") lg.add("char_nl", r"\\newline") lg.add("char_tab", r"\\tab") lg.add("char_return", r"\\return") lg.add("char_space", r"\\space") lg.add("char", r"\\.") lg.add("ns_symbol", NS_SYMBOL) lg.add("symbol", SYMBOL_RE) lg.add("string", r'"(\\\^.|\\.|[^\"])*"') lg.add("tag", "#" + SYMBOL_RE) lg.ignore(r"[\s,\n]+") lg.ignore(r";.*\n") lexer = lg.build() pg = ParserGenerator(["boolean", "nil", "float", "number", "olist", "clist", "omap", "cmap", "ovec", "cvec", "oset", "colon", "char_nl", "char_tab", "char_return", "char_space", "char", "symbol", "ns_symbol", "string", "tag"]) class Char(TaggedValue): def __init__(self, rep): TaggedValue.__init__(self, 'char', rep) class List(TaggedValue): def __init__(self, rep): TaggedValue.__init__(self, 'list', rep) NL = Char('\n') TAB = Char('\t') RETURN = Char('\r') SPACE = Char(' ') class State(object): def __init__(self, tagged, accept_unknown_tags): self.tagged = tagged if tagged is not None else {} self.accept_unknown_tags = accept_unknown_tags @pg.production("main : value") def main(state, p): return p[0] @pg.production("items : value") def value_items_one(state, p): return [p[0]] @pg.production("pairs : value value pairs") def value_pairs(state, p): return [(p[0], p[1])] + p[2] @pg.production("pairs : value value") def value_pairs_one(state, p): return [(p[0], p[1])] @pg.production("items : value items") def value_items_more(state, p): return [p[0]] + p[1] @pg.production("value : oset cmap") def value_empty_set(state, p): return set() @pg.production("value : omap cmap") def value_empty_map(state, p): return {} @pg.production("value : omap pairs cmap") def value_map(state, p): return dict(p[1]) @pg.production("value : ovec cvec") def value_empty_vec(state, p): return [] @pg.production("value : olist clist") def value_empty_list(state, p): return List([]) @pg.production("value : oset items cmap") def value_set(state, p): return set(p[1]) @pg.production("value : ovec items cvec") def value_vec(state, p): return p[1] @pg.production("value : olist items clist") def value_list(state, p): return List(p[1]) @pg.production("value : number") def value_integer(state, p): return int(p[0].value) @pg.production("value : float") def value_float(state, p): return float(p[0].value) @pg.production("value : nil") def value_nil(state, p): return None @pg.production("value : boolean") def value_boolean(state, p): return p[0].value == "true" @pg.production("value : char_nl") def value_char_nl(state, p): return NL @pg.production("value : char_tab") def value_char_tab(state, p): return TAB @pg.production("value : char_return") def value_char_return(state, p): return RETURN @pg.production("value : char_space") def value_char_space(state, p): return SPACE @pg.production("value : char") def value_char(state, p): return Char(p[0].value[1]) @pg.production("value : string") def value_string(state, p): return ast.literal_eval(p[0].value) @pg.production("value : ns_symbol") def value_symbol_ns(state, p): return Symbol(p[0].value) @pg.production("value : symbol") def value_symbol(state, p): return Symbol(p[0].value) @pg.production("value : colon symbol") def value_keyword(state, p): return Keyword(p[1].value) @pg.production("value : colon ns_symbol") def value_keyword_ns(state, p): return Keyword(p[1].value) @pg.production("value : tag value") def value_tagged(state, p): tag_name = p[0].value[1:] if tag_name in state.tagged: constr = state.tagged[tag_name] return constr(p[1]) elif state.accept_unknown_tags: return TaggedValue(tag_name, p[1]) else: raise KeyError("No registered constructor for tag '{}'".format(tag_name)) parser = pg.build() def loads(code, tagged=None, accept_unknown_tags=False): state = State(tagged, accept_unknown_tags) return parser.parse(lexer.lex(code), state) CHARS = { '\t': 'tab', '\n': 'newline', '\r': 'return', ' ': 'space' } ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]') ESCAPE_DCT = { '\\': '\\\\', '"': '\\"', '\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t', } for i in range(0x20): ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i)) def encode_basestring(s): """Return a edn representation of a Python string""" def replace(match): return ESCAPE_DCT[match.group(0)] return '"' + ESCAPE.sub(replace, s) + '"' def dumps(obj): if hasattr(obj, "to_edn"): return dumps(obj.to_edn()) elif isinstance(obj, TaggedValue): if obj.tag == "list": return "(%s)" % " ".join([dumps(item) for item in obj.rep]) elif obj.tag == "char": return "\\%s" % CHARS.get(obj.rep, obj.rep) else: return "#{} {}".format(obj.tag, dumps(obj.rep)) elif isinstance(obj, (list, tuple)): return "[%s]" % " ".join([dumps(item) for item in obj]) elif isinstance(obj, dict): keyvals = ", ".join([" ".join([dumps(k), dumps(v)]) \ for k, v in obj.items()]) return "{%s}" % keyvals elif isinstance(obj, Keyword): return ":" + str(obj) elif isinstance(obj, Symbol): return str(obj) elif obj is True or obj is transit_true: return "true" elif obj is False or obj is transit_false: return "false" elif obj is None: return "nil" elif isinstance(obj, basestring): return encode_basestring(obj) elif isinstance(obj, set): return "#{%s}" % " ".join([dumps(item) for item in obj]) elif isinstance(obj, (int, float)): return str(obj) elif isinstance(obj, collections.Iterable): return "(%s)" % " ".join([dumps(item) for item in obj]) else: raise ValueError("Unknown value {} of type {}".format(obj, type(obj))) @pg.error def error_handler(token): raise ValueError("Ran into a %s where it wasn't expected" % token.gettokentype()) if __name__ == "__main__": #show_lex('{:foo 1 "bar" 1.2 :baz true false nil [1 #{}] (2 []) key #mg.value 42}') class YError(TaggedValue): def __init__(self, value): TaggedValue.__init__(self, "y.Error", value) print(loads("42")) print(loads("nil")) print(loads("true")) print(loads("false")) print(loads("1.2")) print(repr(loads(r"\tab"))) print(str(loads(r"\tab"))) print(repr(loads(r"\newline"))) print(str(loads(r"\newline"))) print(repr(loads(r"\return"))) print(str(loads(r"\return"))) print(repr(loads(r"\space"))) print(str(loads(r"\space"))) print(repr(loads(r"\s"))) print(str(loads(r"\s"))) print(loads('"a string"')) print(repr(loads("symbol"))) print(str(loads("symbol"))) print(repr(loads(":keyword"))) print(str(loads(":keyword"))) print(repr(loads("#{}"))) print(str(loads("#{}"))) print(repr(loads("#{1}"))) print(str(loads("#{1}"))) print(repr(loads("#{1 2}"))) print(str(loads("#{1 2}"))) print(repr(loads("{}"))) print(str(loads("{}"))) print(repr(loads("[]"))) print(str(loads("[]"))) print(repr(loads("[1]"))) print(str(loads("[1]"))) print(repr(loads("()"))) print(str(loads("()"))) print(repr(loads("([] () {} #{})"))) print(str(loads("([] () {} #{})"))) print(repr(loads("(1)"))) print(str(loads("(1)"))) print(repr(loads("(1 true nil)"))) print(str(loads("(1 true nil)"))) print(repr(loads("{:foo 42}"))) print(str(loads("{:foo 42}"))) print(repr(loads("{:foo 42 bar true \\a 12.3}"))) print(str(loads("{:foo 42 bar true \\a 12.3}"))) print(repr(loads("#y.Error {:foo 42}", {"y.Error": YError}))) print(str(loads("#y.Error {:foo 42}", {"y.Error": YError}))) print() print(dumps("asd")) print(dumps(loads(r'"a\"sd"'))) print(dumps(loads("(1 true nil [1.2 {:foo 42 bar true \\a 12.3 \"asd\" \\newline}])"))) print(dumps(TaggedValue("y.Error", loads('{:reason "asd" :status 500}')))) print(dumps(loads("#y.Error {:foo 42}", {"y.Error": YError}))) print(dumps(loads("#y.Error {:foo 42}", accept_unknown_tags=True))) PKKG2(transito-0.1.3.dist-info/DESCRIPTION.rst=============================== Transit CLI Tool =============================== .. image:: https://img.shields.io/pypi/v/transito.svg :target: https://pypi.python.org/pypi/transito .. image:: https://img.shields.io/travis/marianoguerra/transito.svg :target: https://travis-ci.org/marianoguerra/transito .. image:: https://readthedocs.org/projects/transito/badge/?version=latest :target: https://readthedocs.org/projects/transito/?badge=latest :alt: Documentation Status Command Line Tool to Work with Transit Format * Free software: ISC license * Documentation: https://transito.readthedocs.org. Features -------- * convert to and form json, edn, transit * read content from stdin or files Usage ----- :: $ transito -h usage: transito [-h] {t2j,j2t,e2t,t2e,http} ... Transit CLI positional arguments: {t2j,j2t,e2t,t2e,http} t2j convert transit to json j2t convert json to transit e2t convert edn to transit t2e convert transit to edn http make http requests with transit data optional arguments: -h, --help show this help message and exit Conversions ........... Convert Transit to JSON from a file:: $ transito t2j examples/ex1.transit [":keyword", "~lala", 1, 1.2, true, null, [], ["hi", "a"]] Convert Transit to JSON from stdin:: $ transito t2j - ["~#list",["~:keyword","~$lala",1,1.2,true,null,[],["hi",["~#char","a"]]]] [":keyword", "~lala", 1, 1.2, true, null, [], ["hi", "a"]] .. note:: The first line is the input, then I pressed Enter and Ctrl+D Piping from another command:: $ echo '["~#list",["~:keyword","~$lala",1,1.2,true,null,[],["hi",["~#char","a"]]]]' | transito t2j - [":keyword", "~lala", 1, 1.2, true, null, [], ["hi", "a"]] Same for Edn:: $ transito t2e examples/ex1.transit (keyword lala 1 1.2 true nil [] ["hi" \a]) :: $ echo '["~#list",["~:keyword","~$lala",1,1.2,true,null,[],["hi",["~#char","a"]]]]' | transito t2e - (keyword lala 1 1.2 true nil [] ["hi" \a]) :: $ transito t2e - ["~#list",["~:keyword","~$lala",1,1.2,true,null,[],["hi",["~#char","a"]]]] (keyword lala 1 1.2 true nil [] ["hi" \a]) you should get the idea, some with transit as output just in case:: $ transito e2t - (keyword lala 1 1.2 true nil [] ["hi" \a]) ["~#list",["~$keyword","~$lala",1,1.2,true,null,[],["hi",["~#char","a"]]]] $ transito t2j - ["~#list",["~$keyword","~$lala",1,1.2,true,null,[],["hi",["~#char","a"]]]] ["~keyword", "~lala", 1, 1.2, true, null, [], ["hi", "a"]] .. note:: to json conversions are lossy, this means that in order to not crash when serializing keywords, symbols and chars we do a lossy serialization, chars are strings, keywords are strings starting with : and symbols are strings starting with ~. The idea of this translation is to provide a way to view the edn or transit as json and shouldn't be used to send this data to a production system. HTTP Requests ............. You an make an http request that supports transit, json or edn but writting and reading the request and response in a more readable way, for example, make a request writing edn that will be transformed to transit before being sent, the response will be transformed to edn if possible to make it more readable:: $ echo '(increment {:value 20})' | transito http post http://localhost:8080/action e2t - Status: 200 Content-Type: application/transit+json Content-Length: 28 {:value [:count]} You may ask, isn't it complected? yes, yes it is. Credits ------- Tools used in rendering this package: * Cookiecutter_ * `cookiecutter-pypackage`_ .. _Cookiecutter: https://github.com/audreyr/cookiecutter .. _`cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage History ------- 0.1.3 (2015-12-01) ------------------ * add support for keywords with namespaces in edn 0.1.2 (2015-26-11) ------------------ * fix edn encoding from transit on http response 0.1.1 (2015-25-11) ------------------ * add support for http requests * fix keyword serialization in edn 0.1.0 (2015-25-11) ------------------ * First release on PyPI. PKKG^55)transito-0.1.3.dist-info/entry_points.txt[console_scripts] transito = transito.__init__:main PKKG*L11&transito-0.1.3.dist-info/metadata.json{"classifiers": ["Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: ISC License (ISCL)", "Natural Language :: English", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7"], "extensions": {"python.commands": {"wrap_console": {"transito": "transito.__init__:main"}}, "python.details": {"contacts": [{"email": "luismarianoguerra@gmail.com", "name": "Mariano Guerra", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/marianoguerra/transito"}}, "python.exports": {"console_scripts": {"transito": "transito.__init__:main"}}}, "extras": [], "generator": "bdist_wheel (0.26.0)", "keywords": ["transito"], "license": "ISCL", "metadata_version": "2.0", "name": "transito", "run_requires": [{"requires": ["requests (==2.8.1)", "rply (==0.7.4)", "transit-python (==0.8.250)"]}], "summary": "Command Line Tool to Work with Transit Format", "test_requires": [{"requires": []}], "version": "0.1.3"}PKKGE &transito-0.1.3.dist-info/top_level.txttransito PKKGndnntransito-0.1.3.dist-info/WHEELWheel-Version: 1.0 Generator: bdist_wheel (0.26.0) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any PKKGFi!transito-0.1.3.dist-info/METADATAMetadata-Version: 2.0 Name: transito Version: 0.1.3 Summary: Command Line Tool to Work with Transit Format Home-page: https://github.com/marianoguerra/transito Author: Mariano Guerra Author-email: luismarianoguerra@gmail.com License: ISCL Keywords: transito Platform: UNKNOWN Classifier: Development Status :: 2 - Pre-Alpha Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: ISC License (ISCL) Classifier: Natural Language :: English Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Requires-Dist: requests (==2.8.1) Requires-Dist: rply (==0.7.4) Requires-Dist: transit-python (==0.8.250) =============================== Transit CLI Tool =============================== .. image:: https://img.shields.io/pypi/v/transito.svg :target: https://pypi.python.org/pypi/transito .. image:: https://img.shields.io/travis/marianoguerra/transito.svg :target: https://travis-ci.org/marianoguerra/transito .. image:: https://readthedocs.org/projects/transito/badge/?version=latest :target: https://readthedocs.org/projects/transito/?badge=latest :alt: Documentation Status Command Line Tool to Work with Transit Format * Free software: ISC license * Documentation: https://transito.readthedocs.org. Features -------- * convert to and form json, edn, transit * read content from stdin or files Usage ----- :: $ transito -h usage: transito [-h] {t2j,j2t,e2t,t2e,http} ... Transit CLI positional arguments: {t2j,j2t,e2t,t2e,http} t2j convert transit to json j2t convert json to transit e2t convert edn to transit t2e convert transit to edn http make http requests with transit data optional arguments: -h, --help show this help message and exit Conversions ........... Convert Transit to JSON from a file:: $ transito t2j examples/ex1.transit [":keyword", "~lala", 1, 1.2, true, null, [], ["hi", "a"]] Convert Transit to JSON from stdin:: $ transito t2j - ["~#list",["~:keyword","~$lala",1,1.2,true,null,[],["hi",["~#char","a"]]]] [":keyword", "~lala", 1, 1.2, true, null, [], ["hi", "a"]] .. note:: The first line is the input, then I pressed Enter and Ctrl+D Piping from another command:: $ echo '["~#list",["~:keyword","~$lala",1,1.2,true,null,[],["hi",["~#char","a"]]]]' | transito t2j - [":keyword", "~lala", 1, 1.2, true, null, [], ["hi", "a"]] Same for Edn:: $ transito t2e examples/ex1.transit (keyword lala 1 1.2 true nil [] ["hi" \a]) :: $ echo '["~#list",["~:keyword","~$lala",1,1.2,true,null,[],["hi",["~#char","a"]]]]' | transito t2e - (keyword lala 1 1.2 true nil [] ["hi" \a]) :: $ transito t2e - ["~#list",["~:keyword","~$lala",1,1.2,true,null,[],["hi",["~#char","a"]]]] (keyword lala 1 1.2 true nil [] ["hi" \a]) you should get the idea, some with transit as output just in case:: $ transito e2t - (keyword lala 1 1.2 true nil [] ["hi" \a]) ["~#list",["~$keyword","~$lala",1,1.2,true,null,[],["hi",["~#char","a"]]]] $ transito t2j - ["~#list",["~$keyword","~$lala",1,1.2,true,null,[],["hi",["~#char","a"]]]] ["~keyword", "~lala", 1, 1.2, true, null, [], ["hi", "a"]] .. note:: to json conversions are lossy, this means that in order to not crash when serializing keywords, symbols and chars we do a lossy serialization, chars are strings, keywords are strings starting with : and symbols are strings starting with ~. The idea of this translation is to provide a way to view the edn or transit as json and shouldn't be used to send this data to a production system. HTTP Requests ............. You an make an http request that supports transit, json or edn but writting and reading the request and response in a more readable way, for example, make a request writing edn that will be transformed to transit before being sent, the response will be transformed to edn if possible to make it more readable:: $ echo '(increment {:value 20})' | transito http post http://localhost:8080/action e2t - Status: 200 Content-Type: application/transit+json Content-Length: 28 {:value [:count]} You may ask, isn't it complected? yes, yes it is. Credits ------- Tools used in rendering this package: * Cookiecutter_ * `cookiecutter-pypackage`_ .. _Cookiecutter: https://github.com/audreyr/cookiecutter .. _`cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage History ------- 0.1.3 (2015-12-01) ------------------ * add support for keywords with namespaces in edn 0.1.2 (2015-26-11) ------------------ * fix edn encoding from transit on http response 0.1.1 (2015-25-11) ------------------ * add support for http requests * fix keyword serialization in edn 0.1.0 (2015-25-11) ------------------ * First release on PyPI. PKKG'Ɋ88transito-0.1.3.dist-info/RECORDtransito/__init__.py,sha256=34_s00iUqPJa1ovEZUn6zTDr0N2_ovlmv1QHPJ-8IYw,87 transito/edn.py,sha256=QashtPOImDs2ngH4_1KHMccjX7yDAPB6g0NYxrvXBvw,9011 transito/transito.py,sha256=9MHCMcKANdG3qndYAQGdS4fP2oK77YIurQsfa2iyvIo,5654 transito-0.1.3.dist-info/DESCRIPTION.rst,sha256=1s2Ovc9PuEQjUxERpLZmbqyTy_1U7Ztod4APDIJ6YAo,4327 transito-0.1.3.dist-info/METADATA,sha256=57B5CPFuLj-jnmnLyrOEl1UeGNlrErIpW5xhRnVlTP8,5048 transito-0.1.3.dist-info/RECORD,, transito-0.1.3.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110 transito-0.1.3.dist-info/entry_points.txt,sha256=3SNJj1IbC3SpZG3DsD_ro9T9HnJ1AVIvuA-9moV36fw,53 transito-0.1.3.dist-info/metadata.json,sha256=HQTA1h6VovOwcwc4L603OJ4SOSB9YKtLIKORftpHS18,1073 transito-0.1.3.dist-info/top_level.txt,sha256=LwZX__jggE_sLD9QsFfjA8i-kvsmjumGlii7eBBYZZQ,9 PKSyGHPWWtransito/__init__.pyPKrzGb[\transito/transito.pyPKJGE 3#3#transito/edn.pyPKKG2(1:transito-0.1.3.dist-info/DESCRIPTION.rstPKKG^55)^Ktransito-0.1.3.dist-info/entry_points.txtPKKG*L11&Ktransito-0.1.3.dist-info/metadata.jsonPKKGE &OPtransito-0.1.3.dist-info/top_level.txtPKKGndnnPtransito-0.1.3.dist-info/WHEELPKKGFi!FQtransito-0.1.3.dist-info/METADATAPKKG'Ɋ88=etransito-0.1.3.dist-info/RECORDPK h