drawio_dsl 0.11.1 → 0.11.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -0
  3. data/config/configuration.json +157 -16
  4. data/docs/domain_model.drawio +89 -89
  5. data/docs/domain_model.json +267 -267
  6. data/docs/printspeak-architecture-controllers-custom.drawio +9 -9
  7. data/docs/printspeak-architecture-controllers.drawio +47 -47
  8. data/docs/printspeak-architecture-generator-custom.drawio +16 -10
  9. data/docs/printspeak-architecture-generator.drawio +268 -0
  10. data/docs/project-plan/project.drawio +92 -89
  11. data/docs/project-plan/project_done.svg +1 -1
  12. data/docs/project-plan/project_in_progress.svg +1 -1
  13. data/docs/project-plan/project_todo.svg +1 -1
  14. data/docs/tailwind_domain_model-custom.drawio +104 -0
  15. data/docs/tailwind_domain_model.json +288 -0
  16. data/docs/tailwind_domain_model.svg +3 -0
  17. data/lib/drawio_dsl/configuration.rb +36 -24
  18. data/lib/drawio_dsl/dom_builder_shapes.rb +78 -0
  19. data/lib/drawio_dsl/drawio_shapes.rb +121 -43
  20. data/lib/drawio_dsl/schema/_.rb +13 -0
  21. data/lib/drawio_dsl/schema/element.rb +4 -0
  22. data/lib/drawio_dsl/schema/line.rb +33 -3
  23. data/lib/drawio_dsl/schema/{texts/.rb → lines/dash.rb} +2 -2
  24. data/lib/drawio_dsl/schema/{elements/.rb → lines/dash24.rb} +2 -2
  25. data/lib/drawio_dsl/schema/lines/dash32.rb +9 -0
  26. data/lib/drawio_dsl/schema/lines/dash44.rb +9 -0
  27. data/lib/drawio_dsl/schema/lines/dash_dot.rb +9 -0
  28. data/lib/drawio_dsl/schema/lines/dash_dot_dot.rb +9 -0
  29. data/lib/drawio_dsl/schema/lines/dash_long_dash.rb +9 -0
  30. data/lib/drawio_dsl/schema/lines/{.rb → dot.rb} +2 -2
  31. data/lib/drawio_dsl/schema/lines/dot_dot_dot.rb +9 -0
  32. data/lib/drawio_dsl/schema/lines/double.rb +9 -0
  33. data/lib/drawio_dsl/schema/lines/double_dash.rb +9 -0
  34. data/lib/drawio_dsl/schema/lines/double_dot.rb +9 -0
  35. data/lib/drawio_dsl/schema/lines/long_dash.rb +9 -0
  36. data/lib/drawio_dsl/schema/shape.rb +6 -1
  37. data/lib/drawio_dsl/schema/text.rb +4 -0
  38. data/lib/drawio_dsl/version.rb +1 -1
  39. data/package-lock.json +2 -2
  40. data/package.json +1 -1
  41. metadata +19 -5
@@ -1,22 +1,22 @@
1
1
  <mxfile host="65bd71144e">
2
2
  <diagram id="hn6" name="Fat Controllers">
3
- <mxGraphModel dx="932" dy="583" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
3
+ <mxGraphModel dx="1209" dy="490" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
4
4
  <root>
5
5
  <mxCell id="page_root_hn6"/>
6
6
  <mxCell id="node_root_hn6" parent="page_root_hn6"/>
7
- <mxCell id="xLSgLBnB-I_RfziK7SGa-5" value="" style="whiteSpace=wrap;html=1;align=left;fillColor=#eeeeee;rounded=0;strokeColor=#36393d;" vertex="1" parent="node_root_hn6">
7
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-5" value="" style="whiteSpace=wrap;html=1;align=left;fillColor=#eeeeee;rounded=0;strokeColor=#36393d;" parent="node_root_hn6" vertex="1">
8
8
  <mxGeometry x="396" y="354" width="450" height="205" as="geometry"/>
9
9
  </mxCell>
10
- <mxCell id="xLSgLBnB-I_RfziK7SGa-3" value="" style="whiteSpace=wrap;html=1;align=left;fillColor=#eeeeee;rounded=0;strokeColor=#36393d;" vertex="1" parent="node_root_hn6">
10
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-3" value="" style="whiteSpace=wrap;html=1;align=left;fillColor=#eeeeee;rounded=0;strokeColor=#36393d;" parent="node_root_hn6" vertex="1">
11
11
  <mxGeometry x="396" y="137" width="450" height="205" as="geometry"/>
12
12
  </mxCell>
13
- <mxCell id="xLSgLBnB-I_RfziK7SGa-1" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=1.008;exitY=0.43;exitDx=0;exitDy=0;entryX=-0.004;entryY=0.53;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitPerimeter=0;" edge="1" parent="node_root_hn6" source="hn6-2" target="hn6-4">
13
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-1" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=1.008;exitY=0.43;exitDx=0;exitDy=0;entryX=-0.004;entryY=0.53;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitPerimeter=0;" parent="node_root_hn6" source="hn6-2" target="hn6-4" edge="1">
14
14
  <mxGeometry relative="1" as="geometry"/>
15
15
  </mxCell>
16
- <mxCell id="xLSgLBnB-I_RfziK7SGa-2" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=1;exitY=0.596;exitDx=0;exitDy=0;entryX=0.011;entryY=0.663;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitPerimeter=0;" edge="1" parent="node_root_hn6" source="hn6-2" target="hn6-5">
16
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-2" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=1;exitY=0.596;exitDx=0;exitDy=0;entryX=0.011;entryY=0.663;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitPerimeter=0;" parent="node_root_hn6" source="hn6-2" target="hn6-5" edge="1">
17
17
  <mxGeometry relative="1" as="geometry"/>
18
18
  </mxCell>
