{"id":27359275,"url":"https://github.com/rackerlabs/curryproxy","last_synced_at":"2025-04-13T00:27:52.126Z","repository":{"id":6994877,"uuid":"8258891","full_name":"rackerlabs/curryproxy","owner":"rackerlabs","description":"A fast and performant proxy and aggregator for querying multiple instances of an API spread across globally distributed data centers.","archived":false,"fork":false,"pushed_at":"2022-10-13T20:51:20.000Z","size":8645,"stargazers_count":15,"open_issues_count":2,"forks_count":7,"subscribers_count":22,"default_branch":"master","last_synced_at":"2025-03-12T12:17:29.036Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rackerlabs.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-02-18T00:21:24.000Z","updated_at":"2025-02-02T15:00:48.000Z","dependencies_parsed_at":"2022-08-29T15:41:42.643Z","dependency_job_id":null,"html_url":"https://github.com/rackerlabs/curryproxy","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackerlabs%2Fcurryproxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackerlabs%2Fcurryproxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackerlabs%2Fcurryproxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackerlabs%2Fcurryproxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rackerlabs","download_url":"https://codeload.github.com/rackerlabs/curryproxy/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248650840,"owners_count":21139670,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-04-13T00:27:52.040Z","updated_at":"2025-04-13T00:27:52.118Z","avatar_url":"https://github.com/rackerlabs.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"CurryProxy\n==========\n\nA fast and performant proxy and aggregator for querying multiple\ninstances of an API spread across globally distributed data centers.\n\n.. image:: https://travis-ci.org/rackerlabs/curryproxy.png\n         :target: https://travis-ci.org/rackerlabs/curryproxy\n\nCapabilities\n------------\n\n- CurryProxy can handle multiple `routes`_ for use against different\n  revisions of an API or for use against completely unrelated APIs. See\n  `\u003cetc/routes.sample.yaml\u003e`__ for an example configuration.\n\n- Simple request forwarding (useful for preserving backwards\n  compatability with pre-CurryProxy versions of an API hosted in a\n  single datacenter)\n\n  - Example: ``GET https://api.example.com/v1.0/foo/bar`` forwarded to\n    ``GET https://1.api.example.com/v1.0/foo/bar``\n\n- Advanced request forwarding to multiple endpoints\n\n  - Example: ``GET https://api.example.com/1,2/v1.0/foo/bar`` forwarded\n    to the following:\n\n    - ``GET https://1.api.example.com/v1.0/foo/bar``\n\n    - ``GET https://2.api.example.com/v1.0/foo/bar``\n\n  - Requests are made in parallel\n\n  - JSON responses received from multiple endpoints are `aggregated`_\n    and returned to the client\n\n    - Example: ``{\"foo\": 1}`` received from 1 and ``{\"bar\": 2}``\n      received from 2 are aggregated to ``[{\"foo\": 1}, {\"bar\": 2}]`` and\n      returned to the client\n\n  - Rich, meaningful `errors`_ logged and returned to the client when\n    a proxied request fails\n\n.. _`routes`: https://github.com/rackerlabs/curryproxy/wiki/Routes\n.. _`aggregated`: https://github.com/rackerlabs/curryproxy/wiki/Multiple-Endpoints-Aggregation\n.. _`errors`: https://github.com/rackerlabs/curryproxy/wiki/Multiple-Endpoints-Aggregation#error-handling\n\nInstallation\n------------\n\n``pip install curryproxy`` will do what you expect.\n\nThere are a couple of extra options:\n\n- ``pip install curryproxy[tests]``. This will install any packages\n  required to run the tests.\n\n- ``pip install curryproxy[frozen]``. This will install curryproxy with\n  explicitly pinned dependencies, as generated by ``pip freeze``. This\n  is intended as a convenience for those who want the package to provide\n  a reproducible environment. The versions used will be the latest\n  working ones at the time the given Curry version was released.\n\nYou will need to provide `configuration files`_ before starting Curry.\n\n.. _`configuration files`: etc/\n\n**NOTE**: The configuration files have changed in v2.x. ``routes.json``\nand ``logging.conf`` have become ``routes.yaml`` and ``logging.yaml``\nrespectively. See the sample files for examples.\n\nLimitations\n-----------\n\n- Merging responses from multiple endpoints together occurs only under\n  certain conditions outlined on the `Multiple Endpoints Aggregation`_\n  wiki page.\n\n.. _`Multiple Endpoints Aggregation`: https://github.com/rackerlabs/curryproxy/wiki/Multiple-Endpoints-Aggregation\n\nTesting\n-------\n\nTests are set up to run with ``tox``.\n\nThe default ``tox`` setup creates environments for each known-usable\nversion of each of our dependencies, and runs the tests in each of them.\nThat amounts to around a dozen environments at the moment, so you'll\nprobably want to run them in parallel with ``tox -p auto``.\n\nIf you don't want to be that thorough (perhaps you're smoke testing a\nwork in progress), you can run against only the most recent supported\nversions of dependencies with ``tox -e py36``.\n\nYou can test against specific dependency versions like this:\n\n::\n\n  tox -e py36-requests2.{2,3,4,5,6,7} -p auto\n  tox -e py36-webob1.{2,3,4,5} -p auto\n  tox -e py36-grequests0.{2,3} -p auto\n  tox -e py36-requests.latest\n\n``tox -e lint`` is also available, and will run various linting checks.\n\nRoadmap\n-------\n- OData support for server-side ordering and paging\n- Response caching for a specified time\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frackerlabs%2Fcurryproxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frackerlabs%2Fcurryproxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frackerlabs%2Fcurryproxy/lists"}