{ "info": { "author": "Akshay Nanavati", "author_email": "akshay@nerdwallet.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: SQL", "Topic :: Database", "Topic :: Database :: Front-Ends", "Topic :: Software Development", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "VersionAlchemy\n==============\nA library built on top of the SQLAlchemy ORM for versioning \nrow changes to relational SQL tables.\n\nAuthors: `Ryan Kirkman `_ and\n`Akshay Nanavati `_\n\nBuild Status\n------------\n.. image:: https://travis-ci.org/NerdWalletOSS/versionalchemy.svg?branch=master\n :target: https://travis-ci.org/NerdWalletOSS/versionalchemy\n \n.. image:: https://readthedocs.org/projects/versionalchemy/badge/?version=latest\n :target: http://versionalchemy.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\nUseful Links\n------------\n- `Developer Documentation `_\n- `Blog Post `_\n with more in depth design decisions\n\nGetting Started\n---------------\n\n.. code-block:: bash\n\n $ pip install versionalchemy\n \nSample Usage\n~~~~~~~~~~~~\n\n.. code-block:: python\n \n import sqlalchemy as sa\n from sqlalchemy import create_engine\n from sqlalchemy.ext.declarative import declarative_base\n from sqlalchemy.schema import UniqueConstraint\n \n import versionalchemy as va\n from versionalchemy.models import VAModelMixin, VALogMixin\n\n MY_SQL_URL = ''\n engine = create_engine(MY_SQL_URL)\n Base = declarative_base(bind=engine)\n\n class Example(Base, VAModelMixin):\n __tablename__ = 'example'\n va_version_columns = ['id']\n id = sa.Column(sa.Integer, primary_key=True)\n value = sa.Column(sa.String(128))\n\n\n class ExampleArchive(Base, VALogMixin):\n __tablename__ = 'example_archive'\n __table_args__ = (\n UniqueConstraint('id', 'va_version'),\n )\n id = sa.Column(sa.Integer)\n user_id = sa.Column(sa.Integer)\n \n va.init() # Only call this once\n Example.register(ExampleArchive, engine) # Call this once per engine, AFTER va.init\n \nLatency\n-------\nWe used `benchmark.py `_ to\nbenchmark the performance of versionalchemy. It times the performance of the SQLAlchemy core, ORM\nwithout VersionAclehmy and ORM with VersionAlchemy for ``n`` inserts (where ``n`` was variable). Some\nresults are below.\n\n+--------+-----------+----------+----------+\n| n | Core Time | ORM Time | VA Time |\n+========+===========+==========+==========+\n| 10000 | 9.81 s | 16.04 s | 36.13 |\n+--------+-----------+----------+----------+\n| 100000 | 98.78 s | 158.87 s | 350.84 s |\n+--------+-----------+----------+----------+\n\nVersionAlchemy performs roughly 2 times as bad as the ORM, which makes sense as we are doing roughly one\nadditional insert per orm insert into the archive table.\n\nContributing\n------------\n- Make sure you have `pip `_ \n and `virtualenv `_ on your dev machine\n- Fork the repository and make the desired changes\n- Run ``make install`` to install all required dependencies\n- Run ``make lint tests`` to ensure the code is pep8 compliant and all tests pass.\n Note that the tests require 100% branch coverage to be considered passing\n- Open a pull request with a detailed explaination of the bug or feature\n- Respond to any comments. The PR will be merged if the travis CI build passes and \n the code changes are deemed sufficient by the admin\n\nStyle\n~~~~~\n- Follow PEP8 with a line length of 100 characters\n- Prefer parenthesis to ``\\`` for line breaks\n\nLicense\n-------\n`MIT License `_", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/NerdWalletOSS/versionalchemy/tarball/v1.0.0", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/NerdWalletOSS/versionalchemy", "keywords": "", "license": "MIT License", "maintainer": "Jeremy Lewis", "maintainer_email": "jlewis@nerdwallet.com", "name": "versionalchemy", "package_url": "https://pypi.org/project/versionalchemy/", "platform": "", "project_url": "https://pypi.org/project/versionalchemy/", "project_urls": { "Download": "https://github.com/NerdWalletOSS/versionalchemy/tarball/v1.0.0", "Homepage": "https://github.com/NerdWalletOSS/versionalchemy" }, "release_url": "https://pypi.org/project/versionalchemy/1.0.0/", "requires_dist": null, "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4", "summary": "Versioning library for relational data", "version": "1.0.0" }, "last_serial": 5925667, "releases": { "0.1.0a2": [ { "comment_text": "", "digests": { "md5": "cfcf8c1061cda3125549eb86d311f06b", "sha256": "abb98510e4e94a3084821f5a46deda284b4a15f95ab79e74694e8c9b6cab8951" }, "downloads": -1, "filename": "versionalchemy-0.1.0a2.tar.gz", "has_sig": false, "md5_digest": "cfcf8c1061cda3125549eb86d311f06b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9658, "upload_time": "2016-08-25T23:39:06", "url": "https://files.pythonhosted.org/packages/b7/9d/2b6550755db18919e3c7336177e16e2acbc55bcbce85afcd6c2f6b75d684/versionalchemy-0.1.0a2.tar.gz" } ], "0.1.0a4": [ { "comment_text": "", "digests": { "md5": "51014a3d83708e22972ca5497e13b727", "sha256": "f40d4a16ff0abcb7122be62a7a68a71d1a17ceadf6e94888e9319686c977fc43" }, "downloads": -1, "filename": "versionalchemy-0.1.0a4.tar.gz", "has_sig": false, "md5_digest": "51014a3d83708e22972ca5497e13b727", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9426, "upload_time": "2016-08-26T00:05:12", "url": "https://files.pythonhosted.org/packages/d3/75/f8f0e5f866bb41ecb4d1dac3a3bebcbd8371c173afe50c6b16f1c01e3ca7/versionalchemy-0.1.0a4.tar.gz" } ], "0.1.0a5": [ { "comment_text": "", "digests": { "md5": "5f8f058ad79fc96324ababd71c6ce9ac", "sha256": "4268e09227fb7dbd1f5abee2522210cf928e89160fc5511bead564d4292c7a08" }, "downloads": -1, "filename": "versionalchemy-0.1.0a5.tar.gz", "has_sig": false, "md5_digest": "5f8f058ad79fc96324ababd71c6ce9ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9428, "upload_time": "2016-08-26T00:19:27", "url": "https://files.pythonhosted.org/packages/b8/32/4b44c2afcfca83cf5015cb56c1e30e10d238cd25bc7773446f9bcbef5aae/versionalchemy-0.1.0a5.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "b582ef7afa138ea3daae2794a4e905e7", "sha256": "77c4140c99eb0e44be7f0711195b49366af27e4b025bcf71db15baaff563580b" }, "downloads": -1, "filename": "versionalchemy-0.1.1.tar.gz", "has_sig": false, "md5_digest": "b582ef7afa138ea3daae2794a4e905e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9426, "upload_time": "2016-08-26T21:38:30", "url": "https://files.pythonhosted.org/packages/95/15/c7c258203228ebcf8f31b9aa38f7d4d20fce5843365deac16559ff7b9b76/versionalchemy-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "6397890e01130472b9ba425e3ad06569", "sha256": "449e5b17c249aecffa02a14d2ec49875a1257d69e2b6bec4429081d5376374cc" }, "downloads": -1, "filename": "versionalchemy-0.1.2.tar.gz", "has_sig": false, "md5_digest": "6397890e01130472b9ba425e3ad06569", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10238, "upload_time": "2017-08-16T21:49:03", "url": "https://files.pythonhosted.org/packages/4d/8d/bc97eeebc24cf4f344199897235c33ad7fe3691193d78626dd5933ab8f53/versionalchemy-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "c343b300f7131e5a6b595b2795a9daad", "sha256": "5abf2edb19330fd4da749558b7d4f498b33c759f0ff5eb11d566bb5feb7c30af" }, "downloads": -1, "filename": "versionalchemy-0.1.3.tar.gz", "has_sig": false, "md5_digest": "c343b300f7131e5a6b595b2795a9daad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10530, "upload_time": "2017-08-17T00:18:36", "url": "https://files.pythonhosted.org/packages/82/4a/533b8cca08076b29412eaf96ee76fa3b7f0a842636991ab4a4917b2dc731/versionalchemy-0.1.3.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "7979f63129cb5b9daa258a0e3625b4d9", "sha256": "78d64cf5587eb9a55c8ec1b7efd0e1a9e8ca5aca6ff2f1301a5d8c142522096d" }, "downloads": -1, "filename": "versionalchemy-1.0.0.tar.gz", "has_sig": false, "md5_digest": "7979f63129cb5b9daa258a0e3625b4d9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4", "size": 14031, "upload_time": "2019-10-03T22:17:15", "url": "https://files.pythonhosted.org/packages/5b/5c/47abbfcfc485f35878c649ab7d6767a5fdd852e96eb6b0965f3ef857e655/versionalchemy-1.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7979f63129cb5b9daa258a0e3625b4d9", "sha256": "78d64cf5587eb9a55c8ec1b7efd0e1a9e8ca5aca6ff2f1301a5d8c142522096d" }, "downloads": -1, "filename": "versionalchemy-1.0.0.tar.gz", "has_sig": false, "md5_digest": "7979f63129cb5b9daa258a0e3625b4d9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4", "size": 14031, "upload_time": "2019-10-03T22:17:15", "url": "https://files.pythonhosted.org/packages/5b/5c/47abbfcfc485f35878c649ab7d6767a5fdd852e96eb6b0965f3ef857e655/versionalchemy-1.0.0.tar.gz" } ] }