19
- <mxCell id="xLSgLBnB-I_RfziK7SGa-7" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=1;exitY=0.913;exitDx=0;exitDy=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitPerimeter=0;" edge="1" parent="node_root_hn6" source="hn6-2" target="hn6-7">
19
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-7" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=1;exitY=0.913;exitDx=0;exitDy=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitPerimeter=0;" parent="node_root_hn6" source="hn6-2" target="hn6-7" edge="1">
20
20
  <mxGeometry relative="1" as="geometry"/>
21
21
  </mxCell>
22
22
  <mxCell id="hn6-2" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Reports#sales_by_profit&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h3 style=&quot;margin:0px;margin-left:4px;margin-bottom:6.912px&quot;&gt;Fat Controller&lt;/h3&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Param marshalling&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:date_from]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:date_to]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:sort] || &quot;gross_sales&quot;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:direction] || &quot;desc&quot;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:filter_str]&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Dynamic query construction&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;switch params[:filter_str]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;invoice_date_query&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;ugly query&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Query in controller&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;ActiveRecord::Base.connection.execute(query)&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Build outputs&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@net_sales_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@vat_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@gross_sales_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@document_data&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Composite outputs&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:sort]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:direction]&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" parent="node_root_hn6" vertex="1">
@@ -37,13 +37,13 @@
37
37
  <mxCell id="hn6-7" value="&lt;b&gt;Composite outputs&lt;/b&gt;&lt;br&gt;sort, direction, page_no, page_size&lt;br&gt;&lt;i&gt;single order, page or list object&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_hn6" vertex="1">
38
38
  <mxGeometry x="635" y="429" width="200" height="120" as="geometry"/>
39
39
  </mxCell>
40
- <mxCell id="xLSgLBnB-I_RfziK7SGa-0" style="edgeStyle=none;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;fillColor=#f8cecc;strokeColor=#b85450;entryX=0.021;entryY=0.455;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="node_root_hn6" source="hn6-2" target="hn6-3">
40
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-0" style="edgeStyle=none;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;fillColor=#f8cecc;strokeColor=#b85450;entryX=0.021;entryY=0.455;entryDx=0;entryDy=0;entryPerimeter=0;" parent="node_root_hn6" source="hn6-2" target="hn6-3" edge="1">
41
41
  <mxGeometry relative="1" as="geometry">
42
42
  <mxPoint x="321" y="216" as="sourcePoint"/>
43
43
  <mxPoint x="448" y="161.7312775330396" as="targetPoint"/>
44
44
  </mxGeometry>
45
45
  </mxCell>
46
- <mxCell id="xLSgLBnB-I_RfziK7SGa-6" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=0.997;exitY=0.796;exitDx=0;exitDy=0;entryX=-0.004;entryY=0.53;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitPerimeter=0;" edge="1" parent="node_root_hn6" source="hn6-2">
46
+ <mxCell id="xLSgLBnB-I_RfziK7SGa-6" style="edgeStyle=none;shape=connector;rounded=1;html=1;exitX=0.997;exitY=0.796;exitDx=0;exitDy=0;entryX=-0.004;entryY=0.53;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#b85450;fillColor=#f8cecc;exitPerimeter=0;" parent="node_root_hn6" source="hn6-2" edge="1">
47
47
  <mxGeometry relative="1" as="geometry">
48
48
  <mxPoint x="289.99999999999994" y="418.01" as="sourcePoint"/>
49
49
  <mxPoint x="409.16" y="417" as="targetPoint"/>
@@ -53,7 +53,7 @@
53
53
  </mxGraphModel>
54
54
  </diagram>
55
55
  <diagram id="mBj" name="Thin Controllers">
56
- <mxGraphModel dx="932" dy="583" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
56
+ <mxGraphModel dx="1209" dy="490" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
57
57
  <root>
58
58
  <mxCell id="page_root_mBj"/>
59
59
  <mxCell id="node_root_mBj" parent="page_root_mBj"/>
