[BugFix] Clean Out Files From Already Deprecated Endpoint (#6953)

* clean out files from already deprecated endpoint

* decorator goes on the other side
This commit is contained in:
Danglewood
2024-11-19 16:46:11 -08:00
committed by GitHub
parent 3c9155f9f9
commit bb45cbf9f6
23 changed files with 7 additions and 1295 deletions

View File

@@ -2,14 +2,13 @@
from typing import Optional
from pydantic import Field
from openbb_core.provider.abstract.data import Data
from openbb_core.provider.abstract.query_params import QueryParams
from openbb_core.provider.utils.descriptions import (
DATA_DESCRIPTIONS,
QUERY_DESCRIPTIONS,
)
from pydantic import Field, field_validator
class IndexConstituentsQueryParams(QueryParams):
@@ -17,6 +16,12 @@ class IndexConstituentsQueryParams(QueryParams):
symbol: str = Field(description=QUERY_DESCRIPTIONS.get("symbol", ""))
@classmethod
@field_validator("symbol")
def _to_upper(cls, v):
"""Convert the symbol to uppercase."""
return v.upper()
class IndexConstituentsData(Data):
"""Index Constituents Data."""

View File

@@ -1,61 +0,0 @@
"""Market Indices Standard Model."""
from datetime import (
date as dateType,
datetime,
)
from typing import Optional
from dateutil import parser
from pydantic import Field, StrictFloat, field_validator
from openbb_core.provider.abstract.data import Data, ForceInt
from openbb_core.provider.abstract.query_params import QueryParams
from openbb_core.provider.utils.descriptions import (
DATA_DESCRIPTIONS,
QUERY_DESCRIPTIONS,
)
class MarketIndicesQueryParams(QueryParams):
"""Market Indices Query."""
symbol: str = Field(description=QUERY_DESCRIPTIONS.get("symbol", ""))
start_date: Optional[dateType] = Field(
description=QUERY_DESCRIPTIONS.get("start_date", ""), default=None
)
end_date: Optional[dateType] = Field(
description=QUERY_DESCRIPTIONS.get("end_date", ""), default=None
)
@field_validator("symbol", mode="before", check_fields=False)
@classmethod
def to_upper(cls, v: str) -> str:
"""Convert field to uppercase."""
return v.upper()
class MarketIndicesData(Data):
"""Market Indices Data."""
date: datetime = Field(description=DATA_DESCRIPTIONS.get("date", ""))
open: Optional[StrictFloat] = Field(
default=None, description=DATA_DESCRIPTIONS.get("open", "")
)
high: Optional[StrictFloat] = Field(
default=None, description=DATA_DESCRIPTIONS.get("high", "")
)
low: Optional[StrictFloat] = Field(
default=None, description=DATA_DESCRIPTIONS.get("low", "")
)
close: Optional[StrictFloat] = Field(
default=None, description=DATA_DESCRIPTIONS.get("close", "")
)
volume: Optional[ForceInt] = Field(
default=None, description=DATA_DESCRIPTIONS.get("volume", "")
)
@field_validator("date", mode="before", check_fields=False)
def date_validate(cls, v): # pylint: disable=E0213
"""Return formatted datetime."""
return parser.isoparse(str(v))

View File

@@ -34,7 +34,6 @@ around the world.""",
"IndexHistorical": CboeIndexHistoricalFetcher,
"IndexSearch": CboeIndexSearchFetcher,
"IndexSnapshots": CboeIndexSnapshotsFetcher,
"MarketIndices": CboeIndexHistoricalFetcher,
"OptionsChains": CboeOptionsChainsFetcher,
},
repr_name="Chicago Board Options Exchange (CBOE)",

View File

@@ -125,7 +125,6 @@ stock market information (news, currencies, and stock prices).""",
"InstitutionalOwnership": FMPInstitutionalOwnershipFetcher,
"KeyExecutives": FMPKeyExecutivesFetcher,
"KeyMetrics": FMPKeyMetricsFetcher,
"MarketIndices": FMPIndexHistoricalFetcher,
"MarketSnapshots": FMPMarketSnapshotsFetcher,
"PricePerformance": FMPPricePerformanceFetcher,
"PriceTarget": FMPPriceTargetFetcher,

View File

@@ -1,114 +0,0 @@
"""FMP Market Indices Model."""
# pylint: disable=unused-argument
from datetime import datetime
from typing import Any, Dict, List, Literal, Optional
from dateutil.relativedelta import relativedelta
from openbb_core.provider.abstract.fetcher import Fetcher
from openbb_core.provider.standard_models.market_indices import (
MarketIndicesData,
MarketIndicesQueryParams,
)
from openbb_core.provider.utils.descriptions import DATA_DESCRIPTIONS
from openbb_core.provider.utils.helpers import get_querystring
from openbb_fmp.utils.helpers import get_data_many
from pydantic import Field, NonNegativeInt
class FMPMarketIndicesQueryParams(MarketIndicesQueryParams):
"""FMP Market Indices Query.
Source: https://site.financialmodelingprep.com/developer/docs/historical-index-price-api/
"""
__alias_dict__ = {"start_date": "from", "end_date": "to"}
timeseries: Optional[NonNegativeInt] = Field(
default=None, description="Number of days to look back."
)
interval: Literal["1min", "5min", "15min", "30min", "1hour", "4hour", "1day"] = (
Field(default="1day", description="Data granularity.")
)
sort: Literal["asc", "desc"] = Field(
default="desc", description="Sort the data in ascending or descending order."
)
class FMPMarketIndicesData(MarketIndicesData):
"""FMP Market Indices Data."""
adj_close: Optional[float] = Field(
description=DATA_DESCRIPTIONS.get("adj_close", ""),
default=None,
)
unadjusted_volume: Optional[float] = Field(
description="Unadjusted volume of the symbol.",
default=None,
)
change: Optional[float] = Field(
description="Change in the price of the symbol from the previous day.",
default=None,
)
change_percent: Optional[float] = Field(
description="Change % in the price of the symbol.",
default=None,
)
label: Optional[str] = Field(
description="Human readable format of the date.", default=None
)
change_over_time: Optional[float] = Field(
description="Change % in the price of the symbol over a period of time.",
default=None,
)
class FMPMarketIndicesFetcher(
Fetcher[
FMPMarketIndicesQueryParams,
List[FMPMarketIndicesData],
]
):
"""Transform the query, extract and transform the data from the FMP endpoints."""
@staticmethod
def transform_query(params: Dict[str, Any]) -> FMPMarketIndicesQueryParams:
"""Transform the query params."""
transformed_params = params
now = datetime.now().date()
if params.get("start_date") is None:
transformed_params["start_date"] = now - relativedelta(years=1)
if params.get("end_date") is None:
transformed_params["end_date"] = now
return FMPMarketIndicesQueryParams.model_validate(transformed_params)
@staticmethod
async def aextract_data(
query: FMPMarketIndicesQueryParams,
credentials: Optional[Dict[str, str]],
**kwargs: Any,
) -> List[Dict]:
"""Return the raw data from the FMP endpoint."""
api_key = credentials.get("fmp_api_key") if credentials else ""
base_url = "https://financialmodelingprep.com/api/v3"
query_str = get_querystring(query.model_dump(), ["symbol", "interval", "sort"])
url_params = f"{query.symbol}?{query_str}&apikey={api_key}"
url = f"{base_url}/historical-chart/{query.interval}/{url_params}"
return await get_data_many(url, "historical", **kwargs)
@staticmethod
def transform_data(
query: FMPMarketIndicesQueryParams, data: List[Dict], **kwargs: Any
) -> List[FMPMarketIndicesData]:
"""Return the transformed data."""
if query.sort == "asc":
data = sorted(data, key=lambda x: x["date"], reverse=True)
return [FMPMarketIndicesData.model_validate(d) for d in data]

View File

@@ -1,57 +0,0 @@
interactions:
- request:
body: null
headers:
Accept:
- application/json
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
method: GET
uri: https://financialmodelingprep.com/api/v3/historical-chart/1day/%5EDJI?apikey=MOCK_API_KEY&from=2023-01-01&to=2023-01-10
response:
body:
string: !!binary |
H4sIAAAAAAAAA43SS07DMBAG4H1PEWXdjubhGXt6FcQCQUSRCkHitUDcHTcNcesopVGShX9b/jye
m1XTfOevadqHu/eu3TYtI8sGaUPYEG8R89uuj1P61+4lTxFRMgjs5mOw77+G8cAECTGmcXz39Lgb
gsgGKo42Bvf7/q07JhiAkPQv+ez3H8+HiC2xYX7y+M962Ym+7DQLcNiVa2eKYIZktdNFs8YlzZxK
eUlIIdRO4ZjCNU5bdqIqyEndRie7xzN/qSfh2QGK0yQnJycoTsN4lVOXneQEkVLUypmIYfjXznrB
5GTPznzgaUlxSnS+xhkuOC1fY5jfO4pASBhi7QzoZ11Y6snmEM1VZs7oQzn/dcoFZ0iQvDTVVE9F
0IhCtVNy4yoVTXGSGBzawmdO1Vzr0bm6/QU7Pyuq8gMAAA==
headers:
Access-Control-Allow-Credentials:
- 'true'
Access-Control-Allow-Headers:
- X-Requested-With, content-type, auth-token, Authorization, stripe-signature,
APPS
Access-Control-Allow-Methods:
- GET, POST, OPTIONS
Access-Control-Allow-Origin:
- '*'
Access-Control-Max-Age:
- '3600'
Connection:
- keep-alive
Content-Encoding:
- gzip
Content-Type:
- application/json; charset=utf-8
Date:
- Fri, 01 Dec 2023 21:25:06 GMT
Etag:
- W/"3f2-y9+VxwqtePCRYovMzrv9Y2mmzrc"
Server:
- nginx/1.18.0 (Ubuntu)
Transfer-Encoding:
- chunked
Vary:
- Accept-Encoding
X-Frame-Options:
- SAMEORIGIN
X-Powered-By:
- Express
status:
code: 200
message: OK
version: 1

View File

@@ -1,57 +0,0 @@
interactions:
- request:
body: null
headers:
Accept:
- application/json
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
method: GET
uri: https://financialmodelingprep.com/api/v3/historical-chart/1day/%5EDJI?apikey=MOCK_API_KEY&from=2023-01-01&to=2023-01-10
response:
body:
string: !!binary |
H4sIAAAAAAAAA43SzU6DQBAH8HufgnBuJ/O9O30V48FoY02qmPh1ML67CyWFgtQS4MB/N/ubYW5W
VfVdnqqqH+7ed/W2qhlZNkgbwgpx2931+riked29lCUiRg7K4Tn3yaH56gJlgoyYMvXB/ulx3yWJ
HUwCXfrk/tC87Y4RKhCSnaLP5vDx3GbsmR3LVb7/rJetGMtWd4X2XLapNSdwb8+dWkOsgEKSzaxG
ZZNmlTy1Cqes11h92YpmIOP29VaOSOdFDH0lPK9isLqUaFzGYHVMV1lt2UpBkCinSVs5E0P3nlGn
O05SjiJtq+a5VFLwNVK9IPXyO/WPCUAR0IzqMaUqxvlIDl1lD0geJjSzpuia+q9VLlg1Q47RfJ3a
agiWUEimVilzbDQCDVYSh3ZCQmdWs9L03rq6/QXH+CSaCAQAAA==
headers:
Access-Control-Allow-Credentials:
- 'true'
Access-Control-Allow-Headers:
- X-Requested-With, content-type, auth-token, Authorization, stripe-signature,
APPS, publicauthkey, privateauthkey
Access-Control-Allow-Methods:
- GET, POST, OPTIONS
Access-Control-Allow-Origin:
- '*'
Access-Control-Max-Age:
- '3600'
Connection:
- keep-alive
Content-Encoding:
- gzip
Content-Type:
- application/json; charset=utf-8
Date:
- Thu, 27 Jun 2024 10:12:17 GMT
Etag:
- W/"408-glTYZ6Uxgu2pCgKN72yd6UNBr5A"
Server:
- nginx/1.18.0 (Ubuntu)
Transfer-Encoding:
- chunked
Vary:
- Accept-Encoding
X-Frame-Options:
- SAMEORIGIN
X-Powered-By:
- Express
status:
code: 200
message: OK
version: 1

View File

@@ -60,7 +60,6 @@ from openbb_fmp.models.insider_trading import FMPInsiderTradingFetcher
from openbb_fmp.models.institutional_ownership import FMPInstitutionalOwnershipFetcher
from openbb_fmp.models.key_executives import FMPKeyExecutivesFetcher
from openbb_fmp.models.key_metrics import FMPKeyMetricsFetcher
from openbb_fmp.models.market_indices import FMPMarketIndicesFetcher
from openbb_fmp.models.market_snapshots import FMPMarketSnapshotsFetcher
from openbb_fmp.models.price_performance import FMPPricePerformanceFetcher
from openbb_fmp.models.price_target import FMPPriceTargetFetcher
@@ -138,20 +137,6 @@ def test_fmp_currency_historical_fetcher(credentials=test_credentials):
assert result is None
@pytest.mark.record_http
def test_fmp_market_indices_fetcher(credentials=test_credentials):
"""Test FMP market indices fetcher."""
params = {
"symbol": "^DJI",
"start_date": date(2023, 1, 1),
"end_date": date(2023, 1, 10),
}
fetcher = FMPMarketIndicesFetcher()
result = fetcher.test(params, credentials)
assert result is None
@pytest.mark.record_http
def test_fmp_index_historical_fetcher(credentials=test_credentials):
"""Test FMP index historical fetcher."""

View File

@@ -100,7 +100,6 @@ historical financial market data to businesses and developers through an API."""
# "InstitutionalOwnership": IntrinioInstitutionalOwnershipFetcher, # Disabled due to unreliable Intrinio endpoint
"KeyMetrics": IntrinioKeyMetricsFetcher,
"LatestAttributes": IntrinioLatestAttributesFetcher,
"MarketIndices": IntrinioIndexHistoricalFetcher,
"MarketSnapshots": IntrinioMarketSnapshotsFetcher,
"OptionsChains": IntrinioOptionsChainsFetcher,
"OptionsSnapshots": IntrinioOptionsSnapshotsFetcher,

View File

@@ -1,91 +0,0 @@
"""Intrinio Market Indices Model."""
from datetime import datetime
from typing import Any, Dict, List, Literal, Optional
from dateutil.relativedelta import relativedelta
from openbb_core.provider.abstract.fetcher import Fetcher
from openbb_core.provider.standard_models.market_indices import (
MarketIndicesData,
MarketIndicesQueryParams,
)
from openbb_core.provider.utils.descriptions import QUERY_DESCRIPTIONS
from openbb_core.provider.utils.helpers import get_querystring
from openbb_intrinio.utils.helpers import get_data_many
from pydantic import Field, NonNegativeInt
class IntrinioMarketIndicesQueryParams(MarketIndicesQueryParams):
"""Intrinio Market Indices Query.
Source: https://docs.intrinio.com/documentation/web_api/get_stock_market_index_historical_data_v2
"""
tag: Optional[str] = Field(default="level", description="Index tag.")
type: Optional[str] = Field(
default=None,
description="Index type.",
)
sort: Literal["asc", "desc"] = Field(
default="desc",
description="Sort order.",
alias="sort_order",
)
limit: NonNegativeInt = Field(
default=1000,
description=QUERY_DESCRIPTIONS.get("limit", ""),
alias="page_size",
)
class IntrinioMarketIndicesData(MarketIndicesData):
"""Intrinio Market Indices Data."""
__alias_dict__ = {"close": "value"}
class IntrinioMarketIndicesFetcher(
Fetcher[
IntrinioMarketIndicesQueryParams,
List[IntrinioMarketIndicesData],
]
):
"""Transform the query, extract and transform the data from the Intrinio endpoints."""
@staticmethod
def transform_query(params: Dict[str, Any]) -> IntrinioMarketIndicesQueryParams:
"""Transform the query params."""
transformed_params = params
now = datetime.now().date()
if params.get("start_date") is None:
transformed_params["start_date"] = now - relativedelta(years=1)
if params.get("end_date") is None:
transformed_params["end_date"] = now
return IntrinioMarketIndicesQueryParams(**transformed_params)
@staticmethod
async def aextract_data(
query: IntrinioMarketIndicesQueryParams,
credentials: Optional[Dict[str, str]],
**kwargs: Any,
) -> List[Dict]:
"""Return the raw data from the Intrinio endpoint."""
api_key = credentials.get("intrinio_api_key") if credentials else ""
base_url = "https://api-v2.intrinio.com/indices/stock_market"
query_str = get_querystring(query.model_dump(by_alias=True), ["symbol", "tag"])
url = f"{base_url}/{query.symbol}/historical_data/{query.tag}?{query_str}&api_key={api_key}"
return await get_data_many(url, "historical_data", **kwargs)
@staticmethod
def transform_data(
query: IntrinioMarketIndicesQueryParams, # pylint: disable=unused-argument
data: List[Dict],
**kwargs: Any,
) -> List[IntrinioMarketIndicesData]:
"""Return the transformed data."""
return [IntrinioMarketIndicesData.model_validate(d) for d in data]

View File

@@ -1,52 +0,0 @@
interactions:
- request:
body: null
headers:
Accept:
- '*/*'
Accept-Encoding:
- gzip, deflate, br
Connection:
- keep-alive
method: GET
uri: https://api-v2.intrinio.com/indices/stock_market/$DJI/historical_data/level?api_key=MOCK_API_KEY&end_date=2023-06-06&page_size=1000&sort_order=desc&start_date=2023-01-01
response:
body:
string: !!binary |
H4sIAGQlZWUAA3RYTW8bRwz9K4LQoz0YkvPpm4FckkMubS8tCmFjbRoB8iqVVm4cI/+93KRFlzPP
gA6W9oEzfOQj3/pl++lwmU/nw8Nw3O2Hedje/f6y1T/G7d2WPcutT/rZ3myfhuNVfxSJWRyXbzc9
LBpYYlcSgvEalhWWIYzWMJ/IxdzB4q2sYVx9cQxh3kQLemifQrzl+j9suh6PCGLI8FWcBARbk8E5
BZciggUDq9VVRjAxh8boIiGYoZZLchFlSXUNC5xcEgQrpp4SXUWHUrbRvMuoAmR5I3aEeCPTRBKK
65tDUSZR8d4lRBuRhVVMG3mbKDlBfPhq+5tcQdG8oS2RZlARzCSacnCCauXXDSLE2WVEmzcNEig4
hjDDWyrBRZjpmrfgI7m+ouGWi0HV4qivlcJMfxTtNgxLtlbKLjzUDhnxrvQZBKsrKTm6ng5Fmf4o
OjwqvJrpj6yyAt0WGlmVmp3v+yM0sqoZqi80sqolO+r7Q2E2Ub1bQLSRmFpxRU0ZGl2loAMEoajt
ogyDWVkt0wjR5leJwpkbmgUUSnSMDrSSCkWHPDzQUKZkIOWFRlJJG5J6MsQuIB3h4RXYmgwusTrf
V13MAtJglMH4E6s8lqpqR2ca5XEQdr5PVJodxJLRUBC7g5h8fOXQdQuxV4FSrwKx0uOYPE7UsMYh
oIUmVitUdDJXCEs2mjYkysCsICpaUeA8xCqPKaIRI1Z4VKiitSdWK1R1UyUEMyuIOQZkscSuIHUV
BV7NZ9uSOjpgMCs+3Y4BRjNykepdRazZDeS9YHLNBuK07Nr+UG6EkDSFPhg3OihFtdePD250UCgh
L8aNF6MoyBZx48V8iK8casYH6WCOELbqDzgkuVkYy54FI54bH5ZqcqUXAVsRBOLiPIStOQteqQX2
m5v1w0pG7UcMNxujpFeiWSOW1DSXXu7cGLEaKtrHbGUQKL7Cm5VBqeQ86g4rg6pVwIey4W1pItTf
jRGrjAwK2R2kVdBD+2jUvAQtywW0JDWGreaC1gY1hm2hN/SZUmPYchCkZGoMWxbBmVrxpUUuEGYy
lcX+oUytY/PLekHRrGNjlQy8W+PYyCNlkREglDI1chF1KAlRa9xaIBUfGLnU2LWqr++gJakRX/Zq
ZACqeQlaDApK0qolqQuAGRjHxlVhsNWsY2OdC+AVkxrtkSQnEMZNAf642R6m/fhle/eyPewVqd92
/PXp/dd7RV6eHz+cjvrrT2/evdXv0/C4RHtz+nvz7jSNl83baX+9zOfDcNzcP43n4c9RUQ+naT5M
4zQr9P3pPH/a3D+Oy79Zvj+7TvP5WZ/8Oh3mcb/5edYbXjanjyvQ9fNy7d3H8/jXdZweFvR+OByf
9dFxuMy7H8/3/+VFi9J+8XS3fLTC3v+myNOHy3h+GubDadpd5uE8f4fTv/AGME4mWth+02THL/Pu
85LSD6r+AQAA//8DAAVlFaAwEgAA
headers:
Connection:
- keep-alive
Content-Encoding:
- gzip
Content-Type:
- application/json
Date:
- Mon, 27 Nov 2023 23:25:24 GMT
Transfer-Encoding:
- chunked
Vary:
- Origin,Accept-Encoding
status:
code: 200
message: OK
version: 1

View File

@@ -1,52 +0,0 @@
interactions:
- request:
body: null
headers:
Accept:
- application/json
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
method: GET
uri: https://api-v2.intrinio.com/indices/stock_market/$DJI/historical_data/level?api_key=MOCK_API_KEY&end_date=2023-06-06&page_size=1000&sort_order=desc&start_date=2023-01-01
response:
body:
string: !!binary |
H4sIAGs7fWYAA3RYTW8bRwz9K8KiR3swJOfTNwO5JIdc2l5aFIJibRIB8iqVVm4cI/+93KRAlzPP
gA+W9oEcvuEj3+pl+Hy4zKfz4WF33O538264+/Nl0H/G4W5gz3Lrk/4NN8PT7njVL0ViFsfl+00P
iwaW2JWEYLyGZYVlCKM1zCdyMXeweCtrGFdfHEOYN9GCJu1LiLdc/4dN1+MRQQwZvoqTgGBrMjin
4FJEsGBgtbrKCCYmaYwuEoIZarkkF1GVVNewwMklQbBi7lOiqygpZRvNu4xugCxvxI4Qb2SaSEJx
fXMoyhQq3ruEaCOysIppI28LJSeID19tf5MrKJo3tCXSCiqCmUJTDk7QXfl1gwhxdhnR5k2DBAqO
IczwlkpwEVa65i34SK6/0XDLxaBqcdTflcJMfxTtNgxL9q6UXZjUDhnxrvQVBKsrKTm6ng5Fmf4o
OjwqPJrpj6yyAt0WGlmVmp3v+yM0sqoZqi80sqolO+r7Q2G2UD1bQLSRmLviipoyNLpKQQcIQlHb
RRkGs7JaphGiza8KhTM3NAsolOgYJbSSCkWHPExoKFMykPJCI6mkDUk9GWIXkI7w8ApsTQaXWJ3v
b13MAtJglMH4E6s8lqpqRzmN8jgIO98XKs0OYsloKIjdQUw+vpJ03ULsVaDUq0Cs9Dgmjws1rHEI
aKGJ1QoVncwVwpKNpg2JKjAriIreKHAeYpXHFNGIESs8KlTR2hOrFaq6qRKCmRXEHAOyWGJXkLqK
Ao/ms21JHR0wmBWfbscAoxm5SPWuItbsBvJeMLlmA3Fadm2flBshJC2hD8aNDkpR7fXjgxsdFErI
i3HjxSgKskXceDEf4itJzfggHcwRwlb9AYckNwtj2bNgxHPjw1JNrvQiYCuCQFych7A1Z8ErtcB+
c7N+WMmo/YjhZmOU9Eo0a8SSmubSy50bI1ZDRfuYrQwCxVd4szIolZxH3WFlUPUWcFI2vC1NhPq7
MWKVkUEhu4P0FjRpH42al6BluYCWpMaw1VzQ2qDGsC30hr5SagxbDoKUTI1hyyK4Uiu+tMgFwkyl
stg/VKl1bH5ZLyiadWyskoFnaxwbeaQsMgKEUqZGLqIOJSFqjVsLpOIDI5cau1b19R20JDXiy16N
DEA1L0GLQUFFWrUkdQGwAuPYuCoMtpp1bKxzAbxiUqM9kuQEwri5gL9uhsO0H78Ody/DYa9I/bTl
b0/vv90r8vL8+OF01G9/efPurX6edo9LtDenfzbvTtN42byd9tfLfD7sjpv7p/G8+zQq6uE0zYdp
nGaFvj+d58+b+8dx+Znlx7PrNJ+f9cnv02Ee95tfZz3hZXP6uAJdvyzH3n48j39fx+lhQe93h+Oz
PjruLvP25/P9z7oWi6y6/c37O6K7oML2/g9Fnj5cxvPTbj6cpu1l3p3nH3D6D94AxslES8N3LXb8
Om+/LCX9pOpfAAAA//8DALlCfsAwEgAA
headers:
Connection:
- keep-alive
Content-Encoding:
- gzip
Content-Type:
- application/json
Date:
- Thu, 27 Jun 2024 10:14:03 GMT
Transfer-Encoding:
- chunked
Vary:
- Origin,Accept-Encoding
status:
code: 200
message: OK
version: 1

View File

@@ -53,7 +53,6 @@ from openbb_intrinio.models.insider_trading import IntrinioInsiderTradingFetcher
# )
from openbb_intrinio.models.key_metrics import IntrinioKeyMetricsFetcher
from openbb_intrinio.models.latest_attributes import IntrinioLatestAttributesFetcher
from openbb_intrinio.models.market_indices import IntrinioMarketIndicesFetcher
from openbb_intrinio.models.market_snapshots import IntrinioMarketSnapshotsFetcher
from openbb_intrinio.models.options_chains import IntrinioOptionsChainsFetcher
from openbb_intrinio.models.options_snapshots import IntrinioOptionsSnapshotsFetcher
@@ -300,21 +299,6 @@ def test_intrinio_equity_info_fetcher(credentials=test_credentials):
assert result is None
@pytest.mark.record_http
def test_intrinio_market_indices_fetcher(credentials=test_credentials):
"""Test market indices fetcher."""
params = {
"symbol": "$DJI",
"tag": "level",
"start_date": date(2023, 1, 1),
"end_date": date(2023, 6, 6),
}
fetcher = IntrinioMarketIndicesFetcher()
result = fetcher.test(params, credentials)
assert result is None
@pytest.mark.record_http
def test_intrinio_index_historical_fetcher(credentials=test_credentials):
"""Test index historical fetcher."""

View File

@@ -36,7 +36,6 @@ company financials, stock market holidays, corporate actions, and more.""",
"EtfHistorical": PolygonEquityHistoricalFetcher,
"IncomeStatement": PolygonIncomeStatementFetcher,
"IndexHistorical": PolygonIndexHistoricalFetcher,
"MarketIndices": PolygonIndexHistoricalFetcher,
"MarketSnapshots": PolygonMarketSnapshotsFetcher,
},
repr_name="Polygon.io",

