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,470 @@
1
+ """Threaded synchronous websocket connection with a single reader."""
2
+
3
+ import queue, random, threading, time, uuid
4
+ from contextlib import ExitStack
5
+ from concurrent.futures import Future, TimeoutError
6
+ from typing import Any
7
+ from ..codec import decode_frame, encode_message
8
+ from ..config import WebSocketConfig
9
+ from ..errors import (
10
+ WebSocketAuthenticationError,
11
+ WebSocketBackpressureError,
12
+ WebSocketConnectionError,
13
+ WebSocketConnectionStateError,
14
+ WebSocketRequestError,
15
+ )
16
+ from .base import apply_unsubscribe, subscription_key
17
+
18
+
19
+ class SyncConnection:
20
+ def __init__(self, url, token_provider, config=None):
21
+ self.url, self.provider, self.config = (
22
+ url,
23
+ token_provider,
24
+ config or WebSocketConfig(),
25
+ )
26
+ self._state = "DISCONNECTED"
27
+ self._socket: Any = None
28
+ self._socket_context: Any = None
29
+ self._reader = None
30
+ self.resource: Any = None
31
+ self._queue = queue.Queue(self.config.incoming_queue_size)
32
+ self._pending = {}
33
+ self._lock = threading.Lock()
34
+ self._closed = False
35
+ self._active = {}
36
+ self._keepalive = None
37
+ self._keepalive_stop = threading.Event()
38
+ self._recovering = False
39
+ self._terminal = None
40
+ self._terminal_reported = False
41
+
42
+ @property
43
+ def state(self):
44
+ """Current read-only connection state."""
45
+ return self._state
46
+
47
+ def _id(self, prefix):
48
+ return f"{prefix}-{uuid.uuid4()}"
49
+
50
+ def _open_socket(self, connect):
51
+ """Enter and retain the context that owns the current socket."""
52
+ socket_context = ExitStack()
53
+ try:
54
+ socket = socket_context.enter_context(
55
+ connect(
56
+ self.url,
57
+ open_timeout=self.config.connect_timeout,
58
+ close_timeout=self.config.close_timeout,
59
+ max_size=self.config.max_message_size,
60
+ ping_interval=self.config.ping_interval,
61
+ ping_timeout=self.config.pong_timeout,
62
+ )
63
+ )
64
+ except Exception:
65
+ socket_context.close()
66
+ raise
67
+ self._socket_context = socket_context
68
+ self._socket = socket
69
+ return socket
70
+
71
+ def _close_socket_context(self):
72
+ """Close the active socket through its owning context manager."""
73
+ socket_context, self._socket_context = self._socket_context, None
74
+ self._socket = None
75
+ if socket_context is not None:
76
+ socket_context.close()
77
+
78
+ def connect(self):
79
+ try:
80
+ from websockets.sync.client import connect
81
+
82
+ self._state = "CONNECTING"
83
+ self._open_socket(connect)
84
+ self._state = "AUTHENTICATING"
85
+ self._reader = threading.Thread(target=self._read_loop, daemon=True)
86
+ self._reader.start()
87
+ ident = self._id("auth")
88
+ self._auth_id = ident
89
+ future = Future()
90
+ with self._lock:
91
+ self._pending[ident] = future
92
+ self._socket.send(
93
+ encode_message(
94
+ {
95
+ "type": "request",
96
+ "id": ident,
97
+ "payload": {
98
+ "method": "POST",
99
+ "path": "/auth",
100
+ "body": {"token": self.provider.get_token()},
101
+ },
102
+ }
103
+ )
104
+ )
105
+ result = future.result(timeout=self.config.auth_timeout)
106
+ if result.get("payload", {}).get("action") != "authSuccess":
107
+ raise WebSocketAuthenticationError(
108
+ "WebSocket authentication was rejected"
109
+ )
110
+ self._state = "READY"
111
+ self._keepalive = threading.Thread(target=self._keepalive_loop, daemon=True)
112
+ self._keepalive.start()
113
+ return self
114
+ except TimeoutError as exc:
115
+ self.close()
116
+ raise WebSocketAuthenticationError(
117
+ "WebSocket authentication timed out"
118
+ ) from exc
119
+ except (WebSocketAuthenticationError, WebSocketConnectionError):
120
+ self.close()
121
+ raise
122
+ except WebSocketRequestError as exc:
123
+ self.close()
124
+ raise WebSocketAuthenticationError(
125
+ "WebSocket authentication was rejected"
126
+ ) from exc
127
+ except Exception as exc:
128
+ self.close()
129
+ raise WebSocketConnectionError(
130
+ "Unable to connect or authenticate websocket"
131
+ ) from exc
132
+
133
+ def _read_loop(self):
134
+ while not self._closed:
135
+ try:
136
+ frame = self._socket.recv(timeout=1)
137
+ if frame is None:
138
+ continue
139
+ for msg in decode_frame(frame):
140
+ if not hasattr(msg, "original"):
141
+ msg = msg.model_dump(by_alias=True, exclude_none=True)
142
+ self._dispatch(msg)
143
+ except TimeoutError:
144
+ continue
145
+ except Exception as exc:
146
+ if self._closed:
147
+ return
148
+ if self.config.reconnect and (
149
+ isinstance(exc, (OSError, ConnectionError, TimeoutError))
150
+ or exc.__class__.__name__.startswith("ConnectionClosed")
151
+ ):
152
+ try:
153
+ self._reconnect()
154
+ except Exception as reconnect_error:
155
+ self._state = "FAILED"
156
+ self._closed = True
157
+ self._terminal = reconnect_error
158
+ self._put(reconnect_error)
159
+ return
160
+ else:
161
+ self._state = "FAILED"
162
+ self._closed = True
163
+ self._terminal = exc
164
+ self._put(exc)
165
+ return
166
+
167
+ def _dispatch(self, msg):
168
+ if hasattr(msg, "original"):
169
+ self._put(msg)
170
+ return
171
+ payload = msg.get("payload", {})
172
+ ident = msg.get("id") or payload.get("id")
173
+ action = payload.get("action")
174
+ if action == "refreshAuth":
175
+ threading.Thread(target=self._refresh_auth, daemon=True).start()
176
+ self._put(msg)
177
+ return
178
+ if action in {"authRequired", "authTimeout"}:
179
+ raise WebSocketAuthenticationError(str(payload.get("error", action)))
180
+ if action == "authExpired":
181
+ if not self.config.reconnect:
182
+ raise WebSocketAuthenticationError("WebSocket session expired")
183
+ raise ConnectionError("WebSocket session expired")
184
+ with self._lock:
185
+ future = self._pending.pop(ident, None) if ident else None
186
+ if not future and action == "authSuccess":
187
+ future = self._pending.pop(getattr(self, "_auth_id", None), None)
188
+ if action == "authSuccess" and self._recovering:
189
+ self._recovering = False
190
+ self._state = "READY"
191
+ if self.config.replay_subscriptions:
192
+ for message in self._active.values():
193
+ self._socket.send(encode_message(message))
194
+ self._keepalive = threading.Thread(target=self._keepalive_loop, daemon=True)
195
+ self._keepalive.start()
196
+ if future:
197
+ if payload.get("error") or payload.get("status", 200) >= 400:
198
+ if ident == getattr(self, "_auth_id", None):
199
+ future.set_exception(
200
+ WebSocketAuthenticationError(
201
+ "WebSocket authentication was rejected"
202
+ )
203
+ )
204
+ raise WebSocketAuthenticationError(
205
+ "WebSocket authentication was rejected"
206
+ )
207
+ else:
208
+ future.set_exception(
209
+ WebSocketRequestError(
210
+ str(
211
+ payload.get(
212
+ "message", payload.get("error", "request failed")
213
+ )
214
+ ),
215
+ status=payload.get("status"),
216
+ code=payload.get("code"),
217
+ request_id=ident,
218
+ )
219
+ )
220
+ elif action == "error":
221
+ future.set_exception(
222
+ WebSocketRequestError(
223
+ str(payload.get("error", "request failed")),
224
+ status=payload.get("status"),
225
+ code=payload.get("code"),
226
+ request_id=ident,
227
+ )
228
+ )
229
+ elif not future.done():
230
+ future.set_result(msg)
231
+ else:
232
+ self._put(msg)
233
+
234
+ def _refresh_auth(self):
235
+ try:
236
+ ident = self._id("auth")
237
+ self._auth_id = ident
238
+ future = Future()
239
+ with self._lock:
240
+ self._pending[ident] = future
241
+ self._socket.send(
242
+ encode_message(
243
+ {
244
+ "type": "request",
245
+ "id": ident,
246
+ "payload": {
247
+ "method": "POST",
248
+ "path": "/auth",
249
+ "body": {"token": self.provider.get_token()},
250
+ },
251
+ }
252
+ )
253
+ )
254
+ result = future.result(timeout=self.config.auth_timeout)
255
+ if result.get("payload", {}).get("action") != "authSuccess":
256
+ raise WebSocketAuthenticationError(
257
+ "WebSocket token refresh was rejected"
258
+ )
259
+ except Exception as exc:
260
+ self._terminal = exc
261
+ self._state = "FAILED"
262
+ self._closed = True
263
+ self._put(exc)
264
+ try:
265
+ self._socket.close()
266
+ except Exception:
267
+ pass
268
+
269
+ def _reconnect(self):
270
+ from websockets.sync.client import connect
271
+
272
+ self._state = "RECONNECTING"
273
+ # The failed session's context must be exited before a new session is
274
+ # entered. The reader thread then continues reading from the new socket.
275
+ self._close_socket_context()
276
+ for attempt in range(8):
277
+ delay = min(
278
+ self.config.reconnect_max_delay,
279
+ self.config.reconnect_initial_delay * (2**attempt),
280
+ )
281
+ time.sleep(
282
+ delay
283
+ * random.uniform(
284
+ 1 - self.config.reconnect_jitter, 1 + self.config.reconnect_jitter
285
+ )
286
+ )
287
+ try:
288
+ self._open_socket(connect)
289
+ ident = self._id("auth")
290
+ self._auth_id = ident
291
+ self._recovering = True
292
+ self._state = "AUTHENTICATING"
293
+ with self._lock:
294
+ self._pending[ident] = Future()
295
+ self._socket.send(
296
+ encode_message(
297
+ {
298
+ "type": "request",
299
+ "id": ident,
300
+ "payload": {
301
+ "method": "POST",
302
+ "path": "/auth",
303
+ "body": {"token": self.provider.get_token()},
304
+ },
305
+ }
306
+ )
307
+ )
308
+ return
309
+ except WebSocketAuthenticationError:
310
+ self._state = "FAILED"
311
+ self._close_socket_context()
312
+ raise
313
+ except Exception:
314
+ self._close_socket_context()
315
+ continue
316
+ raise WebSocketConnectionError("WebSocket reconnect attempts exhausted")
317
+
318
+ def _keepalive_loop(self):
319
+ while not self._closed and self._state == "READY":
320
+ if self._keepalive_stop.wait(self.config.ping_interval):
321
+ return
322
+ if self._closed or self.state != "READY":
323
+ return
324
+ ident = self._id("ping")
325
+ future = Future()
326
+ with self._lock:
327
+ self._pending[ident] = future
328
+ try:
329
+ self._socket.send(encode_message({"type": "ping", "id": ident}))
330
+ future.result(timeout=self.config.pong_timeout)
331
+ except Exception:
332
+ try:
333
+ self._socket.close()
334
+ except Exception:
335
+ pass
336
+ return
337
+
338
+ def _put(self, item):
339
+ try:
340
+ self._queue.put_nowait(item)
341
+ except queue.Full:
342
+ self._closed = True
343
+ self._state = "FAILED"
344
+ self._terminal = WebSocketBackpressureError(
345
+ "Incoming websocket queue is full; drain events faster or increase incoming_queue_size"
346
+ )
347
+ try:
348
+ self._socket.close()
349
+ finally:
350
+ try:
351
+ self._queue.put_nowait(self._terminal)
352
+ except queue.Full:
353
+ pass
354
+
355
+ def _require_ready(self):
356
+ if self.state != "READY":
357
+ raise WebSocketConnectionStateError(
358
+ "WebSocket must be authenticated and READY before this operation"
359
+ )
360
+
361
+ def request(self, method, path, *, query=None, body=None, timeout=None):
362
+ payload = {"method": method, "path": path}
363
+ if query is not None:
364
+ payload["query"] = query
365
+ if body is not None:
366
+ payload["body"] = body
367
+ return self.exchange(
368
+ {"type": "request", "id": self._id("request"), "payload": payload},
369
+ timeout=timeout,
370
+ )
371
+
372
+ def send_message(self, message):
373
+ self._require_ready()
374
+ key = subscription_key(message)
375
+ if message.get("type") == "subscribe" and key in self._active:
376
+ return message.get("id")
377
+ self._socket.send(encode_message(message))
378
+ if message.get("type") == "subscribe":
379
+ self._active[key] = dict(message)
380
+ elif message.get("type") == "unsubscribe":
381
+ apply_unsubscribe(self._active, message)
382
+ return message.get("id")
383
+
384
+ def exchange(self, message, *, timeout=None):
385
+ self._require_ready()
386
+ ident = message.get("id") or self._id("request")
387
+ message["id"] = ident
388
+ future = Future()
389
+ with self._lock:
390
+ self._pending[ident] = future
391
+ self._socket.send(encode_message(message))
392
+ try:
393
+ return future.result(timeout=timeout or self.config.request_timeout)
394
+ finally:
395
+ with self._lock:
396
+ self._pending.pop(ident, None)
397
+
398
+ def subscribe(self, payload, *, data_type="quotes", symbol_type=None):
399
+ resource: Any = getattr(self, "resource", None)
400
+ if getattr(resource, "protocol", "") == "chart":
401
+ return resource.subscribe(
402
+ self, payload, data_type=data_type, symbol_type=symbol_type
403
+ )
404
+ if getattr(resource, "protocol", "") == "market":
405
+ return resource.subscribe(self, payload)
406
+ ident = self._id("subscribe")
407
+ self.send_message({"type": "subscribe", "id": ident, "payload": payload})
408
+ return ident
409
+
410
+ def unsubscribe(self, payload):
411
+ resource: Any = getattr(self, "resource", None)
412
+ if getattr(resource, "protocol", "") == "chart":
413
+ return resource.unsubscribe(self, payload)
414
+ if getattr(resource, "protocol", "") == "market":
415
+ return resource.unsubscribe(self, payload)
416
+ ident = self._id("unsubscribe")
417
+ self.send_message({"type": "unsubscribe", "id": ident, "payload": payload})
418
+ return ident
419
+
420
+ def __iter__(self):
421
+ return self
422
+
423
+ def __getattr__(self, name):
424
+ resource = self.__dict__.get("resource")
425
+ method = getattr(resource, name, None) if resource is not None else None
426
+ if method is not None and callable(method):
427
+ return lambda *args, **kwargs: method(self, *args, **kwargs)
428
+ raise AttributeError(name)
429
+
430
+ def __next__(self):
431
+ if self._queue.empty() and self._terminal and not self._terminal_reported:
432
+ self._terminal_reported = True
433
+ raise self._terminal
434
+ if self._closed and self._queue.empty():
435
+ raise StopIteration
436
+ item = self._queue.get()
437
+ if isinstance(item, Exception):
438
+ self._terminal_reported = True
439
+ raise item
440
+ return item
441
+
442
+ def close(self):
443
+ if self._state == "CLOSED":
444
+ return
445
+ self._closed = True
446
+ self._keepalive_stop.set()
447
+ self._state = "CLOSING"
448
+ with self._lock:
449
+ pending = list(self._pending.values())
450
+ self._pending.clear()
451
+ for future in pending:
452
+ if not future.done():
453
+ future.set_exception(
454
+ WebSocketConnectionError("WebSocket connection was closed")
455
+ )
456
+ try:
457
+ self._close_socket_context()
458
+ except Exception:
459
+ pass
460
+ if self._reader and self._reader is not threading.current_thread():
461
+ self._reader.join(timeout=self.config.close_timeout)
462
+ if self._keepalive and self._keepalive is not threading.current_thread():
463
+ self._keepalive.join(timeout=self.config.close_timeout)
464
+ self._state = "CLOSED"
465
+
466
+ def __enter__(self):
467
+ return self.connect()
468
+
469
+ def __exit__(self, *_):
470
+ self.close()