{ "info": { "author": "Eli B", "author_email": "eli@formal.studio", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: ISC License (ISCL)", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7" ], "description": "# Savior Database\n\nEmbedded schema-less database library backed by LMDB.\n\nCurrently in development and not stable yet. \nThe interface and disk format may change in future versions without notice.\nYou probably shouldn't use it to store important data. \n\nPermissively licensed with the [ISC License](LICENSE).\n\n## Goals\n\n- provide a language-neutral disk format\n- utilize LMDB's properties like transactions, append-only writes, and zero-copy reads\n- provide intuitive schema-less entity modeling and querying interface\n- store an immutable history of all values in the database\n\n## Developer Interface\n\nThere are a few actions you can perform on entities in a transaction:\n\n- store\n- fetch\n- update\n- query\n- delete\n\nAn entity is conceptually like a dictionary with attributes and values.\n\nA table is an isolated section of the database for storing entities,\nusually with a similar set of attributes.\n\n## Disk Format\n\nAll entities of the same type are stored in one inner LMDB database\nThere is no guarantee that entities have a consistent schema.\n\nEntities are stored on disk as a series of timestamped attribute changes.\n\n- key-value entries have the form `(uuid, timestamp, attribute) -> value`\n- `uuid` is an auto-generated entity ID\n- `timestamp` is an auto-generated timestamp of when the entry was appended\n- `attribute` and `value` are the updated entity key value entries\n\nData is not modified for updates, only appended to indicate the entity changed.\n\nThe storage format version is stored as an integer in a special inner database \nnamed `_metadata`, at a key named `version`. \nThe `_metadata` table's keys and values are also encoded with MessagePack.\n\nYou can access the storage format version via `Database.VERSION`.\n\n\n# Changelog\n\nThis document follows the [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) format.\n\nReleases are available on [PyPI as `savior`](https://pypi.org/project/savior/).\n\n## 0.2.3 - 2019-09-06\n### Added\n- added `Transaction.delete` method to permanently remove an entity\n\n## 0.2.2 - 2019-08-06\n### Fixed\n- fixed bug where `created_at` dates were all from the first entity\n\n## 0.2.1 - 2019-08-06\n### Changed\n- opening a database adds a schema version identifier integer to databases that don't have one\n### Added\n- added `Database.VERSION` for getting storage format version\n- added `created_at` option to `query` to add an attribute to entities indicating when they were created\n\n## 0.2.0 - 2019-07-15\n### Removed\n- removed `Database.open_tables` since tables are now required when opening a database\n### Changed\n- renamed `Transaction.create` to `Transaction.store` for consistency with `Transaction.fetch`\n- changed `Database.open` behavior to require table names on initialization\n- changed `Transaction` methods to raise error if a table name is used that was not used to open the database with\n\n## 0.1.2 - 2019-07-15\n### Added\n- `Database.create_tables` to create tables in database\n- `Database.open_tables` to open existing tables in database\n- `Database.close` to close database manually\n\n## 0.1.1 - 2019-07-15\n### Added\n- options for manually closing transactions for when it's not possible to use context managers\n\n## 0.1.0 - 2019-07-15\n### Added\n- initial schema-less immutable interface over LMDB\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://gitlab.com/elibdev/savior", "keywords": "", "license": "ISC", "maintainer": "", "maintainer_email": "", "name": "savior", "package_url": "https://pypi.org/project/savior/", "platform": "", "project_url": "https://pypi.org/project/savior/", "project_urls": { "Homepage": "https://gitlab.com/elibdev/savior" }, "release_url": "https://pypi.org/project/savior/0.2.3/", "requires_dist": [ "lmdb", "msgpack" ], "requires_python": "", "summary": "Flexible immutable entity database", "version": "0.2.3" }, "last_serial": 5792108, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "412ebfc49f018c14efdfbf7ad1f46c5c", "sha256": "895fd1cfdd748fc1b7fea577e5d057d4b4ba07656d7152526e41d1d97156dc9e" }, "downloads": -1, "filename": "savior-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "412ebfc49f018c14efdfbf7ad1f46c5c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4353, "upload_time": "2019-07-15T13:48:27", "url": "https://files.pythonhosted.org/packages/87/ed/f80213561d7070a133f1925c2ef340144f02edfdcbb7ec88a4286010dbc0/savior-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c465c13c76ab641c73102732fff3782c", "sha256": "978bbefc49aa8f593ac5f1e6d9a2384986f25b9c870e6faffc862fdd6b184d88" }, "downloads": -1, "filename": "savior-0.1.0.tar.gz", "has_sig": false, "md5_digest": "c465c13c76ab641c73102732fff3782c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3611, "upload_time": "2019-07-15T13:48:29", "url": "https://files.pythonhosted.org/packages/4f/ae/6fba824abc3cc32053d792b8c0c3f2cda5e2c9b07bdb62604ec1337576b8/savior-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "008f2dd7ef0e09f31fc6dd81a23e9e89", "sha256": "f0fb0ede31f46df08b988440df17d2e84f464137215e069eb1344850e418e76e" }, "downloads": -1, "filename": "savior-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "008f2dd7ef0e09f31fc6dd81a23e9e89", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4366, "upload_time": "2019-07-15T16:39:58", "url": "https://files.pythonhosted.org/packages/3b/39/e5d19321d92028dc4417dd3af1af96a16453b248e4901d7ee9ab059ee782/savior-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5e302f829f074126c4a1774c0505aa84", "sha256": "0ff9ff3f544ecf96446589f690b90ab2463c56b657cf4c76c4c3085d2e105a5b" }, "downloads": -1, "filename": "savior-0.1.1.tar.gz", "has_sig": false, "md5_digest": "5e302f829f074126c4a1774c0505aa84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3622, "upload_time": "2019-07-15T16:40:00", "url": "https://files.pythonhosted.org/packages/cd/1b/9dc6fdf0b4ec0f31a41b2327fc74d4c148c9e6b4b378818bc7f42dcdba84/savior-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "7e0ff56d374438fec288b0f0f76333fb", "sha256": "ee7ec3bc94bd05149c5adba9a82734a12ab125c6edb856c1cfe7057bc00f8449" }, "downloads": -1, "filename": "savior-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7e0ff56d374438fec288b0f0f76333fb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4423, "upload_time": "2019-07-15T17:35:35", "url": "https://files.pythonhosted.org/packages/02/fa/ac6d20fb754de14e12585d09eb44549b02d33aca461437359310808ddea9/savior-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "124ee277c8c3cb12e9035bb608fa0bcf", "sha256": "89c87876bce610783eb2a190c53bae2866914910fb244192a06bb2ea908f6d27" }, "downloads": -1, "filename": "savior-0.1.2.tar.gz", "has_sig": false, "md5_digest": "124ee277c8c3cb12e9035bb608fa0bcf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3688, "upload_time": "2019-07-15T17:35:36", "url": "https://files.pythonhosted.org/packages/c4/32/7a71dc53f14a2d03854917a1a4da971f4ebab3d057437d537b04dc13932a/savior-0.1.2.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "e613391f187c6178cc2c3be640c8d527", "sha256": "aea121e2dd092f680f0ae0adb966d4ea4455373cd6560d23c7e1e2964d43aa5d" }, "downloads": -1, "filename": "savior-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e613391f187c6178cc2c3be640c8d527", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4360, "upload_time": "2019-07-15T18:09:58", "url": "https://files.pythonhosted.org/packages/f7/9a/2b9df92a09627206efde7d514fa555b977d223d74b472eb2aaa7616627df/savior-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "46c6182f206c306d836f85b7bad04c63", "sha256": "8198ea14363b3f11fd536f95976155ed7a7562b0f71b07abd8ac2b3a467f6498" }, "downloads": -1, "filename": "savior-0.2.0.tar.gz", "has_sig": false, "md5_digest": "46c6182f206c306d836f85b7bad04c63", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3620, "upload_time": "2019-07-15T18:09:59", "url": "https://files.pythonhosted.org/packages/2d/ee/5cb07f110a9397b222fe6ab35007fb778fc218e2ba807501fdb2e7646852/savior-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "a5af2d92d6a4f55d7831bb1008aa4de9", "sha256": "6e451feb41faf41e3e2e71ac0fb255309e319ea7920b01abd4534d013e420900" }, "downloads": -1, "filename": "savior-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a5af2d92d6a4f55d7831bb1008aa4de9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5129, "upload_time": "2019-08-06T20:59:09", "url": "https://files.pythonhosted.org/packages/60/67/6457289e424bd533422103ea65cbba7841a47f38d961995f48a90cdd5c8b/savior-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dccd8bb4e42a661b67d7a157281320b9", "sha256": "12e4f1dd52adb8cb7101bd5ffa452a25a31ab908f7280ab008e6e9da3499b111" }, "downloads": -1, "filename": "savior-0.2.1.tar.gz", "has_sig": false, "md5_digest": "dccd8bb4e42a661b67d7a157281320b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4390, "upload_time": "2019-08-06T20:59:11", "url": "https://files.pythonhosted.org/packages/dc/08/0d26d029b05dd0e1f5e274ba0741b1caa910e6811e1337dd74e4d3d0895e/savior-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "6613e5619508f2922bb80c5113e7e91f", "sha256": "8406fc714ce7735337b6dbef3fe6e8f87d5863138c8ab424fbaf6c6734e85d93" }, "downloads": -1, "filename": "savior-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6613e5619508f2922bb80c5113e7e91f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5177, "upload_time": "2019-08-06T21:40:02", "url": "https://files.pythonhosted.org/packages/95/8d/ac105d15b2a22f6a624f3f901d01ca194720ba2cffde825f38de8ad16b3c/savior-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f579d2057597e4922d5ff31a08c007f5", "sha256": "34836213c080eac0bd9fd4578b5ad8465c7b6c415cac97114ec6a585a91423b0" }, "downloads": -1, "filename": "savior-0.2.2.tar.gz", "has_sig": false, "md5_digest": "f579d2057597e4922d5ff31a08c007f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4435, "upload_time": "2019-08-06T21:40:03", "url": "https://files.pythonhosted.org/packages/ce/62/3015c23fd6db3aeee3a93a43964148daec9bade60a621e8d23ed994a4981/savior-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "aab3ed6952d82c27a35173a0d7717abc", "sha256": "8f9f954c64f093174e2ff8e86232b20c72f2e2951ff2cf1503837cb36ba010ee" }, "downloads": -1, "filename": "savior-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "aab3ed6952d82c27a35173a0d7717abc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5273, "upload_time": "2019-09-06T12:53:41", "url": "https://files.pythonhosted.org/packages/49/b9/a66d614b7d0a00fa9c145997c520a020068d5ac1d7e8e9f4089b1e0d666b/savior-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "916e8b237632463886cf8329f659cd9a", "sha256": "98bb0f9409747ad65710444d136e32365291932ca3224d898fe452c747f8ef20" }, "downloads": -1, "filename": "savior-0.2.3.tar.gz", "has_sig": false, "md5_digest": "916e8b237632463886cf8329f659cd9a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4526, "upload_time": "2019-09-06T12:53:43", "url": "https://files.pythonhosted.org/packages/fd/40/0e7acf4f6e2cc443ef624f64dc19bb133f3ed03d26ec4f2cc665fca666df/savior-0.2.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "aab3ed6952d82c27a35173a0d7717abc", "sha256": "8f9f954c64f093174e2ff8e86232b20c72f2e2951ff2cf1503837cb36ba010ee" }, "downloads": -1, "filename": "savior-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "aab3ed6952d82c27a35173a0d7717abc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5273, "upload_time": "2019-09-06T12:53:41", "url": "https://files.pythonhosted.org/packages/49/b9/a66d614b7d0a00fa9c145997c520a020068d5ac1d7e8e9f4089b1e0d666b/savior-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "916e8b237632463886cf8329f659cd9a", "sha256": "98bb0f9409747ad65710444d136e32365291932ca3224d898fe452c747f8ef20" }, "downloads": -1, "filename": "savior-0.2.3.tar.gz", "has_sig": false, "md5_digest": "916e8b237632463886cf8329f659cd9a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4526, "upload_time": "2019-09-06T12:53:43", "url": "https://files.pythonhosted.org/packages/fd/40/0e7acf4f6e2cc443ef624f64dc19bb133f3ed03d26ec4f2cc665fca666df/savior-0.2.3.tar.gz" } ] }