{ "info": { "author": "James Santucci", "author_email": "james.santucci@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "=======\ntaggedartifacts\n=======\n\n\n.. image:: https://img.shields.io/pypi/v/taggedartifacts.svg\n :target: https://pypi.python.org/pypi/taggedartifacts\n\n.. image:: https://circleci.com/gh/jisantuc/taggedartifacts.svg?style=svg\n :target: https://circleci.com/gh/jisantuc/taggedartifacts\n\n.. image:: https://pyup.io/repos/github/jisantuc/taggedartifacts/shield.svg\n :target: https://pyup.io/repos/github/jisantuc/taggedartifacts/\n :alt: Updates\n\n\n\nSimple artifact versioning and caching for scientific workflows\n\n\n* Free software: MIT license\n* Documentation: https://taggedartifacts.readthedocs.io.\n\n\nFeatures\n--------\n\n:code:`taggedartifacts` exists to provide a simple interface for versioning functions that produce artifacts.\nAn \"artifact\" could be anything -- maybe you have some sort of ETL pipeline that writes intermediate files,\nor you have a plotting function that writes a bunch of plots to disk, or you have a machine learning\nworkflow that produces a bunch of model files somewhere. The purpose of :code:`taggedartifacts` is to allow you\nto write normally -- give your output its regular name, like :code:`plot.png` -- and automatically attach\ngit commit and configuration information as part of the path.\n\nExample\n-------\n\nThe following example shows how to use :code:`taggedartifacts` to tag an output file with commit and config info:\n\n.. codeblock:: python\n\n from taggedartifacts import Artifact\n @Artifact(keyword='outpath', config={}, allow_dirty=True)\n def save_thing(outpath):\n with open(outpath, 'w') as outf:\n outf.write('good job')\n\n\n save_thing(outpath='foo.txt')\n\nThe resulting file that would be created would be :code:`foo--.txt`, without having to\nlitter string formats and fetching git commit info throughout the code.\n\nWhy\n---\n\nIt's really easy, once you start running a lot of experiments, to end up with a ton of output files\nproduced at different times with names like :code:`plot.png`, :code:`plot2.png`, :code:`plot-please-work.png`, etc.\nLater, you'll maybe want to show someone a plot, and they'll try to reproduce it, and you won't be\nable to tell them the state of the code when the plot was produced. That's not great! :code:`taggedartifacts`\noffers one solution to this problem, where you can tell at a glance whether two files were produced\nby the same code and the same configuration.\n\nIsn't this just another workflow library\n----------------------------------------\n\nIt's not! I promise.\n\nThe workflow library ecosystem in python already has a lot of entrants, like Luigi_, Airflow_, \nPinball_, and probably many I haven't heard of. There are also experiment and data/code versioning systems\naround like DVC_, and older solutions to DAGs that understand how not to redo work, like :code:`make`. :code:`taggedartifacts`\nisn't really like any of those. It isn't aware of a DAG of all of your tasks at any point, and it doesn't\nknow anything about data science workflows in general. It only knows about tagging some sort of file-based\noutput with git commit and configuration information so that you can tell whether two artifacts produced\npotentially on different computers should match.\n\nAs a result, you don't have to have a separate daemon running, you don't get anything like task\ndistribution and parallelization for free, and you don't get a special CLI. :code:`taggedartifacts` only attempts to\nsolve one problem.\n\n.. _Luigi: https://github.com/spotify/luigi\n.. _Airflow: https://github.com/apache/airflow\n.. _Pinball: https://github.com/pinterest/pinball\n.. _DVC: https://github.com/iterative/dvc\n\nCredits\n-------\n\nThis package was created with Cookiecutter_ and the `audreyr/cookiecutter-pypackage`_ project template.\n\n.. _Cookiecutter: https://github.com/audreyr/cookiecutter\n.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage\n\n\n=======\nHistory\n=======\n\n0.1.1 (2019-04-27)\n------------------\n\n* Renamed to avoid pypi name conflict. \n\n0.1.0 (2019-04-27)\n------------------\n\n* First release on PyPI.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jisantuc/taggedartifacts", "keywords": "taggedartifacts", "license": "MIT license", "maintainer": "", "maintainer_email": "", "name": "taggedartifacts", "package_url": "https://pypi.org/project/taggedartifacts/", "platform": "", "project_url": "https://pypi.org/project/taggedartifacts/", "project_urls": { "Homepage": "https://github.com/jisantuc/taggedartifacts" }, "release_url": "https://pypi.org/project/taggedartifacts/0.1.1/", "requires_dist": [ "pygit2 (==0.28.1)" ], "requires_python": "", "summary": "Simple artifact versioning and caching for scientific workflows", "version": "0.1.1" }, "last_serial": 5197496, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "ed6eca062995864d286e138e79670044", "sha256": "c5d00d15031bb0a0242d4267e92365f4064fa0ca2f6449e9c14982d2a19d865b" }, "downloads": -1, "filename": "taggedartifacts-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ed6eca062995864d286e138e79670044", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5003, "upload_time": "2019-04-27T19:31:55", "url": "https://files.pythonhosted.org/packages/6c/ec/bba90c3c040c84f2394dada1260eee9f9f537c922317fa0abf65934e13b4/taggedartifacts-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4924eeee99a74820302585ea716b2e0d", "sha256": "a458266af1fc1da0d02b774ee76df6979cd4511e9eada9ebc39b3f642787c7dd" }, "downloads": -1, "filename": "taggedartifacts-0.1.1.tar.gz", "has_sig": false, "md5_digest": "4924eeee99a74820302585ea716b2e0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12063, "upload_time": "2019-04-27T19:32:05", "url": "https://files.pythonhosted.org/packages/7d/d2/63dd445fcf0ccc4656ff4cf02b664c79da3feef14d90ac5e0a9efaade339/taggedartifacts-0.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ed6eca062995864d286e138e79670044", "sha256": "c5d00d15031bb0a0242d4267e92365f4064fa0ca2f6449e9c14982d2a19d865b" }, "downloads": -1, "filename": "taggedartifacts-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ed6eca062995864d286e138e79670044", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5003, "upload_time": "2019-04-27T19:31:55", "url": "https://files.pythonhosted.org/packages/6c/ec/bba90c3c040c84f2394dada1260eee9f9f537c922317fa0abf65934e13b4/taggedartifacts-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4924eeee99a74820302585ea716b2e0d", "sha256": "a458266af1fc1da0d02b774ee76df6979cd4511e9eada9ebc39b3f642787c7dd" }, "downloads": -1, "filename": "taggedartifacts-0.1.1.tar.gz", "has_sig": false, "md5_digest": "4924eeee99a74820302585ea716b2e0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12063, "upload_time": "2019-04-27T19:32:05", "url": "https://files.pythonhosted.org/packages/7d/d2/63dd445fcf0ccc4656ff4cf02b664c79da3feef14d90ac5e0a9efaade339/taggedartifacts-0.1.1.tar.gz" } ] }