From 33948a454bdc9da93a7b055a62beb0a2e7a01eb0 Mon Sep 17 00:00:00 2001 From: chaig15 <7276836+chaig15@users.noreply.github.com> Date: Tue, 6 Dec 2022 23:19:16 -0800 Subject: [PATCH 01/15] summaries endpoint framework --- polygon/rest/__init__.py | 2 + polygon/rest/models/summaries.py | 83 ++++++++++++++++++++++++++++++++ polygon/rest/summaries.py | 42 ++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 polygon/rest/models/summaries.py create mode 100644 polygon/rest/summaries.py diff --git a/polygon/rest/__init__.py b/polygon/rest/__init__.py index 98bdf27b..aa8722e3 100644 --- a/polygon/rest/__init__.py +++ b/polygon/rest/__init__.py @@ -3,6 +3,7 @@ from .quotes import QuotesClient from .snapshot import SnapshotClient from .indicators import IndicatorsClient +from .summaries import SummariesClient from .reference import ( MarketsClient, TickersClient, @@ -34,6 +35,7 @@ class RESTClient( ExchangesClient, ContractsClient, IndicatorsClient, + SummariesClient, ): def __init__( self, diff --git a/polygon/rest/models/summaries.py b/polygon/rest/models/summaries.py new file mode 100644 index 00000000..81252477 --- /dev/null +++ b/polygon/rest/models/summaries.py @@ -0,0 +1,83 @@ +from sqlite3 import Timestamp +from typing import Optional, Any, Dict, List, Union +from ...modelclass import modelclass +from .aggs import Agg + + +@modelclass +class IndicatorValue: + "Contains one datum for indicators with a single value." + timestamp: Optional[int] = None + value: Optional[float] = None + + @staticmethod + def from_dict(d): + return IndicatorValue( + timestamp=d.get("timestamp", None), + value=d.get("value", None), + ) + + +@modelclass +class MACDIndicatorValue: + "Contains one datum for all MACD values." + timestamp: Optional[int] = None + value: Optional[float] = None + signal: Optional[float] = None + histogram: Optional[float] = None + + @staticmethod + def from_dict(d): + return MACDIndicatorValue( + timestamp=d.get("timestamp", None), + value=d.get("value", None), + signal=d.get("histogram", None), + histogram=d.get("signal", None), + ) + + +@modelclass +class IndicatorUnderlying: + "Contains the URL to call to get the aggs used for building the indicator." + url: Optional[str] = None + aggregates: Optional[List[Agg]] = None + + @staticmethod + def from_dict(d): + return IndicatorUnderlying( + url=d.get("url", None), + aggregates=[Agg.from_dict(a) for a in d.get("aggregates", [])], + ) + + +@modelclass +class SingleIndicatorResults: + "Contains indicator values and Underlying." + values: Optional[List[IndicatorValue]] = None + underlying: Optional[IndicatorUnderlying] = None + + @staticmethod + def from_dict(d): + return SingleIndicatorResults( + values=[IndicatorValue.from_dict(v) for v in (d.get("values", []))], + underlying=IndicatorUnderlying.from_dict(d.get("underlying", None)), + ) + + +SMAIndicatorResults = SingleIndicatorResults +EMAIndicatorResults = SingleIndicatorResults +RSIIndicatorResults = SingleIndicatorResults + + +@modelclass +class MACDIndicatorResults: + "Contains indicator values and Underlying." + values: Optional[List[MACDIndicatorValue]] = None + underlying: Optional[IndicatorUnderlying] = None + + @staticmethod + def from_dict(d): + return MACDIndicatorResults( + values=[MACDIndicatorValue.from_dict(v) for v in (d.get("values", []))], + underlying=IndicatorUnderlying.from_dict(d.get("underlying", None)), + ) diff --git a/polygon/rest/summaries.py b/polygon/rest/summaries.py new file mode 100644 index 00000000..cadc8ae0 --- /dev/null +++ b/polygon/rest/summaries.py @@ -0,0 +1,42 @@ +from polygon.rest.models.common import SeriesType +from polygon.rest.models.indicators import ( + SMAIndicatorResults, + EMAIndicatorResults, + RSIIndicatorResults, + MACDIndicatorResults, +) +from .base import BaseClient +from typing import Optional, Any, Dict, List, Union +from .models import Order +from urllib3 import HTTPResponse +from datetime import datetime, date + + +class SummariesClient(BaseClient): + def get_summaries( + self, + ticker_any_of: str, + params: Optional[Dict[str, Any]] = None, + raw: bool = False, + ) -> Union[SMAIndicatorResults, HTTPResponse]: + """ + GetSummaries retrieves summaries for the ticker list with the given params. + For more details see https://polygon.io/docs/stocks/get_v1_summaries. + + :param ticker_any_of: The ticker symbol + :param params: Any additional query params + :param raw: Return raw object instead of results object + :return: SummaryResults + """ + + url = f"/v1/summaries/" + + return self._get( + path=url, + params=self._get_params(self.get_sma, locals()), + result_key="results", + deserializer=SMAIndicatorResults.from_dict, + raw=raw, + ) + + From 7bf65500fb50bfeb172c0a141b8efe3a26198303 Mon Sep 17 00:00:00 2001 From: chaig15 <7276836+chaig15@users.noreply.github.com> Date: Tue, 6 Dec 2022 23:19:35 -0800 Subject: [PATCH 02/15] summaries endpoint framework --- polygon/rest/summaries.py | 1 - 1 file changed, 1 deletion(-) diff --git a/polygon/rest/summaries.py b/polygon/rest/summaries.py index cadc8ae0..1d562667 100644 --- a/polygon/rest/summaries.py +++ b/polygon/rest/summaries.py @@ -1,4 +1,3 @@ -from polygon.rest.models.common import SeriesType from polygon.rest.models.indicators import ( SMAIndicatorResults, EMAIndicatorResults, From c56d4dca70fa47aa9ba99d877afe99bd9baec2a5 Mon Sep 17 00:00:00 2001 From: chaig15 <7276836+chaig15@users.noreply.github.com> Date: Wed, 7 Dec 2022 03:24:37 -0800 Subject: [PATCH 03/15] add models --- polygon/rest/models/summaries.py | 128 ++++++++++++++++--------------- polygon/rest/summaries.py | 20 ++--- 2 files changed, 75 insertions(+), 73 deletions(-) diff --git a/polygon/rest/models/summaries.py b/polygon/rest/models/summaries.py index 81252477..a72de367 100644 --- a/polygon/rest/models/summaries.py +++ b/polygon/rest/models/summaries.py @@ -2,82 +2,88 @@ from typing import Optional, Any, Dict, List, Union from ...modelclass import modelclass from .aggs import Agg - - -@modelclass -class IndicatorValue: - "Contains one datum for indicators with a single value." - timestamp: Optional[int] = None - value: Optional[float] = None - - @staticmethod - def from_dict(d): - return IndicatorValue( - timestamp=d.get("timestamp", None), - value=d.get("value", None), - ) - +from .tickers import Branding @modelclass -class MACDIndicatorValue: - "Contains one datum for all MACD values." - timestamp: Optional[int] = None - value: Optional[float] = None - signal: Optional[float] = None - histogram: Optional[float] = None +class Session: + "Contains aggregate data for a given ticker symbol over a given date range in a custom time window size." + change: Optional[float] = None + change_percent: Optional[float] = None + early_trading_change: Optional[float] = None + early_trading_change_percent: Optional[float] = None + late_trading_change: Optional[float] = None + late_trading_change_percent: Optional[float] = None + close: Optional[float] = None + high: Optional[float] = None + low: Optional[float] = None + open: Optional[float] = None + previous_close: Optional[float] = None + volume: Optional[float] = None @staticmethod def from_dict(d): - return MACDIndicatorValue( - timestamp=d.get("timestamp", None), - value=d.get("value", None), - signal=d.get("histogram", None), - histogram=d.get("signal", None), + return Session( + d.get("change", None), + d.get("change_percent", None), + d.get("early_trading_change", None), + d.get("early_trading_change_percent", None), + d.get("late_trading_change", None), + d.get("late_trading_change_percent", None), + d.get("close", None), + d.get("high", None), + d.get("low", None), + d.get("open", None), + d.get("previous_close", None), + d.get("volume", None), ) - @modelclass -class IndicatorUnderlying: - "Contains the URL to call to get the aggs used for building the indicator." - url: Optional[str] = None - aggregates: Optional[List[Agg]] = None +class Options: + "Contains aggregate data for a given ticker symbol over a given date range in a custom time window size." + contract_type: Optional[str] = None + excercise_style: Optional[str] = None + expiration_date: Optional[str] = None + shares_per_contract: Optional[float] = None + strike_price: Optional[float] = None + underlying_ticker: Optional[float] = None @staticmethod def from_dict(d): - return IndicatorUnderlying( - url=d.get("url", None), - aggregates=[Agg.from_dict(a) for a in d.get("aggregates", [])], + return Options( + d.get("contract_type", None), + d.get("excercise_style", None), + d.get("expiration_date", None), + d.get("shares_per_contract", None), + d.get("strike_price", None), + d.get("underlying_ticker", None), ) - -@modelclass -class SingleIndicatorResults: - "Contains indicator values and Underlying." - values: Optional[List[IndicatorValue]] = None - underlying: Optional[IndicatorUnderlying] = None - - @staticmethod - def from_dict(d): - return SingleIndicatorResults( - values=[IndicatorValue.from_dict(v) for v in (d.get("values", []))], - underlying=IndicatorUnderlying.from_dict(d.get("underlying", None)), - ) - - -SMAIndicatorResults = SingleIndicatorResults -EMAIndicatorResults = SingleIndicatorResults -RSIIndicatorResults = SingleIndicatorResults - - @modelclass -class MACDIndicatorResults: - "Contains indicator values and Underlying." - values: Optional[List[MACDIndicatorValue]] = None - underlying: Optional[IndicatorUnderlying] = None +class SummaryResult: + "Contains aggregate data for a given ticker symbol over a given date range in a custom time window size." + price: Optional[float] = None + name: Optional[str] = None + ticker: Optional[str] = None + branding: Optional[Branding] = None + market_status: Optional[str] = None + type: Optional[str] = None + session: Optional[str] = None + options: Optional[str] = None @staticmethod def from_dict(d): - return MACDIndicatorResults( - values=[MACDIndicatorValue.from_dict(v) for v in (d.get("values", []))], - underlying=IndicatorUnderlying.from_dict(d.get("underlying", None)), + return SummaryResult( + price=d.get("price", None), + name=d.get("name", None), + ticker=d.get("ticker", None), + branding=None + if "branding" not in d + else Branding.from_dict(d['branding']), + market_status=d.get("market_status", None), + type=d.get("type", None), + session=d.get("session", None), + options=None + if "options" not in d + else Options.from_dict(d['options']), ) + \ No newline at end of file diff --git a/polygon/rest/summaries.py b/polygon/rest/summaries.py index 1d562667..ecd7bed2 100644 --- a/polygon/rest/summaries.py +++ b/polygon/rest/summaries.py @@ -1,8 +1,5 @@ -from polygon.rest.models.indicators import ( - SMAIndicatorResults, - EMAIndicatorResults, - RSIIndicatorResults, - MACDIndicatorResults, +from polygon.rest.models.summaries import ( + SummaryResult ) from .base import BaseClient from typing import Optional, Any, Dict, List, Union @@ -14,10 +11,10 @@ class SummariesClient(BaseClient): def get_summaries( self, - ticker_any_of: str, + ticker_any_of: list[str], params: Optional[Dict[str, Any]] = None, raw: bool = False, - ) -> Union[SMAIndicatorResults, HTTPResponse]: + ) -> Union[SummaryResult, HTTPResponse]: """ GetSummaries retrieves summaries for the ticker list with the given params. For more details see https://polygon.io/docs/stocks/get_v1_summaries. @@ -29,12 +26,11 @@ def get_summaries( """ url = f"/v1/summaries/" - - return self._get( + ticker_any_of = ','.join(ticker_any_of) + return self._paginate( path=url, - params=self._get_params(self.get_sma, locals()), - result_key="results", - deserializer=SMAIndicatorResults.from_dict, + params=self._get_params(self.get_summaries, locals()), + deserializer=SummaryResult.from_dict, raw=raw, ) From b2c9cb7d1f5478e11c95ac86d31fe4247b37d2dd Mon Sep 17 00:00:00 2001 From: chaig15 <7276836+chaig15@users.noreply.github.com> Date: Wed, 7 Dec 2022 03:31:06 -0800 Subject: [PATCH 04/15] lint --- polygon/rest/summaries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/polygon/rest/summaries.py b/polygon/rest/summaries.py index ecd7bed2..bc7167b8 100644 --- a/polygon/rest/summaries.py +++ b/polygon/rest/summaries.py @@ -11,7 +11,7 @@ class SummariesClient(BaseClient): def get_summaries( self, - ticker_any_of: list[str], + ticker_any_of: List[str], params: Optional[Dict[str, Any]] = None, raw: bool = False, ) -> Union[SummaryResult, HTTPResponse]: From 53fc80982900e407097de5e6bbf258403fd780d7 Mon Sep 17 00:00:00 2001 From: chaig15 <7276836+chaig15@users.noreply.github.com> Date: Wed, 7 Dec 2022 11:16:37 -0800 Subject: [PATCH 05/15] add test --- polygon/rest/models/__init__.py | 1 + polygon/rest/models/summaries.py | 12 +-- polygon/rest/summaries.py | 14 +-- .../v1/summaries/ticker.any_of=NCLH.json | 95 +++++++++++++++++++ test_rest/test_summaries.py | 42 ++++++++ 5 files changed, 148 insertions(+), 16 deletions(-) create mode 100644 test_rest/mocks/v1/summaries/ticker.any_of=NCLH.json create mode 100644 test_rest/test_summaries.py diff --git a/polygon/rest/models/__init__.py b/polygon/rest/models/__init__.py index c76311bb..2c9a8086 100644 --- a/polygon/rest/models/__init__.py +++ b/polygon/rest/models/__init__.py @@ -12,3 +12,4 @@ from .splits import * from .tickers import * from .trades import * +from .summaries import * diff --git a/polygon/rest/models/summaries.py b/polygon/rest/models/summaries.py index a72de367..cdc0054e 100644 --- a/polygon/rest/models/summaries.py +++ b/polygon/rest/models/summaries.py @@ -4,6 +4,7 @@ from .aggs import Agg from .tickers import Branding + @modelclass class Session: "Contains aggregate data for a given ticker symbol over a given date range in a custom time window size." @@ -37,6 +38,7 @@ def from_dict(d): d.get("volume", None), ) + @modelclass class Options: "Contains aggregate data for a given ticker symbol over a given date range in a custom time window size." @@ -58,6 +60,7 @@ def from_dict(d): d.get("underlying_ticker", None), ) + @modelclass class SummaryResult: "Contains aggregate data for a given ticker symbol over a given date range in a custom time window size." @@ -76,14 +79,9 @@ def from_dict(d): price=d.get("price", None), name=d.get("name", None), ticker=d.get("ticker", None), - branding=None - if "branding" not in d - else Branding.from_dict(d['branding']), + branding=None if "branding" not in d else Branding.from_dict(d["branding"]), market_status=d.get("market_status", None), type=d.get("type", None), session=d.get("session", None), - options=None - if "options" not in d - else Options.from_dict(d['options']), + options=None if "options" not in d else Options.from_dict(d["options"]), ) - \ No newline at end of file diff --git a/polygon/rest/summaries.py b/polygon/rest/summaries.py index bc7167b8..5e45e601 100644 --- a/polygon/rest/summaries.py +++ b/polygon/rest/summaries.py @@ -1,8 +1,6 @@ -from polygon.rest.models.summaries import ( - SummaryResult -) +from polygon.rest.models.summaries import SummaryResult from .base import BaseClient -from typing import Optional, Any, Dict, List, Union +from typing import Optional, Any, Dict, List, Union, Iterator from .models import Order from urllib3 import HTTPResponse from datetime import datetime, date @@ -11,10 +9,10 @@ class SummariesClient(BaseClient): def get_summaries( self, - ticker_any_of: List[str], + ticker_any_of: Optional[List[str]], params: Optional[Dict[str, Any]] = None, raw: bool = False, - ) -> Union[SummaryResult, HTTPResponse]: + ) -> Union[Iterator[SummaryResult], HTTPResponse]: """ GetSummaries retrieves summaries for the ticker list with the given params. For more details see https://polygon.io/docs/stocks/get_v1_summaries. @@ -26,12 +24,10 @@ def get_summaries( """ url = f"/v1/summaries/" - ticker_any_of = ','.join(ticker_any_of) + ticker_any_of = ",".join(ticker_any_of) return self._paginate( path=url, params=self._get_params(self.get_summaries, locals()), deserializer=SummaryResult.from_dict, raw=raw, ) - - diff --git a/test_rest/mocks/v1/summaries/ticker.any_of=NCLH.json b/test_rest/mocks/v1/summaries/ticker.any_of=NCLH.json new file mode 100644 index 00000000..eefcbb02 --- /dev/null +++ b/test_rest/mocks/v1/summaries/ticker.any_of=NCLH.json @@ -0,0 +1,95 @@ +{ + "request_id": "abc123", + "results": [{ + "branding": { + "icon_url": "https://api.polygon.io/icon.png", + "logo_url": "https://api.polygon.io/logo.svg" + }, + "market_status": "closed", + "name": "Norwegian Cruise Lines", + "price": 22.3, + "session": { + "change": -1.05, + "change_percent": -4.67, + "close": 21.4, + "early_trading_change": -0.39, + "early_trading_change_percent": -0.07, + "high": 22.49, + "late_trading_change": 1.2, + "late_trading_change_percent": 3.92, + "low": 21.35, + "open": 22.49, + "previous_close": 22.45, + "volume": 37 + }, + "ticker": "NCLH", + "type": "stock" + }, { + "market_status": "closed", + "name": "NCLH $5 Call", + "option": { + "contract_type": "call", + "exercise_style": "american", + "expiration_date": "2022-10-14", + "shares_per_contract": 100, + "strike_price": 5, + "underlying_ticker": "NCLH" + }, + "price": 6.6, + "session": { + "change": -0.05, + "change_percent": -1.07, + "close": 6.65, + "early_trading_change": -0.01, + "early_trading_change_percent": -0.03, + "high": 7.01, + "late_trading_change": -0.4, + "late_trading_change_percent": -0.02, + "low": 5.42, + "open": 6.7, + "previous_close": 6.71, + "volume": 67 + }, + "ticker": "O:NCLH221014C00005000", + "type": "option" + }, { + "market_status": "open", + "name": "Euro - United States Dollar", + "price": 0.97989, + "session": { + "change": -0.0001, + "change_percent": -0.67, + "close": 0.97989, + "high": 0.98999, + "low": 0.96689, + "open": 0.97889, + "previous_close": 0.98001 + }, + "ticker": "C:EURUSD", + "type": "forex" + }, { + "branding": { + "icon_url": "https://api.polygon.io/icon.png", + "logo_url": "https://api.polygon.io/logo.svg" + }, + "market_status": "open", + "name": "Bitcoin - United States Dollar", + "price": 32154.68, + "session": { + "change": -201.23, + "change_percent": -0.77, + "close": 32154.68, + "high": 33124.28, + "low": 28182.88, + "open": 31129.32, + "previous_close": 33362.18 + }, + "ticker": "X:BTCUSD", + "type": "crypto" + }, { + "error": "NOT_FOUND", + "message": "Ticker not found.", + "ticker": "APx" + }], + "status": "OK" +} \ No newline at end of file diff --git a/test_rest/test_summaries.py b/test_rest/test_summaries.py new file mode 100644 index 00000000..d1ddd22e --- /dev/null +++ b/test_rest/test_summaries.py @@ -0,0 +1,42 @@ +from polygon.rest.models import ( + SummaryResult, + Branding, + Session, + Options +) +from base import BaseTest + + +class TickersTest(BaseTest): + def test_list_tickers(self): + ticker_any_of = ['NCLH', 'O:NCLH221014C00005000', 'C:EURUSD', 'X:BTCUSD'] + summary_results = [t for t in self.c.get_summaries(ticker_any_of)] + expected = [ + SummaryResult( + price=22.3, + name="Norwegian Cruise Lines", + ticker="NCLH", + branding=Branding( + icon_url="https://api.polygon.io/icon.png", + logo_url="https://api.polygon.io/logo.svg", + ), + market_status="closed", + type=None, + session=Session( + change= -1.05, + change_percent= -4.67, + close=21.4, + early_trading_change=-0.39, + early_trading_change_percent=-0.07, + high=22.49, + late_trading_change=1.2, + late_trading_change_percent=3.92, + low=21.35, + open=22.49, + previous_close=22.45, + volume=37 + ), + options=None, + ) + ] + self.assertEqual(summary_results, expected) From 6fb9e130f57cb7e6366453f582dafbe0c733ce7a Mon Sep 17 00:00:00 2001 From: jbonzo <8647805+jbonzo@users.noreply.github.com> Date: Wed, 7 Dec 2022 14:19:25 -0500 Subject: [PATCH 06/15] Fix any_of being a list --- polygon/rest/base.py | 5 ++++- polygon/rest/summaries.py | 3 +-- test_rest/test_tickers.py | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/polygon/rest/base.py b/polygon/rest/base.py index 75b91716..dce4aed0 100644 --- a/polygon/rest/base.py +++ b/polygon/rest/base.py @@ -151,8 +151,11 @@ def _get_params( or argname.endswith("_lte") or argname.endswith("_gt") or argname.endswith("_gte") + or argname.endswith("_any_of") ): - argname = ".".join(argname.rsplit("_", 1)) + argname = ".".join(argname.split("_", 1)) + if argname.endswith("any_of"): + val = ",".join(val) params[argname] = val return params diff --git a/polygon/rest/summaries.py b/polygon/rest/summaries.py index 5e45e601..57bbfffd 100644 --- a/polygon/rest/summaries.py +++ b/polygon/rest/summaries.py @@ -9,7 +9,7 @@ class SummariesClient(BaseClient): def get_summaries( self, - ticker_any_of: Optional[List[str]], + ticker_any_of: Optional[List[str]] = None, params: Optional[Dict[str, Any]] = None, raw: bool = False, ) -> Union[Iterator[SummaryResult], HTTPResponse]: @@ -24,7 +24,6 @@ def get_summaries( """ url = f"/v1/summaries/" - ticker_any_of = ",".join(ticker_any_of) return self._paginate( path=url, params=self._get_params(self.get_summaries, locals()), diff --git a/test_rest/test_tickers.py b/test_rest/test_tickers.py index f45b487a..2fdd5241 100644 --- a/test_rest/test_tickers.py +++ b/test_rest/test_tickers.py @@ -14,6 +14,8 @@ class TickersTest(BaseTest): def test_list_tickers(self): + self.c.get_summaries(ticker_any_of=["a", "b", "c"]) + tickers = [t for t in self.c.list_tickers()] expected = [ Ticker( From 843979c5077dcb63f2af8f4a1ef2194304544e96 Mon Sep 17 00:00:00 2001 From: jbonzo <8647805+jbonzo@users.noreply.github.com> Date: Wed, 7 Dec 2022 14:43:59 -0500 Subject: [PATCH 07/15] Test fixes --- polygon/rest/models/summaries.py | 33 ++----- polygon/rest/summaries.py | 7 +- test_rest/mocks/v1/summaries.json | 31 ++++++ .../v1/summaries/ticker.any_of=NCLH.json | 95 ------------------- test_rest/test_summaries.py | 15 ++- 5 files changed, 48 insertions(+), 133 deletions(-) create mode 100644 test_rest/mocks/v1/summaries.json delete mode 100644 test_rest/mocks/v1/summaries/ticker.any_of=NCLH.json diff --git a/polygon/rest/models/summaries.py b/polygon/rest/models/summaries.py index cdc0054e..c00d99fe 100644 --- a/polygon/rest/models/summaries.py +++ b/polygon/rest/models/summaries.py @@ -1,7 +1,6 @@ from sqlite3 import Timestamp -from typing import Optional, Any, Dict, List, Union +from typing import Optional from ...modelclass import modelclass -from .aggs import Agg from .tickers import Branding @@ -23,20 +22,7 @@ class Session: @staticmethod def from_dict(d): - return Session( - d.get("change", None), - d.get("change_percent", None), - d.get("early_trading_change", None), - d.get("early_trading_change_percent", None), - d.get("late_trading_change", None), - d.get("late_trading_change_percent", None), - d.get("close", None), - d.get("high", None), - d.get("low", None), - d.get("open", None), - d.get("previous_close", None), - d.get("volume", None), - ) + return Session(**d) @modelclass @@ -51,14 +37,7 @@ class Options: @staticmethod def from_dict(d): - return Options( - d.get("contract_type", None), - d.get("excercise_style", None), - d.get("expiration_date", None), - d.get("shares_per_contract", None), - d.get("strike_price", None), - d.get("underlying_ticker", None), - ) + return Options(**d ) @modelclass @@ -70,8 +49,8 @@ class SummaryResult: branding: Optional[Branding] = None market_status: Optional[str] = None type: Optional[str] = None - session: Optional[str] = None - options: Optional[str] = None + session: Optional[Session] = None + options: Optional[Options] = None @staticmethod def from_dict(d): @@ -82,6 +61,6 @@ def from_dict(d): branding=None if "branding" not in d else Branding.from_dict(d["branding"]), market_status=d.get("market_status", None), type=d.get("type", None), - session=d.get("session", None), + session=None if "session" not in d else Session.from_dict(d["session"]), options=None if "options" not in d else Options.from_dict(d["options"]), ) diff --git a/polygon/rest/summaries.py b/polygon/rest/summaries.py index 57bbfffd..110f8fbe 100644 --- a/polygon/rest/summaries.py +++ b/polygon/rest/summaries.py @@ -12,7 +12,7 @@ def get_summaries( ticker_any_of: Optional[List[str]] = None, params: Optional[Dict[str, Any]] = None, raw: bool = False, - ) -> Union[Iterator[SummaryResult], HTTPResponse]: + ) -> Union[List[SummaryResult], HTTPResponse]: """ GetSummaries retrieves summaries for the ticker list with the given params. For more details see https://polygon.io/docs/stocks/get_v1_summaries. @@ -23,10 +23,11 @@ def get_summaries( :return: SummaryResults """ - url = f"/v1/summaries/" - return self._paginate( + url = f"/v1/summaries" + return self._get( path=url, params=self._get_params(self.get_summaries, locals()), + result_key="results", deserializer=SummaryResult.from_dict, raw=raw, ) diff --git a/test_rest/mocks/v1/summaries.json b/test_rest/mocks/v1/summaries.json new file mode 100644 index 00000000..c30a964c --- /dev/null +++ b/test_rest/mocks/v1/summaries.json @@ -0,0 +1,31 @@ +{ + "request_id": "abc123", + "results": [ + { + "branding": { + "icon_url": "https://api.polygon.io/icon.png", + "logo_url": "https://api.polygon.io/logo.svg" + }, + "market_status": "closed", + "name": "Norwegian Cruise Lines", + "price": 22.3, + "session": { + "change": -1.05, + "change_percent": -4.67, + "close": 21.4, + "early_trading_change": -0.39, + "early_trading_change_percent": -0.07, + "high": 22.49, + "late_trading_change": 1.2, + "late_trading_change_percent": 3.92, + "low": 21.35, + "open": 22.49, + "previous_close": 22.45, + "volume": 37 + }, + "ticker": "NCLH", + "type": "stocks" + } + ], + "status": "OK" +} \ No newline at end of file diff --git a/test_rest/mocks/v1/summaries/ticker.any_of=NCLH.json b/test_rest/mocks/v1/summaries/ticker.any_of=NCLH.json deleted file mode 100644 index eefcbb02..00000000 --- a/test_rest/mocks/v1/summaries/ticker.any_of=NCLH.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "request_id": "abc123", - "results": [{ - "branding": { - "icon_url": "https://api.polygon.io/icon.png", - "logo_url": "https://api.polygon.io/logo.svg" - }, - "market_status": "closed", - "name": "Norwegian Cruise Lines", - "price": 22.3, - "session": { - "change": -1.05, - "change_percent": -4.67, - "close": 21.4, - "early_trading_change": -0.39, - "early_trading_change_percent": -0.07, - "high": 22.49, - "late_trading_change": 1.2, - "late_trading_change_percent": 3.92, - "low": 21.35, - "open": 22.49, - "previous_close": 22.45, - "volume": 37 - }, - "ticker": "NCLH", - "type": "stock" - }, { - "market_status": "closed", - "name": "NCLH $5 Call", - "option": { - "contract_type": "call", - "exercise_style": "american", - "expiration_date": "2022-10-14", - "shares_per_contract": 100, - "strike_price": 5, - "underlying_ticker": "NCLH" - }, - "price": 6.6, - "session": { - "change": -0.05, - "change_percent": -1.07, - "close": 6.65, - "early_trading_change": -0.01, - "early_trading_change_percent": -0.03, - "high": 7.01, - "late_trading_change": -0.4, - "late_trading_change_percent": -0.02, - "low": 5.42, - "open": 6.7, - "previous_close": 6.71, - "volume": 67 - }, - "ticker": "O:NCLH221014C00005000", - "type": "option" - }, { - "market_status": "open", - "name": "Euro - United States Dollar", - "price": 0.97989, - "session": { - "change": -0.0001, - "change_percent": -0.67, - "close": 0.97989, - "high": 0.98999, - "low": 0.96689, - "open": 0.97889, - "previous_close": 0.98001 - }, - "ticker": "C:EURUSD", - "type": "forex" - }, { - "branding": { - "icon_url": "https://api.polygon.io/icon.png", - "logo_url": "https://api.polygon.io/logo.svg" - }, - "market_status": "open", - "name": "Bitcoin - United States Dollar", - "price": 32154.68, - "session": { - "change": -201.23, - "change_percent": -0.77, - "close": 32154.68, - "high": 33124.28, - "low": 28182.88, - "open": 31129.32, - "previous_close": 33362.18 - }, - "ticker": "X:BTCUSD", - "type": "crypto" - }, { - "error": "NOT_FOUND", - "message": "Ticker not found.", - "ticker": "APx" - }], - "status": "OK" -} \ No newline at end of file diff --git a/test_rest/test_summaries.py b/test_rest/test_summaries.py index d1ddd22e..5a525fd3 100644 --- a/test_rest/test_summaries.py +++ b/test_rest/test_summaries.py @@ -7,10 +7,10 @@ from base import BaseTest -class TickersTest(BaseTest): - def test_list_tickers(self): - ticker_any_of = ['NCLH', 'O:NCLH221014C00005000', 'C:EURUSD', 'X:BTCUSD'] - summary_results = [t for t in self.c.get_summaries(ticker_any_of)] +class SummariesTest(BaseTest): + def test_get_summaries(self): + ticker_any_of = ['NCLH'] + summary_results = self.c.get_summaries(ticker_any_of) expected = [ SummaryResult( price=22.3, @@ -21,10 +21,10 @@ def test_list_tickers(self): logo_url="https://api.polygon.io/logo.svg", ), market_status="closed", - type=None, + type="stocks", session=Session( - change= -1.05, - change_percent= -4.67, + change=-1.05, + change_percent=-4.67, close=21.4, early_trading_change=-0.39, early_trading_change_percent=-0.07, @@ -36,7 +36,6 @@ def test_list_tickers(self): previous_close=22.45, volume=37 ), - options=None, ) ] self.assertEqual(summary_results, expected) From eb007eca7418406c50a4a1ba40ae45bfb3e8cf4e Mon Sep 17 00:00:00 2001 From: jbonzo <8647805+jbonzo@users.noreply.github.com> Date: Wed, 7 Dec 2022 14:44:09 -0500 Subject: [PATCH 08/15] lint --- polygon/rest/models/summaries.py | 2 +- test_rest/test_summaries.py | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/polygon/rest/models/summaries.py b/polygon/rest/models/summaries.py index c00d99fe..b72987ff 100644 --- a/polygon/rest/models/summaries.py +++ b/polygon/rest/models/summaries.py @@ -37,7 +37,7 @@ class Options: @staticmethod def from_dict(d): - return Options(**d ) + return Options(**d) @modelclass diff --git a/test_rest/test_summaries.py b/test_rest/test_summaries.py index 5a525fd3..1db56a9a 100644 --- a/test_rest/test_summaries.py +++ b/test_rest/test_summaries.py @@ -1,15 +1,10 @@ -from polygon.rest.models import ( - SummaryResult, - Branding, - Session, - Options -) +from polygon.rest.models import SummaryResult, Branding, Session, Options from base import BaseTest class SummariesTest(BaseTest): def test_get_summaries(self): - ticker_any_of = ['NCLH'] + ticker_any_of = ["NCLH"] summary_results = self.c.get_summaries(ticker_any_of) expected = [ SummaryResult( @@ -34,7 +29,7 @@ def test_get_summaries(self): low=21.35, open=22.49, previous_close=22.45, - volume=37 + volume=37, ), ) ] From 13a353b78b94cd85bec036a6cdce0fdb8852badb Mon Sep 17 00:00:00 2001 From: chaig15 <7276836+chaig15@users.noreply.github.com> Date: Wed, 7 Dec 2022 11:48:07 -0800 Subject: [PATCH 09/15] fix list tickers --- test_rest/test_tickers.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/test_rest/test_tickers.py b/test_rest/test_tickers.py index 2fdd5241..b960c6bb 100644 --- a/test_rest/test_tickers.py +++ b/test_rest/test_tickers.py @@ -14,9 +14,6 @@ class TickersTest(BaseTest): def test_list_tickers(self): - self.c.get_summaries(ticker_any_of=["a", "b", "c"]) - - tickers = [t for t in self.c.list_tickers()] expected = [ Ticker( active=True, From 6f1860182b389b20571b136b8465e3272a0b255e Mon Sep 17 00:00:00 2001 From: chaig15 <7276836+chaig15@users.noreply.github.com> Date: Wed, 7 Dec 2022 11:48:38 -0800 Subject: [PATCH 10/15] fix list tickers --- test_rest/test_tickers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test_rest/test_tickers.py b/test_rest/test_tickers.py index b960c6bb..f45b487a 100644 --- a/test_rest/test_tickers.py +++ b/test_rest/test_tickers.py @@ -14,6 +14,7 @@ class TickersTest(BaseTest): def test_list_tickers(self): + tickers = [t for t in self.c.list_tickers()] expected = [ Ticker( active=True, From ff7320d40fd2ba7b16bc29e96a67ce9b82db3b6b Mon Sep 17 00:00:00 2001 From: chaig15 <7276836+chaig15@users.noreply.github.com> Date: Wed, 7 Dec 2022 16:18:37 -0800 Subject: [PATCH 11/15] add new tests --- polygon/rest/models/summaries.py | 12 +- ...05000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json | 95 ++++++++++++++++ ...json => summaries&ticker.any_of=NCLH.json} | 0 test_rest/test_summaries.py | 104 +++++++++++++++++- 4 files changed, 206 insertions(+), 5 deletions(-) create mode 100644 test_rest/mocks/v1/summaries&ticker.any_of=NCLH%2CO%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json rename test_rest/mocks/v1/{summaries.json => summaries&ticker.any_of=NCLH.json} (100%) diff --git a/polygon/rest/models/summaries.py b/polygon/rest/models/summaries.py index b72987ff..549c6fe0 100644 --- a/polygon/rest/models/summaries.py +++ b/polygon/rest/models/summaries.py @@ -6,7 +6,7 @@ @modelclass class Session: - "Contains aggregate data for a given ticker symbol over a given date range in a custom time window size." + "Contains Session data for the summaries endpoint." change: Optional[float] = None change_percent: Optional[float] = None early_trading_change: Optional[float] = None @@ -27,9 +27,9 @@ def from_dict(d): @modelclass class Options: - "Contains aggregate data for a given ticker symbol over a given date range in a custom time window size." + "Contains options data for the summaries endpoint" contract_type: Optional[str] = None - excercise_style: Optional[str] = None + exercise_style: Optional[str] = None expiration_date: Optional[str] = None shares_per_contract: Optional[float] = None strike_price: Optional[float] = None @@ -42,7 +42,7 @@ def from_dict(d): @modelclass class SummaryResult: - "Contains aggregate data for a given ticker symbol over a given date range in a custom time window size." + "Contains summary result data for a list of tickers" price: Optional[float] = None name: Optional[str] = None ticker: Optional[str] = None @@ -51,6 +51,8 @@ class SummaryResult: type: Optional[str] = None session: Optional[Session] = None options: Optional[Options] = None + error: Optional[str] = None + message: Optional[str] = None @staticmethod def from_dict(d): @@ -63,4 +65,6 @@ def from_dict(d): type=d.get("type", None), session=None if "session" not in d else Session.from_dict(d["session"]), options=None if "options" not in d else Options.from_dict(d["options"]), + error=d.get("error", None), + message=d.get("message", None), ) diff --git a/test_rest/mocks/v1/summaries&ticker.any_of=NCLH%2CO%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json b/test_rest/mocks/v1/summaries&ticker.any_of=NCLH%2CO%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json new file mode 100644 index 00000000..c345d843 --- /dev/null +++ b/test_rest/mocks/v1/summaries&ticker.any_of=NCLH%2CO%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json @@ -0,0 +1,95 @@ +{ + "request_id": "abc123", + "results": [{ + "branding": { + "icon_url": "https://api.polygon.io/icon.png", + "logo_url": "https://api.polygon.io/logo.svg" + }, + "market_status": "closed", + "name": "Norwegian Cruise Lines", + "price": 22.3, + "session": { + "change": -1.05, + "change_percent": -4.67, + "close": 21.4, + "early_trading_change": -0.39, + "early_trading_change_percent": -0.07, + "high": 22.49, + "late_trading_change": 1.2, + "late_trading_change_percent": 3.92, + "low": 21.35, + "open": 22.49, + "previous_close": 22.45, + "volume": 37 + }, + "ticker": "NCLH", + "type": "stocks" + }, { + "market_status": "closed", + "name": "NCLH $5 Call", + "options": { + "contract_type": "call", + "exercise_style": "american", + "expiration_date": "2022-10-14", + "shares_per_contract": 100, + "strike_price": 5, + "underlying_ticker": "NCLH" + }, + "price": 6.6, + "session": { + "change": -0.05, + "change_percent": -1.07, + "close": 6.65, + "early_trading_change": -0.01, + "early_trading_change_percent": -0.03, + "high": 7.01, + "late_trading_change": -0.4, + "late_trading_change_percent": -0.02, + "low": 5.42, + "open": 6.7, + "previous_close": 6.71, + "volume": 67 + }, + "ticker": "O:NCLH221014C00005000", + "type": "option" + }, { + "market_status": "open", + "name": "Euro - United States Dollar", + "price": 0.97989, + "session": { + "change": -0.0001, + "change_percent": -0.67, + "close": 0.97989, + "high": 0.98999, + "low": 0.96689, + "open": 0.97889, + "previous_close": 0.98001 + }, + "ticker": "C:EURUSD", + "type": "fx" + }, { + "branding": { + "icon_url": "https://api.polygon.io/icon.png", + "logo_url": "https://api.polygon.io/logo.svg" + }, + "market_status": "open", + "name": "Bitcoin - United States Dollar", + "price": 32154.68, + "session": { + "change": -201.23, + "change_percent": -0.77, + "close": 32154.68, + "high": 33124.28, + "low": 28182.88, + "open": 31129.32, + "previous_close": 33362.18 + }, + "ticker": "X:BTCUSD", + "type": "crypto" + }, { + "error": "NOT_FOUND", + "message": "Ticker not found.", + "ticker": "APx" + }], + "status": "OK" +} \ No newline at end of file diff --git a/test_rest/mocks/v1/summaries.json b/test_rest/mocks/v1/summaries&ticker.any_of=NCLH.json similarity index 100% rename from test_rest/mocks/v1/summaries.json rename to test_rest/mocks/v1/summaries&ticker.any_of=NCLH.json diff --git a/test_rest/test_summaries.py b/test_rest/test_summaries.py index 1db56a9a..77b25b5b 100644 --- a/test_rest/test_summaries.py +++ b/test_rest/test_summaries.py @@ -14,7 +14,39 @@ def test_get_summaries(self): branding=Branding( icon_url="https://api.polygon.io/icon.png", logo_url="https://api.polygon.io/logo.svg", - ), + ), + market_status="closed", + type="stocks", + session=Session( + change=-1.05, + change_percent=-4.67, + close=21.4, + early_trading_change=-0.39, + early_trading_change_percent=-0.07, + high=22.49, + late_trading_change=1.2, + late_trading_change_percent=3.92, + low=21.35, + open=22.49, + previous_close=22.45, + volume=37, + ), + ) + ] + self.assertEqual(summary_results, expected) + + def test_get_summaries_list(self): + ticker_any_of = ["NCLH", "O:NCLH221014C00005000", "C:EURUSD", "X:BTCUSD", "APx"] + summary_results = self.c.get_summaries(ticker_any_of) + expected = [ + SummaryResult( + price=22.3, + name="Norwegian Cruise Lines", + ticker="NCLH", + branding=Branding( + icon_url="https://api.polygon.io/icon.png", + logo_url="https://api.polygon.io/logo.svg", + ), market_status="closed", type="stocks", session=Session( @@ -30,7 +62,77 @@ def test_get_summaries(self): open=22.49, previous_close=22.45, volume=37, + ), + ), + SummaryResult( + price=6.6, + name="NCLH $5 Call", + ticker="O:NCLH221014C00005000", + market_status="closed", + type="option", + session=Session( + change=-0.05, + change_percent=-1.07, + close=6.65, + early_trading_change=-0.01, + early_trading_change_percent=-0.03, + high=7.01, + late_trading_change=-0.4, + late_trading_change_percent=-0.02, + low=5.42, + open=6.7, + previous_close=6.71, + volume=67, + ), + options=Options( + contract_type="call", + exercise_style="american", + expiration_date="2022-10-14", + shares_per_contract=100, + strike_price=5, + underlying_ticker="NCLH" + ) + ), + SummaryResult( + price=0.97989, + name="Euro - United States Dollar", + ticker="C:EURUSD", + market_status="open", + type="fx", + session=Session( + change=-0.0001, + change_percent=-0.67, + close=0.97989, + high=0.98999, + low=0.96689, + open=0.97889, + previous_close=0.98001, + ), + ), + SummaryResult( + price=32154.68, + name="Bitcoin - United States Dollar", + ticker="X:BTCUSD", + branding=Branding( + icon_url="https://api.polygon.io/icon.png", + logo_url="https://api.polygon.io/logo.svg", ), + market_status="open", + type="crypto", + session=Session( + change=-201.23, + change_percent=-0.77, + close=32154.68, + high=33124.28, + low=28182.88, + open=31129.32, + previous_close=33362.18, + ), + ), + SummaryResult( + ticker="APx", + error='NOT_FOUND', + message="Ticker not found.", ) ] self.assertEqual(summary_results, expected) From 6e55e84ef3a46dc44a577f8892e54d434bc270b7 Mon Sep 17 00:00:00 2001 From: chaig15 <7276836+chaig15@users.noreply.github.com> Date: Wed, 7 Dec 2022 17:31:39 -0800 Subject: [PATCH 12/15] lint --- test_rest/test_summaries.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/test_rest/test_summaries.py b/test_rest/test_summaries.py index 77b25b5b..96810b40 100644 --- a/test_rest/test_summaries.py +++ b/test_rest/test_summaries.py @@ -14,7 +14,7 @@ def test_get_summaries(self): branding=Branding( icon_url="https://api.polygon.io/icon.png", logo_url="https://api.polygon.io/logo.svg", - ), + ), market_status="closed", type="stocks", session=Session( @@ -30,7 +30,7 @@ def test_get_summaries(self): open=22.49, previous_close=22.45, volume=37, - ), + ), ) ] self.assertEqual(summary_results, expected) @@ -46,7 +46,7 @@ def test_get_summaries_list(self): branding=Branding( icon_url="https://api.polygon.io/icon.png", logo_url="https://api.polygon.io/logo.svg", - ), + ), market_status="closed", type="stocks", session=Session( @@ -62,12 +62,12 @@ def test_get_summaries_list(self): open=22.49, previous_close=22.45, volume=37, - ), + ), ), SummaryResult( price=6.6, name="NCLH $5 Call", - ticker="O:NCLH221014C00005000", + ticker="O:NCLH221014C00005000", market_status="closed", type="option", session=Session( @@ -83,15 +83,15 @@ def test_get_summaries_list(self): open=6.7, previous_close=6.71, volume=67, - ), + ), options=Options( contract_type="call", exercise_style="american", expiration_date="2022-10-14", shares_per_contract=100, strike_price=5, - underlying_ticker="NCLH" - ) + underlying_ticker="NCLH", + ), ), SummaryResult( price=0.97989, @@ -107,7 +107,7 @@ def test_get_summaries_list(self): low=0.96689, open=0.97889, previous_close=0.98001, - ), + ), ), SummaryResult( price=32154.68, @@ -127,12 +127,12 @@ def test_get_summaries_list(self): low=28182.88, open=31129.32, previous_close=33362.18, - ), + ), ), SummaryResult( ticker="APx", - error='NOT_FOUND', + error="NOT_FOUND", message="Ticker not found.", - ) + ), ] self.assertEqual(summary_results, expected) From a4500a57a00a4f378bcf6cc50f46953299420668 Mon Sep 17 00:00:00 2001 From: chaig15 <7276836+chaig15@users.noreply.github.com> Date: Wed, 7 Dec 2022 17:55:21 -0800 Subject: [PATCH 13/15] remove test and format json --- ...05000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json | 192 +++++++++--------- .../v1/summaries&ticker.any_of=NCLH.json | 31 --- test_rest/test_summaries.py | 31 --- 3 files changed, 99 insertions(+), 155 deletions(-) delete mode 100644 test_rest/mocks/v1/summaries&ticker.any_of=NCLH.json diff --git a/test_rest/mocks/v1/summaries&ticker.any_of=NCLH%2CO%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json b/test_rest/mocks/v1/summaries&ticker.any_of=NCLH%2CO%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json index c345d843..1c1b1ac7 100644 --- a/test_rest/mocks/v1/summaries&ticker.any_of=NCLH%2CO%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json +++ b/test_rest/mocks/v1/summaries&ticker.any_of=NCLH%2CO%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json @@ -1,95 +1,101 @@ { - "request_id": "abc123", - "results": [{ - "branding": { - "icon_url": "https://api.polygon.io/icon.png", - "logo_url": "https://api.polygon.io/logo.svg" - }, - "market_status": "closed", - "name": "Norwegian Cruise Lines", - "price": 22.3, - "session": { - "change": -1.05, - "change_percent": -4.67, - "close": 21.4, - "early_trading_change": -0.39, - "early_trading_change_percent": -0.07, - "high": 22.49, - "late_trading_change": 1.2, - "late_trading_change_percent": 3.92, - "low": 21.35, - "open": 22.49, - "previous_close": 22.45, - "volume": 37 - }, - "ticker": "NCLH", - "type": "stocks" - }, { - "market_status": "closed", - "name": "NCLH $5 Call", - "options": { - "contract_type": "call", - "exercise_style": "american", - "expiration_date": "2022-10-14", - "shares_per_contract": 100, - "strike_price": 5, - "underlying_ticker": "NCLH" - }, - "price": 6.6, - "session": { - "change": -0.05, - "change_percent": -1.07, - "close": 6.65, - "early_trading_change": -0.01, - "early_trading_change_percent": -0.03, - "high": 7.01, - "late_trading_change": -0.4, - "late_trading_change_percent": -0.02, - "low": 5.42, - "open": 6.7, - "previous_close": 6.71, - "volume": 67 - }, - "ticker": "O:NCLH221014C00005000", - "type": "option" - }, { - "market_status": "open", - "name": "Euro - United States Dollar", - "price": 0.97989, - "session": { - "change": -0.0001, - "change_percent": -0.67, - "close": 0.97989, - "high": 0.98999, - "low": 0.96689, - "open": 0.97889, - "previous_close": 0.98001 - }, - "ticker": "C:EURUSD", - "type": "fx" - }, { - "branding": { - "icon_url": "https://api.polygon.io/icon.png", - "logo_url": "https://api.polygon.io/logo.svg" - }, - "market_status": "open", - "name": "Bitcoin - United States Dollar", - "price": 32154.68, - "session": { - "change": -201.23, - "change_percent": -0.77, - "close": 32154.68, - "high": 33124.28, - "low": 28182.88, - "open": 31129.32, - "previous_close": 33362.18 - }, - "ticker": "X:BTCUSD", - "type": "crypto" - }, { - "error": "NOT_FOUND", - "message": "Ticker not found.", - "ticker": "APx" - }], - "status": "OK" + "request_id":"abc123", + "results":[ + { + "branding":{ + "icon_url":"https://api.polygon.io/icon.png", + "logo_url":"https://api.polygon.io/logo.svg" + }, + "market_status":"closed", + "name":"Norwegian Cruise Lines", + "price":22.3, + "session":{ + "change":-1.05, + "change_percent":-4.67, + "close":21.4, + "early_trading_change":-0.39, + "early_trading_change_percent":-0.07, + "high":22.49, + "late_trading_change":1.2, + "late_trading_change_percent":3.92, + "low":21.35, + "open":22.49, + "previous_close":22.45, + "volume":37 + }, + "ticker":"NCLH", + "type":"stocks" + }, + { + "market_status":"closed", + "name":"NCLH $5 Call", + "options":{ + "contract_type":"call", + "exercise_style":"american", + "expiration_date":"2022-10-14", + "shares_per_contract":100, + "strike_price":5, + "underlying_ticker":"NCLH" + }, + "price":6.6, + "session":{ + "change":-0.05, + "change_percent":-1.07, + "close":6.65, + "early_trading_change":-0.01, + "early_trading_change_percent":-0.03, + "high":7.01, + "late_trading_change":-0.4, + "late_trading_change_percent":-0.02, + "low":5.42, + "open":6.7, + "previous_close":6.71, + "volume":67 + }, + "ticker":"O:NCLH221014C00005000", + "type":"option" + }, + { + "market_status":"open", + "name":"Euro - United States Dollar", + "price":0.97989, + "session":{ + "change":-0.0001, + "change_percent":-0.67, + "close":0.97989, + "high":0.98999, + "low":0.96689, + "open":0.97889, + "previous_close":0.98001 + }, + "ticker":"C:EURUSD", + "type":"fx" + }, + { + "branding":{ + "icon_url":"https://api.polygon.io/icon.png", + "logo_url":"https://api.polygon.io/logo.svg" + }, + "market_status":"open", + "name":"Bitcoin - United States Dollar", + "price":32154.68, + "session":{ + "change":-201.23, + "change_percent":-0.77, + "close":32154.68, + "high":33124.28, + "low":28182.88, + "open":31129.32, + "previous_close":33362.18 + }, + "ticker":"X:BTCUSD", + "type":"crypto" + }, + { + "error":"NOT_FOUND", + "message":"Ticker not found.", + "ticker":"APx" + } + ], + "status":"OK" } \ No newline at end of file diff --git a/test_rest/mocks/v1/summaries&ticker.any_of=NCLH.json b/test_rest/mocks/v1/summaries&ticker.any_of=NCLH.json deleted file mode 100644 index c30a964c..00000000 --- a/test_rest/mocks/v1/summaries&ticker.any_of=NCLH.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "request_id": "abc123", - "results": [ - { - "branding": { - "icon_url": "https://api.polygon.io/icon.png", - "logo_url": "https://api.polygon.io/logo.svg" - }, - "market_status": "closed", - "name": "Norwegian Cruise Lines", - "price": 22.3, - "session": { - "change": -1.05, - "change_percent": -4.67, - "close": 21.4, - "early_trading_change": -0.39, - "early_trading_change_percent": -0.07, - "high": 22.49, - "late_trading_change": 1.2, - "late_trading_change_percent": 3.92, - "low": 21.35, - "open": 22.49, - "previous_close": 22.45, - "volume": 37 - }, - "ticker": "NCLH", - "type": "stocks" - } - ], - "status": "OK" -} \ No newline at end of file diff --git a/test_rest/test_summaries.py b/test_rest/test_summaries.py index 96810b40..1fdbb6e5 100644 --- a/test_rest/test_summaries.py +++ b/test_rest/test_summaries.py @@ -3,37 +3,6 @@ class SummariesTest(BaseTest): - def test_get_summaries(self): - ticker_any_of = ["NCLH"] - summary_results = self.c.get_summaries(ticker_any_of) - expected = [ - SummaryResult( - price=22.3, - name="Norwegian Cruise Lines", - ticker="NCLH", - branding=Branding( - icon_url="https://api.polygon.io/icon.png", - logo_url="https://api.polygon.io/logo.svg", - ), - market_status="closed", - type="stocks", - session=Session( - change=-1.05, - change_percent=-4.67, - close=21.4, - early_trading_change=-0.39, - early_trading_change_percent=-0.07, - high=22.49, - late_trading_change=1.2, - late_trading_change_percent=3.92, - low=21.35, - open=22.49, - previous_close=22.45, - volume=37, - ), - ) - ] - self.assertEqual(summary_results, expected) def test_get_summaries_list(self): ticker_any_of = ["NCLH", "O:NCLH221014C00005000", "C:EURUSD", "X:BTCUSD", "APx"] From dd4d9e165ce24af9b68e24b4ba3a64149db28c17 Mon Sep 17 00:00:00 2001 From: chaig15 <7276836+chaig15@users.noreply.github.com> Date: Wed, 7 Dec 2022 18:00:51 -0800 Subject: [PATCH 14/15] lint --- test_rest/test_summaries.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test_rest/test_summaries.py b/test_rest/test_summaries.py index 1fdbb6e5..6acdab64 100644 --- a/test_rest/test_summaries.py +++ b/test_rest/test_summaries.py @@ -3,7 +3,6 @@ class SummariesTest(BaseTest): - def test_get_summaries_list(self): ticker_any_of = ["NCLH", "O:NCLH221014C00005000", "C:EURUSD", "X:BTCUSD", "APx"] summary_results = self.c.get_summaries(ticker_any_of) From 90f2fb57972823d6742b78ecafea07dda168edb3 Mon Sep 17 00:00:00 2001 From: chaig15 <7276836+chaig15@users.noreply.github.com> Date: Thu, 8 Dec 2022 14:11:59 -0800 Subject: [PATCH 15/15] fix test expected response for summaries --- ...O%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json | 2 +- test_rest/test_summaries.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test_rest/mocks/v1/summaries&ticker.any_of=NCLH%2CO%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json b/test_rest/mocks/v1/summaries&ticker.any_of=NCLH%2CO%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json index 1c1b1ac7..3d4e504c 100644 --- a/test_rest/mocks/v1/summaries&ticker.any_of=NCLH%2CO%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json +++ b/test_rest/mocks/v1/summaries&ticker.any_of=NCLH%2CO%3ANCLH221014C00005000%2CC%3AEURUSD%2CX%3ABTCUSD%2CAPx.json @@ -53,7 +53,7 @@ "volume":67 }, "ticker":"O:NCLH221014C00005000", - "type":"option" + "type":"options" }, { "market_status":"open", diff --git a/test_rest/test_summaries.py b/test_rest/test_summaries.py index 6acdab64..97737eee 100644 --- a/test_rest/test_summaries.py +++ b/test_rest/test_summaries.py @@ -37,7 +37,7 @@ def test_get_summaries_list(self): name="NCLH $5 Call", ticker="O:NCLH221014C00005000", market_status="closed", - type="option", + type="options", session=Session( change=-0.05, change_percent=-1.07,