visualize_packs 0.5.16 → 0.5.18
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/visualize_packs +13 -10
- data/lib/graph.dot.erb +23 -10
- data/lib/visualize_packs/options.rb +16 -10
- data/lib/visualize_packs.rb +9 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c493faea12dcf090c4823910d9ecdcfc7da5eca6e370732caa2e063a832a704
|
4
|
+
data.tar.gz: 80b1906deaf843d82c4b317f15234e0ec023fe5fc66efcb865bf94f519101c92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dab454f3ae4f6dac67e0027417bd996640fc85ab6ac397690051fd77c8a66aeb86175b86c4df39f18027a55d516f1f0b12f587fe090f2788991e6d927511dce0
|
7
|
+
data.tar.gz: 9d1fbc976c03a3540dd6f385193d7cd95e0b97a3f1c2fa6261000204a78924f280718b63568d8f510afd76f33d96db29a63984faeb6255e3ad971905948b6f70
|
data/bin/visualize_packs
CHANGED
@@ -12,24 +12,27 @@ options = Options.new
|
|
12
12
|
OptionParser.new do |opt|
|
13
13
|
opt.on('--no-legend', "Don't show legend") { |o| options.show_legend = false }
|
14
14
|
|
15
|
+
opt.on('--no-dependency-arrows', "Don't show accepted dependency arrows") { |o| options.show_dependencies = false }
|
16
|
+
opt.on('--no-privacy-boxes', "Don't show privacy enforcement box on a pack") { |o| options.show_privacy = false }
|
15
17
|
opt.on('--no-layers', "Don't show architectural layers") { |o| options.show_layers = false }
|
18
|
+
opt.on('--no-visibility-arrows', "Don't show visibility arrows") { |o| options.show_visibility = false }
|
19
|
+
|
20
|
+
opt.on('--no-todo-arrows', "Don't show pack todos") { |o| options.show_todos = false }
|
21
|
+
opt.on("--only-todo-types=STRING", "Show only the selected types of todos. Comma-separated list of #{EdgeTodoTypes.values.map &:serialize}") { |o| options.only_todo_types = o.to_s.split(",").uniq.map { EdgeTodoTypes.deserialize(_1) } }
|
22
|
+
opt.on("--use-todos-for-layout", "Show only the selected types of todos. Comma-separated list of #{EdgeTodoTypes.values.map &:serialize}") { |o| options.use_todos_for_layout = true }
|
16
23
|
|
17
24
|
opt.on('--no-teams', "Don't show team colors") { |o| options.show_teams = false }
|
18
|
-
|
19
|
-
opt.on('--no-dependency-arrows', "Don't show accepted dependencies") { |o| options.show_dependencies = false }
|
20
25
|
|
21
|
-
opt.on('--
|
22
|
-
opt.on(
|
23
|
-
opt.on('--
|
26
|
+
opt.on('--focus-pack=STRING', "Focus on a specific pack(s). Comma-separated list of packs. Wildcards supported: 'packs/*'") { |o| options.focus_pack = o.to_s.split(",") }
|
27
|
+
opt.on('--focus-pack-edge-mode=STRING', "If focus-pack is set, this shows only between focussed packs (when set to none) or the edges into / out of / in and out of the focus packs to non-focus packs (which will be re-added to the graph). One of #{FocusPackEdgeDirection.values.map &:serialize}") { |o| options.show_only_edges_to_focus_pack = FocusPackEdgeDirection.deserialize(o) }
|
28
|
+
opt.on('--exclude-packs=', "Exclude listed packs from diagram. If used with include you will get all included that are not excluded. Wildcards support: 'packs/ignores/*'") { |o| options.exclude_packs = o.to_s.split(",") }
|
24
29
|
|
25
|
-
opt.on('--no-nesting-arrows', "Don't draw relationships between parents and nested packs") { |o| options.show_nested_relationships = false }
|
26
30
|
opt.on('--roll-nested-into-parent-packs', "Don't show nested packs (not counting root). Connect edges to top-level pack instead") { |o| options.roll_nested_into_parent_packs = true }
|
31
|
+
opt.on('--no-nesting-arrows', "Don't draw relationships between parents and nested packs") { |o| options.show_nested_relationships = false }
|
27
32
|
|
28
|
-
opt.on('--
|
29
|
-
opt.on('--focus-pack-edge-mode=', "If focus-pack is set, this shows only between focussed packs (when set to none) or the edges into / out of / in and out of the focus packs to non-focus packs (which will be re-added to the graph). One of #{FocusPackEdgeDirection.values.map &:serialize}") { |o| options.show_only_edges_to_focus_pack = FocusPackEdgeDirection.deserialize(o) }
|
30
|
-
opt.on('--exclude-packs=', "Exclude listed packs from diagram. If used with include you will get all included that are not excluded. Wildcards support: 'packs/ignores/*'") { |o| options.exclude_packs = o.to_s.split(",") }
|
33
|
+
opt.on('--remote-base-url=STRING', "Link pack packs to a URL (affects graphviz SVG generation)") { |o| options.remote_base_url = o }
|
31
34
|
|
32
|
-
opt.on('--
|
35
|
+
opt.on('--title=STRING', "Set a custom diagram title") { |o| options.title = o }
|
33
36
|
|
34
37
|
opt.on_tail("-h", "--help", "Show this message") do
|
35
38
|
puts opt
|
data/lib/graph.dot.erb
CHANGED
@@ -33,7 +33,7 @@ digraph package_diagram {
|
|
33
33
|
<%- end -%>
|
34
34
|
<%- grouped_packages[layer_name].each do |package| -%>
|
35
35
|
"<%= package.name -%>" [
|
36
|
-
fontsize=<%= options.focus_pack
|
36
|
+
fontsize=<%= options.focus_pack && options.focus_pack.any? {|p| File.fnmatch(p, package.name)} ? 18.0 : 12.0 -%>
|
37
37
|
<%- if options.remote_base_url %>
|
38
38
|
URL="<%= options.remote_base_url %>/<%= package.name == '.' ? '' : package.name -%>"
|
39
39
|
<%- end %>
|
@@ -88,7 +88,7 @@ digraph package_diagram {
|
|
88
88
|
<%- todo_types.keys.each do |todo_type| -%>
|
89
89
|
<%- if show_edge.call(package.name, todos_to_package) -%>
|
90
90
|
"<%= package.name -%>" -> "<%= todos_to_package -%>"<%= todo_type == 'privacy' ? ':private' : '' -%> [ color=darkred style=dashed
|
91
|
-
<%- if options.
|
91
|
+
<%- if !options.use_todos_for_layout -%>
|
92
92
|
constraint=false
|
93
93
|
<%- end -%>
|
94
94
|
# headlabel="<%= todo_type -%>"
|
@@ -109,20 +109,32 @@ digraph package_diagram {
|
|
109
109
|
<%- end -%>
|
110
110
|
<%- end -%>
|
111
111
|
<%- if options.show_nested_relationships -%>
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
112
|
+
<%- all_packages.each do |package| -%>
|
113
|
+
<%- all_packages.each do |nested_package| -%>
|
114
|
+
<%- if nested_package.name.include?("#{package.name}/") && !(nested_package.name == package.name) -%>
|
115
|
+
"<%= package.name -%>" -> "<%= nested_package.name -%>" [ color=purple ]
|
116
|
+
<%- end -%>
|
117
|
+
<%- end -%>
|
118
|
+
<%- end -%>
|
119
|
+
<%- end -%>
|
120
|
+
<%- if options.show_visibility -%>
|
121
|
+
<%- all_packages.each do |package| -%>
|
122
|
+
<%- (package.config['visible_to'] || []).each do |other_package_name| -%>
|
123
|
+
"<%= package.name -%>" -> "<%= other_package_name -%>" [ color=blue constraint=false ]
|
116
124
|
<%- end -%>
|
117
125
|
<%- end -%>
|
118
126
|
<%- end -%>
|
119
|
-
<%- end -%>
|
120
127
|
<%- if options.show_legend -%>
|
121
128
|
subgraph cluster_legend {
|
122
129
|
fontsize=16
|
123
130
|
label="Edges Styles and Arrow Heads"
|
124
131
|
A [ fontsize=12 shape=box label="package"]
|
125
132
|
B [ fontsize=12 shape=box label="package"]
|
133
|
+
K [ fontsize=12 shape=box label="package"]
|
134
|
+
L [ fontsize=12 shape=box label="package"]
|
135
|
+
M [ fontsize=12 shape=box label="package"]
|
136
|
+
N [ fontsize=12 shape=box label="package"]
|
137
|
+
|
126
138
|
C [ fontsize=12 shape=box label="package"]
|
127
139
|
D [ fontsize=12 shape=box label="package"]
|
128
140
|
E [ fontsize=12 shape=box label="package"]
|
@@ -131,14 +143,15 @@ digraph package_diagram {
|
|
131
143
|
H [ fontsize=12 shape=box label="package"]
|
132
144
|
I [ fontsize=12 shape=box label="package"]
|
133
145
|
J [ fontsize=12 shape=box label="package"]
|
134
|
-
|
135
|
-
L [ fontsize=12 shape=box label="package"]
|
146
|
+
|
136
147
|
A -> B [label="accepted dependency" color=darkgreen]
|
148
|
+
K -> L [label="nested package" color=purple]
|
149
|
+
M -> N [label="visibile to" color=darkgreen]
|
150
|
+
|
137
151
|
C -> D [label="privacy todo" color=darkred style=dashed arrowhead=crow]
|
138
152
|
E -> F [label="architecture todo" color=darkred style=dashed arrowhead=invodot]
|
139
153
|
G -> H [label="visibility todo" color=darkred style=dashed arrowhead=obox]
|
140
154
|
I -> J [label="dependency todo" color=darkred style=dashed arrowhead=odot]
|
141
|
-
K -> L [label="nested package" color=purple penwidth=3]
|
142
155
|
}
|
143
156
|
<%- end -%>
|
144
157
|
<%- if options.show_teams && all_team_names != [] -%>
|
@@ -12,11 +12,11 @@ end
|
|
12
12
|
|
13
13
|
class FocusPackEdgeDirection < T::Enum
|
14
14
|
enums do
|
15
|
-
None = new
|
16
|
-
All = new
|
17
|
-
In = new
|
18
|
-
Out = new
|
19
|
-
InOut = new
|
15
|
+
None = new # don't include non-focus packs and thus show no edges to/from them
|
16
|
+
All = new # include non-focus packs and show all edges between all visible nodes
|
17
|
+
In = new # include non-focus packs and show edges that go towards focus packs (and show all edges between focus packs)
|
18
|
+
Out = new # include non-focus packs and show edges that go away from focus packs (and show all edges between focus packs)
|
19
|
+
InOut = new # include non-focus packs and show edges that go towards or away from focus packs (and show all edges between focus packs)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
@@ -24,20 +24,26 @@ class Options < T::Struct
|
|
24
24
|
extend T::Sig
|
25
25
|
|
26
26
|
prop :show_legend, T::Boolean, default: true
|
27
|
-
|
27
|
+
|
28
28
|
prop :show_dependencies, T::Boolean, default: true
|
29
|
+
prop :show_privacy, T::Boolean, default: true
|
30
|
+
prop :show_layers, T::Boolean, default: true
|
31
|
+
prop :show_visibility, T::Boolean, default: true
|
32
|
+
|
29
33
|
prop :show_todos, T::Boolean, default: true
|
30
34
|
prop :only_todo_types, T::Array[EdgeTodoTypes], default: EdgeTodoTypes.values
|
31
|
-
prop :
|
35
|
+
prop :use_todos_for_layout, T::Boolean, default: false
|
36
|
+
|
32
37
|
prop :show_teams, T::Boolean, default: true
|
33
38
|
|
34
|
-
prop :focus_pack, T::Array[String], default:
|
39
|
+
prop :focus_pack, T.nilable(T::Array[String]), default: nil
|
35
40
|
prop :show_only_edges_to_focus_pack, FocusPackEdgeDirection, default: FocusPackEdgeDirection::All
|
41
|
+
prop :exclude_packs, T::Array[String], default: []
|
36
42
|
|
37
43
|
prop :roll_nested_into_parent_packs, T::Boolean, default: false
|
38
44
|
prop :show_nested_relationships, T::Boolean, default: true
|
39
45
|
|
40
|
-
prop :exclude_packs, T::Array[String], default: []
|
41
|
-
|
42
46
|
prop :remote_base_url, T.nilable(String)
|
47
|
+
|
48
|
+
prop :title, T.nilable(String), default: nil
|
43
49
|
end
|
data/lib/visualize_packs.rb
CHANGED
@@ -56,9 +56,11 @@ module VisualizePacks
|
|
56
56
|
|
57
57
|
sig { params(options: Options, max_todo_count: T.nilable(Integer)).returns(String) }
|
58
58
|
def self.diagram_title(options, max_todo_count)
|
59
|
+
return "<<b>#{options.title}</b>>" if options.title
|
60
|
+
|
59
61
|
app_name = File.basename(Dir.pwd)
|
60
|
-
focus_edge_info = options.focus_pack
|
61
|
-
focus_info = options.focus_pack
|
62
|
+
focus_edge_info = options.focus_pack && options.show_only_edges_to_focus_pack != FocusPackEdgeDirection::All ? "showing only edges to/from focus pack" : "showing all edges between visible packs"
|
63
|
+
focus_info = options.focus_pack ? "Focus on #{limited_sentence(options.focus_pack)} (#{focus_edge_info})" : "All packs"
|
62
64
|
skipped_info =
|
63
65
|
[
|
64
66
|
options.show_legend ? nil : "hiding legend",
|
@@ -68,6 +70,7 @@ module VisualizePacks
|
|
68
70
|
EdgeTodoTypes.values.size == options.only_todo_types.size ? nil : "only #{limited_sentence(options.only_todo_types.map &:serialize)} todos",
|
69
71
|
options.show_privacy ? nil : "hiding privacy",
|
70
72
|
options.show_teams ? nil : "hiding teams",
|
73
|
+
options.show_visibility ? nil : "hiding visibility",
|
71
74
|
options.roll_nested_into_parent_packs ? "hiding nested packs" : nil,
|
72
75
|
options.show_nested_relationships ? nil : "hiding nested relationships",
|
73
76
|
options.exclude_packs.empty? ? nil : "excluding pack#{options.exclude_packs.size > 1 ? 's' : ''}: #{limited_sentence(options.exclude_packs)}",
|
@@ -173,7 +176,7 @@ module VisualizePacks
|
|
173
176
|
focus_pack = options.focus_pack
|
174
177
|
exclude_packs = options.exclude_packs
|
175
178
|
|
176
|
-
return packages unless focus_pack
|
179
|
+
return packages unless focus_pack || exclude_packs.any?
|
177
180
|
|
178
181
|
nested_packages = all_nested_packages(packages.map { |p| p.name })
|
179
182
|
|
@@ -185,7 +188,7 @@ module VisualizePacks
|
|
185
188
|
result = T.let([], T::Array[T.nilable(String)])
|
186
189
|
result = packages.map { |pack| pack.name }
|
187
190
|
|
188
|
-
if !focus_pack.empty?
|
191
|
+
if focus_pack && !focus_pack.empty?
|
189
192
|
result = []
|
190
193
|
result += packages.map { |pack| pack.name }.select { |p| match_packs?(p, focus_pack) }
|
191
194
|
if options.show_dependencies
|
@@ -299,8 +302,8 @@ module VisualizePacks
|
|
299
302
|
morphed_packages.reject { |p| nested_packages.keys.include?(p.name) }
|
300
303
|
end
|
301
304
|
|
302
|
-
sig { params(pack: String, packs_name_with_wildcards: T::Array[String]).returns(T::Boolean) }
|
305
|
+
sig { params(pack: String, packs_name_with_wildcards: T.nilable(T::Array[String])).returns(T::Boolean) }
|
303
306
|
def self.match_packs?(pack, packs_name_with_wildcards)
|
304
|
-
packs_name_with_wildcards.any? {|p| File.fnmatch(p, pack)}
|
307
|
+
!packs_name_with_wildcards || packs_name_with_wildcards.any? {|p| File.fnmatch(p, pack)}
|
305
308
|
end
|
306
309
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: visualize_packs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gusto Engineers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-09-
|
11
|
+
date: 2023-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|