From 4f78fa1c0ac5fc4b8acea0883c49f403e30856f1 Mon Sep 17 00:00:00 2001 From: Sarah Vessels Date: Thu, 28 Sep 2017 16:20:23 -0500 Subject: [PATCH 1/6] Add rmagick gem --- Gemfile | 1 + Gemfile.lock | 2 ++ README.md | 6 ++++-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 1c1c0e181f12..3143ebef78d9 100644 --- a/Gemfile +++ b/Gemfile @@ -4,4 +4,5 @@ group :test do gem "minitest", "~> 5.10.3" gem "rake" gem "safe_yaml", "~> 1.0.4" + gem "rmagick", "~> 2.16.0" end diff --git a/Gemfile.lock b/Gemfile.lock index 052618af6259..3c107460d3d8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,6 +3,7 @@ GEM specs: minitest (5.10.3) rake (12.0.0) + rmagick (2.16.0) safe_yaml (1.0.4) PLATFORMS @@ -11,6 +12,7 @@ PLATFORMS DEPENDENCIES minitest (~> 5.10.3) rake + rmagick (~> 2.16.0) safe_yaml (~> 1.0.4) BUNDLED WITH diff --git a/README.md b/README.md index 2645d371e7ff..9521d8c8f9e4 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,10 @@ Curated topics and collections from the community ## How to Run Tests -There are some lint tests in place to ensure each topic is formatted in the way we expect. You can -run the tests using: +There are some lint tests in place to ensure each topic is formatted in the way we expect. You will +need Ruby, Bundler, and ImageMagick installed. + +You can run the tests using: ```bash bundle install From baab245639b39bc3bb974f03b09521391288acbf Mon Sep 17 00:00:00 2001 From: Sarah Vessels Date: Thu, 28 Sep 2017 16:23:48 -0500 Subject: [PATCH 2/6] Make bitcoin image expected width --- topics/bitcoin/bitcoin.png | Bin 25330 -> 22555 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/topics/bitcoin/bitcoin.png b/topics/bitcoin/bitcoin.png index bf3ebe1b3f445d7e15047f5d77a169f8fc8828e8..75c01c7ab232796365c6f32cb6942efc8c46f9ab 100644 GIT binary patch delta 19634 zcmaHS1yoeu*Y?cNU4k^j&>|hujC3O@Aq~>q5_jm3?go(*L_idf?k)id>6GrS5C8u+ ze&4&^@0+#mT66c=&)H}1d+OQu+~Y2AW+j+6;+2Xl4kkG!2n52Bmy=Qlfxyte7dk2k z1bPxwfdGN9Nv$O%U&%{KLSMN!zO}ZqsCtfr4b1p7hdrubILYa{fs(ZvGF$Ii>n2@}JFLZKoq=5K}6r2v`#z(3xK!mQlfoP;p`zu_#rtp9=gC+u&@ z{}X0z_Frx}xx3i?%PDg+4huUAdkY6QSKtxI^}pJC4DWv-9sX&~%f#v5*8Ua8e|snL zx9LLa7OswV?tg=zHa?r{iEa` zNOLnGS9enz3p2NWJhaD0Cj$KKtr8}d9RHAuaQv_8B9A>nNZHZc`mMK=iJOHOHz(H% zHcmk{ZUId$ej!dlAwC`vj{l+ak0$&rk#w;zadULhbab>6`&Yp1ALH-n0_9=n|2OoX z3jcu>;rQFce+;mH58r=D)um*_FdvcsITwgwRxPp4gFtYQywpogFYsOyhA(ATviSWc zAKYjM-7q%YY6ku0BQPoj1$rt{FkRd_fR3@oh}AGdxx3NQGUNzcG2HyNtKNN^Xh)b3 zLLUsmKz5asg9cOBwZ3Uqoey(gD?K1{BuHZ1VRc9gA&A{%OTT4{y(?C|G)S@OIz*HIcqVVuPd`dvRsq@REFtYlogzE zs&jL`6$<}xRDnw+?thBU^bD54GuYSLR)$Cv&~8>>(ktcaj#^XTIM{GQj-i38q-ytD zl0l#(D9HgjIme@~K8FD{+8k$--o34?ZWBD^D8wmR%Nj^pC+Qiw$QvxJSB9ogdWWSh z(MyU0A#_al02{d@gt1prn(0zu;!CxPO7!8q4ZYV53m1m0Q!trO^#YANrH@(O<9wjna>nYZI7MD_DiW}~WFk&Rtu>_273+Pn z$t}%BUqMVB9{_W}e)82yl|cF$vkx5w&S>iUylcP~tVA&39M@`G@D?|rxH9qTSh$|4 zSVN6lxPE&tn9^RR=JU)SUjR`Cru*o0$4Q(+l;1xf8O4U74-G1BH$j(!xafopYEll{ z@{}wGfcRQc$N=1?+z;j)9IqN(U%U7%J;CJT_~^6)VP*+@MY4>N;H*g&$m?DtQ-~ZW z;@U>A!S=gH^T0v$r&Ao>cbw~!7r`YoCfwgYU%Q z$@6V*TAsNR75Gu=8Z#MIinHhsa;dLbp_yg9r00?=C|-btuyvQ!G!wbd6HF{dp)N=J)hS(c6`TZBhK+i?iHk!J;;^(YR;dL0KC*Z; zcIT;Y01-J>$G!OR?_QkQ*{&MiNyE7LB#V~@$tdTOL)x6Oxs;SL!g`Hr#lC=wLf$yk@0Gu zF5mN0wEZ|?`KcFUVJ9&4>H~dtqVfA>guG04=k4BFE}+ww^+4HsOBMSiFT4NCZqb#| zHjpxK&(&%*&XRzzgYf^d@t*Rlce|WA;kB0vY+)H#cA5PL?=O|T&~+C zM_y*n$!NO}ZrwzvbJ$2=^LzhDYhpa~;JaL=+H+DppBQ?m?NL-I|9HjMgWOGNpW4?Y zk?%qY93EIn97;P^X`^}>xU^uZ8MF{aGT7L8yy%DWQ zLLEn`-(LbL4;kcKdo=iuuzSnx}velS< z&S!_&wd_9|a`n6K7&g^P&ecm!0Vq}Ace-V2v_wU*7#nG_uCvINTW7O6+lJ!f?z{5i zU)rg>tz)MBOzrLa%V7?zQ@^Qolof_8c-{V}4}ZgsQz;Fpjnf(;hZJR(5I0LVB^fj& zNA;fML~Lqoonc=~5sqTFQZyvhE@+ic&ex}SEkQ7;n^AARblRlQ136p>_5JMk zY|ywT?0GTGR`QfU?DdDjGm)syk(h$SIE!PEP=X(~8Re|)e!!P78o$@)Nq0+uj!T zG1~(@MKV{8)wbF95!g!K=zY1`Q)P-xu5!FPL~M`D?CLf-wzmQAFo4*I?e!od8Tc3@ z139g#BhBHeW@Qwgu4gXH|9sKBIQ0=Hq@sL8GEK5oF3 zYx6jb7v1@Q#*NaIX7*^y?cv_!Sc-7o8TO*Ym?6QfqKzn%G5v!QHduqApV?2It39@) zc>a!iV17DTN4eBBnLf|ikIe5R0gGk!fq*pqOUP%mfH?*cV09^;#xe#Z>r~HwjQoxm z=n{SRD`C^Oc;W8XV41rk&M}7M;?WPEPx)sL&SI8;v)e;mfXDzm0oc?O*pej1NHP7NW@(V3#WkAXTljMI!=4_zxxx5(KVhhGdU z%7xF!JurY3^HlI9SR)7F1t_YW-m%7?7wsMNqQ7t4f+bgFKn;(%BjDBeqkf(N4$4RHKX{Fej<0;`hQolZ8{*w{NE^;WJn=!70gZkiAq$$`Kf<{SQf)|6Rj@ zd_)VU>@425ytDd_Ty@>da`j5aNc@J7dhZSyMx67WjhK_4$NHe^-CFN;LKLDB%iH#G z;Z79s*+Ob|zi3Q12iw&f^b^FLZ+9zt*KB^B9{*-dZ^0}T!jJU9#N2eYT?P(Jw6V4~%gAj#y|D#h3|Lb1mH;_oa1CV z<%;INO3)(kb{Wi#shSobFz)q!`V^mM@xW88aE#urZ{U1zr*$lpE?Qr=W{=#r-@;Xi*N@YDDg>*ld}le{fiXm}3Io3n^?G&v-m!5oC_oKEIcZTV=tRa*l#kr@~7An68W-NB#J1DHGN6OnDQJ z$x1@Fg6Tyi|pniusx;FIw42l>}Z=_|sOlrZIiGp0Pw&6fZgszi3WBX{n7v%HvJTn7u$<3gWS5 z(r26kU!z=1UB%3=>P*s;r37s`vn5mhAX9s!GS)iXzWp>5jA{cEcNMCozA!h^=Vl zd1I9=srd+zy%izbBEz0NF7-t0Vv@@D7m z`P8*Wu{WNY=YRti1H^Lat~{honB2m8hQ%J$ zNvsA0h%Tep@)f-)aX`js-m95N&FK{BbJLGy)8NTEVx^cn43Fo10#%9yN`zoV0uTmH zva8vpYdqC!p<%VLs>esPTJ2g#eT}^p#Qmb7a8*q^#UK4p-J)*Kj(^TiRQxb{UB#w_ z4nyuaO|=ysB+}guRR^YA{g)QPSJ0WWqC%d#{rM;}qW}5`I7i!LFiigTS||q5S^Ysr ztYA4K*0|oFVAwe;>X%1AxiT#7334U(Tg{_@d82UZ>mylXBkA4L8IG8Db%Kr~F~1&m zF-hhgtQ|l0o22ab(<9f=&XgZGx zG8IW@I%*g0MvRZ5chj57%YRSEe2b1I z@0$(9_fYt=ji(&nyjg+0Gm20F5U*w3~Iam&J?*d>BxZmgL2}fk# znCT`NMtZ_6)_5cm z0>eY`?LKE-I?){&v#C|0e$iX`a7~avsP@d$X@9@Xe8rHc|MskJ+5IAg zT=t+@hsHq&>tm@%y>jh}!(dLHfp&PxuzMP+TUG1(B}??n?qk&+ye^^qkXqx&P!|0g z8iKk9we}cir?|ADn3=?%c)a-MkY6n~+KL8^YJe&iaOal^5gFu3b76;pWTol62k2hGuU%R*Ieo7|4-!_8=S7G0AUs`j2QT)z9+Sdgd!PqX~= zZjWQcT+&AjDesNdg?xd}I$w+oDA>#fkV-b9Jxh9^)voC}-BYNgkyU9-2+M5A=etMJ z)=tn!P=Sw8y)Kuv%hj*{pv71mam-E_KuUlwl?0HplmQMuUcU+rzr~t|Mq?J4c17Lh zE(tp-_iH{cecT&4<`!>{DKh`mPIsWnlrfuLSMEv(KRgI@O#QKzNjGq1T|<)rd|2;Z zT3|h0YM>AR+Nhu2In&XXA{R_9*0+<+G5H>@PuRX;>W#&f0(IN)A1J7&EQZ>%*m9X$ zy0;0Gg4*bt;=+8INxg4m6?dDRf1-yUTyJ6?KW$qTT$={Xcm%QScv3({LpSUgEhh2e zg(yCh?#fO4k&}bJT>fPfOT91%2>U0S6^F~yLJ5BB?)aLMQOvm(o?cab6}FiFMTa2B zY=UHrUgTl4@n}5lL#_tH z10#^>zv`uUZS#CofZ$b~vPCt+<|2Z$^GMCrpS38-EDEEaRnY)!lHx^9ZT>^gyD~52 z-#zfSTfP07to$t+aTyPc@XQ*COrg^lM2(ph4&r{oYWo~0+dJ)!m0~T9?0KJmnei;p ztgVivJuy;LUi<071<6rGs_e?5jzK-!S%h<7DwK-&cRc=fib(kA&QMPoh*A@=icS%7 z5d0PDeV9>L)x{04MzCGNjwBbk=y+x!VUo}IvWd_&v_%u)PdS!rS7SD@&v!>Gk)N}#uQc{+mkzbFm^--TNg7s z)r|Y#8^3Ua1N)(tt%Xw)g18KDd`jl`o1H7asj!dgiFR9poTypL!qFSnA_EV?pb~v0 z3z@}Lf}w~_8&N5VvK>Dn5xhM$B?E%@`f+s$E#S3aJ|9Y$7QPOO8s;pvTV=1_qN~ZC^|r2@S@I zgatq7)qD>O6Bd`Y$7=?AXOzdu-y-YlUEUk5mox*n(Q+SP8qf42%ggOdk&$VaJv9sV z1+VeReDdNa=EV|N=*YNoUxt?NuF`$~6oI1j`D5GcS%z4RT<~O7zDWwvE3d;3gme>! zuStnZ9dD}g(afoS(L%$SXQdnOJ-Bg!R4W~%RuqmR5^1N3(uSEabCC zEET-ZEPy5dtn34dE;mor>jko3xCajsT7AHR1m6RF3bm!?b2{iU16i~iyRl?g{DXOS zr@%*^6@_7eEGEF*V|d>Fud@(2gf0uga5$T9cZh6)K0$Spk;c zh9Rc%{xWJrY>&ho-XVfXU573X{&^|Vho2l~`51^*J#lBd^yRyQStdkUXvCg?Sk+}F zE)Ph1IBZ8;g{>uRjCYU_vLgGyqo~!GDYv6h zGL1a!Cw7!G4g7ao`{HyuExexq5>xs6wqP8i6ny+ik%W;j8!^<4)NacQys`%Dhw7l-IYt?0p%ShWk0dH4ym~?lClb{8;HVS&Ob{%G{%9%^uY+6 z1R$fYydHd}i_|PL^OQ(GB27bBcq>ksPompIQ`HXW!V?LBbOMFOqc+5Lc5O^lc+FjB zY*Qm_3mq;Q;f9Yx1$6R0w;Gv8IWmW~`2MhhL%QT{=Bzfjxp3ZRs;)FI)fw(gXV?eZ zh(9kj>iGbBaN>qYV37++%|*qVhvhkqV<8YfWsxA^<#G%U^))9q;jpJh>11FW&$TM! z`N&HLmXQ?nK}N`Epv2iB&h|Iia5M7JL25Ri;IE&5UCBJ`11F_70c!;K;-@u6cuBc| zX&qShwkhR0Fk?Ol6nz}kJX0J$ya&%xisx)(vz#KzIvYoXC*O1Dj2MwD>E&}g zB0dmE`buZ1KF+BX`dirputyMH$>L1)@##3RF&3CcO##XmaHT+cMkhrt) zPNq0Is43!$wMiln1Nb2M@FZyul!UMk!Z=u#ZQasO(!`l^taT)ir5qP?LoAfI?w-j@ z=2;|afWaT`rin`iE8b;C3+Ml`#c~7M-U;0%rV*_%0Q@LBcdn?V3(>>fk_t=&X%H}v zCM&nCj$s^G$2n(Z3YNWANFlG6F;)nkco1esl_q&DD)N~^G)eZ?xO~x+&fsWiIqw*$ zRu^QuH-#%Oec5*;!(lPcY5J(iC_v6c_~*XJnxgNhi;OI)<|T3%2%MmhjhM5`u!mE& z091NyVEU&!c@ZARSmXPtV=B*1^Z8f+^VgYID`);@K3!z-0k(Ij)Z?B4K`&)v$?#S~ zdN&$$6czlKCj42&S+^d%!%q6ji9M-F$}mnrh!-56JBT*% z6I;l~drov_GI;`fYXnNN4O0D+=`^AN7vDF?Qo=@uEMq3izTtUHkF({QaKxw*H$Hnu z)Qnl!E#*;Yh8kBmv*`Q7&Nn3}Bob=g&U#@bm*^!A(lj&yOm&PDq5pO#JQQL*gG^p(k`-_43An@X)Ie?rETH-PcydwnHsTS+UDQ! zP4*bVJ_9rys|dD0*O&07-wa?3|53^GBtZV&E%eW$so5(;to8im7Bn*j&yI|!T0No_ z4IR!yFr%p38guGCS|N39NpNUL`eVESUGfw*l=?Mmq1mk|6- z$jxhM5hhrxJOk4A$imp88>c&3<;^{m5$*P%ZdS(t!Yv(T*9+Chbhp3v9F-5=yR;Ae zTT{+?z2a|zKprh$69xuZ(x|vy=_F)WC6<>ANQl5iVYub$+sQ0~jEp$wCjudu92_vw zmDD8#v%Z&((j!67ATep11h0)#5Bv|r9$$N7=HwojNnxA_(x+wZ{6 zPn;(2Ktchwc6_H>xA$a%R$Z+BF`{@7(`~I&6D#plW28@1)Bt_^Nj-Sr;EU;X^8Ua< z4-S^OmH7aCsLVJ#$4$_`|7xacJO9A@RIX0plUNUaJk1;eBvDZQq+!s=3#ht_sGEGwUa~KcM+*r#)(iiJYgJg)mlz% zeA1^cCfnZ#fY6}nq`S)u@LutOD0hq)?jBPS2yvu!aQ#)#cq^mK&6^QLoF9UD!Casw zb{MA+w}U24&I|W~VTE-_Lv!0*Ic=D-!Gq}7xIekJfynuT&n2?=0;(WJGd)W#l$*D5 z@cg&b(i{r+=^%6OUM_S5GX72&u~DS;)X*qGh35hIE-PXsZm-&QPA8gM+?q;@;=$#8 zRnW=B!V|4!^F#fqK@1M>;~1liLg?Jfq~TZ`y^zzr&yFYN(1*lC8@Gn(M@&7mH$NG{ z4HfbjgNx`nvWLtvt*4U~8S4`(_px?Rz7x#KW3s584oR?7KrWX8>BV~DYXA5ir+)5i zCAtHwMnvSqLEm5{IR6puRBp+wS@huI3!QsaoFSmB3ipw>h>Xb^N#Z)oUaKVxpoc+s zg{Cz>4K@*ajPxfx9(96$!Xox)%n{bo4y%f{{lice*9HzIU$AVgK!jZpertfgbV9 z2N876+@$li{qY~kQ7LGgXWJd37U`(qOUM}JP@?YkhtJUh7xXWVwlGS{q-hzLd5o2U zYKU6iGSJZS`Jj;C&((=ztkKm_#y1$4SK^O9UzTIu6~g8q#;hNj9X|5IJl^u3obYD` zd`~aGtQl!QTe;Jy*+0})CFJ0PQQkcf6JSQS+TFB@%XD?M7jMy5%ALOLu`TrQ$CDoD8(b_w42rM3X(A8?=*+Gh3^9jPjhpT(Q~>!{ zV1Co(5OGXHLey@%!Gtgym`gh3obJ68G=#u7oGiN@bk!cm(|l@XetH1F7EURY1`H)A zTd1AzSFq$^)fONnNw~fVT;Wqo16y=bvI26EEJ&f5blZ!?R95sjj0{OQ;>7||(CK^h z`dJ*@49-t~PPGPj7^RKLA?@z!NEuH=uB0PjP?6rMMWsGz_}66HaJ*fawGJahxFJF& zxHNqt^!d)Eb?OwEMj>$5!(C?~T_FL-C*W_XZgejwzoun*-yGBAP7GzTPOkh!Q_KK$ z_`_uXp>}(tnmPg@j1Sku*lm9OObiWnje)-9mZ^SQhlImgm=%hsSTA^d(@p54oBEyr zvGMTi|D1fY?Gr~ z$a7spLAPHK9rO|qKgHM#Gie-Mt**lWul_MJ=bh(SQL+?k)sS~g?%~*usQ;v+8l2A_ zE`uNYf(ADTYgwSqi(aM%U4|p3G~KC8`ka|U<47r(y5lZM`T>sWG4$SRj2_)6Wt9N& zV)+P7?9x^NLa4TTWt)kTe{(d8NUf>!Lu8+bTi;!7SwR4>yTmVR%iqI}BPGF&7twe! zH9CYBLky^^oUF}hq?G8gkV(35zl4+llq;6W#m7`U?Yk8-ZvE~fIt+a^o-mdvJit6 zc_=KjoC<)kd1Zrk|bEjIomLGAMOTD~98ImK~AHjj0JTV}U{FO=i%V*Exq+v^Mk)=v-NW-Hu z9-s>`=;0nV5|4S4v5?N=7ZMm5_b(QPDpfdyN#)Kwe_jV7V=&kKT*^_ZiV^;R$=3ur z#*RQp;^S*@zm$+g#<&|>Sa+#$eCi!t`Nb`eTU7MRbN;$* z0%ZC}PIHHjPDm~!AR#gTW!cibon|AwR>MpFX_owRAC&Ekd#=nY94cKTxiFgi9Q*7; zmMr`~q;Z0(7s$e`#*~Kkj|;at2%H#vo@uxuqGPKc6dVN0e2_mJIoyeSA+CP)E@E{gG;m296Smq}j8WlB0&nVQS`I z*SsNEUF)MRm|KzeHq(P}3(HXbGEvH`A=DRA)qX}$Ndfj!qZqnq*L4oF*We2Ev+18> z9iJe@;jl7tW|CH9T927Vmm3Is;ReJE{(5_XM7yKP4lxa}!9R!E!Pb{Qp3nWB2pmQN zM;P2#zg|Kym=H^US_7x!hdg^WS>J-}kyoQhH|{V|pcQ12`xN0Ss-eRbxrB1*#O7>b zbxg^%E6Lo8$-vGZQLU9d$F5s)Xu(>5;HRBg2dGZ$Q~@f3&pXv${|d(~F5a&6{TERu zl^WVBXkcko*0<@508(jSOH)%d$;N+1C><{j0b|6G(_Gr|uE9~;+MSb1R576Yy)A%@ zO;7Ec?$sG%AUjRNDB+f-60wz!5+MLT$z=BIO2SlBLN<>f9)V@wY`j=GNg@_(;fpnN_v)av|7+ri8~7(5^uUm1ZniX1a%PVJX_7biX z8|Xe7D1~hL{yk6%#xTmOVeT#2#Z%jCGT6|rV9B67c`{gDa#ineY#v-xqU!(1TDc&- zG(kh9b1_XO?X(13ABRpQ*kzdc$H*)LP~4wP^Ohp5=!kL=#d*IReiwbiYSY7>azGd` zAps)C=e7&?`swk6$20u}o4O!RO1(M9kdfGDRY_muqy_+%|5h6#_pGL}V1^6bA{$o* z9%b`L*G-TJhe&)z8belsE?Kp(26-C0dea&b`-}PESfCZUJU)v2xkQcx>Sap_k_h-G zT97GzOt=RMOUG*WM3g3yeg1ikSLjYWvYic5O&zBg1V);VCe=l$i1K$x;)6AAs+^;x z%R>u+cWPh5tPanbx3EVcp>^oJ<*$DKmR*36(FskWsm*>@Rf@ICf?=4sDLnP^vt*x< zw3|;FI55NSl!k9e7t&y841aoYIMZ!NPNdqbh@21s;-#^p{N`!(yTpKj=#%_@7r~#D z>Xh3MOb2XLmwxB4Ri?acSL4DHF*YT~h5^=^3PJ&OHa z#$XAh?-$*s4+N>*%J7XlOz|g0yM@#BOpkk?F8srxE}QzrBAEch?qT(J`B|^B^-h31 zsnLBzZ5fA4xkc(Of?#y}Buqz!pvYu`@=M&YZv?`Xpq0-29qVsN_{OQ?E}!C1wi2bx zvWM1zf8sN7TMn=ZIfT{~l#qsMu5BV#r^MBXL}L^z{$QA;nmL`q9#sYa_Ntp*^>^06S7{>@l2;#bPohpt6a$WLG_CD z`_Z}8SU_sYseT_VRNMW&lDd4RFYUDe!(Rsa0>TLXEPc&>gKkBS1Gp*Jz$weZhMGV8 z;8$uXng@&f=h0VyKakK|xStI6BdxL~~5ze`Ws)1pVrpd;Z3tD|U1h4X|>kadSn$gu%zNeDUkoM%V6ei?B-yMN%Beh zu2dGD=0CZWagNOfG_dW0I z(TY>0=NsR4Ud$ptcx6UcWaQjaolO9aSm)18SR6*0_GNrrt)kJx*N+;_xK;SrV`^W0)Sjih*b0eR;J5qx*f3nil0dV)G z-u}=PoBgFiJHN3adN|vaM@!LJb8ph%L{0U~3lWQr%eDsZUsZkm)nDonQ6 zsI>SF`m)PGwNs#X`buX-v0O(2zVb_Kv0uAia9t3nqEAg@K7JMfPryfTr48MXR$b*v z4SNvKFBHLwjM`9@TFzHcov$`$=;Pcc+b`dAxV#ooN`8GhSfKrwYFD{)W{Rcud!lc; z>LHUMkF@sfam~iZ*N0&a!z|jK#+CUwze(-(tJb-*na@a|6{t%Xudp`wtvfS>@!3Dx z#F`8MW6&i{Y0O9kbTw#mb$q-R;?iY6%ariA*taCaAkL?;fce4Ka{?M|YiESu z9el)>`^FZSMV~m)z@nA-Rod(bft7e{kk5(-?)Qor{>k9N3o65JKlsK9FOE!g72x@% zi;V+%$-C>Z3TCHXY3rN1FF{i9fX8>X_u`HB7Uo||vsn$zqMyvFj*E`^2mA4VtD)fn z?pE#_Z>(3v-D3GX84ps3@XLODdyO~Q(y8^Zq=cL}rGWf47{P>A_U1+0yZ#Y5mWLb~cQibI|VeZ0jJ*ZAE!kv}LgHR{}9JJalWG0_L8mcNT;g(O-DsbY}PClybF?}gk6Y+HqV@=TG=*glo`77H<+oI|qCB0mH z8GPJIKBMWa4Ih>mV5n^hN)fLh+ci)@wbxUbzJ_%D^N(MmR|f~am)Kc3 zUeWpLm%4HBO-G9GoDAgPOT5?{mWYRyt%~qQm-BZ;-|i^!TFJ(2*B(id7pFw0|_5;UTar{Crv8%SVPK>0Grd{G) z){vT+);V8`K1lBP&&#>h0)^qfuTR=YjHZgo#$MMuI%I!qX-_eY^Rjq#m;BQpxUC00F2#)c7;>i{9osx{zeZiP z1hVQFh}>;Qx|%q0N(zRT20Y&iLqKys#wIwg-Bf-Znr4}fzjW@R*#IPQF1~&fx2~3i z|HcSU&ZeGd@^(BKMDbBq!Q%Gr`K4P<<;T8L0|6)cQq!#-w$T1^MYB=*Za)|)qhx@V z6=BQlxF@-gV7px`#&hKOc(#BxgqTbwKCBL7Q0fPGy9;f|<|Cy#u!bqYy zCE*%f&cMVjzpy>g(?W33xu(ZfL}I+G&a-US6v+M&*N{;)kMX!Jlu8 zUR>+qwJ+U*dN+;WVzLH{`F#|iT8QJzOzM5#9IZL?zML<8`^f+=gb?CIV(1!f`Nfyi zV1_dteq1Nj>Wtpn7l&6H=fCt2Gww^tRA>R=s-QFx95^^;zcZ43Ugnk%nVeU>5lsm3gUAYngjd9`DC*>1Nn-D~Gyc|FVN)_n@vhqT_nx9<}|Y?S`$ zQ??g*h9-nC&>I-O>$rJdw#^h(8fY+ocltyB+N)dsI-9j7$4b22W=`>XzlC9;7Re-= zt~3V8G}>YpW`8NpGd%qcN*1jw1m@Bv(d1F}i?;mi1sVC070K{1bzRg{7VgDu#__Z# z1=DO%yuD|0F@p2X<;Kwh8$>$2;-b^1?^$elWDkq^CN^L^ z+mrD0AyDLFW}%xr&&;DSG2dv@+qG(;8N;TL??ad-wuNhbK@H~imN(HIsR~IQVIJ=? zzexLYS&kov-}&__+Vga8^C1Zp?Y+PYlI2%Fzg0zm;(LB#gFhURLUUg6aO;R*3y&bN z?EU7EKOhI*;GD)SJlJ|%-`y|?_M~)tm4P4PV4mDPT>p4`D0?}2zq9OK-HwJ*(#4U&=j%ue4maBg=6rT? zF1~y>loYi{#Ojo{!pKm0$PwAHTLcVj{f=psy2L_CNqK2gpDfe;JbF$h zXe*cQ(}j+auJ9&GC_WsOIncH={I^*cHG}_|cc5Yq>{mS5<5zFrJLfE{zJdeOwAr)5 z0J`;Qv|E;#*aYnG&`fi>?GDXpga@5Rp{x)P!TD_^=rJ!9Hu9|~V1^{BN6KwcxX93O z*~u$R@2n$RYQVA(MLV`4n1W!&e<9uO@{j$KEukKF4K9(Aa$_P>!dyY}1U?y^uAn3} zm2xXA$Q^BYNms~4Q`q{Nr|d4((XazgnS8qIIkTW1GpU?f9OS^?KGK0Cm@ZtV5vv+# z+aWzdSOxFN6f{P-tx^f2zzlS%+6S;hA`fDdNpF^?ueMIWnQY|AgAB2yGiCn$zwTC+ z?7sQ_;>)WF^?A{JSad&I^xNAFq*2w&9i?)i)Rnh?Qt@G{1Ptsf)QSeLPWLfk}qVr)UiThCmz3a*%*O^pCwz*1^ULC>h zon1mKXr2pCu*fv@$LWEQcD3pij%G(koc*n8Iu>d;>7{e?N_quDaBGQ3&puJC?@H*3 zZ-atJwUT>?Zx!try2$L>5VBnf(k z|7tdle_J|e{XT~6?t;9yW(0^wrf)s+|MNLD4Y&tPST66zEbxns8P^|qAr3gGQ8x^m z!724&kg0NQKWjw?LWo~#*>qi=@a{<4N;@@J;ld zO5*P^WMsOTJoTfiVrJXE$1i+>W|jH5&z}ZTD3bvHrVIAM&=eKgmCF< z*w;b$WMd&HnQOV=@%_t*M#=QnVJfqdN)pT1_ku}xC{1C!2nvU@>Vo6U51PSQ{`Wes zJaNDg-Co1~C*C9_mw2Z4wTHz6B8A1;D4na*ub~02BO5sFAHnQ*D@G6MuR={Y+_$uh2v~K-z_#P#$M|qxR zQxRPucx|>O#=sOaxa$k}C_uCmEsnCy)LxqYa@Bw%!my^U%UXY4;JD8{dV}Yeeg!?0 z*4HKupIV}`YI#pJe(a80&mwwWIyizaW1pH9pWyI$JS@ue4ODSxvt`aXB@i=ptJ;m{o@9}l;2J~I72JM6_111Y=x_0DPnF4Z9g zI6FEcOcwTx_Q01~m+5=PS@)EH_c=0p6kRUFN^JPVB?rEdh}$LDuli$w08It@fd`s& z!z;YJ21KJ}Sp*?&8LT8A26U#HcqWrt=AN7!wIEd5)W@B(C0{%5Is^16x}4-}Chcw! z0ml84FLd2e10halHMSz>7*WSZsluDC3UQ-4(__K&SyG;XZYxp#0)8BUQiH^NAKo&k zLsMB2QG(NY_cV4gl4xnh*jOat`CK${uc(U509sEQiG13}Ud||m2=Wz)4t=V)M}6`9 zo9cAZSP+XeJYSg+qse2VOJpvhb3t;TGEyVBBPPO6G_t`r5xp}4w9!7OKj7QNL2A?e zW!~mQuxgA&7H)JLa`@kFxfM@S{4OH7^S*s*!I#E~UY@#4Dm}qn$+2>s?iha6Q6otko zt9Dzp%S*{Z422kSZbag@do~|WzOhCJ_~mwS-zmsTl=66Kv@j?k6ZyQi(7Mw!aQ~gF zvoAw0uJ}3O7@7XZ`-=nSpPqhqgqQig0PzgZ6y_SadU5Di2(1zmO_h5U! z$Qz^`0*F(h_;)I~r`)L&e&i{(_^S=+06|(3kmy)m^ZkWJ$1|501BY%QBPe`@%J7of zkN`)PWFnw*V$IBxTf;Ku|F^p0hcB{%Q`3JY>~Pu=kQiZ{AIjBUzWQ{g1g@vy#tS&t z#FQ+pF-hi=C+`KV2dR=NbLqpJX^(q1y}Sd)<`fGzJasS2hYk3I-~ZGpo?yoX#?bzo zxDm_)DCIaTwV|oUj{G)p1Pm}wBlF}nGJo0aYU$&e5 z?ORS|zN{N4)NmdrqY7V1eB3*>9V)rddc21ybJ=6uh(6*y`;~X0^+X&htnFgS2kZoh zg@M|mcWp5S_S{6quy9;F;SBkwL?9sq42+}(?#VsM0*ijC=5Kzb3OTy~00(PHL_t)I zt@w6bLN%q(Me^yIpfh>XBZb<*|FeIN)QnqMxOo*PUOB;O@{mLzRs^8+sD~+Y`IDUY zZS|h@_IuEJhGV@rmCus|G)3=*cU%i?Xy_87f9DsljboYAhNb{Zel-yS91mC>S93d9 z_LAGx!17nwnjfarUapB69nUdIK+~YbTkk5?4*Xyp=IzjiT2{a|R4IvQ8qj~_*FXSD z4^xlu>}7x8+TicJXFs`%v9bhHl%y`8l7M3D+whxLuTqWRMm}8k1s>^|58xKYc&R)s ztq=h5kW$Mt=I>=n_MK|(s@-hO&!yHg$rz9XGzl;h9p>#XWJizu>rz$8JkJ>1djr!4 z=3uy0PIRt3mVO8@Vzt~~)WCl-7ye3D{5yQ7J#q-P9t72vWikXL0ZoR?6vuhvFXu#S z|EHSyOD?6pUDq%g&XPnl1z;)u6(e5Dz4@I=_KJHneduLh@g*YMnR5A#UN!`^w< z*RUo38+ov0i5CI+l*EhJBV>)7!B;+!j0iV01mB47B?UOcByBc{AMM4&*omm;rv*_>U%(Xg zV>Gn)0@8ybBBO{yBuf$z5ZVs&&Z$*$SN%cP2A}n+bDC-W?|S4kD>&w z`SaFwQ1!P4q+xl+@WxevB%rw9vgc&ePSkd9CLOsiixh96o-y|{BXsy87OY)PMp$S? zLOYUWMhNgG^5)jE%q8!Uzw}vksD2;$=k`(Frv})POT#m&T3(zm0+N6dhR&V~O)_fQ znn7*%W)Xi61$ebo?S*QIR~!l`jf?zfVFl8blTcjJ2=^pXBp7WLN$w4CY{6z<(ZL;KI5 zXwMvQ5Huq`7nKS^5+xn`b6ne53o(9_eDj)>+%w5HgZ`Y0{D!e94>n{Q6oG&+q zj*Jt>{GW~k)-mA6D+uQ=cx0Y_|TEHJXBW=BX$<*6HEKBA0h7W z2V|5=eLPAwrUM}S1E~#^+eDtcUY50ZKV>d_SLXw7`P$!Zq0;NawDMaaX-tlHlqL84 zR2qMr$wh9K@5cFqDz)zQQ`>t!YTfRo(hKr+Pw_Gq?L0*f)~;g1jg^RL?MHHtDu@bg zNfZ&F&n#o_qklT`Z9Lfs0XvaSyPiDRLo8#_K^9oJ&+z5$^z4#J*{%8^6(yU_PHjvWc zl`MR;oOr|w<)|8Dlsm2#F%IxDpZT#dG4?+0G|N7U8;uc+sC3-l;!lPh<-7(lxkD^- z0TT8t2H6zs@(`$c{ zQuwe!WmlDGp6qhQhvzbFsL0Uzi&?b0h=)6iDbi7lRMozb=Cc)e&lpEalZ}<}$45!! zBmhSVMx4rpW8VRg3{nwigt))B0}Fp0%%9&uN?r%|WOZ=G-|o@6nyC5d9?D;>k!Pbu z>r10Vf33-7@{_Q2^?~t&$JGsy!pDDxfJsX9qC$H+6v}N-`i!I<$3Gio0Tg9F=l2?WwI zKG1@qfsxP06N@2jG&XgdtX3i*5s(N-1SA3y0f~S_zy%2W|8{8$^fmbvzyJUM07*qo IM6N<$f>(-K-v9sr delta 22431 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 Date: Thu, 28 Sep 2017 16:24:44 -0500 Subject: [PATCH 3/6] Test image dimensions using RMagick --- test/test_helper.rb | 5 +++-- test/topics_test.rb | 6 +++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index 1911b181321b..adaa25f76e11 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,11 +1,12 @@ require "minitest/autorun" +require "rmagick" require "yaml" IMAGE_EXTENSIONS = [".jpg", ".jpeg", ".png"].freeze - +IMAGE_WIDTH = 288 +IMAGE_HEIGHT = 288 VALID_METADATA_KEYS = ["aliases", "created_by", "display_name", "github_url", "logo", "related", "released", "short_description", "topic", "url", "wikipedia_url"].freeze - REQUIRED_METADATA_KEYS = ["topic", "short_description"].freeze def topics_dir diff --git a/test/topics_test.rb b/test/topics_test.rb index 107a6e566a1e..685ec520710d 100644 --- a/test/topics_test.rb +++ b/test/topics_test.rb @@ -9,7 +9,7 @@ assert File.file?(path), "expected #{path} to be a file" end - it "has only one image with the right name" do + it "has at most one image with the right name and dimensions" do paths = image_paths_for(topic) assert paths.size <= 1, "expected at most one image, found #{paths.size}" @@ -17,6 +17,10 @@ if path = paths.first assert_equal topic, File.basename(path, File.extname(path)), "expected image to be named [topic].[extension]" + + img = Magick::Image.ping(path).first + assert_equal IMAGE_WIDTH, img.columns, "topic images should be #{IMAGE_WIDTH}px wide" + assert_equal IMAGE_HEIGHT, img.rows, "topic images should be #{IMAGE_HEIGHT}px tall" end end From e7eee285bb65442448dc9f99e01af56287b529e2 Mon Sep 17 00:00:00 2001 From: Sarah Vessels Date: Thu, 28 Sep 2017 16:28:16 -0500 Subject: [PATCH 4/6] Test image filesize with RMagick --- test/test_helper.rb | 1 + test/topics_test.rb | 3 +++ 2 files changed, 4 insertions(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index adaa25f76e11..6029fbfb8675 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -5,6 +5,7 @@ IMAGE_EXTENSIONS = [".jpg", ".jpeg", ".png"].freeze IMAGE_WIDTH = 288 IMAGE_HEIGHT = 288 +MAX_IMAGE_FILESIZE_IN_BYTES = 65_000 VALID_METADATA_KEYS = ["aliases", "created_by", "display_name", "github_url", "logo", "related", "released", "short_description", "topic", "url", "wikipedia_url"].freeze REQUIRED_METADATA_KEYS = ["topic", "short_description"].freeze diff --git a/test/topics_test.rb b/test/topics_test.rb index 685ec520710d..b05d0db91924 100644 --- a/test/topics_test.rb +++ b/test/topics_test.rb @@ -21,6 +21,9 @@ img = Magick::Image.ping(path).first assert_equal IMAGE_WIDTH, img.columns, "topic images should be #{IMAGE_WIDTH}px wide" assert_equal IMAGE_HEIGHT, img.rows, "topic images should be #{IMAGE_HEIGHT}px tall" + assert img.filesize < MAX_IMAGE_FILESIZE_IN_BYTES, + "topic images should not exceed #{MAX_IMAGE_FILESIZE_IN_BYTES} bytes, got " + + "#{img.filesize} bytes" end end From c2a468c04a5bdc159549ed763610cc3963d4b8fd Mon Sep 17 00:00:00 2001 From: Sarah Vessels Date: Thu, 28 Sep 2017 16:32:00 -0500 Subject: [PATCH 5/6] Clarify tests will run automatically --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9521d8c8f9e4..ff3066c20d43 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,9 @@ Curated topics and collections from the community ## How to Run Tests -There are some lint tests in place to ensure each topic is formatted in the way we expect. You will -need Ruby, Bundler, and ImageMagick installed. +There are some lint tests in place to ensure each topic is formatted in the way we expect. Travis +CI will run the tests automatically. If you want to run the tests yourself locally, you will need +Ruby, Bundler, and ImageMagick installed. You can run the tests using: From 5caff3094d518a3b93b9716615fa5a1a417076ab Mon Sep 17 00:00:00 2001 From: Sarah Vessels Date: Mon, 9 Oct 2017 10:46:12 -0500 Subject: [PATCH 6/6] Switch from RMagick to FastImage Thanks @mikemcquaid! --- Brewfile | 2 -- Gemfile | 2 +- Gemfile.lock | 6 +++--- test/test_helper.rb | 2 +- test/topics_test.rb | 19 ++++++++++++------- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Brewfile b/Brewfile index be87f11be92f..dc23f8cdcf17 100644 --- a/Brewfile +++ b/Brewfile @@ -2,5 +2,3 @@ tap "github/bootstrap" brew "rbenv" brew "ruby-build" - -brew "imagemagick" diff --git a/Gemfile b/Gemfile index 26df561f624c..8e5218d6b7ad 100644 --- a/Gemfile +++ b/Gemfile @@ -1,9 +1,9 @@ source "https://rubygems.org" group :test do + gem "fastimage", "~> 2.1.0" gem "minitest", "~> 5.10.3" gem "rake" gem "rubocop", "~> 0.50.0" gem "safe_yaml", "~> 1.0.4" - gem "rmagick", "~> 2.16.0" end diff --git a/Gemfile.lock b/Gemfile.lock index ec344439413e..986b8ed94a6a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,6 +2,7 @@ GEM remote: https://rubygems.org/ specs: ast (2.3.0) + fastimage (2.1.0) minitest (5.10.3) parallel (1.12.0) parser (2.4.0.0) @@ -10,7 +11,6 @@ GEM rainbow (2.2.2) rake rake (12.0.0) - rmagick (2.16.0) rubocop (0.50.0) parallel (~> 1.10) parser (>= 2.3.3.1, < 3.0) @@ -26,11 +26,11 @@ PLATFORMS ruby DEPENDENCIES + fastimage (~> 2.1.0) minitest (~> 5.10.3) rake - rmagick (~> 2.16.0) rubocop (~> 0.50.0) safe_yaml (~> 1.0.4) BUNDLED WITH - 1.15.3 + 1.15.4 diff --git a/test/test_helper.rb b/test/test_helper.rb index 7f2ed504a17e..a8311a2a01ed 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,5 +1,5 @@ require "minitest/autorun" -require "rmagick" +require "fastimage" require "yaml" IMAGE_EXTENSIONS = %w[.jpg .jpeg .png].freeze diff --git a/test/topics_test.rb b/test/topics_test.rb index 3c23f6925186..af0daa1ff001 100644 --- a/test/topics_test.rb +++ b/test/topics_test.rb @@ -9,7 +9,7 @@ assert File.file?(path), "expected #{path} to be a file" end - it "has at most one image with the right name and dimensions" do + it "has at most one image with the right name, type, and dimensions" do paths = image_paths_for(topic) assert paths.size <= 1, "expected at most one image, found #{paths.size}" @@ -18,12 +18,17 @@ assert_equal topic, File.basename(path, File.extname(path)), "expected image to be named [topic].[extension]" - img = Magick::Image.ping(path).first - assert_equal IMAGE_WIDTH, img.columns, "topic images should be #{IMAGE_WIDTH}px wide" - assert_equal IMAGE_HEIGHT, img.rows, "topic images should be #{IMAGE_HEIGHT}px tall" - assert img.filesize < MAX_IMAGE_FILESIZE_IN_BYTES, - "topic images should not exceed #{MAX_IMAGE_FILESIZE_IN_BYTES} bytes, got " + - "#{img.filesize} bytes" + width, height = FastImage.size(path) + assert_equal IMAGE_WIDTH, width, "topic images should be #{IMAGE_WIDTH}px wide" + assert_equal IMAGE_HEIGHT, height, "topic images should be #{IMAGE_HEIGHT}px tall" + + assert_includes IMAGE_EXTENSIONS, ".#{FastImage.type(path)}", + "topic images should be one of #{IMAGE_EXTENSIONS.join(', ')}" + + file_size = FastImage.new(path).content_length + assert file_size <= MAX_IMAGE_FILESIZE_IN_BYTES, + "topic images should not exceed #{MAX_IMAGE_FILESIZE_IN_BYTES} bytes, got " \ + "#{file_size} bytes" end end