{
"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"
}
]
}