Skip to content

Commit 407555d

Browse files
authored
Custom class decorator to handle excess parameters (#177)
1 parent 8e4dd29 commit 407555d

File tree

14 files changed

+154
-80
lines changed

14 files changed

+154
-80
lines changed

polygon/modelclass.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import inspect
2+
from dataclasses import dataclass
3+
4+
5+
def modelclass(cls):
6+
cls = dataclass(cls)
7+
attributes = [
8+
a
9+
for a in cls.__dict__["__annotations__"].keys()
10+
if not a.startswith("__") and not inspect.isroutine(a)
11+
]
12+
13+
def init(self, *args, **kwargs):
14+
for (i, a) in enumerate(args):
15+
if i < len(attributes):
16+
self.__dict__[attributes[i]] = a
17+
for (k, v) in kwargs.items():
18+
if k in attributes:
19+
self.__dict__[k] = v
20+
21+
cls.__init__ = init
22+
23+
return cls

polygon/rest/models/aggs.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from dataclasses import dataclass
21
from typing import Optional
2+
from ...modelclass import modelclass
33

44

5-
@dataclass
5+
@modelclass
66
class Agg:
77
"Contains aggregate data for a given ticker symbol over a given date range in a custom time window size."
88
open: Optional[float] = None
@@ -28,7 +28,7 @@ def from_dict(d):
2828
)
2929

3030

31-
@dataclass
31+
@modelclass
3232
class GroupedDailyAgg:
3333
"Contains daily open, high, low, and close (OHLC) data for a given date."
3434
ticker: Optional[str] = None
@@ -56,7 +56,7 @@ def from_dict(d):
5656
)
5757

5858

59-
@dataclass
59+
@modelclass
6060
class DailyOpenCloseAgg:
6161
"Contains data for open, close and afterhours prices of a ticker symbol on a specified date."
6262
after_hours: Optional[float] = None
@@ -86,7 +86,7 @@ def from_dict(d):
8686
)
8787

8888

89-
@dataclass
89+
@modelclass
9090
class PreviousCloseAgg:
9191
"Contains data for the previous day's open, high, low, and close (OHLC) of the specified stock ticker."
9292
ticker: Optional[str] = None

polygon/rest/models/conditions.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from typing import Optional, List
2-
from dataclasses import dataclass
2+
from ...modelclass import modelclass
33

44

5-
@dataclass
5+
@modelclass
66
class SipMapping:
77
"Contains data for a mapping to a symbol for each SIP that has a given condition."
88
CTA: Optional[str] = None
@@ -14,7 +14,7 @@ def from_dict(d):
1414
return SipMapping(**d)
1515

1616

17-
@dataclass
17+
@modelclass
1818
class Consolidated:
1919
"Contains data for aggregation rules on a consolidated (all exchanges) basis."
2020
updates_high_low: Optional[bool] = None
@@ -26,7 +26,7 @@ def from_dict(d):
2626
return Consolidated(**d)
2727

2828

29-
@dataclass
29+
@modelclass
3030
class MarketCenter:
3131
"Contains data for aggregation rules on a per-market-center basis."
3232
updates_high_low: Optional[bool] = None
@@ -38,7 +38,7 @@ def from_dict(d):
3838
return MarketCenter(**d)
3939

4040

41-
@dataclass
41+
@modelclass
4242
class UpdateRules:
4343
"Contains data for a list of aggregation rules."
4444
consolidated: Optional[Consolidated] = None
@@ -56,7 +56,7 @@ def from_dict(d):
5656
)
5757

5858

59-
@dataclass
59+
@modelclass
6060
class Condition:
6161
"Condition contains data for a condition that Polygon.io uses."
6262
abbreviation: Optional[str] = None

polygon/rest/models/dividends.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from typing import Optional
2-
from dataclasses import dataclass
2+
from ...modelclass import modelclass
33

44

5-
@dataclass
5+
@modelclass
66
class Dividend:
77
"Dividend contains data for a historical cash dividend, including the ticker symbol, declaration date, ex-dividend date, record date, pay date, frequency, and amount."
88
cash_amount: Optional[float] = None

