finance_dev 0.9.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. finance_dev/__init__.py +18 -0
  2. finance_dev/_hooks/__init__.py +7 -0
  3. finance_dev/_hooks/clientcredentials.py +319 -0
  4. finance_dev/_hooks/oauth2scopes.py +50 -0
  5. finance_dev/_hooks/registration.py +13 -0
  6. finance_dev/_hooks/sdkhooks.py +82 -0
  7. finance_dev/_hooks/types.py +125 -0
  8. finance_dev/_version.py +16 -0
  9. finance_dev/accounts.py +797 -0
  10. finance_dev/alternativedata.py +4830 -0
  11. finance_dev/analytics.py +3757 -0
  12. finance_dev/basesdk.py +393 -0
  13. finance_dev/calendar.py +1523 -0
  14. finance_dev/chart.py +1881 -0
  15. finance_dev/company.py +1105 -0
  16. finance_dev/corporateactions.py +1795 -0
  17. finance_dev/economy.py +1153 -0
  18. finance_dev/errors/__init__.py +94 -0
  19. finance_dev/errors/apierror.py +41 -0
  20. finance_dev/errors/authenticationerrorenvelope.py +43 -0
  21. finance_dev/errors/badrequest.py +34 -0
  22. finance_dev/errors/errorenvelope.py +42 -0
  23. finance_dev/errors/errorresponse.py +45 -0
  24. finance_dev/errors/financedevapierror.py +31 -0
  25. finance_dev/errors/forbidden.py +34 -0
  26. finance_dev/errors/internalservererror.py +35 -0
  27. finance_dev/errors/no_response_error.py +18 -0
  28. finance_dev/errors/notfound.py +34 -0
  29. finance_dev/errors/orderhistorybadrequest.py +35 -0
  30. finance_dev/errors/predorderserrorenvelope.py +42 -0
  31. finance_dev/errors/responsevalidationerror.py +28 -0
  32. finance_dev/errors/unauthorized.py +34 -0
  33. finance_dev/estimates.py +1906 -0
  34. finance_dev/etf.py +1108 -0
  35. finance_dev/filings.py +586 -0
  36. finance_dev/financials.py +4079 -0
  37. finance_dev/history.py +477 -0
  38. finance_dev/httpclient.py +126 -0
  39. finance_dev/indices.py +2308 -0
  40. finance_dev/logos.py +692 -0
  41. finance_dev/market.py +1825 -0
  42. finance_dev/markets.py +952 -0
  43. finance_dev/models/__init__.py +4568 -0
  44. finance_dev/models/accountbalancev2.py +340 -0
  45. finance_dev/models/accountitem.py +78 -0
  46. finance_dev/models/accountposition.py +147 -0
  47. finance_dev/models/aggregatetechnicalindicatorsresponse.py +192 -0
  48. finance_dev/models/analystinsightitem.py +161 -0
  49. finance_dev/models/analystinsightsresponse.py +39 -0
  50. finance_dev/models/apperror.py +123 -0
  51. finance_dev/models/authenticationerrordetail.py +58 -0
  52. finance_dev/models/bankbranchesresponse.py +96 -0
  53. finance_dev/models/basicfinancials.py +243 -0
  54. finance_dev/models/bullbearanalysisresponse.py +150 -0
  55. finance_dev/models/cancelorderop.py +40 -0
  56. finance_dev/models/cancelordrequest_union.py +287 -0
  57. finance_dev/models/cancelordresponse.py +115 -0
  58. finance_dev/models/cashflowstatement.py +290 -0
  59. finance_dev/models/cashflowstatementsresponse.py +61 -0
  60. finance_dev/models/chartbars.py +111 -0
  61. finance_dev/models/chartconfig.py +81 -0
  62. finance_dev/models/chartresolution.py +46 -0
  63. finance_dev/models/companyesgresponse.py +408 -0
  64. finance_dev/models/companyexecutive.py +70 -0
  65. finance_dev/models/companyexecutiveresponse.py +39 -0
  66. finance_dev/models/companypeersresponse.py +38 -0
  67. finance_dev/models/companypresentationresponse.py +96 -0
  68. finance_dev/models/companyprofile.py +255 -0
  69. finance_dev/models/conferencecallsresponse.py +169 -0
  70. finance_dev/models/congressionaltradingresponse.py +138 -0
  71. finance_dev/models/covid19uscasesresponse.py +79 -0
  72. finance_dev/models/createconfigwatchlistop.py +40 -0
  73. finance_dev/models/createwatchlistrequest.py +43 -0
  74. finance_dev/models/dailymarketsummaryresponse.py +73 -0
  75. finance_dev/models/deleteconfigwatchlistbyidop.py +53 -0
  76. finance_dev/models/dividenditem.py +125 -0
  77. finance_dev/models/dividendsresponse.py +61 -0
  78. finance_dev/models/earningrelease.py +291 -0
  79. finance_dev/models/earningscallliveresponse.py +103 -0
  80. finance_dev/models/earningsqualityscoreresponse.py +140 -0
  81. finance_dev/models/earningssurprisesresponse.py +125 -0
  82. finance_dev/models/ebitdaestimatesresponse.py +176 -0
  83. finance_dev/models/ebitestimatesresponse.py +176 -0
  84. finance_dev/models/economicscalendarevent.py +160 -0
  85. finance_dev/models/economicsindicator.py +87 -0
  86. finance_dev/models/epsestimatesresponse.py +176 -0
  87. finance_dev/models/equitydetailsdto.py +569 -0
  88. finance_dev/models/errorcode.py +48 -0
  89. finance_dev/models/etblistresponse.py +43 -0
  90. finance_dev/models/etbsearchrequest.py +21 -0
  91. finance_dev/models/etbsearchresponse.py +43 -0
  92. finance_dev/models/etfcountryallocationresponse.py +113 -0
  93. finance_dev/models/etfholdingsresponse.py +163 -0
  94. finance_dev/models/etfprofileresponse.py +234 -0
  95. finance_dev/models/etfsectorallocationresponse.py +113 -0
  96. finance_dev/models/exchangecode.py +90 -0
  97. finance_dev/models/fdaadvisorycommitteecalendarresponse.py +88 -0
  98. finance_dev/models/filingsimilarityrecord.py +115 -0
  99. finance_dev/models/filingssimilarityindexdatawrapper.py +52 -0
  100. finance_dev/models/filingssimilarityindexresponse.py +42 -0
  101. finance_dev/models/financialratiosresponse.py +252 -0
  102. finance_dev/models/financialsreporteddatawrapper.py +49 -0
  103. finance_dev/models/financialsreportedresponse.py +42 -0
  104. finance_dev/models/financialsrevenuebreakdowndatawrapper.py +49 -0
  105. finance_dev/models/financialsrevenuebreakdownresponse.py +42 -0
  106. finance_dev/models/financialsstatementsdatawrapper.py +44 -0
  107. finance_dev/models/financialsstatementsresponse.py +42 -0
  108. finance_dev/models/financialstatement.py +171 -0
  109. finance_dev/models/financialstatementtype.py +14 -0
  110. finance_dev/models/getaccountbalanceop.py +53 -0
  111. finance_dev/models/getaccountpositionsop.py +53 -0
  112. finance_dev/models/getaccountsresponse.py +22 -0
  113. finance_dev/models/getaggregatetechnicalindicatorsop.py +94 -0
  114. finance_dev/models/getanalystinsightsop.py +164 -0
  115. finance_dev/models/getbankbranchesop.py +53 -0
  116. finance_dev/models/getbaseeventop.py +87 -0
  117. finance_dev/models/getbullbearanalysisop.py +91 -0
  118. finance_dev/models/getcashflowstatementsop.py +564 -0
  119. finance_dev/models/getchartconfigop.py +40 -0
  120. finance_dev/models/getcharthistoryop.py +122 -0
  121. finance_dev/models/getcharttimeop.py +39 -0
  122. finance_dev/models/getcompanyesgop.py +53 -0
  123. finance_dev/models/getcompanyexecutivesop.py +56 -0
  124. finance_dev/models/getcompanymetricsop.py +68 -0
  125. finance_dev/models/getcompanypeersop.py +53 -0
  126. finance_dev/models/getcompanypresentationop.py +56 -0
  127. finance_dev/models/getcompanyprofileop.py +86 -0
  128. finance_dev/models/getconferencecallsop.py +111 -0
  129. finance_dev/models/getconfigwatchlistbyidop.py +53 -0
  130. finance_dev/models/getconfigwatchlistsop.py +40 -0
  131. finance_dev/models/getcongressionaltradingop.py +73 -0
  132. finance_dev/models/getcovid19uscasesop.py +43 -0
  133. finance_dev/models/getdailymarketsummaryop.py +92 -0
  134. finance_dev/models/getdividendsop.py +294 -0
  135. finance_dev/models/getearningscalendarop.py +87 -0
  136. finance_dev/models/getearningscallliveop.py +91 -0
  137. finance_dev/models/getearningsqualityscoreop.py +81 -0
  138. finance_dev/models/getearningssurprisesop.py +80 -0
  139. finance_dev/models/getebitdaestimatesop.py +91 -0
  140. finance_dev/models/getebitestimatesop.py +88 -0
  141. finance_dev/models/geteconomicscalendarop.py +92 -0
  142. finance_dev/models/geteconomicscalendarresponse.py +56 -0
  143. finance_dev/models/getepsestimatesop.py +88 -0
  144. finance_dev/models/getequitydetailsop.py +56 -0
  145. finance_dev/models/getequitydetailsresponse.py +45 -0
  146. finance_dev/models/getetblistop.py +40 -0
  147. finance_dev/models/getetfcountryallocationop.py +80 -0
  148. finance_dev/models/getetfholdingsop.py +96 -0
  149. finance_dev/models/getetfprofileop.py +77 -0
  150. finance_dev/models/getetfsectorallocationop.py +80 -0
  151. finance_dev/models/geteventcontractsop.py +87 -0
  152. finance_dev/models/getfdaadvisorycommitteecalendarop.py +47 -0
  153. finance_dev/models/getfilingssimilarityindexop.py +102 -0
  154. finance_dev/models/getfinancialratiosop.py +612 -0
  155. finance_dev/models/getfinancialstatementsop.py +117 -0
  156. finance_dev/models/getfundownershipop.py +77 -0
  157. finance_dev/models/gethistoricaldataop.py +61 -0
  158. finance_dev/models/gethistoricalesgop.py +53 -0
  159. finance_dev/models/gethistorybatchop.py +74 -0
  160. finance_dev/models/gethistoryop.py +123 -0
  161. finance_dev/models/getincomestatementsop.py +564 -0
  162. finance_dev/models/getindexbarop.py +140 -0
  163. finance_dev/models/getindexbarsop.py +149 -0
  164. finance_dev/models/getindexchartbarsop.py +178 -0
  165. finance_dev/models/getindexrealtimevaluesop.py +94 -0
  166. finance_dev/models/getinflationexpectationsop.py +157 -0
  167. finance_dev/models/getinflationop.py +154 -0
  168. finance_dev/models/getinsidertransactionsop.py +90 -0
  169. finance_dev/models/getinstitutionalownershipop.py +99 -0
  170. finance_dev/models/getinstitutionalportfolioop.py +75 -0
  171. finance_dev/models/getinvestmentthemeop.py +68 -0
  172. finance_dev/models/getipocalendarop.py +63 -0
  173. finance_dev/models/getlobbyingop.py +70 -0
  174. finance_dev/models/getmarketbreadthop.py +40 -0
  175. finance_dev/models/getmarketholidaysop.py +65 -0
  176. finance_dev/models/getmarketstatusop.py +65 -0
  177. finance_dev/models/getmergersandacquisitionsop.py +113 -0
  178. finance_dev/models/getnetinflowop.py +40 -0
  179. finance_dev/models/getnewsbyidop.py +73 -0
  180. finance_dev/models/getnewsop.py +98 -0
  181. finance_dev/models/getnewssentimentop.py +53 -0
  182. finance_dev/models/getoptionchainsnapshotop.py +244 -0
  183. finance_dev/models/getoptioncontractsnapshotop.py +69 -0
  184. finance_dev/models/getoptiondetailsop.py +56 -0
  185. finance_dev/models/getoptiondetailsresponse.py +45 -0
  186. finance_dev/models/getoptionlasttradeop.py +56 -0
  187. finance_dev/models/getoptionopencloseop.py +66 -0
  188. finance_dev/models/getoptionpreviousdayop.py +56 -0
  189. finance_dev/models/getoptionquotesop.py +177 -0
  190. finance_dev/models/getoptionsactivityop.py +111 -0
  191. finance_dev/models/getoptionsetfstopvolumeop.py +70 -0
  192. finance_dev/models/getoptionsstockstopgainersop.py +70 -0
  193. finance_dev/models/getoptionsstockstopvolumeop.py +70 -0
  194. finance_dev/models/getoptionsunusualactivityop.py +100 -0
  195. finance_dev/models/getoptiontradesop.py +177 -0
  196. finance_dev/models/getordersv2response.py +66 -0
  197. finance_dev/models/getownershipdataop.py +77 -0
  198. finance_dev/models/getpositionsresponse.py +39 -0
  199. finance_dev/models/getpredictionorderop.py +88 -0
  200. finance_dev/models/getpricetargetop.py +53 -0
  201. finance_dev/models/getquotesop.py +53 -0
  202. finance_dev/models/getratingsop.py +164 -0
  203. finance_dev/models/getratingsresponse.py +39 -0
  204. finance_dev/models/getreportedfinancialsop.py +127 -0
  205. finance_dev/models/getrevenuebreakdownop.py +85 -0
  206. finance_dev/models/getrevenueestimatesop.py +91 -0
  207. finance_dev/models/getsecfilingsop.py +113 -0
  208. finance_dev/models/getsectortickersop.py +124 -0
  209. finance_dev/models/getsectorwisechangeop.py +84 -0
  210. finance_dev/models/getshortinterestop.py +334 -0
  211. finance_dev/models/getshortvolumeop.py +333 -0
  212. finance_dev/models/getsocialsentimentop.py +90 -0
  213. finance_dev/models/getspinoffsop.py +112 -0
  214. finance_dev/models/getstockaggregatesop.py +174 -0
  215. finance_dev/models/getstocklastquoteop.py +56 -0
  216. finance_dev/models/getstocklasttradeop.py +56 -0
  217. finance_dev/models/getstockopencloseop.py +90 -0
  218. finance_dev/models/getstockpreviousdayop.py +80 -0
  219. finance_dev/models/getstockquotesop.py +177 -0
  220. finance_dev/models/getstocksnapshotsop.py +82 -0
  221. finance_dev/models/getstocksplitsop.py +243 -0
  222. finance_dev/models/getstocktradesop.py +177 -0
  223. finance_dev/models/getsupplychainop.py +53 -0
  224. finance_dev/models/getsupportresistancelevelsop.py +90 -0
  225. finance_dev/models/getsymbolinfoop.py +53 -0
  226. finance_dev/models/gettechnicalindicatorop.py +172 -0
  227. finance_dev/models/gettechnicalpatternsop.py +88 -0
  228. finance_dev/models/gettenderoffersop.py +112 -0
  229. finance_dev/models/gettickhistoryop.py +104 -0
  230. finance_dev/models/gettopgainersop.py +78 -0
  231. finance_dev/models/gettoplosersop.py +78 -0
  232. finance_dev/models/gettopmostactiveop.py +78 -0
  233. finance_dev/models/gettranscriptop.py +53 -0
  234. finance_dev/models/gettreasuryyieldsop.py +157 -0
  235. finance_dev/models/getunifiedsnapshotop.py +223 -0
  236. finance_dev/models/getupgradesdowngradesop.py +91 -0
  237. finance_dev/models/getusaspendingop.py +70 -0
  238. finance_dev/models/getuseraccountsop.py +40 -0
  239. finance_dev/models/getusptopatentsop.py +70 -0
  240. finance_dev/models/getvisaapplicationsop.py +73 -0
  241. finance_dev/models/historicalesgresponse.py +439 -0
  242. finance_dev/models/httpmetadata.py +24 -0
  243. finance_dev/models/incomestatement.py +296 -0
  244. finance_dev/models/incomestatementsresponse.py +61 -0
  245. finance_dev/models/indexbarresponse.py +194 -0
  246. finance_dev/models/indexbarsresponse.py +123 -0
  247. finance_dev/models/indexchartbarsresponse.py +213 -0
  248. finance_dev/models/indexgroupsresponse.py +78 -0
  249. finance_dev/models/indexlistresponse.py +95 -0
  250. finance_dev/models/indexsearchresponse.py +93 -0
  251. finance_dev/models/indicesbygroupresponse.py +93 -0
  252. finance_dev/models/indicesidentifiertype.py +28 -0
  253. finance_dev/models/indicesrealtimeindexinfo.py +67 -0
  254. finance_dev/models/indicesrealtimeindexvalue.py +157 -0
  255. finance_dev/models/indicesrealtimevaluesitem.py +80 -0
  256. finance_dev/models/indicesrealtimevaluesresponse.py +42 -0
  257. finance_dev/models/inflationexpectationsresponse.py +140 -0
  258. finance_dev/models/inflationresponse.py +132 -0
  259. finance_dev/models/insidertransaction.py +97 -0
  260. finance_dev/models/insidertransactionsresponse.py +39 -0
  261. finance_dev/models/institutionalholding.py +77 -0
  262. finance_dev/models/institutionalownershipresponse.py +39 -0
  263. finance_dev/models/institutionalportfolioresponse.py +39 -0
  264. finance_dev/models/investmentthemeid.py +35 -0
  265. finance_dev/models/investmentthemeresponse.py +80 -0
  266. finance_dev/models/ipocalendarresponse.py +39 -0
  267. finance_dev/models/ipoitem.py +93 -0
  268. finance_dev/models/listactiveordersop.py +87 -0
  269. finance_dev/models/listcategoriesop.py +79 -0
  270. finance_dev/models/listindexgroupsop.py +40 -0
  271. finance_dev/models/listindicesbygroupop.py +58 -0
  272. finance_dev/models/listindicesop.py +91 -0
  273. finance_dev/models/listoptioncontractsop.py +66 -0
  274. finance_dev/models/listoptionexpirydatesop.py +56 -0
  275. finance_dev/models/listorderhistoryop.py +139 -0
  276. finance_dev/models/listpredictionordersop.py +134 -0
  277. finance_dev/models/listtranscriptsop.py +53 -0
  278. finance_dev/models/lobbyingresponse.py +166 -0
  279. finance_dev/models/logosearchresponse.py +152 -0
  280. finance_dev/models/logosyncresponse.py +277 -0
  281. finance_dev/models/marketbreadth.py +97 -0
  282. finance_dev/models/marketbreadthresponse.py +44 -0
  283. finance_dev/models/marketholiday.py +56 -0
  284. finance_dev/models/marketholidayresponse.py +39 -0
  285. finance_dev/models/marketstatus.py +67 -0
  286. finance_dev/models/mergersandacquisitionsresponse.py +186 -0
  287. finance_dev/models/metricseriespoint.py +43 -0
  288. finance_dev/models/netinflow.py +81 -0
  289. finance_dev/models/netinflowresponse.py +44 -0
  290. finance_dev/models/newsitem.py +102 -0
  291. finance_dev/models/newslistresponse.py +128 -0
  292. finance_dev/models/newssentimentresponse.py +176 -0
  293. finance_dev/models/newstypeenum.py +16 -0
  294. finance_dev/models/optionchainsnapshotresponse.py +64 -0
  295. finance_dev/models/optioncontractsnapshotresponse.py +64 -0
  296. finance_dev/models/optioncontractsnapshotrow.py +164 -0
  297. finance_dev/models/optioncontractsresponse.py +131 -0
  298. finance_dev/models/optiondetailsdto.py +72 -0
  299. finance_dev/models/optionexpirydatesresponse.py +53 -0
  300. finance_dev/models/optionlasttraderesponse.py +169 -0
  301. finance_dev/models/optionopencloseresponse.py +97 -0
  302. finance_dev/models/optionpreviousdayresponse.py +89 -0
  303. finance_dev/models/optionquotesresponse.py +138 -0
  304. finance_dev/models/optionsactivityresponse.py +265 -0
  305. finance_dev/models/optionsnapshotcontractdetails.py +85 -0
  306. finance_dev/models/optionsnapshotdaybar.py +107 -0
  307. finance_dev/models/optionsnapshotgreeks.py +67 -0
  308. finance_dev/models/optionsnapshotlastquote.py +116 -0
  309. finance_dev/models/optionsnapshotlasttrade.py +102 -0
  310. finance_dev/models/optionsnapshotunderlying.py +86 -0
  311. finance_dev/models/optionsscreeneritem.py +151 -0
  312. finance_dev/models/optionsunusualactivityresponse.py +62 -0
  313. finance_dev/models/optionsunusualactivitytrade.py +103 -0
  314. finance_dev/models/optiontradesresponse.py +132 -0
  315. finance_dev/models/orderrequesttimeinforceenum.py +29 -0
  316. finance_dev/models/ordersideenum.py +20 -0
  317. finance_dev/models/ordertypeenum.py +20 -0
  318. finance_dev/models/ordleg.py +162 -0
  319. finance_dev/models/ordresponse.py +202 -0
  320. finance_dev/models/ownershipdataresponse.py +39 -0
  321. finance_dev/models/ownershiprecord.py +74 -0
  322. finance_dev/models/placeorderop.py +40 -0
  323. finance_dev/models/placeordrequest_union.py +335 -0
  324. finance_dev/models/placepredictionorderop.py +114 -0
  325. finance_dev/models/predmdbaseevent.py +62 -0
  326. finance_dev/models/predmdbaseeventhit.py +53 -0
  327. finance_dev/models/predmdbaseeventsearchresult.py +46 -0
  328. finance_dev/models/predmdbaseeventwithevents.py +32 -0
  329. finance_dev/models/predmdbatchhistoryrequest.py +16 -0
  330. finance_dev/models/predmdbatchhistoryresponse.py +16 -0
  331. finance_dev/models/predmdcategory.py +48 -0
  332. finance_dev/models/predmdcontract.py +177 -0
  333. finance_dev/models/predmdcontracthit.py +157 -0
  334. finance_dev/models/predmdcontractsearchresult.py +46 -0
  335. finance_dev/models/predmdevent.py +136 -0
  336. finance_dev/models/predmdeventhit.py +73 -0
  337. finance_dev/models/predmdeventsearchresult.py +46 -0
  338. finance_dev/models/predmdeventwithcontracts.py +22 -0
  339. finance_dev/models/predmdhistoryrequest.py +59 -0
  340. finance_dev/models/predmdhistoryresponse.py +53 -0
  341. finance_dev/models/predmdtick.py +53 -0
  342. finance_dev/models/predordersapperror.py +78 -0
  343. finance_dev/models/predordersorder.py +267 -0
  344. finance_dev/models/predordersorderdetail.py +26 -0
  345. finance_dev/models/predordersorderpage.py +45 -0
  346. finance_dev/models/predordersorderreport.py +88 -0
  347. finance_dev/models/predordersplaceorderrequest.py +159 -0
  348. finance_dev/models/previeworderop.py +40 -0
  349. finance_dev/models/previeworderresponse.py +127 -0
  350. finance_dev/models/pricetargetresponse.py +89 -0
  351. finance_dev/models/quotedata.py +49 -0
  352. finance_dev/models/quotesresponse.py +62 -0
  353. finance_dev/models/quotevalues.py +114 -0
  354. finance_dev/models/rating.py +193 -0
  355. finance_dev/models/ratingsaccuracy.py +242 -0
  356. finance_dev/models/replaceconfigwatchlistsop.py +40 -0
  357. finance_dev/models/replaceorderop.py +40 -0
  358. finance_dev/models/replaceordrequest_union.py +367 -0
  359. finance_dev/models/replaceordresponse.py +144 -0
  360. finance_dev/models/reportedbsitem.py +53 -0
  361. finance_dev/models/reportedfiling.py +110 -0
  362. finance_dev/models/reportedreport.py +39 -0
  363. finance_dev/models/reportingfrequency.py +16 -0
  364. finance_dev/models/revenuebreakdownaxis.py +52 -0
  365. finance_dev/models/revenuebreakdowndatapoint.py +58 -0
  366. finance_dev/models/revenuebreakdownentry.py +51 -0
  367. finance_dev/models/revenuebreakdowninner.py +75 -0
  368. finance_dev/models/revenueestimatesresponse.py +176 -0
  369. finance_dev/models/screenclause.py +70 -0
  370. finance_dev/models/screengroup.py +75 -0
  371. finance_dev/models/searchetbsymbolsop.py +40 -0
  372. finance_dev/models/searchindicesop.py +55 -0
  373. finance_dev/models/searchlogosop.py +158 -0
  374. finance_dev/models/searchmarketsymbolsop.py +80 -0
  375. finance_dev/models/searchop.py +232 -0
  376. finance_dev/models/searchsymbolitem.py +76 -0
  377. finance_dev/models/searchsymbolresponseitem.py +71 -0
  378. finance_dev/models/searchsymbolsop.py +77 -0
  379. finance_dev/models/secfiling.py +91 -0
  380. finance_dev/models/secfilingsresponse.py +39 -0
  381. finance_dev/models/sectoravgchange.py +50 -0
  382. finance_dev/models/security.py +59 -0
  383. finance_dev/models/securitytypeenum.py +16 -0
  384. finance_dev/models/shortinterestresponse.py +126 -0
  385. finance_dev/models/shortvolumeresponse.py +198 -0
  386. finance_dev/models/socialsentimentresponse.py +124 -0
  387. finance_dev/models/sortorderenum.py +13 -0
  388. finance_dev/models/spinoffsresponse.py +136 -0
  389. finance_dev/models/stockaggregatesresponse.py +92 -0
  390. finance_dev/models/stocklastquoteresponse.py +175 -0
  391. finance_dev/models/stocklasttraderesponse.py +169 -0
  392. finance_dev/models/stockohlcbar.py +85 -0
  393. finance_dev/models/stockopencloseresponse.py +109 -0
  394. finance_dev/models/stockpreviousdayresponse.py +86 -0
  395. finance_dev/models/stockquotesresponse.py +170 -0
  396. finance_dev/models/stockscreenerop.py +144 -0
  397. finance_dev/models/stockscreenerrequest.py +131 -0
  398. finance_dev/models/stockscreenerresponse.py +197 -0
  399. finance_dev/models/stocksnapshotsresponse.py +454 -0
  400. finance_dev/models/stocksplitsresponse.py +144 -0
  401. finance_dev/models/stocktradesresponse.py +164 -0
  402. finance_dev/models/supplychainresponse.py +158 -0
  403. finance_dev/models/supportresistancelevelsresponse.py +68 -0
  404. finance_dev/models/symboldetails.py +119 -0
  405. finance_dev/models/symbolerror.py +43 -0
  406. finance_dev/models/symbolinfo.py +183 -0
  407. finance_dev/models/synclogosop.py +146 -0
  408. finance_dev/models/technicalindicatorresponse.py +43 -0
  409. finance_dev/models/technicalindicatortype.py +21 -0
  410. finance_dev/models/technicalpatternsresponse.py +249 -0
  411. finance_dev/models/tenderofferidentifiertype.py +26 -0
  412. finance_dev/models/tenderoffersresponse.py +548 -0
  413. finance_dev/models/tickchartbars.py +104 -0
  414. finance_dev/models/tickresolution.py +20 -0
  415. finance_dev/models/timeinforceenum.py +26 -0
  416. finance_dev/models/tradeorderlegv2.py +164 -0
  417. finance_dev/models/tradeorderv2.py +434 -0
  418. finance_dev/models/transcriptresponse.py +162 -0
  419. finance_dev/models/transcriptsresponse.py +89 -0
  420. finance_dev/models/treasuryyieldsresponse.py +160 -0
  421. finance_dev/models/unifiedsnapshotresponse.py +308 -0
  422. finance_dev/models/updateconfigwatchlistbyidop.py +65 -0
  423. finance_dev/models/updatewatchlistrequest_union.py +134 -0
  424. finance_dev/models/upgradesdowngradesresponse.py +98 -0
  425. finance_dev/models/usaspendingresponse.py +222 -0
  426. finance_dev/models/usptopatentsresponse.py +134 -0
  427. finance_dev/models/visaapplicationsresponse.py +228 -0
  428. finance_dev/models/watchlist.py +68 -0
  429. finance_dev/models/watchlistrequest.py +43 -0
  430. finance_dev/models/watchlistresponse.py +44 -0
  431. finance_dev/news_sdk.py +829 -0
  432. finance_dev/options.py +3443 -0
  433. finance_dev/orders.py +1907 -0
  434. finance_dev/ownership.py +1386 -0
  435. finance_dev/predictions.py +29 -0
  436. finance_dev/predictions_orders.py +852 -0
  437. finance_dev/py.typed +1 -0
  438. finance_dev/sdk.py +347 -0
  439. finance_dev/sdkconfiguration.py +50 -0
  440. finance_dev/signals.py +338 -0
  441. finance_dev/stocks.py +3131 -0
  442. finance_dev/technicalanalysis_sdk.py +1137 -0
  443. finance_dev/types/__init__.py +25 -0
  444. finance_dev/types/base64fileinput.py +44 -0
  445. finance_dev/types/basemodel.py +78 -0
  446. finance_dev/utils/__init__.py +181 -0
  447. finance_dev/utils/annotations.py +80 -0
  448. finance_dev/utils/datetimes.py +42 -0
  449. finance_dev/utils/dynamic_imports.py +55 -0
  450. finance_dev/utils/enums.py +135 -0
  451. finance_dev/utils/eventstreaming.py +327 -0
  452. finance_dev/utils/forms.py +240 -0
  453. finance_dev/utils/headers.py +137 -0
  454. finance_dev/utils/logger.py +23 -0
  455. finance_dev/utils/metadata.py +120 -0
  456. finance_dev/utils/queryparams.py +218 -0
  457. finance_dev/utils/requestbodies.py +68 -0
  458. finance_dev/utils/retries.py +373 -0
  459. finance_dev/utils/security.py +199 -0
  460. finance_dev/utils/serializers.py +327 -0
  461. finance_dev/utils/unmarshal_json_response.py +39 -0
  462. finance_dev/utils/url.py +155 -0
  463. finance_dev/utils/values.py +143 -0
  464. finance_dev/watchlist_sdk.py +1583 -0
  465. finance_dev/websocket/__init__.py +57 -0
  466. finance_dev/websocket/account.py +5 -0
  467. finance_dev/websocket/auth.py +124 -0
  468. finance_dev/websocket/chart.py +5 -0
  469. finance_dev/websocket/codec.py +66 -0
  470. finance_dev/websocket/config.py +52 -0
  471. finance_dev/websocket/errors.py +54 -0
  472. finance_dev/websocket/market.py +5 -0
  473. finance_dev/websocket/models/__init__.py +52 -0
  474. finance_dev/websocket/models/account.py +60 -0
  475. finance_dev/websocket/models/chart.py +44 -0
  476. finance_dev/websocket/models/common.py +85 -0
  477. finance_dev/websocket/models/market.py +113 -0
  478. finance_dev/websocket/resources.py +327 -0
  479. finance_dev/websocket/sdk.py +13 -0
  480. finance_dev/websocket/transport/async_connection.py +493 -0
  481. finance_dev/websocket/transport/base.py +78 -0
  482. finance_dev/websocket/transport/sync_connection.py +470 -0
  483. finance_dev-0.9.0.dist-info/METADATA +913 -0
  484. finance_dev-0.9.0.dist-info/RECORD +486 -0
  485. finance_dev-0.9.0.dist-info/WHEEL +5 -0
  486. finance_dev-0.9.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,57 @@
