From 8cd651d5f1966e04a60c7861cce38c1e0ffcfc52 Mon Sep 17 00:00:00 2001 From: Andy Meneely Date: Mon, 11 Apr 2016 22:30:32 -0400 Subject: [PATCH] samples: gistifying excel.rb and csv.rb --- .gitmodules | 4 ++ samples/csv_import.rb | 33 ----------- samples/data | 1 + samples/excel.rb | 55 ------------------ samples/explode_quantities.xlsx | Bin 8333 -> 0 bytes samples/quantity_explosion.csv | 3 - samples/sample.csv | 3 - samples/sample.xlsx | Bin 10748 -> 0 bytes .../{csv_import.rb.txt => data/_csv.rb.txt} | 0 .../{excel.rb.txt => data/_excel.rb.txt} | 0 .../samples/images/_more_load_images.rb.txt | 8 +-- spec/samples/samples_regression_spec.rb | 17 +++--- 12 files changed, 16 insertions(+), 108 deletions(-) delete mode 100644 samples/csv_import.rb create mode 160000 samples/data delete mode 100644 samples/excel.rb delete mode 100644 samples/explode_quantities.xlsx delete mode 100644 samples/quantity_explosion.csv delete mode 100644 samples/sample.csv delete mode 100644 samples/sample.xlsx rename spec/data/samples/{csv_import.rb.txt => data/_csv.rb.txt} (100%) rename spec/data/samples/{excel.rb.txt => data/_excel.rb.txt} (100%) diff --git a/.gitmodules b/.gitmodules index 9f255ca..80c46f3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -27,3 +27,7 @@ [submodule "samples/saves"] path = samples/saves url = https://gist.github.com/3c60c13b25f525abd037db4055abf35c.git + +[submodule "samples/data"] + path = samples/data + url = https://gist.github.com/6f89115805e205c647a779b7b4866151.git diff --git a/samples/csv_import.rb b/samples/csv_import.rb deleted file mode 100644 index ea4f4ae..0000000 --- a/samples/csv_import.rb +++ /dev/null @@ -1,33 +0,0 @@ -require 'squib' - -Squib::Deck.new(cards: 2) do - background color: :white - - # Outputs a hash of arrays with the header names as keys - data = csv file: 'sample.csv' - text str: data['Type'], x: 250, y: 55, font: 'Arial 54' - text str: data['Level'], x: 65, y: 65, font: 'Arial 72' - - save format: :png, prefix: 'sample_csv_' - - # You can also specify the sheet, starting at 0 - data = xlsx file: 'sample.xlsx', sheet: 2 -end - -# CSV is also a Squib-module-level function, so this also works: -data = Squib.csv file: 'quantity_explosion.csv' # 2 rows... -num_cards = data['Name'].size # ...but 4 cards! - -Squib::Deck.new(cards: num_cards) do - background color: :white - rect # card border - text str: data['Name'], font: 'Arial 54' - save_sheet prefix: 'sample_csv_qty_', columns: 4 -end - -# Additionally, CSV supports inline data specifically -data = Squib.csv data: <<-EOCSV -Name,Cost -Knight,3 -Orc,1 -EOCSV diff --git a/samples/data b/samples/data new file mode 160000 index 0000000..d9d087e --- /dev/null +++ b/samples/data @@ -0,0 +1 @@ +Subproject commit d9d087ebf415698bb81605c042b4b7e84bcdcb52 diff --git a/samples/excel.rb b/samples/excel.rb deleted file mode 100644 index 9fc9099..0000000 --- a/samples/excel.rb +++ /dev/null @@ -1,55 +0,0 @@ -require 'squib' - -Squib::Deck.new(cards: 3) do - background color: :white - - # Reads the first sheet by default (sheet 0) - # Outputs a hash of arrays with the header names as keys - data = xlsx file: 'sample.xlsx' - - text str: data['Name'], x: 250, y: 55, font: 'Arial 54' - text str: data['Level'], x: 65, y: 65, font: 'Arial 72' - text str: data['Description'], x: 65, y: 600, font: 'Arial 36' - - save format: :png, prefix: 'sample_excel_' # save to individual pngs -end - -# xlsx is also a Squib-module-level function, so this also works: -data = Squib.xlsx file: 'explode_quantities.xlsx' # 2 rows... -num_cards = data['Name'].size # ...but 4 cards! - -Squib::Deck.new(cards: num_cards) do - background color: :white - rect # card border - text str: data['Name'], font: 'Arial 54' - save_sheet prefix: 'sample_xlsx_qty_', columns: 4 -end - - -# Here's another example, a bit more realistic. Here's what's going on: -# * We call xlsx from Squib directly - BEFORE Squib::Deck creation. This -# allows us to infer the number of cards based on the size of the "Name" -# field -# * We make use of quantity explosion. Fields named "Qty" or "Quantity" -# (any capitalization), or any other in the "qty_header" get expanded by the -# number given -# * We also make sure that trailing and leading whitespace is stripped -# from each value. This is the default behavior in Squib, but the options -# are here just to make sure. - -resource_data = Squib.xlsx(file: 'sample.xlsx', sheet: 2, strip: true) do |header, value| - case header - when 'Cost' - "$#{value}k" # e.g. "3" becomes "$3k" - else - value # always return the original value if you didn't do anything to it - end -end - -Squib::Deck.new(cards: resource_data['Name'].size) do - background color: :white - rect width: :deck, height: :deck - text str: resource_data['Name'], align: :center, width: :deck, hint: 'red' - text str: resource_data['Cost'], align: :right, width: :deck, hint: 'red' - save_sheet prefix: 'sample_excel_resources_' # save to a whole sheet -end diff --git a/samples/explode_quantities.xlsx b/samples/explode_quantities.xlsx deleted file mode 100644 index 9e8b0abc1deea4e1a2e8b473806ac8080a7e380f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8333 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 diff --git a/samples/quantity_explosion.csv b/samples/quantity_explosion.csv deleted file mode 100644 index efaa11c..0000000 --- a/samples/quantity_explosion.csv +++ /dev/null @@ -1,3 +0,0 @@ -Name,Qty -Basilisk,3 -High Templar,1 \ No newline at end of file diff --git a/samples/sample.csv b/samples/sample.csv deleted file mode 100644 index 2685b0f..0000000 --- a/samples/sample.csv +++ /dev/null @@ -1,3 +0,0 @@ -Type,"Level" -Thief,1 -Mastermind,2 \ No newline at end of file diff --git a/samples/sample.xlsx b/samples/sample.xlsx deleted file mode 100644 index eabcf9b9f5ba16b0da724a2cdcd812dedb14b6a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10748 zcmeHtWmH^Swl(hV8r*`05Zr=G@ZerhxI4i;xVr=i?(Xg}90G+q!6CT4O8VZHd+GEW z{f+Vc>po*t)i_mW&Dv+}x%QfSt)nOl4TA##2Y~upy!!(L? zH15LRZ-n)%XX^@967q_Z37a!P7F8&dp*#=9#HfCTt%6r3cYM7!G}_}Aww5a3o#fX zvaTwo>zP0sklRq0MpqD&mk*{ zvnwK16*C_5DnOP4FQvP_u~pZpSb8V+ohP$=#*i{42i7I~h~ywm_L+}X9mny!U zeC>bs(H1{q0p`rWVL*Gpn3sK=4KRVXJ>q4h_5}p3(&}g*XVN*Htx&vZi|{Z@4t@aj zt(VYf;oVB%VIMx6MW$*D4Ff`5eyJ9S{*t?0kUxNYx?w!Cw#Y!(U)0{G(Wh75@m8$h zj5;@r1~z#1@csL7gGvVbC)OF0EZ@_N2#I!_-KSAM@XIx_-%j}g3K*gi{q4#)$>js0 zzdTsBw%Eve+HaUfCsk?;+2VgO#^4G2HcHNzqD4J8OdHxqUfH|O6+E15P($2nEXxLZ zVK}tyJH;20BGOW3F|FtCu7w*M!V>I_gc5lccej>yPNIOwdSJvb=sFjYu>d$m{@pU` zE-R4S3T6c#m_g`ZYJeH^SMEf_$=QN_gc$TW8O#E)c11kw%M7S~UZ&(6f|~QPAtxp= z{g`#`tBX9Vre~wF3Rn!s?$SF8g1YsT_(w0bRFoQq7$B*vm_HZiKA?3znNA2ClKY(a zLUD{3=DP0Y-WsIsBdFy;i@=tXYaL+|4}4jd?XIB#52rx1`y!g)S_LlyUM~cX+#(Uz zz2gH%a&S~&Xj5(;Wo73K}$ja(uqK#>UfLLc^QPBXSt)`3 z$*L?f)g-R2p_xY$os5jdxcEal77`HNuoYUXu?4+k3wNg=8w3iPT{gOGJ zd^5a;UagqZYb8BUaQ+zs^^B{z1xUS)ehjOT0l?ECDn!!$k+-2Z{7m42c)d6hS9c4g zwCU{$6uh^X%=iZrKme+ulSU}vfX^o6sP!=U4F?%oYi!f;O|dNu#IQ{&wPq!=M8uo|2droRDN5F1dHD_ z;vWL|=R7-^0j+_oKi{AISSR*0Kid#=>FwMpp5ynExCarSX1HQ_Hkrdq9wYi=@w0mt!(0Wpag&PAWY zr+VrP!wCLY%{qgh=~YWK^tIxip%}TR;!}s1in6emEtg6q!9kJv%||dZt3NH3B`k0c zbja}g3hJeZMEqtRJ2oKZ7ScVVBQ1dOyt+~x+cvlx4XuQTVzA~j3~yfp+4eq$eDCVOOC^oE0o9XAW2@$eX;UEt`cI>hc66OzAJg$KSDN?N1Y_Hx!(p`WCzE z6i%4CmZ-SH`K}STSUB4Qr&}ziro{@NYsj{Mjf`h9p9lF))Hj`M>a@z={7HEUi^z=g0x3q2ml|EVYW%71LTWTNID8F)pmLdF%zBxLVvtYyEg+%Dk zKpI#H=~=GaV@m%v*xYG{CYWD69KhUr(Yy^M3{9xUA!(r#LlH$02IAgD4x@U#oFPk4 z#H8Mmh)7zq>s--7+L!pRsyi z?eIJS)zYzcTz|hfd;-6m4t1gH7HuMytG$k}e~fZ&g0f~Qf4%DY{0&3FB1(q;p6_;) zjKFgFGZPA(@XLW#Mqe$FuHC$wtcsgr0tOF-rN};&-d6Ej1<^}L(I+8W8NnW89`#_ zb^|&AOMOpK8JdOgs>64sV6)^A){35!D+h1R<5lSo?r^bHX^!smS!G;F@MOg7o>$ovN8=8rcxEZKMIcc=?wXdwH)nEA@a0Ch-Gd0! zQcs>|vhbHr@!Nd&-h)eHK3Sdk8z=p>=MhDIy{67B#dEbm;x{qu4V42C^9cnu$#(px zEo^2)NE52^=}nYD(ZKNK6)eBcB-BmUZ%dqn`e73;RVVyuYj859UfUrib`o-aX5*m% z)ivTEc}x^fJEI$=iUR6;;a%MN_f-o4ueQ=syxnR>!|?2;`_(Gi767WHQzErj+NDHO zC=743(`^VnxjSDFWN2Z3djd0srQwcSfl_xcifSkUH+Rqw{jN!z)hmZ3j^Rnnxa6Cq zQ^67iS?@m~~O2@XmXh!wm zS41dosCs2>mLds6sG8S7BDhQ5HJA>c^Nsw@H3|Tt`mfkdK<#a}CZU8-t5wuyVmdMc zAZQX#VkrSaq$D|l#GwKx2QxWHH-w6a7Zkym-|?H~CZ;)~Jsnu$zqBhp=jMyjj9rbh zaSoGbpY4%*qTtN7RMsFN@KsyUwYK@xw*UPttaU%?+QY2ccXud!97gDUKLVR1SP5SJ zbWHrG8(kveGHVsSmM?lqF_`THP@*Y{mc2o@`0I)fjXb8nl)7L+mHjaoM5L`)8CZ%| zVOiR1c}z9t5f;X{ME_S}Jl{U_lq}GN1fFrgSA44#5Mc;xF^rFcLpd^>&!9&pwY0V@@%Un<4X z3H28mpM?h*Q6iVy2vY=ch@~-kW(qb`W^3@HdP@i5RSb=`ewMum4Nulu z8E(s@PDTQUY2plca-{@@RQEpy0$%P)o~O88lORUyep+yJ1xvAiPT+jj z?6TeejthR~@}HU??1Hc!HXQK_=zCE&kND{z6j2o}$|lt8{67?NHuXo>UbrfQ8jNs<1bf`Pq@KreRXjzGc^@%=w9jko(A=A2-dH}D0vgZ9> zlouJlOJpOBy(oz8|4w8VHOq~WcPBHdt)Q8mXA)`Ff`qRKiFMc9QjFzI6R z&|y?-s4lH8qu-Sja`=gmELMO-RrcJVY*JS~p1uHvH%E4Mis$ai$m=2%Yu8QvM9np3 z0$bx+(epNjv~G3|t_zdeiL)@$(d$DBE-JkZ)q-dUT_R@~-+Wry>>>nfuVe`@p8LKJ zCz+HKp}09Hr&I<>!@OE$v>6hRy@7Vq7`eBfTF}SL-T&ETW(l$UjhK}&;{t;)gA%1z z37_?4f%wv(@j!nnDW|#{P0*N{I*SMiF;V+@n*nn0drC$c-XkMAxRMM(+8qZ8&Dfx; z+c>)_+v&b&kG!*KGX6xK$XJ6M*p*1^s7e7(zlP5{4q;s9bZqva!kk!36(irBo3ams z6BLhiceBn`7>8QyQ-VD>_Ph!=%wg4*yOg-o<~>SAnJJH?6TT03`yCs(ks0q0>ClYv zhvHB0D03PtXuYAP0hng0b?S$S1VA&^HLphDr;fq<+jm)j9LXxEGuvj6Iae&nyzDPw zfK2kH`hA3;Jm9f%bz6nh08(&V9*f07MRZ*u6*0q~t|I)N6$4GBkyYP*%)olS&Jbm{?{p}NqntxZ zyV7QPv;^T6Yagh`Sia!CM#X<`9o7lv%0I`GbcECq1DH*4u>X=xKNpjP*SfapY&c%; z>K+WP+6hj^SP+U@#HLQF%(WWZ`8J`{*i0JYIUc<6Yh#kil&?+F*BrmJUo5ZRYfc%X z56CRM=RgvX$;RYOmP;Mi7b3G2R05FNI_T}fDZhb{J*JRk->+!L)T)=Nj;(i+RFDb9I&QJ5TS+I{^^P*p$!NOU^w*O%teXl# zj)^*xV71h%f)y=b8m3Vjt$8~%JDh6JgjbOGJ#5~`+* z<&JIoYrIYgQC@f(Nn&>PMz`X0< zqB<_d7y5Xq$8s}Ko3EZYvPc!RTzk1M<+<4}nZ(w+aFnYAy7_c=Z03%r-^>6sl12?0 z86~ADK-VN#p4(}VohF5|$;+JhR#$oi3HeEuz(60Ve8D`R`M~X6*S=P6WS`YF7e#(K z=NG#jMT(@$!W8ExS4#$N-8H|b*XjE$Bq}hyQ2#Z(elFAr3A(l*a-85px_u$?1Is;6 zj&fk@H!RhU{qKu!n&=2X^aF0fahpqrzNU2cxh1X8rza;Fy_Ru>T$*_TGZIC#{Yn^s zKH>t0u>^+uv(t?ONGc=q_zA5S{QZ(PM=Ix6Dh`ToET4X1h6)*Y-&E5OiTJE+H7-rK zzRfRD#9W&Bm9zA#Ql8Iuw3_kK1dG_x;sJai8a{oZxIqS<`CsKv23%;0zJn~B+1Q@ ze0aiFHR~J)sQR~=o-_1YunSY?s-ztbN@{peY#~It#rEDh_PyDIc4};?=*El|=1FGG z!gl(YfqD4{=Xq{OMh`*z5vnzOeLhXrDKwun`T5XU1L9F$*N^lB?)jzPsdzT4i6w_^ z)C1V*5vtI-;$@dFhK2drQ{?#l4PB>)vpc>1(U7T>SZrOD z&1*J<&oI77@c>-IO^^H&wFp%~$iAnly0vkFrm2^q=u+-ljOM6MRT-^=seD}slhBpD zl7c``kRe61*t*uqgn*?J}eeAM&1YCmNf6gdUL25-XliFE>r z<8|L9n!u-t6$Vn0`p0*0p5fj;v^EgS60s0_{V`Bx32TOUFf~{ zs4nYk`9OaM+CjZY(zG`@(p9(8nD<{1A8yHFec*qWi>Gp?o;ZP}y*^m^;{3sBGeZZU zv5J#}xsB;hYA2|4%g+m=w5zX@l{MFDa*ra>ybMBO$ya8;HFaIJlHhxeW@Nf^??q}~ zlpuw$xp}c}Dip1&e*>Cm;ldRpXSa0%c0uPl? z)Im-zeBwKPqteHY7*=qmmp z3|lWwja@FB0xg+#ix;cPnC>RmawptnS%6};AR|li*J$f=bem{`_lx;n3Sq~+bBA&F z`7W@wQV;mWd%|-*zg0{_dpCf1@GNnIX9)w`Y%sPpQgpDjb7VENv-`35fZKBaZ83m7 zml6M~W{$Ez-29mn#jgxt$@jg=@MV01scL~yP8jvuh}gZE=!UULO^>Y$K1fBKZ_#9v?1M0=BnI7hkc?wk z`9TS0+Fyw>s!24=0gFVdri(*gIllBb*R?Xk#Nh+4#Cx*HCl%l2=j9NP;*;K0nv+_O zgrM(=0u0JK^4Bw8^yz-n|FZeEI%n0ywwsX$7k8q(>!2ntfF&_QaOwjQy1G>v@fv1= zr(BUX+udl=0C2J-PaHl8z%qKbQmy-Tb(s7+cjERd7g`LXGvJ!hTQ89h*UvUhtsoH+ z*ZrUI1WwGE?+NZ)DRy<68``q@SJ{O%xvWF_aLLB+kgi@OxET<*OJ*F-e@ZwQa<5gO z{XY1;;tf23>ue9`OR(XyHKEr+x^4qEbx||H%fN4i()AW{!D;x;^Bg8l#hAm*NL9SDO%S_v#DF#j6TMz#*X z|Hd?U;{G^1HlEU>`(>J<^RcMMXh=AF@ag)Mz_`)@>L$&82b|?%T~WU; zttJfJ4om=urP+eJmkex^*}@(n<|4=MW&%_XEJQ0`Wt5yqVlO&{@d0I@z0JE>E*bmU zU_D;o6%q4pHTvwM_QPb;_(BCtHf6j&BJw;}!_d)pEIf6`tr^2X5YqbEvu$+?C0D7 zL5eI$(Swf)inm~5{bTP93B?S~?Z1B>>rXHL`T3itvlM0j4)FKKL;f`U@mT{-Pk(t> zNqToC;Q z(24oK|NeiKM;`+|E-(H9?7{j!0Dl!59|JzF*8KwP1NR^Q@XsG3{8hVqjPkfj^9uzF z@3$yFYc`Kj9&g5fq1b~9iN6`k&)a&8@_6U<3*`gRPn2K#u*as41@14?EYg3NK9;+W z5&kZ|e%V7nh><}+JeFdQtsf_wU-qb!KmY&V$$$SoXxzUA`ZJ$B2K{?R`ZZ1n2z;u) c+~=S9Nl_LS9JN36C