{ "info": { "author": "Jo\u00e3o Abecasis", "author_email": "joao@comoyo.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Installation/Setup", "Topic :: System :: Software Distribution" ], "description": "python-transmute\n================\n\nAutomatically update Python Eggs on application startup -- or, you know,\nwhenever, really.\n\nOverview\n--------\n\nThe idea behind this module is to support self-updating Python\napplications, namely command-line tools. Transmute probes remote\nrepositories for updated components, fetches updates and adds them to\n``sys.path``, making them available for use in the application.\n\nComponents are assumed to be standard Python Eggs. Repositories are then\nsimple containers for these eggs. Currently PyPI and S3 \"folders\" are\nsupported as repositories. (Mostly for testing purposes, local\ndirectories are also supported as repositories).\n\nUnder the hood, ``pkg_resources`` (from ``setuptools``) is used to parse\nand fulfill requirements, based on listings of available eggs obtained\nfrom each repository. Once updated packages are made available, their\nmodules can be imported or the application can be re-launched with an\nadjusted environment to pick up updated modules.\n\nThe application writer controls the packages to update, repositories\neach package will be grabbed from, and when an update is actioned.\n\nThe philosophy has been that an absent or flaky network should not\nprevent (or significantly delay) an application from running on top of\noutdated packages, if they've been cached locally. That said, there are\ncurrently no provisions for testing and verifying a successful update or\nrolling back a failed update.\n\nExample\n-------\n\nThis is a script that requests the 'hello' package to be updated from\nthe ``dist`` folder in the current working directory:\n\n.. code:: python\n\n import transmute\n\n transmute.require([ 'hello' ], sources=[ 'dist' ])\n transmute.update()\n\n import hello\n hello.greet('world')\n\nBootstrapping an application with ``bootstrap.py``\n--------------------------------------------------\n\nThe submodule in\n```transmute/bootstrap.py`` `__\ncan be used on its own to bootstrap other Python modules and\napplications. It is capable of downloading packages from PyPI. In this\nway, ``transmute`` itself can be loaded and further used to download\nadditional packages.\n\nThe script provides a bunch of hooks where users can place their code.\nIn particular, ``main()`` can be filled in to fetch application specific\npackages and actually launch the application. At the point it is called\n``transmute`` has been added to ``sys.path`` (after downloading from\nPyPI, if needed).\n\n.. code:: python\n\n def main():\n import transmute\n import transmute.s3\n\n transmute.require([ 'foobar' ],\n sources=[ 's3://foobar-repository/eggs/foobar' ])\n transmute.update()\n\n import foobar.cli\n return foobar.cli.run()\n\nIt can also be used as a placeholder for a Python module. If the module\nitself is available from PyPI, the corresponding package name would be\nadded to the ``requirements`` variable. For other use cases, I sense a\npull request coming :-)\n\nAt the time of this writing, the only non-standard dependency of the\nscript is the ``pkg_resources`` module from the ``setuptools`` package.\nThe assumption here is that the module is more or less available\neverywhere. If this turns out to be a problem in practice, I suppose the\nscript could be simplified to not require it.\n\nSupported package formats\n-------------------------\n\nCurrently, only standard Python eggs are supported. I don't mind adding\nsupport for other formats, formats supported natively by Python are\npreferred.\n\nIn that regard, source tarballs look particularly interesting for pure\nPython packages, and seem to be more generally available from PyPI.\nUnpacking and importing the packages locally could be a way forward.\n\nPython wheels also look interesting and gaining some traction.\n\nSupported repositories\n----------------------\n\nLocal repositories\n~~~~~~~~~~~~~~~~~~\n\nJust a directory with eggs in it. This is mostly useful for testing.\n\n.. code:: python\n\n transmute.require([ 'foobar' ], sources=[ '/opt/basket' ])\n\nPyPI\n~~~~\n\nTransmute supports PyPI's\n`PyPIJSON `__ interface.\n\n.. code:: python\n\n transmute.require([ 'foobar' ], sources=[ transmute.PYPI_SOURCE ])\n\n`Amazon Simple Storage Service (S3) `__\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nPackages can be uploaded to a directory in S3.\n\nWhile technically Amazon's S3 doesn't have the concept of a folder, the\nslash (``'/'``) in S3 key names is abused to sustain the illusion of\ndirectories.\n\nCredentials can be provided as environment variables. ``transmute``\nrecognizes a few fairly standard variables:\n\n::\n\n - AWS_CREDENTIAL_FILE\n - AWS_ACCESS_KEY, AWS_SECRET_KEY, and (optionally) AWS_SECURITY_TOKEN\n - AWS_DEFAULT_REGION and EC2_REGION\n\nWhen running in an EC2 instance, transmute may also pick credentials\nfrom the IAM role associated with it.\n\n.. code:: python\n\n import transmute.s3\n transmute.require([ 'foobar' ], sources=[ 's3://bucket/key-prefix' ])\n\nMissing a repository format?\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nI'm missing a pull request. :-)\n\nOpen issues\n-----------\n\n- Logging is sorely missing. This can be helpful in debugging, but also\n to keep track of updates and possibly tie in to enabling rollbacks.\n- Rolling back a b0rked update.\n- Provide hooks for verifying an update before activating it.\n- We shouldn't use the network on every run of a given command. Keeping\n track of metadata about repository queries would allow us to limit\n updates to daily or weekly schedules.\n- Currently MD5 hashes are used to verify integrity of downloaded\n packages, as advertised by repositories. It would be nice to be able\n to verify package signatures.\n- Your pet peeve?", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/comoyo/python-transmute", "keywords": null, "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "transmute", "package_url": "https://pypi.org/project/transmute/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/transmute/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/comoyo/python-transmute" }, "release_url": "https://pypi.org/project/transmute/5.0/", "requires_dist": null, "requires_python": null, "summary": "Automatically update Python Eggs on application startup.", "version": "5.0" }, "last_serial": 1022221, "releases": { "1": [ { "comment_text": "", "digests": { "md5": "778b9b3085b4b757fa58e72ab8eb6f0b", "sha256": "c3b70db271bd6c7dfb529774e039dce3b33135e64cb1b5a7c4a3ebebb4b457c5" }, "downloads": -1, "filename": "transmute-1-py2.7.egg", "has_sig": true, "md5_digest": "778b9b3085b4b757fa58e72ab8eb6f0b", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 7741, "upload_time": "2014-01-21T09:53:33", "url": "https://files.pythonhosted.org/packages/eb/c5/6d9e612b41519f2606895f27d6c073b72cc861fd7c12785f1450b5283315/transmute-1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "eb8befeeaf4b038f85a506e7c2888e0e", "sha256": "c344a558c0f5944f5d9a4e6d07da61b444d02309cdd8fab72cfe3879392a01c3" }, "downloads": -1, "filename": "transmute-1.tar.gz", "has_sig": true, "md5_digest": "eb8befeeaf4b038f85a506e7c2888e0e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3345, "upload_time": "2014-01-21T09:53:18", "url": "https://files.pythonhosted.org/packages/11/13/731755124fa9cf0f2127829ad8273e6cad531e86cef3e64eac1160b197f9/transmute-1.tar.gz" } ], "2": [ { "comment_text": "", "digests": { "md5": "80065f093197948b5a328cf0acd27e66", "sha256": "d9294b89d1589ca50d4f9c9b251b95eb2fee14d5bc7ef5a2ee1a4999a78a6073" }, "downloads": -1, "filename": "transmute-2-py2.7.egg", "has_sig": true, "md5_digest": "80065f093197948b5a328cf0acd27e66", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 20900, "upload_time": "2014-01-29T20:34:21", "url": "https://files.pythonhosted.org/packages/0b/3f/693d15bd39be4a53a24c0f594863dc6d106023ecaae0c117e40fea2292e4/transmute-2-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "03ce5dcd550a134c397aadc1cf94877b", "sha256": "b80b92dc7cb7c636fdb3fa28ae75735a598ca82465bf0635c3ff0c0ebd16dd51" }, "downloads": -1, "filename": "transmute-2.tar.gz", "has_sig": true, "md5_digest": "03ce5dcd550a134c397aadc1cf94877b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7905, "upload_time": "2014-01-29T20:34:06", "url": "https://files.pythonhosted.org/packages/3c/85/e10b05352d0923370217fb599b2d3ec9cebce9529be3eea2566221714970/transmute-2.tar.gz" } ], "3": [ { "comment_text": "", "digests": { "md5": "8f65ebc0b51ef58caa16a91aeb5041bb", "sha256": "40f2c995e3a57949f8988848f33a58e87e26ea547681cf05bff20111c9a0703f" }, "downloads": -1, "filename": "transmute-3-py2.7.egg", "has_sig": true, "md5_digest": "8f65ebc0b51ef58caa16a91aeb5041bb", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 25515, "upload_time": "2014-01-31T14:57:43", "url": "https://files.pythonhosted.org/packages/63/e8/f3fdf08c96e6a4d18a90c7a8e5439df0af4afc607daebd5015334775a915/transmute-3-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "404399d3b5b9a643da2cf218d0c987f6", "sha256": "41ff24a7064910ae37405e316d2c362bb7b88a42cefebc2c5986d17d067e290b" }, "downloads": -1, "filename": "transmute-3.tar.gz", "has_sig": true, "md5_digest": "404399d3b5b9a643da2cf218d0c987f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13911, "upload_time": "2014-01-31T14:57:24", "url": "https://files.pythonhosted.org/packages/03/27/a467bbca02051dec8dbb0c6c31fe51a11760f6b9cfa528d2d516e34f5083/transmute-3.tar.gz" } ], "3.1": [ { "comment_text": "", "digests": { "md5": "8204090c3a67958ea43fb00e88b03fe8", "sha256": "b59013feaa54428e84d203f8ffd1f6091d3f66607d638eb611735040c329dde7" }, "downloads": -1, "filename": "transmute-3.1-py2.7.egg", "has_sig": true, "md5_digest": "8204090c3a67958ea43fb00e88b03fe8", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 25516, "upload_time": "2014-01-31T18:47:17", "url": "https://files.pythonhosted.org/packages/26/0a/49b94cb718aeb74b8ed70fb1c88165108d0cbcd0cd1ccb945a3561c02158/transmute-3.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "251106adfedf7a15e79a5583c8d1e8af", "sha256": "67df071dbe1aa8912cc009832399c60c7ba0c1463b634c9579a185f67c98a103" }, "downloads": -1, "filename": "transmute-3.1.tar.gz", "has_sig": true, "md5_digest": "251106adfedf7a15e79a5583c8d1e8af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13915, "upload_time": "2014-01-31T18:46:57", "url": "https://files.pythonhosted.org/packages/cf/e3/9ed8e57a05940cf183696f67387e66ea88c870294e0559a7465a4b06cc4d/transmute-3.1.tar.gz" } ], "4": [ { "comment_text": "", "digests": { "md5": "52f7a91d3b2d425068317f0639f04107", "sha256": "feaf9cb376c047dc54e644f6157153c48d968e472c9c289d2233c490ecb87989" }, "downloads": -1, "filename": "transmute-4-py2.7.egg", "has_sig": true, "md5_digest": "52f7a91d3b2d425068317f0639f04107", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 25460, "upload_time": "2014-02-20T23:55:12", "url": "https://files.pythonhosted.org/packages/a1/3d/7542dc76718089b1355d8d4a8f6b0e7f1e281b94a2acee50d4b3ec5dd7aa/transmute-4-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "d2b2f73300668dd2810f8d7f86bfd2e4", "sha256": "8d37c8b015d788ebe941a3e58ffbe17c2f520c13cce14d16afc798fd4f18a8fd" }, "downloads": -1, "filename": "transmute-4.tar.gz", "has_sig": true, "md5_digest": "d2b2f73300668dd2810f8d7f86bfd2e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13886, "upload_time": "2014-02-20T23:55:05", "url": "https://files.pythonhosted.org/packages/96/f7/7413763a2fba882eb69e74db33120485fb80e32e8fe840f27e2e5ea7e89e/transmute-4.tar.gz" } ], "5.0": [ { "comment_text": "", "digests": { "md5": "d230f8558d754d3b4a14605f53eb7efb", "sha256": "d32ef03122e04e998d514b6ebf34760c7007201fd76302de2c12aaf276a1435a" }, "downloads": -1, "filename": "transmute-5.0-py2.6.egg", "has_sig": true, "md5_digest": "d230f8558d754d3b4a14605f53eb7efb", "packagetype": "bdist_egg", "python_version": "2.6", "requires_python": null, "size": 25569, "upload_time": "2014-03-07T13:13:33", "url": "https://files.pythonhosted.org/packages/3f/f8/805b0ea690d95d37db560dd5f2d3fbffa0270e8c712497209edc8060fb05/transmute-5.0-py2.6.egg" }, { "comment_text": "", "digests": { "md5": "626e4ea9ef911a8152825299d302a822", "sha256": "9289159f1d34826ed7fcd929a2170df6c6e9170a433b7f87ee6d816768719d46" }, "downloads": -1, "filename": "transmute-5.0-py2.7.egg", "has_sig": true, "md5_digest": "626e4ea9ef911a8152825299d302a822", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 25459, "upload_time": "2014-03-07T13:13:12", "url": "https://files.pythonhosted.org/packages/08/03/c68c6b9bcb5bb9be15d77bb2fd148f1df622cfee19205d0ca82523bfc20a/transmute-5.0-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "5e73ce6a15f48588e540260f21aeba90", "sha256": "aa6be7418705807deb88da293ab7d9524c30edd4f5d339b6adaa2ef62a3e20c4" }, "downloads": -1, "filename": "transmute-5.0.tar.gz", "has_sig": true, "md5_digest": "5e73ce6a15f48588e540260f21aeba90", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14156, "upload_time": "2014-03-07T13:12:49", "url": "https://files.pythonhosted.org/packages/ed/4c/512163d96411f67d90c52f102f53fc261c37be1718ffed5f013c54b8bda2/transmute-5.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d230f8558d754d3b4a14605f53eb7efb", "sha256": "d32ef03122e04e998d514b6ebf34760c7007201fd76302de2c12aaf276a1435a" }, "downloads": -1, "filename": "transmute-5.0-py2.6.egg", "has_sig": true, "md5_digest": "d230f8558d754d3b4a14605f53eb7efb", "packagetype": "bdist_egg", "python_version": "2.6", "requires_python": null, "size": 25569, "upload_time": "2014-03-07T13:13:33", "url": "https://files.pythonhosted.org/packages/3f/f8/805b0ea690d95d37db560dd5f2d3fbffa0270e8c712497209edc8060fb05/transmute-5.0-py2.6.egg" }, { "comment_text": "", "digests": { "md5": "626e4ea9ef911a8152825299d302a822", "sha256": "9289159f1d34826ed7fcd929a2170df6c6e9170a433b7f87ee6d816768719d46" }, "downloads": -1, "filename": "transmute-5.0-py2.7.egg", "has_sig": true, "md5_digest": "626e4ea9ef911a8152825299d302a822", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 25459, "upload_time": "2014-03-07T13:13:12", "url": "https://files.pythonhosted.org/packages/08/03/c68c6b9bcb5bb9be15d77bb2fd148f1df622cfee19205d0ca82523bfc20a/transmute-5.0-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "5e73ce6a15f48588e540260f21aeba90", "sha256": "aa6be7418705807deb88da293ab7d9524c30edd4f5d339b6adaa2ef62a3e20c4" }, "downloads": -1, "filename": "transmute-5.0.tar.gz", "has_sig": true, "md5_digest": "5e73ce6a15f48588e540260f21aeba90", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14156, "upload_time": "2014-03-07T13:12:49", "url": "https://files.pythonhosted.org/packages/ed/4c/512163d96411f67d90c52f102f53fc261c37be1718ffed5f013c54b8bda2/transmute-5.0.tar.gz" } ] }