{ "info": { "author": "Dmitry Rodin", "author_email": "madiedinro@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# Simple ClickHouse lib\n\nVery simple ClickHouse client that simplify you interration with DBMS by using dicts as payload.\nIt contains two versions: synchronous for reguar usage and asynchronous for use with `asyncio`. Sync version internally uses low-level python http client. Both are use high-performance json serializer/parser `ujson`.\n\n## Installation\n\nInstall using `pip` from pypi repository\n\n```bash\npip install -U simplech\n```\n\nOr latest version from git \n\n```\npip install -U git+https://github.com/madiedinro/simple-clickhouse.git\n```\n\n## Connection params\n\nComes with async version `AsyncClickHouse` and sync `ClickHouse`.\n\n\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432 Rockstat, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u041e\u043d\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n```python\nfrom simplech import AsyncClickHouse\nch = AsyncClickHouse()\n```\n\n- **host:** [default: `127.0.0.1`] \u0425\u043e\u0441\u0442 \u0441 clickhouse\n- **port:** [default: `8123`] \u041f\u043e\u0440\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\n- **db:** [default: `default`] \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\n- **scheme:** [default: `http`] \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b http/https\n- **user:** [default: `default`] \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n- **password:** [default: `\"\"`] \u041f\u0430\u0440\u043e\u043b\u044c\n- **session:** [default: `False`] \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e. \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0435\u0441\u0441\u0438\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\n- **session_id:** [default: `\"\"`] \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0435\u0441\u0441\u0438\u0438 \u0432\u0437\u0430\u043c\u0435\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e\n- **dsn:** [default: `\"\"`] \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c DSN \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u043f\u0440\u0438\u043c\u0435\u0440: `http://default@127.0.0.1:8123/stats`)\n- **debug:** [default: `False`] \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u043e\u0432 \u0432 \u0440\u0435\u0436\u0438\u043c \u043e\u0442\u043b\u0430\u0434\u043a\u0438\n- **flush_every:** [default: `5`] Every X seconds data will be flushed to db\n- **buffer_limit:** [default: `1000`] \u0411\u0443\u0444\u0444\u0435\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u041f\u0440\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0411\u0414\n- **loop:** [default: `None`] \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 loop (\u0434\u043b\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438)\n- **timeout:** [default: `10`] \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445\n\n\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f `CH_DSN`, `CLICKHOUSE_DSN`, \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 DSN.\n\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 DSN: 1. \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 `dsn`, 2. `CH_DSN` 3. `CLICKHOUSE_DSN`\n\n## Async version\n\n### Selecting without decoding\n\n```python\nfrom simplech import AsyncClickHouse\n\nch = AsyncClickHouse(host='localhost', user='default')\n\nprint(await ch.select('SHOW DATABASES'))\n\n[Out]: default\n system\n```\n\n### Selecting as dict's steam\n\n\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0432 \u0432\u0438\u0434\u0435 `dict`.\n\u041a \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e `FORMAT JSONEachRow`.\n\n```python\nasync for obj in ch.objects_stream('SELECT * FROM events'):\n print(obj)\n\n[Out]: {\n 'browser_if': [0, 2],\n 'browser_sr_asp': 4000,\n 'browser_sr_avail_h': 740,\n 'browser_sr_avail_w': 360,\n 'browser_sr_oAngle': 0\n ...\n }\n ...\n```\n\n#### Disabling decoding for streaming data\n\n```python\nfrom simplech import bytes_decoder\n\nasync for obj in ch.objects_stream('SELECT * from events', decoder=none_decoder):\n print(obj)\n\n[Out]: b'{\"browser_if\": [0, 2],\"browser_sr_asp\": 4000,\"browser_sr_avail_h\": 740,\"browser_sr_avail_w\": 360,\"browser_sr_oAngle\": 0}'\n#...\n```\n\n\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c `bytes_decoder`\n\n### Executing sql statements\n\n\u0414\u043b\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0411\u0414 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f (\u043d\u0435 select) \u0441\u043b\u0443\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 `run`\n\n```python\nawait ch.run('CREATE TABLE my_table (name String, num UInt64) ENGINE=Log ')\n```\n\n\u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \"\u0440\u0443\u0447\u043d\u043e\u0439\" \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n\n```python\n>>> await ch.run('INSERT INTO my_table (name, num) VALUES(\"myname\", 7)')\n```\n\n### Microbatch writing using context manager\n\n\u0412 simplech \u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 `push`, \u043d\u043e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u044c\n\u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 \u043b\u0438\u043c\u0438\u0442\u0430 \u0431\u0443\u0444\u0444\u0435\u0440\u0430, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 `buffer_limit`.\n\n**new**\n\n```python\nwith ch.table('tablename') as w:\n for rec in recs:\n w.push(rec)\n```\n\nOn exit context all data will be flushed.\n\nOld manual conrolled mechanic.\n\n```python\nfor i in range(1, 1500):\n ch.push('my_table', {'name': 'hux', 'num': i})\nch.flush('my_table')\n\nawait ch.select('SELECT count() FROM my_table')\n\n[Out]: 1499\n```\n\n\u0414\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043c\u0435\u0442\u043e\u0434 `flush_all()`, \u043e\u043d \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u0441\u0435\u0445 \u0431\u0443\u0444\u0444\u0435\u0440\u043e\u0432.\n\n```python\nch.push('my_table', {'name': 'hux', 'num': 1})\nch.push('other_table', my_other_obj)\n# or\nch.flush_all()\n```\n\n## Some Simpe Magick\n\n### Schema detection\n\nTo create instance of TableDiscovery call\n\n```\nch.discover(table, records=None, columns=None)\n``` \n\n- records is a list with records\n- columnts is a dict where key is table columnt name / field name; value is the field data type.\n\nOne of records or columns should be filled.\n\n#### ch.discover('table_name', records=[...]) \n\n-> TableDiscovery instanse\n\n\n\n#### ch.discover('table', columns={...})\n\n```python\ntd_deals = ch.discover('deals', columns={\n 'id': 'Int64', \n 'uid': 'Int64', \n 'cid': 'String', \n 'sale': 'Int64', \n 'date': 'Date', \n 'date_time': 'DateTime', \n 'account_id': 'Int64'\n})\n```\n\nDetect using present data\n\n```python\nch = ClickHouse()\ntd = ch.discovery(deals, 'deals')\ntd.date('date').idx('account_id', 'date').metrics('sale')\n\n```\n\n#### TableDiscovery.merge_tree()\n\n```\nch.merge_tree()\n```\n\nresult \n\n```\nCREATE TABLE IF NOT EXISTS `deals` (\n `id` UInt64,\n `uid` UInt64,\n `cid` String,\n `sale` UInt64,\n `date` Date,\n `date_time` DateTime,\n `account_id` UInt64\n) ENGINE MergeTree() PARTITION BY toYYYYMM(`date`) ORDER BY (`account_id`, `date`) SETTINGS index_granularity=8192\n```\n\n\n#### Code generationm\n\nNext times after use table auto discovery you shoud use fixed layout. To to this easy try `TableDiscovery.pycode()`\n\n```python\ncode = td.pycode()\nprint(code)\n```\n\nwill be returned\n\n```\ntd = ch.discover('deals', columns={\n 'id': 'Int64', \n 'uid': 'Int64', \n 'cid': 'String', \n 'sale': 'Int64', \n 'date': 'Date', \n 'date_time': 'DateTime', \n 'account_id': 'Int64'\n})\\\n.metrics('sale')\\\n.dimensions('date_time', 'account_id', 'cid', 'uid', 'id', 'date')\\\n.date('date')\\\n.idx('account_id', 'date')\n```\n\n#### Correct detected / implicit set data-types\n\n`TableDiscovery.int(*args)` set columnts to int\n\nreturns self\n\n**Set date columns**\n\n`TableDiscovery.date(*args)`\n\nSet date column\n\nreturns self\n\n**Set str columns**\n\n`TableDiscovery.str(*args)`\n\nSet strinmg column\n\nreturns self\n\n#### Columns configuration\n\n**Set primary key columns**\n\n.idx(*args)\n\nreturns self\n\n**Set metrics**\n\n.metrics(*args)\n\nreturns self\n\nother marked as dimensions\n\n**Set dimensions**\n\n.dimensions(*args)\n\nother marked as metrics\n\n#### Print table create statement / execute query\n\ntd.merge_tree(Execute=True|False)\n\n#### Chaining\n\ntd.date('date').metrics('sale').idx('account_id', 'date')\n\n#### Discovery TODO\n\n- [ ] Support all ClickHouse types, especially Arrays\n- [ ] Discovery by DB Table structure\n\n\n```python\nwith td.table('tablename') as w:\n for rec in recs:\n w.push(rec)\n```\n\n\n### Difference handling. Be careful currently it Proof of concept\n\n#### Sync version\n\n\n```python\n\nch = ClickHouse()\n\nupd = [{'name': 'lalala', 'value': 1}, {'name': 'bababa', 'value': 2}, {'name': 'nanana', 'value': 3}]\ntd = ch.discover('test1', upd).metrics('value')\n\nd1 = '2019-01-10'\nd2 = '2019-01-13'\n\nnew_recs = []\nwith td.difference(d1, d2, upd) as d:\n for row in d:\n td.push(row)\n print(row)\n```\n\nAll records will be flushed to DB on context exit\n\n#### Async version\n\n```python\n\nch = AsyncClickHouse()\n\n# new data\nupd = [{'name': 'lalala', 'value': 1}, {'name': 'bababa', 'value': 2}, {'name': 'nanana', 'value': 3}]\ntd = ch.discover('test1', upd).metrics('value')\n\nd1 = '2019-01-10'\nd2 = '2019-01-13'\n\nasync with td.difference(d1, d2, upd) as d:\n async for row in d:\n td.push(row)\n\n# Graceful unload\nch.close()\n```\n\n#### Difference TODO\n\n- [ ] Focus on CollapsingMergeTree\n\n\n\n## \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f\n\n### \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u0440\u0430\u0437\u0443\n\n```python\nfrom simplech import ClickHouse\nch = ClickHouse(host='localhost', user='default')\nprint(ch.select('SHOW DATABASES'))\n```\n\n### \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043f\u043e\u0442\u043e\u043a\u043e\u043c\n\n```python\nfor obj in ch.objects_stream('SELECT * from events'):\n print(obj)\n```\n\n### \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 SQL \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439\n\n```python\nch.run('CREATE TABLE my_table (name String, num UInt64) ENGINE=Log ')\n```\n### \u0417\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445\n\n```python\nfor i in range(1, 1500):\n\tch.push('my_table', {'name': 'hux', 'num': i})\nch.flush('my_table')\n```\n\n\u0438\u043b\u0438\n\n```python\n>>> ch.flush_all()\n```\n\nbetter approach\n\n\n```python\n\nmy_data = [\n {'name': 'lalala', 'value': 1}, \n {'name': 'bababa', 'value': 2}, \n {'name': 'nanana'}\n]\n\nwith ch.table('mytbl') as c:\n for rec in my_data:\n c.push(record)\n```\n\nall data will be flushed on exit context\n\n## License\n\nThe MIT License (MIT)\n\nCopyright (c) 2018-2019 Dmitry Rodin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/madiedinro/simple-clickhouse", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "simplech", "package_url": "https://pypi.org/project/simplech/", "platform": "", "project_url": "https://pypi.org/project/simplech/", "project_urls": { "Homepage": "https://github.com/madiedinro/simple-clickhouse" }, "release_url": "https://pypi.org/project/simplech/0.16.5/", "requires_dist": null, "requires_python": "", "summary": "Simple ClickHouse client that simplify you interration with DBMS by using dicts as payload.", "version": "0.16.5" }, "last_serial": 5912779, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "3724028723556601249e39d8949602b6", "sha256": "1524f301a79aa77972c52c9191767bd32e3068117a5b2997d05595ac6f5ba935" }, "downloads": -1, "filename": "simplech-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3724028723556601249e39d8949602b6", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 3723, "upload_time": "2018-07-27T15:23:12", "url": "https://files.pythonhosted.org/packages/fd/d6/9c79d6ddf40a745c199dcd174e063aac53bad2839d110e3673ed7e0ea05d/simplech-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2c8af1028ce46aaf0a93ebf824db82e3", "sha256": "0c41b56a51ea9ceef2e696e52c4246dbfa2f5e908b270b7e6602214319f2d002" }, "downloads": -1, "filename": "simplech-0.1.tar.gz", "has_sig": false, "md5_digest": "2c8af1028ce46aaf0a93ebf824db82e3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4076, "upload_time": "2018-07-27T15:23:10", "url": "https://files.pythonhosted.org/packages/2e/a6/712c4ddeacff4c1079c9242b45945a36099b7f8d11956743822ec13368c7/simplech-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "491ee0d8fabeed41901d55857119c5ed", "sha256": "c5428821ee520c4179ee63fb0623a219496612d853a1edb26d7a60f06eb907b2" }, "downloads": -1, "filename": "simplech-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "491ee0d8fabeed41901d55857119c5ed", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 3909, "upload_time": "2018-08-16T18:41:40", "url": "https://files.pythonhosted.org/packages/6f/b1/d747ae0279b0dcee2e9a09a4ad3570368b721032ff0508ade2a8c3fae828/simplech-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "032daec3603f2168e2ce1f0b87971fc9", "sha256": "f783c8377f17a6fcb6b286aa69386038a072903f8f5daef17e0fbfa758498a02" }, "downloads": -1, "filename": "simplech-0.1.1.tar.gz", "has_sig": false, "md5_digest": "032daec3603f2168e2ce1f0b87971fc9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4371, "upload_time": "2018-08-16T18:41:38", "url": "https://files.pythonhosted.org/packages/3f/3e/cba3a8f16d7794907e41fb2f25c7f27184b4ad56c3498fc239e595ce6221/simplech-0.1.1.tar.gz" } ], "0.10.1": [ { "comment_text": "", "digests": { "md5": "ba594902c811c13bb8f588e4e37322aa", "sha256": "59c2cf9412453d10683086189e9031508c22a02e9da891f858d2c9cbbd8f6c10" }, "downloads": -1, "filename": "simplech-0.10.1.tar.gz", "has_sig": false, "md5_digest": "ba594902c811c13bb8f588e4e37322aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15892, "upload_time": "2019-01-17T05:59:32", "url": "https://files.pythonhosted.org/packages/40/d1/ec3777e2a7417e57614fe44e81f504aacf8cb15b09c65fd81e1db4e81114/simplech-0.10.1.tar.gz" } ], "0.13.0": [ { "comment_text": "", "digests": { "md5": "e66d07a2cd8ae781748f9d210e25009a", "sha256": "03e9319d54c08105e59925ccee390e035aee7e7b99dc5373af532f65be2a2ad7" }, "downloads": -1, "filename": "simplech-0.13.0.tar.gz", "has_sig": false, "md5_digest": "e66d07a2cd8ae781748f9d210e25009a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20526, "upload_time": "2019-01-22T09:09:32", "url": "https://files.pythonhosted.org/packages/57/78/0c854f2d62e0101e6f89dafceaf3053ea4faaf694d25c3146165ba32b25f/simplech-0.13.0.tar.gz" } ], "0.14.0": [ { "comment_text": "", "digests": { "md5": "39878d13b0d05812b95cbc94eb018e05", "sha256": "f3f43edc713b3a86e029eabb264aea70ce51cedda644683364edc070f7dad926" }, "downloads": -1, "filename": "simplech-0.14.0.tar.gz", "has_sig": false, "md5_digest": "39878d13b0d05812b95cbc94eb018e05", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21701, "upload_time": "2019-01-22T13:39:01", "url": "https://files.pythonhosted.org/packages/ea/1f/10b24e248f329eceb5c7a7f2bee5c4cec0dc34b45ff0cfb6d589a1b505bd/simplech-0.14.0.tar.gz" } ], "0.15.0": [ { "comment_text": "", "digests": { "md5": "d834db789fb3c37f88e4cc29681e85db", "sha256": "bed9b0c2de2a2b553dce0b784b54b74d6ea6090fbb2448d088b38290b24d5723" }, "downloads": -1, "filename": "simplech-0.15.0.tar.gz", "has_sig": false, "md5_digest": "d834db789fb3c37f88e4cc29681e85db", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21945, "upload_time": "2019-01-23T22:57:25", "url": "https://files.pythonhosted.org/packages/77/cd/711ca9ba7f004dbe4a084f70d0e45ae231374a0f2963361b4be865ac72cf/simplech-0.15.0.tar.gz" } ], "0.15.2": [ { "comment_text": "", "digests": { "md5": "86feee3036a7498b84157b2b9252cd1e", "sha256": "e4b7ef5711016125c5d7b8671c4dc07625e1350494d7891ff3d4bb37ffb4949a" }, "downloads": -1, "filename": "simplech-0.15.2.tar.gz", "has_sig": false, "md5_digest": "86feee3036a7498b84157b2b9252cd1e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21786, "upload_time": "2019-01-24T00:21:05", "url": "https://files.pythonhosted.org/packages/84/4f/a3d0ae4ce6741f446b6b9759fe3a96d33f0d91a37f570281dafb72e05f1d/simplech-0.15.2.tar.gz" } ], "0.15.7": [ { "comment_text": "", "digests": { "md5": "f8c418d90450ddbd3b9b70e1ca4e1c42", "sha256": "38c797b232a1efe95780a1fa164f94970d60b375f27a12739d1183ef09bfdcda" }, "downloads": -1, "filename": "simplech-0.15.7.tar.gz", "has_sig": false, "md5_digest": "f8c418d90450ddbd3b9b70e1ca4e1c42", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21838, "upload_time": "2019-01-24T16:04:07", "url": "https://files.pythonhosted.org/packages/f8/af/bac312fa187b27d70941d40344443d3c85590c8ae2e6f4d91b12517e27e0/simplech-0.15.7.tar.gz" } ], "0.16.1": [ { "comment_text": "", "digests": { "md5": "6657c7f99cd3bd3151a9525fa95e3069", "sha256": "06f3be565c84f954e856bdb34c34103ec5d880d39c61ddf0aa41d3881a98ed34" }, "downloads": -1, "filename": "simplech-0.16.1.tar.gz", "has_sig": false, "md5_digest": "6657c7f99cd3bd3151a9525fa95e3069", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22751, "upload_time": "2019-01-25T11:19:01", "url": "https://files.pythonhosted.org/packages/3b/1f/0acafd1a691035c07656756124f9561c7fadd86c82a73afd07d7ddc504a9/simplech-0.16.1.tar.gz" } ], "0.16.2": [ { "comment_text": "", "digests": { "md5": "f054277f333346520f03a95c5f2b0250", "sha256": "db0f96ecd1191eeb1fa45919c363fba91baf392c6fbc508e8e4357f8319b8c2a" }, "downloads": -1, "filename": "simplech-0.16.2.tar.gz", "has_sig": false, "md5_digest": "f054277f333346520f03a95c5f2b0250", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22750, "upload_time": "2019-01-25T13:17:52", "url": "https://files.pythonhosted.org/packages/38/ae/ac13622436e5e4617d2f3f1afc9d60f6e226a37f80deebe08fe6cf0ece62/simplech-0.16.2.tar.gz" } ], "0.16.3": [ { "comment_text": "", "digests": { "md5": "7d4b9aad805c2944c782c525c27e4ebf", "sha256": "d03354b98d794bf20fbc48c92507728bf9ffc90587c570dd1cd2163145753c20" }, "downloads": -1, "filename": "simplech-0.16.3.tar.gz", "has_sig": false, "md5_digest": "7d4b9aad805c2944c782c525c27e4ebf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23009, "upload_time": "2019-07-06T20:34:09", "url": "https://files.pythonhosted.org/packages/9a/ad/795243e26edf0a4e918d5bd6ad8bab5ad224b3e033c648fab6bee2657a28/simplech-0.16.3.tar.gz" } ], "0.16.4": [ { "comment_text": "", "digests": { "md5": "3d16b72cb47968f3e8475be5cbf9c835", "sha256": "1b163480219a2e35643fb2d342e1f1b70da22861a99e9adc53848064f2016981" }, "downloads": -1, "filename": "simplech-0.16.4.tar.gz", "has_sig": false, "md5_digest": "3d16b72cb47968f3e8475be5cbf9c835", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23005, "upload_time": "2019-07-06T20:34:11", "url": "https://files.pythonhosted.org/packages/03/48/c574dd7280abac6d89f3c49aa1a9808e528509c7290d940553a1337a4a94/simplech-0.16.4.tar.gz" } ], "0.16.5": [ { "comment_text": "", "digests": { "md5": "a2d2fec91564968cc6213a5810430396", "sha256": "57fc0423a48b49b3549f8baf21f582cb944d6f08f38ae935de025c561759b75d" }, "downloads": -1, "filename": "simplech-0.16.5.tar.gz", "has_sig": false, "md5_digest": "a2d2fec91564968cc6213a5810430396", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19368, "upload_time": "2019-10-01T14:47:04", "url": "https://files.pythonhosted.org/packages/87/7e/c816264436137c63b322fb1c4c8c1fdf6c3bee2c39941cde4ffae46b2a7b/simplech-0.16.5.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "0e694898fd14f01abbc2c22f4a857c01", "sha256": "128734579daa23eeb6dfdf28f816f3542de2b5b8a722d6d5799404d7ca3e1145" }, "downloads": -1, "filename": "simplech-0.2.0.tar.gz", "has_sig": false, "md5_digest": "0e694898fd14f01abbc2c22f4a857c01", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5664, "upload_time": "2018-10-04T03:06:39", "url": "https://files.pythonhosted.org/packages/97/59/25406af68a9de947b059a8bf97192aa123b9308b303752adcda4f3d2b7a5/simplech-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "cac3975a98159eaaaebe831eeb260523", "sha256": "7a34716b68ddbd833dbbaa196cc6852be465f2e1552768e61bc9628bb898b07e" }, "downloads": -1, "filename": "simplech-0.3.0.tar.gz", "has_sig": false, "md5_digest": "cac3975a98159eaaaebe831eeb260523", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6356, "upload_time": "2018-10-16T19:04:57", "url": "https://files.pythonhosted.org/packages/ae/db/854a6fb828564cddfdec9f2b7446ae62e88f6173c6249e5ac73120c4a893/simplech-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "3b13bbf8c07d40ef6b0a801c2447c606", "sha256": "d0c9c769648bea9f9c98e5131117a6b4bf3da1d7651ae7451344ade642ea2cf3" }, "downloads": -1, "filename": "simplech-0.3.1.tar.gz", "has_sig": false, "md5_digest": "3b13bbf8c07d40ef6b0a801c2447c606", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6389, "upload_time": "2018-10-16T19:06:54", "url": "https://files.pythonhosted.org/packages/4e/09/382dc179efddd2e84cc029a534140059cc28780f8059015c7dcbfc3103dc/simplech-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "57e301c48e03c72103624017ed3ac73d", "sha256": "a068ed7c86bd0094823e335e33da309eaee02fe8cc2ac6ed908a9d4242b17e7f" }, "downloads": -1, "filename": "simplech-0.3.2.tar.gz", "has_sig": false, "md5_digest": "57e301c48e03c72103624017ed3ac73d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6284, "upload_time": "2018-10-16T19:37:10", "url": "https://files.pythonhosted.org/packages/5a/82/a4c8cb77b721eedaaf82ce5af8053f26ee8f3487cb8f5292da6b42e30689/simplech-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "48804840819bfff8b0e532cad28adff5", "sha256": "fe55152b199f5161734672172a7c287b0ca5691b52f488d711de9ad43b85951a" }, "downloads": -1, "filename": "simplech-0.3.3.tar.gz", "has_sig": false, "md5_digest": "48804840819bfff8b0e532cad28adff5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6566, "upload_time": "2018-10-20T09:55:45", "url": "https://files.pythonhosted.org/packages/16/99/8730399191ea4e4fe810f84e9e4cc99a252d4bc2b3adc3b37999d66f9874/simplech-0.3.3.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "f4521b42dd73bacc39f15fc377c0ddc5", "sha256": "903885b1c0ffa141375b930741f1357589a964961f2c73a2ffbeff045f878c29" }, "downloads": -1, "filename": "simplech-0.4.0.tar.gz", "has_sig": false, "md5_digest": "f4521b42dd73bacc39f15fc377c0ddc5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9519, "upload_time": "2018-11-07T00:43:26", "url": "https://files.pythonhosted.org/packages/55/3c/86e6771fd80068fd33dbe1189a3043f869a3c71f7b806a2176f5885fcdb9/simplech-0.4.0.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "77848a056c3f10e8b17db6dc62ab3e3e", "sha256": "df8e1365e90244057de25525098d35582b5273305a8fe21af701188ff2916287" }, "downloads": -1, "filename": "simplech-0.4.2.tar.gz", "has_sig": false, "md5_digest": "77848a056c3f10e8b17db6dc62ab3e3e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9681, "upload_time": "2018-12-18T11:46:57", "url": "https://files.pythonhosted.org/packages/5b/fd/ae48c7086c7ddfbf5d165f964aa25addab29307d352955735730b504630d/simplech-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "409094528d0321d5cb5347d883c66774", "sha256": "ddad44dd1fb213747a2748eb8e679f908f856d9a652b2ae6f5a2601d487d0d86" }, "downloads": -1, "filename": "simplech-0.4.3.tar.gz", "has_sig": false, "md5_digest": "409094528d0321d5cb5347d883c66774", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10170, "upload_time": "2018-12-18T12:00:04", "url": "https://files.pythonhosted.org/packages/cf/0a/e631c1633a02fe0473d2535a23f98fff2330aede7ae140905b9bd2850521/simplech-0.4.3.tar.gz" } ], "0.4.4": [ { "comment_text": "", "digests": { "md5": "0ede4251d0371ebee0c38be775fe2ed9", "sha256": "666638fdf84a559f2ab308292feb7abfbdf69d3b1536bc82238d4e99927b1fa1" }, "downloads": -1, "filename": "simplech-0.4.4.tar.gz", "has_sig": false, "md5_digest": "0ede4251d0371ebee0c38be775fe2ed9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10158, "upload_time": "2018-12-22T10:09:55", "url": "https://files.pythonhosted.org/packages/23/21/c3b64c21ec97aa8247724c09807de6866c34198fa71636939530bc58c2db/simplech-0.4.4.tar.gz" } ], "0.4.5": [ { "comment_text": "", "digests": { "md5": "6292d6c9d3e8b2ba41ca025d109c838d", "sha256": "e3ebbaa97e9fd7e0ea55645764e16517b71826c0e03344fc1971e759fae88a93" }, "downloads": -1, "filename": "simplech-0.4.5.tar.gz", "has_sig": false, "md5_digest": "6292d6c9d3e8b2ba41ca025d109c838d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10172, "upload_time": "2018-12-22T11:03:43", "url": "https://files.pythonhosted.org/packages/5e/c9/59d28de908f8285dd63daf68741fd193e0ba662d8f2368ac6f29a0253a67/simplech-0.4.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a2d2fec91564968cc6213a5810430396", "sha256": "57fc0423a48b49b3549f8baf21f582cb944d6f08f38ae935de025c561759b75d" }, "downloads": -1, "filename": "simplech-0.16.5.tar.gz", "has_sig": false, "md5_digest": "a2d2fec91564968cc6213a5810430396", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19368, "upload_time": "2019-10-01T14:47:04", "url": "https://files.pythonhosted.org/packages/87/7e/c816264436137c63b322fb1c4c8c1fdf6c3bee2c39941cde4ffae46b2a7b/simplech-0.16.5.tar.gz" } ] }