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,373 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: 9cba85fd95c5
3
+
4
+ import asyncio
5
+ import random
6
+ import time
7
+ from datetime import datetime
8
+ from email.utils import parsedate_to_datetime
9
+ from typing import List, Optional
10
+
11
+ import httpx
12
+
13
+
14
+ class BackoffStrategy:
15
+ """Exponential backoff strategy configuration."""
16
+
17
+ initial_interval: int
18
+ max_interval: int
19
+ exponent: float
20
+ max_elapsed_time: int
21
+ jitter_ms: Optional[int]
22
+
23
+ def __init__(
24
+ self,
25
+ initial_interval: int,
26
+ max_interval: int,
27
+ exponent: float,
28
+ max_elapsed_time: int,
29
+ jitter_ms: Optional[int] = None,
30
+ ):
31
+ """Initialize a backoff strategy.
32
+
33
+ Args:
34
+ initial_interval: Initial retry interval in milliseconds.
35
+ max_interval: Maximum retry interval in milliseconds.
36
+ exponent: Base of the exponential backoff; the interval grows as
37
+ ``initial_interval * exponent ** retries``.
38
+ max_elapsed_time: Maximum total elapsed time in milliseconds.
39
+ jitter_ms: Additive jitter bound in milliseconds. When set, adds a random
40
+ value in ``[0, jitter_ms]`` to each computed backoff interval (default
41
+ ``+[0, 1s]``).
42
+
43
+ Note:
44
+ When a response carries a ``Retry-After`` or ``retry-after-ms`` header,
45
+ that delay is used as-is and the sleep-shaping parameters
46
+ (``initial_interval``, ``max_interval``, ``exponent``, ``jitter_ms``) are
47
+ ignored for that attempt.
48
+ """
49
+ if jitter_ms is not None and jitter_ms < 0:
50
+ raise ValueError("jitter_ms must be >= 0")
51
+ self.initial_interval = initial_interval
52
+ self.max_interval = max_interval
53
+ self.exponent = exponent
54
+ self.max_elapsed_time = max_elapsed_time
55
+ self.jitter_ms = jitter_ms
56
+
57
+
58
+ class RetryConfig:
59
+ """Runtime retry configuration."""
60
+
61
+ strategy: str
62
+ backoff: BackoffStrategy
63
+ retry_connection_errors: bool
64
+ status_codes_override: Optional[List[str]]
65
+
66
+ def __init__(
67
+ self,
68
+ strategy: str,
69
+ backoff: BackoffStrategy,
70
+ retry_connection_errors: bool,
71
+ status_codes_override: Optional[List[str]] = None,
72
+ ):
73
+ """Initialize a retry configuration.
74
+
75
+ Args:
76
+ strategy: Retry strategy: ``"none"`` or ``"backoff"``.
77
+ backoff: Backoff parameters.
78
+ retry_connection_errors: Whether to also retry transport-level connection errors.
79
+ status_codes_override: Retryable HTTP status codes that take precedence over the
80
+ per-operation defaults when non-empty.
81
+ """
82
+ self.strategy = strategy
83
+ self.backoff = backoff
84
+ self.retry_connection_errors = retry_connection_errors
85
+ self.status_codes_override = status_codes_override
86
+
87
+
88
+ class Retries:
89
+ config: RetryConfig
90
+ status_codes: List[str]
91
+
92
+ def __init__(self, config: RetryConfig, status_codes: List[str]):
93
+ self.config = config
94
+ self.status_codes = config.status_codes_override or status_codes
95
+
96
+
97
+ class TemporaryError(Exception):
98
+ response: httpx.Response
99
+ retry_after: Optional[int]
100
+
101
+ def __init__(self, response: httpx.Response):
102
+ self.response = response
103
+ self.retry_after = _parse_retry_after_header(response)
104
+
105
+
106
+ class PermanentError(Exception):
107
+ inner: Exception
108
+
109
+ def __init__(self, inner: Exception):
110
+ self.inner = inner
111
+
112
+
113
+ _TRANSPORT_ERROR_NAMES = frozenset({"NetworkError", "TimeoutException"})
114
+ _TRANSPORT_ERROR_BASES = frozenset({"TransportError", "RequestError", "HTTPError"})
115
+
116
+
117
+ def _is_transport_error(exception: BaseException) -> bool:
118
+ """Report whether an exception is a connection or timeout failure."""
119
+ if isinstance(exception, (httpx.NetworkError, httpx.TimeoutException)):
120
+ return True
121
+ names = {base.__name__ for base in type(exception).__mro__}
122
+ return bool(names & _TRANSPORT_ERROR_NAMES) and _TRANSPORT_ERROR_BASES <= names
123
+
124
+
125
+ def _parse_retry_after_header(response: httpx.Response) -> Optional[int]:
126
+ """Parse Retry-After header from response.
127
+
128
+ Returns:
129
+ Retry interval in milliseconds, or None if header is missing or invalid.
130
+ """
131
+ retry_after_header = response.headers.get("retry-after")
132
+ if not retry_after_header:
133
+ return None
134
+
135
+ try:
136
+ seconds = float(retry_after_header)
137
+ return round(seconds * 1000)
138
+ except ValueError:
139
+ pass
140
+
141
+ try:
142
+ retry_date = parsedate_to_datetime(retry_after_header)
143
+ delta = (retry_date - datetime.now(retry_date.tzinfo)).total_seconds()
144
+ return round(max(0, delta) * 1000)
145
+ except (ValueError, TypeError):
146
+ pass
147
+
148
+ return None
149
+
150
+
151
+ def _parse_retry_after_ms_header(response: httpx.Response) -> Optional[int]:
152
+ retry_after_ms_header = response.headers.get("retry-after-ms")
153
+ if not retry_after_ms_header:
154
+ return None
155
+
156
+ try:
157
+ milliseconds = float(retry_after_ms_header)
158
+ if milliseconds >= 0:
159
+ return round(milliseconds)
160
+ except (OverflowError, ValueError):
161
+ pass
162
+
163
+ return None
164
+
165
+
166
+ def _get_sleep_interval(
167
+ exception: Exception,
168
+ initial_interval: int,
169
+ max_interval: int,
170
+ exponent: float,
171
+ retries: int,
172
+ jitter_ms: Optional[int] = None,
173
+ ) -> float:
174
+ """Get sleep interval for retry with exponential backoff.
175
+
176
+ Args:
177
+ exception: The exception that triggered the retry.
178
+ initial_interval: Initial retry interval in milliseconds.
179
+ max_interval: Maximum retry interval in milliseconds.
180
+ exponent: Base for exponential backoff calculation.
181
+ retries: Current retry attempt count.
182
+ jitter_ms: Additive jitter bound in ms; see ``BackoffStrategy.jitter_ms``.
183
+
184
+ Returns:
185
+ Sleep interval in seconds.
186
+ """
187
+ if (
188
+ isinstance(exception, TemporaryError)
189
+ and exception.retry_after is not None
190
+ and exception.retry_after > 0
191
+ ):
192
+ return exception.retry_after / 1000
193
+
194
+ sleep = (initial_interval / 1000) * exponent**retries
195
+ if jitter_ms is not None:
196
+ sleep += random.uniform(0, jitter_ms / 1000)
197
+ else:
198
+ sleep += random.uniform(0, 1)
199
+ return min(sleep, max_interval / 1000)
200
+
201
+
202
+ def retry(func, retries: Retries):
203
+ if retries.config.strategy == "backoff":
204
+
205
+ def do_request() -> httpx.Response:
206
+ res: httpx.Response
207
+ try:
208
+ res = func()
209
+
210
+ for code in retries.status_codes:
211
+ if "X" in code.upper():
212
+ code_range = int(code[0])
213
+
214
+ status_major = res.status_code / 100
215
+
216
+ if code_range <= status_major < code_range + 1:
217
+ raise TemporaryError(res)
218
+ else:
219
+ parsed_code = int(code)
220
+
221
+ if res.status_code == parsed_code:
222
+ raise TemporaryError(res)
223
+ except TemporaryError:
224
+ raise
225
+ except Exception as exception:
226
+ if (
227
+ _is_transport_error(exception)
228
+ and retries.config.retry_connection_errors
229
+ ):
230
+ raise
231
+
232
+ raise PermanentError(exception) from exception
233
+
234
+ return res
235
+
236
+ return retry_with_backoff(
237
+ do_request,
238
+ retries.config.backoff.initial_interval,
239
+ retries.config.backoff.max_interval,
240
+ retries.config.backoff.exponent,
241
+ retries.config.backoff.max_elapsed_time,
242
+ retries.config.backoff.jitter_ms,
243
+ )
244
+
245
+ return func()
246
+
247
+
248
+ async def retry_async(func, retries: Retries):
249
+ if retries.config.strategy == "backoff":
250
+
251
+ async def do_request() -> httpx.Response:
252
+ res: httpx.Response
253
+ try:
254
+ res = await func()
255
+
256
+ for code in retries.status_codes:
257
+ if "X" in code.upper():
258
+ code_range = int(code[0])
259
+
260
+ status_major = res.status_code / 100
261
+
262
+ if code_range <= status_major < code_range + 1:
263
+ raise TemporaryError(res)
264
+ else:
265
+ parsed_code = int(code)
266
+
267
+ if res.status_code == parsed_code:
268
+ raise TemporaryError(res)
269
+ except TemporaryError:
270
+ raise
271
+ except Exception as exception:
272
+ if (
273
+ _is_transport_error(exception)
274
+ and retries.config.retry_connection_errors
275
+ ):
276
+ raise
277
+
278
+ raise PermanentError(exception) from exception
279
+
280
+ return res
281
+
282
+ return await retry_with_backoff_async(
283
+ do_request,
284
+ retries.config.backoff.initial_interval,
285
+ retries.config.backoff.max_interval,
286
+ retries.config.backoff.exponent,
287
+ retries.config.backoff.max_elapsed_time,
288
+ retries.config.backoff.jitter_ms,
289
+ )
290
+
291
+ return await func()
292
+
293
+
294
+ def retry_with_backoff(
295
+ func,
296
+ initial_interval=500,
297
+ max_interval=60000,
298
+ exponent=1.5,
299
+ max_elapsed_time=3600000,
300
+ jitter_ms=None,
301
+ ):
302
+ start = round(time.time() * 1000)
303
+ retries = 0
304
+
305
+ while True:
306
+ try:
307
+ return func()
308
+ except PermanentError as exception:
309
+ raise exception.inner
310
+ except Exception as exception: # pylint: disable=broad-exception-caught
311
+ now = round(time.time() * 1000)
312
+ if now - start > max_elapsed_time:
313
+ if isinstance(exception, TemporaryError):
314
+ return exception.response
315
+
316
+ raise
317
+
318
+ if isinstance(exception, TemporaryError):
319
+ retry_after_ms = _parse_retry_after_ms_header(exception.response)
320
+ if retry_after_ms is not None:
321
+ exception.retry_after = retry_after_ms
322
+ exception.response.close()
323
+ sleep = _get_sleep_interval(
324
+ exception,
325
+ initial_interval,
326
+ max_interval,
327
+ exponent,
328
+ retries,
329
+ jitter_ms=jitter_ms,
330
+ )
331
+ time.sleep(sleep)
332
+ retries += 1
333
+
334
+
335
+ async def retry_with_backoff_async(
336
+ func,
337
+ initial_interval=500,
338
+ max_interval=60000,
339
+ exponent=1.5,
340
+ max_elapsed_time=3600000,
341
+ jitter_ms=None,
342
+ ):
343
+ start = round(time.time() * 1000)
344
+ retries = 0
345
+
346
+ while True:
347
+ try:
348
+ return await func()
349
+ except PermanentError as exception:
350
+ raise exception.inner
351
+ except Exception as exception: # pylint: disable=broad-exception-caught
352
+ now = round(time.time() * 1000)
353
+ if now - start > max_elapsed_time:
354
+ if isinstance(exception, TemporaryError):
355
+ return exception.response
356
+
357
+ raise
358
+
359
+ if isinstance(exception, TemporaryError):
360
+ retry_after_ms = _parse_retry_after_ms_header(exception.response)
361
+ if retry_after_ms is not None:
362
+ exception.retry_after = retry_after_ms
363
+ await exception.response.aclose()
364
+ sleep = _get_sleep_interval(
365
+ exception,
366
+ initial_interval,
367
+ max_interval,
368
+ exponent,
369
+ retries,
370
+ jitter_ms=jitter_ms,
371
+ )
372
+ await asyncio.sleep(sleep)
373
+ retries += 1
@@ -0,0 +1,199 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: 9311a2317fd6
3
+
4
+ import base64
5
+ from typing import (
6
+ Any,
7
+ Dict,
8
+ List,
9
+ Optional,
10
+ Tuple,
11
+ )
12
+ from pydantic import BaseModel
13
+ from pydantic.fields import FieldInfo
14
+
15
+ from .metadata import (
16
+ SecurityMetadata,
17
+ find_field_metadata,
18
+ )
19
+
20
+
21
+ def get_security(
22
+ security: Any, allowed_fields: Optional[List[str]] = None
23
+ ) -> Tuple[Dict[str, str], Dict[str, List[str]]]:
24
+ headers: Dict[str, str] = {}
25
+ query_params: Dict[str, List[str]] = {}
26
+
27
+ if security is None:
28
+ return headers, query_params
29
+
30
+ if not isinstance(security, BaseModel):
31
+ raise TypeError("security must be a pydantic model")
32
+
33
+ sec_fields: Dict[str, FieldInfo] = security.__class__.model_fields
34
+ sec_field_names = (
35
+ list(sec_fields.keys()) if allowed_fields is None else allowed_fields
36
+ )
37
+
38
+ for name in sec_field_names:
39
+ if name not in sec_fields:
40
+ continue
41
+
42
+ sec_field = sec_fields[name]
43
+
44
+ value = getattr(security, name)
45
+ if value is None:
46
+ continue
47
+
48
+ metadata = find_field_metadata(sec_field, SecurityMetadata)
49
+ if metadata is None:
50
+ continue
51
+ if metadata.option:
52
+ _parse_security_option(headers, query_params, value)
53
+ return headers, query_params
54
+ if metadata.scheme:
55
+ # Special case for basic auth or custom auth which could be a flattened model
56
+ if metadata.sub_type in ["basic", "custom"] and not isinstance(
57
+ value, BaseModel
58
+ ):
59
+ _parse_security_scheme(headers, query_params, metadata, name, security)
60
+ else:
61
+ _parse_security_scheme(headers, query_params, metadata, name, value)
62
+
63
+ if not metadata.composite:
64
+ return headers, query_params
65
+
66
+ return headers, query_params
67
+
68
+
69
+ def _parse_security_option(
70
+ headers: Dict[str, str], query_params: Dict[str, List[str]], option: Any
71
+ ):
72
+ if not isinstance(option, BaseModel):
73
+ raise TypeError("security option must be a pydantic model")
74
+
75
+ opt_fields: Dict[str, FieldInfo] = option.__class__.model_fields
76
+
77
+ for name in opt_fields:
78
+ opt_field = opt_fields[name]
79
+
80
+ metadata = find_field_metadata(opt_field, SecurityMetadata)
81
+ if metadata is None or not metadata.scheme:
82
+ continue
83
+
84
+ value = getattr(option, name)
85
+ if (
86
+ metadata.scheme_type == "http"
87
+ and metadata.sub_type == "basic"
88
+ and not isinstance(value, BaseModel)
89
+ ):
90
+ _parse_basic_auth_scheme(headers, option)
91
+ return
92
+
93
+ _parse_security_scheme(headers, query_params, metadata, name, value)
94
+
95
+
96
+ def _parse_security_scheme(
97
+ headers: Dict[str, str],
98
+ query_params: Dict[str, List[str]],
99
+ scheme_metadata: SecurityMetadata,
100
+ field_name: str,
101
+ scheme: Any,
102
+ ):
103
+ scheme_type = scheme_metadata.scheme_type
104
+ sub_type = scheme_metadata.sub_type
105
+
106
+ if isinstance(scheme, BaseModel):
107
+ if scheme_type == "http":
108
+ if sub_type == "basic":
109
+ _parse_basic_auth_scheme(headers, scheme)
110
+ return
111
+ if sub_type == "custom":
112
+ return
113
+
114
+ scheme_fields: Dict[str, FieldInfo] = scheme.__class__.model_fields
115
+ for name in scheme_fields:
116
+ scheme_field = scheme_fields[name]
117
+
118
+ metadata = find_field_metadata(scheme_field, SecurityMetadata)
119
+ if metadata is None or metadata.field_name is None:
120
+ continue
121
+
122
+ value = getattr(scheme, name)
123
+
124
+ _parse_security_scheme_value(
125
+ headers, query_params, scheme_metadata, metadata, name, value
126
+ )
127
+ else:
128
+ _parse_security_scheme_value(
129
+ headers, query_params, scheme_metadata, scheme_metadata, field_name, scheme
130
+ )
131
+
132
+
133
+ def _parse_security_scheme_value(
134
+ headers: Dict[str, str],
135
+ query_params: Dict[str, List[str]],
136
+ scheme_metadata: SecurityMetadata,
137
+ security_metadata: SecurityMetadata,
138
+ field_name: str,
139
+ value: Any,
140
+ ):
141
+ scheme_type = scheme_metadata.scheme_type
142
+ sub_type = scheme_metadata.sub_type
143
+
144
+ header_name = security_metadata.get_field_name(field_name)
145
+
146
+ if scheme_type == "apiKey":
147
+ if sub_type == "header":
148
+ headers[header_name] = value
149
+ elif sub_type == "query":
150
+ query_params[header_name] = [value]
151
+ else:
152
+ raise ValueError("sub type {sub_type} not supported")
153
+ elif scheme_type == "openIdConnect":
154
+ headers[header_name] = _apply_bearer(value)
155
+ elif scheme_type == "oauth2":
156
+ if sub_type != "client_credentials":
157
+ headers[header_name] = _apply_bearer(value)
158
+ elif scheme_type == "http":
159
+ if sub_type == "bearer":
160
+ headers[header_name] = _apply_bearer(value)
161
+ elif sub_type == "basic":
162
+ headers[header_name] = value
163
+ elif sub_type == "custom":
164
+ return
165
+ else:
166
+ raise ValueError("sub type {sub_type} not supported")
167
+ else:
168
+ raise ValueError("scheme type {scheme_type} not supported")
169
+
170
+
171
+ def _apply_bearer(token: str) -> str:
172
+ return token.lower().startswith("bearer ") and token or f"Bearer {token}"
173
+
174
+
175
+ def _parse_basic_auth_scheme(headers: Dict[str, str], scheme: Any):
176
+ username = ""
177
+ password = ""
178
+
179
+ if not isinstance(scheme, BaseModel):
180
+ raise TypeError("basic auth scheme must be a pydantic model")
181
+
182
+ scheme_fields: Dict[str, FieldInfo] = scheme.__class__.model_fields
183
+ for name in scheme_fields:
184
+ scheme_field = scheme_fields[name]
185
+
186
+ metadata = find_field_metadata(scheme_field, SecurityMetadata)
187
+ if metadata is None or metadata.field_name is None:
188
+ continue
189
+
190
+ field_name = metadata.field_name
191
+ value = getattr(scheme, name)
192
+
193
+ if field_name == "username":
194
+ username = value
195
+ if field_name == "password":
196
+ password = value
197
+
198
+ data = f"{username}:{password}".encode()
199
+ headers["Authorization"] = f"Basic {base64.b64encode(data).decode()}"