From 687f179dd629c7dee0ac98622ae7bdbd3b61ec9b Mon Sep 17 00:00:00 2001 From: Katya Katsenelenbogen Date: Tue, 27 Apr 2021 11:17:52 +0300 Subject: [PATCH] =?UTF-8?q?documentation:=20classes=20will=20be=20displaye?= =?UTF-8?q?d=20in=20documentation=20as=20'transfo=E2=80=A6=20(#206)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * documentation: classes will be displayed in documentation as 'transformations' * minor fix --- docs/api.rst | 7 +- docs/build/.doctrees/api.doctree | Bin 328281 -> 299769 bytes docs/build/.doctrees/environment.pickle | Bin 22712 -> 22614 bytes docs/build/.doctrees/examples.doctree | Bin 4945 -> 4977 bytes docs/build/.doctrees/index.doctree | Bin 10263 -> 10311 bytes docs/build/_sources/api.rst.txt | 7 +- docs/build/api.html | 269 ++++++++---------------- docs/build/genindex.html | 83 +++----- docs/build/index.html | 4 +- docs/build/objects.inv | Bin 818 -> 786 bytes docs/build/py-modindex.html | 15 +- docs/build/search.html | 2 +- docs/build/searchindex.js | 2 +- storey/transformations/__init__.py | 14 ++ 14 files changed, 146 insertions(+), 257 deletions(-) create mode 100644 storey/transformations/__init__.py diff --git a/docs/api.rst b/docs/api.rst index baf2ce81..1b819857 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -18,13 +18,10 @@ Sources: Transformations: **************** -.. automodule:: storey.flow - :members: - :show-inheritance: - -.. automodule:: storey.dataframe +.. automodule:: storey.transformations :members: :show-inheritance: + :imported-members: Miscellaneous: diff --git a/docs/build/.doctrees/api.doctree b/docs/build/.doctrees/api.doctree index abec405a93a61dc7aaa34fbae668e006e437600b..8c5fc116ed87b45f37d2583eff06998ad97cdc2b 100644 GIT binary patch delta 39509 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 CKp#N> delta 46839 zcmc(|c|cZG`Z(@A_f-LxWL3cBMMM_a#SIm~1yN*CQ4v&p!Pnr5fGnDoqLxKPreU5^ zGi{l+nY5MGDQ%l}%{E)LX`6PZrWsr8_bhh>vidah{qe_px%Zy)JkNQy^PJ}__tZ@R z$1V)ouwCh+bi22&;;*##2v;U5vP39Z^1^}2jdHxI%#-T|DU;;W_@Dn^Ww(6arA(Bc z4pv6U^6tvSwwXVr$iKor^06Vx0vX>!`I{{1sXQldi%?2Ln!h~xnHVVFyH3dvlls@^3phIa5sZZ(Fr{oXGWWOIe<#B+HawB~VsGDpz8yte=$FK8yXkb*mhht5k+* zDgN@r$7)FXlwnG=;cM85&D%HyH)|E0V zSD7LA4p)ZD{AgvpatT(7m0PbAy?bx&y4<=LWu|g9mphQC^zLJo)1-gfUw@jA!OV!v+Pv|y!Mx7H}>=>@HQELI8c zv&kd^fp7dStSvdBZ+pKuMNxbn#&==bgGkHBzS>5-Wrno-%e~9g1ZQoz%B!Zx%O6tu zidX&RonAG_msk-FHKqTpN~TPWSE`X$Cwsc$-$5BN3rzkmMXnBpZA#!kxX6T2 z%AfIeW8g@!ETGL38Y?^jZ4q}y$)%%}`Qj=rzm3ap3y?j>DER_zvHTWC`M1X?>&2s7 z{vj^^P=NgU9;H#hEtbFEC@(jTQx1uLaM=&3tj~u)ZBuz=u>2xjnJLe0SN!Cc>B=kt zud(j?X5EtyDnsRg0Hvo`5+Id7iCB>rAhXioIx|2HnxN!~h(Kn*;6Q@`kDU;)?N3io zq7;!Dh|EiIg=tBFTzzn$Ssh@<0y6<)yxcHC>FE@NP3x8d3eY;#F#mPx6uEwqvKns= zv?+7i9{aw#+&f9>E8lxW@t4(^$||u2aEumdq9L%WB9~<;qr^pls6c6b8jxzTX>D^L z*`VV|XH{AW6)aU+8EC4~wUd>kK6MUoy46W#iZa*tHhdMP-9j8m?W@(|JzL#Pfoye- z+P3yT&h0m>t`=zbsuA+*2Bnu=8V0&~;97NnIKri_dQ+L!BPy$5ZB2zd`8r51|1zZ? zaVc}IGDNPJrVQz(_xr@`eZrB0CQVlKr|X zbHp(7c58PfQKXu;pLbU>MW%UM(nF~f`R47{J(RIx5#1^Q^5l4EB)C_f9Vv<{$$_-9 zFyDptSi*caP@deQq=ohf0^_KRtt~NNzYLqU8DG#Zct$Sq8UQ{O2Okk#cJ=n7|ECN!N-s zLDV@ZH_N16${Kk`FD1oC=dbl>yzif}MwoV65WA`C1~HC)P8Nazbrt6`Qzy^L9hu_;sN3H823cAe}!EoyuY6DS56Jg2?qK596~q@c=Yo zTdV+%9QZ;RC^xK99u^hB98n|(f#TH!%cVieAW;`gQmuxTfmF{8?oz75`fB&H%zS_d zfI~5c?GfO?5JHWuZ<0%fE1`W@Fz%J!#>(1dGI^R3)VARpmrM*%LXjw?Nq1@yCzbdf z{>~W{xMQTF!`K4^*%W zU{5f4vt%>?jwsHuu{p86sb;%j7yBHT3`ge#Zs!V88+~o241vfO-)_d0` zHjqVxA{G}35tg3|9zWnRA? zhApvo>p_mKefyirkRGykhF;utLRqBTDm^EZbv?PfpIrLB5-d-jPzL?6o zOL*!$%!1F_qr9JWgRz z1X`lluG{17GV>>hfnPz)Y@xSAV!spIzP_i35d*GLx&g89N4>rF4wehk-ioB&Mh6?z z87u(7{zmzlXao1}l9@-8p1xmT{cva<_d6qdiHAk6Vc2yjJ!M31F$gY`dW(~AN$CS2 zoNE|%JBlK=^%3`rQCu>GOQy(c`igBz3YSc@m5gdXaF&>_h%zo;O65iAu=WN1qDUyE zT%(w32xXWwqg>@Q(|bIc(`e^Ji^Y$}n+WhE(kNQkHqj|^iSe_$9ej0c@LWKO=sY%DKN3MFu)Q>XO+ z!THds=+6(MxUP={S$l4nytTg=BiCUSsSD?SHK!jSBfVe;7lB2#>C z-eUBn_{deEVg$a;dRK`{azIACa&|iR0C=m@xn~%5I{nXJA#X!@!$R(}lV-(Z!=pGJ zONqjG3?kwafr5=A3IElNV`3B;$IvLlINlycftkXb4K_K8kt`bn0HzMT0P5(EBBLlS zlZOV1eLltbJWQJ}PxKeDZA+*3Is+`INH(zoNs459sKol=$YvNe7PNmlSkx-YMMQI3 z-7tT#DT?ALxL`c>yj#S|-2(*0Q;Okcks}948lFbLfFut^&!+4))vBUb> z0V_%AAtNHh5Q+r#=IkCOMk)Qx$4Zd&3>EPPEuq8BCe=oX1SQEV7`zF%)>N)NFS>Oz z#vxjYTy?F0M3Y$xX~p;wE;#(&6xF_HxcEfDdk7SjW~4YyoF7Hw@8@E~aYf_0$oJ*L ziSKZk{h7|XW)reI-yV)@xcY-+2zCacy_ydH%3&+i$;hS@Ezcmha$wVwtf*k z4eZe6ONil!KZyNq#ts)FidLStus`F#{-TZ@3L|#7D1n0@E%ja^I83KM}G>7cba@ArnOWq!)jio+c%7{xYLnOue_FcD1*DZCOL3 zw{Bv7ZH+hH-RP}fSykg{tg5XktM@iERX3I`ubDVuc~eaVK67VdoHL=?v$A}dCnF=? zT~S-p=sl-#qAXmkOcR@<*`aTY28(Bh&UDPS(}9i$$Jgf@dfn=D<-ftdZ->AR#_cmL zL|Pl-B)HbN-N$IF5gb_$HXDO23XHA?#eh_a)+M~%CY>e!J(jf{eD_z)8V#Jh-lQ<`_X*HI^n0u6-1DjIPV75mk(AVlq~3;( zpoSR;&4=8k!xjK>AX-v~`>yjD^}1cj$Cf-k57=S#y5~g$gfsTKHzND=EXaD)AI_4s zfu%!+l(HZ{Msu&*GlsGtzA-dj?jA$q<-i!~Z2tpQITF1wnmb$8`u-iYo)Yo^k-FQc z7*tq#bSj#{(Zb^C5QiE%+u&}j^t!Xwc&Zvb<<;IfWQ}eZPSjRZc^bXT+-s^DD`99+ zQ41D(w%fbfThrK(=$BsSsrRgO*LYTX)1~JUF~e&BjD?qtYwNuH4n`#PP|qm8ys5gn zj9{d@7gWNy-COT&tOfhlT@WGj)VQZ18h35E=B;RS$E>OJ*0_u6o4m2|V5%6}?4Igf z?g6KPRkJ%AEw2};4lM{rRz`u zO?@c57N#g1I?3Vp^ce0T-Z>3X&$?)uo9H=s3c2C72sJPqbq+?DfsV+Vy)=d1{qN+$ zjWJaaqrJMZLFCo}A1bjRK0G*0$x;@}%+X?$SQsPo2D?T`cW-rIp>7V;WBlpbW5cvYh@cMvMO-pZq)U$-7vd-lc?|HMBGQp#BEw zUA^?TGKJKRR&YjF$Hlb(9~^xF^s4oX7rQ6A9gY_s$^$vd0I`#*MRuwdWzgf$fuJyh zq+fX7k*Zq=d~zr7XR+_-M40}ZX}gaq5AIYs!l2F2zTjYktj@1GQuG7?o!$v(xNa(z z3VSz|51L{|S)6!UBS)A=Y;y?>f-S99o}D#h0^ zoY4Jpf*L7)h>`vNqz(~3aR+q@=z@f9&sgf9K8L#8L7fkECaU4GGRifSj54HyQBr>d zkg1CbjWu1;7crcvFO{AxB4P^LLWA2=vkYUvW*1IqscfJ|%Fh9aF|nmd-~2VNb1rp7@_XoxyW`ezzL)Kmlzu7Ur+ zna#KnhMF1FB_z0Ku(xzCtAdWNcDb8hwM85a8GBZT;zkoYJvS*PyDdZlcziM|7RMU7 zvw#dR;o#N*U1J08nIO(k23RpmZk#64VEP{0NW-w~SR4c)F*4^OlqIKq5Y+zJC z=SoH!tyl8MGwJ~4T&q#5sZq068;uI@*eDZ;qg`h#22ESdO>5}bwCGraN;2dwn?-J8 z*67mVCpc#KJk}ajDud*zQDQ)t9ws;vblFwa*yB@z?%Po! zSBN+s&z(l|uqWs^3H`!oG2r*-=KSNh-?o5i{o-Wp7|6{HiQ^2k^VK8OB2T2mQF1OJ zjs^!}l6gyh*HHm|mNOf73h1}|?kNaX&pa-Oh_n3e4`$neOd1z#Ef5RDVqi^)8sE0m z+ha$qh*BzLR-qUxv^W|cEC=$y{Wivt`&|g&*!@Pt$w75uq$7dGTsM+&2p3oITm*IW zXs{%XlX1f*h&8@f;PWu;@;FXT+p~I3Ku`Uis8s=TD%dJAvTFefJ~ST zeISmqBXGe~4CcMW%RojPTwjXg`OH_~iu0Kd04Gk}M=7r0r-|ECt#Yl1lgk}mmKPan=XvV>co07*o}GbTJZL8e@dE*CwFr`R zc_K=Th-Z)Bd`})>Vmx_-aq;XCa?M-v2#yM9N=}c^9q?Hmp?mzVd4vQgZ$x4}?X+4R zp$h1>c?8i2r0)QywmP0%LOsy8dz`XC`kyUE_4Wb`b_ogbHxHM|R?plf(5o?XLnxT0%#66itK@NfOSUgyI3A`2%^RPLAcH8NDvwhT)=RAxDKrGnpiBx%CurJ72lw*I22F5;?a2W6+ah? ztCc*4f^K3)0yPURrkf}?amc;3BEm-CGA0l!A!@h)YQGr?NG`-`vvDoQ99dQ>mf}0K z-)tS$%3k8pcs(1v)55-kvF}KrY_zi9#H{?eBXjQ5aYGfv4HxtmI}&t%0r!Zn&5qCJ zFCLC(e{nmA1pUP=zzy&h%aKL8zi=qC?k~QHCx78ewERV{p*f9>b#uI{n!F8|W*DN! z5B=?F2CGOT1rdWYY)@i%F-W|-slGbiU0%Cv?T#B&x7=}!GDd_Ya-0#82#UyYMjqv_ zi)eIWgYw5cPHZB1oI(qi7K3Ozq>g(zkm^gm?9ZH$;h047Qz>0SwQ>n5T{EG_Zdlg0 z>~1wmezsn?DYct04Ty3K=T%^w5vJ1rHVS0cRv5})O4!G!C%?N@je{wOjT`l3ae(p0 zOcoE8U++@~`x-#`Rz8rUoTW5a^~5xg4i0X+YMX6v>kkB5F4aHr*Iep2Y@j~44MYjB z`;SSa!R@w0+u(M0A`NbpJxCSLdG2HaaX|nq8p=8!eCp)@gnjBbs0^cAuy~vVp;$N3 zE<4?W0uFMj4_qqUX+>=ZF9;!}RZfyDXrk?lL~^WfF&wMt zk;MIln#BEu4_vXofHLUP-~ujf<`+N(xzqk#B6BQ{`^6%_2LOj2@lzxzPJEn*?tfwi zn2w`CMV|Vzy^Zd9b7r|?D#5X_z~G+-cSA*`ccmAuO?7p(^^j-Bc1E1Z_yFsqBsCT-%g){HNUqe(2iKi z_S#wkNlBj(b4Fq-7)2B8-XLW_4=Fv=>+!$jpWItXQ2q$ahvKEtuQQ&b0sUx zh?XRIGDICdjOrV1raRx68cZYWeL9==IM{T9&Zd^6wk;z^iU;&UaBK4SS^e45j*8D) z6_LL!#NW{^27mk5iMJ2YJG=ny04@wCHrv@!uu8XWcMN8OU|!TyzcwEEgPGPu2Yd9A z@wf&I=W~|V*003$k%tmVT(vD?)&Sp{S~r))jEj8aPBmH)a@8(9L3ElK3Kwj7>cg;B zpg+Eig9QaxNYbhVUAsbIO9)ul*wfTr#}b0p?nI|43%+y8B8dQt(=5D5YLi)k@0=Af znUaZ}DVfZa04&n;(<}$33qq#?Lk_={OH)iPIZ{Ty8;-vn4oDg3Ln;4YNZE>^ln=;N z(!Bmr=r3?y|1f(`O1*4Bf1}4zj$TZUrNWaambxn0ilrt+a$nR?S6kEY%ai*9I)_$V zgJP?&Fgp-%)}F?u29B%bi4S4eaeFck-fjlW<5Zr3nP=-37}g(;ryfkEcq-)PWZjK~ zYY*VR98bxD0cyJVTQWsQ6S9sbT4fWeKbUQ zhFkX(w~l(3t?(9Nm*@0GLSbwqTp)hSIAAo=pW-)*Ag{fD?cyag6+mFj_7}v(lNF0V z3dXK1Wg$Pu>D450g{nkss7R z>APB_irJ~0?{d6vU%y)9sG=g35?*Dgv}G{KQ3Orinc*4%7%b;CBK6mt*IX!XIIjdd zb(G;c%THY-Hm0%%yTnh;6s@W9IX`uR*pf==txJJ8$ar6!ioPpw9RT2=7=qREU|Ea2 z;yf{2?mu7jlFPnSdGc`}^+$#*ig1~Wkp~A{ zC%k?ONT^R~ucts0a69AU2qIhq{!`kkwprXPPCzpt?e$J7Dz(o$Py#JizPCYCwS~>} zlgBrR75EmTg*Q_vRDL~`QcN#z6bE3hTFN8rPhfHPozI9tqUT6?bd&fSTuH}WSb%k0 zuQ&8Uaf2N7AS_6P#1t&_##(+UBXyTCSEgJjie&v}Q7%##L}Dipr5A}$l`;!;DWfhO z*}mgqF+mZfT(P)Q#f6uMt8h)fLGxy=xOt?Ubg6hsZ035KI@N2vOdM72w(9NYdizJ} zX{r5O@z0$q&f6j`fVH+J!edNalO~<^(;pqUPoUrxMR1OHNHteS*nm8jZfb)Lpb$PF~Yz`DE%MpP4{ zPh&ST251ct(@Pw7fwUU7flE`)HxoF&d)?&BG4E(o4?#sVZJB^^L zi#N_br8tfJmuE~@7_3My7rFh%__o2NgtzUyE*e%e`#+MD4dNU`+HCowjy_s%6Gx^=uDLaEJ9UnVca=isnEKlRLjR&01C>ZUEWwu~66`E%G z^HdPznddM|kQI6`nr4@V<vAxbzVvbFGmq9e9>l)l%Pemm!X5{Re$Bp_=76e;bRClZ% z)BLvLalYL~0VWvXrEy0Adq;nbMj(jd%RqVLIhwT4_x1EcNa5OyH0m$>hv_=(j+t6t z1?#9|+v=|?P!h3HvWOc+(Ii|Tpz`U#CAQ0J#;b#rDF)nLaI65L;NWrEC=MQ>4(2Ri zmiz_iKj1E4?^wKGh!m|?g^7h>qp;gaT;Xs$?wD+2rFIOh)SQ^1r|~FO%$7fH6oX~> zCUG{b?ec##u0oDaQqjhgkClQAX;SDImEDDTnCa1ldRT8^fpb>{&*~Sfu+SSM6g4e%y;6gCzrFQDXn;D6s)4Rxj&F_R146u3#3{iA5qrE{bu*ixZKy5`p#$)7VhO1-|19-<7nQ0bT>9QD8j0z|)eM(c4}7$NCIJ3sa_X@_k_$3-fr z-J7E+c4Q+CT4(huCgn2WLXk91pJ{-Vbj#~&SCT7CG}ar_QacDC+%cZ&YIjoutk|~T zK-Rjyyyik!?T|QzS{gToJ<=GfrBlYRT4s*1tL3yYx*r-tEroj6(zr2tOErv0N96u0 zVefCaI_~`q*K|poBW1mu0A~Fvz+Y-900XT6GBGBP9%JLHQcYX<YRa+r~`08&a5#wQ%alq30r>?o1>|=5~M0b z57Q68kp4!4ex5ZJe`6A#U=p7gLo>$W9i6;49pt^IlLv*7Jh%XPaM6QuxJL{J4GdOb z4ZFnA1-Idj(0-$Mgx!Z8N!k(mTpHBW18heqp^vbON6`p7b*vd^PgBBZZ3*p~h3NV$ zdvq=L<%$eB_)3uj>!4D;gYABFq|nr{(7p2HFAVQt-Y%CyiT}znlLd@t?;1Fg$ikz| zA1mA1L<-E35*c)2k@GdKG=YODQhw4SOwllwBe>1ZXB5FXs$zWO9Fb3g23ir^q_Mvi z!JQ4|jR-EwWDXEb5ge^TyJ4(z&B+~OY0Zgp0IB034hCUJJOyzNj-|}vbpVW`xU|BX-AQL30FSZ6Z0}4xK41O5=B&> zAT4^v?nA5_jv}DZcg0SzN~q(=RsB4cToqi*9(2Gsc2&XScoH!Tt~iPKGmwLePEz#u zdYvnFixe?ge>Q0xxwnLI6u(U6n!!H<{;p#SQDOl@Ljss+NPz0(wPHTrV*m3awS|_} zo*GLTfEV|O?c(BbZ7FXgE90mI7XV7brR>&$UgMxQ7PL0)_!YjImyr|uLI#*tIVNVhqKA#%~pBFsp)*>^9>>uwg2`ldzw zgo9gP;orP;UKlbv9h8NA18=S3GXA%Uu-~79Tb9l_I18v&kuLAORg4$)>70IZzIywV zQY0=+r|jE?bk4pxN}zQ(Z9NwVwro8&{nu>05y~63o^Li5=ptLEooLsm<7jP$_)9wN zMBATEdAHkvEXcb(kWQAp2dc7VH>TTnq9q!ZJq6FBFmi0yBU0PpYghHs&q0v0Z-L|0 zoaR;@tAFb+;@`fn;PWu;WmphN8<+ANDy$o==i$sp&B=S0ER_likk^LUwZ zpBN8|RDo{pV=iEFsgKzVQ|+zt{jkY3f-XB?_!FI3C7&;Ti}FdzbbH9uz$k z1fPG5SZUkrK}vFe-0) zL~K+-ZO=pSe|i0TlGWa6u3J+IV^Fui_KD#opwoP5_KQ509tbBJ02@1{T~Ejrs`) z?^qBFj@P_~UxR;X^{Ou2{u5cc z%w)ag31$Un!!yk1u;ix$piBmIrdH24tDmV8=@H65Kyakn$0TC*k zv0*7((sN>;vXv|28rjx~q;RdUtOL$WP;N58D%az`b|&1cGXbg~KDc;p8U)8wWWFGF zf;vTvRMTLZfthF_^t>pJz+?bDMuf*0;V~WIKTU-4;3$CR!0XF5FK2gc|OM` zlBW%pBaVo3<tPq*X*cm5zY&2bU5sJ7#tBsI1jM()39d^nx-D%I6R~t;kYJH zgfl(Eif~2_n&Vy8^ji2>WX4l@;;0%dS~D;X^JxJh&3;wvq=%v@(2KADMpgQ-G=Vx?2rpMqp$6!xoa9{ZqqU1-9XHZ|+L!**yCn^KS!Loo_SX|Zs zOE;^%ZsM+cO=T72)Tml%+UCmQI>@2ct>8ujS~Vn~G-a`(&P-OFoWx&hK?uyxf_2dA#k)>T}v=R|`0 zT^lPs2tw9phyk+oA>kWLSPa%V)K!k30$vuq+t5kmPT_+6cUlS@9SgxFwv7UcvG~6} z6EJZS_bE^o{Tp1szcmkq)`P|ew_>#XKW`nZc(x~DE9b8Ke}xn@1X_$i(GcWGoESI> z1ES~(5Rq+qLl<{EpGXnwo|wU>Qpj~X#lT>cTt!oTJswuUMgWqNS_bSEYa~vSOzK!B za4}=5OKdW^h-E@E6NOL)WD4W2${t@sK(aP}ecleyg0&(UA%~YCVUuJ4prX z=ngv2>CwgORvm!F@!2QVGv&k1a6Way864|2v{k^rPA}dqlT$5BW{9uB*hZrYK9RF$ z!nwEpdeOd_lwr|%6qrfs8{8E?IDQkc77o;KK!qC46+pvBo3mKx%)lJi;zsf=Wonx* zwCn5t1%fZCJZK+KgW9(e*=T4Vomi>&dR78?ekSFs=46s-!^O<@tk4@+>EO&t=8S-n z*lf69Ts9|@b{y)^=@3j<4~Ag`r-q>z&?5>mDGM}klAZ;+fstRw$ghJ%xDcj^`*pN~fG zI`H?Wd{VP`96!Vas-sKKWU)*hifumYTP89CHob z!jSaN#o)NjvJ#Cz|qGg zS)3I5b8mIO?_cqGnD#L2#l?X-!{Tiyonb*u?A*nXEMAHAB32GZkx(x91Q>rI(Q?6wSLaHZsCQ=`+i`#W7p$<(GKcwH^?|}S> z1F}9%eAKK;bQKR!Q^W`QvlEW$AL-ociV&S!KbpYM6X|osy{E9Oe5crX-**c45NCik zOs@zmLyrX)^jOfwpTpFhc#90Lnrvsdd!V{Y%$`CF&znLFhl}BoqH-LAh=gY0EH0&ToA#| zDZ2B8d&D3K1Eko&%pfKVfa9Is%i=@5U*uWb_r^nJ~nl@1>Nt4Os27^ z&s1w{I$>COQ&sh{GPLg)I9VAsr0|)>u-==FCc+mmS7-OgiAEJX?Rermf8!P)&}lBQ z6cfb!ktJz^rDwAmD{*SBci2?$13bEA2a-?D$ik{;bgdKq{Os>|m!|!ZGqOowR5;DI z&_bofBUT#kTI191)I5%Otkd=EPlH?aJ134wa@z%Z?iaUp;r~Y0kk}PY+c-2B=&-s5 zIR1Q-I^YaP#wI~=qi5)EG7egUJwx-=lTp}kKo2d*;?)BlcXbtve(>-bJc!55 zRC-{91A7}Wx}wK!Peny-{W5w+L045hY;A(AjK&rw1d`~N4;vt1l!P~crQVAR5cKnY zV8>)LZkcqK*L!MUI~^T>jqpjDMi}`&rLf@FNjw9Erbx9iWNetW7&RwN@6~AUvuPQ% zYm6SUL>Gd5=ig#x^E1=V@!;8c4e2(8j44GHr^FMdQ~5G-ajYKYMxhIDIOp`FKUTr0P=sF6Wy@D9fDco~@62l(4CRW_Z1nc?QA zm9v^>SvLL0`DM`c+kuY$4N|Z*Z3{Q8m6}E$xM5h$2yO~itEk^ax8RbiiqCto6#as#$0ylsJuEJY~s?<>Z z&}uGc*qm7gJ~Qxu2&V5ADUUHK${jtzfa0f0{B%$J2qcw`i1N7WY8%1o;3PyCX4Y6< z&GeIP%AlZOzrpptO75N#3rD76AHVbnAf=Se&|k-5ajNyVlm?ao5(pfW7pavrLVIK? zjnKq{Q|Y@!c%=Llu(Krjh|=Hpw1WZJeaRnFHVj!|Xh_G$rYCIe_y!0Fn1;cAiW;V! zMTpuS`?9|{?Vw?Ja<4g*badm%qXrhoGZO{nkdtjBCrl&Z>oW6mWkY~MAY@ji2$cSp zDE(o@2{o}_lo-%<`2D2NRxYJI4Hnk|-J>=f{sCHHTmr0U`}&DsAUDGzH({E|GWu3i z2{Kg=tQ@^61y+N!xj>V)(FI>3^D&n9Z`Uq>d+q#bW~|jmzU)j09Bh*D?!nJ?fFi3E_>w&iL@vauP-d};d_MOT2Of0Q~%)h?YTkEgjN zXK@0dsCFtK%|@i1&*(QHL(n%=j{(hRIw}35)c$hm0Wq}a35F;SM5*~fuu$7u-&lrg zk1J}cn^xA8c^c%2bCl2^e$iO9(%a!p0KchPW_zxzh0mERfzOhNJ3tILp?}*nIcbF$ z0biX{BRcWr-Qnt46OB)2SdQqj^2DW z{1`L?XG6@6IqsJv6e5ogQG9~W@P3aQ&i^=N0gvtk9F9jM@pqOoLk~Gq0R%64W@Bb0 zsuN^5!jB+3v;_2u;RgNkYl0d~P?15DpouhZaTchzUFtGoiyGMPCg7SCaNjhIaxr83 zbu36#ie%3Ih^%a0sWU5^W`6RsDHSsl$bnQ$aW>8TOw2Y?F)vJ` znIBnLCx&*Z_dc9%0jRWALW7!m1|}n$GB8>5%wWF`(%hZ~w`KLTY?#h<=EFL93JA}Z zhDi*wSexfW&`d~v@(Aj`0xrmwj@25F<}huQ+;}z5{Kz$DpSiWrG)fU&l+7uk3lKuM z_V6@L5sgh!uM_)#qmUxHHk$_2*JjI@WJnyrEsm#mX48mWW>Yfef)sU!c#g|I&E=oY zmRc(08{rnqKVdH)+}5T2WF)DBmhu}I>%dVC`b-k|!G=V4K^+|hQJv^FW4XJg77jf1 z!VxjVd)yw@z!OaP0w$SEC^TV*ov|Sd+QFOJr4KO#)a6Tg!HsGXMIR@rfqo}}WfXm! zCzF%aP#EQ*ZT;^EckJ|KoR$9%aDrYzgHeQE+C><$gK?L2@KPwl@-E22V!t9pD)M`z zI5oIS8VoW1!dqvj1(RU6!J?(`>8Rv>;nQ`Qt|OT?|L+^(km|a8j3gj|fC>veznqk; z`c?fuAp*o4E>9kSQTPDl2&~Y7l_YH4L0fe;JGu=N^pY+}n=$oQ#0&*~kB~D1yTERU zxXX7=0ncCoPh$a3GX%Vr1YG^UZGc0#jM4i)#|V;~#*&9x8gF(bZAOY~qb24b^9+K~KS2 zF>epX%t)*V)bTjD)wp%yf1Bln$F(SL@c%}(H0epO1Uff~v$)WM7Zw5zF2SN147k2wN0$F^XA%<~rnzJ1r{hJ4p13Q|4^o@d5wth|U zm0ldw`I_1#H%6%si}5-7&i5Sr+$URsvrORh^UYyR7ehQ_a*YxTGjnL`d+!`m zt7hcLHPLF8D9+&-;4zL@KSZmKz~1t#2lZ^eSf0bm{-yvn zOMg>7he3N4Z_z7Gmb_UgnoxuS< z++uV%d_fVEd!k3B(3&yoZr{6SkRa}yfr1zjT-g_p-+|AlRh4ldlp$?d?c?Q^v9K264nQ zMHWe26}QcRy$K*Jn|N~u+Qbm~$ZRz@^nG|`X#P8Pq@ekgV!%vZ0zsd`h@8o1YemU} z&+4ilf&c28;F4yNfP!Wkst-iM@mlo=gkpg#c%v(8@Jv?fJ2O;|?@W9irsd4kmHKUJ zF!^36N5XSZ#=@(Z$!?dp9Ph+B}Zne3z5Yqd%EJ}{h6?cU@f3WJ~z!|PuQHL zt`{vcdErVE;$}^}c&5yptj-WSfTwrCv8RqV&reos@gvIETI^NDjWcD{6g6A9&-siz zlmnZAZff}m&SX#G)`F3fHmKyG(KZ#90nllh^~gp z_=S?pTyR9dgK<5H!vK?n^AloYPjW;T&a2t##lAgqNjR=t6wXNb%xds08?w}~TpNl~ zHX$^Zvk4(sI$Q%*(t?vua?~3{S}r-9R*)-F28`v!yyiUf6;Hn&Q7sog!b(R}0|=KW{7x3e@f5kzCfA2Xc*PW99lnu+Zmo*+L({rn2Td zhyQl4(1&tm$ZYt2%$vFNS=7WXO50T8Zg_2}#ND|zm3RnV87gs~9f}b}N%+ohe|g0m zHArU60gNYe$!6h;zy0v(Q1N4~+_Febl%?;fLHN;M@jY-DJgUzuGT1KwD60t2ymu~i zKKCLT)`gSI=&ksDdE4VJq2x07kd}iW=4`?&hh5&AOFPo!2SvnSw#%jS)Qxal$Lzn; z;(IY^7V)^O973u!g|I7T4!#=IXVNT_#j|JaSfEZ)mQo#B3GaL>H!V=_7WK1eVOh;A zSy8N3iVfy1nq{H`oGvk&4AKFcB?H(<_n|tVE%USw`^j>6YlvZjoi2(H{Oj20KE#2R++LbR zauY`w&I=6ZtuEl8)cQP)RI${M64+nd+xBReJpQrTzy0)L^_1fCFDx3SeS_Sj1>-XF zA7D;P%hhCKwz(7^PQ<8+6uQm*)TzDE+D+ zc(^N%9nN(YJMN@5L#$G1jz_h9(D*7fN<79QN$RS&P1~;l5S9S0Ap!K4$v3G3L-)Ze zL)CZNk&>!kr>T?0>v*2sIB!LACI{0&s7fzxW(bgumXxO{+(|d zo_x!2aD&?4p*=V}InE5A4QhK3n;ttj*vzWdP+*T8cA4rGcB$$o-(RO*BrYjn9ot+W z_pVoO5?2?nQf)4P2D4Jh0{QG^>Ogs8Gq}+|6|iPG-_LJVpA+{(+u-Br_Y_D}CGnJb zORD6kfC6!<(gwh1snUi5n=0J`uMAb%WGAZ&RT3W*u(_MMB)%$;Wmmwe){_Nf^Irg2 z(8v8yKsJ9I;IZc10%UJh*U3vSRQnS@dWCME^!ApSmNgbIxAWPM|+8yZx{Pku@&IqAfvSqCB9HT zzg6{>Q!fLDa$O7)mr6qq(?n+kw~_C==l6;PC% zNiuxN+=csz^;6^$uvWMRyfsw;7O_wn+$NSao18<|Y*q)jMTe5X1;7y~336kYD^lWO zU>IItJwBx86I2{ljoxQt1JXR#};UG7mQDoQrO<)f3tO|T2Rs6r1jdzsCmN-p$B4D%RHF1tjUS4=*$ZL|FD3DjBXq&@U zN|~EIb2xLe7m>4YcH_V4;WuGf4fyJR=(jfV4liXu$=+C^;dJ` zs@q^o&{uQFJU`cgK!5*_In>`zywgi2$@S=zg~6UUm*E5ovXsw6RS=!svf>Wohb)D4E^_!I{^I@uAk|sf8&02l~~2~ zS91N8M*TYvs1vyUT?f<*v6Aa+j{0lvgz#n;*Oy#h8ueG+1xxjpwgdi}yC9B~Tz|Wx zzWZ*qN<7K+4|4s3Mt%Q#)EKTGa1Z1_4s!j!I_f`ukLnR$asAJzzW8jeY`Rxng4c*~ zN}A#*Uvi(iQG^yzI2K$)-ZQvJ#|~DrMF$38XzVW(GHOb z55PdUxQI8a%q!xJMI~^>L#8Gb@ot<|`g^_3l@F@1Vw3)?xrjEntORhdP4q&p89b>7 zW$xS(s&ALsX#vAsApjG1g#fD0A5t~>!A#du&?Q?e_z~+E#)7Ycx??N|XJDeeQY^R? zHBpZY99D*YWw@%XETRn|9~9ZUfT=R$uaF2Z9LvGKstXnIJrIT=!goa&A{0u$bk|uj z>oPT4_|D_r;5%rQ?pl22$@GH|BJ`if9f9K&8Y6WC?I#bZ5lZ{lhtz38#LlCTA!;5U zq|{XnTSssba9NJ!WRcCWgwC@Z%QtqC$gxbHXLBrb=8-k`I9<$qx+Mo^Vpvh|4qHjcP%~-)7C(7J@|{3z0+NN%%lXArueUQ z9>;%|V1;lExJ6!N<+JKsaWfE6pRCLyx!*8P`acH))*I%L#_pX*8hh$w!@IBhFhqk4CVs35JRW*sw3*93Jg1p zdbwOLcfPE98O9rMi}he;5ewMrtvjl&Rn}Vdnz&xmd^!CUwNAh-)~mPIvrI$moX5fP zB_K9jE^raB4N|L9v1PhRIP`FYyn5-gFLx&{cyhA{08J(zn#xPvh$ViF?F%%v4AvQEMSdylt2Y@cBL-@Y)j)` zghOA+G$^z2;1Rw@ zy};1@@8)Bm(;v(Bl3{PFUIax}kOyUSD~MRYR`9~x>XW|n@p+h5v;eJOqAYa+GDo z0+MCK0!x;Tma{A$1a#KGXNuf+g7R0K#U1iK__)IW553y+zy-*i*L|#}$v%IFanE}T zSftM*r7Y5S7sxhz^~C}fsqGU8If@$StQxp9a{LNS}t5nj-xQUKt{N z#!do>^x_Yp9fOKlr2qa<9W7#tWzt7#s)#ElX$~(YX{HsEG((FGX@0dpx<6Jg!MY^F zYGIna?3yY^egRE{ZVA4* zQ7H4i0F7K0;&O{ei{(Wju1Vq<0FJ_Zs@PVdxW8+vc%zu48Sxa-&C-0GnvVUDm4pO9 zv%i8=;77$I;iRsL+d84g0E8vK$BJ$8dlX(7@_XEl6yz5sj}LGail21(K@!qeE`Z^P z@L4EVhq{Iezl9{k9t%l`K?_NUrvM6fM?mF*FxTKdhY&7@wE&CcX?yg2F=vw<*paO% zGBVudFUBn--WnOlL%`~P!WLTKZvMCG+45=+MA0vOqfQrv3z@647UG*fiL!;v%UKIe zUM|6ZsZY0fnZHox{tF_Zl?$1dT@|IWLuzw z?iC9;p}URQcsa9i7qf8#0AMx(fsoK0EMNV%S|$JhG4L-4pLx1*Av-n7>fVRX!?b%A zqEV#w)p8u=D68urjrI2>Cy#R$^04jIQ!vs1M$;tkyze1`{ZQxe38)YP`y6OQx&H~Z zkIeZ2BCKzj<$X>dR#x9{7UJh&AZ{vQXXJdf@JDrp2r8lerC*8s=Z_H84>fNo3FD}s zi_a#Hw*i$UkGJjeaFtl{c-Kym)!k&4*t(nC5?gnZS3{w{Mu1M;a8Q*b&hzJ%Rj~CpDK~5 z-CY|5++z91jqKfE20_V0tf4zX2Txg%0^r*%_KxhDo-Rt!fClXo zF{Nyv!%8tlQz)U)ePxWVD_e{y803-CE9W?)Z!t1T|NTfk)rHDbZp1l-u z`bq);j@0TKw=FXLx!yPKUc`Olo<*b^I~S2|+_H#t z<8pw)x&c&D-#8!Pvit!Ssf6v(mPOn*IE>-wgloCTF>gPK07o_7yxlSs3NJHnsWWgu*JW=L z=C?qXCCqPiVQ!6dg@+DYYzgx_JNY2YO0j7%%aPJ}moMhg_7#gsgqHycVBXg(CK0X& zI4r_}PzO_Zl~Jxa2!MolJG|EA*}RzhWuM`$ZNB&5^DynM#q9ZC9S(J%02%Ppi`jsm zz%t<)aFh(Ve~fFDcps31pMQ5T8SuM{<*^trNVrA6{nlbK;5QbN0Y4b)nkRZMq4GXU zWW=R#py(30G|rVKe3nr8?n~_D!$-J26Qh?%Ppe2)mJs~ZCG891U4s>o$`z6v6@E-` z9T7_z!6L4(Xo(!0*^6Fyt zC{F-K(W4xM)`3T9#wP0?#UVfTC@(J|kMawP2zHNjjkj3=tXKcWZUFBtK?Aq}b)PcS z`$xITgb-!ye@?^Ok*<~U?y;@{;a|oUaC!;Iik(ouGM-T=9tWHrQpRTBc;EigIM;Sxn#;a%lGuc%opem{IIq+InmKnaLwJZ0KD1Q2n_SlmxPrh2 z%HvJ0Qt{eSbV2bXF?{nu3CvGG1%!CN0nuiU_m#0d-UMoa_IN!oAM9}!GFZ1qhYqqm zhIz~$o)-RfUkr@8V@5mJ*DggQd)Tz%J#7i!jF4qzuFJ(F4_j8e$F!^rk4#z$1v^!RUketd9V)VLlq*UuUGC~DF7=SXT?EvD!EN`D!L5aoY;Xl0nQ*pi zH$o&^`xC<8FyLH|R4QEyeD~v{FzqiM>8W&GE#NU3&mmwe8qcHnI$Q%5QD^awD)6fB z05&k5V;)lNV;;F%0~3T>l4_$H<8f@CVnz^AE1W*60V9-)i)Oi$FE{!4-$b;eUzN+|jjoBIDEAhU zc?-$Ag=F0Va(;EAYc9z-pJd!ZqHQ6uwvb3$NSrMs$`%r13yH9W#MeTiYay|XrriG-^qM=ywwKtnVCM_h277{}XiJ*nJ-$I;kA+EO&$6JWo zEyU>-;&KadxP`deLY!?OuC@?ITZo%2#7H0u_}4-VgoXhJTYzy9aA~R>f(-i{D5~tG zm7fKd5t;`s)|e&x0#~G1H%+d%z*Xon7lOW~KmFkX*Elw^&8B^QjQ^2+HJJAGcl?ix z>_%CBq3fbRvaeXQubWXf4Zz*$R`y=54o0M7HoM%-C0L4V?*X(zvb~LHg=BjR(F)1- zPNNl)?fIb7t*m2!`iB5 z-HLH74O=m;(qJpbX;rpjoNi((##susV$6556=SxRtr+u!Y{ZxdVk5?}zjhRVUbM^^ z|9b;%I^-z+l4WBoPL{33d)jAQ?0QBK*Hy^bsu~R+yW3p>bK^tgl1pHiyAu|n99BYl z=BmJ=T@`I7Hw~7DFM&MOLuT>&&Eh_C#igzhR-Nuvouik!t`M)Abzb2*cU%Su?|b13 z2$w;Yol%7j^tJ}TcX?|X;Jk*FWw6P=0X{t2uzfKY(XI-4@(R~*_)@`H+gxtjw!@?= z!GgXup`T>vd#;4}z(=;a{KGBd{c!RA1rU4r{HugmG1n=th4Ab+Yd^*9;MBLL6>EjB!Fd29o(@s)kE(CCo-l ZF#%;-fM8puowRpBnjHYi!&kau|37}U`T_s| diff --git a/docs/build/.doctrees/environment.pickle b/docs/build/.doctrees/environment.pickle index e3a84ce68406bffae65a2b36ba36e2b2431aea91..7193f821d2f32ebacde0937a34555768fac1036c 100644 GIT binary patch literal 22614 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 diff --git a/docs/build/.doctrees/examples.doctree b/docs/build/.doctrees/examples.doctree index 49c64dc75f446349466dfadbec7b418f7eb81c66..86dce3c0219e0d350ca83404f00722dd1473e0c7 100644 GIT binary patch delta 103 zcmcbp_EC+cfpu!yMix6J#_5yqu~f5H<|Vu4W|nN;%cOuQB*`?nkDG6EJ-ZPjW8P#H VE_=B04;;prLOP6_`?wFY0{~kPBZ>e3 delta 66 zcmeyUc2SL`fpx0eMix6J#{S9ASgJQ?vPv*bzQ@82=SDCyrcJitvfs?fX~YO;YBO$L I$9eFg<{!fpsd+MwaL7j53oMd6g#naT-ky;JA#!J2QDMKi}pgu6az1c0fhylk50w cCi`>bOxEHr=Ez`=osuCMfg-V4i(gg}064K5QUCw| diff --git a/docs/build/_sources/api.rst.txt b/docs/build/_sources/api.rst.txt index baf2ce81..1b819857 100644 --- a/docs/build/_sources/api.rst.txt +++ b/docs/build/_sources/api.rst.txt @@ -18,13 +18,10 @@ Sources: Transformations: **************** -.. automodule:: storey.flow - :members: - :show-inheritance: - -.. automodule:: storey.dataframe +.. automodule:: storey.transformations :members: :show-inheritance: + :imported-members: Miscellaneous: diff --git a/docs/build/api.html b/docs/build/api.html index ea6f1322..7ecf4d6d 100644 --- a/docs/build/api.html +++ b/docs/build/api.html @@ -163,7 +163,7 @@