polygon/rest/models/exchanges.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from typing import Optional
2-
from dataclasses import dataclass
2+
from ...modelclass import modelclass
33

44

5-
@dataclass
5+
@modelclass
66
class Exchange:
77
"Exchange contains data for a condition that Polygon.io uses."
88
acronym: Optional[str] = None

polygon/rest/models/financials.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from typing import Optional, Dict
2-
from dataclasses import dataclass
2+
from ...modelclass import modelclass
33

44

5-
@dataclass
5+
@modelclass
66
class DataPoint:
77
"An individual financial data point."
88
formula: Optional[str] = None
@@ -17,7 +17,7 @@ def from_dict(d):
1717
return DataPoint(**d)
1818

1919

20-
@dataclass
20+
@modelclass
2121
class ExchangeGainsLosses:
2222
"Contains exchange gains losses data for a cash flow statement."
2323
formula: Optional[str] = None
@@ -32,7 +32,7 @@ def from_dict(d):
3232
return ExchangeGainsLosses(**d)
3333

3434

35-
@dataclass
35+
@modelclass
3636
class NetCashFlow:
3737
"Contains net cash flow data for a cash flow statement."
3838
formula: Optional[str] = None
@@ -47,7 +47,7 @@ def from_dict(d):
4747
return NetCashFlow(**d)
4848

4949

50-
@dataclass
50+
@modelclass
5151
class NetCashFlowFromFinancingActivities:
5252
"Contains net cash flow from financing activities data for a cash flow statement."
5353
formula: Optional[str] = None
@@ -62,7 +62,7 @@ def from_dict(d):
6262
return NetCashFlowFromFinancingActivities(**d)
6363

6464

65-
@dataclass
65+
@modelclass
6666
class CashFlowStatement:
6767
"Contains cash flow statement data."
6868
exchange_gains_losses: Optional[ExchangeGainsLosses] = None
@@ -88,7 +88,7 @@ def from_dict(d):
8888
)
8989

9090

91-
@dataclass
91+
@modelclass
9292
class ComprehensiveIncomeLoss:
9393
"Contains comprehensive income loss data for comprehensive income."
9494
formula: Optional[str] = None
@@ -103,7 +103,7 @@ def from_dict(d):
103103
return ComprehensiveIncomeLoss(**d)
104104

105105

106-
@dataclass
106+
@modelclass
107107
class ComprehensiveIncomeLossAttributableToParent:
108108
"Contains comprehensive income loss attributable to parent data for comprehensive income."
109109
formula: Optional[str] = None
@@ -118,7 +118,7 @@ def from_dict(d):
118118
return ComprehensiveIncomeLossAttributableToParent(**d)
119119

120120

121-
@dataclass
121+
@modelclass
122122
class OtherComprehensiveIncomeLoss:
123123
"Contains other comprehensive income loss data for comprehensive income."
124124
formula: Optional[str] = None
@@ -133,7 +133,7 @@ def from_dict(d):
133133
return OtherComprehensiveIncomeLoss(**d)
134134

135135

136-
@dataclass
136+
@modelclass
137137
class ComprehensiveIncome:
138138
"Contains comprehensive income data."
139139
comprehensive_income_loss: Optional[ComprehensiveIncomeLoss] = None
@@ -161,7 +161,7 @@ def from_dict(d):
161161
)
162162

163163

164-
@dataclass
164+
@modelclass
165165
class BasicEarningsPerShare:
166166
"Contains basic earning per share data for an income statement."
167167
formula: Optional[str] = None
@@ -176,7 +176,7 @@ def from_dict(d):
176176
return BasicEarningsPerShare(**d)
177177

178178

179-
@dataclass
179+
@modelclass
180180
class CostOfRevenue:
181181
"Contains cost of revenue data for an income statement."
182182
formula: Optional[str] = None
@@ -191,7 +191,7 @@ def from_dict(d):
191191
return CostOfRevenue(**d)
192192

193193

194-
@dataclass
194+
@modelclass
195195
class GrossProfit:
196196
"Contains gross profit data for an income statement."
197197
formula: Optional[str] = None
@@ -206,7 +206,7 @@ def from_dict(d):
206206
return GrossProfit(**d)
207207

