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.
- finance_dev/__init__.py +18 -0
- finance_dev/_hooks/__init__.py +7 -0
- finance_dev/_hooks/clientcredentials.py +319 -0
- finance_dev/_hooks/oauth2scopes.py +50 -0
- finance_dev/_hooks/registration.py +13 -0
- finance_dev/_hooks/sdkhooks.py +82 -0
- finance_dev/_hooks/types.py +125 -0
- finance_dev/_version.py +16 -0
- finance_dev/accounts.py +797 -0
- finance_dev/alternativedata.py +4830 -0
- finance_dev/analytics.py +3757 -0
- finance_dev/basesdk.py +393 -0
- finance_dev/calendar.py +1523 -0
- finance_dev/chart.py +1881 -0
- finance_dev/company.py +1105 -0
- finance_dev/corporateactions.py +1795 -0
- finance_dev/economy.py +1153 -0
- finance_dev/errors/__init__.py +94 -0
- finance_dev/errors/apierror.py +41 -0
- finance_dev/errors/authenticationerrorenvelope.py +43 -0
- finance_dev/errors/badrequest.py +34 -0
- finance_dev/errors/errorenvelope.py +42 -0
- finance_dev/errors/errorresponse.py +45 -0
- finance_dev/errors/financedevapierror.py +31 -0
- finance_dev/errors/forbidden.py +34 -0
- finance_dev/errors/internalservererror.py +35 -0
- finance_dev/errors/no_response_error.py +18 -0
- finance_dev/errors/notfound.py +34 -0
- finance_dev/errors/orderhistorybadrequest.py +35 -0
- finance_dev/errors/predorderserrorenvelope.py +42 -0
- finance_dev/errors/responsevalidationerror.py +28 -0
- finance_dev/errors/unauthorized.py +34 -0
- finance_dev/estimates.py +1906 -0
- finance_dev/etf.py +1108 -0
- finance_dev/filings.py +586 -0
- finance_dev/financials.py +4079 -0
- finance_dev/history.py +477 -0
- finance_dev/httpclient.py +126 -0
- finance_dev/indices.py +2308 -0
- finance_dev/logos.py +692 -0
- finance_dev/market.py +1825 -0
- finance_dev/markets.py +952 -0
- finance_dev/models/__init__.py +4568 -0
- finance_dev/models/accountbalancev2.py +340 -0
- finance_dev/models/accountitem.py +78 -0
- finance_dev/models/accountposition.py +147 -0
- finance_dev/models/aggregatetechnicalindicatorsresponse.py +192 -0
- finance_dev/models/analystinsightitem.py +161 -0
- finance_dev/models/analystinsightsresponse.py +39 -0
- finance_dev/models/apperror.py +123 -0
- finance_dev/models/authenticationerrordetail.py +58 -0
- finance_dev/models/bankbranchesresponse.py +96 -0
- finance_dev/models/basicfinancials.py +243 -0
- finance_dev/models/bullbearanalysisresponse.py +150 -0
- finance_dev/models/cancelorderop.py +40 -0
- finance_dev/models/cancelordrequest_union.py +287 -0
- finance_dev/models/cancelordresponse.py +115 -0
- finance_dev/models/cashflowstatement.py +290 -0
- finance_dev/models/cashflowstatementsresponse.py +61 -0
- finance_dev/models/chartbars.py +111 -0
- finance_dev/models/chartconfig.py +81 -0
- finance_dev/models/chartresolution.py +46 -0
- finance_dev/models/companyesgresponse.py +408 -0
- finance_dev/models/companyexecutive.py +70 -0
- finance_dev/models/companyexecutiveresponse.py +39 -0
- finance_dev/models/companypeersresponse.py +38 -0
- finance_dev/models/companypresentationresponse.py +96 -0
- finance_dev/models/companyprofile.py +255 -0
- finance_dev/models/conferencecallsresponse.py +169 -0
- finance_dev/models/congressionaltradingresponse.py +138 -0
- finance_dev/models/covid19uscasesresponse.py +79 -0
- finance_dev/models/createconfigwatchlistop.py +40 -0
- finance_dev/models/createwatchlistrequest.py +43 -0
- finance_dev/models/dailymarketsummaryresponse.py +73 -0
- finance_dev/models/deleteconfigwatchlistbyidop.py +53 -0
- finance_dev/models/dividenditem.py +125 -0
- finance_dev/models/dividendsresponse.py +61 -0
- finance_dev/models/earningrelease.py +291 -0
- finance_dev/models/earningscallliveresponse.py +103 -0
- finance_dev/models/earningsqualityscoreresponse.py +140 -0
- finance_dev/models/earningssurprisesresponse.py +125 -0
- finance_dev/models/ebitdaestimatesresponse.py +176 -0
- finance_dev/models/ebitestimatesresponse.py +176 -0
- finance_dev/models/economicscalendarevent.py +160 -0
- finance_dev/models/economicsindicator.py +87 -0
- finance_dev/models/epsestimatesresponse.py +176 -0
- finance_dev/models/equitydetailsdto.py +569 -0
- finance_dev/models/errorcode.py +48 -0
- finance_dev/models/etblistresponse.py +43 -0
- finance_dev/models/etbsearchrequest.py +21 -0
- finance_dev/models/etbsearchresponse.py +43 -0
- finance_dev/models/etfcountryallocationresponse.py +113 -0
- finance_dev/models/etfholdingsresponse.py +163 -0
- finance_dev/models/etfprofileresponse.py +234 -0
- finance_dev/models/etfsectorallocationresponse.py +113 -0
- finance_dev/models/exchangecode.py +90 -0
- finance_dev/models/fdaadvisorycommitteecalendarresponse.py +88 -0
- finance_dev/models/filingsimilarityrecord.py +115 -0
- finance_dev/models/filingssimilarityindexdatawrapper.py +52 -0
- finance_dev/models/filingssimilarityindexresponse.py +42 -0
- finance_dev/models/financialratiosresponse.py +252 -0
- finance_dev/models/financialsreporteddatawrapper.py +49 -0
- finance_dev/models/financialsreportedresponse.py +42 -0
- finance_dev/models/financialsrevenuebreakdowndatawrapper.py +49 -0
- finance_dev/models/financialsrevenuebreakdownresponse.py +42 -0
- finance_dev/models/financialsstatementsdatawrapper.py +44 -0
- finance_dev/models/financialsstatementsresponse.py +42 -0
- finance_dev/models/financialstatement.py +171 -0
- finance_dev/models/financialstatementtype.py +14 -0
- finance_dev/models/getaccountbalanceop.py +53 -0
- finance_dev/models/getaccountpositionsop.py +53 -0
- finance_dev/models/getaccountsresponse.py +22 -0
- finance_dev/models/getaggregatetechnicalindicatorsop.py +94 -0
- finance_dev/models/getanalystinsightsop.py +164 -0
- finance_dev/models/getbankbranchesop.py +53 -0
- finance_dev/models/getbaseeventop.py +87 -0
- finance_dev/models/getbullbearanalysisop.py +91 -0
- finance_dev/models/getcashflowstatementsop.py +564 -0
- finance_dev/models/getchartconfigop.py +40 -0
- finance_dev/models/getcharthistoryop.py +122 -0
- finance_dev/models/getcharttimeop.py +39 -0
- finance_dev/models/getcompanyesgop.py +53 -0
- finance_dev/models/getcompanyexecutivesop.py +56 -0
- finance_dev/models/getcompanymetricsop.py +68 -0
- finance_dev/models/getcompanypeersop.py +53 -0
- finance_dev/models/getcompanypresentationop.py +56 -0
- finance_dev/models/getcompanyprofileop.py +86 -0
- finance_dev/models/getconferencecallsop.py +111 -0
- finance_dev/models/getconfigwatchlistbyidop.py +53 -0
- finance_dev/models/getconfigwatchlistsop.py +40 -0
- finance_dev/models/getcongressionaltradingop.py +73 -0
- finance_dev/models/getcovid19uscasesop.py +43 -0
- finance_dev/models/getdailymarketsummaryop.py +92 -0
- finance_dev/models/getdividendsop.py +294 -0
- finance_dev/models/getearningscalendarop.py +87 -0
- finance_dev/models/getearningscallliveop.py +91 -0
- finance_dev/models/getearningsqualityscoreop.py +81 -0
- finance_dev/models/getearningssurprisesop.py +80 -0
- finance_dev/models/getebitdaestimatesop.py +91 -0
- finance_dev/models/getebitestimatesop.py +88 -0
- finance_dev/models/geteconomicscalendarop.py +92 -0
- finance_dev/models/geteconomicscalendarresponse.py +56 -0
- finance_dev/models/getepsestimatesop.py +88 -0
- finance_dev/models/getequitydetailsop.py +56 -0
- finance_dev/models/getequitydetailsresponse.py +45 -0
- finance_dev/models/getetblistop.py +40 -0
- finance_dev/models/getetfcountryallocationop.py +80 -0
- finance_dev/models/getetfholdingsop.py +96 -0
- finance_dev/models/getetfprofileop.py +77 -0
- finance_dev/models/getetfsectorallocationop.py +80 -0
- finance_dev/models/geteventcontractsop.py +87 -0
- finance_dev/models/getfdaadvisorycommitteecalendarop.py +47 -0
- finance_dev/models/getfilingssimilarityindexop.py +102 -0
- finance_dev/models/getfinancialratiosop.py +612 -0
- finance_dev/models/getfinancialstatementsop.py +117 -0
- finance_dev/models/getfundownershipop.py +77 -0
- finance_dev/models/gethistoricaldataop.py +61 -0
- finance_dev/models/gethistoricalesgop.py +53 -0
- finance_dev/models/gethistorybatchop.py +74 -0
- finance_dev/models/gethistoryop.py +123 -0
- finance_dev/models/getincomestatementsop.py +564 -0
- finance_dev/models/getindexbarop.py +140 -0
- finance_dev/models/getindexbarsop.py +149 -0
- finance_dev/models/getindexchartbarsop.py +178 -0
- finance_dev/models/getindexrealtimevaluesop.py +94 -0
- finance_dev/models/getinflationexpectationsop.py +157 -0
- finance_dev/models/getinflationop.py +154 -0
- finance_dev/models/getinsidertransactionsop.py +90 -0
- finance_dev/models/getinstitutionalownershipop.py +99 -0
- finance_dev/models/getinstitutionalportfolioop.py +75 -0
- finance_dev/models/getinvestmentthemeop.py +68 -0
- finance_dev/models/getipocalendarop.py +63 -0
- finance_dev/models/getlobbyingop.py +70 -0
- finance_dev/models/getmarketbreadthop.py +40 -0
- finance_dev/models/getmarketholidaysop.py +65 -0
- finance_dev/models/getmarketstatusop.py +65 -0
- finance_dev/models/getmergersandacquisitionsop.py +113 -0
- finance_dev/models/getnetinflowop.py +40 -0
- finance_dev/models/getnewsbyidop.py +73 -0
- finance_dev/models/getnewsop.py +98 -0
- finance_dev/models/getnewssentimentop.py +53 -0
- finance_dev/models/getoptionchainsnapshotop.py +244 -0
- finance_dev/models/getoptioncontractsnapshotop.py +69 -0
- finance_dev/models/getoptiondetailsop.py +56 -0
- finance_dev/models/getoptiondetailsresponse.py +45 -0
- finance_dev/models/getoptionlasttradeop.py +56 -0
- finance_dev/models/getoptionopencloseop.py +66 -0
- finance_dev/models/getoptionpreviousdayop.py +56 -0
- finance_dev/models/getoptionquotesop.py +177 -0
- finance_dev/models/getoptionsactivityop.py +111 -0
- finance_dev/models/getoptionsetfstopvolumeop.py +70 -0
- finance_dev/models/getoptionsstockstopgainersop.py +70 -0
- finance_dev/models/getoptionsstockstopvolumeop.py +70 -0
- finance_dev/models/getoptionsunusualactivityop.py +100 -0
- finance_dev/models/getoptiontradesop.py +177 -0
- finance_dev/models/getordersv2response.py +66 -0
- finance_dev/models/getownershipdataop.py +77 -0
- finance_dev/models/getpositionsresponse.py +39 -0
- finance_dev/models/getpredictionorderop.py +88 -0
- finance_dev/models/getpricetargetop.py +53 -0
- finance_dev/models/getquotesop.py +53 -0
- finance_dev/models/getratingsop.py +164 -0
- finance_dev/models/getratingsresponse.py +39 -0
- finance_dev/models/getreportedfinancialsop.py +127 -0
- finance_dev/models/getrevenuebreakdownop.py +85 -0
- finance_dev/models/getrevenueestimatesop.py +91 -0
- finance_dev/models/getsecfilingsop.py +113 -0
- finance_dev/models/getsectortickersop.py +124 -0
- finance_dev/models/getsectorwisechangeop.py +84 -0
- finance_dev/models/getshortinterestop.py +334 -0
- finance_dev/models/getshortvolumeop.py +333 -0
- finance_dev/models/getsocialsentimentop.py +90 -0
- finance_dev/models/getspinoffsop.py +112 -0
- finance_dev/models/getstockaggregatesop.py +174 -0
- finance_dev/models/getstocklastquoteop.py +56 -0
- finance_dev/models/getstocklasttradeop.py +56 -0
- finance_dev/models/getstockopencloseop.py +90 -0
- finance_dev/models/getstockpreviousdayop.py +80 -0
- finance_dev/models/getstockquotesop.py +177 -0
- finance_dev/models/getstocksnapshotsop.py +82 -0
- finance_dev/models/getstocksplitsop.py +243 -0
- finance_dev/models/getstocktradesop.py +177 -0
- finance_dev/models/getsupplychainop.py +53 -0
- finance_dev/models/getsupportresistancelevelsop.py +90 -0
- finance_dev/models/getsymbolinfoop.py +53 -0
- finance_dev/models/gettechnicalindicatorop.py +172 -0
- finance_dev/models/gettechnicalpatternsop.py +88 -0
- finance_dev/models/gettenderoffersop.py +112 -0
- finance_dev/models/gettickhistoryop.py +104 -0
- finance_dev/models/gettopgainersop.py +78 -0
- finance_dev/models/gettoplosersop.py +78 -0
- finance_dev/models/gettopmostactiveop.py +78 -0
- finance_dev/models/gettranscriptop.py +53 -0
- finance_dev/models/gettreasuryyieldsop.py +157 -0
- finance_dev/models/getunifiedsnapshotop.py +223 -0
- finance_dev/models/getupgradesdowngradesop.py +91 -0
- finance_dev/models/getusaspendingop.py +70 -0
- finance_dev/models/getuseraccountsop.py +40 -0
- finance_dev/models/getusptopatentsop.py +70 -0
- finance_dev/models/getvisaapplicationsop.py +73 -0
- finance_dev/models/historicalesgresponse.py +439 -0
- finance_dev/models/httpmetadata.py +24 -0
- finance_dev/models/incomestatement.py +296 -0
- finance_dev/models/incomestatementsresponse.py +61 -0
- finance_dev/models/indexbarresponse.py +194 -0
- finance_dev/models/indexbarsresponse.py +123 -0
- finance_dev/models/indexchartbarsresponse.py +213 -0
- finance_dev/models/indexgroupsresponse.py +78 -0
- finance_dev/models/indexlistresponse.py +95 -0
- finance_dev/models/indexsearchresponse.py +93 -0
- finance_dev/models/indicesbygroupresponse.py +93 -0
- finance_dev/models/indicesidentifiertype.py +28 -0
- finance_dev/models/indicesrealtimeindexinfo.py +67 -0
- finance_dev/models/indicesrealtimeindexvalue.py +157 -0
- finance_dev/models/indicesrealtimevaluesitem.py +80 -0
- finance_dev/models/indicesrealtimevaluesresponse.py +42 -0
- finance_dev/models/inflationexpectationsresponse.py +140 -0
- finance_dev/models/inflationresponse.py +132 -0
- finance_dev/models/insidertransaction.py +97 -0
- finance_dev/models/insidertransactionsresponse.py +39 -0
- finance_dev/models/institutionalholding.py +77 -0
- finance_dev/models/institutionalownershipresponse.py +39 -0
- finance_dev/models/institutionalportfolioresponse.py +39 -0
- finance_dev/models/investmentthemeid.py +35 -0
- finance_dev/models/investmentthemeresponse.py +80 -0
- finance_dev/models/ipocalendarresponse.py +39 -0
- finance_dev/models/ipoitem.py +93 -0
- finance_dev/models/listactiveordersop.py +87 -0
- finance_dev/models/listcategoriesop.py +79 -0
- finance_dev/models/listindexgroupsop.py +40 -0
- finance_dev/models/listindicesbygroupop.py +58 -0
- finance_dev/models/listindicesop.py +91 -0
- finance_dev/models/listoptioncontractsop.py +66 -0
- finance_dev/models/listoptionexpirydatesop.py +56 -0
- finance_dev/models/listorderhistoryop.py +139 -0
- finance_dev/models/listpredictionordersop.py +134 -0
- finance_dev/models/listtranscriptsop.py +53 -0
- finance_dev/models/lobbyingresponse.py +166 -0
- finance_dev/models/logosearchresponse.py +152 -0
- finance_dev/models/logosyncresponse.py +277 -0
- finance_dev/models/marketbreadth.py +97 -0
- finance_dev/models/marketbreadthresponse.py +44 -0
- finance_dev/models/marketholiday.py +56 -0
- finance_dev/models/marketholidayresponse.py +39 -0
- finance_dev/models/marketstatus.py +67 -0
- finance_dev/models/mergersandacquisitionsresponse.py +186 -0
- finance_dev/models/metricseriespoint.py +43 -0
- finance_dev/models/netinflow.py +81 -0
- finance_dev/models/netinflowresponse.py +44 -0
- finance_dev/models/newsitem.py +102 -0
- finance_dev/models/newslistresponse.py +128 -0
- finance_dev/models/newssentimentresponse.py +176 -0
- finance_dev/models/newstypeenum.py +16 -0
- finance_dev/models/optionchainsnapshotresponse.py +64 -0
- finance_dev/models/optioncontractsnapshotresponse.py +64 -0
- finance_dev/models/optioncontractsnapshotrow.py +164 -0
- finance_dev/models/optioncontractsresponse.py +131 -0
- finance_dev/models/optiondetailsdto.py +72 -0
- finance_dev/models/optionexpirydatesresponse.py +53 -0
- finance_dev/models/optionlasttraderesponse.py +169 -0
- finance_dev/models/optionopencloseresponse.py +97 -0
- finance_dev/models/optionpreviousdayresponse.py +89 -0
- finance_dev/models/optionquotesresponse.py +138 -0
- finance_dev/models/optionsactivityresponse.py +265 -0
- finance_dev/models/optionsnapshotcontractdetails.py +85 -0
- finance_dev/models/optionsnapshotdaybar.py +107 -0
- finance_dev/models/optionsnapshotgreeks.py +67 -0
- finance_dev/models/optionsnapshotlastquote.py +116 -0
- finance_dev/models/optionsnapshotlasttrade.py +102 -0
- finance_dev/models/optionsnapshotunderlying.py +86 -0
- finance_dev/models/optionsscreeneritem.py +151 -0
- finance_dev/models/optionsunusualactivityresponse.py +62 -0
- finance_dev/models/optionsunusualactivitytrade.py +103 -0
- finance_dev/models/optiontradesresponse.py +132 -0
- finance_dev/models/orderrequesttimeinforceenum.py +29 -0
- finance_dev/models/ordersideenum.py +20 -0
- finance_dev/models/ordertypeenum.py +20 -0
- finance_dev/models/ordleg.py +162 -0
- finance_dev/models/ordresponse.py +202 -0
- finance_dev/models/ownershipdataresponse.py +39 -0
- finance_dev/models/ownershiprecord.py +74 -0
- finance_dev/models/placeorderop.py +40 -0
- finance_dev/models/placeordrequest_union.py +335 -0
- finance_dev/models/placepredictionorderop.py +114 -0
- finance_dev/models/predmdbaseevent.py +62 -0
- finance_dev/models/predmdbaseeventhit.py +53 -0
- finance_dev/models/predmdbaseeventsearchresult.py +46 -0
- finance_dev/models/predmdbaseeventwithevents.py +32 -0
- finance_dev/models/predmdbatchhistoryrequest.py +16 -0
- finance_dev/models/predmdbatchhistoryresponse.py +16 -0
- finance_dev/models/predmdcategory.py +48 -0
- finance_dev/models/predmdcontract.py +177 -0
- finance_dev/models/predmdcontracthit.py +157 -0
- finance_dev/models/predmdcontractsearchresult.py +46 -0
- finance_dev/models/predmdevent.py +136 -0
- finance_dev/models/predmdeventhit.py +73 -0
- finance_dev/models/predmdeventsearchresult.py +46 -0
- finance_dev/models/predmdeventwithcontracts.py +22 -0
- finance_dev/models/predmdhistoryrequest.py +59 -0
- finance_dev/models/predmdhistoryresponse.py +53 -0
- finance_dev/models/predmdtick.py +53 -0
- finance_dev/models/predordersapperror.py +78 -0
- finance_dev/models/predordersorder.py +267 -0
- finance_dev/models/predordersorderdetail.py +26 -0
- finance_dev/models/predordersorderpage.py +45 -0
- finance_dev/models/predordersorderreport.py +88 -0
- finance_dev/models/predordersplaceorderrequest.py +159 -0
- finance_dev/models/previeworderop.py +40 -0
- finance_dev/models/previeworderresponse.py +127 -0
- finance_dev/models/pricetargetresponse.py +89 -0
- finance_dev/models/quotedata.py +49 -0
- finance_dev/models/quotesresponse.py +62 -0
- finance_dev/models/quotevalues.py +114 -0
- finance_dev/models/rating.py +193 -0
- finance_dev/models/ratingsaccuracy.py +242 -0
- finance_dev/models/replaceconfigwatchlistsop.py +40 -0
- finance_dev/models/replaceorderop.py +40 -0
- finance_dev/models/replaceordrequest_union.py +367 -0
- finance_dev/models/replaceordresponse.py +144 -0
- finance_dev/models/reportedbsitem.py +53 -0
- finance_dev/models/reportedfiling.py +110 -0
- finance_dev/models/reportedreport.py +39 -0
- finance_dev/models/reportingfrequency.py +16 -0
- finance_dev/models/revenuebreakdownaxis.py +52 -0
- finance_dev/models/revenuebreakdowndatapoint.py +58 -0
- finance_dev/models/revenuebreakdownentry.py +51 -0
- finance_dev/models/revenuebreakdowninner.py +75 -0
- finance_dev/models/revenueestimatesresponse.py +176 -0
- finance_dev/models/screenclause.py +70 -0
- finance_dev/models/screengroup.py +75 -0
- finance_dev/models/searchetbsymbolsop.py +40 -0
- finance_dev/models/searchindicesop.py +55 -0
- finance_dev/models/searchlogosop.py +158 -0
- finance_dev/models/searchmarketsymbolsop.py +80 -0
- finance_dev/models/searchop.py +232 -0
- finance_dev/models/searchsymbolitem.py +76 -0
- finance_dev/models/searchsymbolresponseitem.py +71 -0
- finance_dev/models/searchsymbolsop.py +77 -0
- finance_dev/models/secfiling.py +91 -0
- finance_dev/models/secfilingsresponse.py +39 -0
- finance_dev/models/sectoravgchange.py +50 -0
- finance_dev/models/security.py +59 -0
- finance_dev/models/securitytypeenum.py +16 -0
- finance_dev/models/shortinterestresponse.py +126 -0
- finance_dev/models/shortvolumeresponse.py +198 -0
- finance_dev/models/socialsentimentresponse.py +124 -0
- finance_dev/models/sortorderenum.py +13 -0
- finance_dev/models/spinoffsresponse.py +136 -0
- finance_dev/models/stockaggregatesresponse.py +92 -0
- finance_dev/models/stocklastquoteresponse.py +175 -0
- finance_dev/models/stocklasttraderesponse.py +169 -0
- finance_dev/models/stockohlcbar.py +85 -0
- finance_dev/models/stockopencloseresponse.py +109 -0
- finance_dev/models/stockpreviousdayresponse.py +86 -0
- finance_dev/models/stockquotesresponse.py +170 -0
- finance_dev/models/stockscreenerop.py +144 -0
- finance_dev/models/stockscreenerrequest.py +131 -0
- finance_dev/models/stockscreenerresponse.py +197 -0
- finance_dev/models/stocksnapshotsresponse.py +454 -0
- finance_dev/models/stocksplitsresponse.py +144 -0
- finance_dev/models/stocktradesresponse.py +164 -0
- finance_dev/models/supplychainresponse.py +158 -0
- finance_dev/models/supportresistancelevelsresponse.py +68 -0
- finance_dev/models/symboldetails.py +119 -0
- finance_dev/models/symbolerror.py +43 -0
- finance_dev/models/symbolinfo.py +183 -0
- finance_dev/models/synclogosop.py +146 -0
- finance_dev/models/technicalindicatorresponse.py +43 -0
- finance_dev/models/technicalindicatortype.py +21 -0
- finance_dev/models/technicalpatternsresponse.py +249 -0
- finance_dev/models/tenderofferidentifiertype.py +26 -0
- finance_dev/models/tenderoffersresponse.py +548 -0
- finance_dev/models/tickchartbars.py +104 -0
- finance_dev/models/tickresolution.py +20 -0
- finance_dev/models/timeinforceenum.py +26 -0
- finance_dev/models/tradeorderlegv2.py +164 -0
- finance_dev/models/tradeorderv2.py +434 -0
- finance_dev/models/transcriptresponse.py +162 -0
- finance_dev/models/transcriptsresponse.py +89 -0
- finance_dev/models/treasuryyieldsresponse.py +160 -0
- finance_dev/models/unifiedsnapshotresponse.py +308 -0
- finance_dev/models/updateconfigwatchlistbyidop.py +65 -0
- finance_dev/models/updatewatchlistrequest_union.py +134 -0
- finance_dev/models/upgradesdowngradesresponse.py +98 -0
- finance_dev/models/usaspendingresponse.py +222 -0
- finance_dev/models/usptopatentsresponse.py +134 -0
- finance_dev/models/visaapplicationsresponse.py +228 -0
- finance_dev/models/watchlist.py +68 -0
- finance_dev/models/watchlistrequest.py +43 -0
- finance_dev/models/watchlistresponse.py +44 -0
- finance_dev/news_sdk.py +829 -0
- finance_dev/options.py +3443 -0
- finance_dev/orders.py +1907 -0
- finance_dev/ownership.py +1386 -0
- finance_dev/predictions.py +29 -0
- finance_dev/predictions_orders.py +852 -0
- finance_dev/py.typed +1 -0
- finance_dev/sdk.py +347 -0
- finance_dev/sdkconfiguration.py +50 -0
- finance_dev/signals.py +338 -0
- finance_dev/stocks.py +3131 -0
- finance_dev/technicalanalysis_sdk.py +1137 -0
- finance_dev/types/__init__.py +25 -0
- finance_dev/types/base64fileinput.py +44 -0
- finance_dev/types/basemodel.py +78 -0
- finance_dev/utils/__init__.py +181 -0
- finance_dev/utils/annotations.py +80 -0
- finance_dev/utils/datetimes.py +42 -0
- finance_dev/utils/dynamic_imports.py +55 -0
- finance_dev/utils/enums.py +135 -0
- finance_dev/utils/eventstreaming.py +327 -0
- finance_dev/utils/forms.py +240 -0
- finance_dev/utils/headers.py +137 -0
- finance_dev/utils/logger.py +23 -0
- finance_dev/utils/metadata.py +120 -0
- finance_dev/utils/queryparams.py +218 -0
- finance_dev/utils/requestbodies.py +68 -0
- finance_dev/utils/retries.py +373 -0
- finance_dev/utils/security.py +199 -0
- finance_dev/utils/serializers.py +327 -0
- finance_dev/utils/unmarshal_json_response.py +39 -0
- finance_dev/utils/url.py +155 -0
- finance_dev/utils/values.py +143 -0
- finance_dev/watchlist_sdk.py +1583 -0
- finance_dev/websocket/__init__.py +57 -0
- finance_dev/websocket/account.py +5 -0
- finance_dev/websocket/auth.py +124 -0
- finance_dev/websocket/chart.py +5 -0
- finance_dev/websocket/codec.py +66 -0
- finance_dev/websocket/config.py +52 -0
- finance_dev/websocket/errors.py +54 -0
- finance_dev/websocket/market.py +5 -0
- finance_dev/websocket/models/__init__.py +52 -0
- finance_dev/websocket/models/account.py +60 -0
- finance_dev/websocket/models/chart.py +44 -0
- finance_dev/websocket/models/common.py +85 -0
- finance_dev/websocket/models/market.py +113 -0
- finance_dev/websocket/resources.py +327 -0
- finance_dev/websocket/sdk.py +13 -0
- finance_dev/websocket/transport/async_connection.py +493 -0
- finance_dev/websocket/transport/base.py +78 -0
- finance_dev/websocket/transport/sync_connection.py +470 -0
- finance_dev-0.9.0.dist-info/METADATA +913 -0
- finance_dev-0.9.0.dist-info/RECORD +486 -0
- finance_dev-0.9.0.dist-info/WHEEL +5 -0
- finance_dev-0.9.0.dist-info/top_level.txt +1 -0
finance_dev/__init__.py
ADDED
|
@@ -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,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
|
finance_dev/_version.py
ADDED
|
@@ -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
|