visualize_packs 0.5.11 → 0.5.13

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c97e3f2997e104fa0359775892adfb5e8cc40d22a85d886bf0f8a1d608398a8
4
- data.tar.gz: 7b933103509243b81126bc29cd193daf9536a46860d36ad40f1d988df29d77b3
3
+ metadata.gz: fd8d04886b359c5fe0ee721ba30aa63a82cf15cbbd49f4f22aae9bb122d746da
4
+ data.tar.gz: f3e546e753e571226f782fe8aa2ae9cbee845c3629964cd8eedaf1527fc77f90
5
5
  SHA512:
6
- metadata.gz: 0e0c1ca8ea26ee9cbd57b3e4066960868ea9362de4bae5fad1517481376ba8f3dd476ff8ad1f43c186d9b9c9d291a7332c203b877e37d5e9d6e07f4277d70899
7
- data.tar.gz: 632e641dc9e1c45dd744bf9d09bff3cc9723138bc8eb27c1d6771afdc51ad3aef2de988801420b64a1c7f27155fb530fcbfe66cd3c4c65e7eb3b4c6de5e220e6
6
+ metadata.gz: 23b4d5aeb2ac339bb16a731d66733b47dd4d3583adbd099064a3bcd2c2cd77d56ded62cd64128cf7e992108227f91fa32667622e461e42ed49dcee60cf16fc7d
7
+ data.tar.gz: 3c07f47b89313c37d062550289ca28591a0d2a2023c7fb3f23f401a27710cad28eff6df42775108429af7193374088d0ad9c690599c64c2ad8b0352e921c076c
data/README.md CHANGED
@@ -48,3 +48,5 @@ Once you are ready, run the following and commit the new `diagram_examples.png`
48
48
  ```
49
49
  ./spec/update_cassettes.sh
50
50
  ```
51
+
52
+ Please check in a new `diagram_examples.png` only if there are actual visual changes.
data/bin/visualize_packs CHANGED
@@ -33,8 +33,8 @@ OptionParser.new do |opt|
33
33
  opt.on('--no-teams', "Don't show team colors") { |o| options.show_teams = false }
34
34
 
35
35
  opt.on('--focus-folder=FOLDER', "Draw package diagram only for packages in FOLDER. Matches with 'include' for partial matches") { |o| options.focus_folder = o.empty? ? nil : o }
36
- opt.on('--focus-pack=pack1,pack2', "Focus on a specific package(s). Wildcards support: 'packs/*'") { |o| options.focus_package = o.to_s.split(",") }
37
- opt.on('--only-edges-to-focus', "If focus is set, this shows only the edges to/from the focus node instead of all edges in the focussed graph. This only has effect when --focus-on is set.") { |o| options.show_only_edges_to_focus_package = true }
36
+ opt.on('--focus-pack=pack1,pack2', "Focus on a specific package(s). Wildcards support: 'packs/*'") { |o| options.focus_pack = o.to_s.split(",") }
37
+ opt.on('--only-edges-to-focus=[in,out,inout]', "If focus-pack is set, this shows only the edges into / out of / in and out of the focus node instead of all edges in the focussed graph.") { |o| options.show_only_edges_to_focus_pack = FocusPackEdgeDirection.deserialize(o) }
38
38
 
39
39
  opt.on('--roll-nested-into-parent-packs', "Don't show nested packages (not counting root). Connect edges to top-level package instead") { |o| options.roll_nested_into_parent_packs = true }
40
40
  opt.on('--no-nested-relationships', "Don't draw relationships between parents and nested packs") { |o| options.show_nested_relationships = false }
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_package.any? && options.focus_package.any? {|p| File.fnmatch(p, package.name)} ? 18.0 : 12.0 -%>
36
+ fontsize=<%= options.focus_pack.any? && 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 %>
data/lib/options.rb CHANGED
@@ -1,6 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
  # typed: strict
3
3
 
4
+ class FocusPackEdgeDirection < T::Enum
5
+ enums do
6
+ In = new
7
+ Out = new
8
+ InOut = new
9
+ end
10
+ end
11
+
4
12
  class Options < T::Struct
5
13
  extend T::Sig
6
14
 
@@ -12,11 +20,11 @@ class Options < T::Struct
12
20
  prop :show_privacy, T::Boolean, default: true
