{ "info": { "author": "Univ Rennes / INRIA", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "Operating System :: MacOS", "Operating System :: POSIX", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet", "Topic :: Scientific/Engineering", "Topic :: Software Development :: Testing" ], "description": "TTProto ( Testing Tool Prototype)\n-----------------------------------\n\nttproto is an experimental tool for implementing testing tools, for conformance and interoperability testing.\nIt was first implemented to explore new features and concepts for the TTCN-3 standard, but we also used it to implement a passive interoperability test suite we provided for the CoAP interoperability event held in Paris in March 2012.\n\nttproto is now being used for the purpose of developing testing tools (for interoperability and conformance testing) for the [f-interop european project](http://www.f-interop.eu/)\nThis tool is implemented in python3 and its design was influenced mainly by TTCN-3 (abstract model, templates, snapshots, behavior trees, communication ports, logging) and by Scapy (syntax, flexibility, customizability)\nIts purpose is to facilitate rapid prototyping and experimentation (rather than production use). We chose to maximize its modularity and readability rather than performances and real-time considerations.\n\n# Using TTProto from CLI\n\n```\n>>> python3 -m ttproto --help\nusage: ttproto []\n\nTTProto CLI accepts the following commands:\n dissect Dissects network traces (.pcap file).\n analyze Analyses network traces (.pcap file).\n service_amqp Launches TTProto as a HTTP service (WIP).\n service_http Launches TTProto as an AMQP service.\n```\n\n\nAlso, you can get help for each subcomand:\n\n```\n>>> python3 -m ttproto dissect --help\nusage: ttproto dissect file []\n\nDissection usage examples:\n dissect ./tests/test_dumps/6lowpan_hc/TD_6LOWPAN_HC_01.pcap\n dissect ./tests/test_dumps/6lowpan_hc/TD_6LOWPAN_HC_01.pcap -o /tmp/dissection.json\n dissect ./tests/test_dumps/6lowpan_hc/TD_6LOWPAN_HC_01.pcap -p sixlowpan\n dissect ./tests/test_dumps/6lowpan_hc/TD_6LOWPAN_HC_01.pcap -p icmpv6\n dissect ./tests/test_dumps/6lowpan_hc/TD_6LOWPAN_HC_01.pcap -p icmpv6echorequest\n```\n\n## Example:\n\n```\npython3 -m ttproto dissect ./tests/test_dumps/6lowpan_hc/TD_6LOWPAN_HC_01.pcap\n\nINFO tat|ttproto_api [MainThread] Dissecting PCAP file ./tests/test_dumps/6lowpan_hc/TD_6LOWPAN_HC_01.pcap\nINFO tat|ttproto_api [MainThread] PCAP dissected\nINFO tat|main [MainThread] ###[ Ieee802154 ]###\n FrameType= 1 (Data Frame)\n SecurityEnabled= 0\n FramePending= 0\n AcknowlegeRequest= 1\n IntraPan= 1\n Reserved= 0\n DestinationAddressingMode= 3 (extended)\n FrameVersion= 0 (IEEE 802.15.4-2003)\n SourceAddressingMode= 3 (extended)\n SequenceNumber= 45\n DestinationPanId= 0xabcd\n DestinationAddress= 00:12:74:00:14:6e:f1:21\n SourcePanId= (omit)\n SourceAddress= 00:12:74:00:14:65:d8:db\n Payload=\n###[ SixLowpanIPHC ]###\n Dispatch= 0b011\n TF= 0b11 (Elided)\n NH= 0 (Inline)\n HLIM= 0b10 (Compressed hop limit = 64)\n CID= 0 (No additional context)\n SAC= 0 (Stateless)\n SAM= 0b01 (64 bits)\n M= 0 (Not Multicast)\n DAC= 0 (Stateless)\n DAM= 0b11 (0 bits (multicast: 8))\n SCI= (omit)\n DCI= (omit)\n InlineECN= (omit)\n InlineDSCP= (omit)\n InlineTFPad= (omit)\n InlineFL= (omit)\n InlineNH= 58\n InlineHLIM= (omit)\n InlineSourceAddress= 76:00:14:ff:fe:65:d8:db\n InlineDestinationAddress= (omit)\n CompressedNextHeader= (omit)\n Payload=\n###[ IPv6 ]###\n Version= 6\n TrafficClass= 0x00\n FlowLabel= 0x00000\n PayloadLength= 64\n NextHeader= 58 (ICMP for IPv6)\n HopLimit= 64\n SourceAddress= fe80::7600:14ff:fe65:d8db\n DestinationAddress= fe80::212:7400:146e:f121\n Payload=\n###[ ICMPv6EchoRequest ]###\n Type= 128 (Echo Request)\n Code= 0\n Checksum= 0x9f55\n Identifier= 0x5328\n SequenceNumber= 43\n Payload=\n###[ BytesValue ]###\n Value= b'\\x99\\xa1\\xa0W\\x00\\x00\\x00\\x00\\xaf*\\n\\x00\\x00\\x00\\x00\\x00\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&\\'()*+,-./01234567'\n FCS=\nEncoded as:\n 61 cc 2d cd ab 21 f1 6e 14 00 74 12 00 db d8 65\n 14 00 74 12 00 7a 13 3a 76 00 14 ff fe 65 d8 db\n 80 00 9f 55 53 28 00 2b 99 a1 a0 57 00 00 00 00\n af 2a 0a 00 00 00 00 00 10 11 12 13 14 15 16 17\n 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27\n 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37\n\n(...)\n```\n\n# Using TTProto core API\n\nHere some examples on how to the TTproto API used for pcap analysis:\n\nUsing the ttproto console:\n```\n python3 -i console.py\n```\n\nFor running a dissection of a PCAP file:\n```\n >>> capture = Capture('tests/test_dumps/coap_core/TD_COAP_CORE_01_PASS.pcap')\n >>> dissection = capture.get_dissection()\n >>> print(json.dumps(dissection, indent=4))\n\n [\n {\n \"_type\": \"frame\",\n \"id\": 1,\n \"timestamp\": 1464858393.547275,\n \"error\": null,\n \"protocol_stack\": [\n {\n \"_type\": \"protocol\",\n \"_protocol\": \"NullLoopback\",\n \"AddressFamily\": \"2\",\n \"ProtocolFamily\": \"0\"\n },\n {\n \"_type\": \"protocol\",\n \"_protocol\": \"IPv4\",\n \"Version\": \"4\",\n (...)\n \"SourceAddress\": \"127.0.0.1\",\n \"DestinationAddress\": \"127.0.0.1\",\n \"Options\": \"b''\"\n },\n {\n (...)\n },\n {\n \"_type\": \"protocol\",\n \"_protocol\": \"CoAP\",\n \"Version\": \"1\",\n \"Type\": \"0\",\n \"TokenLength\": \"2\",\n \"Code\": \"1\",\n \"MessageID\": \"0xaa01\",\n \"Token\": \"b'b\\\\xda'\",\n \"Options\": [\n {\n \"Option\": \"CoAPOptionUriPath\",\n \"Delta\": \"11\",\n \"Length\": \"4\",\n \"Value\": \"test\"\n },\n {\n \"Option\": \"CoAPOptionBlock2\",\n \"Delta\": \"12\",\n \"Length\": \"1\",\n \"Number\": \"0\",\n \"M\": \"0\",\n \"SizeExponent\": \"2\"\n }\n ],\n \"Payload\": \"b''\"\n }\n ]\n },\n {\n (...)\n }\n ]\n```\n\nFor running an analysis of a PCAP, interop testcase post-mortem analysis, for (e.g) TD_COAP_CORE_01:\n\n```\n >>> analyzer = Analyzer('tat_coap')\n >>> analysis_result = analyzer.analyse('tests/test_dumps/coap_core/TD_COAP_CORE_01_PASS.pcap','TD_COAP_CORE_01')\n >>> print(json.dumps(analysis_result, indent=4))\n [\n \"TD_COAP_CORE_01\",\n \"pass\",\n [],\n \" 127.0.0.1] CoAP [CON 43521] GET /test>\\n [ pass ] 127.0.0.1] CoAP [CON 43521] GET /test> Match: CoAP(type=0, code=1)\"\n ],\n [\n \"pass\",\n \" 127.0.0.1] CoAP [CON 43521] GET /test> Match: CoAP(type=0, code=1)\"\n ],\n [\n \"pass\",\n \" 127.0.0.1] CoAP [ACK 43521] 2.05 Content > Match: CoAP(code=69, mid=0xaa01, tok=b'b\\\\xda', pl=Not(b''))\"\n ],\n [\n \"pass\",\n \" 127.0.0.1] CoAP [ACK 43521] 2.05 Content > Match: CoAP(opt=Opt(CoAPOptionContentFormat()))\"\n ]\n ],\n []\n ]\n```\n\n# see more\n\n- on the detailed feature set of the library check: [ttproto features](https://www.irisa.fr/tipi/wiki/doku.php/testing_tool_prototype:features)\n- on how to write a testcase for CoAP or any other protocol see [CONTRIBUTING.rst document](https://gitlab.f-interop.eu/fsismondi/ttproto/blob/master/CONTRIBUTING.rst)\n- on the source code [gitlab repo](https://gitlab.f-interop.eu/fsismondi/ttproto)\n\n\n# The git repository contains the following testing tools:\n\n## TAT_COAP - Test Analysis Tool\n\nPassive test analysis tool for testing CoAP interoperability between 2 IUTs.\nIt uses the generic TAT structure (interfaces to extend in a simple way the tool to other protocols).\n\n### HTTP based interface\n\nThe HTTP API consists of HTTP RPC-style methods:\n\n- GET /api/v1/analyzer_getTestCases\n- GET /api/v1/analyzer_getTestcaseImplementation\n- POST /api/v1/analyzer_testCaseAnalyze\n- GET /api/v1/analyzer_getFrames\n- POST /api/v1/dissector_dissectFile (TOKEN must be provided)\n- GET /api/v1/dissector_getFrames (TOKEN must be provided)\n- GET /api/v1/dissector_getFramesSummary\n\nfor details/params refer to the tat_coap/webserver.py file\n\n### AMQP interface\n\nTAT_COAP also implements an AMQP interface. See doc for API endpoints and configuration of AMQP connection.\n\n## TS_COAP - Analysis a posteriori PCAP analyser (stable)\nPassive test analysis tool for testing interoperability between 2 IUTs. This tool provides just one feature which is analysing network camptures, which can be accesses though a python based webserver.\n\n### HTTP based interface\nrun CoAP TAT as a webserver at [127.0.0.1:2080](127.0.0.1:2080)\n```\ncd ttproto\npython3 -m ttproto.ts_coap\n```\nopen web-browser at 127.0.0.1:2080 and upload your PCAP file to be analyzed!\n\n## TS_6LoWPAN_ND - Conformance Testing Tool (WIP)\nConformance testing tool for testing 6LoWPAN ND\n\n\n# Running unit tests\n\npython3 -m pytest tests/ --ignore=tests/test_webserver/tests.py --ignore=tests/test_tat/test_webserver.py\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://www.irisa.fr/tipi/wiki/doku.php/testing_tool_prototype", "keywords": "", "license": "CeCILL", "maintainer": "Federico Sismondi", "maintainer_email": "federico.sismondi@inria.fr", "name": "ttproto", "package_url": "https://pypi.org/project/ttproto/", "platform": "", "project_url": "https://pypi.org/project/ttproto/", "project_urls": { "Homepage": "https://www.irisa.fr/tipi/wiki/doku.php/testing_tool_prototype" }, "release_url": "https://pypi.org/project/ttproto/0.1.11/", "requires_dist": [ "pyyaml", "requests", "pika" ], "requires_python": "", "summary": "ttproto is an experimental tool for implementing testingtools, for conformance and interoperability testing mainly.", "version": "0.1.11" }, "last_serial": 4380703, "releases": { "0.1.10": [ { "comment_text": "", "digests": { "md5": "2e3529de4c3b0f34150b8013db3c8c39", "sha256": "f29b8e12de8d8a53d79e1545e5fc12e23cbbdedb24e2573afe280e9116134e9d" }, "downloads": -1, "filename": "ttproto-0.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "2e3529de4c3b0f34150b8013db3c8c39", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 697899, "upload_time": "2018-10-11T13:35:09", "url": "https://files.pythonhosted.org/packages/11/8d/a70ebecaffbc4daf4580e3c3f629c473ceb1db502717276e2228c980320c/ttproto-0.1.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "425d0aa11d7d36194488f6fcf4f9d4e1", "sha256": "86af0d7284236797437c284965675b39314f68d68c7d0719bd03ef90ef54822f" }, "downloads": -1, "filename": "ttproto-0.1.10.tar.gz", "has_sig": false, "md5_digest": "425d0aa11d7d36194488f6fcf4f9d4e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 442769, "upload_time": "2018-10-11T13:35:11", "url": "https://files.pythonhosted.org/packages/c8/ab/87c589cbc47dccba292cb12229d20eaecb77b057d7698ec9e3656a460425/ttproto-0.1.10.tar.gz" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "89bea24cf2c2624325e0e9551bd4906d", "sha256": "a5c9c0e7c2802338629ebbd7f90c2578f09d740cdbf63f2a5b18ec11d68e3553" }, "downloads": -1, "filename": "ttproto-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "89bea24cf2c2624325e0e9551bd4906d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 697766, "upload_time": "2018-10-16T09:23:21", "url": "https://files.pythonhosted.org/packages/f0/5f/3d4eec0d3bcd1cc4f69f65bd4176aff035616bca5e4f18d9758207670c73/ttproto-0.1.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "300f0021fa3b1c86b45675eebe1dfdd4", "sha256": "c847048dcddb836cae5896cb02da9031f6538073fbc3b6e9323e8f3f2208eda5" }, "downloads": -1, "filename": "ttproto-0.1.11.tar.gz", "has_sig": false, "md5_digest": "300f0021fa3b1c86b45675eebe1dfdd4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 442762, "upload_time": "2018-10-16T09:23:23", "url": "https://files.pythonhosted.org/packages/40/c3/9f1b2d70da767b41922e214f8efebd1ffa209e4b80f7634318b94e0a7b29/ttproto-0.1.11.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "0eddbdbf9b510fce723953ad5620baad", "sha256": "6833870374148097ebeed8596d910eb8b5418fbe3f825fc4cf90b0c86207b3b9" }, "downloads": -1, "filename": "ttproto-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "0eddbdbf9b510fce723953ad5620baad", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 618542, "upload_time": "2018-07-10T14:39:47", "url": "https://files.pythonhosted.org/packages/ec/f6/970cb0fafbeeac9aab588f6df84d9c238a92356432dfb5b401c042e6c3b0/ttproto-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5d70fe1988c275f4b0d09460bb454c79", "sha256": "76a93814cce30a58f8c2e6c8e08ce4de5a2106c1a1fd4371af367e082fa11167" }, "downloads": -1, "filename": "ttproto-0.1.4.tar.gz", "has_sig": false, "md5_digest": "5d70fe1988c275f4b0d09460bb454c79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 405036, "upload_time": "2018-07-10T14:39:49", "url": "https://files.pythonhosted.org/packages/37/08/46a3d537669bc8c5c839f58915f109b688f6bf1161e83313cffb718dcfc3/ttproto-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "6e859b7699ff5d61c8e1c8bd7a8f0a92", "sha256": "1e1d89e40574287430cbd86a9b115974df63d08807703cdb7609790792add36f" }, "downloads": -1, "filename": "ttproto-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "6e859b7699ff5d61c8e1c8bd7a8f0a92", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 657590, "upload_time": "2018-07-11T10:04:40", "url": "https://files.pythonhosted.org/packages/f9/d9/92e94ae5aa68608dbf6a04e774adb03219f752170a130e0b914bfea6e57b/ttproto-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4c3885655b678a4788a085d5ce1e508e", "sha256": "fcde883ae6ecf23dbd2de0bcaa5472611308c6fbf2c2d9ce643a2c3ef0339f6b" }, "downloads": -1, "filename": "ttproto-0.1.5.tar.gz", "has_sig": false, "md5_digest": "4c3885655b678a4788a085d5ce1e508e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 421992, "upload_time": "2018-07-11T10:04:42", "url": "https://files.pythonhosted.org/packages/9f/cc/599ac1b44288186d87b1765e6213122115c411a6bdab65dbb66356fcfb58/ttproto-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "24393dbdd5804ab270b9847a4257f57d", "sha256": "d618a9815d8e329a564fc57b7c398270028d4e7fe1b5e0a7133f8661349336f8" }, "downloads": -1, "filename": "ttproto-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "24393dbdd5804ab270b9847a4257f57d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 657542, "upload_time": "2018-09-11T15:22:53", "url": "https://files.pythonhosted.org/packages/4a/a6/e5a2f552cb7b5a4fd6e86afd27fe2c678c4b6ef976334a3896b4b9173f13/ttproto-0.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "acb141dc9771959682de3329c440ccc6", "sha256": "199e030fa308530b772fb90f061f473a727854acb98796d647ea99aef05ed79d" }, "downloads": -1, "filename": "ttproto-0.1.6.tar.gz", "has_sig": false, "md5_digest": "acb141dc9771959682de3329c440ccc6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 422008, "upload_time": "2018-09-11T15:22:55", "url": "https://files.pythonhosted.org/packages/e7/42/551490f34abeb3ec8ec8b6db6ba47ab32c96a3b65097f898b6a8738be551/ttproto-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "5e0ee2ae08c6ec023e0e3d2aee05b25d", "sha256": "6edab37788a39d8ee0ed2a23040dcae45a58ce37a9f366189355cdb905129e65" }, "downloads": -1, "filename": "ttproto-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "5e0ee2ae08c6ec023e0e3d2aee05b25d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 697885, "upload_time": "2018-10-05T12:40:17", "url": "https://files.pythonhosted.org/packages/64/07/7fde1185ab8514431b98525895dc78a9eb43e7279b001892bb2ee99d364f/ttproto-0.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2752cbbd40460ca21b2a9d3bd4682208", "sha256": "d1f3c6c1bcae2ba609e7e4c0c98b6b69c115d5492dd9a772d63a999bf5dee963" }, "downloads": -1, "filename": "ttproto-0.1.7.tar.gz", "has_sig": false, "md5_digest": "2752cbbd40460ca21b2a9d3bd4682208", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 442788, "upload_time": "2018-10-05T12:40:19", "url": "https://files.pythonhosted.org/packages/89/56/fae8c3201f971080eeeb90b96dcbb8dad8b843e4945fafe525d18104ed4f/ttproto-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "280674b994e4e0b2b397656d95567995", "sha256": "1a41aed8249dbb466db9a4c6c245baf3a0beb2def9153cd09d19bf724ed55ea4" }, "downloads": -1, "filename": "ttproto-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "280674b994e4e0b2b397656d95567995", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 697884, "upload_time": "2018-10-05T15:07:25", "url": "https://files.pythonhosted.org/packages/14/bd/2c7710405306b6505406c0cc308f5f7824b9ae504d37ad7578e77f589f18/ttproto-0.1.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7111a48594a8e58a66dd7da1c29a343b", "sha256": "f1f482839878401f7aeb7d7a408dafe2b087a9f195b2fa254e7052aff0ff7b78" }, "downloads": -1, "filename": "ttproto-0.1.8.tar.gz", "has_sig": false, "md5_digest": "7111a48594a8e58a66dd7da1c29a343b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 442823, "upload_time": "2018-10-05T15:07:27", "url": "https://files.pythonhosted.org/packages/cd/0a/7bdd07b831dd3ea0aba4353fe16b64a37ec6e0667b9eddb23036fc8c9ec9/ttproto-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "1ff0a3a692e00edead99a4b58c5665fd", "sha256": "b09e284bf36f7b4037835fb222c4ea6b7a859768834de871039c813cb536b43a" }, "downloads": -1, "filename": "ttproto-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "1ff0a3a692e00edead99a4b58c5665fd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 697843, "upload_time": "2018-10-08T08:53:06", "url": "https://files.pythonhosted.org/packages/e4/70/9353e81ed0bd02817fa2dacd8d834aaea9df1f6b67c4719cb995b51d0714/ttproto-0.1.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "320f18cdec436541dcdc2c2d382b0feb", "sha256": "10ad08f2fb81c4677be09f72c05f54cee04bc24e41221b2fc3fb0c27b5e905f9" }, "downloads": -1, "filename": "ttproto-0.1.9.tar.gz", "has_sig": false, "md5_digest": "320f18cdec436541dcdc2c2d382b0feb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 442750, "upload_time": "2018-10-08T08:53:08", "url": "https://files.pythonhosted.org/packages/dd/2e/93345161865595bb9b882726c7364f22b8d932667a8d2ee95eb52b7dce72/ttproto-0.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "89bea24cf2c2624325e0e9551bd4906d", "sha256": "a5c9c0e7c2802338629ebbd7f90c2578f09d740cdbf63f2a5b18ec11d68e3553" }, "downloads": -1, "filename": "ttproto-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "89bea24cf2c2624325e0e9551bd4906d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 697766, "upload_time": "2018-10-16T09:23:21", "url": "https://files.pythonhosted.org/packages/f0/5f/3d4eec0d3bcd1cc4f69f65bd4176aff035616bca5e4f18d9758207670c73/ttproto-0.1.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "300f0021fa3b1c86b45675eebe1dfdd4", "sha256": "c847048dcddb836cae5896cb02da9031f6538073fbc3b6e9323e8f3f2208eda5" }, "downloads": -1, "filename": "ttproto-0.1.11.tar.gz", "has_sig": false, "md5_digest": "300f0021fa3b1c86b45675eebe1dfdd4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 442762, "upload_time": "2018-10-16T09:23:23", "url": "https://files.pythonhosted.org/packages/40/c3/9f1b2d70da767b41922e214f8efebd1ffa209e4b80f7634318b94e0a7b29/ttproto-0.1.11.tar.gz" } ] }