storey documentation

  • - + Transformations:
  • @@ -357,6 +357,29 @@

    Storey api +
    +class storey.sources.AsyncEmitSource(buffer_size: int = 1024, key_field: Union[list, str, None] = None, time_field: Optional[str] = None, **kwargs)
    +

    Bases: storey.flow.Flow

    +

    Asynchronous entry point into a flow. Produces an AsyncFlowController when run, for use from inside an async def. +See SyncEmitSource for use from inside a synchronous context.

    +
    +
    Parameters
    +
      +
    • buffer_size – size of the incoming event buffer. Defaults to 1024.

    • +
    • name (string) – Name of this step, as it should appear in logs. Defaults to class name (AsyncEmitSource).

    • +
    +
    +
    +

    for additional params, see documentation of Flow

    +
    +
    +async run()
    +

    Starts the flow

    +
    + +
    +
    class storey.sources.AsyncFlowController(emit_fn, loop_task, await_result, key_field: Optional[str] = None, time_field: Optional[str] = None)
    @@ -395,29 +418,6 @@

    Storey api -
    -class storey.sources.AsyncEmitSource(buffer_size: int = 1024, key_field: Union[list, str, None] = None, time_field: Optional[str] = None, **kwargs)
    -

    Bases: storey.flow.Flow

    -

    Asynchronous entry point into a flow. Produces an AsyncFlowController when run, for use from inside an async def. -See SyncEmitSource for use from inside a synchronous context.

    -
    -
    Parameters
    -
      -
    • buffer_size – size of the incoming event buffer. Defaults to 1024.

    • -
    • name (string) – Name of this step, as it should appear in logs. Defaults to class name (AsyncEmitSource).

    • -
    -
    -
    -

    for additional params, see documentation of Flow

    -
    -
    -async run()
    -

    Starts the flow

    -
    - -

    -
    class storey.sources.AwaitableResult(on_error: Optional[Callable[[], None]] = None)
    @@ -580,11 +580,18 @@

    Storey api -

    Transformations:

    +
    +

    Transformations:

    -
    -class storey.flow.Batch(max_events: Optional[int] = None, timeout_secs: Optional[int] = None, key: Union[str, Callable[[storey.dtypes.Event], str], None] = None, **kwargs)
    +
    +class storey.transformations.Assert(**kwargs)
    +

    Bases: storey.flow.Flow

    +

    Exposes an API for testing the flow between steps.

    +
    + +
    +
    +class storey.transformations.Batch(max_events: Optional[int] = None, timeout_secs: Optional[int] = None, key: Union[str, Callable[[storey.dtypes.Event], str], None] = None, **kwargs)

    Bases: storey.flow._Batching

    Batches events into lists of up to max_events events. Each emitted list contained max_events events, unless timeout_secs seconds have passed since the first event in the batch was received, at which the batch is emitted with @@ -606,8 +613,8 @@

    Storey api -
    -class storey.flow.Choice(choice_array, default=None, **kwargs)
    +
    +class storey.transformations.Choice(choice_array, default=None, **kwargs)

    Bases: storey.flow.Flow

    Redirects each input element into at most one of multiple downstreams.

    @@ -626,35 +633,8 @@

    Storey api -
    -class storey.flow.Complete(recovery_step=None, termination_result_fn=<function Flow.<lambda>>, context=None, **kwargs)
    -

    Bases: storey.flow.Flow

    -

    Completes the AwaitableResult associated with incoming events. -:param name: Name of this step, as it should appear in logs. Defaults to class name (Complete). -:type name: string -:param full_event: Whether to complete with an Event object (when True) or only the payload (when False). Default to False. -:type full_event: boolean

    -

    - -
    -
    -class storey.flow.Context(initial_secrets: Optional[Dict[str, str]] = None, initial_parameters: Optional[Dict[str, object]] = None, initial_tables: Optional[Dict[str, storey.table.Table]] = None)
    -

    Bases: object

    -

    Context object that holds global secrets and configurations to be passed to relevant steps.

    -
    -
    Parameters
    -
      -
    • initial_secrets – Initial dict of secrets.

    • -
    • initial_parameters – Initial dict of parameters.

    • -
    • initial_tables – Initial dict of tables.

    • -
    -
    -
    -
    - -
    -
    -class storey.flow.Filter(fn, **kwargs)
    +
    +class storey.transformations.Filter(fn, **kwargs)

    Bases: storey.flow._UnaryFunctionFlow

    Filters events based on a user-provided function.

    @@ -670,8 +650,8 @@

    Storey api -
    -class storey.flow.FlatMap(fn, **kwargs)
    +
    +class storey.transformations.FlatMap(fn, **kwargs)

    Bases: storey.flow._UnaryFunctionFlow

    Maps, or transforms, each incoming event into any number of events.

    @@ -687,40 +667,22 @@

    Storey api -
    -class storey.flow.HttpRequest(method, url, body, headers: Optional[dict] = None)
    -

    Bases: object

    -

    A class representing an HTTP request, with method, url, body, and headers.

    -
    -
    Parameters
    -
      -
    • method (string) – HTTP method (e.g. GET).

    • -
    • url (string) – Target URL (http and https schemes supported).

    • -
    • body (bytes or string) – Request body.

    • -
    • headers (dictionary, or None.) – Request headers, in the form of a dictionary. Optional. Defaults to no headers.

    • -
    -
    -
    +
    +class storey.transformations.Flatten(**kwargs)
    +

    Bases: storey.flow.Flow

    +

    Splits an event with an iterable body into multiple events.

    -
    -class storey.flow.HttpResponse(status, body)
    -

    Bases: object

    -

    A class representing an HTTP response, with a status code and body.

    -
    -
    Parameters
    -
      -
    • body (bytes) – Response body.

    • -
    • status (int) – HTTP status code.

    • -
    -
    -
    +
    +class storey.transformations.ForEach(fn, **kwargs)
    +

    Bases: storey.flow._UnaryFunctionFlow

    +

    Applies given function on each event in the stream, passes original event downstream.

    -
    -class storey.flow.JoinWithTable(table: Union[storey.table.Table, str], key_extractor: Union[str, Callable[[storey.dtypes.Event], str]], attributes: Optional[List[str]] = None, join_function: Optional[Callable[[storey.dtypes.Event, Dict[str, object]], storey.dtypes.Event]] = None, **kwargs)
    +
    +class storey.transformations.JoinWithTable(table: Union[storey.table.Table, str], key_extractor: Union[str, Callable[[storey.dtypes.Event], str]], attributes: Optional[List[str]] = None, join_function: Optional[Callable[[storey.dtypes.Event, Dict[str, object]], storey.dtypes.Event]] = None, **kwargs)

    Bases: storey.flow._ConcurrentJobExecution

    Joins each event with data from the given table.

    @@ -741,29 +703,8 @@

    Storey api -
    -class storey.flow.JoinWithV3IOTable(storage, key_extractor, join_function, table_path, attributes='*', **kwargs)
    -

    Bases: storey.flow._ConcurrentJobExecution

    -

    Joins each event with a V3IO table. Used for event augmentation.

    -
    -
    Parameters
    -
      -
    • storage (Driver) – Database driver.

    • -
    • key_extractor (Function (Event=>string)) – Function for extracting the key for table access from an event.

    • -
    • join_function (Function ((Event, dict)=>Event)) – Joins the original event with relevant data received from V3IO.

    • -
    • table_path (string) – Path to the table in V3IO.

    • -
    • attributes (string) – A comma-separated list of attributes to be requested from V3IO. Defaults to ‘*’ (all user attributes).

    • -
    • name (string) – Name of this step, as it should appear in logs. Defaults to class name (JoinWithV3IOTable).

    • -
    • full_event (boolean) – Whether user functions should receive and/or return Event objects (when True), or only the payload (when False). -Defaults to False.

    • -
    -
    -
    -

    - -
    -
    -class storey.flow.Map(fn, **kwargs)
    +
    +class storey.transformations.Map(fn, **kwargs)

    Bases: storey.flow._UnaryFunctionFlow

    Maps, or transforms, incoming events using a user-provided function.

    @@ -779,15 +720,15 @@

    Storey api -
    -class storey.flow.MapClass(**kwargs)
    +
    +class storey.transformations.MapClass(**kwargs)

    Bases: storey.flow.Flow

    Similar to Map, but instead of a function argument, this class should be extended and its do() method overridden.

    -
    -class storey.flow.MapWithState(initial_state, fn, group_by_key=False, **kwargs)
    +
    +class storey.transformations.MapWithState(initial_state, fn, group_by_key=False, **kwargs)

    Bases: storey.flow._FunctionWithStateFlow

    Maps, or transforms, incoming events using a stateful user-provided function, and an initial state, which may be a database table.

    @@ -804,101 +745,71 @@

    Storey api -
    -class storey.flow.Reduce(initial_value, fn, **kwargs)
    +
    +class storey.transformations.Partition(predicate: Callable[[Any], bool], **kwargs)

    Bases: storey.flow.Flow

    -

    Reduces incoming events into a single value which is returned upon the successful termination of the flow.

    +

    Partitions events by calling a predicate function on each event. Each processed event results in a Partitioned +namedtuple of (left=Optional[Event], right=Optional[Event]).

    +

    For a given event, if the predicate function results in True, the event is assigned to left. Otherwise, the +event is assigned to right.

    Parameters
    -
      -
    • initial_value (object) – Starting value. When the first event is received, fn will be appled to the initial_value and that event.

    • -
    • fn (Function ((object, Event) => object)) – Function to apply to the current value and each event.

    • -
    • name (string) – Name of this step, as it should appear in logs. Defaults to class name (Reduce).

    • -
    • full_event (boolean) – Whether user functions should receive and/or return Event objects (when True), or only the payload (when False). -Defaults to False.

    • -
    +

    predicate – A predicate function that results in a boolean.

    -
    -class storey.flow.SendToHttp(request_builder, join_from_response, **kwargs)
    -

    Bases: storey.flow._ConcurrentJobExecution

    -

    Joins each event with data from any HTTP source. Used for event augmentation.

    +
    +class storey.transformations.SampleWindow(window_size: int, emit_period: storey.steps.sample.EmitPeriod = <EmitPeriod.FIRST: 1>, emit_before_termination: bool = False, **kwargs)
    +

    Bases: storey.flow.Flow

    +

    Emits a single event in a window of window_size events, in accordance with emit_period and emit_before_termination.

    Parameters
      -
    • request_builder (Function (Event=>HttpRequest)) – Creates an HTTP request from the event. This request is then sent to its destination.

    • -
    • join_from_response (Function ((Event, HttpResponse)=>Event)) – Joins the original event with the HTTP response into a new event.

    • -
    • name (string) – Name of this step, as it should appear in logs. Defaults to class name (SendToHttp).

    • -
    • full_event (boolean) – Whether user functions should receive and/or return Event objects (when True), or only the payload (when False). -Defaults to False.

    • +
    • window_size – The size of the window we want to sample a single event from.

    • +
    • emit_period – What event should this step emit for each window_size (default: EmitPeriod.First).

    -
    - -
    -
    -storey.flow.build_flow(steps)
    -

    Builds a flow from a list of steps, by chaining the steps according to their order in the list. -Nested lists are used to represent branches in the flow.

    -
    -
    Examples:

    build_flow([step1, step2, step3]) -is equivalent to -step1.to(step2).to(step3)

    -

    build_flow([step1, [step2a, step2b], step3]) -is equivalent to -step1.to(step2a) -step1.to(step3) -step2a.to(step2b)

    +
    +
    Available options:

    1.1) EmitPeriod.FIRST - will emit the first event in a window window_size events. +1.2) EmitPeriod.LAST - will emit the last event in a window of window_size events.

    Parameters
    -

    steps – a potentially nested list of steps

    -
    -
    Returns
    -

    the first step

    +

    emit_before_termination – On termination signal, should the step emit the last event it seen (default: False).

    -
    Return type
    -

    Flow

    +
    +
    +
    Available options:

    2.1) True - The last event seen will be emitted downstream. +2.2) False - The last event seen will NOT be emitted downstream.

    -
    -
    -class storey.dataframe.ReduceToDataFrame(index: Optional[str] = None, columns: Optional[List[str]] = None, insert_key_column_as: Optional[str] = None, insert_time_column_as: Optional[str] = None, insert_id_column_as: Optional[str] = None, **kwargs)
    -

    Bases: storey.flow.Flow

    -

    Builds a pandas DataFrame from events and returns that DataFrame on flow termination.

    +
    +
    +class storey.transformations.SendToHttp(request_builder, join_from_response, **kwargs)
    +

    Bases: storey.flow._ConcurrentJobExecution

    +

    Joins each event with data from any HTTP source. Used for event augmentation.

    Parameters
      -
    • index – Name of the column to be used as index. Optional. If not set, DataFrame will be range indexed.

    • -
    • columns – List of column names to be passed as-is to the DataFrame constructor. Optional.

    • -
    • insert_key_column_as – Name of the column to be inserted for event keys. Optional. -If not set, event keys will not be inserted into the DataFrame.

    • -
    • insert_time_column_as – Name of the column to be inserted for event times. Optional. -If not set, event times will not be inserted into the DataFrame.

    • -
    • insert_id_column_as – Name of the column to be inserted for event IDs. Optional. -If not set, event IDs will not be inserted into the DataFrame.

    • +
    • request_builder (Function (Event=>HttpRequest)) – Creates an HTTP request from the event. This request is then sent to its destination.

    • +
    • join_from_response (Function ((Event, HttpResponse)=>Event)) – Joins the original event with the HTTP response into a new event.

    • +
    • name (string) – Name of this step, as it should appear in logs. Defaults to class name (SendToHttp).

    • +
    • full_event (boolean) – Whether user functions should receive and/or return Event objects (when True), or only the payload (when False). +Defaults to False.

    -

    for additional params, see documentation of storey.flow.Flow

    -
    -
    -to(outlet)
    -

    Pipe this step to next one. Throws exception since illegal

    -
    -
    -
    -class storey.dataframe.ToDataFrame(index: Optional[str] = None, columns: Optional[List[str]] = None, **kwargs)
    +
    +class storey.transformations.ToDataFrame(index: Optional[str] = None, columns: Optional[List[str]] = None, **kwargs)

    Bases: storey.flow.Flow

    Create pandas data frame from events. Can appear in the middle of the flow, as opposed to ReduceToDataFrame

    diff --git a/docs/build/genindex.html b/docs/build/genindex.html index 7a75506c..5ba91e78 100644 --- a/docs/build/genindex.html +++ b/docs/build/genindex.html @@ -113,7 +113,7 @@

    storey documentation

    - + @@ -147,7 +147,6 @@

    Index

    | D | E | F - | H | J | L | M @@ -165,20 +164,22 @@

    A

    + -
    • await_termination() (storey.sources.AsyncFlowController method) @@ -368,12 +351,6 @@

      Q

      R

      - - - -
        -
      • to() (storey.dataframe.ReduceToDataFrame method) -
      • -
      • ToDataFrame (class in storey.dataframe) +
      • ToDataFrame (class in storey.transformations)
      • TSDBTarget (class in storey.targets)
      • diff --git a/docs/build/index.html b/docs/build/index.html index 976b63a9..5b77230d 100644 --- a/docs/build/index.html +++ b/docs/build/index.html @@ -130,7 +130,7 @@

        storey documentation

        - + @@ -247,7 +247,7 @@

        IntroductionStorey api diff --git a/docs/build/objects.inv b/docs/build/objects.inv index c4f97f29c021d82273d129456bb8da10f5b44a97..522a7bbcfd8f3018f7ee7906aeadab154fac6b00 100644 GIT binary patch delta 680 zcmV;Z0$2UA29gGlc7IE6+b|4(@A(x5wrhk9yY-glf$q^En~nB3ur})mlOWMNj`5ZyoLU1P`6Q7q4_iF=m2|lHVeOz#(&vQ#KPQt;cAlSXiPMw zR84c_eVj|MTquKKBhao?@fK*?8sqmXXtR06jd3TFxz)+YUJ*Naw5V@kJ%2`NsoWAZ zcUcgrdoBz0LZDo1x+Mij&|Pp8#n1;zM^kGoNQrC_CKeIuWv+D>6s~iued`@(ez<0y zfrT58h2XM`bbpl!UN~)1MmtPwPQDqUb26&Yd3-1I>TF_KnNMDTTX+!o8%-llR>Lut zfnWd8uZE6x?~Wy3zG)DU0@z?oHn-GhGk-p>&fcxWE~&1I3u_7bsX=0A zr)SNBls*nZ?Zytxpv(Qge*Kp+IN?-^hwZ={y=C@YBfSdW3qI1 z9Z6`A=27X2c0b?4+$1!psm|Cn*nCBWrYpry7v?^-;38u798d!6E!5{=79|-|dJgmr z`KGwM=YMt;*ByKC8QD2x8r12W4>Ps>45P5Fb1WYwF9l4Yss+Z~7!O#KMW$}7C2vut z{C9HUzmspGZjl&UToo!$#+!FZ8ch222-hKcv#mGCc9aLf#dRPAJfQH*Anlm1 z{&BQX>kV&d^j4RU|Ai8hnaZ2W{Z|RejodK!k0Fb?9S<)$8@JsQ>6{q^?FxH`=w!Xa O?)}nv8~p!IK-OTiJHl4Wl z44d@>IBUN{8%zkzoy)$yS@<9Ny8+vhFv*dxEH8l?;w!*zL4P&^mS*l}E(a4NU++UK)SmVWoANvb7ahzI?Yk=aVWurHV($$GPX6) z-&a(#i&8n~J8$VnqmjKLI9nmu8@{=Ch6+=;1z6>?NTlvnCCy6$)co}wE>xw$bS~$sE9T%7uI$`!A3wGwwC?O55HN3m3hT0sZ~`FUFBLyuTIKnhoR;a z76Un_mF|L}EQ6qBXB@?PERv`^UmGQWCN*WP0jc5&VS^;?rP4UQjdW7Y@rKtV?G<8u z3r`I=Owha9pIWpWzZq5CD_k%6qfR64POg8^DQd!AcYhu=L~)2DM^3D0cTkd~IaG3K z!uur29~-6R!_efbrV@MBf-{X3^i!divzcovF?-<(!)y0tZuDqZ>|+@Z;|Kd{Xzxk3 zV<~KBVR=}i^?2LwLHii|+9_2PuUp3i!oVLfM;RCbfix?593;Jm4q>)Q$oRn8e?-~O z^SiVp=YPZfG7Ss$hyl~vY704{oepd159{V*8u{oRUU2Kr7)-0wA!<^)<8Z1_HpeJt zq=N{#EdU+ea+HV8U&g;g`~E{Df6{44Uw||yM+>}6W0v{+Y=rQG%%MD$Mr6~sXIUOC zh4BP7Jlvz)wr-f)5f77-0xEyEgiRzge*_(vVL`TIuEXESo2)myrRc3LxcI{h$mT{g urT;vLD{bN{_zxF#I~^W$Hg3Aocg`Ge>u;GmL^szv?4B>Yx5;0#YSYqoM_Eq* diff --git a/docs/build/py-modindex.html b/docs/build/py-modindex.html index cb08d7ba..b105144a 100644 --- a/docs/build/py-modindex.html +++ b/docs/build/py-modindex.html @@ -115,7 +115,7 @@

        storey documentation

        - + @@ -161,11 +161,6 @@

        Python Module Index

          storey.aggregations
          - storey.dataframe -
          @@ -179,22 +174,22 @@

      Python Module Index

          - storey.flow + storey.sources
          - storey.sources + storey.table
          - storey.table + storey.targets
          - storey.targets + storey.transformations
      diff --git a/docs/build/search.html b/docs/build/search.html index b8b8fafc..e5f3d1a1 100644 --- a/docs/build/search.html +++ b/docs/build/search.html @@ -117,7 +117,7 @@

      storey documentation

      - + diff --git a/docs/build/searchindex.js b/docs/build/searchindex.js index 3890ad8b..d2e6f89c 100644 --- a/docs/build/searchindex.js +++ b/docs/build/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["api","examples","index"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["api.rst","examples.rst","index.rst"],objects:{"storey.aggregations":{AggregateByKey:[0,1,1,""],QueryByKey:[0,1,1,""]},"storey.dataframe":{ReduceToDataFrame:[0,1,1,""],ToDataFrame:[0,1,1,""]},"storey.dataframe.ReduceToDataFrame":{to:[0,2,1,""]},"storey.drivers":{Driver:[0,1,1,""],NeedsV3ioAccess:[0,1,1,""],NoopDriver:[0,1,1,""],V3ioDriver:[0,1,1,""]},"storey.drivers.V3ioDriver":{close:[0,2,1,""]},"storey.dtypes":{EmissionType:[0,1,1,""],EmitAfterMaxEvent:[0,1,1,""],EmitAfterPeriod:[0,1,1,""],EmitAfterWindow:[0,1,1,""],EmitEveryEvent:[0,1,1,""],Event:[0,1,1,""],FieldAggregator:[0,1,1,""],FixedWindow:[0,1,1,""],FixedWindows:[0,1,1,""],FlowError:[0,3,1,""],LateDataHandling:[0,1,1,""],SlidingWindow:[0,1,1,""],SlidingWindows:[0,1,1,""],V3ioError:[0,3,1,""]},"storey.flow":{Batch:[0,1,1,""],Choice:[0,1,1,""],Complete:[0,1,1,""],Context:[0,1,1,""],Filter:[0,1,1,""],FlatMap:[0,1,1,""],HttpRequest:[0,1,1,""],HttpResponse:[0,1,1,""],JoinWithTable:[0,1,1,""],JoinWithV3IOTable:[0,1,1,""],Map:[0,1,1,""],MapClass:[0,1,1,""],MapWithState:[0,1,1,""],Reduce:[0,1,1,""],SendToHttp:[0,1,1,""],build_flow:[0,4,1,""]},"storey.sources":{AsyncAwaitableResult:[0,1,1,""],AsyncFlowController:[0,1,1,""],AsyncSource:[0,1,1,""],AwaitableResult:[0,1,1,""],CSVSource:[0,1,1,""],DataframeSource:[0,1,1,""],FlowAwaiter:[0,1,1,""],FlowController:[0,1,1,""],ParquetSource:[0,1,1,""],Source:[0,1,1,""]},"storey.sources.AsyncAwaitableResult":{await_result:[0,2,1,""]},"storey.sources.AsyncFlowController":{await_termination:[0,2,1,""],emit:[0,2,1,""],terminate:[0,2,1,""]},"storey.sources.AsyncSource":{run:[0,2,1,""]},"storey.sources.AwaitableResult":{await_result:[0,2,1,""]},"storey.sources.FlowAwaiter":{await_termination:[0,2,1,""]},"storey.sources.FlowController":{await_termination:[0,2,1,""],emit:[0,2,1,""],terminate:[0,2,1,""]},"storey.sources.Source":{run:[0,2,1,""]},"storey.table":{Table:[0,1,1,""]},"storey.targets":{CSVTarget:[0,1,1,""],NoSqlTarget:[0,1,1,""],ParquetTarget:[0,1,1,""],StreamTarget:[0,1,1,""],TSDBTarget:[0,1,1,""]},storey:{aggregations:[0,0,0,"-"],dataframe:[0,0,0,"-"],drivers:[0,0,0,"-"],dtypes:[0,0,0,"-"],flow:[0,0,0,"-"],sources:[0,0,0,"-"],table:[0,0,0,"-"],targets:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","exception","Python exception"],"4":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:exception","4":"py:function"},terms:{"10m":[1,2],"24h":1,"abstract":0,"boolean":0,"byte":0,"class":0,"default":0,"enum":0,"float":0,"function":0,"import":2,"int":0,"new":0,"return":0,"throw":0,"true":[0,2],For:0,IDs:0,The:[0,2],Use:0,Used:0,Will:0,_batch:0,_concurrentbykeyjobexecut:[],_concurrentjobexecut:0,_functionwithstateflow:0,_iterablesourc:0,_unaryfunctionflow:0,_writer:0,acc:1,accept:0,access:0,access_kei:0,accord:0,accumul:0,add:0,added:0,addit:0,after:0,age:1,aggr:0,aggr_filt:0,aggr_granular:0,aggreg:[0,1,2],aggregatebykei:[0,1,2],alias:0,all:0,allow:0,also:[0,2],ani:0,api:2,appear:0,append:0,append_return:1,appl:0,appli:0,argument:0,associ:0,assum:0,async:[0,2],asyncawaitableresult:0,asyncflowcontrol:0,asynchron:[0,2],asyncio:2,asyncsourc:[0,2],attribut:0,augment:0,augmentation_fn:0,avg:[0,1,2],await:[0,2],await_result:0,await_termin:[0,1,2],await_termination_fn:0,awaitable_result:0,awaitableresult:0,base:[0,2],baseexcept:0,basic:[0,2],batch:0,batch_siz:0,befor:0,bodi:0,bool:0,both:2,branch:0,bucket:0,buffer:0,buffer_s:0,build:0,build_dict:0,build_flow:[0,1,2],cach:0,call:0,callabl:0,can:[0,2],caus:0,chain:0,check:0,choic:0,choice_arrai:0,client:0,close:0,code:0,col1:1,col_nam:0,column:[0,2],comma:0,complet:0,comput:[0,2],concurr:0,condit:0,configur:0,connect:0,construct:2,constructor:0,contain:0,content:[0,2],content_typ:0,context:[0,2],control:[1,2],core:0,coroutin:0,count:0,creat:[0,2],csv:[0,2],csvsourc:0,csvtarget:[0,2],current:0,custom:0,dai:0,data:[0,1,2],databas:0,datafram:[0,2],dataframesourc:[0,2],date:0,datetim:0,decid:0,def:0,defin:0,delai:0,delay_in_second:0,deprec:0,describ:0,destin:[0,2],determin:0,dfs:0,dict:0,dictionari:0,did:0,didn:0,directli:0,directori:0,discard:0,divid:0,document:0,don:0,done:0,downstream:0,driver:0,dtype:0,each:0,either:0,element:0,emiss:0,emission_typ:0,emissiontyp:0,emit:[0,1,2],emit_fn:0,emit_polici:0,emitaftermaxev:0,emitafterperiod:0,emitafterwindow:0,emitbas:[],emiteveryev:0,emitpolici:0,end:0,end_filt:0,enrich:0,enrich_with:0,entri:0,enumer:0,environ:0,equival:0,etc:0,evalu:0,even:0,event:[0,2],event_field:0,event_tim:0,everi:0,exampl:[0,2],except:0,exist:0,expir:0,explicit:0,extend:0,extra:0,extract:[0,2],extractor:0,fals:0,featur:[0,2],feature1:2,feature2:2,feature3:2,fetch:0,fewer:0,field1:2,field2:2,field3:2,field:0,fieldaggreg:[0,1,2],file:[0,2],filter:[0,1],filter_column:0,first:0,fix:0,fixedwindow:0,flatmap:0,flow:[0,2],flowawait:0,flowcontrol:0,flowcontrollerbas:0,flowerror:0,flush:0,flush_after_second:0,flush_interval_sec:0,follow:[0,2],form:0,format:0,forward:0,frame:0,frames_cli:0,from:[0,2],fromisoformat:0,fsspec:0,full_ev:0,futur:0,gcs:0,gener:0,get:0,given:0,global:0,granular:0,graph:2,group:0,group_by_kei:0,hash:0,have:0,header:[0,2],hold:0,host:0,hour:0,how:0,http:0,httprequest:0,httprespons:0,id_field:0,identifi:0,illeg:0,impli:0,incom:0,index:[0,2],index_col:0,indic:0,infer:0,infer_columns_from_data:0,initi:0,initial_paramet:0,initial_secret:0,initial_st:0,initial_t:0,initial_valu:0,input:0,insert:0,insert_id_column_a:0,insert_key_column_a:0,insert_time_column_a:0,insid:0,instanc:0,instead:0,interest:2,interv:0,iso:0,items_in_ingest_batch:1,iter:0,its:[0,2],join:[0,1],join_from_respons:0,join_funct:0,joinwitht:0,joinwithv3iot:[0,1],keep:0,kei:[0,1,2],key_column:2,key_extractor:0,key_field:0,kwarg:0,label:0,lambda:[0,1],last:0,latedatahandl:0,later:0,legal:0,librari:2,like:0,line:0,list:0,log:0,look:0,loop_task:0,mai:0,make:0,map:[0,1],mapclass:0,mapwithst:0,match:0,max:[0,1,2],max_ev:0,max_lines_before_flush:0,max_seconds_before_flush:0,max_updates_in_flight:0,max_valu:0,maximum:0,mean:0,metadata:0,method:0,metric:0,middl:0,min:[0,1,2],minut:[0,1],miscellan:2,modul:2,month:0,more:2,most:0,multipl:0,must:0,myfil:2,name:0,needsv3ioaccess:0,nest:0,new_col_nam:0,next:0,none:0,noopdriv:0,nosqltarget:[0,1,2],notat:0,nth:0,number:0,number_of_stuff:1,object:0,offer:2,often:0,on_error:0,onc:0,one:0,onli:0,oppos:0,optim:0,option:0,order:0,origin:0,other:0,otherwis:0,outlet:0,output:0,overridden:0,overview:[],page:2,panda:0,param:0,paramet:0,parquet:0,parquetsourc:0,parquettarget:0,pars:0,particular:0,partit:0,partition_col:0,partitioned_by_kei:[0,1],pass:0,password:0,path:0,path_to_t:1,payload:0,per:0,perform:2,period:0,persist:[0,2],pipe:0,place:0,point:0,polici:0,port:0,potenti:0,process:2,produc:0,properti:0,provid:0,push:2,queri:0,querybykei:0,rang:[0,1,2],rate:0,reach:0,read:0,readcsv:[],reader:[],readparquet:[],real:2,receiv:0,record:0,recovery_step:0,redirect:0,reduc:[0,1],reducetodatafram:0,refer:0,relev:0,renam:0,repres:0,request:0,request_build:0,respons:0,result:[0,1,2],return_awaitable_result:0,round:0,run:[0,1,2],same:[0,2],sampl:0,scheme:0,search:2,second:0,secret:0,see:0,sendtohttp:0,sens:0,sent:0,separ:0,server:0,servic:0,set:0,setup_teardown_test:1,shard:0,sharding_func:0,should:0,show:1,side:0,similar:0,sinc:0,singl:0,size:0,slide:[0,2],slidingwindow:[0,1,2],smhd:0,sourc:[1,2],specif:0,specifi:0,sqr:[0,1],start:0,start_filt:0,state:0,statu:0,stdvar:0,step1:0,step2:0,step2a:0,step2b:0,step3:0,step:[0,2],storag:0,storage_opt:0,store:2,str:0,stream:[0,2],stream_path:0,streamtarget:0,string:0,strptime:0,sttdev:0,success:0,sum:[0,1],support:0,synchron:[0,2],system:0,tabl:[0,1],table_path:[0,1],take:2,tal:1,target:2,task:2,termin:[0,1,2],termination_result_fn:0,test_base_tim:1,than:0,thei:0,thi:[0,2],time:[0,2],time_col:0,time_column:2,time_field:0,timedelta:1,timeout:0,timeout_sec:0,timestamp:[0,2],timestamp_field:[],timestamp_format:0,to_parquet:0,todatafram:0,transform:2,tsdb:0,tsdbtarget:0,tupl:0,type:0,type_infer:0,union:0,uniqu:0,unit:0,unless:0,updat:0,upon:0,url:0,usag:0,use:0,use_windows_from_schema:0,used:0,user:[0,2],user_id:2,usernam:0,using:[0,2],usual:0,utc:0,v3io:[0,1,2],v3io_access_kei:0,v3io_api:0,v3io_fram:0,v3iodriv:[0,1,2],v3ioerror:0,valid:0,valu:[0,2],variabl:0,via:0,wait:0,web:0,webapi:0,well:0,when:0,where:0,whether:0,which:0,window:[0,2],windowbas:0,windowsbas:0,with_head:0,within:2,write:[0,2],write_head:0,write_thi:0,writer:[],writetocsv:[],writetoparquet:[],writetot:[],writetotsdb:[],writetov3iostream:[],written:0,year:0,yield:0},titles:["Storey api","Storey examples","Storey Package Documentation"],titleterms:{api:0,document:2,exampl:1,indic:2,introduct:2,miscellan:0,overview:[],packag:2,reader:[],sourc:0,storei:[0,1,2],tabl:2,target:0,transform:0,welcom:[],writer:[]}}) \ No newline at end of file +Search.setIndex({docnames:["api","examples","index"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["api.rst","examples.rst","index.rst"],objects:{"storey.aggregations":{AggregateByKey:[0,1,1,""],QueryByKey:[0,1,1,""]},"storey.drivers":{Driver:[0,1,1,""],NeedsV3ioAccess:[0,1,1,""],NoopDriver:[0,1,1,""],V3ioDriver:[0,1,1,""]},"storey.drivers.V3ioDriver":{close:[0,2,1,""]},"storey.dtypes":{EmissionType:[0,1,1,""],EmitAfterMaxEvent:[0,1,1,""],EmitAfterPeriod:[0,1,1,""],EmitAfterWindow:[0,1,1,""],EmitEveryEvent:[0,1,1,""],Event:[0,1,1,""],FieldAggregator:[0,1,1,""],FixedWindow:[0,1,1,""],FixedWindows:[0,1,1,""],FlowError:[0,3,1,""],LateDataHandling:[0,1,1,""],SlidingWindow:[0,1,1,""],SlidingWindows:[0,1,1,""],V3ioError:[0,3,1,""]},"storey.sources":{AsyncAwaitableResult:[0,1,1,""],AsyncEmitSource:[0,1,1,""],AsyncFlowController:[0,1,1,""],AwaitableResult:[0,1,1,""],CSVSource:[0,1,1,""],DataframeSource:[0,1,1,""],FlowAwaiter:[0,1,1,""],FlowController:[0,1,1,""],ParquetSource:[0,1,1,""],SyncEmitSource:[0,1,1,""]},"storey.sources.AsyncAwaitableResult":{await_result:[0,2,1,""]},"storey.sources.AsyncEmitSource":{run:[0,2,1,""]},"storey.sources.AsyncFlowController":{await_termination:[0,2,1,""],emit:[0,2,1,""],terminate:[0,2,1,""]},"storey.sources.AwaitableResult":{await_result:[0,2,1,""]},"storey.sources.FlowAwaiter":{await_termination:[0,2,1,""]},"storey.sources.FlowController":{await_termination:[0,2,1,""],emit:[0,2,1,""],terminate:[0,2,1,""]},"storey.sources.SyncEmitSource":{run:[0,2,1,""]},"storey.table":{Table:[0,1,1,""]},"storey.targets":{CSVTarget:[0,1,1,""],NoSqlTarget:[0,1,1,""],ParquetTarget:[0,1,1,""],StreamTarget:[0,1,1,""],TSDBTarget:[0,1,1,""]},"storey.transformations":{Assert:[0,1,1,""],Batch:[0,1,1,""],Choice:[0,1,1,""],Filter:[0,1,1,""],FlatMap:[0,1,1,""],Flatten:[0,1,1,""],ForEach:[0,1,1,""],JoinWithTable:[0,1,1,""],Map:[0,1,1,""],MapClass:[0,1,1,""],MapWithState:[0,1,1,""],Partition:[0,1,1,""],SampleWindow:[0,1,1,""],SendToHttp:[0,1,1,""],ToDataFrame:[0,1,1,""]},storey:{aggregations:[0,0,0,"-"],drivers:[0,0,0,"-"],dtypes:[0,0,0,"-"],sources:[0,0,0,"-"],table:[0,0,0,"-"],targets:[0,0,0,"-"],transformations:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","exception","Python exception"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:exception"},terms:{"10m":[1,2],"24h":1,"abstract":0,"boolean":0,"byte":[],"class":0,"default":0,"enum":0,"float":0,"function":0,"import":2,"int":0,"new":0,"return":0,"throw":[],"true":[0,2],For:0,IDs:[],NOT:0,The:[0,2],Use:0,Used:0,Will:0,_batch:0,_concurrentbykeyjobexecut:[],_concurrentjobexecut:0,_functionwithstateflow:0,_iterablesourc:0,_unaryfunctionflow:0,_writer:0,acc:1,accept:0,access:0,access_kei:0,accord:0,accumul:0,add:0,added:0,addit:0,after:0,age:1,aggr:0,aggr_filt:0,aggr_granular:0,aggreg:[0,1,2],aggregatebykei:[0,1,2],alias:0,all:0,allow:0,also:[0,2],ani:0,api:2,appear:0,append:0,append_return:1,appl:[],appli:0,argument:0,assert:0,assign:0,associ:0,assum:0,async:[0,2],asyncawaitableresult:0,asyncemitsourc:[0,2],asyncflowcontrol:0,asynchron:[0,2],asyncio:2,asyncsourc:[],attribut:0,augment:0,augmentation_fn:0,avail:0,avg:[0,1,2],await:[0,2],await_result:0,await_termin:[0,1,2],await_termination_fn:0,awaitable_result:0,awaitableresult:0,base:[0,2],baseexcept:0,basic:[0,2],batch:0,batch_siz:0,befor:0,between:0,bodi:0,bool:0,both:2,branch:[],bucket:0,buffer:0,buffer_s:0,build:[],build_dict:0,build_flow:[1,2],cach:0,call:0,callabl:0,can:[0,2],caus:0,chain:[],check:0,choic:0,choice_arrai:0,client:0,close:0,code:[],col1:1,col_nam:0,column:[0,2],comma:0,complet:0,comput:[0,2],concurr:0,condit:0,configur:0,connect:0,construct:2,constructor:0,contain:0,content:[0,2],content_typ:0,context:[0,2],control:[1,2],core:0,coroutin:0,count:0,creat:[0,2],csv:[0,2],csvsourc:0,csvtarget:[0,2],current:0,custom:0,dai:0,data:[0,1,2],databas:0,datafram:[0,2],dataframesourc:[0,2],date:0,datetim:0,decid:0,def:0,defin:0,delai:0,delay_in_second:0,deprec:0,describ:0,destin:[0,2],determin:0,dfs:0,dict:0,dictionari:0,did:0,didn:0,directli:0,directori:0,discard:0,divid:0,document:0,don:0,done:0,downstream:0,driver:0,dtype:0,each:0,either:0,element:0,emiss:0,emission_typ:0,emissiontyp:0,emit:[0,1,2],emit_before_termin:0,emit_fn:0,emit_period:0,emit_polici:0,emitaftermaxev:0,emitafterperiod:0,emitafterwindow:0,emitbas:[],emiteveryev:0,emitperiod:0,emitpolici:0,end:0,end_filt:0,enrich:0,enrich_with:0,entri:0,enumer:0,environ:0,equival:[],etc:0,evalu:0,even:0,event:[0,2],event_field:0,event_tim:0,everi:0,exampl:[0,2],except:0,exist:0,expir:0,explicit:0,expos:0,extend:0,extra:0,extract:[0,2],extractor:0,fals:0,featur:[0,2],feature1:2,feature2:2,feature3:2,fetch:0,fewer:0,field1:2,field2:2,field3:2,field:0,fieldaggreg:[0,1,2],file:[0,2],filter:[0,1],filter_column:0,first:0,fix:0,fixedwindow:0,flatmap:0,flatten:0,flow:[0,2],flowawait:0,flowcontrol:0,flowcontrollerbas:0,flowerror:0,flush:0,flush_after_second:0,flush_interval_sec:0,follow:[0,2],foreach:0,form:[],format:0,forward:0,frame:0,frames_cli:0,from:[0,2],fromisoformat:0,fsspec:0,full_ev:0,futur:0,gcs:0,gener:0,get:0,given:0,global:0,granular:0,graph:2,group:0,group_by_kei:0,hash:0,have:0,header:[0,2],hold:0,host:0,hour:0,how:0,http:0,httprequest:0,httprespons:0,id_field:0,identifi:0,illeg:[],impli:0,incom:0,index:[0,2],index_col:0,indic:0,infer:0,infer_columns_from_data:0,initi:0,initial_paramet:[],initial_secret:[],initial_st:0,initial_t:[],initial_valu:[],input:0,insert:[],insert_id_column_a:[],insert_key_column_a:[],insert_time_column_a:[],insid:0,instanc:0,instead:0,interest:2,interv:0,iso:0,items_in_ingest_batch:1,iter:0,its:[0,2],join:[0,1],join_from_respons:0,join_funct:0,joinwitht:0,joinwithv3iot:1,keep:0,kei:[0,1,2],key_column:2,key_extractor:0,key_field:0,kwarg:0,label:0,lambda:1,last:0,latedatahandl:0,later:0,left:0,legal:0,librari:2,like:0,line:0,list:0,log:0,look:0,loop_task:0,mai:0,make:0,map:[0,1],mapclass:0,mapwithst:0,match:0,max:[0,1,2],max_ev:0,max_lines_before_flush:0,max_seconds_before_flush:0,max_updates_in_flight:0,max_valu:0,maximum:0,mean:0,metadata:0,method:0,metric:0,middl:0,min:[0,1,2],minut:[0,1],miscellan:2,modul:2,month:0,more:2,most:0,multipl:0,must:0,myfil:2,name:0,namedtupl:0,needsv3ioaccess:0,nest:[],new_col_nam:0,next:0,none:0,noopdriv:0,nosqltarget:[0,1,2],notat:0,nth:0,number:0,number_of_stuff:1,object:0,offer:2,often:0,on_error:0,onc:0,one:0,onli:0,oppos:0,optim:0,option:0,order:[],origin:0,other:0,otherwis:0,outlet:[],output:0,overridden:0,overview:[],page:2,panda:0,param:0,paramet:0,parquet:0,parquetsourc:0,parquettarget:0,pars:0,particular:0,partit:0,partition_col:0,partitioned_by_kei:[0,1],pass:0,password:0,path:0,path_to_t:1,payload:0,per:0,perform:2,period:0,persist:[0,2],pipe:[],place:0,point:0,polici:0,port:0,potenti:0,predic:0,process:[0,2],produc:0,properti:0,provid:0,push:2,queri:0,querybykei:0,rang:[0,1,2],rate:0,reach:0,read:0,readcsv:[],reader:[],readparquet:[],real:2,receiv:0,record:0,recovery_step:[],redirect:0,reduc:1,reducetodatafram:0,refer:0,relev:0,renam:0,repres:0,request:0,request_build:0,respons:0,result:[0,1,2],return_awaitable_result:0,right:0,round:0,run:[0,1,2],same:[0,2],sampl:0,samplewindow:0,scheme:[],search:2,second:0,secret:0,see:0,seen:0,sendtohttp:0,sens:0,sent:0,separ:0,server:0,servic:0,set:0,setup_teardown_test:1,shard:0,sharding_func:0,should:0,show:1,side:0,signal:0,similar:0,sinc:0,singl:0,size:0,slide:[0,2],slidingwindow:[0,1,2],smhd:0,sourc:2,specif:0,specifi:0,split:0,sqr:[0,1],start:0,start_filt:0,state:0,statu:[],stdvar:0,step1:[],step2:[],step2a:[],step2b:[],step3:[],step:[0,2],storag:0,storage_opt:0,store:2,str:0,stream:[0,2],stream_path:0,streamtarget:0,string:0,strptime:0,sttdev:0,success:[],sum:[0,1],support:0,syncemitsourc:[0,1,2],synchron:[0,2],system:0,tabl:[0,1],table_path:[0,1],take:2,tal:1,target:2,task:2,termin:[0,1,2],termination_result_fn:[],test:0,test_base_tim:1,than:0,thei:0,thi:[0,2],time:[0,2],time_col:0,time_column:2,time_field:0,timedelta:1,timeout:0,timeout_sec:0,timestamp:[0,2],timestamp_field:[],timestamp_format:0,to_parquet:0,todatafram:0,transform:2,tsdb:0,tsdbtarget:0,tupl:0,type:0,type_infer:0,union:0,uniqu:0,unit:0,unless:0,updat:0,upon:[],url:0,usag:0,use:0,use_windows_from_schema:0,used:0,user:[0,2],user_id:2,usernam:0,using:[0,2],usual:0,utc:0,v3io:[0,1,2],v3io_access_kei:0,v3io_api:0,v3io_fram:0,v3iodriv:[0,1,2],v3ioerror:0,valid:0,valu:[0,2],variabl:0,via:0,wait:0,want:0,web:0,webapi:0,well:0,what:0,when:0,where:0,whether:0,which:0,window:[0,2],window_s:0,windowbas:0,windowsbas:0,with_head:0,within:2,write:[0,2],write_head:0,write_thi:0,writer:[],writetocsv:[],writetoparquet:[],writetot:[],writetotsdb:[],writetov3iostream:[],written:0,year:0,yield:0},titles:["Storey api","Storey examples","Storey Package Documentation"],titleterms:{api:0,document:2,exampl:1,indic:2,introduct:2,miscellan:0,overview:[],packag:2,reader:[],sourc:0,storei:[0,1,2],tabl:2,target:0,transform:0,welcom:[],writer:[]}}) \ No newline at end of file diff --git a/storey/transformations/__init__.py b/storey/transformations/__init__.py new file mode 100644 index 00000000..c2ae006a --- /dev/null +++ b/storey/transformations/__init__.py @@ -0,0 +1,14 @@ +__version__ = 'unknown' + +from ..dataframe import ( # noqa: F401 + ToDataFrame +) + +from ..flow import ( # noqa: F401 + Map, MapWithState, Filter, FlatMap, Extend, JoinWithTable, SendToHttp, Choice, Batch, MapClass, _ConcurrentJobExecution, + _FunctionWithStateFlow, _UnaryFunctionFlow, _Batching +) + +from ..steps import ( # noqa: F401 + Flatten, Assert, Partition, SampleWindow, ForEach +)