Skip to content

Commit 48b421e

Browse files
Darcy-Lindeclickingbuttons
authored andcommitted
Snapshot tests (#143)
1 parent 7ca8187 commit 48b421e

File tree

5 files changed

+367
-67
lines changed

5 files changed

+367
-67
lines changed

polygon/rest/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from .aggs import AggsClient
22
from .trades import TradesClient
33
from .quotes import QuotesClient
4+
from .snapshot import SnapshotClient
45
from .reference import (
56
MarketsClient,
67
TickersClient,
@@ -15,6 +16,7 @@ class RESTClient(
1516
AggsClient,
1617
TradesClient,
1718
QuotesClient,
19+
SnapshotClient,
1820
MarketsClient,
1921
TickersClient,
2022
SplitsClient,

polygon/rest/models/snapshot.py

Lines changed: 65 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
@dataclass
99
class SnapshotMin:
1010
"Most recent minute bar"
11-
accumulated_volume: Optional[float]
12-
open: Optional[float]
13-
high: Optional[float]
14-
low: Optional[float]
15-
close: Optional[float]
16-
volume: Optional[float]
17-
vwap: Optional[float]
11+
accumulated_volume: Optional[float] = None
12+
open: Optional[float] = None
13+
high: Optional[float] = None
14+
low: Optional[float] = None
15+
close: Optional[float] = None
16+
volume: Optional[float] = None
17+
vwap: Optional[float] = None
1818

1919
@staticmethod
2020
def from_dict(d):
@@ -31,15 +31,15 @@ def from_dict(d):
3131

3232
@dataclass
3333
class Snapshot:
34-
day: Optional[Agg]
35-
last_quote: Optional[LastQuote]
36-
last_trade: Optional[LastTrade]
37-
min: Optional[SnapshotMin]
38-
prev_day: Optional[Agg]
39-
ticker: str
40-
todays_change: float
41-
todays_change_percent: float
42-
updated: int
34+
day: Optional[Agg] = None
35+
last_quote: Optional[LastQuote] = None
36+
last_trade: Optional[LastTrade] = None
37+
min: Optional[SnapshotMin] = None
38+
prev_day: Optional[Agg] = None
39+
ticker: Optional[str] = None
40+
todays_change: Optional[float] = None
41+
todays_change_percent: Optional[float] = None
42+
updated: Optional[int] = None
4343

4444
@staticmethod
4545
def from_dict(d):
@@ -58,16 +58,16 @@ def from_dict(d):
5858

5959
@dataclass
6060
class DayOptionContractSnapshot:
61-
change: Optional[float]
62-
change_percent: Optional[float]
63-
close: Optional[float]
64-
high: Optional[float]
65-
last_updated: Optional[int]
66-
low: Optional[float]
67-
open: Optional[float]
68-
previous_close: Optional[float]
69-
volume: Optional[float]
70-
vwap: Optional[float]
61+
change: Optional[float] = None
62+
change_percent: Optional[float] = None
63+
close: Optional[float] = None
64+
high: Optional[float] = None
65+
last_updated: Optional[int] = None
66+
low: Optional[float] = None
67+
open: Optional[float] = None
68+
previous_close: Optional[float] = None
69+
volume: Optional[float] = None
70+
vwap: Optional[float] = None
7171

7272
@staticmethod
7373
def from_dict(d):
@@ -76,12 +76,12 @@ def from_dict(d):
7676

7777
@dataclass
7878
class OptionDetails:
79-
contract_type: str
80-
exercise_style: str
81-
expiration_date: str
82-
shares_per_contract: float
83-
strike_price: float
84-
ticker: str
79+
contract_type: Optional[str] = None
80+
exercise_style: Optional[str] = None
81+
expiration_date: Optional[str] = None
82+
shares_per_contract: Optional[float] = None
83+
strike_price: Optional[float] = None
84+
ticker: Optional[str] = None
8585

8686
@staticmethod
8787
def from_dict(d):
@@ -90,13 +90,13 @@ def from_dict(d):
9090

9191
@dataclass
9292
class OptionLastQuote:
93-
ask: Optional[float]
94-
ask_size: Optional[float]
95-
bid: Optional[float]
96-
bid_size: Optional[float]
97-
last_updated: Optional[int]
98-
midpoint: Optional[float]
99-
timeframe: Optional[str]
93+
ask: Optional[float] = None
94+
ask_size: Optional[float] = None
95+
bid: Optional[float] = None
96+
bid_size: Optional[float] = None
97+
last_updated: Optional[int] = None
98+
midpoint: Optional[float] = None
99+
timeframe: Optional[str] = None
100100

101101
@staticmethod
102102
def from_dict(d):
@@ -105,10 +105,10 @@ def from_dict(d):
105105

106106
@dataclass
107107
class OptionGreeks:
108-
delta: Optional[float]
109-
gamma: Optional[float]
110-
theta: Optional[float]
111-
vega: Optional[float]
108+
delta: Optional[float] = None
109+
gamma: Optional[float] = None
110+
theta: Optional[float] = None
111+
vega: Optional[float] = None
112112

113113
@staticmethod
114114
def from_dict(d):
@@ -117,11 +117,11 @@ def from_dict(d):
117117

118118
@dataclass
119119
class UnderlyingAsset:
120-
change_to_break_even: Optional[float]
121-
last_updated: Optional[int]
122-
price: Optional[float]
123-
ticker: Optional[str]
124-
timeframe: Optional[str]
120+
change_to_break_even: Optional[float] = None
121+
last_updated: Optional[int] = None
122+
price: Optional[float] = None
123+
ticker: Optional[str] = None
124+
timeframe: Optional[str] = None
125125

126126
@staticmethod
127127
def from_dict(d):
@@ -130,14 +130,14 @@ def from_dict(d):
130130

131131
@dataclass
132132
class OptionContractSnapshot:
133-
break_even_price: Optional[float]
134-
day: Optional[Agg]
135-
details: Optional[OptionDetails]
136-
greeks: Optional[OptionGreeks]
137-
implied_volatility: Optional[float]
138-
last_quote: Optional[OptionLastQuote]
139-
open_interest: Optional[float]
140-
underlying_asset: Optional[float]
133+
break_even_price: Optional[float] = None
134+
day: Optional[Agg] = None
135+
details: Optional[OptionDetails] = None
136+
greeks: Optional[OptionGreeks] = None
137+
implied_volatility: Optional[float] = None
138+
last_quote: Optional[OptionLastQuote] = None
139+
open_interest: Optional[float] = None
140+
underlying_asset: Optional[float] = None
141141

142142
@staticmethod
143143
def from_dict(d):
@@ -146,8 +146,8 @@ def from_dict(d):
146146

147147
@dataclass
148148
class OrderBookQuote:
149-
price: Optional[float]
150-
exchange_shares: Dict[str, float]
149+
price: Optional[float] = None
150+
exchange_shares: Optional[Dict[str, float]] = None
151151

152152
@staticmethod
153153
def from_dict(d):
@@ -156,13 +156,13 @@ def from_dict(d):
156156

157157
@dataclass
158158
class SnapshotTickerFullBook:
159-
ticker: Optional[str]
160-
bids: Optional[List[OrderBookQuote]]
161-
asks: Optional[List[OrderBookQuote]]
162-
bid_count: Optional[float]
163-
ask_count: Optional[float]
164-
spread: Optional[float]
165-
updated: int
159+
ticker: Optional[str] = None
160+
bids: Optional[List[OrderBookQuote]] = None
161+
asks: Optional[List[OrderBookQuote]] = None
162+
bid_count: Optional[float] = None
163+
ask_count: Optional[float] = None
164+
spread: Optional[float] = None
165+
updated: Optional[int] = None
166166

167167
@staticmethod
168168
def from_dict(d):

polygon/rest/snapshot.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def get_snapshot_all(
3535
params=self._get_params(self.get_snapshot_all, locals()),
3636
deserializer=Snapshot.from_dict,
3737
raw=raw,
38+
result_key="tickers",
3839
)
3940

4041
def get_snapshot_direction(
@@ -103,7 +104,7 @@ def get_snapshot_option(
103104
:param option_contract: The option contract identifier.
104105
:return: List of Snapshots
105106
"""
106-
url = f"/v2/snapshot/options/{underlying_asset}/{option_contract}"
107+
url = f"/v3/snapshot/options/{underlying_asset}/{option_contract}"
107108
return self._get(
108109
path=url,
109110
params=self._get_params(self.get_snapshot_option, locals()),
@@ -126,7 +127,7 @@ def get_snapshot_crypto_book(
126127
:param ticker: The ticker symbol.
127128
:return: List of Snapshots
128129
"""
129-
url = f" /v2/snapshot/locale/global/markets/crypto/tickers/{ticker}/book"
130+
url = f"/v2/snapshot/locale/global/markets/crypto/tickers/{ticker}/book"
130131
return self._get(
131132
path=url,
132133
params=self._get_params(self.get_snapshot_crypto_book, locals()),

tests/mocks.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,26 @@
7575
"/v3/reference/exchanges",
7676
'{"results":[{"id":1,"type":"exchange","asset_class":"stocks","locale":"us","name":"NYSE American, LLC","acronym":"AMEX","mic":"XASE","operating_mic":"XNYS","participant_id":"A","url":"https://www.nyse.com/markets/nyse-american"},{"id":2,"type":"exchange","asset_class":"stocks","locale":"us","name":"Nasdaq OMX BX, Inc.","mic":"XBOS","operating_mic":"XNAS","participant_id":"B","url":"https://www.nasdaq.com/solutions/nasdaq-bx-stock-market"},{"id":3,"type":"exchange","asset_class":"stocks","locale":"us","name":"NYSE National, Inc.","acronym":"NSX","mic":"XCIS","operating_mic":"XNYS","participant_id":"C","url":"https://www.nyse.com/markets/nyse-national"},{"id":4,"type":"TRF","asset_class":"stocks","locale":"us","name":"FINRA NYSE TRF","mic":"FINY","operating_mic":"XNYS","participant_id":"D","url":"https://www.finra.org"},{"id":4,"type":"TRF","asset_class":"stocks","locale":"us","name":"FINRA Nasdaq TRF Carteret","mic":"FINN","operating_mic":"FINR","participant_id":"D","url":"https://www.finra.org"},{"id":4,"type":"TRF","asset_class":"stocks","locale":"us","name":"FINRA Nasdaq TRF Chicago","mic":"FINC","operating_mic":"FINR","participant_id":"D","url":"https://www.finra.org"},{"id":4,"type":"TRF","asset_class":"stocks","locale":"us","name":"FINRA Alternative Display Facility","mic":"XADF","operating_mic":"FINR","participant_id":"D","url":"https://www.finra.org"},{"id":5,"type":"SIP","asset_class":"stocks","locale":"us","name":"Unlisted Trading Privileges","operating_mic":"XNAS","participant_id":"E","url":"https://www.utpplan.com"},{"id":6,"type":"TRF","asset_class":"stocks","locale":"us","name":"International Securities Exchange, LLC - Stocks","mic":"XISE","operating_mic":"XNAS","participant_id":"I","url":"https://nasdaq.com/solutions/nasdaq-ise"},{"id":7,"type":"exchange","asset_class":"stocks","locale":"us","name":"Cboe EDGA","mic":"EDGA","operating_mic":"XCBO","participant_id":"J","url":"https://www.cboe.com/us/equities"},{"id":8,"type":"exchange","asset_class":"stocks","locale":"us","name":"Cboe EDGX","mic":"EDGX","operating_mic":"XCBO","participant_id":"K","url":"https://www.cboe.com/us/equities"},{"id":9,"type":"exchange","asset_class":"stocks","locale":"us","name":"NYSE Chicago, Inc.","mic":"XCHI","operating_mic":"XNYS","participant_id":"M","url":"https://www.nyse.com/markets/nyse-chicago"},{"id":10,"type":"exchange","asset_class":"stocks","locale":"us","name":"New York Stock Exchange","mic":"XNYS","operating_mic":"XNYS","participant_id":"N","url":"https://www.nyse.com"},{"id":11,"type":"exchange","asset_class":"stocks","locale":"us","name":"NYSE Arca, Inc.","mic":"ARCX","operating_mic":"XNYS","participant_id":"P","url":"https://www.nyse.com/markets/nyse-arca"},{"id":12,"type":"exchange","asset_class":"stocks","locale":"us","name":"Nasdaq","mic":"XNAS","operating_mic":"XNAS","participant_id":"T","url":"https://www.nasdaq.com"},{"id":13,"type":"SIP","asset_class":"stocks","locale":"us","name":"Consolidated Tape Association","operating_mic":"XNYS","participant_id":"S","url":"https://www.nyse.com/data/cta"},{"id":14,"type":"exchange","asset_class":"stocks","locale":"us","name":"Long-Term Stock Exchange","mic":"LTSE","operating_mic":"LTSE","participant_id":"L","url":"https://www.ltse.com"},{"id":15,"type":"exchange","asset_class":"stocks","locale":"us","name":"Investors Exchange","mic":"IEXG","operating_mic":"IEXG","participant_id":"V","url":"https://www.iextrading.com"},{"id":16,"type":"TRF","asset_class":"stocks","locale":"us","name":"Cboe Stock Exchange","mic":"CBSX","operating_mic":"XCBO","participant_id":"W","url":"https://www.cboe.com"},{"id":17,"type":"exchange","asset_class":"stocks","locale":"us","name":"Nasdaq Philadelphia Exchange LLC","mic":"XPHL","operating_mic":"XNAS","participant_id":"X","url":"https://www.nasdaq.com/solutions/nasdaq-phlx"},{"id":18,"type":"exchange","asset_class":"stocks","locale":"us","name":"Cboe BYX","mic":"BATY","operating_mic":"XCBO","participant_id":"Y","url":"https://www.cboe.com/us/equities"},{"id":19,"type":"exchange","asset_class":"stocks","locale":"us","name":"Cboe BZX","mic":"BATS","operating_mic":"XCBO","participant_id":"Z","url":"https://www.cboe.com/us/equities"},{"id":20,"type":"exchange","asset_class":"stocks","locale":"us","name":"MIAX Pearl","mic":"EPRL","operating_mic":"MIHI","participant_id":"H","url":"https://www.miaxoptions.com/alerts/pearl-equities"},{"id":21,"type":"exchange","asset_class":"stocks","locale":"us","name":"Members Exchange","mic":"MEMX","operating_mic":"MEMX","participant_id":"U","url":"https://www.memx.com"}],"status":"OK","request_id":"c0109b8a70a931efe47cef085c7a7f5e","count":24}',
7777
),
78+
(
79+
"/v2/snapshot/locale/us/markets/stocks/tickers?market.type=stocks",
80+
'{"count": 1,"status": "OK","tickers": [{"day": {"c": 20.506,"h": 20.64,"l": 20.506,"o": 20.64,"v": 37216,"vw": 20.616},"lastQuote": {"P": 20.6,"S": 22,"p": 20.5,"s": 13,"t": 1605192959994246100},"lastTrade": {"c": [14,41],"i": "71675577320245","p": 20.506,"s": 2416,"t": 1605192894630916600,"x": 4},"min": {"av": 37216,"c": 20.506,"h": 20.506,"l": 20.506,"o": 20.506,"v": 5000,"vw": 20.5105},"prevDay": {"c": 20.63,"h": 21,"l": 20.5,"o": 20.79,"v": 292738,"vw": 20.6939},"ticker": "BCAT","todaysChange": -0.124,"todaysChangePerc": -0.601,"updated": 1605192894630916600}]}',
81+
),
82+
(
83+
"/v2/snapshot/locale/us/markets/stocks/gainers?market.type=stocks",
84+
'{"status":"OK","tickers":[{"day":{"c":6.42,"h":6.99,"l":6.4,"o":6.81,"v":115782,"vw":6.656},"lastQuote":{"P":6.43,"S":1,"p":6.4,"s":1,"t":1651251738312628478},"lastTrade":{"c":[14,41],"i":"100","p":6.42,"s":200,"t":1651251334045891221,"x":8},"min":{"av":115689,"c":6.42,"h":6.542,"l":6.42,"o":6.49,"v":2671,"vw":6.4604},"prevDay":{"c":0.29,"h":0.348,"l":0.29,"o":0.3443,"v":1488660,"vw":0.317},"ticker":"NVCN","todaysChange":6.13,"todaysChangePerc":2113.793,"updated":1651251360000000000},{"day":{"c":4.2107,"h":4.95,"l":4.21,"o":4.31,"v":453199,"vw":4.4181},"lastQuote":{"P":4.22,"S":9,"p":4.21,"s":11,"t":1651251781709136903},"lastTrade":{"c":null,"i":"1084","p":4.2116,"s":241,"t":1651251789345841015,"x":4},"min":{"av":453189,"c":4.2107,"h":4.2107,"l":4.2107,"o":4.2107,"v":1012,"vw":4.2107},"prevDay":{"c":0.1953,"h":0.2966,"l":0.195,"o":0.29,"v":8784033,"vw":0.2278},"ticker":"BIOL","todaysChange":4.016,"todaysChangePerc":2056.477,"updated":1651251789345841015}]}',
85+
),
86+
(
87+
"/v2/snapshot/locale/us/markets/stocks/tickers/AAPL?market.type=stocks",
88+
'{"request_id":"957db942cab2d6b0633b9b4820db0cb2","status":"OK","ticker":{"day":{"c":160.315,"h":166.2,"l":159.8,"o":161.84,"v":68840127,"vw":162.7124},"lastQuote":{"P":159.99,"S":5,"p":159.98,"s":3,"t":1651251948407646487},"lastTrade":{"c":null,"i":"121351","p":159.99,"s":200,"t":1651251948294080343,"x":12},"min":{"av":68834255,"c":160.3,"h":160.71,"l":160.3,"o":160.71,"v":197226,"vw":160.5259},"prevDay":{"c":163.64,"h":164.515,"l":158.93,"o":159.25,"v":130149192,"vw":161.8622},"ticker":"AAPL","todaysChange":-3.65,"todaysChangePerc":-2.231,"updated":1651251948294080343}}',
89+
),
90+
(
91+
"/v2/snapshot/locale/global/markets/crypto/tickers/X:BTCUSD/book",
92+
'{"data": {"askCount": 593.1412981600005,"asks": [{"p": 11454,"x": {"2": 1}},{"p": 11455,"x": {"2": 1}}],"bidCount": 694.951789670001,"bids": [{"p": 16303.17,"x": {"1": 2}},{"p": 16302.94,"x": {"1": 0.02859424,"6": 0.023455}}],"spread": -4849.17,"ticker": "X:BTCUSD","updated": 1605295074162},"status": "OK"}',
93+
),
94+
(
95+
"/v3/snapshot/options/AAPL/O:AAPL230616C00150000",
96+
'{"request_id":"104d9b901d0c9e81d284cb8b41c5cdd3","results":{"break_even_price":179.075,"day":{"change":-2.3999999999999986,"change_percent":-7.643312101910824,"close":29,"high":32.25,"last_updated":1651204800000000000,"low":29,"open":29.99,"previous_close":31.4,"volume":8,"vwap":30.7738},"details":{"contract_type":"call","exercise_style":"american","expiration_date":"2023-06-16","shares_per_contract":100,"strike_price":150,"ticker":"O:AAPL230616C00150000"},"greeks":{"delta":0.6436614934293701,"gamma":0.0061735291012820675,"theta":-0.028227189324641973,"vega":0.6381159723175714},"implied_volatility":0.3570277203465058,"last_quote":{"ask":29.25,"ask_size":209,"bid":28.9,"bid_size":294,"last_updated":1651254260800059648,"midpoint":29.075,"timeframe":"REAL-TIME"},"open_interest":8133,"underlying_asset":{"change_to_break_even":19.11439999999999,"last_updated":1651254263172073152,"price":159.9606,"ticker":"AAPL","timeframe":"REAL-TIME"}},"status":"OK"}',
97+
),
7898
]
7999

80100

0 commit comments

Comments
 (0)