13
21
  prop :show_teams, T::Boolean, default: true
14
22
 
15
- prop :focus_package, T::Array[String], default: []
16
- prop :show_only_edges_to_focus_package, T::Boolean, default: false
23
+ prop :focus_folder, T.nilable(String)
24
+ prop :focus_pack, T::Array[String], default: []
25
+ prop :show_only_edges_to_focus_pack, T.nilable(FocusPackEdgeDirection), default: nil
17
26
 
18
27
  prop :roll_nested_into_parent_packs, T::Boolean, default: false
19
- prop :focus_folder, T.nilable(String)
20
28
  prop :show_nested_relationships, T::Boolean, default: true
21
29
 
22
30
  prop :exclude_packs, T::Array[String], default: []
@@ -12,13 +12,12 @@ module VisualizePacks
12
12
  sig { params(options: Options, raw_config: T::Hash[String, T.untyped], packages: T::Array[ParsePackwerk::Package]).returns(String) }
13
13
  def self.package_graph!(options, raw_config, packages)
14
14
  all_packages = filtered(packages, options).compact.sort_by {|x| x.name }
15
- all_package_names = all_packages.map &:name
16
-
17
15
  all_packages = remove_nested_packs(all_packages, options)
16
+ all_package_names = all_packages.map &:name
18
17
 
19
18
  show_edge = show_edge_builder(options, all_package_names)
20
19
  node_color = node_color_builder()
21
- max_todo_count = max_todo_count(all_packages, show_edge)
20
+ max_todo_count = max_todo_count(all_packages, show_edge, options)
22
21
 
23
22
  title = diagram_title(options, max_todo_count)
24
23
 
@@ -56,8 +55,8 @@ module VisualizePacks
56
55
  sig { params(options: Options, max_todo_count: T.nilable(Integer)).returns(String) }
57
56
  def self.diagram_title(options, max_todo_count)
58
57
  app_name = File.basename(Dir.pwd)
59
- focus_edge_info = options.focus_package.any? && options.show_only_edges_to_focus_package ? "showing only edges to/from focus pack" : "showing all edges between visible packs"
60
- focus_info = options.focus_package.any? || options.focus_folder ? "Focus on #{[limited_sentence(options.focus_package), options.focus_folder].compact.join(' and ')} (#{focus_edge_info})" : "All packs"
58
+ focus_edge_info = options.focus_pack.any? && options.show_only_edges_to_focus_pack ? "showing only edges to/from focus pack" : "showing all edges between visible packs"
59
+ focus_info = options.focus_pack.any? || options.focus_folder ? "Focus on #{[limited_sentence(options.focus_pack), options.focus_folder].compact.join(' and ')} (#{focus_edge_info})" : "All packs"
61
60
  skipped_info =
