snapbot 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
![example](docs/img/models.svg)
|
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
|
+
![annotated diagram](docs/img/models-with-lets.svg)
|
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
|