{ "info": { "author": "Tim van der Hulst", "author_email": "tim.vdh@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: System Administrators", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3" ], "description": "# Peewee Syncer\n\n [![PyPI version](https://badge.fury.io/py/peewee-syncer.svg)](https://badge.fury.io/py/peewee-syncer) [![Python 3.6](https://img.shields.io/badge/python-3.6-blue.svg)](https://www.python.org/downloads/release/python-360/) [![Python 3.6](https://img.shields.io/badge/python-3.7-blue.svg)](https://www.python.org/downloads/release/python-370/)\n\n\nTiny tool to help syncronize data using peewee db model for state persistance.\n\nCan work with uniquely id'd records (eg auto insert id's) or non unique (ie dates/timestamps)\nUse `is_unique_key=False` for non unique (see unit tests~)\nIf limit is reached `offset` is used to get over the \"hump\" (ie bulk updates have been done on your table)\n\nSee (towards end) for AsyncIO Support\n\n## Install\n\n```\npip install peewee-syncer\n```\n\n## Usage\n\nNote example below uses `upsert_db_bulk()` helper.\nThis requires sqlite 3.25+ for Upsert support * \n\nEg \n\nDownload: https://packages.debian.org/search?keywords=libsqlite3-0\n\n```\n sudo dkpk -i libsqlite3-0_3.27.2-2~bpo9+1_amd64.deb \n```\n\n```\nimport os\nimport logging\nfrom functools import partial\nfrom peewee import SqliteDatabase, Model, CharField\nfrom peewee_syncer.utils import upsert_db_bulk\nfrom peewee_syncer import get_sync_manager, SyncManager, Processor, LastOffsetQueryIterator\n\n\nlog = logging.getLogger(__name__)\n\n\ntry:\n os.remove('test.db')\nexcept FileNotFoundError:\n pass\n\ndb = SqliteDatabase('test.db')\n\n\nSyncManager.init_db(db)\n\n# Run once\nSyncManager.create_table()\n\n# A model to sync (could be anything, not peewee specific)\nclass MyModel(Model):\n\n name = CharField()\n\n # Method to compare/track\n @classmethod\n def get_key(cls, item):\n return item.id\n\n # Method to get records from last offset\n @classmethod\n def select_since_id(cls, since, limit, offset=None):\n q = cls.select().where(cls.id > since)\n\n if limit:\n q = q.limit(limit)\n\n return q\n\n class Meta:\n database = db\n\n\nMyModel.create_table()\n\n\n# Start at zero for first run (otherwise start=None to continue from previous position)\nsync_manager = get_sync_manager(app=\"my-sync-service\", start=0)\n\n\n# A model to sync to (could be anything, not peewee specific)\nclass MySyncModel(Model):\n\n some_name = CharField()\n\n class Meta:\n database = db\n\n\n# A function to map the output to be synced\ndef row_output(model):\n return {'id': model.id, 'some_name': model.name}\n\n\nMySyncModel.create_table()\n\n\n# Iterator Function\ndef it(since, limit):\n q = MyModel.select_since_id(since, limit=limit)\n return LastOffsetQueryIterator(q.iterator(),\n # Function to convert to output\n row_output_fun=row_output,\n # Function to check the key of current record we are processing\n key_fun=MyModel.get_key,\n # The key is unique/atomic (use False if processing time based records as can have many for each key)\n is_unique_key=True\n )\n\n\n# Processor\nprocessor = Processor(\n sync_manager=sync_manager,\n it_function=it,\n # A process function (iterates over the iterator)\n process_function=partial(upsert_db_bulk, MySyncModel, preserve=['some_name'], conflict_target='id'),\n # Pause up to 1 seconds on each iteration (percentage of records vs limit processed)\n sleep_duration=1\n )\n\n\n# Add some records\nfor i in range(25):\n MyModel.create(id=i, name=\"test_{}\".format(i))\n\nlog.info(\"MySyncModel has {} records\".format(MySyncModel.select().count()))\n\n# Run (batch of ten, five iterations. set i=0 to run forever)\nprocessor.process(limit=10, i=5)\n\nlog.info(\"MySyncModel has {} records\".format(MySyncModel.select().count()))\n\n```\n\nOutput\n\n```\npeewee DEBUG ('CREATE TABLE IF NOT EXISTS \"sync_manager\" (\"app\" VARCHAR(256) NOT NULL PRIMARY KEY, \"meta\" TEXT NOT NULL, \"modified\" DATETIME)', [])\npeewee DEBUG ('CREATE TABLE IF NOT EXISTS \"mymodel\" (\"id\" INTEGER NOT NULL PRIMARY KEY, \"name\" VARCHAR(255) NOT NULL)', [])\npeewee DEBUG ('SELECT \"t1\".\"app\", \"t1\".\"meta\", \"t1\".\"modified\" FROM \"sync_manager\" AS \"t1\" WHERE (\"t1\".\"app\" = ?) LIMIT ? OFFSET ?', ['my-sync-service', 1, 0])\npeewee DEBUG ('BEGIN', None)\npeewee DEBUG ('INSERT INTO \"sync_manager\" (\"app\", \"meta\", \"modified\") VALUES (?, ?, ?)', ['my-sync-service', '{}', datetime.datetime(2019, 6, 4, 16, 10, 18, 603755)])\npeewee DEBUG ('UPDATE \"sync_manager\" SET \"meta\" = ?, \"modified\" = ? WHERE (\"sync_manager\".\"app\" = ?)', ['{\"value\": 0, \"type\": null, \"offset\": 0}', datetime.datetime(2019, 6, 4, 16, 10, 18, 609370), 'my-sync-service'])\npeewee DEBUG ('CREATE TABLE IF NOT EXISTS \"mysyncmodel\" (\"id\" INTEGER NOT NULL PRIMARY KEY, \"some_name\" VARCHAR(255) NOT NULL)', [])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [0, 'test_0'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [1, 'test_1'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [2, 'test_2'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [3, 'test_3'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [4, 'test_4'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [5, 'test_5'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [6, 'test_6'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [7, 'test_7'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [8, 'test_8'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [9, 'test_9'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [10, 'test_10'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [11, 'test_11'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [12, 'test_12'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [13, 'test_13'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [14, 'test_14'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [15, 'test_15'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [16, 'test_16'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [17, 'test_17'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [18, 'test_18'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [19, 'test_19'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [20, 'test_20'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [21, 'test_21'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [22, 'test_22'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [23, 'test_23'])\npeewee DEBUG ('INSERT INTO \"mymodel\" (\"id\", \"name\") VALUES (?, ?)', [24, 'test_24'])\npeewee DEBUG ('SELECT COUNT(1) FROM (SELECT 1 FROM \"mysyncmodel\" AS \"t1\") AS \"_wrapped\"', [])\n__main__ INFO MySyncModel has 0 records\npeewee DEBUG ('SELECT \"t1\".\"id\", \"t1\".\"name\" FROM \"mymodel\" AS \"t1\" WHERE (\"t1\".\"id\" > ?) LIMIT ?', [0, 10])\npeewee DEBUG ('INSERT INTO \"mysyncmodel\" (\"id\", \"some_name\") VALUES (?, ?), (?, ?), (?, ?), (?, ?), (?, ?), (?, ?), (?, ?), (?, ?), (?, ?), (?, ?) ON CONFLICT (\"id\") DO UPDATE SET \"some_name\" = EXCLUDED.\"some_name\"', [1, 'test_1', 2, 'test_2', 3, 'test_3', 4, 'test_4', 5, 'test_5', 6, 'test_6', 7, 'test_7', 8, 'test_8', 9, 'test_9', 10, 'test_10'])\npeewee_syncer DEBUG Processed records n=10 offset=10\npeewee DEBUG ('UPDATE \"sync_manager\" SET \"meta\" = ?, \"modified\" = ? WHERE (\"sync_manager\".\"app\" = ?)', ['{\"value\": 10, \"type\": null, \"offset\": 0}', datetime.datetime(2019, 6, 4, 16, 10, 18, 837385), 'my-sync-service'])\npeewee DEBUG ('SELECT \"t1\".\"id\", \"t1\".\"name\" FROM \"mymodel\" AS \"t1\" WHERE (\"t1\".\"id\" > ?) LIMIT ?', [10, 10])\npeewee DEBUG ('INSERT INTO \"mysyncmodel\" (\"id\", \"some_name\") VALUES (?, ?), (?, ?), (?, ?), (?, ?), (?, ?), (?, ?), (?, ?), (?, ?), (?, ?), (?, ?) ON CONFLICT (\"id\") DO UPDATE SET \"some_name\" = EXCLUDED.\"some_name\"', [11, 'test_11', 12, 'test_12', 13, 'test_13', 14, 'test_14', 15, 'test_15', 16, 'test_16', 17, 'test_17', 18, 'test_18', 19, 'test_19', 20, 'test_20'])\npeewee_syncer DEBUG Processed records n=10 offset=20\npeewee DEBUG ('UPDATE \"sync_manager\" SET \"meta\" = ?, \"modified\" = ? WHERE (\"sync_manager\".\"app\" = ?)', ['{\"value\": 20, \"type\": null, \"offset\": 0}', datetime.datetime(2019, 6, 4, 16, 10, 18, 855367), 'my-sync-service'])\npeewee DEBUG ('SELECT \"t1\".\"id\", \"t1\".\"name\" FROM \"mymodel\" AS \"t1\" WHERE (\"t1\".\"id\" > ?) LIMIT ?', [20, 10])\npeewee DEBUG ('INSERT INTO \"mysyncmodel\" (\"id\", \"some_name\") VALUES (?, ?), (?, ?), (?, ?), (?, ?) ON CONFLICT (\"id\") DO UPDATE SET \"some_name\" = EXCLUDED.\"some_name\"', [21, 'test_21', 22, 'test_22', 23, 'test_23', 24, 'test_24'])\npeewee_syncer DEBUG Processed records n=4 offset=24\npeewee DEBUG ('UPDATE \"sync_manager\" SET \"meta\" = ?, \"modified\" = ? WHERE (\"sync_manager\".\"app\" = ?)', ['{\"value\": 24, \"type\": null, \"offset\": 0}', datetime.datetime(2019, 6, 4, 16, 10, 18, 874314), 'my-sync-service'])\npeewee DEBUG ('SELECT \"t1\".\"id\", \"t1\".\"name\" FROM \"mymodel\" AS \"t1\" WHERE (\"t1\".\"id\" > ?) LIMIT ?', [24, 10])\npeewee_syncer DEBUG Caught up, sleeping..\npeewee DEBUG ('SELECT \"t1\".\"id\", \"t1\".\"name\" FROM \"mymodel\" AS \"t1\" WHERE (\"t1\".\"id\" > ?) LIMIT ?', [24, 10])\npeewee_syncer DEBUG Caught up, sleeping..\npeewee_syncer DEBUG Stopping after iteration 5\npeewee_syncer INFO Completed processing\npeewee DEBUG ('SELECT COUNT(1) FROM (SELECT 1 FROM \"mysyncmodel\" AS \"t1\") AS \"_wrapped\"', [])\n__main__ INFO MySyncModel has 24 records\n\n\n```\n\n## AsyncIO\n\nUses peewee-async (https://github.com/05bit/peewee-async)\nNote: SQLite not supported yet: see https://github.com/05bit/peewee-async/issues/126\n\n\n```\npip install peewee-syncer[async]\n```\n\nor (includes `aiopg`)\n\n```\npip install peewee-syncer[async-pg]\n```\n\nor (includes `aiomysql`)\n\n```\npip install peewee-syncer[async-mysql]\n```\n\n\n```\nfrom peewee_syncer import get_sync_manager, AsyncProcessor\n\ndb_object = Manager(db, loop=None)\n\ndef it(since=None, limit=None):\n\n log.debug(\"Getting iterator since={} limit={}\".format(since, limit))\n\n def dummy():\n for x in range(since+1, since+limit+1):\n log.debug(\"yielded {}\".format(x))\n yield {\"x\": x}\n\n return LastOffsetQueryIterator(dummy(), row_output_fun=lambda x:x, key_fun=lambda x:x['x'], is_unique_key=True)\n\noutput = []\n\nasync def process(it):\n nonlocal output\n for item in it:\n output.append(item)\n log.debug(\"process item: {}\".format(item))\n\n\nprocessor = AsyncProcessor(\n sync_manager=sync_manager,\n it_function=it,\n process_function=process,\n object=db_object\n)\n\nasync def consume():\n await processor.process(limit=10, i=3)\n\n\nasyncio.get_event_loop().run_until_complete(consume())\n\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://github.com/hampsterx/peewee-syncer", "keywords": "", "license": "Apache2", "maintainer": "", "maintainer_email": "", "name": "peewee-syncer", "package_url": "https://pypi.org/project/peewee-syncer/", "platform": "", "project_url": "https://pypi.org/project/peewee-syncer/", "project_urls": { "Homepage": "https://github.com/hampsterx/peewee-syncer" }, "release_url": "https://pypi.org/project/peewee-syncer/0.2.4/", "requires_dist": [ "peewee (>=3.8.1)", "python-dateutil (>=2.7.5)", "backoff (>=1.8.0)", "peewee-async (==0.6.0a0) ; extra == 'async'", "peewee-asyn (==0.6.0a0) ; extra == 'async-mysql'", "aiomysql (>=0.0.20) ; extra == 'async-mysql'", "peewee-asyn (==0.6.0a0) ; extra == 'async-pg'", "aiopg (>=0.16.0) ; extra == 'async-pg'" ], "requires_python": "", "summary": "Tiny Sync tool using Peewee Models for persistance", "version": "0.2.4" }, "last_serial": 5844363, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "dcdea145082d708a92c87b468d01bdc0", "sha256": "2e57ac2a29b9b02f5b6b37b2aa2b6059ee4f81b86e3924f03a0a21a5a99ad417" }, "downloads": -1, "filename": "peewee_syncer-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "dcdea145082d708a92c87b468d01bdc0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 3983, "upload_time": "2019-03-14T02:15:29", "url": "https://files.pythonhosted.org/packages/2e/12/5d8c635820330397c8c8de4aff719f14c28cb8c0f74577198901c121fe34/peewee_syncer-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2a74b0d48763ee1c40bb3e1ed583629f", "sha256": "929060e7134570041a34bbcda625d08b70b44f914b08418d39f5388611379db6" }, "downloads": -1, "filename": "peewee-syncer-0.0.1.tar.gz", "has_sig": false, "md5_digest": "2a74b0d48763ee1c40bb3e1ed583629f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3017, "upload_time": "2019-03-14T02:15:31", "url": "https://files.pythonhosted.org/packages/8e/a1/01bf8c6222be370c101a144c20fa78db2c2be83e6697da4391b7469c1afe/peewee-syncer-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "8e8775387a8b46322f39d7c4065a15ff", "sha256": "4c4e8f809e03746dd99edd92d559f14c3112489dc3dcba43fadf7462533bf5b3" }, "downloads": -1, "filename": "peewee_syncer-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "8e8775387a8b46322f39d7c4065a15ff", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4235, "upload_time": "2019-03-14T19:41:24", "url": "https://files.pythonhosted.org/packages/49/a8/d5631f05423f5604af6b4f281f0e83723d152d27ca414759baac30f73928/peewee_syncer-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "159ded1dbdacc5a7a7780389ee5d156b", "sha256": "0bc5a158fcefdfbb3dfc2644e8318d6c4c3e6f3eb685e4807b4185415905eda7" }, "downloads": -1, "filename": "peewee-syncer-0.0.2.tar.gz", "has_sig": false, "md5_digest": "159ded1dbdacc5a7a7780389ee5d156b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3271, "upload_time": "2019-03-14T19:41:27", "url": "https://files.pythonhosted.org/packages/c4/5f/7af305de2f90e82f37c30dae30413d75d7ec994dd28f48e4209109a1e936/peewee-syncer-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "c5213e95c2f7024a48fd8a034f0b1021", "sha256": "f8954b2f99f8d9a6c358d4829f23ab2696a8fde3cddd92d496a1a74e2a508d5b" }, "downloads": -1, "filename": "peewee_syncer-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "c5213e95c2f7024a48fd8a034f0b1021", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4232, "upload_time": "2019-03-15T01:43:21", "url": "https://files.pythonhosted.org/packages/82/14/b2823ed6258823a1e3ad68fe456d0942d00e1d7617213a6f110abb5289fc/peewee_syncer-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b5c854b05b53fd735d53e1ab403c4ef4", "sha256": "13879783cdff172216eb5460678ddb602c9c893ff3d93d4266705878ac5cbbf3" }, "downloads": -1, "filename": "peewee-syncer-0.0.3.tar.gz", "has_sig": false, "md5_digest": "b5c854b05b53fd735d53e1ab403c4ef4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3242, "upload_time": "2019-03-15T01:43:24", "url": "https://files.pythonhosted.org/packages/02/4e/142a3506112942cbca74d0ee2f392aa9e8db3c6a890e870a4fbdcc3521e1/peewee-syncer-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "829adc5efaacf54fc8c60ac547d15ac9", "sha256": "71cae33c3e4b7da067f5ccf5944943cec6f97eee881483b8066b81689e9952b1" }, "downloads": -1, "filename": "peewee_syncer-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "829adc5efaacf54fc8c60ac547d15ac9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6493, "upload_time": "2019-06-04T04:20:21", "url": "https://files.pythonhosted.org/packages/59/87/9b579194feac4becb01cd065eebb50c40f2e562fc0f9316cd61f22942a48/peewee_syncer-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "91d9cccce7f49cd15b2b6265f4a06100", "sha256": "267cc24884956f2c0f4e9497d523c596c3bb106bd71d9ac9e91565a61f684a97" }, "downloads": -1, "filename": "peewee-syncer-0.0.4.tar.gz", "has_sig": false, "md5_digest": "91d9cccce7f49cd15b2b6265f4a06100", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6084, "upload_time": "2019-06-04T04:20:22", "url": "https://files.pythonhosted.org/packages/8a/ab/0220c44b152eb7c095accb2e13f9b03b41f8010b4b3bd0444fc97d95acca/peewee-syncer-0.0.4.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "b156ae48e4c6b7af709ec8d080f59328", "sha256": "fffb180b51a079c96845128f0af5ea160c2f11c31e7893d13e8beedbbb121f99" }, "downloads": -1, "filename": "peewee_syncer-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b156ae48e4c6b7af709ec8d080f59328", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7257, "upload_time": "2019-06-17T23:27:59", "url": "https://files.pythonhosted.org/packages/67/b5/38d1171bf360682dd98018392cc606e8401d15b5322140903327ebf2bb18/peewee_syncer-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6ec05d6f0903eec51cbd006a68807662", "sha256": "956ed0881d7db453a816d2a86573c77bec8525cfe80a76415234246d334d5678" }, "downloads": -1, "filename": "peewee-syncer-0.1.0.tar.gz", "has_sig": false, "md5_digest": "6ec05d6f0903eec51cbd006a68807662", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6966, "upload_time": "2019-06-17T23:28:01", "url": "https://files.pythonhosted.org/packages/be/b2/a78578bdea7c2b1fc8f34d26a4330212d673d4ed65edc785925d719a21e4/peewee-syncer-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "9ee4c3e88fe57ec9d5365a8df150281d", "sha256": "276622ebbc73b874f8a6c0cf6049d36f49ef50ef07e0f305bf7f79e005c717a4" }, "downloads": -1, "filename": "peewee_syncer-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "9ee4c3e88fe57ec9d5365a8df150281d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7296, "upload_time": "2019-06-18T00:19:41", "url": "https://files.pythonhosted.org/packages/6d/4f/e4a5a21ed31279d70602315122649e3118bb3479bba081c473dbb876dbff/peewee_syncer-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "03a5b9fd38a3d1d30535b6bf62b7da8b", "sha256": "af1ea50073159a2ffcd9a47ef2a08e8cc2385b39560f73d93a8063ee81d3ecf5" }, "downloads": -1, "filename": "peewee-syncer-0.1.1.tar.gz", "has_sig": false, "md5_digest": "03a5b9fd38a3d1d30535b6bf62b7da8b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7005, "upload_time": "2019-06-18T00:19:42", "url": "https://files.pythonhosted.org/packages/6e/8f/1ffb11291d02c27ed6363d09d1e5872b71cf74394c773a5f13a95bae3a84/peewee-syncer-0.1.1.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "6441e7dc955f2096f0182df65ff98576", "sha256": "3b51f6bd4c2849a12f18e818740c386dac64b2e07a6c8f3b55323c6dcedece26" }, "downloads": -1, "filename": "peewee_syncer-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "6441e7dc955f2096f0182df65ff98576", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7415, "upload_time": "2019-06-24T20:25:36", "url": "https://files.pythonhosted.org/packages/b5/54/f401f203db5d8194c1f488bb3616c1f365f2010d27a5d6b2301af4693d72/peewee_syncer-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "88a1d2e1281bca7905840d04ac309f60", "sha256": "040eb890bdc41fe7e30d65e5fc41c1c02066a480270d972785a8e63839580a41" }, "downloads": -1, "filename": "peewee-syncer-0.1.3.tar.gz", "has_sig": false, "md5_digest": "88a1d2e1281bca7905840d04ac309f60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7949, "upload_time": "2019-06-24T20:25:37", "url": "https://files.pythonhosted.org/packages/46/15/de2bc161f446f1b614af26f3f953c7e406c5a382bbcfb14ce2808c265f91/peewee-syncer-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "7b0bf1c82876abfe82b98d5277c2c300", "sha256": "d1988fb54abedaad66c2774110f1ebf2288fdc71a936aa7a63347154acb5f3e7" }, "downloads": -1, "filename": "peewee_syncer-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "7b0bf1c82876abfe82b98d5277c2c300", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7436, "upload_time": "2019-06-26T01:30:22", "url": "https://files.pythonhosted.org/packages/6c/5c/304e27a7a73bd98be532183df4dd874fca5d279a7b7229f7759cc836ade4/peewee_syncer-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4d306f4506cfe64710b68060c1c206cb", "sha256": "c31dd1957095689a0592a145701642ae58e7db66c64869515903a842409d2052" }, "downloads": -1, "filename": "peewee-syncer-0.1.4.tar.gz", "has_sig": false, "md5_digest": "4d306f4506cfe64710b68060c1c206cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8035, "upload_time": "2019-06-26T01:30:24", "url": "https://files.pythonhosted.org/packages/6d/75/291526c7ed6259d16fce21634ce4684960f9a9b7a73322ba8f0f603eafce/peewee-syncer-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "20d8a56670054ae6d29097f67aa2737f", "sha256": "f8d10160ac4ee3d1d9276441dc16f9922b7260cba6816458ccd51130da01cd83" }, "downloads": -1, "filename": "peewee_syncer-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "20d8a56670054ae6d29097f67aa2737f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7529, "upload_time": "2019-07-01T20:00:07", "url": "https://files.pythonhosted.org/packages/55/c0/7e9d28068310b3e8b54b5016d3a48c411b8d488487c89330aaed086ac636/peewee_syncer-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fa121ae48442437b2531f45e1756afe0", "sha256": "100e1fa3ad2ee78acb67bc97abe0cc508d351562b1e1c28cba872309b82829fc" }, "downloads": -1, "filename": "peewee-syncer-0.1.5.tar.gz", "has_sig": false, "md5_digest": "fa121ae48442437b2531f45e1756afe0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8078, "upload_time": "2019-07-01T20:00:09", "url": "https://files.pythonhosted.org/packages/88/c3/83fd9c7b919e82389a1951837e87e6ffc32e89fb62757ee6bc774151b9ee/peewee-syncer-0.1.5.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "f40c22e54de59a127b3ffc60cc8fbb15", "sha256": "40ba30d16cec787745ddca4ba5276b3d0556ee21e2db0de18e4727c32920516c" }, "downloads": -1, "filename": "peewee_syncer-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f40c22e54de59a127b3ffc60cc8fbb15", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7658, "upload_time": "2019-07-02T02:13:43", "url": "https://files.pythonhosted.org/packages/68/f3/703373625570f839c852ef3dd6713f2759b38f8a1dbd421646928170d8c2/peewee_syncer-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d9929fb87fd5f43b4d7b4bc9e650357a", "sha256": "cbdb9c587285ef38295cc173c98a521e865f45b5a841013672105fd1cca3de99" }, "downloads": -1, "filename": "peewee-syncer-0.2.0.tar.gz", "has_sig": false, "md5_digest": "d9929fb87fd5f43b4d7b4bc9e650357a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8235, "upload_time": "2019-07-02T02:13:44", "url": "https://files.pythonhosted.org/packages/34/65/16ece784b47a372ad3ab27746c49b5e6833a1b0138e3d222c78d64d40b43/peewee-syncer-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "ceb696e1ccff7cb213f006096c2b8242", "sha256": "64352af1fca49a4c45fc852200e5f844678a1ce5b307cf9956a8bbe7ba9d0816" }, "downloads": -1, "filename": "peewee_syncer-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ceb696e1ccff7cb213f006096c2b8242", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7737, "upload_time": "2019-07-02T23:57:03", "url": "https://files.pythonhosted.org/packages/b0/a7/825fee4c8aeb0440485acc0799ad614b1b50fc51de3de716367fdc70ffed/peewee_syncer-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6d75299cce31d9198ece0000d2ad209f", "sha256": "46a8603c168ea27ec405ee2193b46476de329c29e37cd4dd6e1a960b3412bac7" }, "downloads": -1, "filename": "peewee-syncer-0.2.1.tar.gz", "has_sig": false, "md5_digest": "6d75299cce31d9198ece0000d2ad209f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8310, "upload_time": "2019-07-02T23:57:05", "url": "https://files.pythonhosted.org/packages/34/ae/86353887382eac8a8ee5886fed4f01d0fe90f9f13c46c5181e564c10e1c2/peewee-syncer-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "f99f3b1aae6b4b2fcbcb8c8a2bd2ade2", "sha256": "1058e9a4ee25abc6bae3b6266d6923b8754d2adfd7fb24955db5092e0a91753c" }, "downloads": -1, "filename": "peewee_syncer-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "f99f3b1aae6b4b2fcbcb8c8a2bd2ade2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7780, "upload_time": "2019-07-03T01:48:29", "url": "https://files.pythonhosted.org/packages/58/47/3fac659ce6febb674ee6b53e6703d2c688a778ab0c8cda38be1ca2fb37ae/peewee_syncer-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9201d70c7ba824ba4f5ebab68f9ffca3", "sha256": "a4d2634db9f49fded3575941c65e4d194bd7d520c59b900eab11376fe95c09d1" }, "downloads": -1, "filename": "peewee-syncer-0.2.2.tar.gz", "has_sig": false, "md5_digest": "9201d70c7ba824ba4f5ebab68f9ffca3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8337, "upload_time": "2019-07-03T01:48:31", "url": "https://files.pythonhosted.org/packages/16/90/f6154c07db7b60091e85a30051dae7db785cb87e6da69979a5c6c35ccfd9/peewee-syncer-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "9aadc3ec94d38e6b44eff1783d8559ea", "sha256": "6cca0d8fe579d60355560551f71dd5c1a91944654e4b12b69bb43d66bba9f4f1" }, "downloads": -1, "filename": "peewee_syncer-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "9aadc3ec94d38e6b44eff1783d8559ea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7853, "upload_time": "2019-09-09T22:33:29", "url": "https://files.pythonhosted.org/packages/b2/b3/598c51278c0ba94e272f7e49d4d4cb7a549f91901377b2aef70768a5b2b3/peewee_syncer-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "72f0643f1fe2e68ad66e2487af77c340", "sha256": "fd5accae3805383c15605ab696d8f6dcd04b2409e547862727fad0d2aac47458" }, "downloads": -1, "filename": "peewee-syncer-0.2.3.tar.gz", "has_sig": false, "md5_digest": "72f0643f1fe2e68ad66e2487af77c340", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8414, "upload_time": "2019-09-09T22:33:31", "url": "https://files.pythonhosted.org/packages/61/34/729c43b2eeec11bae6805e131bc083b6d20df5ff5e2748f9522a7a7799fd/peewee-syncer-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "3cef5a930fcfa313655857c5b6e1e684", "sha256": "c769a39cb9d83e3b5aaa1899d4672e52d0aebcb88e468605602cac1cdefc1f88" }, "downloads": -1, "filename": "peewee_syncer-0.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "3cef5a930fcfa313655857c5b6e1e684", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7916, "upload_time": "2019-09-17T22:31:15", "url": "https://files.pythonhosted.org/packages/58/91/1f6ad341185c9b2c0ad5db9fe8a5e24c2b1e77c4f81ffb074832cdfa605f/peewee_syncer-0.2.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "91f57cfa06d2f52d740ca24eacb05a46", "sha256": "d4055c8bdd08d3d9ef3de6b812cbfea1eec86ce103a0cf8877797b7fd976ebad" }, "downloads": -1, "filename": "peewee-syncer-0.2.4.tar.gz", "has_sig": false, "md5_digest": "91f57cfa06d2f52d740ca24eacb05a46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8479, "upload_time": "2019-09-17T22:31:17", "url": "https://files.pythonhosted.org/packages/20/f6/b67e934574b710a3aa1d46cd9b26425e7731cc2e5c1497c95f030726e0e1/peewee-syncer-0.2.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3cef5a930fcfa313655857c5b6e1e684", "sha256": "c769a39cb9d83e3b5aaa1899d4672e52d0aebcb88e468605602cac1cdefc1f88" }, "downloads": -1, "filename": "peewee_syncer-0.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "3cef5a930fcfa313655857c5b6e1e684", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7916, "upload_time": "2019-09-17T22:31:15", "url": "https://files.pythonhosted.org/packages/58/91/1f6ad341185c9b2c0ad5db9fe8a5e24c2b1e77c4f81ffb074832cdfa605f/peewee_syncer-0.2.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "91f57cfa06d2f52d740ca24eacb05a46", "sha256": "d4055c8bdd08d3d9ef3de6b812cbfea1eec86ce103a0cf8877797b7fd976ebad" }, "downloads": -1, "filename": "peewee-syncer-0.2.4.tar.gz", "has_sig": false, "md5_digest": "91f57cfa06d2f52d740ca24eacb05a46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8479, "upload_time": "2019-09-17T22:31:17", "url": "https://files.pythonhosted.org/packages/20/f6/b67e934574b710a3aa1d46cd9b26425e7731cc2e5c1497c95f030726e0e1/peewee-syncer-0.2.4.tar.gz" } ] }