View File

@@ -1,118 +0,0 @@
"""Polygon Market Indices Model."""
from datetime import (
datetime,
)
from typing import Any, Dict, List, Literal, Optional
from openbb_core.provider.abstract.fetcher import Fetcher
from openbb_core.provider.standard_models.market_indices import (
MarketIndicesData,
MarketIndicesQueryParams,
)
from openbb_core.provider.utils.descriptions import QUERY_DESCRIPTIONS
from pydantic import Field, PositiveInt
class PolygonMarketIndicesQueryParams(MarketIndicesQueryParams):
"""Polygon Market Indices Query.
Source: https://polygon.io/docs/indices/getting-started
"""
timespan: Literal["minute", "hour", "day", "week", "month", "quarter", "year"] = (
Field(default="day", description="Timespan of the data.")
)
sort: Literal["asc", "desc"] = Field(
default="desc", description="Sort order of the data."
)
limit: PositiveInt = Field(
default=49999, description=QUERY_DESCRIPTIONS.get("limit", "")
)
adjusted: bool = Field(default=True, description="Whether the data is adjusted.")
multiplier: PositiveInt = Field(
default=1, description="Multiplier of the timespan."
)
class PolygonMarketIndicesData(MarketIndicesData):
"""Polygon Market Indices Data."""
__alias_dict__ = {
"date": "t",
"open": "o",
"high": "h",
"low": "l",
"close": "c",
"volume": "v",
"vwap": "vw",
}
transactions: Optional[PositiveInt] = Field(
default=None,
description="Number of transactions for the symbol in the time period.",
alias="n",
)
class PolygonMarketIndicesFetcher(
Fetcher[
PolygonMarketIndicesQueryParams,
List[PolygonMarketIndicesData],
]
):
"""Polygon Market Indices Fetcher."""
@staticmethod
def transform_query(params: Dict[str, Any]) -> PolygonMarketIndicesQueryParams:
"""Transform the query params."""
# pylint: disable=import-outside-toplevel
from dateutil.relativedelta import relativedelta
now = datetime.now().date()
transformed_params = params
if params.get("start_date") is None:
transformed_params["start_date"] = now - relativedelta(years=1)
if params.get("end_date") is None:
transformed_params["end_date"] = now
return PolygonMarketIndicesQueryParams(**transformed_params)
@staticmethod
async def aextract_data(
query: PolygonMarketIndicesQueryParams,
credentials: Optional[Dict[str, str]],
**kwargs: Any,
) -> dict:
"""Extract raw data from the Polygon endpoint."""
# pylint: disable=import-outside-toplevel
from openbb_core.provider.utils.helpers import safe_fromtimestamp
from openbb_polygon.utils.helpers import get_data_many
api_key = credentials.get("polygon_api_key") if credentials else ""
request_url = (
f"https://api.polygon.io/v2/aggs/ticker/"
f"I:{query.symbol}/range/{query.multiplier}/{query.timespan}/"
f"{query.start_date}/{query.end_date}?adjusted={query.adjusted}"
f"&sort={query.sort}&limit={query.limit}&apiKey={api_key}"
)
data = await get_data_many(request_url, "results", **kwargs)
for d in data:
v = d["t"] / 1000 # milliseconds to seconds
d["t"] = safe_fromtimestamp(v)
if query.timespan not in ["minute", "hour"]:
d["t"] = d["t"].date()
return data
@staticmethod
def transform_data(
query: PolygonMarketIndicesQueryParams,
data: dict,
**kwargs: Any,
) -> List[PolygonMarketIndicesData]:
"""Transform the data."""
return [PolygonMarketIndicesData.model_validate(d) for d in data]