@@ -1,48 +1,48 @@
1
- <mxfile host="0Xh">
2
- <diagram id="EQQ" name="Fat Controllers">
3
- <mxGraphModel dx="0" dy="0" background="#fafafa" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
4
- <root>
5
- <mxCell id="page_root_EQQ" parent="EQQ"/>
6
- <mxCell id="node_root_EQQ" parent="page_root_EQQ"/>
7
- <mxCell id="EQQ-2" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Reports#sales_by_profit&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h3 style=&quot;margin:0px;margin-left:4px;margin-bottom:6.912px&quot;&gt;Thin Controller&lt;/h3&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Param marshalling&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;my_action_params()&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Call query&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;MyActionQuery.query(scope, **inputs)&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Present&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@vm = MyActionPresenter.new(**outputs)&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" vertex="1" parent="node_root_EQQ">
8
- <mxGeometry x="30" y="30" width="160" height="160" as="geometry"/>
9
- </mxCell>
10
- <mxCell id="EQQ-3" value="&lt;b&gt;Param marshaling&lt;/b&gt;&lt;br&gt;&lt;br&gt;@sales_by_profit_params ||= &lt;br&gt;params.permit(...)&lt;br&gt;&amp;nbsp;&amp;nbsp;.symbolize_keys" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_EQQ">
11
- <mxGeometry x="230" y="50" width="200" height="120" as="geometry"/>
12
- </mxCell>
13
- <mxCell id="EQQ-4" value="&lt;b&gt;Call Query&lt;/b&gt;&lt;br&gt;&lt;br&gt;SalesByProfitQuery&lt;br&gt;&amp;nbsp;&amp;nbsp;.query(scope, **custom, **params)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_EQQ">
14
- <mxGeometry x="450" y="50" width="200" height="120" as="geometry"/>
15
- </mxCell>
16
- <mxCell id="EQQ-5" value="&lt;b&gt;Present&lt;/b&gt;&lt;br&gt;&lt;br&gt;SalesByProfitPresenter&lt;br&gt;&amp;nbsp;&amp;nbsp;.new(**query.outputs)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_EQQ">
17
- <mxGeometry x="670" y="50" width="200" height="120" as="geometry"/>
18
- </mxCell>
19
- </root>
20
- </mxGraphModel>
21
- </diagram>
22
- <diagram id="99x" name="Fat Controllers">
23
- <mxGraphModel dx="0" dy="0" background="#fafafa" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
24
- <root>
25
- <mxCell id="page_root_99x" parent="99x"/>
26
- <mxCell id="node_root_99x" parent="page_root_99x"/>
27
- <mxCell id="99x-2" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Reports#sales_by_profit&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h3 style=&quot;margin:0px;margin-left:4px;margin-bottom:6.912px&quot;&gt;Fat Controller&lt;/h3&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Param marshalling&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:date_from]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:date_to]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:sort] || &quot;gross_sales&quot;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:direction] || &quot;desc&quot;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:filter_str]&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Dynamic query construction&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;switch params[:filter_str]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;invoice_date_query&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;ugly query&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Query in controller&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;ActiveRecord::Base.connection.execute(query)&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Build outputs&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@net_sales_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@vat_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@gross_sales_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@document_data&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Composite outputs&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:sort]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:direction]&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" vertex="1" parent="node_root_99x">
28
- <mxGeometry x="30" y="30" width="160" height="160" as="geometry"/>
29
- </mxCell>
30
- <mxCell id="99x-3" value="&lt;b&gt;Paramater marshalling&lt;/b&gt;&lt;br&gt;&lt;br&gt;reading the params[] object&lt;br&gt;setting sane defaults&lt;br&gt;&lt;i&gt;do not alter and reuse params[]&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_99x">
31
- <mxGeometry x="230" y="50" width="200" height="120" as="geometry"/>
32
- </mxCell>
33
- <mxCell id="99x-4" value="&lt;b&gt;Dynamic query construction&lt;/b&gt;&lt;br&gt;&lt;br&gt;query = &quot;select ...&quot;&lt;br&gt;&lt;i&gt;ActiveRelation vs interpolation&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_99x">
34
- <mxGeometry x="450" y="50" width="200" height="120" as="geometry"/>
35
- </mxCell>
36
- <mxCell id="99x-5" value="&lt;b&gt;Query in controller&lt;/b&gt;&lt;br&gt;&lt;i&gt;Move out to Query object&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_99x">
37
- <mxGeometry x="670" y="50" width="200" height="120" as="geometry"/>
38
- </mxCell>
39
- <mxCell id="99x-6" value="&lt;b&gt;Build outputs&lt;/b&gt;&lt;br&gt;Multiple @instance vars&lt;br&gt;&lt;i&gt;single view model @vm&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_99x">
40
- <mxGeometry x="10" y="270" width="200" height="120" as="geometry"/>
41
- </mxCell>
42
- <mxCell id="99x-7" value="&lt;b&gt;Composite outputs&lt;/b&gt;&lt;br&gt;sort, direction, page_no, page_size&lt;br&gt;&lt;i&gt;single order, page or list object&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_99x">
43
- <mxGeometry x="230" y="270" width="200" height="120" as="geometry"/>
44
- </mxCell>
45
- </root>
46
- </mxGraphModel>
47
- </diagram>
1
+ <mxfile host="65bd71144e">
2
+ <diagram id="EQQ" name="Fat Controllers">
3
+ <mxGraphModel dx="1301" dy="572" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
4
+ <root>
5
+ <mxCell id="page_root_EQQ"/>
6
+ <mxCell id="node_root_EQQ" parent="page_root_EQQ"/>
7
+ <mxCell id="EQQ-2" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Reports#sales_by_profit&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h3 style=&quot;margin:0px;margin-left:4px;margin-bottom:6.912px&quot;&gt;Thin Controller&lt;/h3&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Param marshalling&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;my_action_params()&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Call query&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;MyActionQuery.query(scope, **inputs)&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Present&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@vm = MyActionPresenter.new(**outputs)&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" parent="node_root_EQQ" vertex="1">
8
+ <mxGeometry x="30" y="30" width="160" height="160" as="geometry"/>
9
+ </mxCell>
10
+ <mxCell id="EQQ-3" value="&lt;b&gt;Param marshaling&lt;/b&gt;&lt;br&gt;&lt;br&gt;@sales_by_profit_params ||= &lt;br&gt;params.permit(...)&lt;br&gt;&amp;nbsp;&amp;nbsp;.symbolize_keys" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_EQQ" vertex="1">
11
+ <mxGeometry x="230" y="50" width="200" height="120" as="geometry"/>
12
+ </mxCell>
13
+ <mxCell id="EQQ-4" value="&lt;b&gt;Call Query&lt;/b&gt;&lt;br&gt;&lt;br&gt;SalesByProfitQuery&lt;br&gt;&amp;nbsp;&amp;nbsp;.query(scope, **custom, **params)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_EQQ" vertex="1">
14
+ <mxGeometry x="450" y="50" width="200" height="120" as="geometry"/>
15
+ </mxCell>
16
+ <mxCell id="EQQ-5" value="&lt;b&gt;Present&lt;/b&gt;&lt;br&gt;&lt;br&gt;SalesByProfitPresenter&lt;br&gt;&amp;nbsp;&amp;nbsp;.new(**query.outputs)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_EQQ" vertex="1">
17
+ <mxGeometry x="670" y="50" width="200" height="120" as="geometry"/>
18
+ </mxCell>
19
+ </root>
20
+ </mxGraphModel>
21
+ </diagram>
22
+ <diagram id="99x" name="Thin Controllers">
23
+ <mxGraphModel dx="1301" dy="572" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
24
+ <root>
25
+ <mxCell id="page_root_99x"/>
26
+ <mxCell id="node_root_99x" parent="page_root_99x"/>
27
+ <mxCell id="99x-2" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Reports#sales_by_profit&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h3 style=&quot;margin:0px;margin-left:4px;margin-bottom:6.912px&quot;&gt;Fat Controller&lt;/h3&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Param marshalling&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:date_from]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:date_to]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:sort] || &quot;gross_sales&quot;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:direction] || &quot;desc&quot;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:filter_str]&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Dynamic query construction&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;switch params[:filter_str]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;invoice_date_query&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;ugly query&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Query in controller&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;ActiveRecord::Base.connection.execute(query)&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Build outputs&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@net_sales_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@vat_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@gross_sales_total&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;@document_data&lt;/p&gt;&lt;h5 style=&quot;margin:0px;margin-left:4px;margin-bottom:4.8px&quot;&gt;Composite outputs&lt;/h5&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:sort]&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;params[:direction]&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" parent="node_root_99x" vertex="1">
28
+ <mxGeometry x="30" y="30" width="160" height="160" as="geometry"/>
29
+ </mxCell>
30
+ <mxCell id="99x-3" value="&lt;b&gt;Paramater marshalling&lt;/b&gt;&lt;br&gt;&lt;br&gt;reading the params[] object&lt;br&gt;setting sane defaults&lt;br&gt;&lt;i&gt;do not alter and reuse params[]&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_99x" vertex="1">
31
+ <mxGeometry x="230" y="50" width="200" height="120" as="geometry"/>
32
+ </mxCell>
33
+ <mxCell id="99x-4" value="&lt;b&gt;Dynamic query construction&lt;/b&gt;&lt;br&gt;&lt;br&gt;query = &quot;select ...&quot;&lt;br&gt;&lt;i&gt;ActiveRelation vs interpolation&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_99x" vertex="1">
34
+ <mxGeometry x="450" y="50" width="200" height="120" as="geometry"/>
35
+ </mxCell>
36
+ <mxCell id="99x-5" value="&lt;b&gt;Query in controller&lt;/b&gt;&lt;br&gt;&lt;i&gt;Move out to Query object&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_99x" vertex="1">
37
+ <mxGeometry x="670" y="50" width="200" height="120" as="geometry"/>
38
+ </mxCell>
39
+ <mxCell id="99x-6" value="&lt;b&gt;Build outputs&lt;/b&gt;&lt;br&gt;Multiple @instance vars&lt;br&gt;&lt;i&gt;single view model @vm&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_99x" vertex="1">
40
+ <mxGeometry x="10" y="270" width="200" height="120" as="geometry"/>
41
+ </mxCell>
42
+ <mxCell id="99x-7" value="&lt;b&gt;Composite outputs&lt;/b&gt;&lt;br&gt;sort, direction, page_no, page_size&lt;br&gt;&lt;i&gt;single order, page or list object&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" parent="node_root_99x" vertex="1">
43
+ <mxGeometry x="230" y="270" width="200" height="120" as="geometry"/>
44
+ </mxCell>
45
+ </root>
46
+ </mxGraphModel>
47
+ </diagram>
48
48
  </mxfile>
