{ "info": { "author": "", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Programming Language :: Python" ], "description": "triforce - system virtualenv symlink manager\n--------------------------------------------\n\nThis is a system virtualenv symlink manager. It allows you to maintain\nso-called system-virtual-environments which contain system utilities that you\nwant to install with pip but that should reside outside the virtualenvs that\nyou are using for development. In fact, the use-case is similar to `pipsi\n`_ but takes a somewhat different approach.\nIt was born out of my need to have a tool that suits exactly my needs. As such,\nit is probably biased to my particular way of getting things done.\n\nPrinciples\n----------\n\n* Declarative configuration based\n* Configurable path for the virtualenvs and the symlinks\n* Support one or many virtualenvs\n* Idempotent\n\nExample\n-------\n\nConsider the following example.yaml:\n\n.. code:: yaml\n\n .demo_sysvenv3:\n triforce:\n venv_prefix: /tmp/example\n symlink_prefix: /tmp/example\n install: true\n ipython:\n symlink: ['ipython', 'iptest']\n yadoma: {}\n .demo_sysvenv2:\n triforce:\n venv_command: python2\n venv_prefix: /tmp/example\n symlink_prefix: /tmp/example\n git-spindle:\n url: git+ssh://git@github.com/seveas/git-spindle.git\n symlink: ['git-hub']\n\nThis will create two system virtualenvs ``.demo_sysvenv3`` and\n``.demo_sysvenv2``. The first, is based on Python 3 (the default) and the\nsecond on legacy Python. Each system virtualenv contains a number of packages\nthat will be installed and linked.\n\nThe special ``triforce`` section contains additional parameters that govern how\nthe system virtualenv will be configured. For example in both cases above, the\nvirtualenvs themselves and their symlinks will be installed into\n``/tmp/example`` (to ensure the example doesn't screw with your system). In the\n``.demo_sysvenv2`` case, the ``venv_command`` command has been set to\n``python2`` indicating that a virtualenv with legacy python should be\ninstalled. In case the command it uses under the hood (use the force, read the\nsource) doesn't work for you, you can also simply type a custom command string\nto create the virtualenv for you. This is provided as a fallback since there\nseem to be a myriad of ways of setting up a virtualenv and you never know what\nmight work on a given system. Lastly setting ``install`` to ``true`` will\nensure that the ``triforce`` itself is installed and symlinked into the\nvirtual environment, meaning you can delete whatever you used to bootstrap it.\n\nIn addition to the names of the packages on PyPi, you need to specify which\nexecutables or scripts should be symlinked. This may seem redundant, but a) I\ndon't know how to easily introspect a Python package to obtain the scripts it\ninstalls and b) maybe you want to have control over this. Anyway, for the tool\n``yadoma`` above there is no list of symlinks and so the tool will attempt to\nsymlink a script of the same name as the package on PyPi. Yes, this could have\nbeen done for ``ipython`` too, but then we wouldn't link the ``iptest`` script.\nLastly, you can also specify a ``url`` which may contain the string that will be\npassed on to ``pip``. In the example above we install ``git-spindle`` from github.\n\nLastly, I should also note that the tools ``pip`` and ``pybuilder`` will be\ninstalled by default into each created system virtualenv.\n\nHere is what it looks like in action:\n\n.. code::\n\n % triforce example.yaml \n {'name': '.demo_sysvenv3', 'symlinks': ['ipython', 'iptest', 'yadoma'], 'symlink_prefix': '/tmp/example', 'venv_command': 'python3', 'urls': ['ipython', 'yadoma'], 'venv_prefix': '/tmp/example', 'path': '/tmp/example/.demo_sysvenv3'}\n Creating venv at: '/tmp/example/.demo_sysvenv3'\n \n 'pip' command is: '/tmp/example/.demo_sysvenv3/bin/pip'\n Installing/upgrading utilities: 'pip' and 'pybuilder'\n Collecting pip\n Using cached pip-8.1.2-py2.py3-none-any.whl\n Installing collected packages: pip\n Found existing installation: pip 8.1.1\n Uninstalling pip-8.1.1:\n Successfully uninstalled pip-8.1.1\n Successfully installed pip-8.1.2\n \n Collecting pybuilder\n Requirement already up-to-date: pip>=7.0 in /tmp/example/.demo_sysvenv3/lib/python3.5/site-packages (from pybuilder)\n Collecting wheel (from pybuilder)\n Using cached wheel-0.29.0-py2.py3-none-any.whl\n Collecting tblib (from pybuilder)\n Using cached tblib-1.3.0-py2.py3-none-any.whl\n Installing collected packages: wheel, tblib, pybuilder\n Successfully installed pybuilder-0.11.9 tblib-1.3.0 wheel-0.29.0\n \n Installing dependencies: '['ipython', 'yadoma']'\n Collecting ipython\n Using cached ipython-5.1.0-py3-none-any.whl\n Collecting yadoma\n Collecting traitlets>=4.2 (from ipython)\n Using cached traitlets-4.3.0-py2.py3-none-any.whl\n Collecting pygments (from ipython)\n Using cached Pygments-2.1.3-py2.py3-none-any.whl\n Collecting prompt-toolkit<2.0.0,>=1.0.3 (from ipython)\n Using cached prompt_toolkit-1.0.7-py3-none-any.whl\n Collecting decorator (from ipython)\n Using cached decorator-4.0.10-py2.py3-none-any.whl\n Collecting simplegeneric>0.8 (from ipython)\n Collecting pexpect; sys_platform != \"win32\" (from ipython)\n Using cached pexpect-4.2.1-py2.py3-none-any.whl\n Requirement already satisfied (use --upgrade to upgrade): setuptools>=18.5 in /tmp/example/.demo_sysvenv3/lib/python3.5/site-packages (from ipython)\n Collecting pickleshare (from ipython)\n Using cached pickleshare-0.7.4-py2.py3-none-any.whl\n Collecting pyyaml (from yadoma)\n Collecting docopt (from yadoma)\n Collecting six (from traitlets>=4.2->ipython)\n Using cached six-1.10.0-py2.py3-none-any.whl\n Collecting ipython-genutils (from traitlets>=4.2->ipython)\n Using cached ipython_genutils-0.1.0-py2.py3-none-any.whl\n Collecting wcwidth (from prompt-toolkit<2.0.0,>=1.0.3->ipython)\n Using cached wcwidth-0.1.7-py2.py3-none-any.whl\n Collecting ptyprocess>=0.5 (from pexpect; sys_platform != \"win32\"->ipython)\n Using cached ptyprocess-0.5.1-py2.py3-none-any.whl\n Installing collected packages: six, decorator, ipython-genutils, traitlets, pygments, wcwidth, prompt-toolkit, simplegeneric, ptyprocess, pexpect, pickleshare, ipython, pyyaml, docopt, yadoma\n Successfully installed decorator-4.0.10 docopt-0.6.2 ipython-5.1.0 ipython-genutils-0.1.0 pexpect-4.2.1 pickleshare-0.7.4 prompt-toolkit-1.0.7 ptyprocess-0.5.1 pygments-2.1.3 pyyaml-3.12 simplegeneric-0.8.1 six-1.10.0 traitlets-4.3.0 wcwidth-0.1.7 yadoma-41.3\n \n Will symlink: '/tmp/example/.demo_sysvenv3/bin/ipython' --> '/tmp/example/ipython'\n Will symlink: '/tmp/example/.demo_sysvenv3/bin/iptest' --> '/tmp/example/iptest'\n Will symlink: '/tmp/example/.demo_sysvenv3/bin/yadoma' --> '/tmp/example/yadoma'\n {'name': '.demo_sysvenv2', 'symlinks': ['git-hub'], 'symlink_prefix': '/tmp/example', 'venv_command': 'python2', 'urls': ['git+ssh://git@github.com/seveas/git-spindle.git'], 'venv_prefix': '/tmp/example', 'path': '/tmp/example/.demo_sysvenv2'}\n Creating venv at: '/tmp/example/.demo_sysvenv2'\n Running virtualenv with interpreter /usr/bin/python2\n New python executable in /tmp/example/.demo_sysvenv2/bin/python2\n Also creating executable in /tmp/example/.demo_sysvenv2/bin/python\n Installing setuptools, pkg_resources, pip, wheel...done.\n \n 'pip' command is: '/tmp/example/.demo_sysvenv2/bin/pip'\n Installing/upgrading utilities: 'pip' and 'pybuilder'\n Requirement already up-to-date: pip in /tmp/example/.demo_sysvenv2/lib/python2.7/site-packages\n \n Collecting pybuilder\n Requirement already up-to-date: pip>=7.0 in /tmp/example/.demo_sysvenv2/lib/python2.7/site-packages (from pybuilder)\n Collecting tblib (from pybuilder)\n Using cached tblib-1.3.0-py2.py3-none-any.whl\n Requirement already up-to-date: wheel in /tmp/example/.demo_sysvenv2/lib/python2.7/site-packages (from pybuilder)\n Installing collected packages: tblib, pybuilder\n Successfully installed pybuilder-0.11.9 tblib-1.3.0\n \n Installing dependencies: '['git+ssh://git@github.com/seveas/git-spindle.git']'\n Collecting git+ssh://git@github.com/seveas/git-spindle.git\n Cloning ssh://git@github.com/seveas/git-spindle.git to /tmp/pip-wqHeBB-build\n Collecting github3.py>=0.9.0 (from git-spindle==3.3)\n Using cached github3.py-0.9.5-py2.py3-none-any.whl\n Collecting whelk>=2.6 (from git-spindle==3.3)\n Collecting docopt>=0.5.0 (from git-spindle==3.3)\n Collecting uritemplate.py>=0.2.0 (from github3.py>=0.9.0->git-spindle==3.3)\n Downloading uritemplate.py-3.0.2-py2.py3-none-any.whl\n Collecting requests>=2.0 (from github3.py>=0.9.0->git-spindle==3.3)\n Using cached requests-2.11.1-py2.py3-none-any.whl\n Collecting uritemplate>=2.0 (from uritemplate.py>=0.2.0->github3.py>=0.9.0->git-spindle==3.3)\n Downloading uritemplate-3.0.0-py2.py3-none-any.whl\n Installing collected packages: uritemplate, uritemplate.py, requests, github3.py, whelk, docopt, git-spindle\n Running setup.py install for git-spindle ... done\n Successfully installed docopt-0.6.2 git-spindle-3.3 github3.py-0.9.5 requests-2.11.1 uritemplate-3.0.0 uritemplate.py-3.0.2 whelk-2.6\n \n Will symlink: '/tmp/example/.demo_sysvenv2/bin/git-hub' --> '/tmp/example/git-hub'\n\n\n\n\nTODO and Ideas\n--------------\n\nMany.\n\n\nLicense\n-------\n\n\nCopyright 2016 Valentin Haenel \n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed\nunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the License for the\nspecific language governing permissions and limitations under the License.\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "triforce", "package_url": "https://pypi.org/project/triforce/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/triforce/", "project_urls": null, "release_url": "https://pypi.org/project/triforce/83.16/", "requires_dist": null, "requires_python": "", "summary": "", "version": "83.16" }, "last_serial": 2523715, "releases": { "0.0.1": [], "1.0.dev0": [ { "comment_text": "", "digests": { "md5": "81387112f9fe1f66d29afab7ad6383ea", "sha256": "84c4f125244a62295b848917fab07e3e401a3727445d5f5e12a74a2ef599219a" }, "downloads": -1, "filename": "triforce-1.0.dev0.tar.gz", "has_sig": false, "md5_digest": "81387112f9fe1f66d29afab7ad6383ea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5572, "upload_time": "2016-09-21T19:29:14", "url": "https://files.pythonhosted.org/packages/f9/1a/e6ff137413bed380eb4bbbc379ca190f5d89dd78c244b753cca4e0ce855b/triforce-1.0.dev0.tar.gz" } ], "51.4": [ { "comment_text": "", "digests": { "md5": "e6ee2928b7566aabb6586b964fcaa53c", "sha256": "f53f8027e5bc933d6107421dfec65804f86b5643f29bfbdfaa8d3ebfbbdc0a87" }, "downloads": -1, "filename": "triforce-51.4.tar.gz", "has_sig": false, "md5_digest": "e6ee2928b7566aabb6586b964fcaa53c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5567, "upload_time": "2016-09-21T19:31:58", "url": "https://files.pythonhosted.org/packages/4c/33/6325645523dce55c0e94728f8dcd681770bcf1d8682972a2829ef8b21188/triforce-51.4.tar.gz" } ], "52.5": [ { "comment_text": "", "digests": { "md5": "c2422303083617dd9b0dd6f2939f4206", "sha256": "7712152fe8fc45176409e151d3ad21a584016483421f37d2de05bf0d8c4d9abb" }, "downloads": -1, "filename": "triforce-52.5.tar.gz", "has_sig": false, "md5_digest": "c2422303083617dd9b0dd6f2939f4206", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5666, "upload_time": "2016-09-21T19:56:16", "url": "https://files.pythonhosted.org/packages/ef/a2/17294a793704f3a35ed4a29c92e914fbf3cc6eacf6b97e855ffbead0511c/triforce-52.5.tar.gz" } ], "53.6": [ { "comment_text": "", "digests": { "md5": "cd5bd92d36f9a6ca5165f6e174f41983", "sha256": "ca05f51ddb147921d4f5b3d5166fbfbe4a69f728d80592ab66c5f75d45fa17fd" }, "downloads": -1, "filename": "triforce-53.6.tar.gz", "has_sig": false, "md5_digest": "cd5bd92d36f9a6ca5165f6e174f41983", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5396, "upload_time": "2016-09-21T20:19:31", "url": "https://files.pythonhosted.org/packages/9f/21/12ce0704a0eb7d465718a21322ae9df8a338ee9f3df5f08ed4f3c1cdde78/triforce-53.6.tar.gz" } ], "56.8": [ { "comment_text": "", "digests": { "md5": "88b1f3a94fa191da54f10a54b549d1fc", "sha256": "e5e677bce4ea5e0009babcfbbbfb967aa4617e87900062341428328ef6dd8d66" }, "downloads": -1, "filename": "triforce-56.8.tar.gz", "has_sig": false, "md5_digest": "88b1f3a94fa191da54f10a54b549d1fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5449, "upload_time": "2016-12-13T15:39:52", "url": "https://files.pythonhosted.org/packages/bf/63/77d88f9e0359516d8c6eefbdb2d55284a1cfb25a06cd41f688c1e061ffea/triforce-56.8.tar.gz" } ], "57.9": [ { "comment_text": "", "digests": { "md5": "468db70f91168af06c829b47fc1b075e", "sha256": "45c370cf441e568d390b13c9a5053ff74d9514b07041819e5877fdab7c487ab8" }, "downloads": -1, "filename": "triforce-57.9.tar.gz", "has_sig": false, "md5_digest": "468db70f91168af06c829b47fc1b075e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5503, "upload_time": "2016-12-13T17:11:54", "url": "https://files.pythonhosted.org/packages/49/45/24d937ad3c141881062499114d482da7d96a6fcb4a804c573f28d3496148/triforce-57.9.tar.gz" } ], "62.10": [ { "comment_text": "", "digests": { "md5": "ec81021187d87a9067656a87875e4a0e", "sha256": "fe7a6416ee18a7aece52f94cbb7dad046cf8a32d24c0f60d90e331daa1841bb7" }, "downloads": -1, "filename": "triforce-62.10.tar.gz", "has_sig": false, "md5_digest": "ec81021187d87a9067656a87875e4a0e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5514, "upload_time": "2016-12-13T19:41:43", "url": "https://files.pythonhosted.org/packages/61/82/86657158dd0cbda23c7703960c4ac02829338a6496e5fe50a3aed59ed37e/triforce-62.10.tar.gz" } ], "63.11": [ { "comment_text": "", "digests": { "md5": "271788582d44791a0598102127e37c1f", "sha256": "14f88e13f0eb8eb74ab2a44a42b76785d396f3bf81ef6f591fe9ec786154b217" }, "downloads": -1, "filename": "triforce-63.11.tar.gz", "has_sig": false, "md5_digest": "271788582d44791a0598102127e37c1f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5519, "upload_time": "2016-12-13T19:45:40", "url": "https://files.pythonhosted.org/packages/f3/a1/23ac40bbefdadb4d3d26cd554279b4395d0f45105595e88dff2c18c62d1a/triforce-63.11.tar.gz" } ], "76.12": [ { "comment_text": "", "digests": { "md5": "6f98673940ff3873757c33b8cecb6609", "sha256": "77cff02f49aa8e8270b95d9036630e30b91f7ce88acc482f90cfb74b2b34aadb" }, "downloads": -1, "filename": "triforce-76.12.tar.gz", "has_sig": false, "md5_digest": "6f98673940ff3873757c33b8cecb6609", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5573, "upload_time": "2016-12-15T21:46:21", "url": "https://files.pythonhosted.org/packages/53/2b/294340b141a5905cd8b4e0525daca2588fb8cb0188116c7abf327becb5e7/triforce-76.12.tar.gz" } ], "78.13": [ { "comment_text": "", "digests": { "md5": "1e557f9f6b9f352db93ec3dee0e3cae5", "sha256": "f055728b54748db2526f1910843f25c75e1f3c571f1c6765204ad8b752870712" }, "downloads": -1, "filename": "triforce-78.13.tar.gz", "has_sig": false, "md5_digest": "1e557f9f6b9f352db93ec3dee0e3cae5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5572, "upload_time": "2016-12-16T18:02:08", "url": "https://files.pythonhosted.org/packages/63/b7/26753684f06495aa06b567a65d5b701ed57e67a7d0c4276288135887fe2b/triforce-78.13.tar.gz" } ], "79.14": [ { "comment_text": "", "digests": { "md5": "f16af3515466328dbbe06812149beee3", "sha256": "4eea08040109bd71a7b46136fd87181afb5158bc0628420f24f47b6647d405a0" }, "downloads": -1, "filename": "triforce-79.14.tar.gz", "has_sig": false, "md5_digest": "f16af3515466328dbbe06812149beee3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5569, "upload_time": "2016-12-16T18:03:43", "url": "https://files.pythonhosted.org/packages/31/89/018ce1b7b36d5f9a0b037f0bb48f10389ae201b7016d12d62d0278be590a/triforce-79.14.tar.gz" } ], "82.15": [ { "comment_text": "", "digests": { "md5": "fa93ad2ac76907754da4f0a77363ac1d", "sha256": "d58f59260656fd68a269a47032ee33c7b5f6a2ac4ec1b302ff83b75200ebe275" }, "downloads": -1, "filename": "triforce-82.15.tar.gz", "has_sig": false, "md5_digest": "fa93ad2ac76907754da4f0a77363ac1d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5574, "upload_time": "2016-12-16T19:14:04", "url": "https://files.pythonhosted.org/packages/f9/2b/f1c132727315857b2f34555ca9b044d62be18bc34c768b18b3733209cc70/triforce-82.15.tar.gz" } ], "83.16": [ { "comment_text": "", "digests": { "md5": "9b6d4383916a07648ab89fde57672282", "sha256": "5eb40df506368ff816f56d3c1e1e2e4852b045ccef2392a65816c0dc3c7f7e84" }, "downloads": -1, "filename": "triforce-83.16.tar.gz", "has_sig": false, "md5_digest": "9b6d4383916a07648ab89fde57672282", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5572, "upload_time": "2016-12-16T19:23:26", "url": "https://files.pythonhosted.org/packages/d1/32/efc48fac5a62d50f7880a6c866a06dfd60ac222faa93ed6994efe15f22a4/triforce-83.16.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9b6d4383916a07648ab89fde57672282", "sha256": "5eb40df506368ff816f56d3c1e1e2e4852b045ccef2392a65816c0dc3c7f7e84" }, "downloads": -1, "filename": "triforce-83.16.tar.gz", "has_sig": false, "md5_digest": "9b6d4383916a07648ab89fde57672282", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5572, "upload_time": "2016-12-16T19:23:26", "url": "https://files.pythonhosted.org/packages/d1/32/efc48fac5a62d50f7880a6c866a06dfd60ac222faa93ed6994efe15f22a4/triforce-83.16.tar.gz" } ] }