Skip to content

Latest commit

 

History

History
105 lines (69 loc) · 2.82 KB

File metadata and controls

105 lines (69 loc) · 2.82 KB

APIBridge

Joining json API calls together


Build Status codecov PyPI version MIT License


Installation

pip install api_bridge

Usage

The API-class

API(url: str,
    method: Method = Method.GET,
    result_filter: Optional[Callable[[Dict[str, Any]], Dict[str, Any]]] = None,
    validate: Optional[Callable[[Dict[str, Any]], bool]] = None,
    post_data: Optional[Dict[str, Any]] = None
    )

url The url to run a request with

method The Enum from api_bridge.methods.Method [either Method.GET or .POST; defaults to .GET]

result_filter A filter for the retrieved json data api_bridge.filter.Filter [defaults to None]


Filter(**out: str)

out The items of the filtered data

examples:

Filter(lat='latitude', long='longitude')  # {'lat': data['latitude'], 'long': data['longitude']}

Filter(sunrise='results sunrise')  # spaces represent {'sunrise': data['results]['sunrise']}

validate An additional test based on the received data in addition to the http-status-code [defaults to None]

example:

validate=lambda data: data['status'] == 'successful'

post_data Data if Method.POST was provided

Requests

There are two ways to run a request

from api_bridge.api import API
from api_bridge.filter import Filter
from api_bridge.container import Container

LOCATION_URL = 'https://ipapi.co/json/'
TIME_URL = 'https://api.sunrise-sunset.org/json?lat={lat}&lng={long}&date=today'

The chain-method

result = API.chain(
            API(LOCATION_URL, result_filter=Filter(lat='latitude', long='longitude')),
            API(TIME_URL, validate=lambda response: response['status'] == 'OK', result_filter=Filter(sunrise='results sunrise'))
         )

result == {'sunrise': '4:08:10 AM'}

The (esoteric) operator-method > or >>

result = API('https://ipapi.co/json/', result_filter=Filter(lat='latitude', long='longitude')) > \
                API('https://api.sunrise-sunset.org/json?lat={lat}&lng={long}&date=today', validate=lambda response:
                    response['status'] == 'OK', result_filter=Filter(sunrise='results sunrise')) > \
                Container()

result == {'sunrise': '4:08:10 AM'}

Important the gt and rshift operator mehtod must terminate with an Operator(), which can be treated a dict afterwards