View File

@@ -1,79 +0,0 @@
interactions:
- request:
body: null
headers:
Accept:
- '*/*'
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
method: GET
uri: https://api.polygon.io/v2/aggs/ticker/I:NDX/range/1/day/2023-01-01/2023-05-10?adjusted=True&apiKey=MOCK_API_KEY&limit=49999&sort=desc
response:
body:
string: !!binary |
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
6MuXkeHjdjyvr+B//C8AAP//XVlGICgXAAA=
headers:
Connection:
- keep-alive
Content-Encoding:
- gzip
Content-Type:
- application/json
Date:
- Tue, 26 Sep 2023 19:08:14 GMT
Server:
- nginx/1.19.2
Strict-Transport-Security:
- max-age=15724800; includeSubDomains
Transfer-Encoding:
- chunked
Vary:
- Accept-Encoding
X-Request-Id:
- c575e02a0c39113007f40f41a2ea4115
status:
code: 200
message: OK
version: 1

View File

@@ -1,79 +0,0 @@
interactions:
- request:
body: null
headers:
Accept:
- application/json
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
method: GET
uri: https://api.polygon.io/v2/aggs/ticker/I:NDX/range/1/day/2023-01-01/2023-05-10?adjusted=True&apiKey=MOCK_API_KEY&limit=49999&sort=desc
response:
body:
string: !!binary |
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
6j94y9PxcDytr+C//xEAAP//Ujf+pSgXAAA=
headers:
Connection:
- keep-alive
Content-Encoding:
- gzip
Content-Type:
- application/json
Date:
- Thu, 27 Jun 2024 10:14:47 GMT
Server:
- nginx/1.19.2
Strict-Transport-Security:
- max-age=15724800; includeSubDomains
Transfer-Encoding:
- chunked
Vary:
- Accept-Encoding
X-Request-Id:
- d796bbcbe18450171f812290e24a491c
status:
code: 200
message: OK
version: 1

