{ "info": { "author": "Arie Bovenberg", "author_email": "a.c.bovenberg@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Snug \ud83e\udde3\n=======\n\n.. image:: https://img.shields.io/pypi/v/snug.svg\n :target: https://pypi.python.org/pypi/snug\n\n.. image:: https://img.shields.io/pypi/l/snug.svg\n :target: https://pypi.python.org/pypi/snug\n\n.. image:: https://img.shields.io/pypi/pyversions/snug.svg\n :target: https://pypi.python.org/pypi/snug\n\n.. image:: https://github.com/ariebovenberg/snug/actions/workflows/tests.yml/badge.svg\n :target: https://github.com/ariebovenberg/snug\n\n.. image:: https://img.shields.io/codecov/c/github/ariebovenberg/snug.svg\n :target: https://codecov.io/gh/ariebovenberg/snug\n\n.. image:: https://img.shields.io/readthedocs/snug.svg\n :target: https://snug.readthedocs.io/\n\n.. image:: https://img.shields.io/codeclimate/maintainability/ariebovenberg/snug.svg\n :target: https://codeclimate.com/github/ariebovenberg/snug/maintainability\n\n.. image:: https://img.shields.io/badge/dependabot-enabled-brightgreen.svg?longCache=true&logo=dependabot\n :target: https://dependabot.com\n \n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n :target: https://github.com/psf/black\n\n\n**Snug** is a tiny toolkit for writing reusable interactions with web APIs. Key features:\n\n* Write once, run with different HTTP clients (sync *and* async)\n* Fits any API architecture (e.g. REST, RPC, GraphQL)\n* Simple, lightweight and versatile\n\nWhy?\n----\n\nWriting reusable web API interactions is difficult.\nConsider a generic example:\n\n.. code-block:: python\n\n import json\n\n def repo(name, owner):\n \"\"\"get a github repo by owner and name\"\"\"\n request = Request(f'https://api.github.com/repos/{owner}/{name}')\n response = my_http_client.send(request)\n return json.loads(response.content)\n\nNice and simple. But...\n\n* What about async? Do we write another function for that?\n* How do we write clean unittests for this?\n* What if we want to use another HTTP client or session?\n* How do we use this with different credentials?\n\n*Snug* allows you to write API interactions\nindependent of HTTP client, credentials, or whether they are run (a)synchronously.\n\nIn contrast to most API client toolkits,\nsnug makes minimal assumptions and design decisions for you.\nIts simple, adaptable foundation ensures\nyou can focus on what makes your API unique.\nSnug fits in nicely whether you're writing a full-featured API wrapper,\nor just making a few API calls.\n\nQuickstart\n----------\n\n1. API interactions (\"queries\") are request/response generators.\n\n.. code-block:: python\n\n import snug\n\n def repo(name, owner):\n \"\"\"get a github repo by owner and name\"\"\"\n request = snug.GET(f'https://api.github.com/repos/{owner}/{name}')\n response = yield request\n return json.loads(response.content)\n\n2. Queries can be executed:\n\n.. code-block:: python\n\n >>> query = repo('Hello-World', owner='octocat')\n >>> snug.execute(query)\n {\"description\": \"My first repository on Github!\", ...}\n\nFeatures\n--------\n\n1. **Effortlessly async**. The same query can also be executed asynchronously:\n\n .. code-block:: python\n\n query = repo('Hello-World', owner='octocat')\n repo = await snug.execute_async(query)\n\n2. **Flexibility**. Since queries are just generators,\n customizing them requires no special glue-code.\n For example: add validation logic, or use any serialization method:\n\n .. code-block:: python\n\n from my_types import User, UserSchema\n\n def user(name: str) -> snug.Query[User]:\n \"\"\"lookup a user by their username\"\"\"\n if len(name) == 0:\n raise ValueError('username must have >0 characters')\n request = snug.GET(f'https://api.github.com/users/{name}')\n response = yield request\n return UserSchema().load(json.loads(response.content))\n\n3. **Pluggable clients**. Queries are fully agnostic of the HTTP client.\n For example, to use `requests `_\n instead of the standard library:\n\n .. code-block:: python\n\n import requests\n query = repo('Hello-World', owner='octocat')\n snug.execute(query, client=requests.Session())\n\n Read `here `_\n how to register your own.\n\n4. **Testability**. Queries can easily be run without touching the network.\n No need for complex mocks or monkeypatching.\n\n .. code-block:: python\n\n >>> query = repo('Hello-World', owner='octocat')\n >>> next(query).url.endswith('/repos/octocat/Hello-World')\n True\n >>> query.send(snug.Response(200, b'...'))\n StopIteration({\"description\": \"My first repository on Github!\", ...})\n\n5. **Swappable authentication**. Queries aren't tied to a session or credentials.\n Use different credentials to execute the same query:\n\n .. code-block:: python\n\n def follow(name: str) -> snug.Query[bool]:\n \"\"\"follow another user\"\"\"\n req = snug.PUT('https://api.github.com/user/following/{name}')\n return (yield req).status_code == 204\n\n snug.execute(follow('octocat'), auth=('me', 'password'))\n snug.execute(follow('octocat'), auth=('bob', 'hunter2'))\n\n6. **Related queries**. Use class-based queries to create an\n expressive, chained API for related objects:\n\n .. code-block:: python\n\n class repo(snug.Query[dict]):\n \"\"\"a repo lookup by owner and name\"\"\"\n def __init__(self, name, owner): ...\n\n def __iter__(self): ... # query for the repo itself\n\n def issue(self, num: int) -> snug.Query[dict]:\n \"\"\"retrieve an issue in this repository by its number\"\"\"\n r = snug.GET(f'/repos/{self.owner}/{self.name}/issues/{num}')\n return json.loads((yield r).content)\n\n my_issue = repo('Hello-World', owner='octocat').issue(348)\n snug.execute(my_issue)\n\n7. **Pagination**. Define paginated queries for (asynchronous) iteration.\n\n .. code-block:: python\n\n def organizations(since: int=None):\n \"\"\"retrieve a page of organizations since a particular id\"\"\"\n resp = yield snug.GET('https://api.github.com/organizations',\n params={'since': since} if since else {})\n orgs = json.loads(resp.content)\n next_query = organizations(since=orgs[-1]['id'])\n return snug.Page(orgs, next_query=next_query)\n\n my_query = snug.paginated(organizations())\n\n for orgs in snug.execute(my_query):\n ...\n\n # or, with async\n async for orgs in snug.execute_async(my_query):\n ...\n\n8. **Function- or class-based? You decide**.\n One option to keep everything DRY is to use\n class-based queries and inheritance:\n\n .. code-block:: python\n\n class BaseQuery(snug.Query):\n \"\"\"base github query\"\"\"\n\n def prepare(self, request): ... # add url prefix, headers, etc.\n\n def __iter__(self):\n \"\"\"the base query routine\"\"\"\n request = self.prepare(self.request)\n return self.load(self.check_response((yield request)))\n\n def check_response(self, result): ... # raise nice errors\n\n class repo(BaseQuery):\n \"\"\"get a repo by owner and name\"\"\"\n def __init__(self, name, owner):\n self.request = snug.GET(f'/repos/{owner}/{name}')\n\n def load(self, response):\n return my_repo_loader(response.content)\n\n class follow(BaseQuery):\n \"\"\"follow another user\"\"\"\n def __init__(self, name):\n self.request = snug.PUT(f'/user/following/{name}')\n\n def load(self, response):\n return response.status_code == 204\n\n Or, if you're comfortable with higher-order functions and decorators,\n make use of `gentools `_\n to modify query ``yield``, ``send``, and ``return`` values:\n\n .. code-block:: python\n\n from gentools import (map_return, map_yield, map_send,\n compose, oneyield)\n\n class Repository: ...\n\n def my_repo_loader(...): ...\n\n def my_error_checker(...): ...\n\n def my_request_preparer(...): ... # add url prefix, headers, etc.\n\n basic_interaction = compose(map_send(my_error_checker),\n map_yield(my_request_preparer))\n\n @map_return(my_repo_loader)\n @basic_interaction\n @oneyield\n def repo(owner: str, name: str) -> snug.Query[Repository]:\n \"\"\"get a repo by owner and name\"\"\"\n return snug.GET(f'/repos/{owner}/{name}')\n\n @basic_interaction\n def follow(name: str) -> snug.Query[bool]:\n \"\"\"follow another user\"\"\"\n response = yield snug.PUT(f'/user/following/{name}')\n return response.status_code == 204\n\n\nFor more info, check out the `tutorial `_,\n`advanced features `_,\n`recipes `_,\nor `examples `_.\n\n\nInstallation\n------------\n\nThere are no required dependencies. Installation is easy as:\n\n.. code-block:: bash\n\n pip install snug\n\nAlthough snug includes basic sync and async HTTP clients,\nyou may wish to install `requests `_,\n`httpx `_,\nand/or `aiohttp `_.\n\n.. code-block:: bash\n\n pip install requests aiohttp httpx\n\n\nAlternatives\n------------\n\nIf you're looking for a less minimalistic API client toolkit,\ncheck out `uplink `_\nor `tapioca `_.\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ariebovenberg/snug", "keywords": "api-wrapper,http,async,graphql,rest", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "snug", "package_url": "https://pypi.org/project/snug/", "platform": "", "project_url": "https://pypi.org/project/snug/", "project_urls": { "Homepage": "https://github.com/ariebovenberg/snug", "Repository": "https://github.com/ariebovenberg/snug" }, "release_url": "https://pypi.org/project/snug/2.3.1/", "requires_dist": [ "importlib-metadata (>=1,<5); python_version < \"3.8\"", "aiohttp (>=3.4.4,<4.0.0); extra == \"aiohttp\"", "requests (>=2.20,<3.0); extra == \"requests\"", "httpx (>=0.21.1,<0.22.0); extra == \"httpx\"" ], "requires_python": ">=3.6.2,<4.0.0", "summary": "Write reusable web API interactions", "version": "2.3.1", "yanked": false, "yanked_reason": null }, "last_serial": 12630095, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "ebc4a6b4fe5fce37846457afe4a9b13b", "sha256": "33d6b5300f7d102121f57dfb27cd46fccad0321c1a889be2e03e053252c7b5ee" }, "downloads": -1, "filename": "snug-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ebc4a6b4fe5fce37846457afe4a9b13b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 5862, "upload_time": "2017-07-08T07:01:58", "upload_time_iso_8601": "2017-07-08T07:01:58.228392Z", "url": "https://files.pythonhosted.org/packages/b2/3b/11faa4fb8d08b0b0f8117be87898116a5378ea2affe5afa778ecbf78969c/snug-0.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "53983e5cf6091a541970fc3d3ac41923", "sha256": "622a3cc3323264642f9cc18013df089fbc7936e300f5b64382fe2a414e7741fd" }, "downloads": -1, "filename": "snug-0.1.0.tar.gz", "has_sig": false, "md5_digest": "53983e5cf6091a541970fc3d3ac41923", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 4060, "upload_time": "2017-07-08T07:01:59", "upload_time_iso_8601": "2017-07-08T07:01:59.262587Z", "url": "https://files.pythonhosted.org/packages/a5/e3/6813f59b3fe8822551885121260becc4d3a1af2935f2407f51d6aef49c84/snug-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "7be307b703647732e34fa694c3c92840", "sha256": "fc91b5158cebf3498ea7b6d8d30e1cedbbced367ad068a3557193eef7aa3c416" }, "downloads": -1, "filename": "snug-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "7be307b703647732e34fa694c3c92840", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 6173, "upload_time": "2017-07-08T08:49:39", "upload_time_iso_8601": "2017-07-08T08:49:39.033426Z", "url": "https://files.pythonhosted.org/packages/87/b9/d9c9c15ea1c01aa630c2402e4a1704a2baa6d5ffd5cdd38ff0826958e81a/snug-0.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1c078caf22586817d61fc22307b10525", "sha256": "cea61ad118ccd347834bab000a95a380e6ce6832c922ec9c1d3d77e879852b14" }, "downloads": -1, "filename": "snug-0.1.1.tar.gz", "has_sig": false, "md5_digest": "1c078caf22586817d61fc22307b10525", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 4981, "upload_time": "2017-07-08T08:49:40", "upload_time_iso_8601": "2017-07-08T08:49:40.022079Z", "url": "https://files.pythonhosted.org/packages/f2/21/6df2bff543824b6959aa9111ddf928abfdcf3e90007b43f4e452d7190fc9/snug-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "d5827edc472be95d6a28807d4ccbc9fd", "sha256": "c3af91d30e35f1925f384bf5f6e1fa029e619cf4fc8881ed9996bf3982d6d850" }, "downloads": -1, "filename": "snug-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d5827edc472be95d6a28807d4ccbc9fd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 6322, "upload_time": "2017-07-08T09:39:11", "upload_time_iso_8601": "2017-07-08T09:39:11.865789Z", "url": "https://files.pythonhosted.org/packages/21/48/dd7e8ee834b2db0d9fffd7f2e09d1440b9c598c5023c8139d6641ccd570f/snug-0.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "28aba5d3e4e7e13b855b2513d35cd725", "sha256": "e29ca9e591718652c37fea341055ebb94933177114ed958e75b59777a32ac61a" }, "downloads": -1, "filename": "snug-0.1.2.tar.gz", "has_sig": false, "md5_digest": "28aba5d3e4e7e13b855b2513d35cd725", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 5064, "upload_time": "2017-07-08T09:39:13", "upload_time_iso_8601": "2017-07-08T09:39:13.519384Z", "url": "https://files.pythonhosted.org/packages/bb/b3/9c202584e5bd4b197f110ea22981cb5012139d84c5511444f9b31900f29f/snug-0.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "333349bc75c82b422e008a5f78fbc7eb", "sha256": "b23ed42feac5e99be20510ddae0dc2bdc9f516eaefdb3b6166d62ca199b3561b" }, "downloads": -1, "filename": "snug-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "333349bc75c82b422e008a5f78fbc7eb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 12037, "upload_time": "2017-11-26T20:56:40", "upload_time_iso_8601": "2017-11-26T20:56:40.464902Z", "url": "https://files.pythonhosted.org/packages/89/0b/b2a4127530af61ac220ccd07134bd6bd9a8ab9e88e51b62160d182964ae3/snug-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "2440aae9c2b25f9ae8f13b7692cb0168", "sha256": "d4971d0e44ae64ff88f9cf36f57afd4e465626c7d241b8944679f87bc28a64cc" }, "downloads": -1, "filename": "snug-0.2.0.tar.gz", "has_sig": false, "md5_digest": "2440aae9c2b25f9ae8f13b7692cb0168", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 8997, "upload_time": "2017-11-26T20:56:41", "upload_time_iso_8601": "2017-11-26T20:56:41.724223Z", "url": "https://files.pythonhosted.org/packages/8d/da/03b01578d89124b2bfa8eae56c738410a9a282241b903e01f3879a49567c/snug-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "d056c4892409e9248b9318fb486f8e59", "sha256": "a2265dc4a7f52ab96764dab3054b7c6b9e331931d6b2eb2d76f78a928761c3b3" }, "downloads": -1, "filename": "snug-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d056c4892409e9248b9318fb486f8e59", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 17521, "upload_time": "2018-01-14T14:44:50", "upload_time_iso_8601": "2018-01-14T14:44:50.552842Z", "url": "https://files.pythonhosted.org/packages/7a/e4/6968afe576e60d1ac801a2aeba57f0aec3b571dfaf5db2963f4e7eec1d00/snug-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f7014671d5081fd20a8fd721b6f73905", "sha256": "c8ef3e7653973a0b5f64bcc05cde4d7d4e5a7e5da495f9eccec6e4e2ded29672" }, "downloads": -1, "filename": "snug-0.3.0.tar.gz", "has_sig": false, "md5_digest": "f7014671d5081fd20a8fd721b6f73905", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 11898, "upload_time": "2018-01-14T14:44:52", "upload_time_iso_8601": "2018-01-14T14:44:52.042695Z", "url": "https://files.pythonhosted.org/packages/d5/3c/33928263fe658a3c2375c094d041c09ad00306272e726fd5c144f3db8e44/snug-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "44125effa165187ec0d02fc2481999fc", "sha256": "f48497e6dfe4d6dba37e07900c0401bc564ecca5ca9ff0b2ddb6eecf0e014f53" }, "downloads": -1, "filename": "snug-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "44125effa165187ec0d02fc2481999fc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 17127, "upload_time": "2018-01-24T22:02:49", "upload_time_iso_8601": "2018-01-24T22:02:49.448094Z", "url": "https://files.pythonhosted.org/packages/e7/8d/98affbd6d1e063e4983cc3ebbd640506c0fdf6e0ebab456efd5e2cbe89d3/snug-0.4.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "60546499eb76648cd12b31bcdcfcce9f", "sha256": "8639e795ceb479f6207bbe3f9d09c2031ec35a8d9be7514523bb1fc414761530" }, "downloads": -1, "filename": "snug-0.4.0.tar.gz", "has_sig": false, "md5_digest": "60546499eb76648cd12b31bcdcfcce9f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 12165, "upload_time": "2018-01-24T22:02:50", "upload_time_iso_8601": "2018-01-24T22:02:50.800768Z", "url": "https://files.pythonhosted.org/packages/1f/aa/8bb2725df4ec8b7ff74463ac8aabb3bbd217c790d475e189bc50f03f3ef2/snug-0.4.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "b815fee1f680c18dde860982d8837415", "sha256": "774a861c3cfa22221c9220178b85dcd0283823b5cf39158e76536e239aee0bc4" }, "downloads": -1, "filename": "snug-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b815fee1f680c18dde860982d8837415", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 18699, "upload_time": "2018-01-30T17:56:16", "upload_time_iso_8601": "2018-01-30T17:56:16.264533Z", "url": "https://files.pythonhosted.org/packages/40/5b/e15cc3b2e43a227fcdb9be1d1f90f0cc4946fd6f8a2ba57e35a9b5054409/snug-0.5.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "de1f5c965a1128c64b3c389f0a62129c", "sha256": "0d64d128621f0c7c5d240e07c5062431bd887c5c1b5f5c09f4720bf8cb02d44a" }, "downloads": -1, "filename": "snug-0.5.0.tar.gz", "has_sig": false, "md5_digest": "de1f5c965a1128c64b3c389f0a62129c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 15622, "upload_time": "2018-01-30T17:56:17", "upload_time_iso_8601": "2018-01-30T17:56:17.699232Z", "url": "https://files.pythonhosted.org/packages/30/f0/8ef53f13af22d4a81161cffeb34b467bf56a58c3becb21364c4d0661e5a2/snug-0.5.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "e2105f704a61436c8833b7f38a84d6d8", "sha256": "6156377f493a7a2c40d6a9d59d2dadbfd129370b4edb016f32c71d3ad9123e19" }, "downloads": -1, "filename": "snug-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e2105f704a61436c8833b7f38a84d6d8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 12716, "upload_time": "2018-02-09T07:49:22", "upload_time_iso_8601": "2018-02-09T07:49:22.929517Z", "url": "https://files.pythonhosted.org/packages/60/8c/d8b56a1f77eb58d84dc93617ac1d6579f310b2d964042f9a6e5b8f9776c3/snug-1.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d349f0584a00459e00b795254dbdbd89", "sha256": "ebd976484f2835d9d78fb3a6668cbf3b82be2c56edda2a0d523e0a4d2cd51e8b" }, "downloads": -1, "filename": "snug-1.0.0.tar.gz", "has_sig": false, "md5_digest": "d349f0584a00459e00b795254dbdbd89", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 12852, "upload_time": "2018-02-09T07:49:24", "upload_time_iso_8601": "2018-02-09T07:49:24.103185Z", "url": "https://files.pythonhosted.org/packages/b1/6a/1c18eb42d83ab6db6f9c09fdb53c00f41a1ef0748ad71a25b17c0b253e54/snug-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "e73be8318852aecb225244907a2b0093", "sha256": "32d45a5825ee8056cac861889ad2518428985ab71d0fa90922d6c4017a95d24e" }, "downloads": -1, "filename": "snug-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e73be8318852aecb225244907a2b0093", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 12737, "upload_time": "2018-02-14T18:25:55", "upload_time_iso_8601": "2018-02-14T18:25:55.900192Z", "url": "https://files.pythonhosted.org/packages/ef/67/c93254f911deac97c027d8569b44ac51c99f9ba9bfe84207c893fc8560b2/snug-1.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "84f7a4d057bc6bb891477a45bdcf6d06", "sha256": "00dcdb4f19ab122a15cfdf6181a3e2d924aca07944b3a938c11baa431e382b7e" }, "downloads": -1, "filename": "snug-1.0.1.tar.gz", "has_sig": false, "md5_digest": "84f7a4d057bc6bb891477a45bdcf6d06", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 12947, "upload_time": "2018-02-14T18:25:57", "upload_time_iso_8601": "2018-02-14T18:25:57.236079Z", "url": "https://files.pythonhosted.org/packages/d8/ec/89456887e16a5abe68c52ce3a0ec06c7206381ab4263d659cc45ce8d1ecc/snug-1.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "21a795f3319be0cf8221a8f6ea036c57", "sha256": "0020543ae7c74ff43cb252c8962810ebbdd85fc962e21bcfc08d3f808fbdb870" }, "downloads": -1, "filename": "snug-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "21a795f3319be0cf8221a8f6ea036c57", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 13227, "upload_time": "2018-02-18T12:19:28", "upload_time_iso_8601": "2018-02-18T12:19:28.094361Z", "url": "https://files.pythonhosted.org/packages/e5/5e/263b59729f278c826e419ebba3d2e5d1e92b47c7940604b96e33f34bc746/snug-1.0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "0943e50e841f7f3761a633ee078a1ea5", "sha256": "55782de876d0aecff130295c92f3dce7215a9b473269113bc0b99e38cb4686d8" }, "downloads": -1, "filename": "snug-1.0.2.tar.gz", "has_sig": false, "md5_digest": "0943e50e841f7f3761a633ee078a1ea5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 13450, "upload_time": "2018-02-18T12:19:29", "upload_time_iso_8601": "2018-02-18T12:19:29.618635Z", "url": "https://files.pythonhosted.org/packages/71/a7/3b26929d4b74413748e984431983aa80b1c47b9ad5c317710a717d01d250/snug-1.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "20613b14888d717850b5d3a3ac23a396", "sha256": "d48e020d096dce1f24f2b77200f044c9dc28c7b1578b48dc441e787cbae22ed8" }, "downloads": -1, "filename": "snug-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "20613b14888d717850b5d3a3ac23a396", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 22488, "upload_time": "2018-03-04T20:52:34", "upload_time_iso_8601": "2018-03-04T20:52:34.283723Z", "url": "https://files.pythonhosted.org/packages/b9/6d/97a62b8d83a7a4525824bdd2acca2aef1f17b48a9b5c55e81f6ee94cdac4/snug-1.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "68d38ca94ec4c23eb82a6ff2541d571e", "sha256": "362c830d557a4b0c96ed474c3149a7d2f0d449129a8690b0e746e5b5d5cc5dab" }, "downloads": -1, "filename": "snug-1.1.0.tar.gz", "has_sig": false, "md5_digest": "68d38ca94ec4c23eb82a6ff2541d571e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 18736, "upload_time": "2018-03-04T20:52:35", "upload_time_iso_8601": "2018-03-04T20:52:35.770178Z", "url": "https://files.pythonhosted.org/packages/9f/cd/cfea4248cc827e0a2f382ca30c0527b69d70a594ae02a76e584ea27c340e/snug-1.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "b5b73b6db76d5534b0410a38b0e5faef", "sha256": "37148cc1ab1ad6eb91a481376b10dab5dbf5fef671bcd6219ad6fc6998002d9e" }, "downloads": -1, "filename": "snug-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b5b73b6db76d5534b0410a38b0e5faef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 22499, "upload_time": "2018-03-04T21:14:03", "upload_time_iso_8601": "2018-03-04T21:14:03.948692Z", "url": "https://files.pythonhosted.org/packages/d9/64/c3963f250e8f0195bf5e4bb9b1cb56a6d048368cf1189e0f7e2bceb0d212/snug-1.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "bb46683f727feeab45e06c413d657709", "sha256": "7612ed952176a7d6b8fe6e05a6da93019e23740de4abc4487906fae757c3596c" }, "downloads": -1, "filename": "snug-1.1.1.tar.gz", "has_sig": false, "md5_digest": "bb46683f727feeab45e06c413d657709", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 18764, "upload_time": "2018-03-04T21:14:05", "upload_time_iso_8601": "2018-03-04T21:14:05.223416Z", "url": "https://files.pythonhosted.org/packages/1b/01/0206e4200fbfba3e29b751ca458799e0b982e8a5c29d3edde3191bcb5dac/snug-1.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "6dc1909bc8e468beb1aac4d642205e98", "sha256": "aeb86155525ac06a524b3261da588c6b57467aded08667ce4d729959058ac087" }, "downloads": -1, "filename": "snug-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6dc1909bc8e468beb1aac4d642205e98", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 22575, "upload_time": "2018-03-07T17:42:42", "upload_time_iso_8601": "2018-03-07T17:42:42.559423Z", "url": "https://files.pythonhosted.org/packages/00/2b/b2e5362ab731ee0dbb73cd0b21505d4bc3d30241d13cb54cc15b5f1d79ee/snug-1.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "75f8dcc268eb7d5a20add88683d30be0", "sha256": "ad2024428197f139c86c2b017f08dda01b79e0817dba8740af014a7a32757f25" }, "downloads": -1, "filename": "snug-1.1.2.tar.gz", "has_sig": false, "md5_digest": "75f8dcc268eb7d5a20add88683d30be0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 18841, "upload_time": "2018-03-07T17:42:44", "upload_time_iso_8601": "2018-03-07T17:42:44.233342Z", "url": "https://files.pythonhosted.org/packages/ea/3d/8501314b510e7afef99bb9eb57d1b8182725c29eef59f19b8a61ad6bff1d/snug-1.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "64d540bbb3a6d21625efff3cc73274dd", "sha256": "318c8cc2f16cd64d2ee07284687b137440690295557fa50dd2994b536fc1e414" }, "downloads": -1, "filename": "snug-1.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "64d540bbb3a6d21625efff3cc73274dd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 17195, "upload_time": "2018-03-07T17:50:26", "upload_time_iso_8601": "2018-03-07T17:50:26.242201Z", "url": "https://files.pythonhosted.org/packages/c1/ed/fed263f2d6c13705e5483b07ae0e023a52444ed14fc11f42f54b9ff67642/snug-1.1.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c1ddd9b2aafc7adc17389efa1760ae51", "sha256": "bc434e0daf8450fbcc9622bee3caeea9f7b431062e2d8f1587d42c85f201c41d" }, "downloads": -1, "filename": "snug-1.1.3.tar.gz", "has_sig": false, "md5_digest": "c1ddd9b2aafc7adc17389efa1760ae51", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 14350, "upload_time": "2018-03-07T17:50:28", "upload_time_iso_8601": "2018-03-07T17:50:28.119667Z", "url": "https://files.pythonhosted.org/packages/b1/50/1440b816ef61b73eae750a8bfdd0b69670da8c42ae1a6d2f3731e4f10ab0/snug-1.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "cd1af5a55b7172d6fdb5b0ebb981842b", "sha256": "a081e0608c72e6495cd0ec688fc52762b99db7b1eede994627c40b9322d7c2b6" }, "downloads": -1, "filename": "snug-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "cd1af5a55b7172d6fdb5b0ebb981842b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 20171, "upload_time": "2018-03-21T20:38:49", "upload_time_iso_8601": "2018-03-21T20:38:49.556148Z", "url": "https://files.pythonhosted.org/packages/7a/0f/3d28a544b9eacc13d0a90af14b3aa6a55995c1269013538ef8a9b0e99fe1/snug-1.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8621abfe12a52714c0f0ae9bfd6f883c", "sha256": "91306de46d51a174d8af9ce7643b9c7f63d9f76cb7ee5c1b04e58b62d0e1b7b6" }, "downloads": -1, "filename": "snug-1.2.0.tar.gz", "has_sig": false, "md5_digest": "8621abfe12a52714c0f0ae9bfd6f883c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 16679, "upload_time": "2018-03-21T20:38:51", "upload_time_iso_8601": "2018-03-21T20:38:51.641753Z", "url": "https://files.pythonhosted.org/packages/03/e1/5a4ac4787668975783ba08442671347aff1f6a96b697ad33e1b5d9627f2d/snug-1.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "6734da4fe4617c978f22f931ed7e862e", "sha256": "dd889bdf800046873d784b9cf45652ffce86381491e6a7c4935d1ee092274d27" }, "downloads": -1, "filename": "snug-1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6734da4fe4617c978f22f931ed7e862e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 20211, "upload_time": "2018-03-26T06:42:06", "upload_time_iso_8601": "2018-03-26T06:42:06.010429Z", "url": "https://files.pythonhosted.org/packages/9c/c5/1871e1d1d9ed7552d945467d6396868d6dbda86bb5aa7a4ff1811c84dd5f/snug-1.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "acfd19f150c5c8e24482a8505df56446", "sha256": "3a676be589b061c3e8979286bab0546258fcd9bacba344263fd03293cf33a1be" }, "downloads": -1, "filename": "snug-1.2.1.tar.gz", "has_sig": false, "md5_digest": "acfd19f150c5c8e24482a8505df56446", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 16730, "upload_time": "2018-03-26T06:42:07", "upload_time_iso_8601": "2018-03-26T06:42:07.388256Z", "url": "https://files.pythonhosted.org/packages/21/d3/4f00be619cfa8e7e0704453e66da9e729de8a732acdcbf69ac14ee4b6b85/snug-1.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "294ebb26672a1d0c742bff31d17001d5", "sha256": "6ff531d97601439afd6bcc3d5c79d9303ff2022ad8348d494b2f582be078394a" }, "downloads": -1, "filename": "snug-1.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "294ebb26672a1d0c742bff31d17001d5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 20044, "upload_time": "2018-05-13T10:32:17", "upload_time_iso_8601": "2018-05-13T10:32:17.034890Z", "url": "https://files.pythonhosted.org/packages/24/12/4bc33e67208ac4a54af000059c97dd96541ef7b47e44739255dd6cdd27d1/snug-1.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4a6c740ee1ffd8a8f7a148572d6ffd60", "sha256": "491fd892c8689716d824b19878f0a06017338aa80a8420a204e58fb386fbf3ef" }, "downloads": -1, "filename": "snug-1.3.0.tar.gz", "has_sig": false, "md5_digest": "4a6c740ee1ffd8a8f7a148572d6ffd60", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 16595, "upload_time": "2018-05-13T10:32:18", "upload_time_iso_8601": "2018-05-13T10:32:18.481223Z", "url": "https://files.pythonhosted.org/packages/34/43/2271d54e1c525aba2843ea0190d26f2b318a64d4090a1153613ac7c11035/snug-1.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "7f68d51d533844fcffb291bba530235d", "sha256": "939a6d40d436e15037b7483cf4c713cce6b42200aef0670cce570a34519c9c5e" }, "downloads": -1, "filename": "snug-1.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "7f68d51d533844fcffb291bba530235d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 20109, "upload_time": "2018-08-25T08:39:30", "upload_time_iso_8601": "2018-08-25T08:39:30.089851Z", "url": "https://files.pythonhosted.org/packages/45/82/9ff5766a52873af33ea15703b61ac54c4c6ad17c198ae4d807fa6bccb987/snug-1.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7d8bcf45e34176ac5fa639d4939afe54", "sha256": "5e4866e6026a128808e42c3c3064a6083d76cc3cd1bf19070bee27800e5f5f52" }, "downloads": -1, "filename": "snug-1.3.1.tar.gz", "has_sig": false, "md5_digest": "7d8bcf45e34176ac5fa639d4939afe54", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 16681, "upload_time": "2018-08-25T08:39:31", "upload_time_iso_8601": "2018-08-25T08:39:31.429413Z", "url": "https://files.pythonhosted.org/packages/58/33/57747bf99143c504fd723110959f2fc82b4568976cc1a48c225a21cc6d67/snug-1.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "8846a3dbbc6f5127f1095a5635d6547c", "sha256": "c51aefbbd1b6c0612272b3d6b422d3ebb3549ca51faa349f8520936d633a3d8d" }, "downloads": -1, "filename": "snug-1.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "8846a3dbbc6f5127f1095a5635d6547c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 20315, "upload_time": "2018-08-27T06:36:12", "upload_time_iso_8601": "2018-08-27T06:36:12.202817Z", "url": "https://files.pythonhosted.org/packages/5e/8c/556fc28efa38910110dbce361668026859e9f986c71cc15958c5e57471af/snug-1.3.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "43eb1ff16f0a9b93ad4509281f2dbc40", "sha256": "04ef549020673629fed0c9865fe3088be485b727a98c2e3a3385a6a20fac97d0" }, "downloads": -1, "filename": "snug-1.3.2.tar.gz", "has_sig": false, "md5_digest": "43eb1ff16f0a9b93ad4509281f2dbc40", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 16812, "upload_time": "2018-08-27T06:36:15", "upload_time_iso_8601": "2018-08-27T06:36:15.464603Z", "url": "https://files.pythonhosted.org/packages/5b/ba/2281c3685462d2d6e0346f3a62bc273194c59f07106ca80cbfd93567bc12/snug-1.3.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.3": [ { "comment_text": "", "digests": { "md5": "8085d474409cf129d577d56190a2e637", "sha256": "e27bf1d26bf0128d43ec4dca585b00982c06530313ec561a00a2d26d8cc5e2be" }, "downloads": -1, "filename": "snug-1.3.3-py3-none-any.whl", "has_sig": false, "md5_digest": "8085d474409cf129d577d56190a2e637", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 16511, "upload_time": "2018-10-25T17:50:04", "upload_time_iso_8601": "2018-10-25T17:50:04.373306Z", "url": "https://files.pythonhosted.org/packages/58/d9/15d3be5bfb985320f8eb6a2a582a24f57dc5e3e22140f3600388d8af39e6/snug-1.3.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8061b6b319d1d05796f12ded04a7b0fb", "sha256": "01a7adba1156f117d20018fa6af5d3865a56dd0f5d86ca84d12fe4e5d6df78e2" }, "downloads": -1, "filename": "snug-1.3.3.tar.gz", "has_sig": false, "md5_digest": "8061b6b319d1d05796f12ded04a7b0fb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 16978, "upload_time": "2018-10-25T17:50:06", "upload_time_iso_8601": "2018-10-25T17:50:06.090292Z", "url": "https://files.pythonhosted.org/packages/13/9e/da69b4f7f37052bacd021640ff72ad0cce0574057b357ff043d720d3aced/snug-1.3.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.4": [ { "comment_text": "", "digests": { "md5": "17a9799cfa918edc221b1335765aef3b", "sha256": "2bb32e62b550792e9fecbf2a1549edf588d6ba67d197869655a6d600a49204b8" }, "downloads": -1, "filename": "snug-1.3.4-py3-none-any.whl", "has_sig": false, "md5_digest": "17a9799cfa918edc221b1335765aef3b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 16615, "upload_time": "2018-10-27T13:23:32", "upload_time_iso_8601": "2018-10-27T13:23:32.086429Z", "url": "https://files.pythonhosted.org/packages/a9/7c/90af700521b7bd1e0eedda36635004e9167275fed82d536e7e13e4436cc0/snug-1.3.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ee7ad7ee65d994748879e3775c2ef80a", "sha256": "e47d4382a2d9bb66e48b76fa121c663fe6623cfd49661f9d042671820d260796" }, "downloads": -1, "filename": "snug-1.3.4.tar.gz", "has_sig": false, "md5_digest": "ee7ad7ee65d994748879e3775c2ef80a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 17122, "upload_time": "2018-10-27T13:23:33", "upload_time_iso_8601": "2018-10-27T13:23:33.870159Z", "url": "https://files.pythonhosted.org/packages/d9/c7/5a89b4f2421692e98b05d2cee43203294858c4f81ffbac6ef1a08ad6c3cf/snug-1.3.4.tar.gz", "yanked": false, "yanked_reason": null } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "74539b9e7ab8907a277951a1dcbb6aff", "sha256": "2a09780e0280bf1676068225b3ddbe65db49eba6a512dfd58b520b8593cbe60a" }, "downloads": -1, "filename": "snug-1.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "74539b9e7ab8907a277951a1dcbb6aff", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 16479, "upload_time": "2019-03-30T10:27:12", "upload_time_iso_8601": "2019-03-30T10:27:12.946259Z", "url": "https://files.pythonhosted.org/packages/e7/34/6fe23db63d59d036251966980dc88a6b1eec00517c70f732243b19882a47/snug-1.4.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3559e0c77d75c76aa79424c989c22317", "sha256": "63928d648dc184b0bc43f75a4a0b6911fb859649fb96814e7a2ebbe4079dd37d" }, "downloads": -1, "filename": "snug-1.4.0.tar.gz", "has_sig": false, "md5_digest": "3559e0c77d75c76aa79424c989c22317", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 17114, "upload_time": "2019-03-30T10:27:14", "upload_time_iso_8601": "2019-03-30T10:27:14.644639Z", "url": "https://files.pythonhosted.org/packages/0a/c1/30eee1b0b8f6cedf2640596a2311667d62c81cc22f4882556132f57162e2/snug-1.4.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "a65e6848d44571f1ac33bd97ed5f9b02", "sha256": "7a668b0431f101b54ac662b9f17cae93dfca85f3c839e70f2807fcbf0c85f9f8" }, "downloads": -1, "filename": "snug-1.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a65e6848d44571f1ac33bd97ed5f9b02", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 16497, "upload_time": "2019-03-30T10:33:20", "upload_time_iso_8601": "2019-03-30T10:33:20.850016Z", "url": "https://files.pythonhosted.org/packages/0e/37/c9e5903523ac7b6d1c382f9a26d3a14b70db7abc8d8f6f69ae32f4638fd7/snug-1.4.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "092ad4e703be09c1bb1d64095ad08cd6", "sha256": "9f44a79d35ae0617aa0f2fdbdbf1c51a0a2807eb9231fcff27a24f9ff0e2cb54" }, "downloads": -1, "filename": "snug-1.4.1.tar.gz", "has_sig": false, "md5_digest": "092ad4e703be09c1bb1d64095ad08cd6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 17152, "upload_time": "2019-03-30T10:33:22", "upload_time_iso_8601": "2019-03-30T10:33:22.460722Z", "url": "https://files.pythonhosted.org/packages/94/aa/048b3f7f68a7da74d44027f20eddb8b75e5e0a11a1c07468872e02cb2531/snug-1.4.1.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "4a0216961c39e864189c024291400091", "sha256": "b64de69138d86b4d297a901a007ec9366493499814f050f2dba510066f417237" }, "downloads": -1, "filename": "snug-2.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4a0216961c39e864189c024291400091", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.2", "size": 14645, "upload_time": "2019-10-27T15:57:26", "upload_time_iso_8601": "2019-10-27T15:57:26.231296Z", "url": "https://files.pythonhosted.org/packages/af/38/ac55d108ef64e47414e6d7bbfd7a945906c9653762feae190a80b802e3ef/snug-2.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "dfc5327b7d8007070f0681c92e81a102", "sha256": "d4dcd869067f9fbce9eb07eb8a8cc0e813bae331463bb018f8e8e7b41c24afa5" }, "downloads": -1, "filename": "snug-2.0.0.tar.gz", "has_sig": false, "md5_digest": "dfc5327b7d8007070f0681c92e81a102", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.2", "size": 16284, "upload_time": "2019-10-27T15:57:28", "upload_time_iso_8601": "2019-10-27T15:57:28.454632Z", "url": "https://files.pythonhosted.org/packages/9a/04/6b179a2f7b8c012e43ace87158d40f689457e318a2e2249be8e365e45805/snug-2.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "3cbf5eceb42c19eadd5c93a56a7e8545", "sha256": "c5e71bd035f8e664251a79a0d87e0bc13d6af904b1a5715a29ed659ed4e2e2e2" }, "downloads": -1, "filename": "snug-2.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3cbf5eceb42c19eadd5c93a56a7e8545", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 14478, "upload_time": "2020-12-05T13:25:02", "upload_time_iso_8601": "2020-12-05T13:25:02.317011Z", "url": "https://files.pythonhosted.org/packages/5a/f0/ea6db6ee5536e3dbbeac8cf578952c6c2923a7a3248ae9f0dc6530760a07/snug-2.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "99a8ceb3e58d4fc2acd2d9bbb5a2dc36", "sha256": "b4151a4347496f22180563b1b6ba05d18d0fa3a0f72e602684c5a7d4b7c527d6" }, "downloads": -1, "filename": "snug-2.1.0.tar.gz", "has_sig": false, "md5_digest": "99a8ceb3e58d4fc2acd2d9bbb5a2dc36", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 17911, "upload_time": "2020-12-05T13:25:03", "upload_time_iso_8601": "2020-12-05T13:25:03.807974Z", "url": "https://files.pythonhosted.org/packages/71/77/900056afe950cd37086ede04f9c3549b5a74fb0975532f2c17327655506a/snug-2.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.2.0": [ { "comment_text": "", "digests": { "md5": "8782e768802d75c92c7a74a99006b956", "sha256": "f05e131443608bedff0166ddf0c0add1fe246858a2ca12d8c593b664944aa982" }, "downloads": -1, "filename": "snug-2.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "8782e768802d75c92c7a74a99006b956", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 17718, "upload_time": "2021-05-14T12:51:43", "upload_time_iso_8601": "2021-05-14T12:51:43.429734Z", "url": "https://files.pythonhosted.org/packages/ce/c4/e9f3bd346caf79efba7a5698fff4ef00e46ce0afbb0986884b68e6528435/snug-2.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "42950dbe2e7bccb662f55595bffcb0f1", "sha256": "2876331a873d9bdc0a5c05ef82c4ed15ec2cc5817f31c414a73a1c8bd9d6377f" }, "downloads": -1, "filename": "snug-2.2.0.tar.gz", "has_sig": false, "md5_digest": "42950dbe2e7bccb662f55595bffcb0f1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 16587, "upload_time": "2021-05-14T12:51:45", "upload_time_iso_8601": "2021-05-14T12:51:45.308008Z", "url": "https://files.pythonhosted.org/packages/59/79/9ca9ed4c317854e4a80c3337fb337a69f1eab869cc4b85e36b0563df0583/snug-2.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.3.0": [ { "comment_text": "", "digests": { "md5": "17564ea31eafcf1ab83ca597fdc45d28", "sha256": "fb1421f24016ac2b4ae2a3e8d4544bc3eb82386389c47d58734cefdaddb58f98" }, "downloads": -1, "filename": "snug-2.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "17564ea31eafcf1ab83ca597fdc45d28", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2,<4.0.0", "size": 17852, "upload_time": "2021-11-28T15:02:15", "upload_time_iso_8601": "2021-11-28T15:02:15.035949Z", "url": "https://files.pythonhosted.org/packages/6f/15/f6b2d5fbf286ddea58da0b22a0a10d91521915e958bc3d00e89f416ec66d/snug-2.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "352402ff3ef0166e007383dbf9dd16b4", "sha256": "039d6d6bf5cd6a5a58d735fd6295504418393d9dc74f8c4452072639178d8821" }, "downloads": -1, "filename": "snug-2.3.0.tar.gz", "has_sig": false, "md5_digest": "352402ff3ef0166e007383dbf9dd16b4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2,<4.0.0", "size": 16796, "upload_time": "2021-11-28T15:02:16", "upload_time_iso_8601": "2021-11-28T15:02:16.738170Z", "url": "https://files.pythonhosted.org/packages/48/92/9d71557a78d076cc4bf713c7c5e3db5b922d85bbe7a8d76f0e70ebd3a9be/snug-2.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.3.1": [ { "comment_text": "", "digests": { "md5": "c666d12c363d958515b35de639d81d6f", "sha256": "63b0b89055bf0314e7349edb68ca52f955346daff0a6ac0e04e9eaf718090067" }, "downloads": -1, "filename": "snug-2.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c666d12c363d958515b35de639d81d6f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2,<4.0.0", "size": 18008, "upload_time": "2022-01-20T07:54:04", "upload_time_iso_8601": "2022-01-20T07:54:04.271652Z", "url": "https://files.pythonhosted.org/packages/26/fc/4e786c64f2bc825a3fe7102506fbadd62c61da1923abbb08fcc86df980f0/snug-2.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1c5ae56ceb03fb574cb75e60dbe807b2", "sha256": "48023bbae446edbee456a21301108206832dcd080da6dd7199dddb2d647f1335" }, "downloads": -1, "filename": "snug-2.3.1.tar.gz", "has_sig": false, "md5_digest": "1c5ae56ceb03fb574cb75e60dbe807b2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2,<4.0.0", "size": 16989, "upload_time": "2022-01-20T07:54:06", "upload_time_iso_8601": "2022-01-20T07:54:06.506731Z", "url": "https://files.pythonhosted.org/packages/b5/70/f16fbe91d0de44278b2cb354cee0ee8cd874237fe5683a0b5a6c7ff036a0/snug-2.3.1.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c666d12c363d958515b35de639d81d6f", "sha256": "63b0b89055bf0314e7349edb68ca52f955346daff0a6ac0e04e9eaf718090067" }, "downloads": -1, "filename": "snug-2.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c666d12c363d958515b35de639d81d6f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2,<4.0.0", "size": 18008, "upload_time": "2022-01-20T07:54:04", "upload_time_iso_8601": "2022-01-20T07:54:04.271652Z", "url": "https://files.pythonhosted.org/packages/26/fc/4e786c64f2bc825a3fe7102506fbadd62c61da1923abbb08fcc86df980f0/snug-2.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1c5ae56ceb03fb574cb75e60dbe807b2", "sha256": "48023bbae446edbee456a21301108206832dcd080da6dd7199dddb2d647f1335" }, "downloads": -1, "filename": "snug-2.3.1.tar.gz", "has_sig": false, "md5_digest": "1c5ae56ceb03fb574cb75e60dbe807b2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2,<4.0.0", "size": 16989, "upload_time": "2022-01-20T07:54:06", "upload_time_iso_8601": "2022-01-20T07:54:06.506731Z", "url": "https://files.pythonhosted.org/packages/b5/70/f16fbe91d0de44278b2cb354cee0ee8cd874237fe5683a0b5a6c7ff036a0/snug-2.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }