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,18 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: cf03b85e16db
3
+
4
+ from ._version import (
5
+ __title__,
6
+ __version__,
7
+ __openapi_doc_version__,
8
+ __gen_version__,
9
+ __user_agent__,
10
+ )
11
+ from .sdk import *
12
+ from .sdkconfiguration import *
13
+
14
+
15
+ VERSION: str = __version__
16
+ OPENAPI_DOC_VERSION = __openapi_doc_version__
17
+ SPEAKEASY_GENERATOR_VERSION = __gen_version__
18
+ USER_AGENT = __user_agent__
@@ -0,0 +1,7 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: c1472aa7f52f
3
+
4
+ from .sdkhooks import *
5
+ from .types import *
6
+ from .registration import *
7
+ from .oauth2scopes import *
@@ -0,0 +1,319 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: 1ee49412e311
3
+
4
+ import hashlib
5
+ import httpx
6
+ import threading
7
+ import time
8
+ from .types import (
9
+ SDKInitHook,
10
+ BeforeRequestContext,
11
+ BeforeRequestHook,
12
+ AfterErrorContext,
13
+ AfterErrorHook,
14
+ HookContext,
15
+ )
16
+ from typing import Any, ClassVar, Dict, List, Tuple, Union, Optional
17
+ from urllib.parse import urlparse, urljoin
18
+ from finance_dev.httpclient import HttpClient
19
+ from finance_dev.sdkconfiguration import SDKConfiguration
20
+
21
+
22
+ class Credentials:
23
+ client_id: str
24
+ client_secret: str
25
+ token_url: str
26
+ scopes: Optional[List[str]]
27
+ additional_properties: Dict[str, str]
28
+
29
+ def __init__(
30
+ self,
31
+ client_id: str,
32
+ client_secret: str,
33
+ token_url: str,
34
+ scopes: Optional[List[str]],
35
+ additional_properties: Optional[Dict[str, str]] = None,
36
+ ):
37
+ self.client_id = client_id
38
+ self.client_secret = client_secret
39
+ self.token_url = token_url
40
+ self.scopes = scopes
41
+ self.additional_properties = additional_properties or {}
42
+
43
+
44
+ class Session:
45
+ credentials: Credentials
46
+ token: str
47
+ scopes: List[str]
48
+ expires_at: Optional[int] = None
49
+
50
+ def __init__(
51
+ self,
52
+ credentials: Credentials,
53
+ token: str,
54
+ scopes: List[str],
55
+ expires_at: Optional[int] = None,
56
+ ):
57
+ self.credentials = credentials
58
+ self.token = token
59
+ self.scopes = scopes
60
+ self.expires_at = expires_at
61
+
62
+
63
+ class ClientCredentialsHook(SDKInitHook, BeforeRequestHook, AfterErrorHook):
64
+ client: HttpClient
65
+ _global_lock: ClassVar[threading.Lock] = threading.Lock()
66
+ _client_locks: ClassVar[Dict[str, threading.Lock]] = {}
67
+ _sessions: ClassVar[Dict[str, Dict[str, Session]]] = {}
68
+
69
+ @classmethod
70
+ def _get_client_lock(cls, client_key: str) -> threading.Lock:
71
+ """Get or create a lock for a specific client key (thread-safe)."""
72
+ with cls._global_lock:
73
+ if client_key not in cls._client_locks:
74
+ cls._client_locks[client_key] = threading.Lock()
75
+ return cls._client_locks[client_key]
76
+
77
+ def sdk_init(self, config: SDKConfiguration) -> SDKConfiguration:
78
+ if config.client is None:
79
+ raise Exception("Client is required")
80
+
81
+ self.client = config.client
82
+ return config
83
+
84
+ def before_request(
85
+ self, hook_ctx: BeforeRequestContext, request: httpx.Request
86
+ ) -> httpx.Request:
87
+ if self.is_hook_disabled(hook_ctx):
88
+ return request
89
+
90
+ credentials = self.get_credentials(hook_ctx)
91
+ if credentials is None:
92
+ return request
93
+
94
+ session_key = self.get_session_key(
95
+ credentials.client_id, credentials.client_secret
96
+ )
97
+
98
+ scopes = self.get_required_scopes(credentials, hook_ctx)
99
+ session = self.get_existing_session(session_key, scopes)
100
+
101
+ if session is None:
102
+ # Create new session
103
+ session = self.do_token_request(
104
+ hook_ctx,
105
+ credentials,
106
+ scopes,
107
+ )
108
+
109
+ self._store_session(session_key, scopes, session)
110
+
111
+ request.headers["Authorization"] = f"Bearer {session.token}"
112
+
113
+ return request
114
+
115
+ def after_error(
116
+ self,
117
+ hook_ctx: AfterErrorContext,
118
+ response: Optional[httpx.Response],
119
+ error: Optional[Exception],
120
+ ) -> Union[Tuple[Optional[httpx.Response], Optional[Exception]], Exception]:
121
+ if self.is_hook_disabled(hook_ctx):
122
+ return (response, error)
123
+
124
+ # We don't want to refresh the token if the error is not related to the token
125
+ if error is not None:
126
+ return (response, error)
127
+
128
+ credentials = self.get_credentials(hook_ctx)
129
+ if credentials is None:
130
+ return (response, error)
131
+
132
+ if response is not None and response.status_code == 401:
133
+ session_key = self.get_session_key(
134
+ credentials.client_id, credentials.client_secret
135
+ )
136
+ scopes = self.get_required_scopes(credentials, hook_ctx)
137
+ scope_key = self.get_scope_key(scopes)
138
+ self.remove_session(session_key, scope_key)
139
+
140
+ return (response, error)
141
+
142
+ def is_hook_disabled(self, hook_ctx: HookContext) -> bool:
143
+ return hook_ctx.oauth2_scopes is None
144
+
145
+ def get_credentials(self, hook_ctx: HookContext) -> Optional[Credentials]:
146
+ source = hook_ctx.security_source
147
+
148
+ if source is None:
149
+ return None
150
+
151
+ security = source() if callable(source) else source
152
+
153
+ return self.get_credentials_global(security)
154
+
155
+ def get_credentials_global(self, security: Any) -> Optional[Credentials]:
156
+ if (
157
+ security is None
158
+ or security.client_id is None
159
+ or security.client_secret is None
160
+ ):
161
+ return None
162
+
163
+ # Extract additional properties from security object
164
+ additional_properties = {}
165
+ for key, value in dict(security).items():
166
+ if key not in ["client_id", "client_secret", "token_url", "scopes"]:
167
+ additional_properties[key] = value
168
+
169
+ return Credentials(
170
+ client_id=security.client_id,
171
+ client_secret=security.client_secret,
172
+ token_url=security.token_url,
173
+ scopes=None,
174
+ additional_properties=additional_properties,
175
+ )
176
+
177
+ def do_token_request(
178
+ self, hook_ctx: HookContext, credentials: Credentials, scopes: List[str]
179
+ ) -> Session:
180
+ payload = {
181
+ "grant_type": "client_credentials",
182
+ "client_id": credentials.client_id,
183
+ "client_secret": credentials.client_secret,
184
+ }
185
+
186
+ if len(scopes) > 0:
187
+ payload["scope"] = " ".join(scopes)
188
+
189
+ # Add additional properties to payload
190
+ for key, value in credentials.additional_properties.items():
191
+ payload[key] = value
192
+
193
+ token_url = credentials.token_url
194
+ if not bool(urlparse(credentials.token_url).netloc):
195
+ token_url = urljoin(hook_ctx.base_url, credentials.token_url)
196
+ response = self.client.send(
197
+ self.client.build_request(method="POST", url=token_url, data=payload)
198
+ )
199
+
200
+ if response.status_code < 200 or response.status_code >= 300:
201
+ raise Exception(
202
+ f"Unexpected status code {response.status_code} from token endpoint"
203
+ )
204
+
205
+ response_data = response.json()
206
+
207
+ if response_data.get("token_type", "").lower() != "bearer":
208
+ raise Exception("Unexpected token type from token endpoint")
209
+
210
+ expires_at = None
211
+ if "expires_in" in response_data:
212
+ expires_at = int(time.time()) + response_data.get("expires_in")
213
+
214
+ return Session(
215
+ credentials=credentials,
216
+ token=response_data.get("access_token"),
217
+ scopes=scopes,
218
+ expires_at=expires_at,
219
+ )
220
+
221
+ def get_session_key(self, client_id: str, client_secret: str) -> str:
222
+ """Generate a consistent session key for the given client ID and secret."""
223
+ return hashlib.md5(f"{client_id}:{client_secret}".encode()).hexdigest()
224
+
225
+ def get_required_scopes(
226
+ self, credentials: Credentials, hook_ctx: HookContext
227
+ ) -> List[str]:
228
+ """Return the list of scopes that need to be requested."""
229
+ if credentials.scopes is not None:
230
+ return credentials.scopes
231
+ return hook_ctx.oauth2_scopes or []
232
+
233
+ def get_scope_key(self, scopes: List[str]) -> str:
234
+ """Generate a consistent scope key for the given scopes."""
235
+ if not scopes:
236
+ return ""
237
+
238
+ sorted_scopes = sorted(scopes)
239
+ return "&".join(sorted_scopes)
240
+
241
+ def _store_session(
242
+ self, client_key: str, scopes: List[str], session: Session
243
+ ) -> None:
244
+ """Store a session in the cache (thread-safe with per-client locking)."""
245
+ scope_key = self.get_scope_key(scopes)
246
+ lock = self._get_client_lock(client_key)
247
+ with lock:
248
+ if client_key not in self._sessions:
249
+ self._sessions[client_key] = {}
250
+ self._sessions[client_key][scope_key] = session
251
+
252
+ def remove_session(self, client_key: str, scope_key: str) -> None:
253
+ """Remove a session and clean up empty client session maps (thread-safe with per-client locking)."""
254
+ lock = self._get_client_lock(client_key)
255
+ with lock:
256
+ if client_key in self._sessions and scope_key in self._sessions[client_key]:
257
+ del self._sessions[client_key][scope_key]
258
+
259
+ # Clean up empty client sessions
260
+ if not self._sessions[client_key]:
261
+ del self._sessions[client_key]
262
+
263
+ def get_existing_session(
264
+ self, client_key: str, required_scopes: List[str]
265
+ ) -> Optional[Session]:
266
+ """Find the best session for the required scopes (thread-safe with per-client locking)."""
267
+ scope_key = self.get_scope_key(required_scopes)
268
+ expired_keys: List[str] = []
269
+ result: Optional[Session] = None
270
+
271
+ lock = self._get_client_lock(client_key)
272
+ with lock:
273
+ if client_key not in self._sessions:
274
+ return None
275
+
276
+ client_sessions = self._sessions[client_key]
277
+
278
+ # Check for exact scope match first
279
+ if scope_key in client_sessions:
280
+ exact_match = client_sessions[scope_key]
281
+ if self.has_token_expired(exact_match.expires_at):
282
+ expired_keys.append(scope_key)
283
+ else:
284
+ result = exact_match
285
+
286
+ # If no exact match, look for a superset match
287
+ if result is None:
288
+ for key, session in client_sessions.items():
289
+ if self.has_token_expired(session.expires_at):
290
+ expired_keys.append(key)
291
+ elif result is None and self.has_required_scopes(
292
+ session.scopes, required_scopes
293
+ ):
294
+ result = session
295
+
296
+ # Clean up expired sessions (safe: we collected keys first, not iterating while modifying)
297
+ for key in expired_keys:
298
+ if key in client_sessions:
299
+ del client_sessions[key]
300
+
301
+ # Clean up empty client sessions
302
+ if client_key in self._sessions and not self._sessions[client_key]:
303
+ del self._sessions[client_key]
304
+
305
+ return result
306
+
307
+ def has_required_scopes(
308
+ self, scopes: List[str], required_scopes: List[str]
309
+ ) -> bool:
310
+ """Check if all required scopes are present in the given scopes."""
311
+ return all(scope in scopes for scope in required_scopes)
312
+
313
+ def has_token_expired(self, expires_at: Optional[int]) -> bool:
314
+ """
315
+ Check if the token has expired.
316
+ If no expires_in field was returned by the authorization server, the token is considered to never expire.
317
+ A 60-second buffer is applied to refresh tokens before they actually expire.
318
+ """
319
+ return expires_at is not None and time.time() + 60 >= expires_at
@@ -0,0 +1,50 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: 9f26a4e27905
3
+
4
+ from enum import Enum
5
+
6
+
7
+ class OAuth2Scope(str, Enum):
8
+ r"""Available scopes for the OAuth2 OAuth 2.0 scheme (clientCredentials flow).
9
+
10
+ OAuth2 Bearer token: obtain an access token from the token endpoint and send it in the Authorization header.
11
+ """
12
+
13
+ ACCOUNT_INFORMATION = "account:information"
14
+ r"""View account balances, positions, and transaction history"""
15
+
16
+ ANALYTICS_INFORMATION = "analytics:information"
17
+ r"""View analytics, ratings, and market insights"""
18
+
19
+ CALENDAR_INFORMATION = "calendar:information"
20
+ r"""Access earnings, economic, and market schedule data"""
21
+
22
+ MARKET_INFORMATION = "market:information"
23
+ r"""Access live and historical market data"""
24
+
25
+ MARKET_SUPPLEMENTAL = "market:supplemental"
26
+ r"""News, company profiles, financials, filings, ETF data, technical analysis"""
27
+
28
+ OPTIONS_INFORMATION = "options:information"
29
+ r"""Access options chains and expiration data"""
30
+
31
+ ORDER_EXECUTION = "order:execution"
32
+ r"""Place, modify, and cancel orders"""
33
+
34
+ ORDER_INFORMATION = "order:information"
35
+ r"""View order history and status"""
36
+
37
+ POSITION_INFORMATION = "position:information"
38
+ r"""View current positions and holdings"""
39
+
40
+ USER_INFORMATION = "user:information"
41
+ r"""View user profile and personal details"""
42
+
43
+ USER_MANAGEMENT = "user:management"
44
+ r"""Manage user-scoped resources and saved configuration (internal)."""
45
+
46
+ WATCHLIST_INFORMATION = "watchlist:information"
47
+ r"""View your watchlists and their symbols."""
48
+
49
+ WATCHLIST_MANAGEMENT = "watchlist:management"
50
+ r"""Create, update, replace, and delete your watchlists."""
@@ -0,0 +1,13 @@
1
+ from .types import Hooks
2
+
3
+
4
+ # This file is only ever generated once on the first generation and then is free to be modified.
5
+ # Any hooks you wish to add should be registered in the init_hooks function. Feel free to define them
6
+ # in this file or in separate files in the hooks folder.
7
+
8
+
9
+ def init_hooks(hooks: Hooks):
10
+ # pylint: disable=unused-argument
11
+ """Add hooks by calling hooks.register{sdk_init/before_request/after_success/after_error}Hook
12
+ with an instance of a hook that implements that specific Hook interface
13
+ Hooks are registered per SDK instance, and are valid for the lifetime of the SDK instance"""
@@ -0,0 +1,82 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: 4433dbe03188
3
+
4
+ import httpx
5
+ from .clientcredentials import ClientCredentialsHook
6
+ from .types import (
7
+ SDKInitHook,
8
+ BeforeRequestContext,
9
+ BeforeRequestHook,
10
+ AfterSuccessContext,
11
+ AfterSuccessHook,
12
+ AfterErrorContext,
13
+ AfterErrorHook,
14
+ Hooks,
15
+ )
16
+ from .registration import init_hooks
17
+ from typing import List, Optional, Tuple
18
+ from finance_dev.sdkconfiguration import SDKConfiguration
19
+
20
+
21
+ class SDKHooks(Hooks):
22
+ def __init__(self) -> None:
23
+ self.sdk_init_hooks: List[SDKInitHook] = []
24
+ self.before_request_hooks: List[BeforeRequestHook] = []
25
+ self.after_success_hooks: List[AfterSuccessHook] = []
26
+ self.after_error_hooks: List[AfterErrorHook] = []
27
+ client_credentials = ClientCredentialsHook()
28
+ self.sdk_init_hooks.append(client_credentials)
29
+ self.before_request_hooks.append(client_credentials)
30
+ self.after_error_hooks.append(client_credentials)
31
+ init_hooks(self)
32
+
33
+ def register_sdk_init_hook(self, hook: SDKInitHook) -> None:
34
+ self.sdk_init_hooks.append(hook)
35
+
36
+ def register_before_request_hook(self, hook: BeforeRequestHook) -> None:
37
+ self.before_request_hooks.append(hook)
38
+
39
+ def register_after_success_hook(self, hook: AfterSuccessHook) -> None:
40
+ self.after_success_hooks.append(hook)
41
+
42
+ def register_after_error_hook(self, hook: AfterErrorHook) -> None:
43
+ self.after_error_hooks.append(hook)
44
+
45
+ def sdk_init(self, config: SDKConfiguration) -> SDKConfiguration:
46
+ for hook in self.sdk_init_hooks:
47
+ config = hook.sdk_init(config)
48
+ return config
49
+
50
+ def before_request(
51
+ self, hook_ctx: BeforeRequestContext, request: httpx.Request
52
+ ) -> httpx.Request:
53
+ for hook in self.before_request_hooks:
54
+ out = hook.before_request(hook_ctx, request)
55
+ if isinstance(out, Exception):
56
+ raise out
57
+ request = out
58
+
59
+ return request
60
+
61
+ def after_success(
62
+ self, hook_ctx: AfterSuccessContext, response: httpx.Response
63
+ ) -> httpx.Response:
64
+ for hook in self.after_success_hooks:
65
+ out = hook.after_success(hook_ctx, response)
66
+ if isinstance(out, Exception):
67
+ raise out
68
+ response = out
69
+ return response
70
+
71
+ def after_error(
72
+ self,
73
+ hook_ctx: AfterErrorContext,
74
+ response: Optional[httpx.Response],
75
+ error: Optional[Exception],
76
+ ) -> Tuple[Optional[httpx.Response], Optional[Exception]]:
77
+ for hook in self.after_error_hooks:
78
+ result = hook.after_error(hook_ctx, response, error)
79
+ if isinstance(result, Exception):
80
+ raise result
81
+ response, error = result
82
+ return response, error
@@ -0,0 +1,125 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: a8f278e0b7e7
3
+
4
+ from abc import ABC, abstractmethod
5
+ from finance_dev.sdkconfiguration import SDKConfiguration
6
+ import httpx
7
+ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
8
+
9
+
10
+ class HookContext:
11
+ config: SDKConfiguration
12
+ base_url: str
13
+ operation_id: str
14
+ oauth2_scopes: Optional[List[str]] = None
15
+ security_source: Optional[Union[Any, Callable[[], Any]]] = None
16
+ tags: Optional[List[str]] = None
17
+ extensions: Optional[Dict[str, Any]] = None
18
+
19
+ def __init__(
20
+ self,
21
+ config: SDKConfiguration,
22
+ base_url: str,
23
+ operation_id: str,
24
+ oauth2_scopes: Optional[List[str]],
25
+ security_source: Optional[Union[Any, Callable[[], Any]]],
26
+ tags: Optional[List[str]],
27
+ extensions: Optional[Dict[str, Any]],
28
+ ):
29
+ self.config = config
30
+ self.base_url = base_url
31
+ self.operation_id = operation_id
32
+ self.oauth2_scopes = oauth2_scopes
33
+ self.security_source = security_source
34
+ self.tags = tags
35
+ self.extensions = extensions
36
+
37
+
38
+ class BeforeRequestContext(HookContext):
39
+ def __init__(self, hook_ctx: HookContext):
40
+ super().__init__(
41
+ hook_ctx.config,
42
+ hook_ctx.base_url,
43
+ hook_ctx.operation_id,
44
+ hook_ctx.oauth2_scopes,
45
+ hook_ctx.security_source,
46
+ hook_ctx.tags,
47
+ hook_ctx.extensions,
48
+ )
49
+
50
+
51
+ class AfterSuccessContext(HookContext):
52
+ def __init__(self, hook_ctx: HookContext):
53
+ super().__init__(
54
+ hook_ctx.config,
55
+ hook_ctx.base_url,
56
+ hook_ctx.operation_id,
57
+ hook_ctx.oauth2_scopes,
58
+ hook_ctx.security_source,
59
+ hook_ctx.tags,
60
+ hook_ctx.extensions,
61
+ )
62
+
63
+
64
+ class AfterErrorContext(HookContext):
65
+ def __init__(self, hook_ctx: HookContext):
66
+ super().__init__(
67
+ hook_ctx.config,
68
+ hook_ctx.base_url,
69
+ hook_ctx.operation_id,
70
+ hook_ctx.oauth2_scopes,
71
+ hook_ctx.security_source,
72
+ hook_ctx.tags,
73
+ hook_ctx.extensions,
74
+ )
75
+
76
+
77
+ class SDKInitHook(ABC):
78
+ @abstractmethod
79
+ def sdk_init(self, config: SDKConfiguration) -> SDKConfiguration:
80
+ pass
81
+
82
+
83
+ class BeforeRequestHook(ABC):
84
+ @abstractmethod
85
+ def before_request(
86
+ self, hook_ctx: BeforeRequestContext, request: httpx.Request
87
+ ) -> Union[httpx.Request, Exception]:
88
+ pass
89
+
90
+
91
+ class AfterSuccessHook(ABC):
92
+ @abstractmethod
93
+ def after_success(
94
+ self, hook_ctx: AfterSuccessContext, response: httpx.Response
95
+ ) -> Union[httpx.Response, Exception]:
96
+ pass
97
+
98
+
99
+ class AfterErrorHook(ABC):
100
+ @abstractmethod
101
+ def after_error(
102
+ self,
103
+ hook_ctx: AfterErrorContext,
104
+ response: Optional[httpx.Response],
105
+ error: Optional[Exception],
106
+ ) -> Union[Tuple[Optional[httpx.Response], Optional[Exception]], Exception]:
107
+ pass
108
+
109
+
110
+ class Hooks(ABC):
111
+ @abstractmethod
112
+ def register_sdk_init_hook(self, hook: SDKInitHook):
113
+ pass
114
+
115
+ @abstractmethod
116
+ def register_before_request_hook(self, hook: BeforeRequestHook):
117
+ pass
118
+
119
+ @abstractmethod
120
+ def register_after_success_hook(self, hook: AfterSuccessHook):
121
+ pass
122
+
123
+ @abstractmethod
124
+ def register_after_error_hook(self, hook: AfterErrorHook):
125
+ pass
@@ -0,0 +1,16 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: 31abe97f59a6
3
+
4
+ import importlib.metadata
5
+
6
+ __title__: str = "finance_dev"
7
+ __version__: str = "0.9.0"
8
+ __openapi_doc_version__: str = "1.0.0"
9
+ __gen_version__: str = "2.948.4"
10
+ __user_agent__: str = "speakeasy-sdk/python 0.9.0 2.948.4 1.0.0 finance_dev"
11
+
12
+ try:
13
+ if __package__ is not None:
14
+ __version__ = importlib.metadata.version(__package__)
15
+ except importlib.metadata.PackageNotFoundError:
16
+ pass