From 751fe773ecfeb5fc6b012dcd727a0b0d53caf28f Mon Sep 17 00:00:00 2001 From: Dale Zak Date: Thu, 10 Feb 2022 11:19:23 -0600 Subject: [PATCH] Updated gemfile --- .erdconfig | 22 ++++++ Gemfile | 103 ++++++++++----------------- Gemfile.lock | 72 ++++++++++++++++++- SCHEMA.pdf | Bin 0 -> 33197 bytes lib/tasks/auto_generate_diagram.rake | 6 ++ 5 files changed, 138 insertions(+), 65 deletions(-) create mode 100644 .erdconfig create mode 100644 SCHEMA.pdf create mode 100644 lib/tasks/auto_generate_diagram.rake diff --git a/.erdconfig b/.erdconfig new file mode 100644 index 0000000..f27de98 --- /dev/null +++ b/.erdconfig @@ -0,0 +1,22 @@ +attributes: + - content + - foreign_key + - inheritance +disconnected: true +filename: SCHEMA +filetype: pdf +indirect: true +inheritance: false +markup: true +notation: simple +orientation: horizontal +polymorphism: true +sort: true +warn: true +title: Data Schema +exclude: null +only: null +only_recursion_depth: null +prepend_primary: false +cluster: false +splines: spline \ No newline at end of file diff --git a/Gemfile b/Gemfile index 313a326..85af93b 100644 --- a/Gemfile +++ b/Gemfile @@ -3,92 +3,34 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby "3.0.0" -# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" gem "rails", "~> 7.0.1" -# The original asset pipeline for Rails [https://github.com/rails/sprockets-rails] gem "sprockets-rails" -# Use postgresql as the database for Active Record gem "pg", "~> 1.1" -# Use the Puma web server [https://github.com/puma/puma] gem "puma", "~> 5.0" -# Bundle and transpile JavaScript [https://github.com/rails/jsbundling-rails] -gem "jsbundling-rails" - -# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev] gem "turbo-rails" - -# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev] gem "stimulus-rails" - -# Bundle and process CSS [https://github.com/rails/cssbundling-rails] +gem "jsbundling-rails" gem "cssbundling-rails" -# Build JSON APIs with ease [https://github.com/rails/jbuilder] gem "jbuilder" -# Use Redis adapter to run Action Cable in production gem "redis", "~> 4.0" -# Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis] -# gem "kredis" - -# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword] -# gem "bcrypt", "~> 3.1.7" - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem "tzinfo-data", platforms: %i[mingw mswin x64_mingw jruby] - -# Reduces boot times through caching; required in config/boot.rb -gem "bootsnap", require: false - -# Use Sass to process CSS -# gem "sassc-rails" - -# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images] -# gem "image_processing", "~> 1.2" - -group :development, :test do - # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem - gem "debug", platforms: %i[mri mingw x64_mingw] -end - -group :development do - # Use console on exceptions pages [https://github.com/rails/web-console] - gem "web-console" - - # Add speed badges [https://github.com/MiniProfiler/rack-mini-profiler] - # gem "rack-mini-profiler" - - # Speed up commands on slow machines / big apps [https://github.com/rails/spring] - # gem "spring" -end - -group :test do - # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing] - gem "capybara" - gem "selenium-webdriver" - gem "webdrivers" -end - gem 'devise', '~> 4.8', '>= 4.8.1' - gem 'devise-i18n' gem "cancancan", "~> 3.3" gem "omniauth", "~> 2.0" - gem "omniauth-github", "~> 2.0" - gem 'omniauth-rails_csrf_protection', '~> 1.0', '>= 1.0.1' -gem "devise-bootstrap5", "~> 0.1.3" - gem "bootstrap_form", "~> 5.0" +gem "devise-bootstrap5", "~> 0.1.3" gem "faker", "~> 2.19" @@ -97,11 +39,44 @@ gem "gems" gem 'store_attribute' gem "shrine", "~> 3.4" - gem "fastimage", "~> 2.2" - gem "aws-sdk-s3", "~> 1.112" - gem "image_processing", "~> 1.12" -gem 'annotate' \ No newline at end of file +gem "bootsnap", require: false + +# Use Sass to process CSS +# gem "sassc-rails" + +# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images] +# gem "image_processing", "~> 1.2" + +# Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis] +# gem "kredis" + +# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword] +# gem "bcrypt", "~> 3.1.7" + +group :development do + gem 'rails-erd' + gem 'annotate' + gem 'web-console' + gem "memory_profiler" + gem 'derailed_benchmarks' + gem 'better_errors' + gem 'binding_of_caller' + gem 'brakeman' + gem 'rubocop' + gem 'rubocop-rails', require: false + gem 'active_record_doctor' +end + +group :test do + gem "capybara" + gem "selenium-webdriver" + gem "webdrivers" +end + +group :development, :test do + gem "debug", platforms: %i[mri mingw x64_mingw] +end \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index f8564af..29080fa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -46,6 +46,8 @@ GEM erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) + active_record_doctor (1.9.0) + activerecord (>= 4.2.0) activejob (7.0.2) activesupport (= 7.0.2) globalid (>= 0.3.6) @@ -71,6 +73,7 @@ GEM annotate (3.2.0) activerecord (>= 3.2, < 8.0) rake (>= 10.4, < 14.0) + ast (2.4.2) aws-eventstream (1.2.0) aws-partitions (1.553.0) aws-sdk-core (3.126.0) @@ -88,12 +91,20 @@ GEM aws-sigv4 (1.4.0) aws-eventstream (~> 1, >= 1.0.2) bcrypt (3.1.16) + benchmark-ips (2.9.3) + better_errors (2.9.1) + coderay (>= 1.0.0) + erubi (>= 1.0.0) + rack (>= 0.9.0) bindex (0.8.1) + binding_of_caller (1.0.0) + debug_inspector (>= 0.0.1) bootsnap (1.10.3) msgpack (~> 1.2) bootstrap_form (5.0.0) actionpack (>= 5.2) activemodel (>= 5.2) + brakeman (5.2.1) builder (3.2.4) cancancan (3.3.0) capybara (3.36.0) @@ -106,14 +117,30 @@ GEM regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) childprocess (4.1.0) + choice (0.2.0) + coderay (1.1.3) concurrent-ruby (1.1.9) content_disposition (1.0.0) crass (1.0.6) cssbundling-rails (1.0.0) railties (>= 6.0.0) + dead_end (3.1.1) debug (1.4.0) irb (>= 1.3.6) reline (>= 0.2.7) + debug_inspector (1.1.0) + derailed_benchmarks (2.1.1) + benchmark-ips (~> 2) + dead_end + get_process_mem (~> 0) + heapy (~> 0) + memory_profiler (>= 0, < 2) + mini_histogram (>= 0.3.0) + rack (>= 1) + rack-test + rake (> 10, < 14) + ruby-statistics (>= 2.1) + thor (>= 0.19, < 2) devise (4.8.1) bcrypt (~> 3.0) orm_adapter (~> 0.1) @@ -155,9 +182,13 @@ GEM fastimage (2.2.6) ffi (1.15.5) gems (1.2.0) + get_process_mem (0.2.7) + ffi (~> 1.0) globalid (1.0.0) activesupport (>= 5.0) hashie (5.0.0) + heapy (0.2.0) + thor i18n (1.9.1) concurrent-ruby (~> 1.0) image_processing (1.12.1) @@ -181,7 +212,9 @@ GEM mini_mime (>= 0.1.1) marcel (1.0.2) matrix (0.4.2) + memory_profiler (1.0.0) method_source (1.0.0) + mini_histogram (0.3.1) mini_magick (4.11.0) mini_mime (1.1.2) minitest (5.15.0) @@ -227,6 +260,9 @@ GEM actionpack (>= 4.2) omniauth (~> 2.0) orm_adapter (0.5.0) + parallel (1.21.0) + parser (3.1.0.0) + ast (~> 2.4.1) pg (1.3.1) public_suffix (4.0.6) puma (5.6.1) @@ -254,6 +290,11 @@ GEM rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) + rails-erd (1.6.1) + activerecord (>= 4.2) + activesupport (>= 4.2) + choice (~> 0.2.0) + ruby-graphviz (~> 1.2) rails-html-sanitizer (1.4.2) loofah (~> 2.3) railties (7.0.2) @@ -263,6 +304,7 @@ GEM rake (>= 12.2) thor (~> 1.0) zeitwerk (~> 2.5) + rainbow (3.1.1) rake (13.0.6) redis (4.6.0) regexp_parser (2.2.0) @@ -272,6 +314,25 @@ GEM actionpack (>= 5.0) railties (>= 5.0) rexml (3.2.5) + rubocop (1.25.1) + parallel (~> 1.10) + parser (>= 3.1.0.0) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml + rubocop-ast (>= 1.15.1, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 1.4.0, < 3.0) + rubocop-ast (1.15.1) + parser (>= 3.0.1.1) + rubocop-rails (2.13.2) + activesupport (>= 4.2.0) + rack (>= 1.1) + rubocop (>= 1.7.0, < 2.0) + ruby-graphviz (1.2.5) + rexml + ruby-progressbar (1.11.0) + ruby-statistics (3.0.0) ruby-vips (2.1.4) ffi (~> 1.12) ruby2_keywords (0.0.5) @@ -302,6 +363,7 @@ GEM railties (>= 6.0.0) tzinfo (2.0.4) concurrent-ruby (~> 1.0) + unicode-display_width (2.1.0) warden (1.2.9) rack (>= 2.0.9) web-console (4.2.0) @@ -324,14 +386,19 @@ PLATFORMS arm64-darwin-20 DEPENDENCIES + active_record_doctor annotate aws-sdk-s3 (~> 1.112) + better_errors + binding_of_caller bootsnap bootstrap_form (~> 5.0) + brakeman cancancan (~> 3.3) capybara cssbundling-rails debug + derailed_benchmarks devise (~> 4.8, >= 4.8.1) devise-bootstrap5 (~> 0.1.3) devise-i18n @@ -341,20 +408,23 @@ DEPENDENCIES image_processing (~> 1.12) jbuilder jsbundling-rails + memory_profiler omniauth (~> 2.0) omniauth-github (~> 2.0) omniauth-rails_csrf_protection (~> 1.0, >= 1.0.1) pg (~> 1.1) puma (~> 5.0) rails (~> 7.0.1) + rails-erd redis (~> 4.0) + rubocop + rubocop-rails selenium-webdriver shrine (~> 3.4) sprockets-rails stimulus-rails store_attribute turbo-rails - tzinfo-data web-console webdrivers diff --git a/SCHEMA.pdf b/SCHEMA.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e3f402258d82c2eb07c07d1684f872704dede1ff GIT binary patch literal 33197 zcmdqJbCe~`_AOe~W!tuG+qP}nw$WwVw!6#fGP=vQZQbe*=bZ1|^Beb$@y7e-?aZ+= zW5$Zij1{r>*lVsCn?zn%l!k$p1(KxstmXxh8J`~C&d?H)n;V}_+Qin(*&Ltc6HkEH$#7%SBp&K6wAb>y`D&?t1}J7 zS+{kK@??9HdIr*(N%d%)3AX|zy7dB=s%J!%qQ&!q=<6%GlzNp~!RKs{i8ifc<9fMf z<9jW%_Bi!Ilh^O=_l?*Y7;~rF?t37hZ_u4L%!e=O#v6b-r#6ykm>=Mt=X@4S^tFOK z>*|F;lV+$}&@XI;BIcQ2Y!04~v#SPy;(7Hf;)vSInao|eaPNEs20<)2XtNvX4 z)1w#KzZy-Zm4xcvfD?P$GC-*(bTV>e+kY~8vvsAN;)Ub?z{R2{*8V~6g`xZ-PAnU{ z3IoGL@`l{2Yh*H4K!1M!43&7quWOyLv3-RRs$c*F99DcMtQxY6ZE+h=VZ+}VBcA>- z@=W~kXzjkwwx+SlBa;6|5iAtS4`B^UhR_uecQ$kaAU8)O2_q!dkYY(4OzA+4MZj6Y z3fl1>(M9E7Q}60Q5b94Ol-3FpD{XPu!jH_Z0d%Zvg$L2O ztn^!?=P+@v5yR#pIs~1Enkw2oaGc-Y^^WgEXEtNZ>zX*IBt`9KV`n@_N2hIFhr+zI z&s)uxekpy0Cw3nH;5`=6wwYOjGgvFFMupv4wYGE6rh`@s8LfRat51IjOVgL*0_h5? zV7lxnCu;N{^`=&;YCO=sQ>xqd1ZftFzEt6rXhbEj97s2!ljXXv2phP;_Ub*zZlaIN zW%ItfuG_yl=*o?idx#Ha-w%1)3iHEC^MsAiBiw>Uq&vv2(~F9U5&-CPTjJt81Nns=BleCdBd!b@Hu)wIDr2!G z^i$Hac0VBFf#eO^x48C4baLgzg{Uqn(+P(P2r$*L$eudfpxI_z`U4YQ<8fkDKBdAW zB957QbM^x(-#*mW6BIQ{lc`lR_3}(NB0f|Fx}lA+m$lwvC%5Gpw6y{39iA+j97Vq4 zKomDEJ|K|nMnRR_z^eW0RBu0_>eo07J3%c@Oj}Sh(GnVSBca|R^tvnMSlHTupXAAa ziE!qnpoQCSEj=jDR1RdKVjLLg!j8)Az342CEcVAef&6e-p7zy7acII=^ntM7U_j^k zs?wJ0BjIHG;LX1@nG|jt`uCQDuMg{%q7_Bsl(oanv%`LG#_hESgsy>{ra|6zDbZ^a zjuBv?@%NSJHE2L&#}@;QO)|Dk`W1M^=BwKzmlgFR^vj2ITSS;^gg=GgK-DBRG^_Sd z<;$w@@?x-@L7`JB1!+GfkIgMjNq9$;WTG%9O71MmmQG)MG~*mDOt|e&;QS+FL7X|A zkfM2fLPYe1dH-UMO~}zXks2273s-0KDUU`Hv4h;hja7q|Q#9$MwbLgS_cfm6;OGeG zqgyL>DpbWOt7&AAu$S_m$rz~}VUeY(rg2849+pT7PIu@GA8e$847`q%^wp=#pgvzF zAygn;m{QFts9%9_DA>zZhB*BXojClLv9l3@zehvPbAUM!DckBMF_>GCt>Nc?3oN7% zn{HKXP%sAsq`^sUeCNgx5X2u7Tm>?S3o!D!Xgoy}1u)!VV|Q8z!lOvbErX4KVnajPuZkBau|{%DF@=e-WGmKM(8_9Nk&3vKszqu{9^AI3 zbWN+7PKbknls;R&n@uq=LMARqFDU~DDE4-%VR_#Kz2W@=-mJqUju(|S>1YN=ZTLp) z?MSXfw}=gu)t7xHG5>%Di z3oNoM;_gOk#K%7ex@aV}7n2MahSCo&DzL+kZQLY4HHxn}GY*|nar4r_A;4B2|cpt8;~;bG>6QRlsBGQ$e>2-(gi z`rvG5&T!X;oFrsnh%`*;P^FRio_4U&*U`q3vWS)~^HLTT#sjyMzLE$Q6Kd~A`eOqB z>X7C>R>cH{IH*Evkn8I4-bo-P*}SkG@iue)%Kc zlFDk*Mp5@vhG#7&8@S>Q9_lNe9bNG#P3{N|AF$>%#AszkDoi#4(`{!L%0H^oo8{ee zVIF@vSEOoS*II(K6=b;a>{eIY#(sk;i(UCH=MQ7sZ}oMEj{JOSc}g5Ok!QdU_I*k5 z=mT@S8|W=OcGOa!RbOX{^q1Rs3NASJ(+!F=u*R?k3b2p*t>g$-ua|$om5_n9P0B(Na=B^<^ z9D9PFHwc4KZpG;)@a0r{u3zvOY35qZ$@Nwk8t<jdgsQA~@V#YSOdZ?k z;%_BAsAWC7sYF-IXhis}4?yU>?&}#tu!z%$TGTfw$NUh_%}y`bEe6n2Fp$)3_zGp- zcP4(-jN%SHM41a1fCN*AOY(|qxwb0q zqXieGIwGp0!CtfSyjp_XH8u$vAoqYKa5?ZL{LvnNGCnj}CtbfF#HrU1#P6=G1LstLul@Ab7TB<4P zA(V%O5sti3z>zvRgm>^0kk89o4pP_>$DSZc`i+XQc0VfM0e(iFciqsF%-4DM60Hyp ziajs}(eba~V=U1jZeoa5Pc(H|Ly;1D6v1>O7!a@EUx1L$UA$zw9vSE<)%iAaK_1tD zb^Bz!dWC&oeljgW#W2{S!2bxd^k??= z4~-T=eCXgI%NkPvm^`SV-ewQyNb#2ZU`J>hn-@nw9nV#x2EH#vN)tC5gpaddthQHv zr2<7Op5D%Jw0vs>*d+iK5`bK>of_>P^#lCEv)Te_Vr%?Y1oe6LJNEh=aQ!}hhFnZc z>`cE6eixbk6`K7KjET5AizzvO24eW!+`oa(7o7q9X91s1NC2M!pU%kO^ZheC`>go$ zolexw*7-lIO=;+9=RggE{QF@Hh~^#8t2d0F=-+{+vWLA1KApUQnF&4#KEofqlQ(cQ`Fz-awWX6WF}5%ev~$PT z`fT`lCkAE~d=@5le4Rhcg+6=sY43#pJAVB$SQT@$bFu%A-u`)$KhVG3rG!tX>}X)? zWdHkSMjn5|68O%JE+&7Mgg&i=O~YvwQjXtUYnLlTwHdljkYp_!0Xieev0RHkePmy=Cwa=H;KLR6%ddgh^Hs8 z(#At-VFid!8!XQk$v=JJ*SFbbDw`i%01i6 zs|cZ{=D0L)&S;?g-0yO5{gXHoVlMClNM-DiKH#s8aK_Zu6Wfz$2;M!?^<2%gp!i9b zB-_Qkhptn+ItExAtinH%+|?E$?`s-|Iz0hTQ31|ZdiXi+(4Lfbs{xdVrs2c=)35+z zE6U;kw2LTjgd0;MN_6vbigkT3WT&+NoPfwi5aoPyee-*5E){4FT7Qk(ki0 zey?Q#l4n(CP0M9-ahZ-91&tf6M05{8QV&3IPZp&^#V1uNWVM8n7Z3ab4onX}0uB6& z#RHNwI#udx&ev7YUuTSDSP8&GapQyc6jWwOi-_ybW7COfX`th4t=}A`rh$UO;L^O^ zLRnd)g@E?GzemY=?~G4Z`mwXji&^RC^LnOd4#|W8lLsh1rfv?5bI%_(Q#iQl88rJw zbSTjwM-8#FWGdnpRpLCei%Iy8UZr-)_az}4dq#T(pq+hZZsZC4CNO$x56LSQo8o|M zAr&&K=#{WJwVG?2nYGw9fcs)`qk?9mjIzOIs|0jIFTR%bOxC-Y1Uge zchw_mC?+>PyaS~fN|0+62V_j^2J3RsSZVd`fmeI`*XhB>O}f%r<#N;`7Z z`RkF;ieFN=8UXzGOdJLaUtB@Od+8NN#vEs~zQ%Mv30kH`vaC^E`UESgiZA_#gFgybh=E~CNhI&PEue}cg@LXD0qUl8X6W8`bYl0my*7^hWYu^#25+VetM;? zBlsvN=X}1Gc?(H+xf#1z$68!=C#t^d(wNXfX#MF`d(L%qTwEYxc27^B6L!vzSveykDJ3^om$i1yuV`!A z!%GpdM+!3U5iLrFIXjny;o$)qHO#GZYrF`Vh1>6ZxvO~tb>G3o77KxROfDWBx^37# z6c_^h49KDG2nv;Xt|(YUN;JF){Pl`)-8$}v(M^K}y#Fb7@eb1<04HKLpg4oZ7xQL) zRy2TSIV}D-RHty%*ZCsMvm)sd(bz(NT|PwV`g=`zlFZ~hO3Z_s{elIt`UG9|o^)cu zV&>!seb*mG(h^y_*B)f}C6GJIyeAnOY)-%C4n7?2O__b)y|O$R2|n&y`#TSkwY^PV zPA7!;UR(3|&X)QaSsw2*mc?`uAJ&!BH%BKaGd}vpgf4W?XggoPs>dL;J=!fuqNaSW zm-l7-wwtcMCkbyD(K$Bj2O%$_jjx#v>ZH7F143~LF`r5pE)gg9lMZktG*JjjMrvFz z5uO-9vxW_swJhTxAjfv7L5syhyID-|J6!dQlq>tIUgChM&LEl1x(lS1JrvBu=b=>% zT=jGyV8s3;9rhyV6^~gixF!svWCJxERuHB81)9VJF=|Qywnt_y<}s$_<$-SFWqvPa!{ZGb)i<0qYhZ3k zLr%iRpATqs8h%_6BG4Rlydds|qy|wn!qAXA(fkWNyK*3fEYiioBDMLoP{U8_h`i&n z&Sq_m@7|iBNG=pK*@iGNNj`ZIuyA|P>IL!8JBD7?@xSn(P<>Cn``L_~%T4&zojfwU zk8kcRoo|~7%0W+><{afrx4q16g2-RnxZK)Iiaz~=*a&569$vb6Wc1?Qlewa~BRR;N72A&^KJ)1JAY#(nT|0v4OvE`FZ2Do` z+D~haJ*pX3H}`$&J@5^N>p(*Ga?zubRF?kG8v+*3?xy$voVW7l$xF=3QpuLIgNVj~ z9cWa{V3OmJKFR@W%xP@ za@aDpyMWcK2ZJuz(kk(GIRXtb-j$~%zC8^cl|Vekh<2D8ORtWMBl!r~V0PqnL;_I2 zb%UfN5D*B^5NwkFc)b+TFxH)(_c&j}%@&7;gjlfF&54>^c{lwnSko(P_Hr~v*!R|4 zv53r;+m@vzay=3v)W%ln3DmjO4IPP~Am%Y6M|{ zQc3zK(`=4jvS;uP%MuRGhGIa~n9o0?j#-2=tuedBk(3Ddj^ z;|#5mQ;}z1fzZxwiu}@jd-5^bp9{+4gJyQgqrc*S7MOGRZ2&C7Hso%mlww6T7;F<6Iq@eAJ-iRCXHwIhJr=fq z(Cs^4{s8tCVj*9IZvM9%8PC-wo4LrBbspJ-|mYI6y_#3#MS z{6%$JQ9EMAo(swN+$h!o%l&2=e`_<$Lb+l~);%2lFs$+N;*#w(t-j9FmBfoy6Zs8p zx=&iOxGTZ+u;dy)nWm{EG3n&mp7PfW#T%gQupU$TxQ#T?4bDF9zEDd__Ee3j-^AL) z-Bsq34&~YO&%@Efr^6F{P_R{4Dt(&jb7<{gxlN{`TA8LoFsVB1i@ez&uQXq8$d`0Z z?ijRmphw#8adI}nkPhMMaDG|iiJ=wlnEQQ3v}=+Bll*ulExf4rE70X`*aJ>RL(zNxF)d1OIn^1^N-x!>v?$$q0~NWH8^-~PU6S|!a%p4U4{05O(}X2w0ClVAOfwKRGE6%X&RTD^ zWFd_!(jRrH6Zvbc4wUutOQ8HP^AylMh|mOM={Uegn}hu^yNT;z#?5WNtRcqLhiE3EunWp4akh~xTp-zTcna3%G&2pRHgP5 z#q7+O0-)|81ERX1{ZNW3CfQ`=~)jNUFT;zsqj zs#S)v-)QcbPQ(ECJxDD$pD2jZAX%XE5EPlv68M#bVnky6LfYq< z)9T}aSy(+R3+Gr^)tD)5S>9z~P7O2ncB=J7lo8swOQ?LHoJN%d^24UGz(^_Mey+q% zycUfcfIO<5S%aj%c1A51THiSTVW8Wf9E%7~Cq(puEenY@US;JRrbB=zj33X!^yRo? zh$vi35Fy$&oIj)xZ@!1NEoffDv5clX?xrtB3#u3WEifbrA`@F^=-LfBwj5@-n@ zDSv$(ovgjT)XPiBbB_sihX`B`6*vq8K^_{u0O7P;Ntq{sOQd&|rhT+JKKh6q^2iDS zC7=L{h})OB4{2oO3bGHWn>0Ae4s=U`EyRBG4uO^=SIRip?r9%BhZ}UO0gDJ5JLVGk znzamH`<;b=`_2@;ri~()sy5CZr7sn4+kn8KO$9` z9V0vW%4@hM!0q^3pyle1Gc{NiyI{u-t&g-$tmAY;`WvVGbRcp9U!I?qKLMXwY4`HE zK=uLY%>WleoK>C(?~TGN>HOJc-}SN$b!6NaSg1h)Y7{*wqX2{Bn&PH$uqm9sxPNg! z4Fdu6hLGzs?r3^C@-!?$TLGfmnmQC@Q+0$SjrrOm_4sAJhlW1jd~g9&!MV3OlGsFj zR?clxYY3h5ie!#ImDkbI06%cps1xsHVZ*t?L^-Mq^otVpbkI~Ek@AD0i2;Od;7?^X zMW1L&HbEY-W<0h#2g6I?8c?iBa7&JZEaJ+!f*DS|sJ!Dvq{&w5i(Fx8I-l}jA_Vsfc({7!DG!GslY|XyzL^3U)A$)zb9;P-k zeW%Mlf;CBtiuMcyEnTah;D}HzkCogYt{}StI1i9sojXY1;uavLc{p_b7{EbzJ)b#_ z_Lc*_fQhZ0T->U?_jqm0!u3m@61!c6>hs)kHHehQ2R=MMMOhV$j3>qv`BsLsBOF5> zDF~cfiH-?Nb z{P}$yxtU+cFq5B`m`EY3aEQ@vVptj}@HGI#dC#4_AP{DB%_N0!$5_ZgWl)V}!f3fi zjStm1*ll_S4$nULa7aLS9syHfeRFWJ(Gi8^Y%ic^{Q0L?XD25b1si#JL$;-pyAs=) zxtFF+4NSGsI1XDkkopD?et89}GEEE3NVOl7iMo+4=XXSk# zBqL=dH~)h0UeqqhC{@SzvngV=LI!Px^5a3hMJq2pmehYtXBP?R!I-{WR0om7$}Pmg!w zD>T#X@`h(2(6pP~pg&*|>+Fu98Xdf7RujP;U=ixp`JUGJDgx$Ue+zJyS0S|l^r4tE zZLeLOSBmQZ*%yG@38~v<>AIH=SQ6%{$+yjDQht#RSmKJuRVcSwZ_zxBt_zd#le)9Q z)7ot(C-AV-g*~Z0No{Pj!}j#}x{70eik}F~*LpQHkqQxZ=MY@kh9)W^LW}K_*f0jE zh}}i*PUF}zRTSQntEjd}Y$2Hg4Rzyh7umCNvp;Z&B7eTH>#SShQo$6#@Ty)^NmY3J z0^*nYh5Z*_{|9-@$jb09SN~>t|4Fz0CWD1doQxbT?49i#e-oR3@WZkOHlJLqfU=yV zkSvwBiM6YVvxSktzp6zIY%Huj@X7yGL-A*owSn0u5z6>4JHbDxS{e=(dVCsY_D{l= z`IE3^U|?kUi?Nk(Hn6rZ60kM1Ho>R=qnUt{(QnF^jqT6k?`Qj6reS2{_@iFPz+T+M z!p!`W75==;ACQu>iH#~g`=1Sd7sUTA{O;W+(Q3ko{|6iUpY-g1cg3IAb1`)OgNs)F zB!GVt#($uK22Lh_Q0M=HTPz%%oQ2E{9RKdWw839x1_stYF7QuR<1_q=a;Foq{S;AI z*qY(fsae;F9e_whHz&h(q){`bbn#`fo6f70xBDz+BC^$9H-jRdnoo zpd6l$cD4|>t@~|dLmdSlATQ81ua~FxTl>zA!xSeV^aYT7AmxnG>{|_AC%bUfVjdgE7ux{B#>=ieIm9_e& z=ACF?3AmO8KzcqvNXk0ysT^TT4s^T#3=D)#C&C{6?GW%D4{1fLlUp+N;e`H#A;l*M z?BP}bQ&a5WWOZt%8%XDZ$++@B4ZQYevHRWRD}<8!&VKf&Kw|(`>T?kS-ed&xaer_Q zO_jLHy~URRQnMeJp`7aFK_sQ2TuF*yipT7L{Lc<6rmN9q5{iIV(}ZXF3m?AvKTDIY zw)cCHroPEcl>CBS7n|y2%n>eNnO)bJSwW{`LTHNrlAS;P?G=|Pd8iYIv%1e>7ZF9X zR4BWk_!U*Ff>LV)6^J52RqojG%D9k(sPNpe&h>J(m~*SP8Ax82*Wa%L(MLk}{LzFU zY!tR?V)(H~_6gjoFIv5sH*W$GZ*-)mJ32ZHH*jdapijX!mn=jH9mZ4%kb)jHhL&<< z;RINAOXBL~l@so62-oiJ3Q0wGyl@FDO0f0g*8Eoe;NE1;Nh*%|Wumt8g5BBh{T|Hh ztOTw)Hw`uVoq`kH$9HVCZ#N>STS!@-#?)x96FNA0M33^9bqfL|KvS~8Lj(=VLM&oc zrDgT&7rBJgOy#_rDjrAS4)Uki_*(HJcs}G1?9~Hk+NwMiNo~mhD+gwEkG=50Node1 zZ7o`LT`qV%MK%4~D(+A`(zi~i)6v$wW+|iG*@JY>x&WN}V8?s)QC2Cs?kPdJZI>x@ z^W{AI3_0h@zU*T&5Sq-D7yYuV%tYZrE+U@mG}9a=jrE`K+KDjaeOjOoC!>P0LA}LBc$yl2Gf2LdXT)a>C${z0uL` zIRUAnn7zjL#)*&3>5$h^qG;yzA}EmZJql>NOnAsCHSQjY=NU0Laq4iS9|sY7dIZl8 zIMOUi1V&7{d)35 z)QYsIZHT(H3bXg#v?@o)%#*Xwlw9(jRY{Z+au3HKv3of0$c;pTo`SfIbAwOWOO`)0 z%3vLP^ZI*0X1$bbOz!=S6brf+Ia^Lu8c>7}$+Yyr+s6=Hn^Qrjpo!FY{Wp(p_Y*|3 zzY}}md->~^GYvm+Rhu_4fQ0{)ibNEtBVG}qZ-*g7P|{~637oJ%jZheX-Ub+Y(ix&f z0mRZ_PBE7tRKWKK=J;-(L=BWx8jZZ0DI=XxM>GpTUH!~SM;N6TwHJDbDd0klvk zU&ely8sF_IJ*A4vR9YhUYKV!2Wd*dAQ_?G}3`W8Yop z^i>=ZGUQK^UxlE`7TEGvr^(sy7zlsFfKoK|CFTd(yrOPd%t=Ypb!#nJMPAxnPdkc#!5O4m2_J|-@P;}7GE zW-^MA>B;z!cLj(*zav9V-K6@0_34zKok|V#% zD6$bUQUM*=S17e0(Fg|fhdx3UH5g=+rpb;q>ojl@E7)iYaFu>@p*cBh+_Y<|XcjAZ z{M2YepJ;epUFm_loC@Mhm%_Hm&C}%Q?U_TQnQt;qp1l` zUwh0uK`DFR!14n7(SlyLuj)lF;LEKq3T~9WaB?BH+I_-`{jBkxt_WNk_IzWRvhmu6 zAY2Z?l-va?3q^Vb-3$CDi8`QRUr`ffK!-}@?nr|aEe;ZXCQTU}tmzhxSryzMqAl3~ zt{>c0R#^l$^~o;1=`GDnAI>Rt0U z-BO<&E!{#gGqHG95b2cwKNP_#L2mpk4FcaMMZYk-!KHFy}Xe3K+& zx}o}Yu7!s-xo1L63u^w8Wi!|I%Ydf)WYj#S+Ec9B(ZyLaG2YOeot3_ z7uP;+k^sX!HHipIw?D9%JI}a%g{oykl_6h?=lMwh4=0c*Ls{_Ms}hfQRft!>1@Qr? zEM^>dx|fC^H}{?-x`d2AIt7iqTCsHg(Ll9cGV!oVh9UX96iUI$dvpoMFwY^vwbEp(_nqn zEx-$ASueyx$hDXinYo$81HIQ-RVtf≥(YX`+;(f^1{Pglxj$%!;;U_e932CJk*h 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 N-v^+f5tS1|{2#2mnZf`7 literal 0 HcmV?d00001 diff --git a/lib/tasks/auto_generate_diagram.rake b/lib/tasks/auto_generate_diagram.rake new file mode 100644 index 0000000..1df0696 --- /dev/null +++ b/lib/tasks/auto_generate_diagram.rake @@ -0,0 +1,6 @@ +# NOTE: only doing this in development as some production environments (Heroku) +# NOTE: are sensitive to local FS writes, and besides -- it's just not proper +# NOTE: to have a dev-mode tool do its thing in production. +if Rails.env.development? + RailsERD.load_tasks +end