208208

209-
@dataclass
209+
@modelclass
210210
class OperatingExpenses:
211211
"Contains operating expenses data for an income statement."
212212
formula: Optional[str] = None
@@ -221,7 +221,7 @@ def from_dict(d):
221221
return OperatingExpenses(**d)
222222

223223

224-
@dataclass
224+
@modelclass
225225
class Revenues:
226226
"Contains revenues data for an income statement."
227227
formula: Optional[str] = None
@@ -236,7 +236,7 @@ def from_dict(d):
236236
return Revenues(**d)
237237

238238

239-
@dataclass
239+
@modelclass
240240
class IncomeStatement:
241241
"Contains income statement data."
242242
basic_earnings_per_share: Optional[BasicEarningsPerShare] = None
@@ -264,7 +264,7 @@ def from_dict(d):
264264
)
265265

266266

267-
@dataclass
267+
@modelclass
268268
class Financials:
269269
"Contains financial data."
270270
balance_sheet: Optional[Dict[str, DataPoint]] = None
@@ -290,7 +290,7 @@ def from_dict(d):
290290
)
291291

292292

293-
@dataclass
293+
@modelclass
294294
class StockFinancial:
295295
"StockFinancial contains historical financial data for a stock ticker."
296296
cik: Optional[str] = None

polygon/rest/models/markets.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from typing import Optional
2-
from dataclasses import dataclass
2+
from ...modelclass import modelclass
33

44

5-
@dataclass
5+
@modelclass
66
class MarketCurrencies:
77
"Contains currency market status data."
88
crypto: Optional[str] = None
@@ -13,7 +13,7 @@ def from_dict(d):
1313
return MarketCurrencies(**d)
1414

1515

16-
@dataclass
16+
@modelclass
1717
class MarketExchanges:
1818
"Contains exchange market status data."
1919
nasdaq: Optional[str] = None
@@ -25,7 +25,7 @@ def from_dict(d):
2525
return MarketExchanges(**d)
2626

2727

28-
@dataclass
28+
@modelclass
2929
class MarketHoliday:
3030
"MarketHoliday contains data for upcoming market holidays and their open/close times."
3131
close: Optional[str] = None
@@ -40,7 +40,7 @@ def from_dict(d):
4040
return MarketHoliday(**d)
4141

4242

43-
@dataclass
43+
@modelclass
4444
class MarketStatus:
4545
"MarketStatus contains data for the current trading status of the exchanges and overall financial markets."
4646
after_hours: Optional[bool] = None

polygon/rest/models/quotes.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from typing import Optional, List
2-
from dataclasses import dataclass
2+
from ...modelclass import modelclass
33

44

5-
@dataclass
5+
@modelclass
66
class Quote:
77
"Quote contains quote data for a specified ticker symbol."
88
ask_exchange: Optional[int] = None
@@ -24,7 +24,7 @@ def from_dict(d):
2424
return Quote(**d)
2525

2626

27-
@dataclass
27+
@modelclass
2828
class LastQuote:
2929
"LastQuote contains data for the most recent NBBO (Quote) tick for a given stock."
3030
ticker: Optional[str] = None
@@ -62,7 +62,7 @@ def from_dict(d):
6262
)
6363

6464

65-
@dataclass
65+
@modelclass
6666
class ForexQuote:
6767
"Contains data for a forex quote."
6868
ask: Optional[float] = None
@@ -75,7 +75,7 @@ def from_dict(d):
7575
return ForexQuote(**d)
7676

7777

78-
@dataclass
78+
@modelclass
7979
class LastForexQuote:
8080
"ForexLastQuote contains data for the last quote tick for a forex currency pair."
8181
last: Optional[ForexQuote] = None
@@ -89,7 +89,7 @@ def from_dict(d):
8989
)
9090

9191

92-
@dataclass
92+
@modelclass
9393
class RealTimeCurrencyConversion:
9494
"RealTimeCurrencyConversion contains data for currency conversions using the latest market conversion rates."
9595
converted: Optional[float] = None

0 commit comments

Comments
 (0)