@@ -1,6 +1,6 @@
1
1
  <mxfile host="65bd71144e">
2
2
  <diagram id="tsA" name="Style-Plain">
3
- <mxGraphModel dx="4669" dy="1296" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
3
+ <mxGraphModel dx="1153" dy="583" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
4
4
  <root>
5
5
  <mxCell id="page_root_tsA"/>
6
6
  <mxCell id="node_root_tsA" parent="page_root_tsA"/>
@@ -168,13 +168,13 @@
168
168
  <mxCell id="tsA-57" value="Presentor + spec" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=process" parent="ncJzMHtPDMttCXbYRI98-7" vertex="1">
169
169
  <mxGeometry x="338.5" y="156" width="120" height="70" as="geometry"/>
170
170
  </mxCell>
171
- <mxCell id="12" value="" style="group" vertex="1" connectable="0" parent="node_root_tsA">
171
+ <mxCell id="12" value="" style="group" parent="node_root_tsA" vertex="1" connectable="0">
172
172
  <mxGeometry x="268" y="590" width="1746" height="620" as="geometry"/>
173
173
  </mxCell>
174
174
  <mxCell id="tsA-60" value="Reports" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;fontSize=20;verticalAlign=top" parent="12" vertex="1">
175
175
  <mxGeometry width="1746" height="620" as="geometry"/>
176
176
  </mxCell>
177
- <mxCell id="7" value="" style="group" vertex="1" connectable="0" parent="12">
177
+ <mxCell id="7" value="" style="group" parent="12" vertex="1" connectable="0">
178
178
  <mxGeometry x="830" y="48" width="882.5" height="156" as="geometry"/>
179
179
  </mxCell>
180
180
  <mxCell id="tsA-77" value="rubocop" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" parent="7" vertex="1">
@@ -195,10 +195,10 @@
195
195
  <mxCell id="tsA-98" value="route / controller action &lt;i&gt;mismatch&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" parent="7" vertex="1">
196
196
  <mxGeometry x="615" y="33" width="90" height="90" as="geometry"/>
197
197
  </mxCell>
198
- <mxCell id="6" value="" style="whiteSpace=wrap;html=1;fillColor=#e51400;strokeColor=#B20000;rounded=1;opacity=5;fontColor=#ffffff;" vertex="1" parent="7">
198
+ <mxCell id="6" value="" style="whiteSpace=wrap;html=1;fillColor=#e51400;strokeColor=#B20000;rounded=1;opacity=5;fontColor=#ffffff;" parent="7" vertex="1">
199
199
  <mxGeometry x="137.5" width="745" height="156" as="geometry"/>
200
200
  </mxCell>
201
- <mxCell id="8" value="" style="group" vertex="1" connectable="0" parent="12">
201
+ <mxCell id="8" value="" style="group" parent="12" vertex="1" connectable="0">
202
202
  <mxGeometry x="827" y="428" width="882.5" height="156" as="geometry"/>
203
203
  </mxCell>
204
204
  <mxCell id="tsA-87" value="Target patterns" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=note" parent="8" vertex="1">
@@ -219,10 +219,10 @@
219
219
  <mxCell id="tsA-92" value="form objects" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" parent="8" vertex="1">
220
220
  <mxGeometry x="765" y="33" width="90" height="90" as="geometry"/>
221
221
  </mxCell>
