{ "info": { "author": "Erik Rose", "author_email": "grinch@grinchcentral.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Build Tools", "Topic :: System :: Installation/Setup", "Topic :: System :: Systems Administration" ], "description": ".. image:: https://travis-ci.org/erikrose/peep.svg?branch=master\n :target: https://travis-ci.org/erikrose/peep\n\n.. note::\n\n Peep is deprecated, as we have `merged its functionality into pip 8\n `_. This brings myriad improvements, including support for caching,\n detection of omitted dependencies, and better handling of errors and corner\n cases. To switch to pip 8's hash-checking without hitting any race\n conditions...\n\n 1. Upgrade to peep 3.0 (which exists mainly as a stopgap to support\n race-free upgrades like this).\n 2. Upgrade to pip 8.\n 3. Atomically, switch the format of your requirements files using ``peep\n port`` (described below), and start calling pip instead of peep.\n 4. Delete peep from your project.\n\n Thank you for using peep! Your early support helped establish hash\n verification as a feature worth uplifting, and now the package ecosystem is\n safer for everyone.\n\n Here are some `more detailed upgrade instructions\n `_ in case you need\n them.\n\n====\nPeep\n====\n\nDeploying Python projects has long been a source of frustration for the\nsecurity-conscious: a compromise of PyPI or its third-party CDN could get\nyou a package different from the one you signed up for. To guarantee\nknown-good dependencies for your deployments, you had to run a local package\nindex, manually uploading packages as you vetted them, maintaining a set of\nACLs for that server, and trying to somehow keep an audit trail of who did\nwhat. Alternatively, you could check everything into a vendor library, but that\nmeant a lot of fooling around with your VCS (or maintaining custom tooling) to\ndo upgrades.\n\nPeep fixes all that.\n\nVet your packages, and put hashes of the PyPI-sourced tarballs into\n``requirements.txt``, like this::\n\n # sha256: L9XU_-gfdi3So-WEctaQoNu6N2Z3ZQYAOu4-16qor-8\n Flask==0.9\n\n # sha256: qF4YU3XbdcEJ-Z7N49VUFfA15waKgiUs9PFsZnrDj0k\n Jinja2==2.6\n\nThen, use ``peep install`` instead of ``pip install``, and let the crypto do\nthe rest. If a downloaded package doesn't match the expected hash, Peep will\nfreak out, and installation will go no further.\n\nThere are no servers to maintain, no enormous vendor libs to wrestle, and no\nneed to trust a package author's key management practices. With the addition\nof a few hashes to your requirements file, you can know that your chain of\ntrust is safely rooted in your own source tree.\n\n\nSwitching to Peep\n=================\n\n1. Install Peep::\n\n pip install peep\n\n (Or, better, embed ``peep.py`` into your codebase as described in the\n Embedding section below. That eliminates having to trust an unauthenticated\n PyPI download, assuming you manually vet ``peep.py`` itself the first time.)\n2. Use Peep to install your project once::\n\n cd yourproject\n peep install -r requirements.txt\n\n You'll get output like this::\n\n \n\n The following packages had no hashes specified in the requirements file,\n which leaves them open to tampering. Vet these packages to your\n satisfaction, then add these \"sha256\" lines like so:\n\n # sha256: L9XU_-gfdi3So-WEctaQoNu6N2Z3ZQYAOu4-16qor-8\n Flask==0.9\n\n # sha256: qF4YU3XbdcEJ-Z7N49VUFfA15waKgiUs9PFsZnrDj0k\n Jinja2==2.6\n\n # sha256: u_8C3DCeUoRt2WPSlIOnKV_MAhYkc40zNZxDlxCA-as\n Pygments==1.4\n\n # sha256: A1gwhyCNozcxug18_9RjJTmJQa1rctOt-AnP7_yR0PM\n https://github.com/jsocol/commonware/archive/b5544185b2d24adc1eb512735990752400ce9cbd.zip#egg=commonware\n\n -------------------------------\n Not proceeding to installation.\n3. Vet the packages coming off PyPI in whatever way you typically do. For\n instance, read them, or compare them with known-good local copies.\n4. Add the recommended hash lines to your ``requirements.txt``, each one\n directly above the requirement it applies to. (The hashes are of the\n original, compressed tarballs from PyPI.)\n5. In the future, always use ``peep install`` to install your requirements. You\n are now cryptographically safe!\n\n.. warning::\n\n Be careful not to nullify all your work when you install your actual\n project. If you use ``python setup.py install``, setuptools will happily go\n out and download, unchecked, any requirements you missed in\n ``requirements.txt`` (and it's easy to miss some as your project evolves).\n One way to be safe is to pack up your project and then install that using\n pip and ``--no-deps``::\n\n python setup.py sdist\n pip install --no-deps dist/yourproject-1.0.tar.gz\n\n\nThe Fearsome Warning\n====================\n\nIf, during installation, a hash doesn't match, Peep will say something like\nthis::\n\n THE FOLLOWING PACKAGES DIDN'T MATCH THE HASHES SPECIFIED IN THE\n REQUIREMENTS FILE. If you have updated the package versions, update the\n hashes. If not, freak out, because someone has tampered with the packages.\n\n requests: expected FWvz7Ce6nsfgz4--AoCHGAmdIY3kA-tkpxTXO6GimrE\n got YhddA1kUpMLVODNbhIgHfQn88vioPHLwayTyqwOJEgY\n\nIt will then exit with a status of 1. Freak out appropriately.\n\n\nOther Features\n==============\n\n* Peep implicitly turns on pip's ``--no-deps`` option so unverified\n dependencies of your requirements can't sneak through.\n* All non-install commands just fall through to pip, so you can use Peep\n all the time if you want. This comes in handy for existing scripts that have\n a big ``$PIP=/path/to/pip`` at the top.\n* Peep-compatible requirements files remain entirely usable with ``pip``,\n because the hashes are just comments, after all.\n* Have a manually downloaded package you've vetted? Run ``peep hash`` on its\n tarball (the original, from PyPI--be sure to keep it around) to get its hash\n line::\n\n % peep hash nose-1.3.0.tar.gz\n # sha256: TmPMMyXedc-Y_61AvnL6aXU96CRpUXMXj3TANP5PUmA\n* If a package is already present--which might be the case if you're installing\n into a non-empty virtualenv--Peep doesn't bother downloading or building it\n again. It assumes you installed it with Peep in a previous invocation and\n thus trusts it. The only exception to this is for URL-specified requirements where the\n URL contains a SHA-like filename (eg https://github.com/foo/bar/archive/.zip),\n since the package version number is typically not incremented for every commit, so\n Peep cannot be sure the contents have not changed. \n Note: Re-using a virtualenv during deployment can really speed things up, but you will\n need to manually remove dependencies that are no longer in the requirements file.\n* ``peep port`` converts a peep-savvy requirements file to one compatible with\n `pip 8's new hashing functionality\n `_::\n\n % peep port requirements.txt\n certifi==2015.04.28 \\\n --hash=sha256:268fa00c27de756d71663dd61f73a4a8d8727569bb1b474b2ce6020553826872 \\\n --hash=sha256:99785e6cf715cdcde59dee05a676e99f04835a71e7ced201ca317401c322ba96\n click==4.0 --hash=sha256:9ab1d313f99b209f8f71a629f36833030c8d7c72282cf7756834baf567dca662\n\n Note that comments and URLs don't make it through, but the hard part\u2014hash\n format conversion\u2014is taken care of for you.\n\n\nEmbedding\n=========\n\nPeep was designed for unsupervised continuous deployment scenarios. In such\nscenarios, manual ahead-of-time preparation on the deployment machine is a\nliability: one more thing to go wrong. To relieve you of having to install (and\nupgrade) Peep by hand on your server or build box, we've made Peep\nembeddable. You can copy the ``peep.py`` file directly into your project's\nsource tree and call it from there in your deployment script. This also gives\nyou an obvious starting point for your chain of trust: however you trust your\nsource code is how you trust your copy of Peep, and Peep verifies\neverything else via hashes. (Equivalent would be if your OS provided Peep as a\npackage--presumably you trust your OS packages already--but this is not yet\ncommon.)\n\n\nSecurity and Insecurity\n=======================\n\nHere's what you get for free with Peep--and what you don't.\n\n**You get repeatability.** If you ``peep install`` package ``Foo==1.2.3``,\nevery subsequent install of ``Foo==1.2.3`` will be the same as the original\n(or Peep will complain).\n\n**Peep does not magically vet your packages.** Peep is not a substitute for\ncombing through your packages for malicious code or comparing them with\nknown-good versions. If you don't vet them, they are not vetted.\n\n**Peep does not make authors or indices trustworthy.** All Peep does is\nguarantee that subsequent downloads of ``Foo==1.2.3`` are the same as the\nfirst one. It doesn't guarantee the author of that package is trustworthy. It\ndoesn't guarantee that the author of that package is the one who released that\npackage. It doesn't guarantee that the package index is trustworthy.\n\n\nTroubleshooting\n===============\n\nMultiple Hashes: Architecture-Specific Packages and Old Versions of PyPI\n------------------------------------------------------------------------\n\nAre you suddenly getting the Fearsome Warning? Maybe you're really in trouble,\nbut maybe something more innocuous is happening.\n\nIf your packages install from wheels or other potentially architecture-specific\nsources, their hashes will obviously differ across platforms. If you deploy on\nmore than one, you'll need more than one hash.\n\nAlso, some packages offer downloads in multiple formats: for example, zips and\ntarballs, or zips and wheels. Which version gets downloaded can vary based on\nyour version of pip, meaning some packages may effectively have more than one\nvalid hash.\n\nTo support these scenarios, you can stack up multiple known-good hashes above a\nrequirement, as long as they are within a contiguous block of commented lines::\n\n # Tarball:\n # sha256: lvpN706AIAvoJ8P1EUfdez-ohzuSB-MyXUe6Rb8ppcE\n #\n # And the zip file:\n # sha256: 6QTt-5DahBKcBiUs06BfkLTuvBu1uF7pblb_bPaUONU\n mock==0.8.0\n\nIf you don't want to wait until you're bitten by this surprise, use the ``peep\nhash`` command to find hashes of each equivalent archive for a package. I like\nto vet one of them (say, the tarball), then download the others and use a file\ncomparison tool to verify that they have identical contents. Then I run ``peep\nhash`` over both original archives, like so, and add the result to my\n``requirements.txt``::\n\n % peep hash mock-0.8.0.tar.gz mock-0.8.0.zip\n # sha256: lvpN706AIAvoJ8P1EUfdez-ohzuSB-MyXUe6Rb8ppcE\n # sha256: 6QTt-5DahBKcBiUs06BfkLTuvBu1uF7pblb_bPaUONU\n\nUpgrading Wheels with Old Versions of pip\n-----------------------------------------\n\nIf you're reusing a virtualenv and using Peep with pip <6.0, then you should\navoid using wheels. Otherwise, the old version of a package will not be entirely\nremoved before the new one is installed, due to\nhttps://github.com/pypa/pip/issues/1825.\n\nIf you're using pip 1.4, don't pass the ``--use-wheel`` argument.\n\nIf you're using pip 1.5, pass the ``--no-use-wheel`` argument.\n\n\nVersion History\n===============\n\n3.1.2\n * Fix compatibility with pip 8.1.2. (abbeyj)\n\n3.1.1\n * The \"peep had a problem\" traceback is no longer output for several cases\n of pip installation errors that were not peep's fault: for instance, the\n specified package version or requirements file not existing.\n * ``peep port`` now emits URLs for URL-based requirements, if you're using\n pip 6.1.0 or greater. (jotes)\n\n3.1\n * Print the name each new requirements file we encounter during ``peep\n port``. This helps untangle the mess if your files use includes. (pmac)\n * Always put hashes on their own lines, even if there's only one. (pmac)\n\n3.0\n * Add support for pip 8.x.\n * Drop support for the ``--allow-external``, ``--allow-unverified`` and\n ``--allow-all-external`` arguments (for compatibility with pip 8).\n * Drop support for Python 3.1/3.2.\n\n2.5\n * Support pip 7.x, through the currently latest 7.1.2, working around its\n buggy line counting. (kouk)\n * Add ``peep port`` command to facilitate the transition to `pip 8's hashing\n `_.\n * Fix bug in which the right way to call ``parse_requirements()`` would not\n be autodetected.\n\n2.4.1\n * Tolerate pip.__version__ being missing, which can apparently happen in\n arcane situations during error handling, obscuring informative tracebacks.\n * Fix flake8 warnings again, and add flake8 to Travis runs.\n\n2.4\n * Add support for flags in the requirements file, pip-style, such as\n specifying alternative indices with ``-i``.\n * Remove a duplicate ``#egg=`` segment from an error message.\n\n2.3\n * Copy the operative portion of the MIT license into peep.py so embedding it\n doesn't break the license.\n * Fix flake8 linter warnings.\n * Make peep compatible with pip v6.1.0+.\n * Add tests against pip 6.0.8, 6.1.0, and 6.1.1 to the tox config.\n * Run full set of tox tests on Travis.\n\n2.2\n * Add progress indication while downloading. Used with pip 6.0 and above, we\n show a nice progress bar. Before that, we just mention the packages as we\n download them.\n * Remove extra skipped lines from the output.\n * Add tests against pip 6.0.7 to the tox config.\n\n2.1.2\n * Get rid of repetition of explanatory messages at the end of a run when one\n applies to multiple packages.\n\n2.1.1\n * Fix bug in which peep would not upgrade a package expressed in terms of a\n GitHub-dwelling zip file if its version had not changed.\n * Add tests against pip 6.0.4, 6.0.5, and 6.0.6 to the tox config.\n\n2.1\n * Support pip 6.x.\n * Make error reporting friendly, emitting a bug reporting URL and\n environment info along with the traceback.\n\n2.0\n * Fix major security hole in which a package's setup.py would be executed\n after download, regardless of whether the package's archive matched a hash.\n Specifically, stop relying on pip for downloading packages, as it likes to\n run setup.py to extract metadata. Implement our own downloading using\n what's available everywhere: urllib2. As a result, HTTP proxies,\n basic auth, and ``--download-cache`` are unsupported at the moment.\n * Refactor significantly for comprehensibility.\n * Drastically improve test coverage.\n * Note that HTTPS certs are no longer checked. This shouldn't matter, given\n our hash checks.\n\n1.4\n * Allow partial-line comments.\n * Add the beginnings of a test suite.\n * Treat package names in requirements files as case-insensitive, like pip.\n\n1.3\n * Pass through most args to the invocation of ``pip install`` that actually\n installs the downloaded archive. This means you can use things like\n ``--install-options`` fruitfully.\n * Add Python 3.4 support by correcting an import.\n * Install a second peep script named after the active Python version, e.g.\n peep-2.7. This is a convenience for those using multiple versions of\n Python and not using virtualenvs.\n\n1.2\n * Support GitHub-style tarballs (that is, ones whose filenames don't contain\n the distro name or version and whose version numbers aren't reliable) in\n requirements files. (Will Kahn-Greene)\n * Warn when a URL-based requirement lacks ``#egg=``. (Chris Adams)\n\n1.1\n * Support Python 3. (Keryn Knight)\n\n1.0.2\n * Add support for .tar.bz2 archives. (Paul McLanahan)\n\n1.0.1\n * Fix error (which failed safe) installing packages whose distro names\n contain underscores. (Chris Ladd)\n\n1.0\n * Add wheel support. Peep will now work fine when pip decides to download a\n wheel file. (Paul McLanahan)\n\n0.9.1\n * Don't crash when trying to report a missing hash on a package that's\n already installed.\n\n0.9\n * Put the operative parts of peep into a single module rather than a package,\n and make it directly executable. (Brian Warner)\n\n0.8\n * Support installing into non-empty virtualenvs, for speed. We do this by\n trusting any already-installed package which satisfies a requirement. This\n means you no longer have to rebuild ``lxml``, for instance, each time you\n deploy.\n * Wrap text output to 80 columns for nicer word wrap.\n\n0.7\n Make some practical tweaks for projects which bootstrap their trust chains by\n checking a tarball of peep into their source trees.\n\n * Start supporting versions of pip back to 0.6.2 (released in January 2010).\n This way, you can deploy trustworthily on old versions of RHEL just by\n checking a tarball of peep into your source tree and pip-installing it; you\n don't have to check in pip itself or go to the bother of unpacking the peep\n tarball and running ``python setup.py install`` from your deploy script.\n * Remove the explicit dependency on pip. This is so a blithe call to\n ``pip install peep.tar.gz`` without ``--no-deps`` doesn't go out and pull\n an untrusted package from PyPI. Instead, we scream at runtime if pip is\n absent or too old. Fail safe.\n\n0.6\n * Add ``peep hash`` subcommand.\n * Require pip>=1.2, as lower versions have a bug that causes a crash on\n ``peep install``.\n\n0.5\n * Allow multiple acceptable hashes for a package. This works around PyPI's\n non-stable handling of packages like mock, which provide equivalent\n zips and tarballs:\n https://bitbucket.org/pypa/pypi/issue/64/order-of-archives-on-index-page-is-not.\n\n0.4\n * Rework how peep downloads files and determines versions so we can tolerate\n PEP-386-noncompliant package version numbers. This amounted to a minor\n rewrite.\n * Remove indentation from hash output so you don't have to dedent it after\n pasting it into ``requirements.txt``.\n\n0.3\n * Support Windows and other non-Unix OSes.\n * The hash output now includes the actual version numbers of packages, so you\n can just paste it straight into your ``requirements.txt``.\n\n0.2.1\n * Add a shebang line so you can actually run ``peep`` after doing ``pip\n install peep``. Sorry, folks, I was doing ``setup.py develop`` on my own\n box.\n\n0.2\n * Fix repeated-logging bug.\n * Fix spurious error message about not having any requirements files.\n * Pass pip's exit code through to the outside for calls to non-``install``\n subcommands.\n * Improve spacing in the final output.\n\n0.1\n * Proof of concept. Does all the crypto stuff. Should be secure. Some rough\n edges in the UI.", "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/erikrose/peep", "keywords": "pip,secure,repeatable,deploy,deployment,hash,install,installer", "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "peep", "package_url": "https://pypi.org/project/peep/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/peep/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/erikrose/peep" }, "release_url": "https://pypi.org/project/peep/3.1.2/", "requires_dist": null, "requires_python": null, "summary": "A \"pip install\" that is cryptographically guaranteed repeatable", "version": "3.1.2" }, "last_serial": 2111555, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "1d44661b9f36baa0be7ad678eb22f4df", "sha256": "157ecfc22b0b35032d849e0cd9fa8666e900eeeb476e531399e99dc9a5d18003" }, "downloads": -1, "filename": "peep-0.1.tar.gz", "has_sig": false, "md5_digest": "1d44661b9f36baa0be7ad678eb22f4df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6273, "upload_time": "2013-06-21T20:50:21", "url": "https://files.pythonhosted.org/packages/34/0d/df14a7810cfe747f41795ab3a10831f11dba160478dfc3905626b55ae16d/peep-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "9b18b5247c63a2b806d6cbee2304bdc4", "sha256": "65f8b60735245000cd1f89c213398bfc4506adeb38a2044b306220154ad90cf9" }, "downloads": -1, "filename": "peep-0.2.tar.gz", "has_sig": false, "md5_digest": "9b18b5247c63a2b806d6cbee2304bdc4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6741, "upload_time": "2013-06-21T23:57:55", "url": "https://files.pythonhosted.org/packages/a5/1b/17e66bc06ff53e0f471b48c1149d611812c1787a691c2decb0d795b618c0/peep-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "35eb45548de97cd14bb6bcfdd61220ce", "sha256": "f5de5d12253d7c2c84782fd57817d4b1a1c04055eb22da9ee0f80b0c0b280d26" }, "downloads": -1, "filename": "peep-0.2.1.tar.gz", "has_sig": false, "md5_digest": "35eb45548de97cd14bb6bcfdd61220ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6837, "upload_time": "2013-06-23T01:15:47", "url": "https://files.pythonhosted.org/packages/fd/24/943222aa31164979d252ee98a1823a0be2f777734968e3eee477f02a32d7/peep-0.2.1.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "ade5e80f944105bba3d6a1a1a484daf1", "sha256": "c0c9239bb74cefbf1a4a97a23c1e7e7245bc62fbd6f54e2db2d9d766f28303fd" }, "downloads": -1, "filename": "peep-0.3.tar.gz", "has_sig": false, "md5_digest": "ade5e80f944105bba3d6a1a1a484daf1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7405, "upload_time": "2013-08-22T03:41:06", "url": "https://files.pythonhosted.org/packages/22/5f/74acfb97b1524eacea51c2936d17ce7f86b22da2911cf7bc4fb17fb6d777/peep-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "c20b87258dc64de51eca5e6737601bda", "sha256": "ee287a3d5c3937f68b96b706fb1c216bd1a7065f67256751a6493b8d7fb88caf" }, "downloads": -1, "filename": "peep-0.4.tar.gz", "has_sig": false, "md5_digest": "c20b87258dc64de51eca5e6737601bda", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7962, "upload_time": "2013-08-29T14:53:20", "url": "https://files.pythonhosted.org/packages/a8/a9/66a1fa9ff96cdaa67d9d75178da1671dda827ba8a3b02e67e5ba4cf98947/peep-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "8332add701ad72d61a4a6b27db585eb1", "sha256": "35271a1764856d6bfde6c738ebf4b994572109a3f0724a97a8e33d12eec97aac" }, "downloads": -1, "filename": "peep-0.5.tar.gz", "has_sig": false, "md5_digest": "8332add701ad72d61a4a6b27db585eb1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8818, "upload_time": "2013-09-09T21:43:26", "url": "https://files.pythonhosted.org/packages/a5/0f/84c8c35590d464e16e6fe4d286c0e7153c81fe763c9c9254e10c63abe8d5/peep-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "23585ee921e4996daa0e052361a778b4", "sha256": "42d9c0c3c6155bad14f75f654e7f7b8fb8899abd95a15b9031256e682c9df345" }, "downloads": -1, "filename": "peep-0.6.tar.gz", "has_sig": false, "md5_digest": "23585ee921e4996daa0e052361a778b4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9686, "upload_time": "2013-09-13T15:04:49", "url": "https://files.pythonhosted.org/packages/2e/d2/64a4f69628c13d0b8c95d16706ce8f1949f83035dcb2583d636c877f09bd/peep-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "608e26ad66a6be89aef7266cdac6fc01", "sha256": "5fb8a5c9aa92b56c42b64c59742fe8d9cca6418f6dd33362bdbf0096dab95e36" }, "downloads": -1, "filename": "peep-0.7.tar.gz", "has_sig": false, "md5_digest": "608e26ad66a6be89aef7266cdac6fc01", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10543, "upload_time": "2013-09-13T22:06:14", "url": "https://files.pythonhosted.org/packages/26/b1/cea076c3e9279974270f096c8489f3455d44c52f0442b95d05567d630c10/peep-0.7.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "4a79b6ae8d606722ebf1890462de8cf9", "sha256": "3313e57f79bb66abd675a5991166e7034f27737702c188a1309d2f0c7943ec8a" }, "downloads": -1, "filename": "peep-0.8.tar.gz", "has_sig": false, "md5_digest": "4a79b6ae8d606722ebf1890462de8cf9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11070, "upload_time": "2013-09-25T16:49:55", "url": "https://files.pythonhosted.org/packages/d9/e3/f56fa0dcac8095bd2fc0002f364f0be34a298249d9c1ede20d3429fdd49c/peep-0.8.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "83725b9c13d53478db848bd3940cc47d", "sha256": "ae814156b02fb613b7b4ee7924dfc5ce48b6a34d3b065bcf720d34b6f7ecf0d5" }, "downloads": -1, "filename": "peep-0.9.tar.gz", "has_sig": false, "md5_digest": "83725b9c13d53478db848bd3940cc47d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11478, "upload_time": "2014-02-04T22:49:37", "url": "https://files.pythonhosted.org/packages/fc/68/dc0a97210e283ad36b4cf272306fa46aa5687ca8078df3fd34eb09d49460/peep-0.9.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "10addc30fa977550ab185bbe4502f929", "sha256": "66778e93ca477ff28bf4cd8414ddeaf69902c3c53c9a217ed4a2bdfa4d7af9fd" }, "downloads": -1, "filename": "peep-0.9.1.tar.gz", "has_sig": false, "md5_digest": "10addc30fa977550ab185bbe4502f929", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11587, "upload_time": "2014-02-28T20:14:13", "url": "https://files.pythonhosted.org/packages/2b/ab/26cb6a04ac79031dee07bb22d96aadccc8babc6cd8c5efb09c1a08db90b1/peep-0.9.1.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "05e21252a8a41e4987df826f98368971", "sha256": "c939d3e487380fe40f3bed4891be30157a67754b91a6915da5386bb31dfaa750" }, "downloads": -1, "filename": "peep-1.0.tar.gz", "has_sig": false, "md5_digest": "05e21252a8a41e4987df826f98368971", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12236, "upload_time": "2014-03-27T19:20:52", "url": "https://files.pythonhosted.org/packages/c3/d3/d6153eab3c6752b1542feaa191d649c930a275c08b95cee8ef3e716d2d6a/peep-1.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "95c372d2f2578e09cdccb3e148aae0d4", "sha256": "a0620fde4466138f1e96e720bc2af64068e38c5961a3b8d76cd0eef38b7f4662" }, "downloads": -1, "filename": "peep-1.0.1.tar.gz", "has_sig": false, "md5_digest": "95c372d2f2578e09cdccb3e148aae0d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12398, "upload_time": "2014-03-31T17:13:46", "url": "https://files.pythonhosted.org/packages/e7/e3/de60180bbcefb87556a94c8a26feb2e2b278cad4f3d0c14eb9665ada90c5/peep-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "9065f2a7ed212ebad976d9daa1d70961", "sha256": "dfda118fe862f84e81768b12cb443cc31fe4bfe7ae02522ade7c28ab6963f404" }, "downloads": -1, "filename": "peep-1.0.2.tar.gz", "has_sig": false, "md5_digest": "9065f2a7ed212ebad976d9daa1d70961", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12576, "upload_time": "2014-04-02T14:59:24", "url": "https://files.pythonhosted.org/packages/de/c3/7c83ceeb5b85a7efba44c0f5bae5461adff48c43c337f522ec2c10678105/peep-1.0.2.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "4c75d79e539b9d8bd55f0515521fbd4a", "sha256": "560f69a5421f4d0b895b143ba0694727aeefbb4a83bbfc45b446921976c4d05a" }, "downloads": -1, "filename": "peep-1.1.tar.gz", "has_sig": false, "md5_digest": "4c75d79e539b9d8bd55f0515521fbd4a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16809, "upload_time": "2014-04-06T02:26:39", "url": "https://files.pythonhosted.org/packages/0c/6e/2a0cf65c97704b9cbff951820beff2f2d2e0560b74159267738816b270e7/peep-1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "9dd41effe9a17c4d19cb4dfe1faad0dc", "sha256": "9a5a97d77d5fc60e2048a3a9bb5e1e7ef9261b445383dd6ba43c48a6fc91c007" }, "downloads": -1, "filename": "peep-1.2.tar.gz", "has_sig": false, "md5_digest": "9dd41effe9a17c4d19cb4dfe1faad0dc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18124, "upload_time": "2014-06-10T21:10:31", "url": "https://files.pythonhosted.org/packages/1d/f2/4aad340221886b783f90499a289ddd81b156e6daab00928541c21ba6afb4/peep-1.2.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "c01079d55c3be9a2d6f837fc184e6863", "sha256": "d58881af17a82b2c559ee3ef695105f7a01f6b26196a9fb35cb1f150fc4f8f3c" }, "downloads": -1, "filename": "peep-1.3.tar.gz", "has_sig": false, "md5_digest": "c01079d55c3be9a2d6f837fc184e6863", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18466, "upload_time": "2014-08-05T16:21:56", "url": "https://files.pythonhosted.org/packages/5b/d3/ac852ccbaa479024036e686cc409033db62d7397c5d97ed2ad6070543428/peep-1.3.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "4ed2c9f6264a8050a8bfe90a243e6cd1", "sha256": "d04f3a63320b6358c94edb6c822a0fdf399a10842257e4e7a7dc2539852092b8" }, "downloads": -1, "filename": "peep-2.0.tar.gz", "has_sig": false, "md5_digest": "4ed2c9f6264a8050a8bfe90a243e6cd1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23574, "upload_time": "2014-12-06T00:00:34", "url": "https://files.pythonhosted.org/packages/df/bd/7b9061ce5869a5b93a2c99acc0fc8a07b8fc977eaf33dce064431a945700/peep-2.0.tar.gz" } ], "2.1": [ { "comment_text": "", "digests": { "md5": "10d69082a0d0a2dda87bfb824a944284", "sha256": "0f754dd3fc204e1abbfd79c47f25595c5a94d247ce5ae52bb269995aa2e79933" }, "downloads": -1, "filename": "peep-2.1.tar.gz", "has_sig": false, "md5_digest": "10d69082a0d0a2dda87bfb824a944284", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24417, "upload_time": "2015-01-07T18:34:13", "url": "https://files.pythonhosted.org/packages/01/6b/aee0c981ee94808ae223b4e94dd14e4415e11da36d22dfb808252a156021/peep-2.1.tar.gz" } ], "2.1.1": [ { "comment_text": "", "digests": { "md5": "4838e01bcf8cde2d8a46cddaa78562bc", "sha256": "de631f3b931144a90252ae55185d5c91b57de46ed872c2a49c0dd9dd1d48b49d" }, "downloads": -1, "filename": "peep-2.1.1.tar.gz", "has_sig": false, "md5_digest": "4838e01bcf8cde2d8a46cddaa78562bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24879, "upload_time": "2015-01-15T21:02:09", "url": "https://files.pythonhosted.org/packages/d6/d6/fd8a3255d97eb72cd5c197badca7bc2b06b5719d4aa1bc0bfba9e387baca/peep-2.1.1.tar.gz" } ], "2.1.2": [ { "comment_text": "", "digests": { "md5": "95b471a6f9cb01a964275f409ad22cbf", "sha256": "164908f3f3e82b6bf18db51d09ab0408c4cc909a82158aeb628d4e27701323b0" }, "downloads": -1, "filename": "peep-2.1.2.tar.gz", "has_sig": false, "md5_digest": "95b471a6f9cb01a964275f409ad22cbf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24986, "upload_time": "2015-01-23T22:58:21", "url": "https://files.pythonhosted.org/packages/0f/0a/bcf105a7f9bf6be049bb81e6e0d8e63085b5e6c30f9bb997cdf148adec70/peep-2.1.2.tar.gz" } ], "2.2": [ { "comment_text": "", "digests": { "md5": "f4169d89ffe22f0b9dfa81e86f5f7920", "sha256": "3d4eaff2f60dea9cbbad32aa6441c6542898ffda364448b13982346a5ed64570" }, "downloads": -1, "filename": "peep-2.2.tar.gz", "has_sig": false, "md5_digest": "f4169d89ffe22f0b9dfa81e86f5f7920", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25586, "upload_time": "2015-02-02T17:09:54", "url": "https://files.pythonhosted.org/packages/9b/c4/fe8ec28e031d4ab0e6798ca11c4a3f6ef8384eff7f44b33ebbdf10629594/peep-2.2.tar.gz" } ], "2.3": [ { "comment_text": "", "digests": { "md5": "eb289470e6795c3739e01c33b6cf290f", "sha256": "345e0ed1920136316ba647c2362679b990593ee77c321dbf518c82e9bf20bc93" }, "downloads": -1, "filename": "peep-2.3.tar.gz", "has_sig": false, "md5_digest": "eb289470e6795c3739e01c33b6cf290f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26010, "upload_time": "2015-04-15T23:37:11", "url": "https://files.pythonhosted.org/packages/53/17/84103ed951510ccc8c2a75d8c9daf2dbe09d782d4400a0b7b7e0dfb9f57b/peep-2.3.tar.gz" } ], "2.4": [ { "comment_text": "", "digests": { "md5": "703122c2529dae1cd5e8c4a86b5e0222", "sha256": "e1b99c6b02bfb42a7fc8907adb8cee5e464b44f88033591202b2e56054e36505" }, "downloads": -1, "filename": "peep-2.4.tar.gz", "has_sig": false, "md5_digest": "703122c2529dae1cd5e8c4a86b5e0222", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26259, "upload_time": "2015-04-16T22:08:18", "url": "https://files.pythonhosted.org/packages/92/fc/f0bd5d27cf6b1de6558692a076af6ec688daa8b5fdc7b2eee60e16afedfb/peep-2.4.tar.gz" } ], "2.4.1": [ { "comment_text": "", "digests": { "md5": "92a7425ffda88cda3fba3bb2857fd8b2", "sha256": "2a804ce07f59cf55ad545bb2e16312c11364b94d3f9386d6e12145b2e38e5c1c" }, "downloads": -1, "filename": "peep-2.4.1.tar.gz", "has_sig": false, "md5_digest": "92a7425ffda88cda3fba3bb2857fd8b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26912, "upload_time": "2015-04-30T17:17:29", "url": "https://files.pythonhosted.org/packages/1a/b4/569b6514e66577537db2f0c7b871efd65f89631781800131ba81639cd499/peep-2.4.1.tar.gz" } ], "2.5.0": [ { "comment_text": "", "digests": { "md5": "660cadb520b0915db69699c568a8cea8", "sha256": "e69fcfa2bf4d90cde5003985e51d6f952a3d77239e43af7905764912c3fb25dc" }, "downloads": -1, "filename": "peep-2.5.0.tar.gz", "has_sig": false, "md5_digest": "660cadb520b0915db69699c568a8cea8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28910, "upload_time": "2015-12-03T03:27:12", "url": "https://files.pythonhosted.org/packages/24/88/13331f9b8a7580ae8019fbd87625ddbbfe9b01932b9f515345e77c57a8ef/peep-2.5.0.tar.gz" } ], "3.0": [ { "comment_text": "", "digests": { "md5": "d0be1f53ad495c9148e9e175539fd3da", "sha256": "e70c4f640c9b240f75f04447e3eecee028aaeeef4ab70a2a51d76d136edba284" }, "downloads": -1, "filename": "peep-3.0.tar.gz", "has_sig": false, "md5_digest": "d0be1f53ad495c9148e9e175539fd3da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29642, "upload_time": "2016-01-21T15:39:39", "url": "https://files.pythonhosted.org/packages/aa/32/82bad83f87dea83db4319d30e808173250394fad29eb713b0878b11b924b/peep-3.0.tar.gz" } ], "3.1": [ { "comment_text": "", "digests": { "md5": "c4ae47feffc70bb8594c5db3dbd055bc", "sha256": "4bf45af8c283cb81859e43b128b1cf6d37bf96cad12f55f0365bf7ba22a1a1a3" }, "downloads": -1, "filename": "peep-3.1.tar.gz", "has_sig": false, "md5_digest": "c4ae47feffc70bb8594c5db3dbd055bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29990, "upload_time": "2016-01-25T22:47:52", "url": "https://files.pythonhosted.org/packages/34/9b/bbcc5569b89fce8a3331e43a44a84ad54f6ca502b1c98639b7a63a750620/peep-3.1.tar.gz" } ], "3.1.1": [ { "comment_text": "", "digests": { "md5": "b82b0468c1dba7dfa9bb09cb88a12436", "sha256": "9ee5702ccd5d16d54ac9dcfce4a7c8ac90020cfe4e6b494ca44c68492add364c" }, "downloads": -1, "filename": "peep-3.1.1.tar.gz", "has_sig": true, "md5_digest": "b82b0468c1dba7dfa9bb09cb88a12436", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30304, "upload_time": "2016-02-16T22:43:29", "url": "https://files.pythonhosted.org/packages/d0/f4/21011b669ae99b63a0dbbae268d79e2bd98460fb0bc98670792ff4ad5a8f/peep-3.1.1.tar.gz" } ], "3.1.2": [ { "comment_text": "", "digests": { "md5": "e221a0dc9cdf7aa10b5f714ac8ff8fcf", "sha256": "23047e8dfba2bb825e337fb233e060d181f3b66f039d972ca6e74383dada402b" }, "downloads": -1, "filename": "peep-3.1.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "e221a0dc9cdf7aa10b5f714ac8ff8fcf", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 30273, "upload_time": "2016-05-11T22:10:34", "url": "https://files.pythonhosted.org/packages/de/29/441095975f5246f43125f05f4de9b8b48cdc832d34acdff603fdf4b867c7/peep-3.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "04607549fe82a4422fbc9e52a5bb4cf1", "sha256": "96565873c3bff616789fef180bcce3c03f18118b8c7bba80b2c7529d18a4d156" }, "downloads": -1, "filename": "peep-3.1.2.tar.gz", "has_sig": true, "md5_digest": "04607549fe82a4422fbc9e52a5bb4cf1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30372, "upload_time": "2016-05-11T22:10:44", "url": "https://files.pythonhosted.org/packages/28/e6/c26504cc609efe302700cd2a10691dbbe28e59a659dedb9633b6b9ee9bd3/peep-3.1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e221a0dc9cdf7aa10b5f714ac8ff8fcf", "sha256": "23047e8dfba2bb825e337fb233e060d181f3b66f039d972ca6e74383dada402b" }, "downloads": -1, "filename": "peep-3.1.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "e221a0dc9cdf7aa10b5f714ac8ff8fcf", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 30273, "upload_time": "2016-05-11T22:10:34", "url": "https://files.pythonhosted.org/packages/de/29/441095975f5246f43125f05f4de9b8b48cdc832d34acdff603fdf4b867c7/peep-3.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "04607549fe82a4422fbc9e52a5bb4cf1", "sha256": "96565873c3bff616789fef180bcce3c03f18118b8c7bba80b2c7529d18a4d156" }, "downloads": -1, "filename": "peep-3.1.2.tar.gz", "has_sig": true, "md5_digest": "04607549fe82a4422fbc9e52a5bb4cf1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30372, "upload_time": "2016-05-11T22:10:44", "url": "https://files.pythonhosted.org/packages/28/e6/c26504cc609efe302700cd2a10691dbbe28e59a659dedb9633b6b9ee9bd3/peep-3.1.2.tar.gz" } ] }