62
61
  [
63
62
  options.show_legend ? nil : "hiding legend",
@@ -95,17 +94,23 @@ module VisualizePacks
95
94
  def self.show_edge_builder(options, all_package_names)
96
95
  return lambda do |start_node, end_node|
97
96
  (
98
- !options.show_only_edges_to_focus_package &&
97
+ !options.show_only_edges_to_focus_pack &&
99
98
  all_package_names.include?(start_node) &&
100
99
  all_package_names.include?(end_node)
101
100
  ) ||
102
101
  (
103
- options.show_only_edges_to_focus_package &&
102
+ options.show_only_edges_to_focus_pack &&
104
103
  all_package_names.include?(start_node) &&
105
104
  all_package_names.include?(end_node) &&
106
105
  (
107
- match_packs?(start_node, options.focus_package) ||
108
- match_packs?(end_node, options.focus_package)
106
+ case options.show_only_edges_to_focus_pack
107
+ when FocusPackEdgeDirection::InOut then
108
+ match_packs?(start_node, options.focus_pack) || match_packs?(end_node, options.focus_pack)
109
+ when FocusPackEdgeDirection::In then
110
+ match_packs?(end_node, options.focus_pack)
111
+ when FocusPackEdgeDirection::Out then
112
+ match_packs?(start_node, options.focus_pack)
113
+ end
109
114
  )
110
115
  )
111
116
  end
@@ -124,17 +129,21 @@ module VisualizePacks
124
129
  end
125
130
  end
126
131
 
127
- sig { params(all_packages: T::Array[ParsePackwerk::Package], show_edge: T.proc.params(arg0: String, arg1: String).returns(T::Boolean)).returns(T.nilable(Integer)) }
128
- def self.max_todo_count(all_packages, show_edge)
132
+ sig { params(all_packages: T::Array[ParsePackwerk::Package], show_edge: T.proc.params(arg0: String, arg1: String).returns(T::Boolean), options: Options).returns(T.nilable(Integer)) }
133
+ def self.max_todo_count(all_packages, show_edge, options)
129
134
  todo_counts = {}
130
- all_packages.each do |package|
131
- todos_by_package = package.violations&.group_by(&:to_package_name)
132
- todos_by_package&.keys&.each do |todos_to_package|
133
- todo_types = todos_by_package&& todos_by_package[todos_to_package]&.group_by(&:type)
134
- todo_types&.keys&.each do |todo_type|
135
- if show_edge.call(package.name, todos_to_package)
136
- key = "#{package.name}->#{todos_to_package}:#{todo_type}"
137
- todo_counts[key] = todo_types && todo_types[todo_type]&.count
135
+ if options.show_todos
136
+ all_packages.each do |package|
137
+ todos_by_package = package.violations&.group_by(&:to_package_name)
138
+ todos_by_package&.keys&.each do |todos_to_package|
139
+ todo_types = todos_by_package&& todos_by_package[todos_to_package]&.group_by(&:type)
140
+ todo_types&.keys&.each do |todo_type|
141
+ if options.only_todo_types.empty? || options.only_todo_types.include?(todo_type)
142
+ if show_edge.call(package.name, todos_to_package)
143
+ key = "#{package.name}->#{todos_to_package}:#{todo_type}"
144
+ todo_counts[key] = todo_types && todo_types[todo_type]&.count
145
+ end
146
+ end
138
147
  end
139
148
  end
140
149
  end
@@ -164,12 +173,12 @@ module VisualizePacks
164
173
 
165
174
  sig { params(packages: T::Array[ParsePackwerk::Package], options: Options).returns(T::Array[ParsePackwerk::Package]) }
166
175
  def self.filtered(packages, options)
167
- focus_package = options.focus_package
176
+ focus_pack = options.focus_pack
168
177
  focus_folder = options.focus_folder
169
178
  include_packs = options.include_packs
170
179
  exclude_packs = options.exclude_packs
171
180
 
172
- return packages unless focus_package.any? || focus_folder || include_packs || exclude_packs.any?
181
+ return packages unless focus_pack.any? || focus_folder || include_packs || exclude_packs.any?
173
182
 
174
183
  nested_packages = all_nested_packages(packages.map { |p| p.name })
175
184
 
@@ -181,12 +190,12 @@ module VisualizePacks
181
190
  result = T.let([], T::Array[T.nilable(String)])
182
191
  result = packages.map { |pack| pack.name }
183
192
 
184
- if !focus_package.empty?
193
+ if !focus_pack.empty?
185
194
  result = []
186
- result += packages.map { |pack| pack.name }.select { |p| match_packs?(p, focus_package) }
187
- result += packages.select{ |p| p.dependencies.any? { |d| match_packs?(d, focus_package) }}.map { |pack| pack.name }
188
- result += packages.select{ |p| p.violations&.map(&:to_package_name)&.any? { |v| match_packs?(v, focus_package) }}.map { |pack| pack.name }
189
- packages.map { |pack| pack.name }.select { |p| match_packs?(p, focus_package) }.each do |p|
195
+ result += packages.map { |pack| pack.name }.select { |p| match_packs?(p, focus_pack) }
196
+ result += packages.select{ |p| p.dependencies.any? { |d| match_packs?(d, focus_pack) }}.map { |pack| pack.name }
197
+ result += packages.select{ |p| p.violations&.map(&:to_package_name)&.any? { |v| match_packs?(v, focus_pack) }}.map { |pack| pack.name }
198
+ packages.map { |pack| pack.name }.select { |p| match_packs?(p, focus_pack) }.each do |p|
190
199
  result += packages_by_name[p].dependencies
191
200
  result += packages_by_name[p].violations.map(&:to_package_name)
192
201
  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.11
4
+ version: 0.5.13
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-01 00:00:00.000000000 Z
11
+ date: 2023-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler