{ "info": { "author": "mtwtkman", "author_email": "yo@mtwtkman.dev", "bugtrack_url": null, "classifiers": [ "License :: Other/Proprietary License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3 :: Only", "Topic :: Utilities" ], "description": "|version| |ci-status|\n\n.. |version| image:: https://img.shields.io/badge/python-3.7-blue.svg?style=flat\n :alt: version\n :scale: 100%\n :target: https://www.python.org/downloads/release/python-370/\n\n\n.. |ci-status| image:: https://circleci.com/gh/mtwtkman/apap.svg?style=svg\n :alt: circleci status\n :scale: 100%\n :target: https://circleci.com/gh/mtwtkman/apap\n\n\n====\nWhat\n====\n\n`apap` makes you can **ap** ply RESTful **ap** i to your client handy.\n\n========\nRequired\n========\n\npython3.7+\n\n\n=====\nAbout\n=====\n\nThis exposes `apap.Client` class to define your api client.\n`apap.Client` must be defining `api_base_url` and `_method_map` as class attribute.\n\n\n.. code:: python\n\n import apap\n\n\n class YourAPI(apap.Client):\n api_base_url = 'https://your.api.com/v1'\n\n _method_map = apap.MethodMap(\n ('get_all', apap.Method.Get, 'things'), # all resources from GET http method.\n ('get_one', apap.Method.Get, 'things/:id'), # one of resources filterd by id from GET http method.\n ('create', apap.Method.Post, 'things'), # create a new item from POST http method.\n ('update', apap.Method.Put, 'things/:id'), # update something filterd by id from PUT http method.\n ('delete', apap.Method.Delete, 'things/:id'), # delete something filterd by id from Delete http method.\n )\n\n ...\n\n\nYou know `apap.MethodMap` makes your client declarative.\n\n`apap.MethodMap` is just a tuple of client method name, HTTP method and endpoint url.\n\nAt last, you need to register your client to entrypoint via `apap.apply`.\n\nThose request returns `requests's Response object `_ (because `apap` uses `requests` internally).\n\n.. code:: python\n\n import apap\n\n\n client = apap.apply(YourAPI)()\n\n client.get_all() # same as `curl https://your.api.com/v1/things`\n client.get_one(id=1)() # same as `curl https://your.api.com/things/1`\n client.create(x=1, y=2) # same as `curl -X POST -d \"x=1\" -d \"y=2\" https://your.api.com/things`\n client.update(id=1)(x=10) # same as `curl -X PUT -d \"x=1\" https://your.api.com/things/1`\n client.delete(id=1)() # same as `curl -X DELETE https://your.api.com/things/1`\n\n\nWhen you need to set any headers for requesting, you can use `header_map` attribute to translate actual header from python world.\n\nSo if you want to use `Authorization` as http-header, please define `header_map` looks like below.\n\n.. code:: python\n\n class YourAPI(apap.Client):\n header_map = {'Authorization': 'auth_key'}\n ...\n\n\n apap.apply(YourAPI)(headers={'auth_key': 'token xxxxx'})\n\n\n\n=======\nExample\n=======\n\nAll you need is just creating a class which inherits `apap.Client` class.\n\n.. code:: python\n\n import os\n\n from apap import MethodMap, Client, Method, apply\n\n\n class GithubAPI(Client):\n api_base_url = 'https://api.github.com'\n header_map = {'Authorization': 'access_token'}\n\n\n class UserRepo(GithubAPI):\n name = 'user_repo'\n\n _method_map = MethodMap(\n ('get', Method.Get, 'users/:username/repos'),\n )\n\n\n class MyRepo(GithubAPI):\n name = 'my_repo'\n\n _method_map = MethodMap(\n ('get', Method.Get, 'user/repos'),\n )\n\n\n access_token = os.environ['ACCESS_TOKEN']\n\n endpoints = [UserRepo, MyRepo]\n\n gh_client = apply(*endpoints)(headers={'access_token': f'token {access_token}'})\n user_repo_resp = gh_client.user_repo.get(username='mtwtkman')()\n my_repo_resp = gh_client.my_repo.get(visibility='private')\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "WTFPL", "maintainer": "mtwtkman", "maintainer_email": "yo@mtwtkman.dev", "name": "apap", "package_url": "https://pypi.org/project/apap/", "platform": "", "project_url": "https://pypi.org/project/apap/", "project_urls": null, "release_url": "https://pypi.org/project/apap/0.0.0b3/", "requires_dist": [ "requests (==2.22.0)", "mypy_extensions (==0.4.1)" ], "requires_python": ">=3.7,<4.0", "summary": "Declarative and handy RESTful client factory", "version": "0.0.0b3" }, "last_serial": 5691555, "releases": { "0.0.0b0": [ { "comment_text": "", "digests": { "md5": "27f95f2421106201aa9b1b9b35f0ba5a", "sha256": "56b30b3bd11b0bb77f6a254bd8f7a7e12e83154978b9a5be565cbb955d77e192" }, "downloads": -1, "filename": "apap-0.0.0b0-py3-none-any.whl", "has_sig": false, "md5_digest": "27f95f2421106201aa9b1b9b35f0ba5a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7,<4.0", "size": 3051, "upload_time": "2019-08-12T14:26:23", "url": "https://files.pythonhosted.org/packages/f1/b6/184f2b8a65a57861a1935b4f1f3b52986725b175bc9d15116e722c9185a0/apap-0.0.0b0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f595e9398136e71a4e0b4196148ee9ec", "sha256": "acd37752aed3e27365a416c2fe93ddd9381b8dcdc6dd16ebfd5c6e48d648ab4d" }, "downloads": -1, "filename": "apap-0.0.0b0.tar.gz", "has_sig": false, "md5_digest": "f595e9398136e71a4e0b4196148ee9ec", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<4.0", "size": 2547, "upload_time": "2019-08-12T14:26:25", "url": "https://files.pythonhosted.org/packages/5b/0f/75d0fb31a84b8ab60965e7d4c17fce76db89ff5ae43b8b58c74972637df9/apap-0.0.0b0.tar.gz" } ], "0.0.0b1": [ { "comment_text": "", "digests": { "md5": "089e8af72ae6600122710a6d5ee21dcc", "sha256": "25d13b2e9fb506146e7c25e575732200ff30b092f4f729f3d5502467cdc5a3e9" }, "downloads": -1, "filename": "apap-0.0.0b1-py3-none-any.whl", "has_sig": false, "md5_digest": "089e8af72ae6600122710a6d5ee21dcc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7,<4.0", "size": 3176, "upload_time": "2019-08-15T13:31:00", "url": "https://files.pythonhosted.org/packages/5d/ef/e1af1a2daeba5892fb7778cbe4d71af63880160cc017d14a19a0fc251aa0/apap-0.0.0b1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "795acc542b2dae536c4ccfe341d3b60f", "sha256": "75e9796758591e645f12a4e67dd1cb79de77041a3d74f6740e2304c3cb48f364" }, "downloads": -1, "filename": "apap-0.0.0b1.tar.gz", "has_sig": false, "md5_digest": "795acc542b2dae536c4ccfe341d3b60f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<4.0", "size": 2682, "upload_time": "2019-08-15T13:31:01", "url": "https://files.pythonhosted.org/packages/be/ea/97001b24a5b0347bb917d5d15a2f48524632ad3e810d441c2968176b776d/apap-0.0.0b1.tar.gz" } ], "0.0.0b2": [ { "comment_text": "", "digests": { "md5": "7d784674926af6163918aa670fd9cd0d", "sha256": "9414df4b08b60ad1e45eacf3b02ef9caf80fea405ac9fd7620240bdde507e4a8" }, "downloads": -1, "filename": "apap-0.0.0b2-py3-none-any.whl", "has_sig": false, "md5_digest": "7d784674926af6163918aa670fd9cd0d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7,<4.0", "size": 3176, "upload_time": "2019-08-15T14:31:46", "url": "https://files.pythonhosted.org/packages/19/60/e276fc1197045f4373e101350377b34ef26cb8b1dc8c25a8b58ea4a88596/apap-0.0.0b2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d195382fe5b42b3f3fe5bb45839bfd65", "sha256": "39c096d8d61aa24417df674bb32bddf85867ea3fd2cfc0f95d2f1c4eb1bee036" }, "downloads": -1, "filename": "apap-0.0.0b2.tar.gz", "has_sig": false, "md5_digest": "d195382fe5b42b3f3fe5bb45839bfd65", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<4.0", "size": 2684, "upload_time": "2019-08-15T14:31:48", "url": "https://files.pythonhosted.org/packages/25/96/bf825a6dd2eb3bbd3fb67ec85e12bce2cbe7612bec2cb7f14aaf165eff15/apap-0.0.0b2.tar.gz" } ], "0.0.0b3": [ { "comment_text": "", "digests": { "md5": "4f1a5da2ee75825c6599fc25c68602cb", "sha256": "dc59a433d42a7e473c3dea06f042c1af23d27bbf67f961db18c28c619ac14839" }, "downloads": -1, "filename": "apap-0.0.0b3-py3-none-any.whl", "has_sig": false, "md5_digest": "4f1a5da2ee75825c6599fc25c68602cb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7,<4.0", "size": 4541, "upload_time": "2019-08-17T12:25:30", "url": "https://files.pythonhosted.org/packages/b6/a1/7b75e1120f8b128f3d521349f5b9bc7dddf81abd33622055e426b7bce934/apap-0.0.0b3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8d495c1844b43190ad5a871e1fb609e2", "sha256": "49940eba4356bec46ef9089e689f06fddc1ce9cf25269ab0001640cc16c1d343" }, "downloads": -1, "filename": "apap-0.0.0b3.tar.gz", "has_sig": false, "md5_digest": "8d495c1844b43190ad5a871e1fb609e2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<4.0", "size": 4653, "upload_time": "2019-08-17T12:25:31", "url": "https://files.pythonhosted.org/packages/09/c9/3fb5d34d90ba7deed847ebddd3ba272562dbc7f80d5ec2cf5b20217e1fa6/apap-0.0.0b3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4f1a5da2ee75825c6599fc25c68602cb", "sha256": "dc59a433d42a7e473c3dea06f042c1af23d27bbf67f961db18c28c619ac14839" }, "downloads": -1, "filename": "apap-0.0.0b3-py3-none-any.whl", "has_sig": false, "md5_digest": "4f1a5da2ee75825c6599fc25c68602cb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7,<4.0", "size": 4541, "upload_time": "2019-08-17T12:25:30", "url": "https://files.pythonhosted.org/packages/b6/a1/7b75e1120f8b128f3d521349f5b9bc7dddf81abd33622055e426b7bce934/apap-0.0.0b3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8d495c1844b43190ad5a871e1fb609e2", "sha256": "49940eba4356bec46ef9089e689f06fddc1ce9cf25269ab0001640cc16c1d343" }, "downloads": -1, "filename": "apap-0.0.0b3.tar.gz", "has_sig": false, "md5_digest": "8d495c1844b43190ad5a871e1fb609e2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<4.0", "size": 4653, "upload_time": "2019-08-17T12:25:31", "url": "https://files.pythonhosted.org/packages/09/c9/3fb5d34d90ba7deed847ebddd3ba272562dbc7f80d5ec2cf5b20217e1fa6/apap-0.0.0b3.tar.gz" } ] }