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,327 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: 67b2c14c3282
3
+
4
+ import re
5
+ import json
6
+ from dataclasses import dataclass, asdict
7
+ from typing import (
8
+ Any,
9
+ Callable,
10
+ Generic,
11
+ List,
12
+ TypeVar,
13
+ Optional,
14
+ Generator,
15
+ AsyncGenerator,
16
+ Tuple,
17
+ )
18
+ import httpx
19
+
20
+ T = TypeVar("T")
21
+
22
+
23
+ class EventStream(Generic[T]):
24
+ # Holds a reference to the SDK client to avoid it being garbage collected
25
+ # and cause termination of the underlying httpx client.
26
+ client_ref: Optional[object]
27
+ response: httpx.Response
28
+ generator: Generator[T, None, None]
29
+ _closed: bool
30
+
31
+ def __init__(
32
+ self,
33
+ response: httpx.Response,
34
+ decoder: Callable[[str], T],
35
+ sentinel: Optional[str] = None,
36
+ client_ref: Optional[object] = None,
37
+ data_required: bool = True,
38
+ ):
39
+ self.response = response
40
+ self.generator = stream_events(
41
+ response, decoder, sentinel, data_required=data_required
42
+ )
43
+ self.client_ref = client_ref
44
+ self._closed = False
45
+
46
+ def __iter__(self):
47
+ return self
48
+
49
+ def __next__(self):
50
+ if self._closed:
51
+ raise StopIteration
52
+ return next(self.generator)
53
+
54
+ def __enter__(self):
55
+ return self
56
+
57
+ def __exit__(self, exc_type, exc_val, exc_tb):
58
+ self.close()
59
+
60
+ def close(self):
61
+ self._closed = True
62
+ self.response.close()
63
+
64
+
65
+ class EventStreamAsync(Generic[T]):
66
+ # Holds a reference to the SDK client to avoid it being garbage collected
67
+ # and cause termination of the underlying httpx client.
68
+ client_ref: Optional[object]
69
+ response: httpx.Response
70
+ generator: AsyncGenerator[T, None]
71
+ _closed: bool
72
+
73
+ def __init__(
74
+ self,
75
+ response: httpx.Response,
76
+ decoder: Callable[[str], T],
77
+ sentinel: Optional[str] = None,
78
+ client_ref: Optional[object] = None,
79
+ data_required: bool = True,
80
+ ):
81
+ self.response = response
82
+ self.generator = stream_events_async(
83
+ response, decoder, sentinel, data_required=data_required
84
+ )
85
+ self.client_ref = client_ref
86
+ self._closed = False
87
+
88
+ def __aiter__(self):
89
+ return self
90
+
91
+ async def __anext__(self):
92
+ if self._closed:
93
+ raise StopAsyncIteration
94
+ return await self.generator.__anext__()
95
+
96
+ async def __aenter__(self):
97
+ return self
98
+
99
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
100
+ await self.close()
101
+
102
+ async def close(self):
103
+ self._closed = True
104
+ await self.response.aclose()
105
+
106
+
107
+ @dataclass
108
+ class ServerEvent:
109
+ id: Optional[str] = None
110
+ event: Optional[str] = None
111
+ data: Any = None
112
+ retry: Optional[int] = None
113
+
114
+
115
+ MESSAGE_BOUNDARIES = [
116
+ b"\r\n\r\n",
117
+ b"\r\n\r",
118
+ b"\r\n\n",
119
+ b"\r\r\n",
120
+ b"\n\r\n",
121
+ b"\r\r",
122
+ b"\n\r",
123
+ b"\n\n",
124
+ ]
125
+ MAX_BOUNDARY_LEN = max(len(b) for b in MESSAGE_BOUNDARIES)
126
+
127
+ UTF8_BOM = b"\xef\xbb\xbf"
128
+
129
+
130
+ async def stream_events_async(
131
+ response: httpx.Response,
132
+ decoder: Callable[[str], T],
133
+ sentinel: Optional[str] = None,
134
+ data_required: bool = True,
135
+ ) -> AsyncGenerator[T, None]:
136
+ try:
137
+ buffer = bytearray()
138
+ position = 0
139
+ event_id: Optional[str] = None
140
+ async for chunk in response.aiter_bytes():
141
+ if len(buffer) == 0 and chunk.startswith(UTF8_BOM):
142
+ chunk = chunk[len(UTF8_BOM) :]
143
+ old_len = len(buffer)
144
+ buffer += chunk
145
+ search_start = max(position, old_len - MAX_BOUNDARY_LEN + 1)
146
+ for i in range(search_start, len(buffer)):
147
+ char = buffer[i : i + 1]
148
+ seq: Optional[bytes] = None
149
+ if char in [b"\r", b"\n"]:
150
+ for boundary in MESSAGE_BOUNDARIES:
151
+ seq = _peek_sequence(i, buffer, boundary)
152
+ if seq is not None:
153
+ break
154
+ if seq is None:
155
+ continue
156
+
157
+ block = buffer[position:i]
158
+ position = i + len(seq)
159
+ event, discard, event_id = _parse_event(
160
+ raw=block,
161
+ decoder=decoder,
162
+ sentinel=sentinel,
163
+ event_id=event_id,
164
+ data_required=data_required,
165
+ )
166
+ if event is not None:
167
+ yield event
168
+ if discard:
169
+ return
170
+
171
+ if position > 0:
172
+ buffer = buffer[position:]
173
+ position = 0
174
+
175
+ event, discard, _ = _parse_event(
176
+ raw=buffer,
177
+ decoder=decoder,
178
+ sentinel=sentinel,
179
+ event_id=event_id,
180
+ data_required=data_required,
181
+ )
182
+ if event is not None:
183
+ yield event
184
+ finally:
185
+ await response.aclose()
186
+
187
+
188
+ def stream_events(
189
+ response: httpx.Response,
190
+ decoder: Callable[[str], T],
191
+ sentinel: Optional[str] = None,
192
+ data_required: bool = True,
193
+ ) -> Generator[T, None, None]:
194
+ try:
195
+ buffer = bytearray()
196
+ position = 0
197
+ event_id: Optional[str] = None
198
+ for chunk in response.iter_bytes():
199
+ if len(buffer) == 0 and chunk.startswith(UTF8_BOM):
200
+ chunk = chunk[len(UTF8_BOM) :]
201
+ old_len = len(buffer)
202
+ buffer += chunk
203
+ search_start = max(position, old_len - MAX_BOUNDARY_LEN + 1)
204
+ for i in range(search_start, len(buffer)):
205
+ char = buffer[i : i + 1]
206
+ seq: Optional[bytes] = None
207
+ if char in [b"\r", b"\n"]:
208
+ for boundary in MESSAGE_BOUNDARIES:
209
+ seq = _peek_sequence(i, buffer, boundary)
210
+ if seq is not None:
211
+ break
212
+ if seq is None:
213
+ continue
214
+
215
+ block = buffer[position:i]
216
+ position = i + len(seq)
217
+ event, discard, event_id = _parse_event(
218
+ raw=block,
219
+ decoder=decoder,
220
+ sentinel=sentinel,
221
+ event_id=event_id,
222
+ data_required=data_required,
223
+ )
224
+ if event is not None:
225
+ yield event
226
+ if discard:
227
+ return
228
+
229
+ if position > 0:
230
+ buffer = buffer[position:]
231
+ position = 0
232
+
233
+ event, discard, _ = _parse_event(
234
+ raw=buffer,
235
+ decoder=decoder,
236
+ sentinel=sentinel,
237
+ event_id=event_id,
238
+ data_required=data_required,
239
+ )
240
+ if event is not None:
241
+ yield event
242
+ finally:
243
+ response.close()
244
+
245
+
246
+ def _parse_event(
247
+ *,
248
+ raw: bytearray,
249
+ decoder: Callable[[str], T],
250
+ sentinel: Optional[str] = None,
251
+ event_id: Optional[str] = None,
252
+ data_required: bool = True,
253
+ ) -> Tuple[Optional[T], bool, Optional[str]]:
254
+ block = raw.decode()
255
+ lines = re.split(r"\r?\n|\r", block)
256
+ publish = False
257
+ event = ServerEvent()
258
+ data_parts: List[str] = []
259
+ for line in lines:
260
+ if not line:
261
+ continue
262
+
263
+ delim = line.find(":")
264
+ if delim == 0:
265
+ continue
266
+
267
+ field = line
268
+ value = ""
269
+ if delim > 0:
270
+ field = line[0:delim]
271
+ value = line[delim + 1 :] if delim < len(line) - 1 else ""
272
+ if len(value) and value[0] == " ":
273
+ value = value[1:]
274
+
275
+ if field == "event":
276
+ event.event = value
277
+ publish = True
278
+ elif field == "data":
279
+ data_parts.append(value)
280
+ publish = True
281
+ elif field == "id":
282
+ publish = True
283
+ if "\x00" not in value:
284
+ event_id = value
285
+ elif field == "retry":
286
+ if value.isdigit():
287
+ event.retry = int(value)
288
+ publish = True
289
+
290
+ event.id = event_id
291
+ has_data = bool(data_parts)
292
+ data = "\n".join(data_parts)
293
+
294
+ if sentinel and has_data and data == sentinel:
295
+ return None, True, event_id
296
+
297
+ # Skip data-less events when data is required
298
+ if not has_data and publish and data_required:
299
+ return None, False, event_id
300
+
301
+ if has_data:
302
+ try:
303
+ event.data = json.loads(data)
304
+ except json.JSONDecodeError:
305
+ event.data = data
306
+
307
+ out = None
308
+ if publish:
309
+ out_dict = {
310
+ k: v
311
+ for k, v in asdict(event).items()
312
+ if v is not None or (k == "data" and has_data)
313
+ }
314
+ out = decoder(json.dumps(out_dict))
315
+
316
+ return out, False, event_id
317
+
318
+
319
+ def _peek_sequence(position: int, buffer: bytearray, sequence: bytes):
320
+ if len(sequence) > (len(buffer) - position):
321
+ return None
322
+
323
+ for i, seq in enumerate(sequence):
324
+ if buffer[position + i] != seq:
325
+ return None
326
+
327
+ return sequence
@@ -0,0 +1,240 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: dffcb15025d6
3
+
4
+ import io
5
+ from typing import (
6
+ Any,
7
+ Dict,
8
+ get_type_hints,
9
+ List,
10
+ Tuple,
11
+ )
12
+ from pydantic import BaseModel
13
+ from pydantic.fields import FieldInfo
14
+
15
+ from .serializers import marshal_json
16
+
17
+ from .metadata import (
18
+ FormMetadata,
19
+ MultipartFormMetadata,
20
+ find_field_metadata,
21
+ )
22
+ from .values import _is_set, _val_to_string
23
+
24
+
25
+ def _populate_form(
26
+ field_name: str,
27
+ explode: bool,
28
+ obj: Any,
29
+ delimiter: str,
30
+ form: Dict[str, List[str]],
31
+ ):
32
+ if not _is_set(obj):
33
+ return form
34
+
35
+ if isinstance(obj, BaseModel):
36
+ items = []
37
+
38
+ obj_fields: Dict[str, FieldInfo] = obj.__class__.model_fields
39
+ for name in obj_fields:
40
+ obj_field = obj_fields[name]
41
+ obj_field_name = obj_field.alias if obj_field.alias is not None else name
42
+ if obj_field_name == "":
43
+ continue
44
+
45
+ val = getattr(obj, name)
46
+ if not _is_set(val):
47
+ continue
48
+
49
+ if explode:
50
+ form[obj_field_name] = [_val_to_string(val)]
51
+ else:
52
+ items.append(f"{obj_field_name}{delimiter}{_val_to_string(val)}")
53
+
54
+ if len(items) > 0:
55
+ form[field_name] = [delimiter.join(items)]
56
+ elif isinstance(obj, Dict):
57
+ items = []
58
+ for key, value in obj.items():
59
+ if not _is_set(value):
60
+ continue
61
+
62
+ if explode:
63
+ form[key] = [_val_to_string(value)]
64
+ else:
65
+ items.append(f"{key}{delimiter}{_val_to_string(value)}")
66
+
67
+ if len(items) > 0:
68
+ form[field_name] = [delimiter.join(items)]
69
+ elif isinstance(obj, List):
70
+ items = []
71
+
72
+ for value in obj:
73
+ if not _is_set(value):
74
+ continue
75
+
76
+ if explode:
77
+ if not field_name in form:
78
+ form[field_name] = []
79
+ form[field_name].append(_val_to_string(value))
80
+ else:
81
+ items.append(_val_to_string(value))
82
+
83
+ if len(items) > 0:
84
+ form[field_name] = [delimiter.join([str(item) for item in items])]
85
+ else:
86
+ form[field_name] = [_val_to_string(obj)]
87
+
88
+ return form
89
+
90
+
91
+ def _extract_file_properties(file_obj: Any) -> Tuple[str, Any, Any]:
92
+ """Extract file name, content, and content type from a file object."""
93
+ file_fields: Dict[str, FieldInfo] = file_obj.__class__.model_fields
94
+
95
+ file_name = ""
96
+ content = None
97
+ content_type = None
98
+
99
+ for file_field_name in file_fields:
100
+ file_field = file_fields[file_field_name]
101
+
102
+ file_metadata = find_field_metadata(file_field, MultipartFormMetadata)
103
+ if file_metadata is None:
104
+ continue
105
+
106
+ if file_metadata.content:
107
+ content = getattr(file_obj, file_field_name, None)
108
+ if isinstance(content, io.TextIOBase):
109
+ content = content.read().encode(
110
+ getattr(content, "encoding", None) or "utf-8"
111
+ )
112
+ elif file_field_name == "content_type":
113
+ content_type = getattr(file_obj, file_field_name, None)
114
+ else:
115
+ file_name = getattr(file_obj, file_field_name)
116
+
117
+ if file_name == "" or content is None:
118
+ raise ValueError("invalid multipart/form-data file")
119
+
120
+ return file_name, content, content_type
121
+
122
+
123
+ def serialize_multipart_form(
124
+ media_type: str, request: Any
125
+ ) -> Tuple[str, Dict[str, Any], List[Tuple[str, Any]]]:
126
+ form: Dict[str, Any] = {}
127
+ files: List[Tuple[str, Any]] = []
128
+
129
+ if not isinstance(request, BaseModel):
130
+ raise TypeError("invalid request body type")
131
+
132
+ request_fields: Dict[str, FieldInfo] = request.__class__.model_fields
133
+ request_field_types = get_type_hints(request.__class__)
134
+
135
+ for name in request_fields:
136
+ field = request_fields[name]
137
+
138
+ val = getattr(request, name)
139
+ if not _is_set(val):
140
+ continue
141
+
142
+ field_metadata = find_field_metadata(field, MultipartFormMetadata)
143
+ if not field_metadata:
144
+ continue
145
+
146
+ f_name = field.alias if field.alias else name
147
+
148
+ if field_metadata.file:
149
+ if isinstance(val, List):
150
+ # Handle array of files
151
+ array_field_name = f_name + "[]"
152
+ for file_obj in val:
153
+ if not _is_set(file_obj):
154
+ continue
155
+
156
+ file_name, content, content_type = _extract_file_properties(
157
+ file_obj
158
+ )
159
+
160
+ if content_type is not None:
161
+ files.append(
162
+ (array_field_name, (file_name, content, content_type))
163
+ )
164
+ else:
165
+ files.append((array_field_name, (file_name, content)))
166
+ else:
167
+ # Handle single file
168
+ file_name, content, content_type = _extract_file_properties(val)
169
+
170
+ if content_type is not None:
171
+ files.append((f_name, (file_name, content, content_type)))
172
+ else:
173
+ files.append((f_name, (file_name, content)))
174
+ elif field_metadata.json:
175
+ files.append(
176
+ (
177
+ f_name,
178
+ (
179
+ None,
180
+ marshal_json(val, request_field_types[name]),
181
+ "application/json",
182
+ ),
183
+ )
184
+ )
185
+ else:
186
+ if isinstance(val, List):
187
+ values = []
188
+
189
+ for value in val:
190
+ if not _is_set(value):
191
+ continue
192
+ values.append(_val_to_string(value))
193
+
194
+ array_field_name = f_name + "[]"
195
+ form[array_field_name] = values
196
+ else:
197
+ form[f_name] = _val_to_string(val)
198
+ return media_type, form, files
199
+
200
+
201
+ def serialize_form_data(data: Any) -> Dict[str, Any]:
202
+ form: Dict[str, List[str]] = {}
203
+
204
+ if isinstance(data, BaseModel):
205
+ data_fields: Dict[str, FieldInfo] = data.__class__.model_fields
206
+ data_field_types = get_type_hints(data.__class__)
207
+ for name in data_fields:
208
+ field = data_fields[name]
209
+
210
+ val = getattr(data, name)
211
+ if not _is_set(val):
212
+ continue
213
+
214
+ metadata = find_field_metadata(field, FormMetadata)
215
+ if metadata is None:
216
+ continue
217
+
218
+ f_name = field.alias if field.alias is not None else name
219
+
220
+ if metadata.json:
221
+ form[f_name] = [marshal_json(val, data_field_types[name])]
222
+ else:
223
+ if metadata.style == "form":
224
+ _populate_form(
225
+ f_name,
226
+ metadata.explode,
227
+ val,
228
+ ",",
229
+ form,
230
+ )
231
+ else:
232
+ raise ValueError(f"Invalid form style for field {name}")
233
+ elif isinstance(data, Dict):
234
+ for key, value in data.items():
235
+ if _is_set(value):
236
+ form[key] = [_val_to_string(value)]
237
+ else:
238
+ raise TypeError(f"Invalid request body type {type(data)} for form data")
239
+
240
+ return form
@@ -0,0 +1,137 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: c0a9cf7a8d13
3
+
4
+ from typing import (
5
+ Any,
6
+ Dict,
7
+ List,
8
+ Optional,
9
+ )
10
+ from httpx import Headers
11
+ from pydantic import BaseModel
12
+ from pydantic.fields import FieldInfo
13
+
14
+ from .metadata import (
15
+ HeaderMetadata,
16
+ find_field_metadata,
17
+ )
18
+
19
+ from .values import _is_set, _populate_from_globals, _val_to_string
20
+
21
+
22
+ def get_headers(headers_params: Any, gbls: Optional[Any] = None) -> Dict[str, str]:
23
+ headers: Dict[str, str] = {}
24
+
25
+ globals_already_populated = []
26
+ if _is_set(headers_params):
27
+ globals_already_populated = _populate_headers(headers_params, gbls, headers, [])
28
+ if _is_set(gbls):
29
+ _populate_headers(gbls, None, headers, globals_already_populated)
30
+
31
+ return headers
32
+
33
+
34
+ def _populate_headers(
35
+ headers_params: Any,
36
+ gbls: Any,
37
+ header_values: Dict[str, str],
38
+ skip_fields: List[str],
39
+ ) -> List[str]:
40
+ globals_already_populated: List[str] = []
41
+
42
+ if not isinstance(headers_params, BaseModel):
43
+ return globals_already_populated
44
+
45
+ param_fields: Dict[str, FieldInfo] = headers_params.__class__.model_fields
46
+ for name in param_fields:
47
+ if name in skip_fields:
48
+ continue
49
+
50
+ field = param_fields[name]
51
+ f_name = field.alias if field.alias is not None else name
52
+
53
+ metadata = find_field_metadata(field, HeaderMetadata)
54
+ if metadata is None:
55
+ continue
56
+
57
+ value, global_found = _populate_from_globals(
58
+ name, getattr(headers_params, name), HeaderMetadata, gbls
59
+ )
60
+ if global_found:
61
+ globals_already_populated.append(name)
62
+ value = _serialize_header(metadata.explode, value)
63
+
64
+ if value != "":
65
+ header_values[f_name] = value
66
+
67
+ return globals_already_populated
68
+
69
+
70
+ def _serialize_header(explode: bool, obj: Any) -> str:
71
+ if not _is_set(obj):
72
+ return ""
73
+
74
+ if isinstance(obj, BaseModel):
75
+ items = []
76
+ obj_fields: Dict[str, FieldInfo] = obj.__class__.model_fields
77
+ for name in obj_fields:
78
+ obj_field = obj_fields[name]
79
+ obj_param_metadata = find_field_metadata(obj_field, HeaderMetadata)
80
+
81
+ if not obj_param_metadata:
82
+ continue
83
+
84
+ f_name = obj_field.alias if obj_field.alias is not None else name
85
+
86
+ val = getattr(obj, name)
87
+ if not _is_set(val):
88
+ continue
89
+
90
+ if explode:
91
+ items.append(f"{f_name}={_val_to_string(val)}")
92
+ else:
93
+ items.append(f_name)
94
+ items.append(_val_to_string(val))
95
+
96
+ if len(items) > 0:
97
+ return ",".join(items)
98
+ elif isinstance(obj, Dict):
99
+ items = []
100
+
101
+ for key, value in obj.items():
102
+ if not _is_set(value):
103
+ continue
104
+
105
+ if explode:
106
+ items.append(f"{key}={_val_to_string(value)}")
107
+ else:
108
+ items.append(key)
109
+ items.append(_val_to_string(value))
110
+
111
+ if len(items) > 0:
112
+ return ",".join([str(item) for item in items])
113
+ elif isinstance(obj, List):
114
+ items = []
115
+
116
+ for value in obj:
117
+ if not _is_set(value):
118
+ continue
119
+
120
+ items.append(_val_to_string(value))
121
+
122
+ if len(items) > 0:
123
+ return ",".join(items)
124
+ elif _is_set(obj):
125
+ return f"{_val_to_string(obj)}"
126
+
127
+ return ""
128
+
129
+
130
+ def get_response_headers(headers: Headers) -> Dict[str, List[str]]:
131
+ res: Dict[str, List[str]] = {}
132
+ for k, v in headers.items():
133
+ if not k in res:
134
+ res[k] = []
135
+
136
+ res[k].append(v)
137
+ return res