From fb0cde0f766dc7ca054b5c97b7dfc6b4f37f5334 Mon Sep 17 00:00:00 2001 From: Pratyush Shukla Date: Sun, 9 Jul 2023 17:32:39 +0530 Subject: [PATCH] added `comsplit` as stock split calendar from fmp --- .../builtin_providers/fmp/provider.py | 2 + .../builtin_providers/fmp/stock_splits.py | 69 +++++++++++++++++++ .../model/data/stock_splits.py | 56 +++++++++++++++ .../builtin_extensions/stocks/fa/fa_router.py | 12 ++++ 4 files changed, 139 insertions(+) create mode 100644 openbb_providers/builtin_providers/fmp/stock_splits.py create mode 100644 openbb_providers/openbb_provider/model/data/stock_splits.py diff --git a/openbb_providers/builtin_providers/fmp/provider.py b/openbb_providers/builtin_providers/fmp/provider.py index 25f36388bdf..5bfa4265ea2 100644 --- a/openbb_providers/builtin_providers/fmp/provider.py +++ b/openbb_providers/builtin_providers/fmp/provider.py @@ -47,6 +47,7 @@ from builtin_providers.fmp.stock_insider_trading import FMPStockInsiderTradingFe from builtin_providers.fmp.stock_news import FMPStockNewsFetcher from builtin_providers.fmp.stock_ownership import FMPStockOwnershipFetcher from builtin_providers.fmp.stock_price import FMPStockPriceFetcher +from builtin_providers.fmp.stock_splits import FMPStockSplitCalendarFetcher from builtin_providers.fmp.treasury_rates import FMPTreasuryRatesFetcher # mypy: disable-error-code="list-item" @@ -80,6 +81,7 @@ fmp_provider = Provider( FMPEarningsCalendarFetcher, FMPEarningsCallTranscriptFetcher, FMPHistoricalStockSplitsFetcher, + FMPStockSplitCalendarFetcher, FMPHistoricalDividendsFetcher, FMPKeyMetricsFetcher, FMPSECFilingsFetcher, diff --git a/openbb_providers/builtin_providers/fmp/stock_splits.py b/openbb_providers/builtin_providers/fmp/stock_splits.py new file mode 100644 index 00000000000..76bcd53e0b6 --- /dev/null +++ b/openbb_providers/builtin_providers/fmp/stock_splits.py @@ -0,0 +1,69 @@ +"""FMP Stock Splits Calendar fetcher.""" + +# IMPORT STANDARD +from datetime import date +from typing import Dict, List, Optional + +# IMPORT INTERNAL +from openbb_provider.model.data.stock_splits import ( + StockSplitCalendarData, + StockSplitCalendarQueryParams, +) +from openbb_provider.provider.abstract.fetcher import Fetcher +from openbb_provider.provider.provider_helpers import data_transformer + +# IMPORT THIRD-PARTY +from builtin_providers.fmp.helpers import create_url, get_data_many + + +class FMPStockSplitCalendarQueryParams(StockSplitCalendarQueryParams): + """FMP Stock Split Calendar query. + + Source: https://site.financialmodelingprep.com/developer/docs/stock-split-calendar-api/ + + Parameter + --------- + start_date : date + The start date of the stock splits from which to retrieve the data. + end_date : date + The end date of the stock splits up to which to retrieve the data. + """ + + start_date: date + end_date: date + + +class FMPStockSplitCalendarData(StockSplitCalendarData): + """FMP Stock Split Calendar data.""" + + +class FMPStockSplitCalendarFetcher( + Fetcher[ + StockSplitCalendarQueryParams, + StockSplitCalendarData, + FMPStockSplitCalendarQueryParams, + FMPStockSplitCalendarData, + ] +): + @staticmethod + def transform_query( + query: StockSplitCalendarQueryParams, extra_params: Optional[Dict] = None + ) -> FMPStockSplitCalendarQueryParams: + return FMPStockSplitCalendarQueryParams( + start_date=query.start_date, + end_date=query.end_date, + ) + + @staticmethod + def extract_data( + query: FMPStockSplitCalendarQueryParams, api_key: str + ) -> List[FMPStockSplitCalendarData]: + query_str = f"from={query.start_date}&to={query.end_date}" + url = create_url(3, f"stock_split_calendar?{query_str}", api_key) + return get_data_many(url, FMPStockSplitCalendarData) + + @staticmethod + def transform_data( + data: List[FMPStockSplitCalendarData], + ) -> List[StockSplitCalendarData]: + return data_transformer(data, StockSplitCalendarData) diff --git a/openbb_providers/openbb_provider/model/data/stock_splits.py b/openbb_providers/openbb_provider/model/data/stock_splits.py new file mode 100644 index 00000000000..0bea424d57d --- /dev/null +++ b/openbb_providers/openbb_provider/model/data/stock_splits.py @@ -0,0 +1,56 @@ +"""Stock Split Calendar data model.""" + + +from datetime import date as dateType, datetime, timedelta +from typing import Optional + +from pydantic import Field + +from openbb_provider.metadata import DESCRIPTIONS + +from openbb_provider.model.abstract.data import Data, QueryParams + + +class StockSplitCalendarQueryParams(QueryParams): + """Stock Split Calendar query model. + + Parameter + --------- + start_date : date + The start date of the stock splits from which to retrieve the data. + end_date : date + The end date of the stock splits up to which to retrieve the data. + """ + + start_date: dateType = Field( + description=DESCRIPTIONS.get("start_date", ""), + default=(datetime.now() - timedelta(days=90)).date(), + ) + end_date: dateType = Field( + description=DESCRIPTIONS.get("end_date", ""), + default=datetime.now().date(), + ) + + +class StockSplitCalendarData(Data): + """Stock Split Calendar data. + + Returns + ------- + date : date + The date of the stock splits. + label : str + The label of the stock splits. + symbol : str + The symbol of the company. + numerator : float + The numerator of the stock splits. + denominator : float + The denominator of the stock splits. + """ + + date: dateType + label: str + symbol: str + numerator: float + denominator: float diff --git a/openbb_sdk/builtin_extensions/stocks/fa/fa_router.py b/openbb_sdk/builtin_extensions/stocks/fa/fa_router.py index 772db4b79a1..b5ae5b59a2a 100644 --- a/openbb_sdk/builtin_extensions/stocks/fa/fa_router.py +++ b/openbb_sdk/builtin_extensions/stocks/fa/fa_router.py @@ -251,6 +251,18 @@ def cal( ) +@router.command(query="StockSplitCalendar") +def comsplit( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, +) -> CommandOutput[BaseModel]: + """Stock Split Calendar.""" + return CommandOutput( + results=Query(**locals()).execute(), provider=provider_choices.provider + ) + + @router.command def customer() -> CommandOutput[Empty]: # type: ignore """List of customers of the company."""