1
+ """Synchronous and asynchronous Aries WebSocket clients."""
2
+
3
+ from .auth import (
4
+ AsyncCallbackTokenProvider,
5
+ AsyncClientCredentialsTokenProvider,
6
+ AsyncTokenProvider,
7
+ CallbackTokenProvider,
8
+ ClientCredentialsTokenProvider,
9
+ StaticTokenProvider,
10
+ TokenProvider,
11
+ )
12
+ from .config import WebSocketConfig
13
+ from .errors import *
14
+ from .models import *
15
+ from .sdk import WebSocketSDK
16
+
17
+ __all__ = [
18
+ "WebSocketSDK",
19
+ "WebSocketConfig",
20
+ "TokenProvider",
21
+ "AsyncTokenProvider",
22
+ "StaticTokenProvider",
23
+ "CallbackTokenProvider",
24
+ "AsyncCallbackTokenProvider",
25
+ "ClientCredentialsTokenProvider",
26
+ "AsyncClientCredentialsTokenProvider",
27
+ "AriesWebSocketError",
28
+ "WebSocketConfigurationError",
29
+ "WebSocketConnectionError",
30
+ "WebSocketConnectionStateError",
31
+ "WebSocketReconnectExhaustedError",
32
+ "WebSocketAuthenticationError",
33
+ "WebSocketRequestError",
34
+ "WebSocketProtocolError",
35
+ "WebSocketBackpressureError",
36
+ "MarketEvent",
37
+ "MarketSubscription",
38
+ "MarketUnsubscribe",
39
+ "QuoteData",
40
+ "TradeData",
41
+ "Level2Data",
42
+ "TimeAndSalesData",
43
+ "GreeksData",
44
+ "ChartEvent",
45
+ "ChartSubscription",
46
+ "TradingViewQuote",
47
+ "TradingViewQuoteValues",
48
+ "TradingViewTrade",
49
+ "AccountEvent",
50
+ "PnlEvent",
51
+ "TopicEvent",
52
+ "AccountSnapshot",
53
+ "AccountSubscription",
54
+ "NewsSubscription",
55
+ "PnlSubscription",
56
+ "WatchlistSubscription",
57
+ ]
@@ -0,0 +1,5 @@
1
+ from .resources import AccountResource
2
+
3
+
4
+ class AccountWebSocket(AccountResource):
5
+ pass
@@ -0,0 +1,124 @@
1
+ """WebSocket access-token providers."""
2
+
3
+ import asyncio
4
+ import inspect
5
+ import threading
6
+ import time
7
+ from typing import Callable, Protocol
8
+ import httpx
9
+ from .errors import WebSocketAuthenticationError
10
+
11
+
12
+ class TokenProvider(Protocol):
13
+ def get_token(self) -> str: ...
14
+ class AsyncTokenProvider(Protocol):
15
+ async def get_token(self) -> str: ...
16
+
17
+
18
+ class StaticTokenProvider:
19
+ def __init__(self, token: str):
20
+ self.token = token
21
+
22
+ def get_token(self) -> str:
23
+ return self.token
24
+
25
+
26
+ class CallbackTokenProvider:
27
+ def __init__(self, callback: Callable[[], str]):
28
+ self.callback = callback
29
+
30
+ def get_token(self) -> str:
31
+ return self.callback()
32
+
33
+
34
+ class AsyncCallbackTokenProvider:
35
+ def __init__(self, callback):
36
+ self.callback = callback
37
+
38
+ async def get_token(self) -> str:
39
+ result = self.callback()
40
+ return await result if inspect.isawaitable(result) else result
41
+
42
+
43
+ class ClientCredentialsTokenProvider:
44
+ def __init__(self, token_url: str, client_id: str, client_secret: str):
45
+ self.token_url, self.client_id, self.client_secret = (
46
+ token_url,
47
+ client_id,
48
+ client_secret,
49
+ )
50
+ self._lock = threading.Lock()
51
+ self._token: str | None = None
52
+ self._expires = 0.0
53
+
54
+ def get_token(self) -> str:
55
+ with self._lock:
56
+ if self._token and time.monotonic() < self._expires - 30:
57
+ return self._token
58
+ try:
59
+ response = httpx.post(
60
+ self.token_url,
61
+ data={
62
+ "grant_type": "client_credentials",
63
+ "client_id": self.client_id,
64
+ "client_secret": self.client_secret,
65
+ },
66
+ timeout=15,
67
+ )
68
+ data = response.json()
69
+ if response.is_error:
70
+ raise WebSocketAuthenticationError(
71
+ "Client credentials were rejected. For partner/business clients, supply a token obtained through Authorization Code or PKCE."
72
+ )
73
+ token: str = data["access_token"]
74
+ self._token = token
75
+ self._expires = time.monotonic() + float(data.get("expires_in", 3600))
76
+ return token
77
+ except WebSocketAuthenticationError:
78
+ raise
79
+ except Exception as exc:
80
+ raise WebSocketAuthenticationError(
81
+ "Unable to obtain websocket access token"
82
+ ) from exc
83
+
84
+
85
+ class AsyncClientCredentialsTokenProvider:
86
+ def __init__(self, token_url, client_id, client_secret):
87
+ self.token_url, self.client_id, self.client_secret = (
88
+ token_url,
89
+ client_id,
90
+ client_secret,
91
+ )
92
+ self._lock = asyncio.Lock()
93
+ self._token = None
94
+ self._expires = 0.0
95
+
96
+ async def get_token(self):
97
+ async with self._lock:
98
+ if self._token and time.monotonic() < self._expires - 30:
99
+ return self._token
100
+ try:
101
+ async with httpx.AsyncClient() as client:
102
+ response = await client.post(
103
+ self.token_url,
104
+ data={
105
+ "grant_type": "client_credentials",
106
+ "client_id": self.client_id,
107
+ "client_secret": self.client_secret,
108
+ },
109
+ timeout=15,
110
+ )
111
+ data = response.json()
112
+ if response.is_error:
113
+ raise WebSocketAuthenticationError(
114
+ "Client credentials were rejected. For partner/business clients, supply a token obtained through Authorization Code or PKCE."
115
+ )
116
+ self._token = data["access_token"]
117
+ self._expires = time.monotonic() + float(data.get("expires_in", 3600))
118
+ return self._token
119
+ except WebSocketAuthenticationError:
120
+ raise
121
+ except Exception as exc:
122
+ raise WebSocketAuthenticationError(
123
+ "Unable to obtain websocket access token"
124
+ ) from exc
@@ -0,0 +1,5 @@
1
+ from .resources import ChartResource
2
+
3
+
4
+ class ChartWebSocket(ChartResource):
5
+ pass
@@ -0,0 +1,66 @@
1
+ """JSON/NDJSON wire codec."""
2
+
3
+ import json
4
+ from typing import Any
5
+ from .errors import WebSocketProtocolError
6
+ from .models.common import (
7
+ EventMessage,
8
+ PingMessage,
9
+ PongMessage,
10
+ RequestMessage,
11
+ ResponseMessage,
12
+ SubscribeMessage,
13
+ SubscribedMessage,
14
+ UnknownMessage,
15
+ UnsubscribeMessage,
16
+ )
17
+
18
+ _MODELS = {
19
+ "request": RequestMessage,
20
+ "response": ResponseMessage,
21
+ "event": EventMessage,
22
+ "subscribe": SubscribeMessage,
23
+ "unsubscribe": UnsubscribeMessage,
24
+ "subscribed": SubscribedMessage,
25
+ "ping": PingMessage,
26
+ "pong": PongMessage,
27
+ }
28
+
29
+
30
+ def decode_frame(frame: str | bytes) -> list[Any]:
31
+ if isinstance(frame, bytes):
32
+ try:
33
+ frame = frame.decode("utf-8")
34
+ except UnicodeDecodeError as exc:
35
+ raise WebSocketProtocolError(
36
+ "invalid UTF-8 websocket frame at line 1"
37
+ ) from exc
38
+ messages: list[Any] = []
39
+ for line_no, line in enumerate(frame.splitlines(), 1):
40
+ if not line.strip():
41
+ continue
42
+ try:
43
+ value = json.loads(line)
44
+ except (json.JSONDecodeError, ValueError) as exc:
45
+ raise WebSocketProtocolError(f"invalid JSON at line {line_no}") from exc
46
+ if not isinstance(value, dict):
47
+ raise WebSocketProtocolError(
48
+ f"JSON value must be an object at line {line_no}"
49
+ )
50
+ model_type: Any = _MODELS.get(str(value.get("type")))
51
+ if model_type is None:
52
+ messages.append(UnknownMessage(original=value))
53
+ continue
54
+ try:
55
+ messages.append(model_type.model_validate(value))
56
+ except Exception as exc:
57
+ raise WebSocketProtocolError(
58
+ f"invalid {value.get('type')} message at line {line_no}"
59
+ ) from exc
60
+ return messages
61
+
62
+
63
+ def encode_message(message: Any) -> str:
64
+ if hasattr(message, "model_dump"):
65
+ message = message.model_dump(by_alias=True, exclude_none=True)
66
+ return json.dumps(message, separators=(",", ":"), ensure_ascii=False)
@@ -0,0 +1,52 @@
1
+ """WebSocket endpoint URLs and validated connection settings."""
2
+
3
+ from dataclasses import dataclass
4
+ import math
5
+ from .errors import WebSocketConfigurationError
6
+
7
+ MARKET_URL = "wss://api.aries.com/v1/market/ws"
8
+ CHART_URL = "wss://api.aries.com/v1/charts/ws"
9
+ ACCOUNT_URL = "wss://api.aries.com/v1/accounts/ws"
10
+
11
+
12
+ @dataclass(frozen=True)
13
+ class WebSocketConfig:
14
+ connect_timeout: float = 10.0
15
+ auth_timeout: float = 4.0
16
+ request_timeout: float = 10.0
17
+ ping_interval: float = 30.0
18
+ pong_timeout: float = 10.0
19
+ close_timeout: float = 10.0
20
+ reconnect: bool = True
21
+ replay_subscriptions: bool = True
22
+ reconnect_initial_delay: float = 1.0
23
+ reconnect_max_delay: float = 60.0
24
+ reconnect_jitter: float = 0.2
25
+ incoming_queue_size: int = 1000
26
+ max_message_size: int = 1_048_576
27
+
28
+ def __post_init__(self):
29
+ for key in (
30
+ "connect_timeout",
31
+ "auth_timeout",
32
+ "request_timeout",
33
+ "ping_interval",
34
+ "pong_timeout",
35
+ "close_timeout",
36
+ "reconnect_initial_delay",
37
+ "reconnect_max_delay",
38
+ ):
39
+ if not math.isfinite(getattr(self, key)) or getattr(self, key) <= 0:
40
+ raise WebSocketConfigurationError(f"{key} must be positive")
41
+ if self.reconnect_max_delay < self.reconnect_initial_delay:
42
+ raise WebSocketConfigurationError(
43
+ "reconnect_max_delay must be at least reconnect_initial_delay"
44
+ )
45
+ if not 0 <= self.reconnect_jitter <= 1:
46
+ raise WebSocketConfigurationError(
47
+ "reconnect_jitter must be between 0 and 1"
48
+ )
49
+ if self.incoming_queue_size < 1 or self.max_message_size < 1:
50
+ raise WebSocketConfigurationError(
51
+ "queue size and max_message_size must be positive"
52
+ )
@@ -0,0 +1,54 @@
1
+ """Errors raised by Aries WebSocket clients."""
2
+
3
+ import re
4
+
5
+ _SECRET_PATTERN = re.compile(
6
+ r"(?i)(token|client[_-]?secret|authorization)(\s*[=:]\s*)([^\s,}\]]+)"
7
+ )
8
+ _BEARER_PATTERN = re.compile(r"(?i)(authorization\s*:\s*bearer\s+)[^\s,}\]]+")
9
+
10
+
11
+ def _redact(message: str) -> str:
12
+ message = _BEARER_PATTERN.sub(r"\1[REDACTED]", message)
13
+ return _SECRET_PATTERN.sub(r"\1\2[REDACTED]", message)
14
+
15
+
16
+ class AriesWebSocketError(Exception):
17
+ """Base class for websocket SDK failures."""
18
+
19
+ def __init__(self, message=""):
20
+ super().__init__(_redact(str(message)))
21
+
22
+
23
+ class WebSocketConfigurationError(AriesWebSocketError):
24
+ pass
25
+
26
+
27
+ class WebSocketConnectionError(AriesWebSocketError):
28
+ pass
29
+
30
+
31
+ class WebSocketConnectionStateError(WebSocketConnectionError):
32
+ pass
33
+
34
+
35
+ class WebSocketReconnectExhaustedError(WebSocketConnectionError):
36
+ pass
37
+
38
+
39
+ class WebSocketAuthenticationError(AriesWebSocketError):
40
+ pass
41
+
42
+
43
+ class WebSocketRequestError(AriesWebSocketError):
44
+ def __init__(self, message: str, *, status=None, code=None, request_id=None):
45
+ super().__init__(message)
46
+ self.status, self.code, self.request_id = status, code, request_id
47
+
48
+
49
+ class WebSocketProtocolError(AriesWebSocketError):
50
+ pass
51
+
52
+
53
+ class WebSocketBackpressureError(AriesWebSocketError):
54
+ pass
@@ -0,0 +1,5 @@
1
+ from .resources import MarketResource
2
+
3
+
4
+ class MarketWebSocket(MarketResource):
5
+ pass
@@ -0,0 +1,52 @@
1
+ from .common import *
2
+ from .market import (
3
+ GreeksData,
4
+ Level2Data,
5
+ MarketEvent,
6
+ MarketSubscription,
7
+ MarketUnsubscribe,
8
+ QuoteData,
9
+ TimeAndSalesData,
10
+ TradeData,
11
+ )
12
+ from .chart import (
13
+ ChartEvent,
14
+ ChartSubscription,
15
+ TradingViewQuote,
16
+ TradingViewQuoteValues,
17
+ TradingViewTrade,
18
+ )
19
+ from .account import (
20
+ AccountEvent,
21
+ AccountSnapshot,
22
+ AccountSubscription,
23
+ NewsSubscription,
24
+ PnlEvent,
25
+ PnlSubscription,
26
+ TopicEvent,
27
+ WatchlistSubscription,
28
+ )
29
+
30
+ __all__ = [
31
+ "MarketEvent",
32
+ "MarketSubscription",
33
+ "MarketUnsubscribe",
34
+ "QuoteData",
35
+ "TradeData",
36
+ "Level2Data",
37
+ "TimeAndSalesData",
38
+ "GreeksData",
39
+ "ChartEvent",
40
+ "ChartSubscription",
41
+ "TradingViewQuote",
42
+ "TradingViewQuoteValues",
43
+ "TradingViewTrade",
44
+ "AccountEvent",
45
+ "PnlEvent",
46
+ "TopicEvent",
47
+ "AccountSnapshot",
48
+ "AccountSubscription",
49
+ "NewsSubscription",
50
+ "PnlSubscription",
51
+ "WatchlistSubscription",
52
+ ]
@@ -0,0 +1,60 @@
1
+ """Account topic subscription models."""
2
+
3
+ from datetime import datetime
4
+ from typing import Any
5
+ from pydantic import Field, field_validator
6
+ from .common import WireModel
7
+
8
+
9
+ class AccountSubscription(WireModel):
10
+ account_id: str = Field(alias="accountId")
11
+
12
+
13
+ class PnlSubscription(WireModel):
14
+ account_id: str = Field(alias="accountId")
15
+ start_time: datetime | str
16
+ interval: str = "1m"
17
+
18
+ @field_validator("start_time")
19
+ @classmethod
20
+ def aware_start(cls, value):
21
+ if isinstance(value, datetime) and value.tzinfo is None:
22
+ raise ValueError("start_time must be timezone-aware")
23
+ if isinstance(value, str) and (
24
+ "T" not in value
25
+ or not (value.endswith("Z") or "+" in value[10:] or "-" in value[10:])
26
+ ):
27
+ raise ValueError("start_time must be an RFC3339 timestamp")
28
+ return value
29
+
30
+
31
+ class WatchlistSubscription(WireModel):
32
+ pass
33
+
34
+
35
+ class NewsSubscription(WireModel):
36
+ symbols: list[str] | None = None
37
+ topics: list[str] | None = None
38
+
39
+
40
+ class AccountSnapshot(WireModel):
41
+ account: dict
42
+ positions: list[dict]
43
+ ordersV2: list[dict]
44
+
45
+
46
+ class AccountEvent(WireModel):
47
+ topic: str = "account"
48
+ name: str
49
+ target: str | None = None
50
+ data: dict[str, Any]
51
+
52
+
53
+ class PnlEvent(WireModel):
54
+ topic: str = "pnl"
55
+ data: dict[str, Any]
56
+
57
+
58
+ class TopicEvent(WireModel):
59
+ topic: str
60
+ data: list[dict[str, Any]]
@@ -0,0 +1,44 @@
1
+ """TradingView-compatible chart models."""
2
+
3
+ from typing import Any
4
+ from pydantic import Field
5
+ from .common import WireModel
6
+
7
+
8
+ class ChartSubscription(WireModel):
9
+ symbol: str
10
+ type: str = "quotes"
11
+ symbol_type: str | None = Field(default=None, alias="symbolType")
12
+
13
+
14
+ class ChartEvent(WireModel):
15
+ symbol: str | None = None
16
+ data: Any = None
17
+
18
+
19
+ class TradingViewQuoteValues(WireModel):
20
+ change: float | None = Field(default=None, alias="ch")
21
+ change_percent: float | None = Field(default=None, alias="chp")
22
+ last_price: float | None = Field(default=None, alias="lp")
23
+ ask: float | None = None
24
+ bid: float | None = None
25
+ open_price: float | None = Field(default=None, alias="open_price")
26
+ high_price: float | None = Field(default=None, alias="high_price")
27
+ low_price: float | None = Field(default=None, alias="low_price")
28
+ previous_close_price: float | None = Field(default=None, alias="prev_close_price")
29
+ volume: float | None = None
30
+ exchange: str | None = None
31
+ short_name: str | None = None
32
+
33
+
34
+ class TradingViewQuote(WireModel):
35
+ status: str | None = Field(default=None, alias="s")
36
+ name: str | None = Field(default=None, alias="n")
37
+ values: TradingViewQuoteValues | None = Field(default=None, alias="v")
38
+
39
+
40
+ class TradingViewTrade(WireModel):
41
+ status: str | None = Field(default=None, alias="s")
42
+ timestamp: int | None = Field(default=None, alias="t")
43
+ last_price: float | None = Field(default=None, alias="lp")
44
+ volume: float | None = Field(default=None, alias="v")
@@ -0,0 +1,85 @@
1
+ """Forward-compatible common protocol models."""
2
+
3
+ from typing import Any, Literal
4
+ from pydantic import BaseModel, ConfigDict, Field
5
+
6
+
7
+ class WireModel(BaseModel):
8
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
9
+
10
+
11
+ class RequestMessage(WireModel):
12
+ type: Literal["request"] = "request"
13
+ id: str
14
+ payload: dict[str, Any]
15
+
16
+
17
+ class ResponseMessage(WireModel):
18
+ type: Literal["response"] = "response"
19
+ id: str | None = None
20
+ payload: dict[str, Any] = Field(default_factory=dict)
21
+
22
+
23
+ class ErrorResponse(ResponseMessage):
24
+ pass
25
+
26
+
27
+ class AuthRequest(RequestMessage):
28
+ pass
29
+
30
+
31
+ class AuthEvent(WireModel):
32
+ type: str | None = None
33
+ id: str | None = None
34
+ payload: dict[str, Any] = Field(default_factory=dict)
35
+
36
+
37
+ class SubscribeMessage(WireModel):
38
+ type: Literal["subscribe"] = "subscribe"
39
+ id: str | None = None
40
+ payload: Any
41
+
42
+
43
+ class UnsubscribeMessage(WireModel):
44
+ type: Literal["unsubscribe"] = "unsubscribe"
45
+ id: str | None = None
46
+ payload: Any
47
+
48
+
49
+ class SubscribedMessage(WireModel):
50
+ type: Literal["subscribed"] = "subscribed"
51
+ id: str | None = None
52
+ payload: dict[str, Any] = Field(default_factory=dict)
53
+
54
+
55
+ class EventMessage(WireModel):
56
+ type: Literal["event"] = "event"
57
+ id: str | None = None
58
+ payload: dict[str, Any] = Field(default_factory=dict)
59
+
60
+
61
+ class PingMessage(WireModel):
62
+ type: Literal["ping"] = "ping"
63
+ id: str | None = None
64
+
65
+
66
+ class PongMessage(WireModel):
67
+ type: Literal["pong"] = "pong"
68
+ id: str | None = None
69
+
70
+
71
+ class UnknownMessage(WireModel):
72
+ original: dict[str, Any]
73
+
74
+
75
+ InboundMessage = (
76
+ RequestMessage
77
+ | ResponseMessage
78
+ | EventMessage
79
+ | SubscribeMessage
80
+ | UnsubscribeMessage
81
+ | SubscribedMessage
82
+ | PingMessage
83
+ | PongMessage
84
+ | UnknownMessage
85
+ )