Source code for virtual_finance_api.endpoints.business_insider.isin
# -*- coding: utf-8 -*-
from ..decorators import endpoint, dyndoc_insert
from ..apirequest import VirtualAPIRequest
from ...exceptions import ConversionHookError
from .responses.isin import responses
from virtual_finance_api.generic.isin import ISINCode
[docs]@endpoint("ajax/SearchController_Suggest", domain="https://markets.businessinsider.com")
class ISIN(VirtualAPIRequest):
"""ISIN - class to handle the ISIN endpoint."""
[docs] @dyndoc_insert(responses)
def __init__(self, params: dict) -> None:
"""Instantiate a ISIN equest instance.
Parameters
----------
params : dict (required)
max_results: 25 (default),
query: <ticker>
Raises
------
ValueError
in case of a missing *query* parameter.
Example:
params::
{_get_isin_params}
>>> print(client.request(ISIN(params=params)))
::
{_get_isin_resp}
"""
endpoint = self.ENDPOINT
super(ISIN, self).__init__(endpoint, method=self.METHOD)
self.params = {"max_results": 25}
if "query" not in params:
raise ValueError("Missing in 'params': 'query'")
self.params.update(**params)
def _conversion_hook(self, response: str) -> dict:
ticker = self.params.get("query")
lookup = "{}|".format(ticker)
rv = {"ticker": self.params["query"]}
if lookup not in response:
lookup = '"|'
if ticker.lower() not in response.lower() or lookup not in response:
# raise a NOT FOUND status
raise ConversionHookError(404, "ISIN not found")
else:
v = response.split(lookup)[1].split('"')[0].split("|")[0]
try:
_isin = ISINCode(v)
except ValueError as err:
raise ConversionHookError(422, "Unprocessable Entity")
else:
rv.update({"ISIN": _isin.code})
return rv