snapbot 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +7 -0
- data/README.md +26 -1
- data/docs/img/models-with-lets.svg +96 -0
- data/docs/img/models.svg +94 -0
- data/lib/snapbot/diagram/dot_generator.rb +13 -9
- data/lib/snapbot/diagram.rb +1 -0
- data/lib/snapbot/version.rb +1 -1
- data/sig/lib/snapbot/diagram/dot_generator.rbs +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4bd122996f917b0e18388a91aaeba183028d54a6b5e2fc58c05559f3a5103b6a
|
|
4
|
+
data.tar.gz: 15ce511a21b7d1dd96553a45959dce0e9ebfb9ad9ba2624d369af615742ec80b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 34c2e342537c4085fcef8e9ae08e2cde45d8b200e8f7d4e3f369f745ce41ddae3ac5b36a8735c7d568c37427038107e061b9525372f8cc6c9be21ab2d4ad6f20
|
|
7
|
+
data.tar.gz: 4fbe87ef32e963c62eb44fe5f54e26901f7dd33e0c1ca048d962a066a0bb9de2abb5516ccc24b20c84fe8e1f86c435b27c04d2bb85b2ddf30b06efd367d30dba
|
data/.rubocop.yml
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
AllCops:
|
|
2
2
|
TargetRubyVersion: 2.6
|
|
3
3
|
SuggestExtensions: false
|
|
4
|
+
NewCops: enable
|
|
4
5
|
Exclude:
|
|
5
6
|
- Steepfile
|
|
7
|
+
- vendor/bundle/**/*
|
|
6
8
|
|
|
9
|
+
Gemspec/RequireMFA:
|
|
10
|
+
Enabled: false
|
|
7
11
|
|
|
8
12
|
Metrics/AbcSize:
|
|
9
13
|
Exclude:
|
|
@@ -18,6 +22,9 @@ Metrics/MethodLength:
|
|
|
18
22
|
Exclude:
|
|
19
23
|
- spec/support/fixture_database.rb
|
|
20
24
|
|
|
25
|
+
Style/DoubleNegation:
|
|
26
|
+
Enabled: false
|
|
27
|
+
|
|
21
28
|
Style/StderrPuts:
|
|
22
29
|
Exclude:
|
|
23
30
|
- lib/snapbot/diagram/renderer.rb
|
data/README.md
CHANGED
|
@@ -6,10 +6,13 @@ Snapbot generates little diagrams via `save_and_open_diagram` for you to visuali
|
|
|
6
6
|
ActiveRecord objects that you find in feature and integration tests. These are most often made by
|
|
7
7
|
[FactoryBot](https://github.com/thoughtbot/factory_bot) or some other fixture-handling method, but this gem has no
|
|
8
8
|
opinions on those (beyond namechecking).
|
|
9
|
+
|
|
10
|
+

|
|
9
11
|
|
|
10
12
|
## Installation
|
|
11
13
|
|
|
12
|
-
|
|
14
|
+
Snapbot requires [Graphviz](https://graphviz.org/download/#executable-packages), and cannot function without it.
|
|
15
|
+
Install this first, then add the gem to your project's `:test` group in the gemfile:
|
|
13
16
|
|
|
14
17
|
```ruby
|
|
15
18
|
group :test do
|
|
@@ -32,6 +35,28 @@ Use:
|
|
|
32
35
|
save_and_open_diagram
|
|
33
36
|
```
|
|
34
37
|
|
|
38
|
+
## RSpec integration
|
|
39
|
+
|
|
40
|
+
Sometimes it's useful to see the models you created as preconditions vs the ones your code has created in response to
|
|
41
|
+
those. If you use RSpec's [`let` construct](https://relishapp.com/rspec/rspec-core/v/3-11/docs/helper-methods/let-and-let)
|
|
42
|
+
then Snapbot will match these automatically for you and annotate the diagram. For example:
|
|
43
|
+
|
|
44
|
+
```ruby
|
|
45
|
+
include Snapbot::Diagram
|
|
46
|
+
describe "the categorised post creator" do
|
|
47
|
+
let(:blog) { create :blog }
|
|
48
|
+
let(:author) { create :author }
|
|
49
|
+
|
|
50
|
+
it "creates posts automatically, categorised" do
|
|
51
|
+
CategorisedPostCreator.new(blog, author).run
|
|
52
|
+
save_and_open_diagram
|
|
53
|
+
expect(Post.count).to eql(2)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+

|
|
59
|
+
|
|
35
60
|
## Why?
|
|
36
61
|
|
|
37
62
|
Sometimes, you need to create a few ActiveRecord objects for your test suite. Sometimes, there will be a little cluster
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
|
3
|
+
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
4
|
+
<!-- Generated by graphviz version 3.0.0 (20220226.1711)
|
|
5
|
+
-->
|
|
6
|
+
<!-- Title: g Pages: 1 -->
|
|
7
|
+
<svg width="322pt" height="247pt"
|
|
8
|
+
viewBox="0.00 0.00 322.10 246.60" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
9
|
+
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(28.8 217.8)">
|
|
10
|
+
<title>g</title>
|
|
11
|
+
<polygon fill="white" stroke="transparent" points="-28.8,28.8 -28.8,-217.8 293.3,-217.8 293.3,28.8 -28.8,28.8"/>
|
|
12
|
+
<!-- Category#1 -->
|
|
13
|
+
<g id="node1" class="node">
|
|
14
|
+
<title>Category#1</title>
|
|
15
|
+
<path fill="none" stroke="black" d="M12,-149.5C12,-149.5 57,-149.5 57,-149.5 63,-149.5 69,-155.5 69,-161.5 69,-161.5 69,-173.5 69,-173.5 69,-179.5 63,-185.5 57,-185.5 57,-185.5 12,-185.5 12,-185.5 6,-185.5 0,-179.5 0,-173.5 0,-173.5 0,-161.5 0,-161.5 0,-155.5 6,-149.5 12,-149.5"/>
|
|
16
|
+
<text text-anchor="start" x="9.5" y="-164.5" font-family="ArialMT" font-size="10.00">Category#1</text>
|
|
17
|
+
</g>
|
|
18
|
+
<!-- Post#1 -->
|
|
19
|
+
<g id="node4" class="node">
|
|
20
|
+
<title>Post#1</title>
|
|
21
|
+
<path fill="none" stroke="black" d="M77.5,-73.5C77.5,-73.5 107.5,-73.5 107.5,-73.5 113.5,-73.5 119.5,-79.5 119.5,-85.5 119.5,-85.5 119.5,-97.5 119.5,-97.5 119.5,-103.5 113.5,-109.5 107.5,-109.5 107.5,-109.5 77.5,-109.5 77.5,-109.5 71.5,-109.5 65.5,-103.5 65.5,-97.5 65.5,-97.5 65.5,-85.5 65.5,-85.5 65.5,-79.5 71.5,-73.5 77.5,-73.5"/>
|
|
22
|
+
<text text-anchor="start" x="77.5" y="-88.5" font-family="ArialMT" font-size="10.00">Post#1</text>
|
|
23
|
+
</g>
|
|
24
|
+
<!-- Category#1->Post#1 -->
|
|
25
|
+
<g id="edge1" class="edge">
|
|
26
|
+
<title>Category#1->Post#1</title>
|
|
27
|
+
<path fill="none" stroke="black" d="M53.51,-142.25C59.92,-134.07 67.07,-124.94 73.48,-116.76"/>
|
|
28
|
+
<polygon fill="black" stroke="black" points="51.02,-140.31 47.95,-149.34 55.98,-144.2 51.02,-140.31"/>
|
|
29
|
+
<polygon fill="black" stroke="black" points="76.05,-118.6 79.12,-109.57 71.09,-114.71 76.05,-118.6"/>
|
|
30
|
+
</g>
|
|
31
|
+
<!-- Post#2 -->
|
|
32
|
+
<g id="node5" class="node">
|
|
33
|
+
<title>Post#2</title>
|
|
34
|
+
<path fill="none" stroke="black" d="M160.5,-73.5C160.5,-73.5 190.5,-73.5 190.5,-73.5 196.5,-73.5 202.5,-79.5 202.5,-85.5 202.5,-85.5 202.5,-97.5 202.5,-97.5 202.5,-103.5 196.5,-109.5 190.5,-109.5 190.5,-109.5 160.5,-109.5 160.5,-109.5 154.5,-109.5 148.5,-103.5 148.5,-97.5 148.5,-97.5 148.5,-85.5 148.5,-85.5 148.5,-79.5 154.5,-73.5 160.5,-73.5"/>
|
|
35
|
+
<text text-anchor="start" x="160.5" y="-88.5" font-family="ArialMT" font-size="10.00">Post#2</text>
|
|
36
|
+
</g>
|
|
37
|
+
<!-- Category#1->Post#2 -->
|
|
38
|
+
<g id="edge2" class="edge">
|
|
39
|
+
<title>Category#1->Post#2</title>
|
|
40
|
+
<path fill="none" stroke="black" d="M75.24,-145.12C95.75,-134.36 120.36,-121.44 140.07,-111.1"/>
|
|
41
|
+
<polygon fill="black" stroke="black" points="73.71,-142.37 67.2,-149.34 76.64,-147.94 73.71,-142.37"/>
|
|
42
|
+
<polygon fill="black" stroke="black" points="141.68,-113.81 148.19,-106.83 138.76,-108.23 141.68,-113.81"/>
|
|
43
|
+
</g>
|
|
44
|
+
<!-- Category#2 -->
|
|
45
|
+
<g id="node2" class="node">
|
|
46
|
+
<title>Category#2</title>
|
|
47
|
+
<path fill="none" stroke="black" d="M153,-0.5C153,-0.5 198,-0.5 198,-0.5 204,-0.5 210,-6.5 210,-12.5 210,-12.5 210,-24.5 210,-24.5 210,-30.5 204,-36.5 198,-36.5 198,-36.5 153,-36.5 153,-36.5 147,-36.5 141,-30.5 141,-24.5 141,-24.5 141,-12.5 141,-12.5 141,-6.5 147,-0.5 153,-0.5"/>
|
|
48
|
+
<text text-anchor="start" x="150.5" y="-15.5" font-family="ArialMT" font-size="10.00">Category#2</text>
|
|
49
|
+
</g>
|
|
50
|
+
<!-- Author#1 -->
|
|
51
|
+
<g id="node3" class="node">
|
|
52
|
+
<title>Author#1</title>
|
|
53
|
+
<path fill="none" stroke="black" d="M110,-146.5C110,-146.5 159,-146.5 159,-146.5 165,-146.5 171,-152.5 171,-158.5 171,-158.5 171,-176.5 171,-176.5 171,-182.5 165,-188.5 159,-188.5 159,-188.5 110,-188.5 110,-188.5 104,-188.5 98,-182.5 98,-176.5 98,-176.5 98,-158.5 98,-158.5 98,-152.5 104,-146.5 110,-146.5"/>
|
|
54
|
+
<text text-anchor="start" x="107.5" y="-174.1" font-family="Monaco" font-size="8.00">let(:author)</text>
|
|
55
|
+
<text text-anchor="start" x="115" y="-157.5" font-family="ArialMT" font-size="10.00">Author#1</text>
|
|
56
|
+
</g>
|
|
57
|
+
<!-- Author#1->Post#1 -->
|
|
58
|
+
<g id="edge4" class="edge">
|
|
59
|
+
<title>Author#1->Post#1</title>
|
|
60
|
+
<path fill="none" stroke="black" d="M118.56,-138.42C113.08,-128.76 107.1,-118.22 102.25,-109.69"/>
|
|
61
|
+
<polygon fill="black" stroke="black" points="115.84,-140.01 123.02,-146.28 121.32,-136.9 115.84,-140.01"/>
|
|
62
|
+
</g>
|
|
63
|
+
<!-- Author#1->Post#2 -->
|
|
64
|
+
<g id="edge5" class="edge">
|
|
65
|
+
<title>Author#1->Post#2</title>
|
|
66
|
+
<path fill="none" stroke="black" d="M150.22,-138.13C155.53,-128.55 161.3,-118.14 165.98,-109.69"/>
|
|
67
|
+
<polygon fill="black" stroke="black" points="147.31,-136.88 145.7,-146.28 152.82,-139.93 147.31,-136.88"/>
|
|
68
|
+
</g>
|
|
69
|
+
<!-- Post#2->Category#2 -->
|
|
70
|
+
<g id="edge8" class="edge">
|
|
71
|
+
<title>Post#2->Category#2</title>
|
|
72
|
+
<path fill="none" stroke="black" d="M175.5,-64.13C175.5,-58.07 175.5,-51.64 175.5,-45.59"/>
|
|
73
|
+
<polygon fill="black" stroke="black" points="172.35,-64.31 175.5,-73.31 178.65,-64.31 172.35,-64.31"/>
|
|
74
|
+
<polygon fill="black" stroke="black" points="178.65,-45.53 175.5,-36.53 172.35,-45.53 178.65,-45.53"/>
|
|
75
|
+
</g>
|
|
76
|
+
<!-- Blog#1 -->
|
|
77
|
+
<g id="node6" class="node">
|
|
78
|
+
<title>Blog#1</title>
|
|
79
|
+
<path fill="none" stroke="black" d="M212.5,-146.5C212.5,-146.5 252.5,-146.5 252.5,-146.5 258.5,-146.5 264.5,-152.5 264.5,-158.5 264.5,-158.5 264.5,-176.5 264.5,-176.5 264.5,-182.5 258.5,-188.5 252.5,-188.5 252.5,-188.5 212.5,-188.5 212.5,-188.5 206.5,-188.5 200.5,-182.5 200.5,-176.5 200.5,-176.5 200.5,-158.5 200.5,-158.5 200.5,-152.5 206.5,-146.5 212.5,-146.5"/>
|
|
80
|
+
<text text-anchor="start" x="209.5" y="-174.1" font-family="Monaco" font-size="8.00">let(:blog)</text>
|
|
81
|
+
<text text-anchor="start" x="217" y="-157.5" font-family="ArialMT" font-size="10.00">Blog#1</text>
|
|
82
|
+
</g>
|
|
83
|
+
<!-- Blog#1->Post#1 -->
|
|
84
|
+
<g id="edge9" class="edge">
|
|
85
|
+
<title>Blog#1->Post#1</title>
|
|
86
|
+
<path fill="none" stroke="black" d="M192.4,-145.3C169.12,-133 140.41,-117.83 119.75,-106.91"/>
|
|
87
|
+
<polygon fill="black" stroke="black" points="190.95,-148.1 200.38,-149.52 193.9,-142.53 190.95,-148.1"/>
|
|
88
|
+
</g>
|
|
89
|
+
<!-- Blog#1->Post#2 -->
|
|
90
|
+
<g id="edge10" class="edge">
|
|
91
|
+
<title>Blog#1->Post#2</title>
|
|
92
|
+
<path fill="none" stroke="black" d="M211.32,-139C203.75,-129.18 195.45,-118.39 188.74,-109.69"/>
|
|
93
|
+
<polygon fill="black" stroke="black" points="208.94,-141.07 216.92,-146.28 213.93,-137.23 208.94,-141.07"/>
|
|
94
|
+
</g>
|
|
95
|
+
</g>
|
|
96
|
+
</svg>
|
data/docs/img/models.svg
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
|
3
|
+
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
4
|
+
<!-- Generated by graphviz version 3.0.0 (20220226.1711)
|
|
5
|
+
-->
|
|
6
|
+
<!-- Title: g Pages: 1 -->
|
|
7
|
+
<svg width="297pt" height="241pt"
|
|
8
|
+
viewBox="0.00 0.00 297.10 240.60" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
9
|
+
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(28.8 211.8)">
|
|
10
|
+
<title>g</title>
|
|
11
|
+
<polygon fill="white" stroke="transparent" points="-28.8,28.8 -28.8,-211.8 268.3,-211.8 268.3,28.8 -28.8,28.8"/>
|
|
12
|
+
<!-- Category#1 -->
|
|
13
|
+
<g id="node1" class="node">
|
|
14
|
+
<title>Category#1</title>
|
|
15
|
+
<path fill="none" stroke="black" d="M12,-146.5C12,-146.5 57,-146.5 57,-146.5 63,-146.5 69,-152.5 69,-158.5 69,-158.5 69,-170.5 69,-170.5 69,-176.5 63,-182.5 57,-182.5 57,-182.5 12,-182.5 12,-182.5 6,-182.5 0,-176.5 0,-170.5 0,-170.5 0,-158.5 0,-158.5 0,-152.5 6,-146.5 12,-146.5"/>
|
|
16
|
+
<text text-anchor="start" x="9.5" y="-161.5" font-family="ArialMT" font-size="10.00">Category#1</text>
|
|
17
|
+
</g>
|
|
18
|
+
<!-- Post#1 -->
|
|
19
|
+
<g id="node4" class="node">
|
|
20
|
+
<title>Post#1</title>
|
|
21
|
+
<path fill="none" stroke="black" d="M70.5,-73.5C70.5,-73.5 100.5,-73.5 100.5,-73.5 106.5,-73.5 112.5,-79.5 112.5,-85.5 112.5,-85.5 112.5,-97.5 112.5,-97.5 112.5,-103.5 106.5,-109.5 100.5,-109.5 100.5,-109.5 70.5,-109.5 70.5,-109.5 64.5,-109.5 58.5,-103.5 58.5,-97.5 58.5,-97.5 58.5,-85.5 58.5,-85.5 58.5,-79.5 64.5,-73.5 70.5,-73.5"/>
|
|
22
|
+
<text text-anchor="start" x="70.5" y="-88.5" font-family="ArialMT" font-size="10.00">Post#1</text>
|
|
23
|
+
</g>
|
|
24
|
+
<!-- Category#1->Post#1 -->
|
|
25
|
+
<g id="edge1" class="edge">
|
|
26
|
+
<title>Category#1->Post#1</title>
|
|
27
|
+
<path fill="none" stroke="black" d="M52.19,-138.87C57.3,-131.76 62.87,-124 67.97,-116.91"/>
|
|
28
|
+
<polygon fill="black" stroke="black" points="49.54,-137.17 46.85,-146.31 54.65,-140.84 49.54,-137.17"/>
|
|
29
|
+
<polygon fill="black" stroke="black" points="70.58,-118.68 73.27,-109.53 65.46,-115 70.58,-118.68"/>
|
|
30
|
+
</g>
|
|
31
|
+
<!-- Post#2 -->
|
|
32
|
+
<g id="node5" class="node">
|
|
33
|
+
<title>Post#2</title>
|
|
34
|
+
<path fill="none" stroke="black" d="M153.5,-73.5C153.5,-73.5 183.5,-73.5 183.5,-73.5 189.5,-73.5 195.5,-79.5 195.5,-85.5 195.5,-85.5 195.5,-97.5 195.5,-97.5 195.5,-103.5 189.5,-109.5 183.5,-109.5 183.5,-109.5 153.5,-109.5 153.5,-109.5 147.5,-109.5 141.5,-103.5 141.5,-97.5 141.5,-97.5 141.5,-85.5 141.5,-85.5 141.5,-79.5 147.5,-73.5 153.5,-73.5"/>
|
|
35
|
+
<text text-anchor="start" x="153.5" y="-88.5" font-family="ArialMT" font-size="10.00">Post#2</text>
|
|
36
|
+
</g>
|
|
37
|
+
<!-- Category#1->Post#2 -->
|
|
38
|
+
<g id="edge2" class="edge">
|
|
39
|
+
<title>Category#1->Post#2</title>
|
|
40
|
+
<path fill="none" stroke="black" d="M74.6,-142.26C93.24,-132.38 115.22,-120.73 133.22,-111.19"/>
|
|
41
|
+
<polygon fill="black" stroke="black" points="73.07,-139.5 66.6,-146.49 76.02,-145.06 73.07,-139.5"/>
|
|
42
|
+
<polygon fill="black" stroke="black" points="134.71,-113.97 141.19,-106.97 131.76,-108.4 134.71,-113.97"/>
|
|
43
|
+
</g>
|
|
44
|
+
<!-- Category#2 -->
|
|
45
|
+
<g id="node2" class="node">
|
|
46
|
+
<title>Category#2</title>
|
|
47
|
+
<path fill="none" stroke="black" d="M146,-0.5C146,-0.5 191,-0.5 191,-0.5 197,-0.5 203,-6.5 203,-12.5 203,-12.5 203,-24.5 203,-24.5 203,-30.5 197,-36.5 191,-36.5 191,-36.5 146,-36.5 146,-36.5 140,-36.5 134,-30.5 134,-24.5 134,-24.5 134,-12.5 134,-12.5 134,-6.5 140,-0.5 146,-0.5"/>
|
|
48
|
+
<text text-anchor="start" x="143.5" y="-15.5" font-family="ArialMT" font-size="10.00">Category#2</text>
|
|
49
|
+
</g>
|
|
50
|
+
<!-- Author#1 -->
|
|
51
|
+
<g id="node3" class="node">
|
|
52
|
+
<title>Author#1</title>
|
|
53
|
+
<path fill="none" stroke="black" d="M110.5,-146.5C110.5,-146.5 144.5,-146.5 144.5,-146.5 150.5,-146.5 156.5,-152.5 156.5,-158.5 156.5,-158.5 156.5,-170.5 156.5,-170.5 156.5,-176.5 150.5,-182.5 144.5,-182.5 144.5,-182.5 110.5,-182.5 110.5,-182.5 104.5,-182.5 98.5,-176.5 98.5,-170.5 98.5,-170.5 98.5,-158.5 98.5,-158.5 98.5,-152.5 104.5,-146.5 110.5,-146.5"/>
|
|
54
|
+
<text text-anchor="start" x="107.5" y="-161.5" font-family="ArialMT" font-size="10.00">Author#1</text>
|
|
55
|
+
</g>
|
|
56
|
+
<!-- Author#1->Post#1 -->
|
|
57
|
+
<g id="edge4" class="edge">
|
|
58
|
+
<title>Author#1->Post#1</title>
|
|
59
|
+
<path fill="none" stroke="black" d="M112.59,-138.29C106.95,-128.76 100.67,-118.14 95.57,-109.53"/>
|
|
60
|
+
<polygon fill="black" stroke="black" points="110.04,-140.17 117.33,-146.31 115.46,-136.96 110.04,-140.17"/>
|
|
61
|
+
</g>
|
|
62
|
+
<!-- Author#1->Post#2 -->
|
|
63
|
+
<g id="edge5" class="edge">
|
|
64
|
+
<title>Author#1->Post#2</title>
|
|
65
|
+
<path fill="none" stroke="black" d="M142.06,-138.29C147.56,-128.76 153.69,-118.14 158.67,-109.53"/>
|
|
66
|
+
<polygon fill="black" stroke="black" points="139.2,-136.94 137.42,-146.31 144.65,-140.09 139.2,-136.94"/>
|
|
67
|
+
</g>
|
|
68
|
+
<!-- Post#2->Category#2 -->
|
|
69
|
+
<g id="edge8" class="edge">
|
|
70
|
+
<title>Post#2->Category#2</title>
|
|
71
|
+
<path fill="none" stroke="black" d="M168.5,-64.13C168.5,-58.07 168.5,-51.64 168.5,-45.59"/>
|
|
72
|
+
<polygon fill="black" stroke="black" points="165.35,-64.31 168.5,-73.31 171.65,-64.31 165.35,-64.31"/>
|
|
73
|
+
<polygon fill="black" stroke="black" points="171.65,-45.53 168.5,-36.53 165.35,-45.53 171.65,-45.53"/>
|
|
74
|
+
</g>
|
|
75
|
+
<!-- Blog#1 -->
|
|
76
|
+
<g id="node6" class="node">
|
|
77
|
+
<title>Blog#1</title>
|
|
78
|
+
<path fill="none" stroke="black" d="M197.5,-146.5C197.5,-146.5 227.5,-146.5 227.5,-146.5 233.5,-146.5 239.5,-152.5 239.5,-158.5 239.5,-158.5 239.5,-170.5 239.5,-170.5 239.5,-176.5 233.5,-182.5 227.5,-182.5 227.5,-182.5 197.5,-182.5 197.5,-182.5 191.5,-182.5 185.5,-176.5 185.5,-170.5 185.5,-170.5 185.5,-158.5 185.5,-158.5 185.5,-152.5 191.5,-146.5 197.5,-146.5"/>
|
|
79
|
+
<text text-anchor="start" x="197.5" y="-161.5" font-family="ArialMT" font-size="10.00">Blog#1</text>
|
|
80
|
+
</g>
|
|
81
|
+
<!-- Blog#1->Post#1 -->
|
|
82
|
+
<g id="edge9" class="edge">
|
|
83
|
+
<title>Blog#1->Post#1</title>
|
|
84
|
+
<path fill="none" stroke="black" d="M177.14,-143.73C156.75,-132.33 131.52,-118.23 112.7,-107.71"/>
|
|
85
|
+
<polygon fill="black" stroke="black" points="175.86,-146.63 185.26,-148.27 178.94,-141.13 175.86,-146.63"/>
|
|
86
|
+
</g>
|
|
87
|
+
<!-- Blog#1->Post#2 -->
|
|
88
|
+
<g id="edge10" class="edge">
|
|
89
|
+
<title>Blog#1->Post#2</title>
|
|
90
|
+
<path fill="none" stroke="black" d="M197.06,-138.58C191.1,-128.97 184.44,-118.23 179.05,-109.53"/>
|
|
91
|
+
<polygon fill="black" stroke="black" points="194.43,-140.32 201.85,-146.31 199.79,-137 194.43,-140.32"/>
|
|
92
|
+
</g>
|
|
93
|
+
</g>
|
|
94
|
+
</svg>
|
|
@@ -12,15 +12,17 @@ module Snapbot
|
|
|
12
12
|
# Get a visual handle on what small constellations of objects we're creating
|
|
13
13
|
# in specs
|
|
14
14
|
class DotGenerator
|
|
15
|
-
def initialize(label: "g", attrs: false, ignore_lets: %i[])
|
|
15
|
+
def initialize(label: "g", attrs: false, ignore_lets: %i[], rspec: false)
|
|
16
16
|
@label = label
|
|
17
17
|
@options = { attrs: attrs }
|
|
18
18
|
@ignore_lets = ignore_lets
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
@lets_by_value = if rspec
|
|
21
|
+
example = binding.of_caller(1).eval("self")
|
|
22
|
+
collect_lets(example)
|
|
23
|
+
else
|
|
24
|
+
{}
|
|
25
|
+
end
|
|
24
26
|
end
|
|
25
27
|
|
|
26
28
|
def dot
|
|
@@ -37,7 +39,7 @@ module Snapbot
|
|
|
37
39
|
end
|
|
38
40
|
|
|
39
41
|
def collect_lets(example)
|
|
40
|
-
|
|
42
|
+
RSpec::Lets.new(example).collect.each_with_object({}) do |sym, lets_by_value|
|
|
41
43
|
value = example.send(sym) unless @ignore_lets.include?(sym)
|
|
42
44
|
lets_by_value[value] = sym if value.is_a?(reflector.base_activerecord_class)
|
|
43
45
|
end
|
|
@@ -69,7 +71,7 @@ module Snapbot
|
|
|
69
71
|
label=<
|
|
70
72
|
<table border="0" cellborder="0">
|
|
71
73
|
<%- if @lets_by_value[instance] -%>
|
|
72
|
-
<tr><td
|
|
74
|
+
<tr><td><font face="Monaco,Courier,monospace" point-size="8">let(:<%= @lets_by_value[instance] %>)</font></td></tr>
|
|
73
75
|
<%- end -%>
|
|
74
76
|
<tr><td><%= instance_name(instance) %></td></tr>
|
|
75
77
|
</table>
|
|
@@ -78,9 +80,11 @@ module Snapbot
|
|
|
78
80
|
<table border="0" cellborder="0">
|
|
79
81
|
<%- attributes(instance).each_pair do |attr, value| -%>
|
|
80
82
|
<tr>
|
|
81
|
-
<td align="left"
|
|
83
|
+
<td align="left" port="<%= attr %>">
|
|
82
84
|
<%= attr %>
|
|
83
|
-
|
|
85
|
+
</td>
|
|
86
|
+
<td align="left">
|
|
87
|
+
<font color="grey50"><%= value.inspect %></font>
|
|
84
88
|
</td>
|
|
85
89
|
</tr>
|
|
86
90
|
<%- end -%>
|
data/lib/snapbot/diagram.rb
CHANGED
data/lib/snapbot/version.rb
CHANGED
|
@@ -3,7 +3,7 @@ module Snapbot
|
|
|
3
3
|
# Get a visual handle on what small constellations of objects we're creating
|
|
4
4
|
# in specs
|
|
5
5
|
class DotGenerator
|
|
6
|
-
def initialize: (?label: ::String, ?attrs: bool, ?ignore_lets: Array[Symbol]) -> void
|
|
6
|
+
def initialize: (?label: ::String, ?attrs: bool, ?ignore_lets: Array[Symbol], ?rspec: bool) -> void
|
|
7
7
|
def dot: () -> ::String
|
|
8
8
|
|
|
9
9
|
@label: String
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: snapbot
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Russell Garner
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-08-
|
|
11
|
+
date: 2022-08-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: binding_of_caller
|
|
@@ -124,6 +124,8 @@ files:
|
|
|
124
124
|
- README.md
|
|
125
125
|
- Rakefile
|
|
126
126
|
- Steepfile
|
|
127
|
+
- docs/img/models-with-lets.svg
|
|
128
|
+
- docs/img/models.svg
|
|
127
129
|
- lib/snapbot.rb
|
|
128
130
|
- lib/snapbot/diagram.rb
|
|
129
131
|
- lib/snapbot/diagram/dot_generator.rb
|