From a671a00b8162e93cc272b1837b6a841f2a652d6e Mon Sep 17 00:00:00 2001 From: Matthew Gramigna Date: Thu, 11 Mar 2021 11:23:01 -0500 Subject: [PATCH 1/4] CSV Validation * Include schemas and tools for validating CSVs * Add BaseCSVExtractor class that all CSV extractors extend * Update excel sheet to indicate all fields used * Update tests to use proper calls --- docs/CSV_Templates.xlsx | Bin 613962 -> 614021 bytes package-lock.json | 37 +++++++++ package.json | 1 + src/client/BaseClient.js | 18 ++++- src/extractors/BaseCSVExtractor.js | 27 +++++++ src/extractors/CSVAdverseEventExtractor.js | 11 +-- .../CSVCancerDiseaseStatusExtractor.js | 8 +- .../CSVCancerRelatedMedicationExtractor.js | 9 +-- .../CSVClinicalTrialInformationExtractor.js | 10 +-- src/extractors/CSVConditionExtractor.js | 10 +-- src/extractors/CSVObservationExtractor.js | 9 +-- src/extractors/CSVPatientExtractor.js | 10 +-- src/extractors/CSVProcedureExtractor.js | 9 +-- src/extractors/CSVStagingExtractor.js | 9 +-- .../CSVTreatmentPlanChangeExtractor.js | 10 +-- src/helpers/csvValidator.js | 39 ++++++++++ src/helpers/schemas/csv.js | 70 ++++++++++++++++++ test/cli/mcodeExtraction.test.js | 2 +- test/client/BaseClient.test.js | 14 ++-- .../CSVAdverseEventExtractor.test.js | 4 +- 20 files changed, 235 insertions(+), 72 deletions(-) create mode 100644 src/extractors/BaseCSVExtractor.js create mode 100644 src/helpers/csvValidator.js create mode 100644 src/helpers/schemas/csv.js diff --git a/docs/CSV_Templates.xlsx b/docs/CSV_Templates.xlsx index c9a97fd65a493d6f0903fe28c9125c975f453ca0..742d490f507bb5b308ce648c670cd407d8d0497b 100644 GIT binary patch delta 10267 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 delta 10231 zcmZ8{1yr5A(k>1gcXxO90>$0kU5aaQ*c2-i*NwZoySsa_ja!Rbi_6bB-?{hv_r7aA zD{Jy5lgUihWHL!uH_b#BP2Bh4e;hqez5YdGF-yo_mYHCTP>-tA zD2JrJdjt%xmP26@*vG+TKVWLqa}RDTA(zxFwlzq#(N0@_+L9Qnz3#usDxtQvHAv7u z%XU#WhrG%RuF0G+NHN~88F*Axqjui6@-q&3Ip5Pu4UuD2$VQX;*6U|n6h({f* zL4e24wh^-ZE`o;XvSUWK=-1El5P$~^*A(7Ep+-G`tkX2w9-l()Sz$l}&fl+;|H}Kq z`4weSPRL?Mkc;YSe+++peCU>#uAb!{K7Q9YjdSD2ULN4sx9HQwCk6Me5S(&n`lGty zHKJ&p(<_dH=d=0h*Z5GYd%prpa96nuYV#(azKz4D1^Ajvh)R%?!zw9qtKDCsX-P-} z(^1z8HgO$TQR#1|gGE#8z;Na(w<0Fg78t<=6E$oUTCPbx)ji#CVHb0%2vh#_wj_E~ z^A&e!*ts(bO-H==idOAP_4GYK8e$kJvB9|`E1T5(?~C5_aeH3rjImf$+7eddp5VqH zYwxByD~BiC`>bMWd$B2DB>Kt1;hhb0{e_H@Hba*mlbyc6$g(3(;7|m)j|}`w81yi6 z2}(bT54LX8Yopq%W{L+H%b9Wi;Y!Glr?alx!Z%}a9H%=x)$Ork5>9`z?U1fESzbDV z_!Nrswfp18Uq?xbTdS5W-@3BVPie5Lp`QkSNk=>HqBw@h z2M8=%eu0fOn}(~|1wMRpe3(Pq`HKOsly^aw=NYaT#?&kGz7L2(g^C`n!pbsymXO11!!80BIBJ1+= z*U-a4PfF$t(%x4UNg6zJ<=j>wMm#S9g`?F|yVbp|jmVgq5G6A4(W&S-Wd)|Q9Wf?f zVzO%m9cqjZoGoy^C0#?~0OW#qn2Grb|9DTi}t z>Mm>2KW|w&jsiD?PILl{NX*=XSL8r`A#J3B9D5Sg2z4xrJI*YHVRa zp)9bSa3X1JC#ic%!?@2r&}E4M&tHdE9&6NnvpngBzp)Zw@+AS^tv8NJ%*sPqN?TLR zE#V64rP9J*{c97qFSX&s?aHk!`uHChiWXN)yh|%puzcYmNP^bAM~VEBkMk(uZ|Yzi zd~ab#W@2H^0{=vD;+C@AKu-Tf}xaK<^_f< zEdi}my+ebPvFcw9WzZ%O-W164| zw|nKVA9>RK6Ln{_iGZQdUTwnDW;mLW?d7|nmKrVDS)u_25A86;Q)79c*5m@sA?$XQ zn@@9|A$h2vYxlz#rr z{cju=MT~PSB_oX?U#TJtfq18+#+)wYnWXpeb~(LPJ#duvh~>uhjt=4Kd4?K=Ms1R7 zuJw{!n+n&(0k|~%Pbt#k(+l>gH2d(rHs|fk&;#GJES|0&J|rbJM!4)MEpS9~TJcwR zWkHQxHSA!WQj;`ronb(I6h_^oT-8QaM;i4dhU4Ju11SMhpzPuQ<`O(Q>;*^ zXnJYn!a30r1>NVkl`vdT<>duteh|4NhdF*29H-Gh>QkEn%SD?cJvqXE#sH~$#&s_3 z#VUkC1)~o~m|+u+d8`Sni_|E1T=jVk*IYwT{lNIwSjRWObc^V`!I4q=z6kRnc0?4* z4*#Ryl)r09RueRe)K>S z+jog%uS9+Tg=8NF_Lr!p1-sf=TKtHNp(@9`pYw0`B;fXV1wG#)b@*Smd|YqVXJ$9& z!U{1+Wc zBxXvF)FL!2!9pU5$nH_V99dN7yJRcfJ{`}x$4HDWji`ntPZGL1uB?L+>xfkgXcfp!b)wEbsBu;kY@gwC-$`kTh$$yj5CTN)haGTT9nJzGDo7VC=m> z8Ijl+FE}8pf7e2E#-;8=Vw#%r{Q#7;!Se_x|SVwX5fvf;1)-ydulK{1>c@fth z8jb@pNb>nCi>qnr)~V~E?5T0v`3WtxG64^D`F7VFof0U5FgR>iM>wPN<$(Dps`exUI^WyV zGH$lKExSp4_N&lAaQ5E0^Pea2#6h*b42Tx#BkiVVT})C5^^nF?rtAn?MBLrp1eykZ z3cBmgSY;v)VI~BBy7(nS|1qJk(uXP7Y5814N+rkwMnrsIZN`8*%O4uVcy+ZtT~+d5 zv;z|;=e@kAc=o2u%WXUT5~LDB6U5QQ?Q=I3C;<`BExN9Kx*1+Q_J# zUFwyK>b$~&G_=}bEc$=NJ$YW|r0oYoj|f%?u8^)1rZ)(d@9YLzdMzMol@oZIvD}nK znw?H*^Rx^Bp=N2LjZygDgTCk1bt$P*8->8eu2l%c@dOx#CY z@y>ZGjr9!mml!Wz3U7}aL&XT@CNtg&&2lxg%9mUWtKs5XQ&+%+xPR;T&BEYbKJ8KS ztor0qNmRK+gIJ|JyWR*(KRJmXti+a$j8SV?QJx^=x?DVfTM~|K*7^If^bV7JD zNj=boz*y;;;9FRy7RHRLq}LF?JPU~agH0?sR&_p)?Z~Ao6W+~Mt75^h_d-xq#-Fbx zJgfNwJu|F$JZoT?;EVJ>J~!cnQ6V5UBtb#g01}`( zQ7gtpNFLHh6+>yY8tC3KUxE2eW87%Dn=nlyN`!$5&?20z15gAAdn=Wc=b# zi82)W+=hFy^ZgNILd;Z5FmiPA*e?w{J)d_dDTo|)rMa~bj{6~`%#9!v z6=&lcC{#H5ro}8ii@PEpRrP$7SlT4YJWxAqg=uly4H&kgq0Bb?p;6<|jJqWUC7If5tr2M;OpO}jAX?-$&Z-uI59LNnVh8=aBO}EM= zvo4r#62aBeF-21?hkqBpvA-^4o^S+>Ma@7jgi$pgVtBv|Xp0;F2zeAZjrGGz)fUwq z(#?S*us>McufQ1!d#LKHZD{~TNE*t|>yZC0W^`MKyvTb}(ly`~nM)u0t5gIl zKDz!^@N+IMq%u=~BPPE+Qdj)m6!V<{*kgx$eXW1Wf1y3RIPS}4BcDeF^wXMSHY`npa zV(3GKtL+IM6Cyv#;yL_utS3d7e2Dio%Ub2OG94iGkft~A3TJStRa)ftUl7Ml?b1gI zCsglZN$P2>k2e1Fl6Dt0er5h%Z!tVktv9=oG84%a1PN8BlrK4>-7q%AT}i1F#pF$* zPy{8BWw2JXO+ePLPVJ@*tRP5ZwvLL*ed7%fe3pa@p!idyiRByHn^l?CS4FV@X|wOp z13>i_&=&PFa1_%vk?hJNY%DoM)!0p{L)b7!RHMhNNu5-zYK^(TXYM4y(aF`u<#ecu z)Qc(krE{6ISW%y4IwsYZLeK~`Q?yloY!HJCgITizXB8Ef8p)s>C~6fYW50<%(TPZw zx&muR!KH@KDZh}+0?ULGL5JJJ{Ac9qJw%a{wU)q~v<0FO{b|PpL&lUmor?||vwuIN6%&=U zPH`l3SlCIVG(1Hpphd#S567^jh@LdoDUGSa4JxWlKZIbtYU8!>=S3aKOGY^kuS6MJ z0wlrTwaQ!X-eYgmR>oCJY%AZxU!pLPg?`=Og%&9t-P~|dOD6{5?JK6tha2}wR{fEt zK8@l1{N@lSWQnj+qQN@_DVtkN!pl8lkcM`f6vRc9i{XK00c`So%4BvX$x|FX!LP!R z@^Db1$Zl@xu6Gw)!jtGJP-u93dQmp{RoIK_Q;p?^{wh{BSf$qGpzmOjRm&^Bz+emJ z;KZT~!`&?li$1QS>dGst!)O&o*4ortV}+71%4&%F@4KP;Ek9ym_*84 zoIiQ*2PWO#0>_UTLawXczt*o2TdgIi1H0P=I@$p&9^n+co^7S*N`EYZoj$8o!`2;J z8kjoMr=Kb~$8fWvwKw3*Cc3m-3nq+x&E%L3>hzx+4Y0|UiQu`5+16U5)FKL=-yivP zXI|QXAwJo60D4z4A7W?u%D zey!6-tK5L9=`}1Qw?$`C!C*H=mbKvzbSrtVT+@d}RpaCUDEnhFMIC z1LkU#Mzw~koVmq7FCUJpj;)VzSDUj9*(fwC0e^K^UWVmo|3TSu*L(|KYK`U&O4nF$ z4Y}4T-$-;pq!HPUvhp(vc1N14MtokSDf7Fjn(&Eo5Gcn*JnYQZXhj+w{d$boC&(S&EtvEuujR( zVxCZv7F*GDc2t}?E*oQu2sb#__h{tdJv^j4x78SitI}v-Dm1=M<~HeI!--BjkYF!e z!4mfx%AYZclY34Ppgc&G2tW+%UOkoYjGE#0X<$y`&cQ^mog1?h_Pf37BzW~RCyxc> zFw-P1#;DRe<-btddvj7rKw>H3FNETA${`ter5moxp4ZsSxqM|a)L@_JlzfEeYOeXQ z2}&{8u@qhKnW&K0+b%+}pD+$JmFSgD{tI!UcOD3Z;MB=MGdQm9@L&a0A2T~T@u7-4 zTj>bo)Y?>SHiz%qWLRpT8=v?lT}Q|}`O;!CBIyPB-^w!7NS8Sqk6|0rWA11S5<&`g;mY ze7%ej%QE6j z!x*~dt+8}Pjr)6{fR!zLy^2j>l5@l9-8IZ^6^`KQ%dtBFg$2R&Owq7j0OWy^b zHs%|pY@h`I+~#>|^L=tP5n?^Hjj?(NAp(m_F7UZQ7uVeF9OGEc$Q1*v516_?<0~6G zUJ~gTOa=%wa*G}_whn%CSD8|_1%Q9;dmTNY2?*8z5vlE@P^Z4?*`@BF{V3^~9Q(r@ z9F8qU#a`V7Whr>u#Ln&%qxRj$4AMhBKseTdq`W+Q1qW8q;&;6}1!i@Z2%Mb%vmn|tb{r$T@7dPmX5}qL&!O$3a z!l{0Lpmeqe+<*~oaSrF7@VV)%KOJ^VM@K#ABwb~BH(ZP>-7|8f)4K*Fcea~3XCfD% zDhFWorJw-eNd_NI*|*^2Oh0pu#g@z3P1+VsIA^k5H)-``M60K*pHyMStOUO^4mpej zuxiT|D|I+m525^YNH-LxxMTjJHuS=XvLu*^0B<)>1Wug3M@GE#J7X=~>C-9$=Zq&N zwwgdJloN^LY9eQeTae$QcN8`TA+^)EmZV(kOms1*R`MEe=KJHcKZm>mo#3V8`$dLI z7LbvWc@^_ZKZ%wV7&>BdMZiOn;Q3|r&^2M_W>N_T~OhSHg^F?QHTj%KCBM&FTt@?&jDVMBNj6v*4Pg!X^hWzPi%A2+8NyvdZC!F z^biK$_n&sRww1l^bszl98;+Qk=xtWm>c%?t4FQV|#XO@hWgQTIA*t$Uk;%d216E`& zWe5x_(GG+(VCM7BrGlH>cZJ@By&P;&Gv4#3_u#&ddzamvH^kjVa>YoGanmE+RFhUa zZnl)-iQKfWlvK2hpD~`U0Ce{o)U9y~wj zPdK1DvDV&LVedvb3M_Zza?$y01Pt^Mv%H8cl)SM0tDBj-@T)95YmQnshe=CPv;PN% zX{Wuf7A6THKe2dALeCxb{*(;uZQ#J_jgMu%#HVYq`1&0Yo;xbnL9~m89?;yvE`!7h z8)H4|Y$?nW^W+s0mJ>3g|Cq=F;Vwl;k7?3x?oS?kNeuH&ZyRU!rF=27vcQC?Lz+LC zvYv?KEfx5!*Nso8Du)-&YY>7aif@`c@ef2S?BeSgcsUip4#;uzwtMZ+MaL~BTt(z} z>B<@4qd{S`4w~PA^)S%WaD(nWBgQc2R#wyW?hmZ5b-|C7X4N6)6%*6xByQ_J6P+T! zQPp;!hW(u0ahbDPNEb)3Y1YbhB|MwZd847uCBItLur~C8s1rL7 zh(p(ZrL7;%sc+vQLA!DQY|xr603BpW10VpQ>j4m3t*HQ4PyiXkynxYU@r8#Q?Yc77q^w%RJ!SRbL25?TX(N#cY7zPdhwGBAUbloZk7lQejg!l z;*lpQqO>lHaOzd6t{h6j>w1`Gt#*nG%ZBgvmnD}QU*_f*65Z|?T9*qqc=a0z++9i| z_|>Kc^bA88-O0%>Ts6hi&_TP zIBakb!xwoAMI5T&Q7o2rXVcm}lX6&~?3^hBj#7tuYZAk23=vvFo_wtI*%OPkucmCLOXaGFE$3#Pwy2{9V6xd%!UXmm5; z6Xv7*ML>wzVEluq@Y7*vysD1LyR}tEEFhHeqIQ;~wTJ^Ic--=yCuccsNOqR!s>osGqR zL)W);d5v&KZ5tgrnLRV9e!D#sO=EiMaigBuWYiBihxlJ`XiKzTn7M-K`GlF1cqc)u zQNNn?dOY=x9Am*bD7LYkryNp??%NhW7A(YO%7*$;YiVX)Y$7f8f1la|C$x^pS0`Y6 zQUo-nV=`Hh>UlmpJ$pByz!{O6XyDxSD}uMS{$76>e`}AEnXEr$jVmorY-~CwHn;D8 zU)UF&7BG3Pn)eI@AEw*Cb)J5s(9hWf39agD3E4CYRC5Pk=a*u{UTwi0l;hd0-yfwQ zb(fyWM)YtReOa79S8?A2N?-37j*7ILSHWbb)HOEP*EF?6gjDM>Txt&}lCsT3D=9hI zbC!*(CbDRGH{(}L)N1`aXrT?sK&Dw!haFy5=lLR@hdzb%g_DuAhcvF8)7~ISOes9k zVJ#Sbc=uWQ!izT9=oEg2ks%n4B-H~96A<6?nIV&Oj&29;rO>S&CyOktK^qpwN*?}xiHy*^!OBRx0g8e)=dOJFLJ*lDK4*fTw!0~fV#pl>Kb;sw^ z9Nj%oYvzq%idtZDE4kUwS#T>F)VXYRk5P9C(r-L(*2=Y&Nq3JTFO1K$?dp^#c)C_qCcqUm;&~zZr_Ud*4FT<68GVoi8-Ng~klN|j znNm?f_OAp!Z=?peucqSdK9(dAeN>@cQ-7IOK!httfE2Bf?b64Z1hCJ*a>VN<1g4Y{ z=d-QP1oytT5Jo#jAsITjNF#B!enx2RWe$8X^DH=vxddR~vSa%@U53$@)=VY|k8^l^ zkwf%uEM^{s>S@THRFJ-sW&uuct=xBwO}px^;tVEl4v4jaxhXi5Pz4wyr3PffVIOAi zZO83fgxbScN6*exQ86<>qV>v+n*Q|a;EAN;$(lUmTCUamPl&GO-CPg1yI4!sOSd`2 zLQ43D9!$iho=myV;M_JWJUSE&;5*-Z-kjAz+5}9C=34-3zS-bmE6}n(+fq$}c5t}l zy9Zb6d!T3`d92Q0Kff;`yhCgbWzl;puQdsf{pr56wLipnz%bbl3^S%2w4@NX z<@ucNq&M${gffcY&-%ZOiK+dTTKIWc5|Yd)h;QGq`|gV7Rsei36}k;eaF4U7lg8*@ z9XWps5FfxMiEcKjpkAKu#k`*PVTi7#yLSK}Gm@EB1&EI5nz&lK9R<~Uj!d~0W)(d# z1q>A3P4uDzE6bRS^Q8~j%U>660v&x=?3OA7krgX?q}3G&r25-Z$Zixf6NU=}%PK5~ zba#fM=aXQ65&>KK6qql?xl>U4VSY1CYN4p%Yr%_RjR-=(imD6Cex&kec)qK98p0H& z`z0^W#*c~&ol>R-z?@L-i40s)<~&7|Md|*<$S5^=j&KF-ukDl{okT%mdg%51rAT7k zql1pbZPI}*iit!jce-KGs5&H4261d#@Zag&8jZuI@&O+|9ySOQlIt_3!bPM;wV@H% zVt8}beRJ6Ad>StAt#TZcXyk>t|au-aggZ z%glVcje0X=-H|@N9$P-3&7oKdtx%WEXeSAJkMRiC?;s_LcHpuM(7VeS0;vc-r>tc6 zn2`PGkps?F8@S;le?rjSUv5j09fc_CA)9+=jCV`011iEcNU%9qT>jFj?0{Q$UpQPj zeRG8Eso(-#r~6xrvT?T(lwk+h?j#AqIsO%fOswpHw6j;j$*ZWYxfsi;%eL!lPnipG z@WYU8^YL}MDP;Jqx>e8O&%tyZ`x3pz%F>pSP|bXjCPrFiS1t^H6r9=+M>_7AhWO>% zsk7h1u$<^s4)lc+1I}MO+oDI5&Ii1Iq9$ZH04Zpj3%~->kptv_1dIWwATCV+4hY=< z01GoLY6AX(?63jIfLZJJAvH({2)|YtUH~g3kfnIhDzQaj>1^E?W`;T6<_H^lw;YCkyXrhq zKbJ4Y#>NL5sx>S^dX9a*09HimLwY{gbzf)tkyz(^Ggbg9&X7Df{L!U}$N?W{L)532 zq3j9`%mEw`Tm;niNoeLA)XeSzs^CChoPsMp-A;m_m5%W^}SvNvF*XcmL zfl=V5dZh)7Xktw;(vcExc_eUaTyE?63_uKLU|MZ)6Z82zy{?< z`VZ0fK|mIQu52K3lM{bqym6UsR4xl zipaU4$*BKLQG@LD0F2O-H2?V*Km$Mob?E`nVgDVhgXZ-BIMCFzfTVd!Y|yJ7fDM|0 z=^sKuAAm#h-)-;zpAH7wKg}XPnt|*L0ff-uTmaA<*T>mlR{!H{@UgZDp`Ez_AT^PX zs*m-JL;QaiG!z5`#{V;eJ|2*m0YDg176klP;RNb70Ej}j2>-h`0f@lxLtXQqK~jbQ z8c>ctfDkeW6lMqzg-VwL5gP%hL8pcvS}O$+838n*nw3DVMgV!JPL+R^xS&s}A2Z%G j`rt62_D>DjhiIVf4>r)_8vl{c&KQ6L$D#%Jkm`Q`AX+ij diff --git a/package-lock.json b/package-lock.json index 4f1fb57e..ce0b8434 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1502,6 +1502,23 @@ "cssom": "0.3.x" } }, + "csv-file-validator": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/csv-file-validator/-/csv-file-validator-1.10.1.tgz", + "integrity": "sha512-jYFl3a/ptlJIEzLM28BlApn+JthmCz/3f/WLdt2fdCmMGb+eiP9QkulFhmepzFFrMi2Iel6m4OPXrHWpOFCHqg==", + "requires": { + "famulus": "^2.2.0", + "lodash": "^4.17.20", + "papaparse": "^5.3.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + } + } + }, "csv-parse": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.9.0.tgz", @@ -2322,6 +2339,21 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, + "famulus": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/famulus/-/famulus-2.2.2.tgz", + "integrity": "sha512-tobqs8uC0OomrMN/cX7aUUj3OSJn5y2GCfcTleCrtIfjxUkl6kJFLovnyEWfD6M+cQ1ZXhE5BaTJzMoDibbodA==", + "requires": { + "lodash": "^4.17.20" + }, + "dependencies": { + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + } + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5021,6 +5053,11 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "papaparse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.0.tgz", + "integrity": "sha512-Lb7jN/4bTpiuGPrYy4tkKoUS8sTki8zacB5ke1p5zolhcSE4TlWgrlsxjrDTbG/dFVh07ck7X36hUf/b5V68pg==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", diff --git a/package.json b/package.json index c515c230..6d6c51e0 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "ajv": "^6.12.6", "antlr4": "4.8.0", "commander": "^6.2.0", + "csv-file-validator": "^1.10.1", "csv-parse": "^4.8.8", "fhir-crud-client": "^1.2.2", "fhirpath": "2.1.5", diff --git a/src/client/BaseClient.js b/src/client/BaseClient.js index 9b8d5eea..8d9278de 100644 --- a/src/client/BaseClient.js +++ b/src/client/BaseClient.js @@ -25,18 +25,30 @@ class BaseClient { } // Given an extractor configuration, initialize all the necessary extractors - initializeExtractors(extractorConfig, commonExtractorArgs) { - extractorConfig.forEach((curExtractorConfig) => { + async initializeExtractors(extractorConfig, commonExtractorArgs) { + const extractorInits = extractorConfig.map(async (curExtractorConfig) => { const { label, type, constructorArgs } = curExtractorConfig; logger.debug(`Initializing ${label} extractor with type ${type}`); const ExtractorClass = this.extractorClasses[type]; + try { const newExtractor = new ExtractorClass({ ...commonExtractorArgs, ...constructorArgs }); - this.extractors.push(newExtractor); + + if (newExtractor.validate) { + await newExtractor.validate(); + } + + return newExtractor; } catch (e) { throw new Error(`Unable to initialize ${label} extractor with type ${type}`); } }); + + await Promise.all(extractorInits).then((extractors) => { + this.extractors.push(...extractors); + }); + + logger.info('Validation succeeded'); } // NOTE: Async because in other clients that extend this, we need async helper functions (ex. auth) diff --git a/src/extractors/BaseCSVExtractor.js b/src/extractors/BaseCSVExtractor.js new file mode 100644 index 00000000..58b7778e --- /dev/null +++ b/src/extractors/BaseCSVExtractor.js @@ -0,0 +1,27 @@ +const path = require('path'); +const { Extractor } = require('./Extractor'); +const { CSVModule } = require('../modules'); +const { validateCSV } = require('../helpers/csvValidator'); +const logger = require('../helpers/logger'); + +class BaseCSVExtractor extends Extractor { + constructor({ filePath, csvSchema }) { + super(); + this.csvSchema = csvSchema; + this.filePath = path.resolve(filePath); + this.csvModule = new CSVModule(this.filePath); + } + + async validate() { + if (this.csvSchema) { + logger.info(`Validating CSV file for ${this.filePath}`); + await validateCSV(this.filePath, this.csvSchema); + } else { + logger.warn(`No CSV schema provided for ${this.filePath}`); + } + } +} + +module.exports = { + BaseCSVExtractor, +}; diff --git a/src/extractors/CSVAdverseEventExtractor.js b/src/extractors/CSVAdverseEventExtractor.js index 793bd151..09cfdd52 100644 --- a/src/extractors/CSVAdverseEventExtractor.js +++ b/src/extractors/CSVAdverseEventExtractor.js @@ -1,7 +1,5 @@ -const path = require('path'); -const { CSVModule } = require('../modules'); +const { BaseCSVExtractor } = require('./BaseCSVExtractor'); const { generateMcodeResources } = require('../templates'); -const { Extractor } = require('./Extractor'); const logger = require('../helpers/logger'); const { formatDateTime } = require('../helpers/dateUtils'); @@ -53,15 +51,14 @@ function formatData(adverseEventData) { }); } -class CSVAdverseEventExtractor extends Extractor { +class CSVAdverseEventExtractor extends BaseCSVExtractor { constructor({ filePath }) { - super(); - this.CSVModule = new CSVModule(path.resolve(filePath)); + super({ filePath }); } async getAdverseEventData(mrn) { logger.debug('Getting Adverse Event Data'); - return this.CSVModule.get('mrn', mrn); + return this.csvModule.get('mrn', mrn); } async get({ mrn }) { diff --git a/src/extractors/CSVCancerDiseaseStatusExtractor.js b/src/extractors/CSVCancerDiseaseStatusExtractor.js index 7afc09b4..69685241 100644 --- a/src/extractors/CSVCancerDiseaseStatusExtractor.js +++ b/src/extractors/CSVCancerDiseaseStatusExtractor.js @@ -1,14 +1,14 @@ -const path = require('path'); -const { CSVModule } = require('../modules'); +const { BaseCSVExtractor } = require('./BaseCSVExtractor'); const { formatDateTime } = require('../helpers/dateUtils'); const { getDiseaseStatusDisplay, getDiseaseStatusEvidenceDisplay } = require('../helpers/diseaseStatusUtils'); const { generateMcodeResources } = require('../templates'); const { getEmptyBundle } = require('../helpers/fhirUtils'); const logger = require('../helpers/logger'); +const { CSVCancerDiseaseStatusSchema } = require('../helpers/schemas/csv'); -class CSVCancerDiseaseStatusExtractor { +class CSVCancerDiseaseStatusExtractor extends BaseCSVExtractor { constructor({ filePath, implementation }) { - this.csvModule = new CSVModule(path.resolve(filePath)); + super({ filePath, csvSchema: CSVCancerDiseaseStatusSchema }); this.implementation = implementation; } diff --git a/src/extractors/CSVCancerRelatedMedicationExtractor.js b/src/extractors/CSVCancerRelatedMedicationExtractor.js index 3d05b694..259f9075 100644 --- a/src/extractors/CSVCancerRelatedMedicationExtractor.js +++ b/src/extractors/CSVCancerRelatedMedicationExtractor.js @@ -1,7 +1,5 @@ -const path = require('path'); -const { CSVModule } = require('../modules'); +const { BaseCSVExtractor } = require('./BaseCSVExtractor'); const { generateMcodeResources } = require('../templates'); -const { Extractor } = require('./Extractor'); const logger = require('../helpers/logger'); const { formatDateTime } = require('../helpers/dateUtils'); @@ -35,10 +33,9 @@ function formatData(medicationData) { }); } -class CSVCancerRelatedMedicationExtractor extends Extractor { +class CSVCancerRelatedMedicationExtractor extends BaseCSVExtractor { constructor({ filePath }) { - super(); - this.csvModule = new CSVModule(path.resolve(filePath)); + super({ filePath }); } async getMedicationData(mrn) { diff --git a/src/extractors/CSVClinicalTrialInformationExtractor.js b/src/extractors/CSVClinicalTrialInformationExtractor.js index cc7cf787..f78cc1a0 100644 --- a/src/extractors/CSVClinicalTrialInformationExtractor.js +++ b/src/extractors/CSVClinicalTrialInformationExtractor.js @@ -1,9 +1,8 @@ -const path = require('path'); -const { Extractor } = require('./Extractor'); -const { CSVModule } = require('../modules'); +const { BaseCSVExtractor } = require('./BaseCSVExtractor'); const { firstEntryInBundle, getBundleResourcesByType } = require('../helpers/fhirUtils'); const { generateMcodeResources } = require('../templates'); const logger = require('../helpers/logger'); +const { CSVClinicalTrialInformationSchema } = require('../helpers/schemas/csv'); function getPatientId(context) { const patientInContext = getBundleResourcesByType(context, 'Patient', {}, true); @@ -16,10 +15,9 @@ function getPatientId(context) { return undefined; } -class CSVClinicalTrialInformationExtractor extends Extractor { +class CSVClinicalTrialInformationExtractor extends BaseCSVExtractor { constructor({ filePath, clinicalSiteID }) { - super(); - this.csvModule = new CSVModule(path.resolve(filePath)); + super({ filePath, csvSchema: CSVClinicalTrialInformationSchema }); if (!clinicalSiteID) logger.warn(`${this.constructor.name} expects a value for clinicalSiteID but got ${clinicalSiteID}`); this.clinicalSiteID = clinicalSiteID; } diff --git a/src/extractors/CSVConditionExtractor.js b/src/extractors/CSVConditionExtractor.js index 086bbecb..4249a3c0 100644 --- a/src/extractors/CSVConditionExtractor.js +++ b/src/extractors/CSVConditionExtractor.js @@ -1,9 +1,8 @@ -const path = require('path'); -const { CSVModule } = require('../modules'); +const { BaseCSVExtractor } = require('./BaseCSVExtractor'); const { generateMcodeResources } = require('../templates'); -const { Extractor } = require('./Extractor'); const logger = require('../helpers/logger'); const { formatDateTime } = require('../helpers/dateUtils'); +const { CSVConditionSchema } = require('../helpers/schemas/csv'); // Formats data to be passed into template-friendly format function formatData(conditionData) { @@ -37,10 +36,9 @@ function formatData(conditionData) { }); } -class CSVConditionExtractor extends Extractor { +class CSVConditionExtractor extends BaseCSVExtractor { constructor({ filePath }) { - super(); - this.csvModule = new CSVModule(path.resolve(filePath)); + super({ filePath, csvSchema: CSVConditionSchema }); } async getConditionData(mrn) { diff --git a/src/extractors/CSVObservationExtractor.js b/src/extractors/CSVObservationExtractor.js index 0a55aed3..c27b8d19 100644 --- a/src/extractors/CSVObservationExtractor.js +++ b/src/extractors/CSVObservationExtractor.js @@ -1,7 +1,5 @@ -const path = require('path'); -const { CSVModule } = require('../modules'); +const { BaseCSVExtractor } = require('./BaseCSVExtractor'); const { generateMcodeResources } = require('../templates'); -const { Extractor } = require('./Extractor'); const logger = require('../helpers/logger'); const { formatDateTime } = require('../helpers/dateUtils'); @@ -32,10 +30,9 @@ function formatData(observationData) { }); } -class CSVObservationExtractor extends Extractor { +class CSVObservationExtractor extends BaseCSVExtractor { constructor({ filePath }) { - super(); - this.csvModule = new CSVModule(path.resolve(filePath)); + super({ filePath }); } async getObservationData(mrn) { diff --git a/src/extractors/CSVPatientExtractor.js b/src/extractors/CSVPatientExtractor.js index 0c23c3e0..ddaaeab0 100644 --- a/src/extractors/CSVPatientExtractor.js +++ b/src/extractors/CSVPatientExtractor.js @@ -1,11 +1,10 @@ -const path = require('path'); -const { CSVModule } = require('../modules'); const { generateMcodeResources } = require('../templates'); -const { Extractor } = require('./Extractor'); +const { BaseCSVExtractor } = require('./BaseCSVExtractor'); const { getEthnicityDisplay, getRaceCodesystem, getRaceDisplay } = require('../helpers/patientUtils'); const logger = require('../helpers/logger'); +const { CSVPatientSchema } = require('../helpers/schemas/csv'); function joinAndReformatData(patientData) { logger.debug('Reformatting patient data from CSV into template format'); @@ -39,10 +38,9 @@ function joinAndReformatData(patientData) { }; } -class CSVPatientExtractor extends Extractor { +class CSVPatientExtractor extends BaseCSVExtractor { constructor({ filePath }) { - super(); - this.csvModule = new CSVModule(path.resolve(filePath)); + super({ filePath, csvSchema: CSVPatientSchema }); } async getPatientData(mrn) { diff --git a/src/extractors/CSVProcedureExtractor.js b/src/extractors/CSVProcedureExtractor.js index 21efca9c..ae3f2116 100644 --- a/src/extractors/CSVProcedureExtractor.js +++ b/src/extractors/CSVProcedureExtractor.js @@ -1,7 +1,5 @@ -const path = require('path'); -const { CSVModule } = require('../modules'); +const { BaseCSVExtractor } = require('./BaseCSVExtractor'); const { generateMcodeResources } = require('../templates'); -const { Extractor } = require('./Extractor'); const logger = require('../helpers/logger'); const { formatDateTime } = require('../helpers/dateUtils'); @@ -35,10 +33,9 @@ function formatData(procedureData) { }); } -class CSVProcedureExtractor extends Extractor { +class CSVProcedureExtractor extends BaseCSVExtractor { constructor({ filePath }) { - super(); - this.csvModule = new CSVModule(path.resolve(filePath)); + super({ filePath }); } async getProcedureData(mrn) { diff --git a/src/extractors/CSVStagingExtractor.js b/src/extractors/CSVStagingExtractor.js index 1bf93015..5dd77c2d 100644 --- a/src/extractors/CSVStagingExtractor.js +++ b/src/extractors/CSVStagingExtractor.js @@ -1,6 +1,4 @@ -const path = require('path'); -const { Extractor } = require('./Extractor'); -const { CSVModule } = require('../modules'); +const { BaseCSVExtractor } = require('./BaseCSVExtractor'); const { firstEntryInBundle } = require('../helpers/fhirUtils'); const { generateMcodeResources } = require('../templates'); const logger = require('../helpers/logger'); @@ -51,10 +49,9 @@ function formatStagingData(stagingData, categoryIds) { }; } -class CSVStagingExtractor extends Extractor { +class CSVStagingExtractor extends BaseCSVExtractor { constructor({ filePath }) { - super(); - this.csvModule = new CSVModule(path.resolve(filePath)); + super({ filePath }); } async getStagingData(mrn) { diff --git a/src/extractors/CSVTreatmentPlanChangeExtractor.js b/src/extractors/CSVTreatmentPlanChangeExtractor.js index 32cf14f6..0e1d3bef 100644 --- a/src/extractors/CSVTreatmentPlanChangeExtractor.js +++ b/src/extractors/CSVTreatmentPlanChangeExtractor.js @@ -1,11 +1,10 @@ -const path = require('path'); const _ = require('lodash'); -const { Extractor } = require('./Extractor'); -const { CSVModule } = require('../modules'); +const { BaseCSVExtractor } = require('./BaseCSVExtractor'); const { formatDate } = require('../helpers/dateUtils'); const { generateMcodeResources } = require('../templates'); const { getEmptyBundle } = require('../helpers/fhirUtils'); const logger = require('../helpers/logger'); +const { CSVTreatmentPlanChangeSchema } = require('../helpers/schemas/csv'); // Formats data to be passed into template-friendly format function formatData(tpcData) { @@ -68,10 +67,9 @@ function formatData(tpcData) { return [combinedData]; } -class CSVTreatmentPlanChangeExtractor extends Extractor { +class CSVTreatmentPlanChangeExtractor extends BaseCSVExtractor { constructor({ filePath }) { - super(); - this.csvModule = new CSVModule(path.resolve(filePath)); + super({ filePath, csvSchema: CSVTreatmentPlanChangeSchema }); } async getTPCData(mrn, fromDate, toDate) { diff --git a/src/helpers/csvValidator.js b/src/helpers/csvValidator.js new file mode 100644 index 00000000..134681ac --- /dev/null +++ b/src/helpers/csvValidator.js @@ -0,0 +1,39 @@ +const _ = require('lodash'); +const fs = require('fs'); +const validate = require('csv-file-validator'); +const parse = require('csv-parse/lib/sync'); +const logger = require('./logger'); + +async function validateCSV(pathToCSVFile, csvSchema) { + const csv = fs.readFileSync(pathToCSVFile, { columns: true, encoding: 'utf8' }); + + // Use CSV parser to determine actual number of columns in file + const csvJson = parse(csv); + + if (csvJson[0].length !== csvSchema.headers.length) { + // Report which erroneous columns exist in provided CSV + const difference = _.difference(csvJson[0], csvSchema.headers.map((h) => h.name)); + + logger.error(`Validation error in CSV ${pathToCSVFile}: found extra column(s) "${difference}"`); + process.exit(1); + } + + try { + const { inValidMessages } = await validate(csv, csvSchema); + + if (inValidMessages.length > 0) { + inValidMessages.forEach((errorMsg) => { + logger.error(`Validation error in CSV ${pathToCSVFile}: ${errorMsg}`); + }); + + process.exit(1); + } + } catch (e) { + logger.error(`Error occurred during CSV validation: ${e.message}`); + process.exit(1); + } +} + +module.exports = { + validateCSV, +}; diff --git a/src/helpers/schemas/csv.js b/src/helpers/schemas/csv.js new file mode 100644 index 00000000..d72baa87 --- /dev/null +++ b/src/helpers/schemas/csv.js @@ -0,0 +1,70 @@ +const CSVCancerDiseaseStatusSchema = { + headers: [ + { name: 'mrn', required: true }, + { name: 'conditionId', required: true }, + { name: 'diseaseStatusCode', required: true }, + { name: 'diseaseStatusText' }, + { name: 'dateOfObservation', required: true }, + { name: 'evidence' }, + { name: 'observationStatus' }, + { name: 'dateRecorded' }, + ], +}; + +const CSVConditionSchema = { + headers: [ + { name: 'mrn', required: true }, + { name: 'conditionId', required: true }, + { name: 'codeSystem', required: true }, + { name: 'code', required: true }, + { name: 'displayName' }, + { name: 'category', required: true }, + { name: 'dateOfDiagnosis' }, + { name: 'clinicalStatus' }, + { name: 'verificationStatus' }, + { name: 'bodySite' }, + { name: 'laterality' }, + { name: 'histology' }, + ], +}; + +const CSVPatientSchema = { + headers: [ + { name: 'mrn', required: true }, + { name: 'familyName', required: true }, + { name: 'givenName', required: true }, + { name: 'gender', required: true }, + { name: 'birthsex' }, + { name: 'dateOfBirth' }, + { name: 'race' }, + { name: 'ethnicity' }, + { name: 'language' }, + { name: 'addressLine' }, + { name: 'city' }, + { name: 'state' }, + { name: 'zip' }, + ], +}; + +const CSVClinicalTrialInformationSchema = { + headers: [ + { name: 'mrn', required: true }, + { name: 'trialSubjectID', required: true }, + { name: 'enrollmentStatus', required: true }, + { name: 'trialResearchID', required: true }, + { name: 'trialStatus', required: true }, + { name: 'trialResearchSystem' }, + ], +}; + +const CSVTreatmentPlanChangeSchema = { + headers: [ + { name: 'mrn', required: true }, + { name: 'reasonCode' }, + { name: 'changed', required: true }, + { name: 'dateOfCarePlan', required: true }, + { name: 'dateRecorded' }, + ], +}; + +module.exports = { CSVCancerDiseaseStatusSchema, CSVConditionSchema, CSVPatientSchema, CSVClinicalTrialInformationSchema, CSVTreatmentPlanChangeSchema }; diff --git a/test/cli/mcodeExtraction.test.js b/test/cli/mcodeExtraction.test.js index fe77a7d0..9bcdedf4 100644 --- a/test/cli/mcodeExtraction.test.js +++ b/test/cli/mcodeExtraction.test.js @@ -65,7 +65,7 @@ describe('mcodeExtraction', () => { }; const testClient = new MCODEClient(testConfig); - testClient.init(); + await testClient.init(); const { extractedData, successfulExtraction, totalExtractionErrors } = await extractDataForPatients(testPatientIds, testClient, testFromDate, testToDate); expect(successfulExtraction).toEqual(true); diff --git a/test/client/BaseClient.test.js b/test/client/BaseClient.test.js index 7ca874fb..55ea93d6 100644 --- a/test/client/BaseClient.test.js +++ b/test/client/BaseClient.test.js @@ -29,16 +29,16 @@ describe('BaseClient', () => { }); describe('initializeExtractors', () => { - it('should fail if extractors are missing a type', () => { + it('should fail if extractors are missing a type', async () => { const extractorsWithoutType = [ { label: 'Broken extractor', type: undefined, }, ]; - expect(() => engine.initializeExtractors(extractorsWithoutType)).toThrowError(); + await expect(engine.initializeExtractors(extractorsWithoutType)).rejects.toThrowError(); }); - it('should fail on un-registered extractors', () => { + it('should fail on un-registered extractors', async () => { // No extractors are registered by default const unregisteredExtractors = [ { @@ -46,9 +46,9 @@ describe('BaseClient', () => { type: 'UnregisteredExtractor', }, ]; - expect(() => engine.initializeExtractors(unregisteredExtractors)).toThrowError(); + await expect(engine.initializeExtractors(unregisteredExtractors)).rejects.toThrowError(); }); - it('should add extractors to engine if they are registered', () => { + it('should add extractors to engine if they are registered', async () => { // Register classes const extractorClasses = [ class Extractor {}, @@ -61,7 +61,7 @@ describe('BaseClient', () => { type: 'Extractor', }, ]; - engine.initializeExtractors(registeredExtractors); + await engine.initializeExtractors(registeredExtractors); expect(engine.extractors).toHaveLength(registeredExtractors.length); expect(engine.extractors[0]).toBeInstanceOf(extractorClasses[0]); }); @@ -95,7 +95,7 @@ describe('BaseClient', () => { type: 'Ext3', }, ]; - engine.initializeExtractors(registeredExtractors); + await engine.initializeExtractors(registeredExtractors); const { bundle, extractionErrors } = await engine.get(); expect(bundle.resourceType).toEqual('Bundle'); expect(bundle.type).toEqual('collection'); diff --git a/test/extractors/CSVAdverseEventExtractor.test.js b/test/extractors/CSVAdverseEventExtractor.test.js index 76e4d1f6..4abc75e6 100644 --- a/test/extractors/CSVAdverseEventExtractor.test.js +++ b/test/extractors/CSVAdverseEventExtractor.test.js @@ -18,10 +18,10 @@ const csvAdverseEventExtractor = new CSVAdverseEventExtractor({ }); // Destructure all modules -const { CSVModule } = csvAdverseEventExtractor; +const { csvModule } = csvAdverseEventExtractor; // Spy on csvModule -const csvModuleSpy = jest.spyOn(CSVModule, 'get'); +const csvModuleSpy = jest.spyOn(csvModule, 'get'); const formatData = CSVAdverseEventExtractorRewired.__get__('formatData'); From edb9bb2558720373f6eba8c896661657191d8335 Mon Sep 17 00:00:00 2001 From: Matthew Gramigna Date: Mon, 15 Mar 2021 17:22:31 -0400 Subject: [PATCH 2/4] Update to switch to custom implementation of validation with tests --- package-lock.json | 37 ------------ package.json | 1 - src/client/BaseClient.js | 28 +++++---- src/extractors/BaseCSVExtractor.js | 8 +-- src/helpers/csvValidator.js | 54 +++++++++-------- test/helpers/csvValidator.test.js | 96 ++++++++++++++++++++++++++++++ 6 files changed, 148 insertions(+), 76 deletions(-) create mode 100644 test/helpers/csvValidator.test.js diff --git a/package-lock.json b/package-lock.json index ce0b8434..4f1fb57e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1502,23 +1502,6 @@ "cssom": "0.3.x" } }, - "csv-file-validator": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/csv-file-validator/-/csv-file-validator-1.10.1.tgz", - "integrity": "sha512-jYFl3a/ptlJIEzLM28BlApn+JthmCz/3f/WLdt2fdCmMGb+eiP9QkulFhmepzFFrMi2Iel6m4OPXrHWpOFCHqg==", - "requires": { - "famulus": "^2.2.0", - "lodash": "^4.17.20", - "papaparse": "^5.3.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - } - } - }, "csv-parse": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.9.0.tgz", @@ -2339,21 +2322,6 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "famulus": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/famulus/-/famulus-2.2.2.tgz", - "integrity": "sha512-tobqs8uC0OomrMN/cX7aUUj3OSJn5y2GCfcTleCrtIfjxUkl6kJFLovnyEWfD6M+cQ1ZXhE5BaTJzMoDibbodA==", - "requires": { - "lodash": "^4.17.20" - }, - "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - } - } - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5053,11 +5021,6 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "papaparse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.0.tgz", - "integrity": "sha512-Lb7jN/4bTpiuGPrYy4tkKoUS8sTki8zacB5ke1p5zolhcSE4TlWgrlsxjrDTbG/dFVh07ck7X36hUf/b5V68pg==" - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", diff --git a/package.json b/package.json index 6d6c51e0..c515c230 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,6 @@ "ajv": "^6.12.6", "antlr4": "4.8.0", "commander": "^6.2.0", - "csv-file-validator": "^1.10.1", "csv-parse": "^4.8.8", "fhir-crud-client": "^1.2.2", "fhirpath": "2.1.5", diff --git a/src/client/BaseClient.js b/src/client/BaseClient.js index 8d9278de..da848882 100644 --- a/src/client/BaseClient.js +++ b/src/client/BaseClient.js @@ -25,8 +25,10 @@ class BaseClient { } // Given an extractor configuration, initialize all the necessary extractors - async initializeExtractors(extractorConfig, commonExtractorArgs) { - const extractorInits = extractorConfig.map(async (curExtractorConfig) => { + initializeExtractors(extractorConfig, commonExtractorArgs) { + let allExtractorsValid = true; + + extractorConfig.forEach((curExtractorConfig) => { const { label, type, constructorArgs } = curExtractorConfig; logger.debug(`Initializing ${label} extractor with type ${type}`); const ExtractorClass = this.extractorClasses[type]; @@ -35,20 +37,26 @@ class BaseClient { const newExtractor = new ExtractorClass({ ...commonExtractorArgs, ...constructorArgs }); if (newExtractor.validate) { - await newExtractor.validate(); + const isExtractorValid = newExtractor.validate(); + allExtractorsValid = (allExtractorsValid && isExtractorValid); + if (isExtractorValid) { + logger.debug(`Extractor ${label} PASSED CSV validation`); + } else { + logger.debug(`Extractor ${label} FAILED CSV validation`); + } } - return newExtractor; + this.extractors.push(newExtractor); } catch (e) { - throw new Error(`Unable to initialize ${label} extractor with type ${type}`); + throw new Error(`Unable to initialize ${label} extractor with type ${type}: ${e.message}`); } }); - await Promise.all(extractorInits).then((extractors) => { - this.extractors.push(...extractors); - }); - - logger.info('Validation succeeded'); + if (allExtractorsValid) { + logger.info('Validation succeeded'); + } else { + throw new Error('Error occurred during CSV validation'); + } } // NOTE: Async because in other clients that extend this, we need async helper functions (ex. auth) diff --git a/src/extractors/BaseCSVExtractor.js b/src/extractors/BaseCSVExtractor.js index 58b7778e..ec96cd44 100644 --- a/src/extractors/BaseCSVExtractor.js +++ b/src/extractors/BaseCSVExtractor.js @@ -12,13 +12,13 @@ class BaseCSVExtractor extends Extractor { this.csvModule = new CSVModule(this.filePath); } - async validate() { + validate() { if (this.csvSchema) { logger.info(`Validating CSV file for ${this.filePath}`); - await validateCSV(this.filePath, this.csvSchema); - } else { - logger.warn(`No CSV schema provided for ${this.filePath}`); + return validateCSV(this.filePath, this.csvSchema, this.csvModule.data); } + logger.warn(`No CSV schema provided for ${this.filePath}`); + return true; } } diff --git a/src/helpers/csvValidator.js b/src/helpers/csvValidator.js index 134681ac..960cb330 100644 --- a/src/helpers/csvValidator.js +++ b/src/helpers/csvValidator.js @@ -1,37 +1,43 @@ const _ = require('lodash'); -const fs = require('fs'); -const validate = require('csv-file-validator'); -const parse = require('csv-parse/lib/sync'); const logger = require('./logger'); -async function validateCSV(pathToCSVFile, csvSchema) { - const csv = fs.readFileSync(pathToCSVFile, { columns: true, encoding: 'utf8' }); +function validateCSV(pathToCSVFile, csvSchema, csvData) { + let isValid = true; - // Use CSV parser to determine actual number of columns in file - const csvJson = parse(csv); + // Check headers + const headers = Object.keys(csvData[0]); + const schemaDiff = _.difference(csvSchema.headers.map((h) => h.name), headers); + const fileDiff = _.difference(headers, csvSchema.headers.map((h) => h.name)); - if (csvJson[0].length !== csvSchema.headers.length) { - // Report which erroneous columns exist in provided CSV - const difference = _.difference(csvJson[0], csvSchema.headers.map((h) => h.name)); + if (fileDiff.length > 0) { + logger.warn(`Found extra column(s) in CSV ${pathToCSVFile}: "${fileDiff.join(',')}"`); + } - logger.error(`Validation error in CSV ${pathToCSVFile}: found extra column(s) "${difference}"`); - process.exit(1); + if (schemaDiff.length > 0) { + schemaDiff.forEach((sd) => { + const headerSchema = csvSchema.headers.find((h) => h.name === sd); + if (headerSchema.required) { + logger.error(`Column ${sd} is marked as required but is missing in CSV ${pathToCSVFile}`); + isValid = false; + } else { + logger.warn(`Column ${sd} is missing in CSV ${pathToCSVFile}`); + } + }); } - try { - const { inValidMessages } = await validate(csv, csvSchema); + // Check values + csvData.forEach((row, i) => { + Object.entries(row).forEach(([key, value], j) => { + const schema = csvSchema.headers.find((h) => h.name === key); - if (inValidMessages.length > 0) { - inValidMessages.forEach((errorMsg) => { - logger.error(`Validation error in CSV ${pathToCSVFile}: ${errorMsg}`); - }); + if (schema && schema.required && !value) { + logger.error(`Column ${key} marked as required but missing value in row ${i + 1} column ${j + 1} in CSV ${pathToCSVFile}`); + isValid = false; + } + }); + }); - process.exit(1); - } - } catch (e) { - logger.error(`Error occurred during CSV validation: ${e.message}`); - process.exit(1); - } + return isValid; } module.exports = { diff --git a/test/helpers/csvValidator.test.js b/test/helpers/csvValidator.test.js new file mode 100644 index 00000000..1b554fa7 --- /dev/null +++ b/test/helpers/csvValidator.test.js @@ -0,0 +1,96 @@ +const { validateCSV } = require('../../src/helpers/csvValidator'); + +const SIMPLE_DATA = [ + { + header1: '1', + header2: '2', + header3: '3', + }, + { + header1: '4', + header2: '', + header3: '6', + }, +]; + +const SIMPLE_DATA_MISSING_REQUIRED_VALUE = [ + { + header1: '', + header2: '2', + header3: '3', + }, + { + header1: '4', + header2: '2', + header3: '3', + }, +]; + +const SIMPLE_DATA_MISSING_HEADER = [ + { + wrongHeader1: '1', + header2: '2', + header3: '3', + }, + { + wrongHeader1: '4', + header2: '2', + header3: '3', + }, +]; + +const SIMPLE_DATA_EXTRA_COLUMNS = [ + { + header1: '1', + header2: '2', + header3: '3', + header4: '4', + }, + { + header1: '5', + header2: '6', + header3: '7', + header4: '', + }, +]; + +const SIMPLE_DATA_MISSING_OPTIONAL_COLUMN = [ + { + header1: '1', + header2: '2', + }, + { + header1: '3', + header2: '4', + }, +]; + +const schema = { + headers: [ + { name: 'header1', required: true }, + { name: 'header2' }, + { name: 'header3' }, + ], +}; + +describe('csvValidator', () => { + test('simple data validates', () => { + expect(validateCSV('', schema, SIMPLE_DATA)).toBe(true); + }); + + test('data missing required value does not validate', () => { + expect(validateCSV('', schema, SIMPLE_DATA_MISSING_REQUIRED_VALUE)).toBe(false); + }); + + test('data missing required header does not validate', () => { + expect(validateCSV('', schema, SIMPLE_DATA_MISSING_HEADER)).toBe(false); + }); + + test('data with erroneous column should still validate', () => { + expect(validateCSV('', schema, SIMPLE_DATA_EXTRA_COLUMNS)).toBe(true); + }); + + test('data missing an optional column should still validate', () => { + expect(validateCSV('', schema, SIMPLE_DATA_MISSING_OPTIONAL_COLUMN)).toBe(true); + }); +}); From 560eb5cb1beb2c4d4c448bef6cb0b899201faf0b Mon Sep 17 00:00:00 2001 From: Matthew Gramigna Date: Tue, 16 Mar 2021 14:14:41 -0400 Subject: [PATCH 3/4] Update CSV to include proper requirements for CDS --- docs/CSV_Templates.xlsx | Bin 614021 -> 613997 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/CSV_Templates.xlsx b/docs/CSV_Templates.xlsx index 742d490f507bb5b308ce648c670cd407d8d0497b..e591143f27ade4dabd0e2b952487e3d7dd32bc0b 100644 GIT binary patch delta 91819 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 vQRkoC9mxUl=U@ZO8G$9NssD3@9%Kzz0E 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 z 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 Date: Tue, 16 Mar 2021 14:20:57 -0400 Subject: [PATCH 4/4] Revert baseClient test to use synchronous initialize call --- test/client/BaseClient.test.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/client/BaseClient.test.js b/test/client/BaseClient.test.js index 55ea93d6..7ca874fb 100644 --- a/test/client/BaseClient.test.js +++ b/test/client/BaseClient.test.js @@ -29,16 +29,16 @@ describe('BaseClient', () => { }); describe('initializeExtractors', () => { - it('should fail if extractors are missing a type', async () => { + it('should fail if extractors are missing a type', () => { const extractorsWithoutType = [ { label: 'Broken extractor', type: undefined, }, ]; - await expect(engine.initializeExtractors(extractorsWithoutType)).rejects.toThrowError(); + expect(() => engine.initializeExtractors(extractorsWithoutType)).toThrowError(); }); - it('should fail on un-registered extractors', async () => { + it('should fail on un-registered extractors', () => { // No extractors are registered by default const unregisteredExtractors = [ { @@ -46,9 +46,9 @@ describe('BaseClient', () => { type: 'UnregisteredExtractor', }, ]; - await expect(engine.initializeExtractors(unregisteredExtractors)).rejects.toThrowError(); + expect(() => engine.initializeExtractors(unregisteredExtractors)).toThrowError(); }); - it('should add extractors to engine if they are registered', async () => { + it('should add extractors to engine if they are registered', () => { // Register classes const extractorClasses = [ class Extractor {}, @@ -61,7 +61,7 @@ describe('BaseClient', () => { type: 'Extractor', }, ]; - await engine.initializeExtractors(registeredExtractors); + engine.initializeExtractors(registeredExtractors); expect(engine.extractors).toHaveLength(registeredExtractors.length); expect(engine.extractors[0]).toBeInstanceOf(extractorClasses[0]); }); @@ -95,7 +95,7 @@ describe('BaseClient', () => { type: 'Ext3', }, ]; - await engine.initializeExtractors(registeredExtractors); + engine.initializeExtractors(registeredExtractors); const { bundle, extractionErrors } = await engine.get(); expect(bundle.resourceType).toEqual('Bundle'); expect(bundle.type).toEqual('collection');