{
"info": {
"author": "wac",
"author_email": "wac@example.com",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: ISC License (ISCL)",
"Natural Language :: English",
"Programming Language :: Python",
"Programming Language :: Python :: 2.7",
"Topic :: Software Development :: Libraries :: Python Modules"
],
"description": "===\nwac\n===\n\n.. image:: https://secure.travis-ci.org/bninja/wac.png?branch=master\n :target: http://travis-ci.org/bninja/wac\n\nTo write a friendly client for a RESTful API you typically end up doing the\nfollowing:\n\n- Write HTTP client commands for communicating with the server. These commands\n do things like marshal payloads, convert errors, invoke request hooks, etc.\n\n- Turn responses deserialized by your client into resource objects (i.e.\n objectify the response).\n\n- Build up queries (e.g. filter, sort) to access resources matching some\n criteria in perhaps a particular order.\n \nIn the ideal case the client gives your users something approximating an ORM\nfor your resources. This library is intended to assist you in writing such a\nclient provided the API you are consuming complies with some basic\nconventions:\n\n- Uses HTTP properly.\n\n- Annotates resource representations with type and URI information.\n\nInstallation\n------------\n\nSimply::\n\n $ pip install wac\n\nor if you prefer::\n\n $ easy_install wac\n\nRequirements\n------------\n\n- `Python `_ >= 2.6, < 3.0\n- `Requests `_ >= 1.2.3\n\nUsage\n-----\n\nLets work through an example. The code for this example is in ``example.py``.\n\n- First you import wac:\n\n.. code-block:: python\n\n import wac\n \n- Next define the version of your client:\n\n.. code-block:: python\n\n __version__ = '1.0'\n \n- Also define the configuration which all ``Client``\\s will use by default:\n\n.. code-block:: python\n\n default_config = wac.Config(None)\n \n- Now be nice and define a function for updating the configuration(s):\n\n.. code-block:: python\n\n def configure(root_url, **kwargs):\n default = kwargs.pop('default', True)\n kwargs['client_agent'] = 'example-client/' + __version__\n if 'headers' not in kwargs:\n kwargs['headers'] = {}\n kwargs['headers']['Accept-Type'] = 'application/json'\n if default:\n default_config.reset(root_url, **kwargs)\n else:\n Client.config = wac.Config(root_url, **kwargs\n\n- Now the big one, define your ``Client`` which is what will be used to talk to\n a server:\n\n.. code-block:: python\n\n class Client(wac.Client):\n\n config = default_config\n \n def _serialize(self, data):\n data = json.dumps(data, default=self._default_serialize)\n return 'application/json', data\n \n def _deserialize(self, response):\n if response.headers['Content-Type'] != 'application/json':\n raise Exception(\n \"Unsupported content-type '{}'\"\n .format(response.headers['Content-Type'])\n )\n data = json.loads(response.content)\n return data\n\n- Then define your base ``Resource``:\n\n.. code-block:: python\n\n class Resource(wac.Resource):\n \n client = Client()\n registry = wac.ResourceRegistry()\n \n- And finally your actual resources:\n\n.. code-block:: python\n\n class Playlist(Resource):\n\n type = 'playlist'\n \n uri_gen = wac.URIGen('/v1/playlists', '{playlist}')\n \n \n class Song(Resource):\n \n type = 'song'\n \n uri_gen = wac.URIGen('/v1/songs', '{song}')\n \n\n- Done! Now you can do crazy stuff like this:\n\n.. code-block:: python\n\n import example\n \n example.configure('https://api.example.com', auth=('user', 'passwd'))\n \n q = (example.Playlist.query()\n .filter(Playlist.f.tags.contains('nuti'))\n .filter(~Playlist.f.tags.contains('sober'))\n .sort(Playlist.f.created_at.desc()))\n for playlist in q:\n song = playlist.songs.create(\n name='Flutes',\n length=1234,\n tags=['nuti', 'fluti'])\n song.length += 101\n song.save()\n\nContributing\n------------\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Write your code **and tests**\n4. Ensure all tests still pass (`python setup.py test`)\n5. Commit your changes (`git commit -am 'Add some feature'`)\n6. Push to the branch (`git push origin my-new-feature`)\n7. Create new pull request\n\n\n.. :changelog:\n\nHistory\n-------\n\n0.21 (2013-06-18)\n++++++++++++++++++\n\n* Require requests >= 1.2.3.\n\n0.19 (2013-05-16)\n++++++++++++++++++\n\n* Allow requests version <= 1.1.0.\n\n0.14 (2013-01-29)\n++++++++++++++++++\n\n* Pin requests version to less than 1.0 until we test it with requests > 1.0.\n\n0.12 (2012-10-02)\n++++++++++++++++++\n\n* Fix ResourceCollection.filter.\n* Add like and ilike filters.\n* Minor pep8/formatting changes.\n\n0.11 (2012-09-11)\n++++++++++++++++++\n\n* Fix config copy.\n\n0.10 (2012-07-27)\n++++++++++++++++++\n\n* Python 2.6 compatibility.\n\n0.9 (2012-07-25)\n++++++++++++++++++\n\n* Save serialization fix.\n\n0.8 (2012-07-25)\n++++++++++++++++++\n\n* Pagination fixes.\n\n0.7 (2012-07-20)\n++++++++++++++++++\n\n* Misc fixes.\n\n0.3 (2012-05-28)\n++++++++++++++++++\n\n* Hope you like it.\n\n0.2 (2012-05-01)\n++++++++++++++++++\n\n* Growing pains.\n\n0.1 (2012-04-01)\n++++++++++++++++++\n\n* Its alive!",
"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/bninja/wac/",
"keywords": null,
"license": "Copyright (c) 2012 wac.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.",
"maintainer": null,
"maintainer_email": null,
"name": "wac",
"package_url": "https://pypi.org/project/wac/",
"platform": "UNKNOWN",
"project_url": "https://pypi.org/project/wac/",
"project_urls": {
"Download": "UNKNOWN",
"Homepage": "https://github.com/bninja/wac/"
},
"release_url": "https://pypi.org/project/wac/0.23/",
"requires_dist": null,
"requires_python": null,
"summary": "Writing RESTful API clients.",
"version": "0.23"
},
"last_serial": 1070922,
"releases": {
"0.10": [
{
"comment_text": "",
"digests": {
"md5": "20a716f4f3839e79686ff67429c73cc2",
"sha256": "f4f091826c1c4aeefc0753a2294c64e74c95914d585a50840720b0b46ffd9e57"
},
"downloads": -1,
"filename": "wac-0.10.tar.gz",
"has_sig": false,
"md5_digest": "20a716f4f3839e79686ff67429c73cc2",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13606,
"upload_time": "2012-07-28T00:32:36",
"url": "https://files.pythonhosted.org/packages/81/06/fd2811eec44acf779bd00cd3655f3b30515113a13a76c0c7e35c50dafcef/wac-0.10.tar.gz"
}
],
"0.11": [
{
"comment_text": "",
"digests": {
"md5": "3157e7682a5651061a77a6ac9830cb03",
"sha256": "e5672c80d0c21d73b25c8b727e95f78de18eea219577b4475cbf80df6aedeba0"
},
"downloads": -1,
"filename": "wac-0.11.tar.gz",
"has_sig": false,
"md5_digest": "3157e7682a5651061a77a6ac9830cb03",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13941,
"upload_time": "2012-09-11T18:41:51",
"url": "https://files.pythonhosted.org/packages/d9/89/2ed01666be80c5dad542f7fd2ade2baaf5b470e55d75640b4ed9f7c753d2/wac-0.11.tar.gz"
}
],
"0.12": [
{
"comment_text": "",
"digests": {
"md5": "737e213e1405c205991ab31197f3202d",
"sha256": "089f507b64b7caa325df8d6bfd6f316d5acde2cafab9ced04a4789ae651272dc"
},
"downloads": -1,
"filename": "wac-0.12.tar.gz",
"has_sig": false,
"md5_digest": "737e213e1405c205991ab31197f3202d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 16382,
"upload_time": "2012-10-02T17:20:15",
"url": "https://files.pythonhosted.org/packages/c7/d2/960db1b5d510e9f840a30794e70569dd2ce24f48b2711e8b8d17ea0d2f53/wac-0.12.tar.gz"
}
],
"0.13": [
{
"comment_text": "",
"digests": {
"md5": "bb0d5ade21e4511e08513dfd4c2f4ae7",
"sha256": "9dcf320b35984cfcb3e72e56f1f429d3e4c7859bb072e9aa94bb67401907e592"
},
"downloads": -1,
"filename": "wac-0.13.tar.gz",
"has_sig": false,
"md5_digest": "bb0d5ade21e4511e08513dfd4c2f4ae7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 16385,
"upload_time": "2012-11-19T19:19:32",
"url": "https://files.pythonhosted.org/packages/63/30/416237ccf11b2884ccf87ad34f1df4dde55962b065a3fc5215a6e884f63c/wac-0.13.tar.gz"
}
],
"0.14": [
{
"comment_text": "",
"digests": {
"md5": "3131aa2b7da10f9a85a827e67f0a5cf3",
"sha256": "1d774daab2d4e253d851311f9f2ff6e8ab53cf6ba47842cd8b93cff423d1cbff"
},
"downloads": -1,
"filename": "wac-0.14.tar.gz",
"has_sig": false,
"md5_digest": "3131aa2b7da10f9a85a827e67f0a5cf3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14120,
"upload_time": "2013-01-30T05:09:40",
"url": "https://files.pythonhosted.org/packages/ae/cf/4f47407c56461b2e411dce32cf4f5215a3611cd9c83c0fbf6923f61d652c/wac-0.14.tar.gz"
}
],
"0.15": [
{
"comment_text": "",
"digests": {
"md5": "e73edf7179732e9ac3ac35ebac5678b2",
"sha256": "4a3ee128c17176bc6d2750354d3fe87e133b34a256f4df535d3080249fb221f8"
},
"downloads": -1,
"filename": "wac-0.15.tar.gz",
"has_sig": false,
"md5_digest": "e73edf7179732e9ac3ac35ebac5678b2",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14266,
"upload_time": "2013-03-06T19:05:17",
"url": "https://files.pythonhosted.org/packages/be/e8/f63d1df2a3aeb250ed33a6106d21ed7b2fef0ad7442f7e4375a72d2aac95/wac-0.15.tar.gz"
}
],
"0.16": [
{
"comment_text": "",
"digests": {
"md5": "093555a50baf04585b9b5e1e769741c1",
"sha256": "b6e0b1a718535d233db1475f81ffe20a76ed37cf381385e14c717d983bfb6897"
},
"downloads": -1,
"filename": "wac-0.16.tar.gz",
"has_sig": false,
"md5_digest": "093555a50baf04585b9b5e1e769741c1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14317,
"upload_time": "2013-03-19T20:27:12",
"url": "https://files.pythonhosted.org/packages/05/19/33fd02d374a88a94526eea856b51a6993966887e67a69d679ccc9a2c0207/wac-0.16.tar.gz"
}
],
"0.17": [
{
"comment_text": "",
"digests": {
"md5": "18723ca97f32453221ce767b9459e857",
"sha256": "ad821f51b67af92ecbb48c21d5b61641bf50995a00cc45868d5de42ed68e716a"
},
"downloads": -1,
"filename": "wac-0.17.tar.gz",
"has_sig": false,
"md5_digest": "18723ca97f32453221ce767b9459e857",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14241,
"upload_time": "2013-03-20T04:23:20",
"url": "https://files.pythonhosted.org/packages/db/54/3e87e038f96a7091aa4e9df388feac211a041c5fbe5c07cee17904492448/wac-0.17.tar.gz"
}
],
"0.19": [
{
"comment_text": "",
"digests": {
"md5": "94dba0619a2c68097e41eaf427bda069",
"sha256": "383e3ec427fbbb986d1e7f24285598cc28954cedc8a73eaa45905a01febf5703"
},
"downloads": -1,
"filename": "wac-0.19.tar.gz",
"has_sig": false,
"md5_digest": "94dba0619a2c68097e41eaf427bda069",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14292,
"upload_time": "2013-05-16T22:23:23",
"url": "https://files.pythonhosted.org/packages/cf/44/df40a40d625287c40cf6176c65aece38930e101e25c9d0e9f9cafbf60606/wac-0.19.tar.gz"
}
],
"0.20": [
{
"comment_text": "",
"digests": {
"md5": "3cf4fce6c9578bd084b90df2fb338e52",
"sha256": "be4295a7102b081b992405bcb8064a2860102c794a40929df51655492b94dbf4"
},
"downloads": -1,
"filename": "wac-0.20.tar.gz",
"has_sig": false,
"md5_digest": "3cf4fce6c9578bd084b90df2fb338e52",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14361,
"upload_time": "2013-05-20T20:11:57",
"url": "https://files.pythonhosted.org/packages/0e/60/472f4f68540d3cee5cee9c40ffb0a8f00b9281866d8b333bbf8a7b66b6bd/wac-0.20.tar.gz"
}
],
"0.21": [
{
"comment_text": "",
"digests": {
"md5": "f291ad2627173c78645a19ee0920c5de",
"sha256": "b3632b0e6d87e26469d989e80b7605c925d8b75ba8af20ff0a025df4de908b4c"
},
"downloads": -1,
"filename": "wac-0.21.tar.gz",
"has_sig": false,
"md5_digest": "f291ad2627173c78645a19ee0920c5de",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14411,
"upload_time": "2013-06-18T14:45:03",
"url": "https://files.pythonhosted.org/packages/ba/6f/254a1a1dea305adad1cc61c24d111274f3aa2820903f874547f55aae3311/wac-0.21.tar.gz"
}
],
"0.22": [
{
"comment_text": "",
"digests": {
"md5": "967e38f2277b9164d33c8beba3993d1f",
"sha256": "cc040cbd2911dddaaec2416655218287d9e67dc45dec1034ddedb220dc9db881"
},
"downloads": -1,
"filename": "wac-0.22.tar.gz",
"has_sig": false,
"md5_digest": "967e38f2277b9164d33c8beba3993d1f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14540,
"upload_time": "2013-07-30T17:59:38",
"url": "https://files.pythonhosted.org/packages/dd/54/1f5ae560fff9703f034d034dc6108e37a22103fb8066a5b504f9ab99c35f/wac-0.22.tar.gz"
}
],
"0.23": [
{
"comment_text": "",
"digests": {
"md5": "48704bec92ffcf48b7e60f0bae5d1e66",
"sha256": "39399bf4554a5f4674341991affaf78c9119f1a14975964267057e075ed50147"
},
"downloads": -1,
"filename": "wac-0.23.tar.gz",
"has_sig": false,
"md5_digest": "48704bec92ffcf48b7e60f0bae5d1e66",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14533,
"upload_time": "2014-04-24T19:42:24",
"url": "https://files.pythonhosted.org/packages/dc/94/589f42695ce3896aedb8e93e57e97a9dd59d174860caa70173f5393d975f/wac-0.23.tar.gz"
}
],
"0.4": [
{
"comment_text": "",
"digests": {
"md5": "4a809cd96508a8715812ae34ff59603a",
"sha256": "b7a4e6cffbbfc361d8d4ca626a76552e0c7f846e43dd1161d42a363ba76a4f90"
},
"downloads": -1,
"filename": "wac-0.4.tar.gz",
"has_sig": false,
"md5_digest": "4a809cd96508a8715812ae34ff59603a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 12539,
"upload_time": "2012-06-07T00:53:23",
"url": "https://files.pythonhosted.org/packages/0f/b2/accf83bf6140371b3843fb322c0f51839ab14ef2b7ff7bf430897d1946ca/wac-0.4.tar.gz"
}
],
"0.5": [
{
"comment_text": "",
"digests": {
"md5": "f93cff08295661ac62b6fdb6947bb72f",
"sha256": "7cf0da3c86c24b3453e3d12d7e41b63ac6f730c6814e34e504d20662a39a0ebe"
},
"downloads": -1,
"filename": "wac-0.5.tar.gz",
"has_sig": false,
"md5_digest": "f93cff08295661ac62b6fdb6947bb72f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13030,
"upload_time": "2012-06-07T01:21:28",
"url": "https://files.pythonhosted.org/packages/ac/5f/9cf1ce41881f0fbf454177e1c14e7a5648aa9c6e9dc3e9b69886c2062cad/wac-0.5.tar.gz"
}
],
"0.7": [
{
"comment_text": "",
"digests": {
"md5": "3c6c85273b9c0a3828ddd7bee376b7ce",
"sha256": "b6c5ec1500bf26fbb871679597a4a38214eef8e884d1808af7897ea2c3feb270"
},
"downloads": -1,
"filename": "wac-0.7.tar.gz",
"has_sig": false,
"md5_digest": "3c6c85273b9c0a3828ddd7bee376b7ce",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13261,
"upload_time": "2012-07-21T00:47:30",
"url": "https://files.pythonhosted.org/packages/ba/c1/3e357d4ded8b3f4d5a73e75eba75dba48db0087a9292c0910efd190d8c3f/wac-0.7.tar.gz"
}
],
"0.8": [
{
"comment_text": "",
"digests": {
"md5": "4e9f2cffd1bdaa27f8ed0becafb79773",
"sha256": "6bd696b54504082124df79e49c72e5b22a97420c49c6519ebac30763301eeb90"
},
"downloads": -1,
"filename": "wac-0.8.tar.gz",
"has_sig": false,
"md5_digest": "4e9f2cffd1bdaa27f8ed0becafb79773",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13512,
"upload_time": "2012-07-26T01:19:03",
"url": "https://files.pythonhosted.org/packages/6c/06/ab8e5713482de93e58bad3a7862c5534e4ae699fc12343c1dae950f65ab4/wac-0.8.tar.gz"
}
],
"0.9": [
{
"comment_text": "",
"digests": {
"md5": "915c11e156f8b497d37f2d11affc640d",
"sha256": "212de728723283e9dd32de91325142c3676409c95f35b6de15ff70b171017107"
},
"downloads": -1,
"filename": "wac-0.9.tar.gz",
"has_sig": false,
"md5_digest": "915c11e156f8b497d37f2d11affc640d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 13541,
"upload_time": "2012-07-26T02:27:25",
"url": "https://files.pythonhosted.org/packages/21/f3/74dc17a20f3bb024380971ad6f1bdf8059091c4008544e702aeac6718979/wac-0.9.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "48704bec92ffcf48b7e60f0bae5d1e66",
"sha256": "39399bf4554a5f4674341991affaf78c9119f1a14975964267057e075ed50147"
},
"downloads": -1,
"filename": "wac-0.23.tar.gz",
"has_sig": false,
"md5_digest": "48704bec92ffcf48b7e60f0bae5d1e66",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 14533,
"upload_time": "2014-04-24T19:42:24",
"url": "https://files.pythonhosted.org/packages/dc/94/589f42695ce3896aedb8e93e57e97a9dd59d174860caa70173f5393d975f/wac-0.23.tar.gz"
}
]
}