View File

@@ -17,9 +17,6 @@ from openbb_polygon.models.income_statement import PolygonIncomeStatementFetcher
from openbb_polygon.models.index_historical import (
PolygonIndexHistoricalFetcher,
)
from openbb_polygon.models.market_indices import (
PolygonMarketIndicesFetcher,
)
from openbb_polygon.models.market_snapshots import PolygonMarketSnapshotsFetcher
test_credentials = UserService().default_user_settings.credentials.model_dump(
@@ -53,20 +50,6 @@ def test_polygon_equity_historical_fetcher(credentials=test_credentials):
assert result is None
@pytest.mark.record_http
def test_polygon_market_indices_fetcher(credentials=test_credentials):
"""Test the Polygon Market Indices fetcher."""
params = {
"symbol": "NDX",
"start_date": date(2023, 1, 1),
"end_date": date(2023, 5, 10),
}
fetcher = PolygonMarketIndicesFetcher()
result = fetcher.test(params, credentials)
assert result is None
@pytest.mark.record_http
def test_polygon_index_historical_fetcher(credentials=test_credentials):
"""Test the Polygon Index Historical fetcher."""

View File

@@ -69,7 +69,6 @@ financial markets and assets.""",
"IndexHistorical": YFinanceIndexHistoricalFetcher,
"KeyExecutives": YFinanceKeyExecutivesFetcher,
"KeyMetrics": YFinanceKeyMetricsFetcher,
"MarketIndices": YFinanceIndexHistoricalFetcher,
"OptionsChains": YFinanceOptionsChainsFetcher,
"PriceTargetConsensus": YFinancePriceTargetConsensusFetcher,
"ShareStatistics": YFinanceShareStatisticsFetcher,

View File

@@ -1,141 +0,0 @@
"""Yahoo Finance Market Indices Model."""
from datetime import datetime, timedelta
from typing import Any, Dict, List, Optional
from openbb_core.provider.abstract.fetcher import Fetcher
from openbb_core.provider.standard_models.market_indices import (
MarketIndicesData,
MarketIndicesQueryParams,
)
from openbb_core.provider.utils.descriptions import QUERY_DESCRIPTIONS
from openbb_core.provider.utils.errors import EmptyDataError
from openbb_yfinance.utils.references import INDICES, INTERVALS, PERIODS
from pydantic import Field
class YFinanceMarketIndicesQueryParams(MarketIndicesQueryParams):
"""YFinance Market Indices Query.
Source: https://finance.yahoo.com/world-indices
"""
__json_schema_extra__ = {"symbol": {"multiple_items_allowed": True}}
interval: Optional[INTERVALS] = Field(default="1d", description="Data granularity.")
period: Optional[PERIODS] = Field(
default="max", description=QUERY_DESCRIPTIONS.get("period", "")
)
prepost: bool = Field(default=True, description="Include Pre and Post market data.")
rounding: bool = Field(default=True, description="Round prices to two decimals?")
class YFinanceMarketIndicesData(MarketIndicesData):
"""YFinance Market Indices Data."""
class YFinanceMarketIndicesFetcher(
Fetcher[
YFinanceMarketIndicesQueryParams,
List[YFinanceMarketIndicesData],
]
):
"""Transform the query, extract and transform the data from the Yahoo Finance endpoints."""
@staticmethod
def transform_query(params: Dict[str, Any]) -> YFinanceMarketIndicesQueryParams:
"""Transform the query."""
# pylint: disable=import-outside-toplevel
from dateutil.relativedelta import relativedelta
from pandas import DataFrame
transformed_params = params
now = datetime.now().date()
if params.get("start_date") is None:
transformed_params["start_date"] = now - relativedelta(years=1)
if params.get("end_date") is None:
transformed_params["end_date"] = now
tickers = params.get("symbol", "").lower().split(",")
new_tickers = []
for ticker in tickers:
_ticker = ""
indices = DataFrame(INDICES).transpose().reset_index()
indices.columns = ["code", "name", "symbol"]
if ticker in indices["code"].values:
_ticker = indices[indices["code"] == ticker]["symbol"].values[0]
if ticker.title() in indices["name"].values:
_ticker = indices[indices["name"] == ticker.title()]["symbol"].values[0]
if "^" + ticker.upper() in indices["symbol"].values:
_ticker = "^" + ticker.upper()
if ticker.upper() in indices["symbol"].values:
_ticker = ticker.upper()
if _ticker != "":
new_tickers.append(_ticker)
transformed_params["symbol"] = ",".join(new_tickers)
return YFinanceMarketIndicesQueryParams(**params)
# pylint: disable=unused-argument
@staticmethod
def extract_data(
query: YFinanceMarketIndicesQueryParams,
credentials: Optional[Dict[str, str]],
**kwargs: Any,
) -> List[dict]:
"""Return the raw data from the Yahoo Finance endpoint."""
# pylint: disable=import-outside-toplevel
from openbb_yfinance.utils.helpers import yf_download
from pandas import to_datetime
data = yf_download(
symbol=query.symbol,
start_date=query.start_date,
end_date=query.end_date,
interval=query.interval,
period=query.period,
prepost=query.prepost,
rounding=query.rounding,
)
if data.empty:
raise EmptyDataError()
days = (
1
if query.interval in ["1m", "2m", "5m", "15m", "30m", "60m", "1h", "90m"]
else 0
)
if query.start_date:
if "date" in data.columns:
data.set_index("date", inplace=True)
data.index = to_datetime(data.index)
data = data[
(data.index >= to_datetime(query.start_date))
& (data.index <= to_datetime(query.end_date + timedelta(days=days))) # type: ignore[operator]
]
data.reset_index(inplace=True)
data.rename(columns={"index": "date"}, inplace=True)
return data.to_dict("records")
@staticmethod
def transform_data(
query: YFinanceMarketIndicesQueryParams,
data: dict,
**kwargs: Any,
) -> List[YFinanceMarketIndicesData]:
"""Transform the data to the standard format."""
return [YFinanceMarketIndicesData.model_validate(d) for d in data]

View File

@@ -1,265 +0,0 @@
interactions:
- request:
body: null
headers:
Accept:
- '*/*'
Accept-Encoding:
- gzip, deflate
Connection:
- keep-alive
Cookie:
- MOCK_COOKIE
method: GET
uri: https://query2.finance.yahoo.com/v8/finance/chart/%5EGSPC?crumb=MOCK_CRUMB&events=div%2Csplits%2CcapitalGains&includePrePost=True&interval=1d&period1=MOCK_PERIOD_1&period2=MOCK_PERIOD_2
response:
body:
string: !!binary |
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
Cy1i/rgAAA==
headers:
Age:
- '0'
Connection:
- keep-alive
Referrer-Policy:
- no-referrer-when-downgrade
Strict-Transport-Security:
- max-age=31536000
Transfer-Encoding:
- chunked
X-Content-Type-Options:
- nosniff
X-Frame-Options:
- SAMEORIGIN
X-XSS-Protection:
- 1; mode=block
cache-control:
- public, max-age=10, stale-while-revalidate=20
content-encoding:
- gzip
content-type:
- application/json;charset=utf-8
date:
- Thu, 24 Oct 2024 05:32:53 GMT
server:
- ATS
vary:
- Origin,Accept-Encoding
x-envoy-decorator-operation:
- finance-chart-api--mtls-production-gq1.finance-k8s.svc.yahoo.local:4080/*
x-envoy-upstream-service-time:
- '6'
y-rid:
- 33fn0d9jhjn05
status:
code: 200
message: OK
version: 1

View File

@@ -30,9 +30,6 @@ from openbb_yfinance.models.index_historical import (
from openbb_yfinance.models.key_executives import YFinanceKeyExecutivesFetcher
from openbb_yfinance.models.key_metrics import YFinanceKeyMetricsFetcher
from openbb_yfinance.models.losers import YFLosersFetcher
from openbb_yfinance.models.market_indices import (
YFinanceMarketIndicesFetcher,
)
from openbb_yfinance.models.options_chains import YFinanceOptionsChainsFetcher
from openbb_yfinance.models.price_target_consensus import (
YFinancePriceTargetConsensusFetcher,
@@ -133,20 +130,6 @@ def test_y_finance_historical_dividends_fetcher(credentials=test_credentials):
assert result is None
@pytest.mark.record_http
def test_y_finance_market_indices_fetcher(credentials=test_credentials):
"""Test YFinanceMarketIndicesFetcher."""
params = {
"symbol": "^GSPC",
"start_date": date(2023, 1, 1),
"end_date": date(2023, 1, 10),
}
fetcher = YFinanceMarketIndicesFetcher()
result = fetcher.test(params, credentials)
assert result is None
@pytest.mark.record_http
def test_y_finance_futures_historical_fetcher(credentials=test_credentials):
"""Test YFinanceFuturesHistoricalFetcher."""