222
- <mxCell id="5" value="" style="whiteSpace=wrap;html=1;fillColor=#e51400;strokeColor=#B20000;rounded=1;opacity=5;fontColor=#ffffff;" vertex="1" parent="8">
222
+ <mxCell id="5" value="" style="whiteSpace=wrap;html=1;fillColor=#e51400;strokeColor=#B20000;rounded=1;opacity=5;fontColor=#ffffff;" parent="8" vertex="1">
223
223
  <mxGeometry x="137.5" width="745" height="156" as="geometry"/>
224
224
  </mxCell>
225
- <mxCell id="9" value="" style="group" vertex="1" connectable="0" parent="12">
225
+ <mxCell id="9" value="" style="group" parent="12" vertex="1" connectable="0">
226
226
  <mxGeometry x="829" y="236" width="883" height="156" as="geometry"/>
227
227
  </mxCell>
228
228
  <mxCell id="tsA-80" value="Anti patterns" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=note" parent="9" vertex="1">
@@ -243,10 +243,10 @@
243
243
  <mxCell id="tsA-85" value="interpolated SQL" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" parent="9" vertex="1">
244
244
  <mxGeometry x="765" y="33" width="90" height="90" as="geometry"/>
245
245
  </mxCell>
246
- <mxCell id="4" value="" style="whiteSpace=wrap;html=1;fillColor=#e51400;strokeColor=#B20000;rounded=1;opacity=5;fontColor=#ffffff;" vertex="1" parent="9">
246
+ <mxCell id="4" value="" style="whiteSpace=wrap;html=1;fillColor=#e51400;strokeColor=#B20000;rounded=1;opacity=5;fontColor=#ffffff;" parent="9" vertex="1">
247
247
  <mxGeometry x="138" width="745" height="156" as="geometry"/>
248
248
  </mxCell>
249
- <mxCell id="10" value="" style="group" vertex="1" connectable="0" parent="12">
249
+ <mxCell id="10" value="" style="group" parent="12" vertex="1" connectable="0">
250
250
  <mxGeometry x="38" y="44" width="734" height="156" as="geometry"/>
251
251
  </mxCell>
252
252
  <mxCell id="tsA-73" value="ERD" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=note" parent="10" vertex="1">
@@ -267,7 +267,7 @@
267
267
  <mxCell id="ncJzMHtPDMttCXbYRI98-26" value="" style="whiteSpace=wrap;html=1;fillColor=#e51400;strokeColor=#B20000;rounded=1;opacity=5;fontColor=#ffffff;" parent="10" vertex="1">
268
268
  <mxGeometry x="140" width="594" height="156" as="geometry"/>
269
269
  </mxCell>
270
- <mxCell id="11" value="" style="group" vertex="1" connectable="0" parent="12">
270
+ <mxCell id="11" value="" style="group" parent="12" vertex="1" connectable="0">
271
271
  <mxGeometry x="38" y="303" width="734" height="262" as="geometry"/>
272
272
  </mxCell>
273
273
  <mxCell id="tsA-62" value="Tests" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=note" parent="11" vertex="1">
@@ -300,6 +300,12 @@
300
300
  <mxCell id="ncJzMHtPDMttCXbYRI98-11" value="" style="whiteSpace=wrap;html=1;fillColor=#e51400;strokeColor=#B20000;rounded=1;opacity=5;fontColor=#ffffff;" parent="11" vertex="1">
301
301
  <mxGeometry x="141" width="593" height="262" as="geometry"/>
302
302
  </mxCell>
303
+ <mxCell id="15" style="edgeStyle=none;shape=connector;rounded=0;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=default;fontFamily=Helvetica;fontSize=11;fontColor=default;endArrow=classic;strokeColor=#6F0000;fillColor=#a20025;" edge="1" parent="node_root_tsA" source="13" target="g">
304
+ <mxGeometry relative="1" as="geometry"/>
305
+ </mxCell>
306
+ <mxCell id="13" value="rake routes:json&lt;br&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;shape=mxgraph.flowchart.database;strokeWidth=1" vertex="1" parent="node_root_tsA">
307
+ <mxGeometry x="26.5" y="283" width="160" height="40" as="geometry"/>
308
+ </mxCell>
303
309
  </root>
304
310
  </mxGraphModel>
305
311
  </diagram>
