{ "info": { "author": "Joachim Jablon", "author_email": "joachim.jablon@people-doc.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "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" ], "description": "########\nRaincoat\n########\n\n.. image:: https://badge.fury.io/py/raincoat.svg\n :target: https://pypi.org/pypi/raincoat\n\n.. image:: https://travis-ci.org/novafloss/raincoat.svg?branch=master\n :target: https://travis-ci.org/novafloss/raincoat\n\n.. image:: https://img.shields.io/codecov/c/github/novafloss/raincoat/master.svg\n :target: https://codecov.io/github/novafloss/raincoat?branch=master\n\n.. image:: https://readthedocs.org/projects/raincoat/badge/?version=latest\n :target: http://raincoat.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\nRaincoat has you covered when you can't stay DRY. When the time comes where you HAVE to copy code from a third party, Raincoat will let you know when this code is changed so that you can update your local copy.\n\n\nThe problem\n===========\n\nLets say you're using a lib named ``umbrella`` which provides a function named ``use_umbrella`` and it reads as such :\n\n.. code-block:: python\n\n def use_umbrella(umbrella):\n\n # Prepare umbrella\n umbrella.remove_pouch()\n umbrella.open()\n\n # Use umbrella\n while rain_detector.still_raining():\n umbrella.keep_over_me()\n\n # Put umbrella away\n umbrella.close()\n while not umbrella.is_wet():\n time.sleep(1)\n umbrella.put_pouch()\n\nThis function does what it says it does, but it's not ideally splitted, depending on your needs. For example, maybe at some point you realize you need each of the 3 separate parts to be a function of its own. Or maybe you can't call time.sleep in your app. Or do something else with the ``umbrella`` when it's open like dance with it.\n\nIt's also possible that you can't really make a pull request because your needs are specific, or you don't have the time (that's sad but, hey, I know it happens) or any other personnal reason. So what do you do ? There's no real alternative. You copy and paste the code, modify it to fit your needs and use your modified version. And whenever there's a change to the upstream function, chances are you'll never know.\n\n\nThe solution\n============\n\nEnter Raincoat.\n\nYou have made your own private copy of ``umbrella.use_umbrella`` (umbrella being at the time at version 14.5.7) and it looks like this :\n\n.. code-block:: python\n\n def dance_with_umbrella(umbrella):\n\t \"\"\"\n I'm siiiiiinging in the rain !\n \"\"\"\n # Prepare umbrella\n umbrella.remove_pouch()\n umbrella.open()\n\n # Use umbrella\n while rain_detector.still_raining():\n Dancer.sing_in_the_rain(umbrella)\n\n # Put umbrella away\n umbrella.close()\n while not umbrella.is_wet()\n time.sleep(1)\n umbrella.put_pouch()\n\nNow simply add a comment somewhere (preferably just after the docstring) that says something like:\n\n.. code-block:: python\n\n def dance_with_umbrella(umbrella):\n \"\"\"\n I'm siiiiiinging in the rain !\n \"\"\"\n # This code was adapted from the original umbrella.use_umbrella function\n # (we just changed the part inside the middle while loop)\n # Raincoat: pypi package: umbrella==14.5.7 path: umbrella/__init__.py element: use_umbrella\n\n ...\n\nNow, if you run ``raincoat`` in your project (At this stage, I assume you've installed it with ``pip install raincoat``)\n\n.. code-block:: bash\n\n\t$ raincoat\n\n\nIt will:\n\n- Grep the code for all `# Raincoat:` comments and for each comment:\n- Look at the currently installed version of the lib (say, umbrella 16.0.3) (or, if not found, the latest version)\n- Compare with the version in the Raincoat comment (here, 14.5.7)\n- If they are different, download and pip install the specified version in a temp dir (using cached wheel as pip does by default, this should be quite fast in most cases)\n- Locate the code using the provided path for both the downloaded and the currently installed versions\n- Diff it\n- Tell you if there's a difference (and mention the location of the original Raincoat comment)\n\nWhether there is something to change or not, you've now verified your code with umbrella 16.0.3, so you can update manually the umbrella comment.\n\n.. code-block:: python\n\n\t# Raincoat: pypi package: umbrella==16.0.3 path: umbrella/__init__.py element: use_umbrella\"\n\nRaincoat can be used like a linter, you can integrate it in CI, make it a tox target...\n\nNote that if you omit the last argument, Raincoat will analyze the whole module:\n\n.. code-block:: python\n\n\t# Raincoat: pypi package: umbrella==16.0.3 path: umbrella/__init__.py\n\n\nAnd beyond !\n============\n\nActually, the base principle of Raincoat can be extended to many other subjects than PyPI packages.\nTo fit this, Raincoat was written with a modular achitecture allowing other kinds of Raincoat comments.\n\nFor now Raincoat comes with:\n\n- *PyPI*: The module presented above\n- *Django*: A module that checks if a given bug in Django for which you may have had to write a workaround\n is fixed in your (or the latest) version of Django. Syntax is :\n\n.. code-block:: python\n\n\t# Raincoat: django ticket: #26976\n\n- *PyGitHub* : Same as the PyPI module but using Github. It's useful if your upstream is a python\n package that's not on PyPI, like, say, the Python Standard Library itself.\n Say you want to know if the element ``Maildir._lookup`` in the file ``Lib/mailbox.py`` changed on the master branch since commit 43ba8861. What you can do is:\n\n.. code-block:: python\n\n\t# Raincoat: pygithub repo: python/cpython@43ba8861 branch: master path: Lib/mailbox.py element: Maildir._lookup\n\nOf course, feel free to code your own !\n\n\nCaveats and Gotchas\n===================\n\n- The 2 elements you provide in path should be the location of the file when the package is installed (in most case, this should match the location of the file in the project repo) and the object defined in this file. This object can be a variable, a class, a function or a method.\n- Your own customized (copied/pasted) version of the function will not be analyzed. In fact, you don't even have to place the Raincoat comment in the function that uses it.\n- You may realize that raincoat works best if you can use some kind of pip cache.\n- Raincoat does not run files (either your files or the package file). Package files are parsed and the AST is analyzed.\n- If for any reason, several code objects are identically named in the file you analyze, there's no guarantee you'll get any specific one.\n- The Django module uses the public GitHub API and does a few calls. This should not be a concern most of the time, but you may experience rate-limiting issues if Raincoat is launched from an IP that does a lot of calls to the GitHub API (e.g. Travis). In this case, from your Travis settings, set the environment variable ``RAINCOAT_GITHUB_TOKEN`` to ``username:github_token``, ``github_token being`` a token generated `here `_ with all checkboxes unchecked.\n- So few people use Raincoat for now that you should expect a few bumps down the road. This being said, fire issues and pull requetes at will and I'll do my best to answer them in a timely manner.\n\n\nTodos\n=====\n\nThings I'd like to add at some point\n\n- An option to update a comment automatically\n- A way to say you want your customized function to be diffed too (in case it's a close copy and you want to keep track of what you've modified)\n- A way to access the original function without the process of downloading the whole package and installing it for nothing. We just want a single file of it.\n- A smart way to make raincoat not need a pip cache (a cache of its own, or something)\n\n\nAcknowledgments\n===============\n\nThis code is open-sourced and maintained by me (Joachim Jablon) during both my free time and my time working at `PeopleDoc `_, based on an idea and a first implemention made at `Smart Impulse `_. Kudos to these 2 companies.\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/novafloss/raincoat", "keywords": "code,diff,copy-paste,linter,DRY", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "raincoat", "package_url": "https://pypi.org/project/raincoat/", "platform": "", "project_url": "https://pypi.org/project/raincoat/", "project_urls": { "Homepage": "https://github.com/novafloss/raincoat" }, "release_url": "https://pypi.org/project/raincoat/0.8.5/", "requires_dist": [ "requests", "click", "colorama", "pip", "sh", "six", "sphinx; extra == 'dev'", "tox; extra == 'dev'", "wheel; extra == 'dev'", "zest.releaser[recommended]; extra == 'dev'", "prospector[with_pyroma]; extra == 'lint'", "mock; extra == 'test'", "pytest; extra == 'test'", "pytest-catchlog; extra == 'test'", "pytest-cov; extra == 'test'", "pytest-mock; extra == 'test'", "pytest-click; extra == 'test'" ], "requires_python": "", "summary": "\"Raincoat has your code covered when you can't stay DRY.\"", "version": "0.8.5" }, "last_serial": 3213911, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "849e37bd231fbac3f675c56455680f4c", "sha256": "7960a11f043454e36304795bd54baedc42a89014ac097f04729681d81de43bd5" }, "downloads": -1, "filename": "raincoat-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "849e37bd231fbac3f675c56455680f4c", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 17675, "upload_time": "2016-10-13T09:20:19", "url": "https://files.pythonhosted.org/packages/8e/a9/3942f97bb4f538ae4c68eba77d830c8a2d39b6c648cfe7d1f50bcd3a8516/raincoat-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8c31b8257e824586eebf1f3a3602245e", "sha256": "e26914b8076dc37b65e1efb31ae9db71aaf8b6d82c068313fdfe79b9968f73f0" }, "downloads": -1, "filename": "raincoat-0.1.0.tar.gz", "has_sig": false, "md5_digest": "8c31b8257e824586eebf1f3a3602245e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13095, "upload_time": "2016-10-13T09:20:09", "url": "https://files.pythonhosted.org/packages/c8/5d/add5c7a2e8b07033c854f24551a8fededee7c3785e7985ddbcc2bcd0274f/raincoat-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "d8fac9ab2add4a0096b9be233378d29c", "sha256": "3746dd910cd74a6b536667746215e7770d76d8737bacbe05bd34d5761193e98c" }, "downloads": -1, "filename": "raincoat-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d8fac9ab2add4a0096b9be233378d29c", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 17701, "upload_time": "2016-10-13T10:02:43", "url": "https://files.pythonhosted.org/packages/b8/59/b11df609e8ca870a117c2c55d4d0284827977378ea09510da7613c1ef741/raincoat-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "abb6a5831443eb79191668e8a94c323d", "sha256": "eff1415fd1f9962c5e49723c621b089d1970ba151a6450bc4f2013e62875becd" }, "downloads": -1, "filename": "raincoat-0.1.1.tar.gz", "has_sig": false, "md5_digest": "abb6a5831443eb79191668e8a94c323d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13195, "upload_time": "2016-10-13T10:02:36", "url": "https://files.pythonhosted.org/packages/e6/a8/2049e78fe3b2c8d0bb9be599604a5fbb29ff925140be2660d58767e14294/raincoat-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "40d6da37a0ea24230f3f1e30a1cb6c9c", "sha256": "d779864a9d249610a20fcd4001d36078780b4d81a6f2c81d51c34cf4cbeef848" }, "downloads": -1, "filename": "raincoat-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "40d6da37a0ea24230f3f1e30a1cb6c9c", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 17701, "upload_time": "2016-10-13T13:29:04", "url": "https://files.pythonhosted.org/packages/0b/77/1440be654b01b9f62fe881b2bb6cfb4ada44eda8c17a2023d1a5d3ad68a5/raincoat-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fd889249f5ba3f0627f2926f8171c0ca", "sha256": "6e2124f84d51a392c5669a12e6a04692a48e4f64767bb3ddd3dac0fb86f5902e" }, "downloads": -1, "filename": "raincoat-0.1.2.tar.gz", "has_sig": false, "md5_digest": "fd889249f5ba3f0627f2926f8171c0ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13191, "upload_time": "2016-10-13T13:27:32", "url": "https://files.pythonhosted.org/packages/ff/9c/4fdff3a606914f5220f5f1b3ebf4daae5b5749b6dec5e10e2c2257c5d8ba/raincoat-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "bcf838f2fd8d380d1c94855d2f4ec208", "sha256": "10778104f2ed5205764f9b683b44841953baa44198b818655c9e01ef0cc2262a" }, "downloads": -1, "filename": "raincoat-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bcf838f2fd8d380d1c94855d2f4ec208", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 17701, "upload_time": "2016-10-13T13:37:20", "url": "https://files.pythonhosted.org/packages/dd/78/e99dacd8a698a94d997d5ae4af278337c5aa758db86b4c9135ba200f0c1a/raincoat-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ff174ecf266240ee02f26de6d9433e8f", "sha256": "8b1551b5e2094e4874b11710f4f528101abc49bf58bab513769e6400c7f21c4c" }, "downloads": -1, "filename": "raincoat-0.1.3.tar.gz", "has_sig": false, "md5_digest": "ff174ecf266240ee02f26de6d9433e8f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13189, "upload_time": "2016-10-13T13:37:12", "url": "https://files.pythonhosted.org/packages/62/6c/63b5c35877fb88956cfd4d4229a75a44db01643644b3567ef2988d4d62f3/raincoat-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "dde29104eda09ebc7f6937ca736d309b", "sha256": "6abf71ddb9d1821797cbe671a7c2f07650a54eb237e7a43fce7ddaf660b047ea" }, "downloads": -1, "filename": "raincoat-0.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "dde29104eda09ebc7f6937ca736d309b", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 18298, "upload_time": "2016-10-13T13:45:26", "url": "https://files.pythonhosted.org/packages/d2/be/3e46bd409b0ae9a308cf2bf7abb1076be77d7231e2b2d149a2cf4ba817b2/raincoat-0.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ab28de1ac946669a56b53100573c83c1", "sha256": "0967151d9c448627f63e62c95cb0839631634fad97b82059a907d43e454cf3ee" }, "downloads": -1, "filename": "raincoat-0.1.4.tar.gz", "has_sig": false, "md5_digest": "ab28de1ac946669a56b53100573c83c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13558, "upload_time": "2016-10-13T13:45:16", "url": "https://files.pythonhosted.org/packages/a3/af/3c0415df9a680e6e90c8cd888b3e41ef098cdcac6ceb2f6219e2f8bfdbd9/raincoat-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "79cd0cbffcf3ee0cccd420c83cd4edef", "sha256": "819ccc4d816d27eae1bb450af840e5c0cc894caef653b0a8b5b77cbe36a2b16b" }, "downloads": -1, "filename": "raincoat-0.1.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "79cd0cbffcf3ee0cccd420c83cd4edef", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 18353, "upload_time": "2016-10-13T13:46:10", "url": "https://files.pythonhosted.org/packages/cc/d9/d18ea4398b6ddd2792976f0b2d466a0094ff058b827767a47af1e21e6076/raincoat-0.1.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "219dec4336b07ecec630ef9f499fe0c6", "sha256": "d417e16cbf8de9d6b57235b0add1e02fd1efa9d2f99fe12690ef16f1c509cf56" }, "downloads": -1, "filename": "raincoat-0.1.5.tar.gz", "has_sig": false, "md5_digest": "219dec4336b07ecec630ef9f499fe0c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13616, "upload_time": "2016-10-13T13:46:03", "url": "https://files.pythonhosted.org/packages/b2/7f/4b63d152e332262dd4cb9c4d9c947c38505798cc9c064914bddf1a58d6ca/raincoat-0.1.5.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "fa1ac29d568b5df11019e15803cd4917", "sha256": "056f57d5197f854269726f8e3b2bfbe8bc59289cb340829b195985c4e14ba9f5" }, "downloads": -1, "filename": "raincoat-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fa1ac29d568b5df11019e15803cd4917", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 18385, "upload_time": "2016-10-13T14:22:24", "url": "https://files.pythonhosted.org/packages/4a/ef/8122e4f92895ca71b627cc6ad18d1cd3daa769f135a3069b9b755e3a0470/raincoat-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e1f87db1c9ccf22c09ec11c882400d39", "sha256": "bf184f9af30d830fd524b228fefe55fd89c14f50dfb3d5762cade3aac1ba2316" }, "downloads": -1, "filename": "raincoat-0.2.0.tar.gz", "has_sig": false, "md5_digest": "e1f87db1c9ccf22c09ec11c882400d39", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13672, "upload_time": "2016-10-13T14:22:17", "url": "https://files.pythonhosted.org/packages/d6/72/db0b478d8a30cec247ab0e07219ba001b80db0955a24c7d1e9f2668b1ff5/raincoat-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "a7b7d64c838b56271deb22817f9a07d8", "sha256": "446d45287f5c6425003dc7298dc77b83dd781f31b4694c206e4ba407762eeb20" }, "downloads": -1, "filename": "raincoat-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a7b7d64c838b56271deb22817f9a07d8", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 13125, "upload_time": "2016-10-15T13:02:27", "url": "https://files.pythonhosted.org/packages/0f/2d/ab730d902b6f45e9d7d4fc885ab0b31b425140589e1f86c04ce69db0de21/raincoat-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6f690dad18e05b1f43642b7f0d1c7c29", "sha256": "8e4fc1dc3cf7d1000be0dc7015ffb4b7ca00c57b2c72fe503f23fc16b2eb3b83" }, "downloads": -1, "filename": "raincoat-0.3.0.tar.gz", "has_sig": false, "md5_digest": "6f690dad18e05b1f43642b7f0d1c7c29", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8686, "upload_time": "2016-10-15T13:02:20", "url": "https://files.pythonhosted.org/packages/73/c1/392cd8270d06785561bd2d601ff88f9eb7651cbcf1754a03c8e092528503/raincoat-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "86d7fdec3e09767bbcbb478a465da4d4", "sha256": "402c50c569e20567680f48bea471c6bafe3ec78c41e5afbfe44161ec31665f0a" }, "downloads": -1, "filename": "raincoat-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "86d7fdec3e09767bbcbb478a465da4d4", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 13171, "upload_time": "2016-10-16T12:11:55", "url": "https://files.pythonhosted.org/packages/c2/f0/1b9924125aa30ebd7ffb0c7764d2c1be1ef0984a7abda8d4689718d16f3f/raincoat-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "219071def60250db830436b7b27a781f", "sha256": "1231505b4d46014d941fb3c427884fadc93d03d25df78852c16d86482e954011" }, "downloads": -1, "filename": "raincoat-0.4.0.tar.gz", "has_sig": false, "md5_digest": "219071def60250db830436b7b27a781f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8718, "upload_time": "2016-10-16T12:11:42", "url": "https://files.pythonhosted.org/packages/1f/7d/f077796012f8869dc95c3731c4c2bf810c7e8621281ef09670d7c96962cc/raincoat-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "e32df04546197127743b575bb0060e95", "sha256": "c0bf0b8d9f819a9e155f69fdb1b87ba0a70d123cb5a5d53dad197c781bdcf395" }, "downloads": -1, "filename": "raincoat-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e32df04546197127743b575bb0060e95", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 17685, "upload_time": "2016-11-06T12:58:40", "url": "https://files.pythonhosted.org/packages/db/6c/28bce709db2d250b749c5dfc5f9df7f68f082b75324e3913a5b26a90a2b9/raincoat-0.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "22dc748b336800f0bf8522bd4f4c917f", "sha256": "50fbdff063ff9927b33a076a02169b845597d9869ebbc838aab3ef630e002d98" }, "downloads": -1, "filename": "raincoat-0.4.1.tar.gz", "has_sig": false, "md5_digest": "22dc748b336800f0bf8522bd4f4c917f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15564, "upload_time": "2016-11-06T12:58:31", "url": "https://files.pythonhosted.org/packages/59/6b/d4cf640b3d39c7baca6597b04e7283324a8ba0e512c1e4414a4ca0601f95/raincoat-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "e6439da2066ea51b760aadf046a376af", "sha256": "9cb0233b1c2f069e0d33ea7c6b731da749902405e6477aac8f88de121e3cd215" }, "downloads": -1, "filename": "raincoat-0.4.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e6439da2066ea51b760aadf046a376af", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 12182, "upload_time": "2016-11-06T15:31:36", "url": "https://files.pythonhosted.org/packages/e8/17/5a9a18a83053d23f3bf9009792bcc9787b72129f79f8fe5792b83ed745cb/raincoat-0.4.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2424267f5f9293b8fed8e733d20dfff2", "sha256": "f0fa11a1eb5ddd7f9b2cec39e852c803c349db406c5e17782819204cd0b803ef" }, "downloads": -1, "filename": "raincoat-0.4.2.tar.gz", "has_sig": false, "md5_digest": "2424267f5f9293b8fed8e733d20dfff2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7458, "upload_time": "2016-11-06T15:31:26", "url": "https://files.pythonhosted.org/packages/34/de/a681b0107eb64714decba1cb21662fc6c3affa432eaf38ede81504637503/raincoat-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "49cc5552b195ab552be74c3e40ff6841", "sha256": "31b379e0dedbd118d5296e20a816b35f7b6dd37dcedb50103e0f6de5b8d6d053" }, "downloads": -1, "filename": "raincoat-0.4.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "49cc5552b195ab552be74c3e40ff6841", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 15180, "upload_time": "2016-11-06T15:53:39", "url": "https://files.pythonhosted.org/packages/f4/67/87e4f6e721c6b56f829a8e09cb945decf803002f0ed25a57f5166fb096b3/raincoat-0.4.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d738c35cdde87a4a4f1df031e389ddf2", "sha256": "4d300d6ac42ea7d3af6c225ef9cdfab7c2da1d8039c368486a6c7ff188581ab9" }, "downloads": -1, "filename": "raincoat-0.4.3.tar.gz", "has_sig": false, "md5_digest": "d738c35cdde87a4a4f1df031e389ddf2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12295, "upload_time": "2016-11-06T15:52:46", "url": "https://files.pythonhosted.org/packages/b7/ee/e34e140668b27ded0a41daf88d8bd4a068313ecdc7bf1e19eacadbd91459/raincoat-0.4.3.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "473874f48974488e8d26c49d5925a0a6", "sha256": "88e42830bf13434db228982b156928b62362f4faba3fe50f2a7e475ed0685d0d" }, "downloads": -1, "filename": "raincoat-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "473874f48974488e8d26c49d5925a0a6", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 15284, "upload_time": "2016-11-06T22:27:15", "url": "https://files.pythonhosted.org/packages/5e/93/e3f51889e2feb15bcae38bb42f825c829c582ad30adf3ec5c67e504f27e9/raincoat-0.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bcb5c43373077a20069994833c0924fd", "sha256": "398f3ad028668e6b9035ba687e60075d14c467dc308b98ebe3f9b43e63b4dae6" }, "downloads": -1, "filename": "raincoat-0.5.0.tar.gz", "has_sig": false, "md5_digest": "bcb5c43373077a20069994833c0924fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12441, "upload_time": "2016-11-06T22:26:32", "url": "https://files.pythonhosted.org/packages/69/02/e7968e3105e3b1fc831c1111dc4eaadd462f325981901614b29a6cbef1e6/raincoat-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "53876459e088ad49a2bbc34baa4dbde9", "sha256": "cecda724f0744947eb99168a1ac97106327895c5b37593101e3088a70274ae0d" }, "downloads": -1, "filename": "raincoat-0.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "53876459e088ad49a2bbc34baa4dbde9", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 18276, "upload_time": "2017-02-22T10:13:58", "url": "https://files.pythonhosted.org/packages/49/0b/95e7b712756b60b3c897eebde3ec79c24f9acf8c3efc05c802e4b0d9297d/raincoat-0.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0eb2895e5714bbea84c9ef86b4d6ba5e", "sha256": "c6fa3a99046d7c47913fd830e3ff18a1af454f03fe0b12c8c2ebeaa388c6103a" }, "downloads": -1, "filename": "raincoat-0.6.0.tar.gz", "has_sig": false, "md5_digest": "0eb2895e5714bbea84c9ef86b4d6ba5e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14276, "upload_time": "2017-02-22T10:13:51", "url": "https://files.pythonhosted.org/packages/cf/af/7006837ba2860d6e3752a86f98e690e70653b59983398043e35bc1561ac8/raincoat-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "364e18f4477f85d97dcf9187e6577508", "sha256": "e918be464d5f4aba5fe0b4b8c205cb973cd6f5a94ebe942e10479d7f9634e9e0" }, "downloads": -1, "filename": "raincoat-0.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "364e18f4477f85d97dcf9187e6577508", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 19791, "upload_time": "2017-04-01T13:14:22", "url": "https://files.pythonhosted.org/packages/d0/f5/55d572c3ec384a016e49366e37191f6a20b0fdd9e73eaf9ced3e9f4f783a/raincoat-0.7.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0c17345594175387eff84725d49ca578", "sha256": "6f8ef127551f9c5db6e256b0f53843ed11c86b728917277942b2d7e1ced61a59" }, "downloads": -1, "filename": "raincoat-0.7.0.tar.gz", "has_sig": false, "md5_digest": "0c17345594175387eff84725d49ca578", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16092, "upload_time": "2017-04-01T13:13:54", "url": "https://files.pythonhosted.org/packages/b9/15/9dccdc1be40be83a779cd11948b6eb9f529224d034ee9eb510615572d78e/raincoat-0.7.0.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "4d9dbbef34d06631b36b48aa7448ab10", "sha256": "efe23371e83aa6a32a85840158fa109a0461042929c5b09a101f37a9a8ca21d7" }, "downloads": -1, "filename": "raincoat-0.8.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4d9dbbef34d06631b36b48aa7448ab10", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 22332, "upload_time": "2017-04-18T20:56:00", "url": "https://files.pythonhosted.org/packages/52/28/0858f2997524c666a158570cd5afceaf51c62961c696ad47e6681493616a/raincoat-0.8.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b03ff12a1ffbe02b76344548beae4576", "sha256": "86b2943cbac46b487926e270029fc0b73f6ab5525d01ac15d0e86d02e4bb0989" }, "downloads": -1, "filename": "raincoat-0.8.0.tar.gz", "has_sig": false, "md5_digest": "b03ff12a1ffbe02b76344548beae4576", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17483, "upload_time": "2017-04-18T20:55:52", "url": "https://files.pythonhosted.org/packages/bc/76/f3000b1e4623263465890bb141f8541d0d35400da4a12284583b06241f75/raincoat-0.8.0.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "34cb8cb2c55b215a81a1e70025c8491d", "sha256": "567ed14b4f3447982b410ef7757230ccbce4624678094cffdb19260a930165e3" }, "downloads": -1, "filename": "raincoat-0.8.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "34cb8cb2c55b215a81a1e70025c8491d", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 23201, "upload_time": "2017-07-04T08:36:24", "url": "https://files.pythonhosted.org/packages/54/1f/35eecd2b0cffea428456bf4fd6e071d30bd0f7777300754c67d2547bb4da/raincoat-0.8.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d1c0eaa8a2160c37ac649423faec72b7", "sha256": "bd7c9e065ab92381e9db6abf60f24c9ffd2a858ec7e7c3fbed8a13e636ec9fe0" }, "downloads": -1, "filename": "raincoat-0.8.1.tar.gz", "has_sig": false, "md5_digest": "d1c0eaa8a2160c37ac649423faec72b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16814, "upload_time": "2017-07-04T08:36:23", "url": "https://files.pythonhosted.org/packages/c9/0f/58dcddfb7ee092ef85c7207efdc5f53b165e0949d894b15c18644efdfb63/raincoat-0.8.1.tar.gz" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "068f8ab13564756679a4b8bd613e9b33", "sha256": "49c1d44aebfb37ceeaf34d8eb3687caa02b48acefea03f18d6cfc3019eb05660" }, "downloads": -1, "filename": "raincoat-0.8.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "068f8ab13564756679a4b8bd613e9b33", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 23226, "upload_time": "2017-07-04T08:41:09", "url": "https://files.pythonhosted.org/packages/92/8c/503bc86b42a90178fc3f95509cc34ad7edd51d9c275fd14f4ef72ccfa71f/raincoat-0.8.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4d17b9082d03c60be2e124948aa9ba7e", "sha256": "9cdab38ce8a95c31ace5af1c2a7d99f505c8effe7d83f086004cacac830c33e5" }, "downloads": -1, "filename": "raincoat-0.8.2.tar.gz", "has_sig": false, "md5_digest": "4d17b9082d03c60be2e124948aa9ba7e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16830, "upload_time": "2017-07-04T08:41:07", "url": "https://files.pythonhosted.org/packages/2e/ff/d41bcff43975a9eb9b4316a423c8389c58e51304f58877e101135d786e0c/raincoat-0.8.2.tar.gz" } ], "0.8.5": [ { "comment_text": "", "digests": { "md5": "2461bea9203a100e83e4053b0dfd738e", "sha256": "79a3caada9d85c8e6cb7aa461715d8a0fede2a80f39c10771cfe196314d27a6b" }, "downloads": -1, "filename": "raincoat-0.8.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2461bea9203a100e83e4053b0dfd738e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23249, "upload_time": "2017-09-29T21:56:06", "url": "https://files.pythonhosted.org/packages/32/15/f1587cfe04843818f3f773333335181e04c60f80bc84b435dbe180e79e9e/raincoat-0.8.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f12adf265b7c37b5ded487e131d02d94", "sha256": "a1bdcd9a9800fb8070c949fa01299072fb2d4b7380d90a631b9e59e80f28a7c6" }, "downloads": -1, "filename": "raincoat-0.8.5.tar.gz", "has_sig": false, "md5_digest": "f12adf265b7c37b5ded487e131d02d94", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18154, "upload_time": "2017-09-29T21:56:08", "url": "https://files.pythonhosted.org/packages/ec/be/6067bfd9674bcecf69e0737f811e200f4c6b31e47eba5ed8d1df02c1ca5f/raincoat-0.8.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2461bea9203a100e83e4053b0dfd738e", "sha256": "79a3caada9d85c8e6cb7aa461715d8a0fede2a80f39c10771cfe196314d27a6b" }, "downloads": -1, "filename": "raincoat-0.8.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2461bea9203a100e83e4053b0dfd738e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23249, "upload_time": "2017-09-29T21:56:06", "url": "https://files.pythonhosted.org/packages/32/15/f1587cfe04843818f3f773333335181e04c60f80bc84b435dbe180e79e9e/raincoat-0.8.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f12adf265b7c37b5ded487e131d02d94", "sha256": "a1bdcd9a9800fb8070c949fa01299072fb2d4b7380d90a631b9e59e80f28a7c6" }, "downloads": -1, "filename": "raincoat-0.8.5.tar.gz", "has_sig": false, "md5_digest": "f12adf265b7c37b5ded487e131d02d94", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18154, "upload_time": "2017-09-29T21:56:08", "url": "https://files.pythonhosted.org/packages/ec/be/6067bfd9674bcecf69e0737f811e200f4c6b31e47eba5ed8d1df02c1ca5f/raincoat-0.8.5.tar.gz" } ] }