Source code for virtual_finance_api.endpoints.yahoo.screener_bundle
# -*- coding: utf-8 -*-
from ..decorators import endpoint, dyndoc_insert
from ..apirequest import VirtualAPIRequest
from .responses.screener_bundle import responses
from ...exceptions import ConversionHookError
from .util import get_store
import logging
from typing import List
logger = logging.getLogger(__name__)
[docs]@endpoint("screener/predefined/{name}", domain="https://finance.yahoo.com")
class Screener(VirtualAPIRequest):
"""Screener - class to handle the screener endpoint."""
[docs] @dyndoc_insert(responses)
def __init__(self, name: str) -> None:
"""Instantiate a Screener request instance.
Parameters
----------
name : string (required)
the name of the predefined screener to perform the request for.
>>> import virtual_finance_api as fa
>>> import virtual_finance_api.endpoints.yahoo as yh
>>> client = fa.Client()
>>> r = yh.Screener('MOST_SHORTED_STOCKS')
>>> rv = client.request(r)
::
{_screener_resp}
"""
endpoint = self.ENDPOINT.format(name=name)
super(Screener, self).__init__(endpoint, method=self.METHOD)
def _conversion_hook(self, s: str) -> dict:
rv = {}
try:
rv = get_store(s, "ScreenerResultsStore")["results"]
except Exception as err:
# let the client deal with the error
logger.error("ConversionHookError: %s", err)
raise ConversionHookError(422, "Unprocessable Entity")
else:
logger.info("%s conversion_hook: OK", self.__class__.__name__)
return rv
[docs]@endpoint("screener", domain="https://finance.yahoo.com")
class Screeners(VirtualAPIRequest):
"""Screeners - class to handle the screeners endpoint."""
[docs] @dyndoc_insert(responses)
def __init__(self) -> None:
"""Instantiate a Screeners APIRequest instance.
returns the available prefined screeners.
>>> import virtual_finance_api as fa
>>> import virtual_finance_api.endpoints.yahoo as yh
>>> client = fa.Client()
>>> r = yh.Screeners()
>>> rv = client.request(r)
>>> print(json.dumps(r.response, indent=2))
::
{_screeners_resp}
"""
endpoint = self.ENDPOINT
super(Screeners, self).__init__(endpoint, method=self.METHOD)
def _conversion_hook(self, s: str) -> List:
rv = []
ATTRS = ["title", "predefinedScr", "description", "canonicalName"]
try:
for M in get_store(s, "ScreenerStore")["predefinedList"]:
d = {}
for attr in ATTRS:
d.update({attr: M[attr]})
rv.append(d)
except Exception as err:
# let the client deal with the error
raise ConversionHookError(422, "Unprocessable Entity")
else:
logger.info("%s conversion_hook: OK", self.__class__.__name__)
return {"screeners": rv}