@@ -0,0 +1,268 @@
1
+ <mxfile host="rC4">
2
+ <diagram id="A5F" name="Style-Plain">
3
+ <mxGraphModel dx="0" dy="0" background="#fafafa" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
4
+ <root>
5
+ <mxCell id="page_root_A5F" parent="A5F"/>
6
+ <mxCell id="node_root_A5F" parent="page_root_A5F"/>
7
+ <mxCell id="A5F-2" value="Data Sources (Documents)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;fontSize=20;verticalAlign=top" vertex="1" parent="node_root_A5F">
8
+ <mxGeometry x="5" y="5" width="210" height="210" as="geometry"/>
9
+ </mxCell>
10
+ <mxCell id="a" value="schema.rb" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;shape=mxgraph.flowchart.database;strokeWidth=1" vertex="1" parent="node_root_A5F">
11
+ <mxGeometry x="30" y="250" width="160" height="40" as="geometry"/>
12
+ </mxCell>
13
+ <mxCell id="b" value="db_schema.json" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;shape=mxgraph.flowchart.database;strokeWidth=1" vertex="1" parent="node_root_A5F">
14
+ <mxGeometry x="250" y="250" width="160" height="40" as="geometry"/>
15
+ </mxCell>
16
+ <mxCell id="c" value="sql_count (rake/api)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;shape=mxgraph.flowchart.database;strokeWidth=1" vertex="1" parent="node_root_A5F">
17
+ <mxGeometry x="30" y="350" width="160" height="40" as="geometry"/>
18
+ </mxCell>
19
+ <mxCell id="d" value="sql_count.json" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;shape=mxgraph.flowchart.database;strokeWidth=1" vertex="1" parent="node_root_A5F">
20
+ <mxGeometry x="250" y="350" width="160" height="40" as="geometry"/>
21
+ </mxCell>
22
+ <mxCell id="e" value="rubocop (rake/.txt)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;shape=mxgraph.flowchart.database;strokeWidth=1" vertex="1" parent="node_root_A5F">
23
+ <mxGeometry x="30" y="450" width="160" height="40" as="geometry"/>
24
+ </mxCell>
25
+ <mxCell id="f" value="rubocop.json" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;shape=mxgraph.flowchart.database;strokeWidth=1" vertex="1" parent="node_root_A5F">
26
+ <mxGeometry x="250" y="450" width="160" height="40" as="geometry"/>
27
+ </mxCell>
28
+ <mxCell id="g" value="rake routes:json" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;shape=mxgraph.flowchart.database;strokeWidth=1" vertex="1" parent="node_root_A5F">
29
+ <mxGeometry x="30" y="550" width="160" height="40" as="geometry"/>
30
+ </mxCell>
31
+ <mxCell id="h" value="routes.json" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;shape=mxgraph.flowchart.database;strokeWidth=1" vertex="1" parent="node_root_A5F">
32
+ <mxGeometry x="250" y="550" width="160" height="40" as="geometry"/>
33
+ </mxCell>
34
+ <mxCell id="i" value="model/**/*.rb" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;shape=mxgraph.flowchart.database;strokeWidth=1" vertex="1" parent="node_root_A5F">
35
+ <mxGeometry x="30" y="650" width="160" height="40" as="geometry"/>
36
+ </mxCell>
37
+ <mxCell id="j" value="controller/**/*.json" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;shape=mxgraph.flowchart.database;strokeWidth=1" vertex="1" parent="node_root_A5F">
38
+ <mxGeometry x="250" y="650" width="160" height="40" as="geometry"/>
39
+ </mxCell>
40
+ <mxCell id="k" value="domain_model.json" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;shape=mxgraph.flowchart.database;strokeWidth=1" vertex="1" parent="node_root_A5F">
41
+ <mxGeometry x="30" y="750" width="160" height="40" as="geometry"/>
42
+ </mxCell>
43
+ <mxCell id="A5F-15" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;edgeStyle=none;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" parent="node_root_A5F" source="a" target="b" edge="1">
44
+ <mxGeometry relative="1" as="geometry"/>
45
+ </mxCell>
46
+ <mxCell id="A5F-16" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;edgeStyle=none;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" parent="node_root_A5F" source="c" target="d" edge="1">
47
+ <mxGeometry relative="1" as="geometry"/>
48
+ </mxCell>
49
+ <mxCell id="A5F-17" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;edgeStyle=none;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" parent="node_root_A5F" source="e" target="f" edge="1">
50
+ <mxGeometry relative="1" as="geometry"/>
51
+ </mxCell>
52
+ <mxCell id="A5F-18" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;edgeStyle=none;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" parent="node_root_A5F" source="g" target="h" edge="1">
53
+ <mxGeometry relative="1" as="geometry"/>
54
+ </mxCell>
55
+ <mxCell id="A5F-19" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;edgeStyle=none;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" parent="node_root_A5F" source="b" target="k" edge="1">
56
+ <mxGeometry relative="1" as="geometry"/>
57
+ </mxCell>
58
+ <mxCell id="A5F-20" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;edgeStyle=none;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" parent="node_root_A5F" source="d" target="k" edge="1">
59
+ <mxGeometry relative="1" as="geometry"/>
60
+ </mxCell>
61
+ <mxCell id="A5F-21" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;edgeStyle=none;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" parent="node_root_A5F" source="f" target="k" edge="1">
62
+ <mxGeometry relative="1" as="geometry"/>
63
+ </mxCell>
64
+ <mxCell id="A5F-22" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;edgeStyle=none;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" parent="node_root_A5F" source="g" target="k" edge="1">
65
+ <mxGeometry relative="1" as="geometry"/>
66
+ </mxCell>
67
+ <mxCell id="A5F-23" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;edgeStyle=none;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" parent="node_root_A5F" source="h" target="k" edge="1">
68
+ <mxGeometry relative="1" as="geometry"/>
69
+ </mxCell>
70
+ <mxCell id="A5F-24" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;edgeStyle=none;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" parent="node_root_A5F" source="i" target="k" edge="1">
71
+ <mxGeometry relative="1" as="geometry"/>
72
+ </mxCell>
73
+ <mxCell id="A5F-25" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;edgeStyle=none;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0" parent="node_root_A5F" source="j" target="k" edge="1">
74
+ <mxGeometry relative="1" as="geometry"/>
75
+ </mxCell>
76
+ <mxCell id="A5F-27" value="Printers - DB Schema" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;fontSize=20;verticalAlign=top" vertex="1" parent="node_root_A5F">
77
+ <mxGeometry x="5" y="1325" width="210" height="210" as="geometry"/>
78
+ </mxCell>
79
+ <mxCell id="A5F-29" value="stats" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_A5F">
80
+ <mxGeometry x="7" y="1550" width="75" height="50" as="geometry"/>
81
+ </mxCell>
82
+ <mxCell id="A5F-30" value="tables" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_A5F">
83
+ <mxGeometry x="97" y="1550" width="75" height="50" as="geometry"/>
84
+ </mxCell>
85
+ <mxCell id="A5F-31" value="foreign_keys" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_A5F">
86
+ <mxGeometry x="187" y="1550" width="75" height="50" as="geometry"/>
87
+ </mxCell>
88
+ <mxCell id="A5F-32" value="indexes" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_A5F">
89
+ <mxGeometry x="277" y="1550" width="75" height="50" as="geometry"/>
90
+ </mxCell>
91
+ <mxCell id="A5F-33" value="dictionary" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_A5F">
92
+ <mxGeometry x="367" y="1550" width="75" height="50" as="geometry"/>
93
+ </mxCell>
94
+ <mxCell id="A5F-35" value="Printers - Other" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;fontSize=20;verticalAlign=top" vertex="1" parent="node_root_A5F">
95
+ <mxGeometry x="5" y="1615" width="210" height="210" as="geometry"/>
96
+ </mxCell>
97
+ <mxCell id="A5F-37" value="routes" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_A5F">
98
+ <mxGeometry x="12" y="1840" width="75" height="50" as="geometry"/>
99
+ </mxCell>
100
+ <mxCell id="A5F-38" value="models" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_A5F">
101
+ <mxGeometry x="112" y="1840" width="75" height="50" as="geometry"/>
102
+ </mxCell>
103
+ <mxCell id="A5F-39" value="controllers" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333;shape=mxgraph.basic.cloud_rect" vertex="1" parent="node_root_A5F">
104
+ <mxGeometry x="212" y="1840" width="75" height="50" as="geometry"/>
105
+ </mxCell>
106
+ <mxCell id="A5F-41" value="has_ruby" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_A5F">
107
+ <mxGeometry x="5" y="1910" width="90" height="50" as="geometry"/>
108
+ </mxCell>
109
+ <mxCell id="A5F-42" value="missing_ruby" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_A5F">
110
+ <mxGeometry x="105" y="1910" width="90" height="50" as="geometry"/>
111
+ </mxCell>
112
+ <mxCell id="A5F-43" value="has_pk" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_A5F">
113
+ <mxGeometry x="205" y="1910" width="90" height="50" as="geometry"/>
114
+ </mxCell>
115
+ <mxCell id="A5F-44" value="missing_pk" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_A5F">
116
+ <mxGeometry x="305" y="1910" width="90" height="50" as="geometry"/>
117
+ </mxCell>
118
+ <mxCell id="A5F-45" value="low_column" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_A5F">
119
+ <mxGeometry x="405" y="1910" width="90" height="50" as="geometry"/>
120
+ </mxCell>
121
+ <mxCell id="A5F-46" value="fat_column" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_A5F">
122
+ <mxGeometry x="5" y="1980" width="90" height="50" as="geometry"/>
123
+ </mxCell>
124
+ <mxCell id="A5F-47" value="suspected_m2m" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_A5F">
125
+ <mxGeometry x="105" y="1980" width="90" height="50" as="geometry"/>
126
+ </mxCell>
127
+ <mxCell id="A5F-48" value="invalid_types" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_A5F">
128
+ <mxGeometry x="205" y="1980" width="90" height="50" as="geometry"/>
129
+ </mxCell>
130
+ <mxCell id="A5F-49" value="data_columns" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_A5F">
131
+ <mxGeometry x="305" y="1980" width="90" height="50" as="geometry"/>
132
+ </mxCell>
133
+ <mxCell id="A5F-50" value="date_columns" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_A5F">
134
+ <mxGeometry x="405" y="1980" width="90" height="50" as="geometry"/>
135
+ </mxCell>
136
+ <mxCell id="A5F-52" value="Generators" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;fontSize=20;verticalAlign=top" vertex="1" parent="node_root_A5F">
137
+ <mxGeometry x="5" y="2045" width="210" height="210" as="geometry"/>
138
+ </mxCell>
139
+ <mxCell id="A5F-54" value="Factory data" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=process" vertex="1" parent="node_root_A5F">
140
+ <mxGeometry x="15" y="2275" width="120" height="70" as="geometry"/>
141
+ </mxCell>
142
+ <mxCell id="A5F-55" value="Model DSL specs (CRUD / Association)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=process" vertex="1" parent="node_root_A5F">
143
+ <mxGeometry x="165" y="2275" width="120" height="70" as="geometry"/>
144
+ </mxCell>
145
+ <mxCell id="A5F-56" value="Model API specs" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=process" vertex="1" parent="node_root_A5F">
146
+ <mxGeometry x="315" y="2275" width="120" height="70" as="geometry"/>
147
+ </mxCell>
148
+ <mxCell id="A5F-57" value="Controller request specs" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=process" vertex="1" parent="node_root_A5F">
149
+ <mxGeometry x="465" y="2275" width="120" height="70" as="geometry"/>
150
+ </mxCell>
151
+ <mxCell id="A5F-58" value="Query + spec" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=process" vertex="1" parent="node_root_A5F">
152
+ <mxGeometry x="15" y="2375" width="120" height="70" as="geometry"/>
153
+ </mxCell>
154
+ <mxCell id="A5F-59" value="Decorator + spec" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=process" vertex="1" parent="node_root_A5F">
155
+ <mxGeometry x="165" y="2375" width="120" height="70" as="geometry"/>
156
+ </mxCell>
157
+ <mxCell id="A5F-60" value="Presentor + spec" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=process" vertex="1" parent="node_root_A5F">
158
+ <mxGeometry x="315" y="2375" width="120" height="70" as="geometry"/>
159
+ </mxCell>
160
+ <mxCell id="A5F-61" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#333333" vertex="1" parent="node_root_A5F">
161
+ <mxGeometry x="500" y="2385" width="50" height="50" as="geometry"/>
162
+ </mxCell>
163
+ <mxCell id="A5F-63" value="Reports" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;fontSize=20;verticalAlign=top" vertex="1" parent="node_root_A5F">
164
+ <mxGeometry x="5" y="2465" width="210" height="210" as="geometry"/>
165
+ </mxCell>
166
+ <mxCell id="A5F-65" value="Tests" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=note" vertex="1" parent="node_root_A5F">
167
+ <mxGeometry x="15" y="2695" width="120" height="120" as="geometry"/>
168
+ </mxCell>
169
+ <mxCell id="A5F-66" value="coverage" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
170
+ <mxGeometry x="180" y="2710" width="90" height="90" as="geometry"/>
171
+ </mxCell>
172
+ <mxCell id="A5F-67" value="model DSL" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
173
+ <mxGeometry x="330" y="2710" width="90" height="90" as="geometry"/>
174
+ </mxCell>
175
+ <mxCell id="A5F-68" value="model API" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
176
+ <mxGeometry x="480" y="2710" width="90" height="90" as="geometry"/>
177
+ </mxCell>
178
+ <mxCell id="A5F-69" value="controller request" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
179
+ <mxGeometry x="630" y="2710" width="90" height="90" as="geometry"/>
180
+ </mxCell>
181
+ <mxCell id="A5F-70" value="controller commands" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
182
+ <mxGeometry x="30" y="2860" width="90" height="90" as="geometry"/>
183
+ </mxCell>
184
+ <mxCell id="A5F-71" value="query" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
185
+ <mxGeometry x="180" y="2860" width="90" height="90" as="geometry"/>
186
+ </mxCell>
187
+ <mxCell id="A5F-72" value="decorator" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
188
+ <mxGeometry x="330" y="2860" width="90" height="90" as="geometry"/>
189
+ </mxCell>
190
+ <mxCell id="A5F-73" value="presentor" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
191
+ <mxGeometry x="480" y="2860" width="90" height="90" as="geometry"/>
192
+ </mxCell>
193
+ <mxCell id="A5F-74" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#333333" vertex="1" parent="node_root_A5F">
194
+ <mxGeometry x="650" y="2880" width="50" height="50" as="geometry"/>
195
+ </mxCell>
196
+ <mxCell id="A5F-76" value="ERD" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=note" vertex="1" parent="node_root_A5F">
197
+ <mxGeometry x="15" y="2995" width="120" height="120" as="geometry"/>
198
+ </mxCell>
199
+ <mxCell id="A5F-77" value="agg roots" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
200
+ <mxGeometry x="180" y="3010" width="90" height="90" as="geometry"/>
201
+ </mxCell>
202
+ <mxCell id="A5F-78" value="many to many" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
203
+ <mxGeometry x="330" y="3010" width="90" height="90" as="geometry"/>
204
+ </mxCell>
205
+ <mxCell id="A5F-79" value="leaf tables" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
206
+ <mxGeometry x="480" y="3010" width="90" height="90" as="geometry"/>
207
+ </mxCell>
208
+ <mxCell id="A5F-80" value="rubocop" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
209
+ <mxGeometry x="630" y="3010" width="90" height="90" as="geometry"/>
210
+ </mxCell>
211
+ <mxCell id="A5F-81" value="SQL counts" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
212
+ <mxGeometry x="780" y="3010" width="90" height="90" as="geometry"/>
213
+ </mxCell>
214
+ <mxCell id="A5F-83" value="Anti patterns" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=note" vertex="1" parent="node_root_A5F">
215
+ <mxGeometry x="15" y="3145" width="120" height="120" as="geometry"/>
216
+ </mxCell>
217
+ <mxCell id="A5F-84" value="god classes" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
218
+ <mxGeometry x="180" y="3160" width="90" height="90" as="geometry"/>
219
+ </mxCell>
220
+ <mxCell id="A5F-85" value="fat controllers" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
221
+ <mxGeometry x="330" y="3160" width="90" height="90" as="geometry"/>
222
+ </mxCell>
223
+ <mxCell id="A5F-86" value="fat models" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
224
+ <mxGeometry x="480" y="3160" width="90" height="90" as="geometry"/>
225
+ </mxCell>
226
+ <mxCell id="A5F-87" value="fat views vs components" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
227
+ <mxGeometry x="630" y="3160" width="90" height="90" as="geometry"/>
228
+ </mxCell>
229
+ <mxCell id="A5F-88" value="interpolated SQL" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
230
+ <mxGeometry x="780" y="3160" width="90" height="90" as="geometry"/>
231
+ </mxCell>
232
+ <mxCell id="A5F-90" value="Target patterns" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=note" vertex="1" parent="node_root_A5F">
233
+ <mxGeometry x="15" y="3295" width="120" height="120" as="geometry"/>
234
+ </mxCell>
235
+ <mxCell id="A5F-91" value="decorators" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
236
+ <mxGeometry x="180" y="3310" width="90" height="90" as="geometry"/>
237
+ </mxCell>
238
+ <mxCell id="A5F-92" value="presenters" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
239
+ <mxGeometry x="330" y="3310" width="90" height="90" as="geometry"/>
240
+ </mxCell>
241
+ <mxCell id="A5F-93" value="queries" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
242
+ <mxGeometry x="480" y="3310" width="90" height="90" as="geometry"/>
243
+ </mxCell>
244
+ <mxCell id="A5F-94" value="commands" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
245
+ <mxGeometry x="630" y="3310" width="90" height="90" as="geometry"/>
246
+ </mxCell>
247
+ <mxCell id="A5F-95" value="form objects" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
248
+ <mxGeometry x="780" y="3310" width="90" height="90" as="geometry"/>
249
+ </mxCell>
250
+ <mxCell id="A5F-97" value="Diff or Conflict" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fff2cc;strokeColor=#d6b656;fontColor=#333333;shape=note" vertex="1" parent="node_root_A5F">
251
+ <mxGeometry x="15" y="3445" width="120" height="120" as="geometry"/>
252
+ </mxCell>
253
+ <mxCell id="A5F-98" value="factory data &lt;i&gt;missing data/models&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
254
+ <mxGeometry x="180" y="3460" width="90" height="90" as="geometry"/>
255
+ </mxCell>
256
+ <mxCell id="A5F-99" value="model DSL specs &lt;i&gt;missing data/associations&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
257
+ <mxGeometry x="330" y="3460" width="90" height="90" as="geometry"/>
258
+ </mxCell>
259
+ <mxCell id="A5F-100" value="model API specs &lt;i&gt;missing methods&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
260
+ <mxGeometry x="480" y="3460" width="90" height="90" as="geometry"/>
261
+ </mxCell>
262
+ <mxCell id="A5F-101" value="route / controller action &lt;i&gt;mismatch&lt;/i&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_A5F">
263
+ <mxGeometry x="630" y="3460" width="90" height="90" as="geometry"/>
264
+ </mxCell>
265
+ </root>
266
+ </mxGraphModel>
267
+ </diagram>
268
+ </mxfile>