Source code for annict.services

# -*- coding: utf-8 -*-
import requests
from furl import furl

from .utils import stringify


[docs]class APIMethod(object): """A class abstracting each method of AnnictAPI :param api: instance of :class:`API <annict.api.API>` . :type api: annict.api.API :param str path: Endpoint path :param str method: HTTP Method :param tuple allowed_params: (optional) List of request parameter names that can be sent. :param str payload_type: Type of payload :param bool payload_list: Specifies whether the payload is a list or not. """ def __init__( self, api, path, method, allowed_params=None, payload_type=None, payload_is_list=False, ): self.api = api self.path = path self.method = method self.allowed_params = allowed_params self.payload_type = payload_type self.payload_is_list = payload_is_list
[docs] def build_path(self, id_=None): """Build an suitable path If `id_` is given, it is embedded into path. :param int id_: Target resource ID """ if id_ is not None: self.path = "/".join([self.path, str(id_)])
[docs] def build_url(self): """Build request url :return: request url :rtype: str """ url = furl(self.api.base_url) url.path.add(self.api.api_version).add(self.path) return url.url
[docs] def build_parameters(self, dic): """Build a suitable parameters for request. It filters the given dictionary based on `self.allowed_params` and returns a dictionary with an additional access token. :param dict dic: dict of arguments given to annict.API's method. :return: dict for request parameter :rtype: dict """ params = { key: stringify(dic[key]) for key in self.allowed_params if key in dic and dic[key] } params["access_token"] = self.api.token return params
def __call__(self, params): url = self.build_url() resp = requests.request(self.method, url, params=params) resp.raise_for_status() if resp.status_code == 200: return self.api.parser.parse( resp.json(), self.payload_type, self.payload_is_list ) elif resp.status_code == 204: return True else: return resp