{ "info": { "author": "Alex Conrad", "author_email": "alexandre@surveymonkey.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "defrost\n=======\n\nNOTE: this package was originally called ``pipfreeze`` but was renamed to avoid\nconfusion with the command ``pip freeze``.\n\nDefrost is a command line tool to check if the output of the ``pip freeze``\ncommand complies with a set of package requirements defined in a YAML file.\n\nUsage\n-----\n\n.. code-block::\n\n defrost --help\n\nFirst define a set of package requirements in a YAML file, ``requirements.yml``.\n\n.. code-block:: yaml\n\n ---\n requirements:\n - requirement: foobar>=1.0\n reason: foobar pre-1.0 is no longer supported, please upgrade to 1.x\n\n - requirement: ordereddict<0.0\n reason: OrderedDict is part of Python 2.7 and above. If you are still running Python 2.6, please upgrade!\n\nThen you can pipe the output of ``pip freeze`` to defrost while providing the YAML file.\n\n.. code-block::\n\n $ pip freeze > freeze.out\n $ defrost requirements.yml freeze.out\n Package(foobar==1.2) does not satisfy Requirement(foobar>=2.0): foobar pre-1.0 is no longer supported, please upgrade to 1.x\n\nDefrost can also take the pip freeze output as stdin by passing a dash sign\n``-`` as argument in place of the pip freeze output file.\n\n.. code-block::\n\n $ pip freeze | defrost requirements.yml -\n Package(foobar==1.2) does not satisfy Requirement(foobar>=2.0): foobar pre-1.0 is no longer supported, please upgrade to 1.x\n\nYou can also check whether the YAML file provided is valid with\n``defrost-lint``.\n\n.. code-block::\n\n $ defrost-lint requirements.yml\n\nInstall\n-------\n\n.. code-block::\n\n pip install defrost\n\nLibrary\n-------\n\nThere are 3 fundamental objects available:\n\n- ``PipFreeze``: a pythonic container of packages that takes a pip freeze\n output as input.\n- ``Package``: represents a package instance at an exact version (pinned)\n held by a PipFreeze container (e.g. ``foo==1.2``)\n- ``Requirement``: a requirement for a package represents one version\n or a range of versions for a given package, e.g. ``foo>=2.0`` is a\n requirement for all versions of foo greater or equal to 2.0. ``foo`` without\n a version specifier would mean all versions of ``foo``.\n\nPipFreeze\n~~~~~~~~~\n\nPipFreeze takes a pip freeze output as input and builds packages internally.\n\n.. code-block:: python\n\n >>> from defrost import PipFreeze\n\n >>> pip_freeze_output = \"\"\"\\\n foo==1.2.3\n bar==2.0\n \"\"\"\n\n >>> pip_freeze = PipFreeze(pip_freeze_output)\n >>> len(pip_freeze)\n 2\n\n >>> list(pip_freeze)\n [Package(foo==1.2.3), Package(bar==2.0)]\n\n # test presence of package foo that is less or equal to v2.0\n >>> 'foo<=2.0' in pip_freeze\n True\n\n # test presence of any version of package zoo\n >>> 'zoo' in pip_freeze\n False\n\n # test can also be done with a Package instance\n >>> Package('foo==0.1') in pip_freeze\n False\n\n # ... or with a Requirement\n >>> Requirement('bar>=2.0') in pip_freeze\n True\n\nPackage deprecation\n~~~~~~~~~~~~~~~~~~~\n\nYou can mark packages as deprecated by loading the YAML requirements file and\npassing the result of it to ``PipFreeze.load_requirements()``. Packages present\nin PipFreeze will be marked as deprecated if they don't satisfy the loaded\nrequirements. You can also provide an optional reason to why a package is\ndeprecated.\n\n.. code-block:: python\n\n >>> pip_freeze = PipFreeze(\"\"\"\\\n foobar==0.8\n bar==2.0\n ordereddict==1.1\n \"\"\")\n\n >>> import yaml\n >>> reqs = yaml.load(open('my-reqs.yaml'))\n >>> pip_freeze.load_requirements(reqs)\n >>> pip_freeze.deprecated\n [Package(foobar==0.8), Package(ordereddict==1.1)]\n >>> for package in pip_freeze.deprecated:\n ... print(\"%s: deprecated=%s, deprecated_by=%s, reason=%s\" % (\n package, package.deprecated, package.deprecated_by, package.deprecation_reason\n ))\n ...\n Package(foobar==0.8): deprecated=True, deprecated_by=Requirement(foobar>=1.0), reason=foobar pre-1.0 is no longer supported, please upgrade to 1.x\n Package(ordereddict==1.1): deprecated=True, deprecated_by=Requirement(ordereddict<0.0), reason=ordereddict is part of Python 2.7 and above. If you are still running Python 2.6, please upgrade!\n\nPackage\n~~~~~~~\n\nPackages take an exact package version as input.\n\n.. code-block:: python\n\n >>> from defrost import Package\n\n >>> package = Package('foo==1.2')\n >>> package.name\n 'foo'\n >>> package.version\n '1.2'\n\nIf you don't pass an exact version in your requirement it will raise a ``ValueError``.\n\n.. code-block:: python\n\n >>> package = Package('foo')\n >>> Package('foo')\n Traceback (most recent call last):\n File \"\", line 1, in \n ...\n ValueError: foo does not represent an exact package version; the format should be foo==1.0\n\nYou can also manually deprecate packages:\n\n.. code-block:: python\n\n >>> package = Package('foo==1.2')\n >>> package.deprecated\n False\n >>> package.deprecate(reason='because')\n >>> package.deprecated\n True\n >>> package.deprecation_reason\n 'because'\n\nRequirement\n~~~~~~~~~~~\n\nA requirement represents a range of package versions.\n\n.. code-block:: python\n\n >>> from defrost import Requirement\n\n >>> req = Requirement('foo>=1.0,<2.0')\n >>> req.name\n 'foo'\n >>> req.specifier\n [('>=', '1.0'), ('<', '2.0')]\n\nRequirements play well with packages. Using the Python operator ``in``, you\ncan check if a package satifies a requirement.\n\n.. code-block:: python\n\n >>> req = Requirement('foo>=1.0')\n >>> Package('foo==1.0') in req\n True\n >>> Package('foo==2.0') in req\n True\n >>> Package('foo==0.1') in req\n False\n\n\n0.4.0\n=====\n\n* implement ``PipFreeze.__getitem__`` and ``PipFreeze.get()``.\n\n0.3.2\n=====\n\n* gracefully handle blank lines and lines starting with dash\n (https://github.com/SurveyMonkey/defrost/pull/14)\n\n0.3.1\n=====\n\n* gracefully handle comments that may be present in pip freeze output\n\n0.3.0\n=====\n\n* introduce ``defrost-lint`` command to test the validity of requirement files.\n\n0.2.0\n=====\n\n* remove attributes ``Package.raw`` and ``Requirement.raw``, instead use\n ``Package.__str__()`` and ``Requirement.__str__()``.\n* ignore links found in pip freeze output (-f or -e lines)\n* Introduce the notion of deprecation severity. ``Package.deprecate()`` now\n takes a severity kwarg which defaults to ``\"error\"`` and a requirement entry\n in the YAML file now accepts an optional ``severity`` which can be set to\n ``error`` or ``warn``. This affects the exit status code for the command line\n interface.\n* ``PipFreeze.load_requirements()`` would choke if a reason was not provided\n\n0.1.0\n=====\n\n* add attribute ``Package.deprecated_by``\n* method ``Package.deprecate()`` takes an optional ``deprecated_by`` argument.\n* add command line utility to list deprecated packages given a requirement file\n and a pip freeze output file.\n* rename project pipfreeze to defrost to avoid confusion with the command\n ``pip freeze``.\n\n0.0.4\n=====\n\n* sort packages on name and then version such that ``foo==2.0`` comes before\n ``foo-bar==1.0`` which is not the case when both are treated as plain\n strings.\n\n0.0.3\n=====\n\n* implement ``Requirement``\n* implement ``Package``\n* implement ``PipFreeze.__contains__()``\n* implement ``PipFreeze.__len__()``\n* drop py26 support\n* remove ``PipFreeze.satisfies_requirement()``\n* implement ``PipFreeze.load_requirements()``\n\n0.0.2\n=====\n\n* implement ``PipFreeze.__bool__()`` (py3) and ``PipFreeze.__nonzero__()`` (py2)\n* implement ``PipFreeze.__iter__()``\n\n0.0.1\n=====\n\n* implement ``pipfreeze.PipFreeze``", "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/SurveyMonkey/defrost", "keywords": "defrost pip freeze output audit version requirements deprecate", "license": "MIT License", "maintainer": null, "maintainer_email": null, "name": "defrost", "package_url": "https://pypi.org/project/defrost/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/defrost/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/SurveyMonkey/defrost" }, "release_url": "https://pypi.org/project/defrost/0.4.0/", "requires_dist": null, "requires_python": null, "summary": "A tool to audit pip freeze outputs and test version requirements", "version": "0.4.0" }, "last_serial": 2029855, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "5e4e1aaf9d7f65d5286e7dc1b713b6a7", "sha256": "f4f450133f38b2c4e929924bfa8d309b9e2968679399754f80b1baa857942bd7" }, "downloads": -1, "filename": "defrost-0.1.0.tar.gz", "has_sig": false, "md5_digest": "5e4e1aaf9d7f65d5286e7dc1b713b6a7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9014, "upload_time": "2015-08-04T05:22:40", "url": "https://files.pythonhosted.org/packages/12/65/a2a7f7cfd8f710acfbfa7fd5c19c6fc86da8acbd27ba872900874d6da33e/defrost-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "c4799f5012ae0e8c60ec8d5206fbba6a", "sha256": "3fa76f0a1d769d54d15686edca6edc397f571890aa0e20341b6055063d1ef122" }, "downloads": -1, "filename": "defrost-0.2.0.tar.gz", "has_sig": false, "md5_digest": "c4799f5012ae0e8c60ec8d5206fbba6a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10162, "upload_time": "2015-08-05T06:57:58", "url": "https://files.pythonhosted.org/packages/51/34/f61bee2181adfd28e4c2fcd639d1291a1fd2b48591c7cc7ca0f7f0969f5e/defrost-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "78cd9f6c58fb4c8a0f1d980977f2bc05", "sha256": "677debb693a672a6a500d72b286f4fec4501491848deed3ed3929ff519f4919f" }, "downloads": -1, "filename": "defrost-0.3.0.tar.gz", "has_sig": false, "md5_digest": "78cd9f6c58fb4c8a0f1d980977f2bc05", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11055, "upload_time": "2015-08-06T19:10:28", "url": "https://files.pythonhosted.org/packages/1a/6d/7afff29b7c3b528123ab00c192089466dc82a755e3b09701896c90cf6c1a/defrost-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "78e811ce7ad6f486bc997cee02e3c9f7", "sha256": "255ab5f786e6161fa2d3b7f054993e1476c1107ccfc2780872f5e96d327e243a" }, "downloads": -1, "filename": "defrost-0.3.1.tar.gz", "has_sig": false, "md5_digest": "78e811ce7ad6f486bc997cee02e3c9f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11143, "upload_time": "2015-08-07T05:48:33", "url": "https://files.pythonhosted.org/packages/22/1e/7ce9b3633c462c9e6a8f8a84c3fc5ebf06d46b39423c01dbb5c58f5ea5eb/defrost-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "5766089f233268f5a239bda03386736d", "sha256": "50a51fe38ce77e682fed3dc9e7da2a5a2a88f084fe8adc2e149210577591e817" }, "downloads": -1, "filename": "defrost-0.3.2.tar.gz", "has_sig": false, "md5_digest": "5766089f233268f5a239bda03386736d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11336, "upload_time": "2015-12-01T19:02:20", "url": "https://files.pythonhosted.org/packages/c4/53/330a8dc07335c7b964f72a3ee30739f991df023f009c1c5a50b27873f7df/defrost-0.3.2.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "b6318f761ec41b700f09f574b9edd49b", "sha256": "51c8b2a7ea9864326bfc6083560f93a85f1bb3905bfbbec64ae2cc8053044ade" }, "downloads": -1, "filename": "defrost-0.4.0.tar.gz", "has_sig": false, "md5_digest": "b6318f761ec41b700f09f574b9edd49b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11674, "upload_time": "2016-03-27T14:50:31", "url": "https://files.pythonhosted.org/packages/3f/21/b486b7959efe0a2c08ddbc19b375a5e1f04f57689c9fac0176fbcfbe8ac8/defrost-0.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b6318f761ec41b700f09f574b9edd49b", "sha256": "51c8b2a7ea9864326bfc6083560f93a85f1bb3905bfbbec64ae2cc8053044ade" }, "downloads": -1, "filename": "defrost-0.4.0.tar.gz", "has_sig": false, "md5_digest": "b6318f761ec41b700f09f574b9edd49b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11674, "upload_time": "2016-03-27T14:50:31", "url": "https://files.pythonhosted.org/packages/3f/21/b486b7959efe0a2c08ddbc19b375a5e1f04f57689c9fac0176fbcfbe8ac8/defrost-0.4.0.tar.gz" } ] }