pocky 2.7.0 → 2.8.0

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
  SHA1:
3
- metadata.gz: b57fd82dd4f61236c2f397da42b99fcc7c846781
4
- data.tar.gz: ab8764520751d80799f31e119511d48ff551b718
3
+ metadata.gz: 71d72c460dac22e64ff793edb2ed726f95d9366d
4
+ data.tar.gz: 6bee607df4202ab4b3006a75b31ba67160ecf6cd
5
5
  SHA512:
6
- metadata.gz: 788b55b8b0aa45b6416966024c755fd8eea2fa92be58b4fd9425ad20e2c37c4532b250f582f229247d0ee668447324d073a1fc416d3a5693f952cc37d479833b
7
- data.tar.gz: 77bc52a31421d5aad82f2e90aff37a93ebe6c03d5869f78deca5d7611fd2b873f2dbfd37ce98ceefd87e0bf00baba6c7c7d874cb20a55b9a39048870da3bec66
6
+ metadata.gz: 778722784ba28b7d8943ffb13342faa81c6937f0a4931f854ffe0656653eca6bcbcf79f488c4224271e488c69842cbaf230d8e5a122c63e739448ffe8c4cc095
7
+ data.tar.gz: f61dc0bf0b1490d2eb4b43b495cc3de366d60c672a7925b4451cb610654ba54ff77d8f41938ebda5f7691780b96091cda427b5ce7023a19defaa2d3cd3920b9c
data/lib/pocky.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require_relative 'pocky/version'
4
4
  require_relative 'pocky/ruby_file_size'
5
5
  require_relative 'pocky/package'
6
+ require_relative 'pocky/packwerk_loader'
6
7
  require_relative 'pocky/packwerk'
7
8
 
8
9
  module Pocky
data/lib/pocky/package.rb CHANGED
@@ -4,30 +4,43 @@ require 'yaml'
4
4
 
5
5
  module Pocky
6
6
  class Package
7
- attr_reader :name, :dependencies, :enforce_privacy, :deprecated_references
7
+ DEPENDENCIES_FILENAME = 'package.yml'
8
+ DEPRECATED_REFERENCES_FILENAME = 'deprecated_references.yml'
8
9
 
9
- def initialize(name:, filename: nil)
10
+ attr_reader :name, :dependencies, :enforce_privacy, :primary
11
+
12
+ def initialize(name:, path:, primary:)
10
13
  @name = name
11
- @filename = filename
12
- @dependencies = yml['dependencies'] || []
13
- @enforce_privacy = yml['enforce_privacy'] || false
14
- @deprecated_references = {}
14
+ @path = path
15
+ @primary = primary
16
+ @dependencies = dependencies_yml['dependencies'] || []
17
+ @enforce_privacy = dependencies_yml['enforce_privacy'] || false
15
18
  end
16
19
 
17
- def add_deprecated_references(reference_filename)
18
- @deprecated_references = YAML.load_file(reference_filename) || {}
20
+ def deprecated_references
21
+ @deprecated_references ||= load_yml(deprecated_references_filename)
19
22
  end
20
23
 
21
24
  private
22
25
 
23
- def yml
24
- @yml ||= begin
25
- if @filename
26
- YAML.load_file(@filename) || {}
27
- else
28
- {}
29
- end
26
+ def load_yml(filename)
27
+ if File.file?(filename)
28
+ YAML.load_file(filename) || {}
29
+ else
30
+ {}
30
31
  end
31
32
  end
33
+
34
+ def dependencies_yml
35
+ @dependencies_yml ||= load_yml(dependecies_filename)
36
+ end
37
+
38
+ def dependecies_filename
39
+ File.join(@path, DEPENDENCIES_FILENAME)
40
+ end
41
+
42
+ def deprecated_references_filename
43
+ File.join(@path, DEPRECATED_REFERENCES_FILENAME)
44
+ end
32
45
  end
33
46
  end
@@ -5,8 +5,6 @@ require 'ruby-graphviz'
5
5
 
6
6
  module Pocky
7
7
  class Packwerk
8
- DEPENDENCIES_FILENAME = 'package.yml'
9
- DEPRECATED_REFERENCES_FILENAME = 'deprecated_references.yml'
10
8
  MAX_EDGE_WIDTH = 5
11
9
 
12
10
  def self.generate(params = {})
@@ -35,7 +33,6 @@ module Pocky
35
33
  @dpi = dpi.to_i
36
34
  @secondary_package_color = secondary_package_color
37
35
 
38
- @packages = {}
39
36
  @nodes = {}
40
37
 
41
38
  @node_options = {
@@ -59,14 +56,17 @@ module Pocky
59
56
  end
60
57
 
61
58
  def generate
62
- load_dependencies
63
- load_deprecated_references
64
- load_uninitialized_dependencies
65
- build_directed_graph
59
+ @graph = GraphViz.new(:G, type: :digraph, dpi: @dpi)
60
+ draw_packages
61
+ @graph.output(png: @filename)
66
62
  end
67
63
 
68
64
  private
69
65
 
66
+ def packages
67
+ @packages ||= PackwerkLoader.load(@root_path, @package_paths)
68
+ end
69
+
70
70
  def node_overrides(file_size)
71
71
  if file_size < 10
72
72
  { fontsize: 26 }
@@ -81,6 +81,20 @@ module Pocky
81
81
  end
82
82
  end
83
83
 
84
+ def draw_packages
85
+ packages.each do |_name, package|
86
+ @nodes[package.name] ||= draw_node(package)
87
+
88
+ package.dependencies.each do |dependency|
89
+ draw_dependency(package, dependency)
90
+ end
91
+
92
+ package.deprecated_references.each do |provider_name, invocations|
93
+ draw_dependency(package, provider_name, invocations)
94
+ end
95
+ end
96
+ end
97
+
84
98
  def draw_node(package)
85
99
  package_name = package_name_for_dependency(package.name)
86
100
  path = package.name == '.' ? @root_path : @root_path.join(package.name)
@@ -92,45 +106,34 @@ module Pocky
92
106
  label: node_label
93
107
  )
94
108
 
95
- if @package_paths.present? && @package_paths.exclude?(package.name)
96
- node_styles.merge!(fillcolor: @secondary_package_color)
109
+ if @package_paths.present? && !package.primary
110
+ node_styles.merge!(
111
+ fillcolor: @secondary_package_color,
112
+ color: @secondary_package_color
113
+ )
97
114
  end
98
115
 
99
116
  @graph.add_nodes(package_name, **node_styles)
100
117
  end
101
118
 
102
- def build_directed_graph
103
- @graph = GraphViz.new(:G, type: :digraph, dpi: @dpi)
104
- draw_packages
105
- @graph.output(png: @filename)
106
- end
107
-
108
- def draw_packages
109
- @packages.each do |_name, package|
110
- @nodes[package.name] ||= draw_node(package)
119
+ def draw_dependency(package, dependency, invocations = nil)
120
+ # Do not draw dependencies of secondary packages (depencies of primary packages)
121
+ # when visualizing partial system
122
+ return if !package.primary && !packages[dependency]
111
123
 
112
- package.dependencies.each do |dependency|
113
- @nodes[dependency] ||= draw_node(@packages[dependency])
124
+ @nodes[dependency] ||= draw_node(packages[dependency])
114
125
 
115
- @graph.add_edges(
116
- @nodes[package.name],
117
- @nodes[dependency],
118
- **@dependency_edge_options
119
- )
120
- end
126
+ edge_options = invocations ?
127
+ @deprecated_references_edge_options.merge(
128
+ penwidth: edge_width(invocations.length),
129
+ ) :
130
+ @dependency_edge_options
121
131
 
122
- package.deprecated_references.each do |provider_name, invocations|
123
- @nodes[provider_name] ||= draw_node(@packages[provider_name])
124
-
125
- @graph.add_edges(
126
- @nodes[package.name],
127
- @nodes[provider_name],
128
- **@deprecated_references_edge_options.merge(
129
- penwidth: edge_width(invocations.length),
130
- ),
131
- )
132
- end
133
- end
132
+ @graph.add_edges(
133
+ @nodes[package.name],
134
+ @nodes[dependency],
135
+ **edge_options
136
+ )
134
137
  end
135
138
 
136
139
  def edge_width(count)
@@ -140,71 +143,6 @@ module Pocky
140
143
  ].min
141
144
  end
142
145
 
143
- def deprecated_references_files
144
- @deprecated_references_files ||= begin
145
- return Dir[@root_path.join('**', DEPRECATED_REFERENCES_FILENAME).to_s] unless @package_paths
146
-
147
- @package_paths.flat_map do |path|
148
- Dir[@root_path.join(path, '**', DEPRECATED_REFERENCES_FILENAME).to_s]
149
- end
150
- end
151
- end
152
-
153
- def dependencies_files
154
- @dependencies_files ||= begin
155
- return Dir[@root_path.join('**', DEPENDENCIES_FILENAME).to_s] unless @package_paths
156
-
157
- @package_paths.flat_map do |path|
158
- Dir[@root_path.join(path, '**', DEPENDENCIES_FILENAME).to_s]
159
- end
160
- end
161
- end
162
-
163
- def load_dependencies
164
- return if dependencies_files.empty?
165
-
166
- dependencies_files.each do |filename|
167
- package_name = parse_package_name(filename)
168
- @packages[package_name] ||= Pocky::Package.new(name: package_name, filename: filename)
169
- end
170
- end
171
-
172
- def load_deprecated_references
173
- return if deprecated_references_files.empty?
174
-
175
- deprecated_references_files.each do |filename|
176
- package_name = parse_package_name(filename)
177
- @packages[package_name] ||= Pocky::Package.new(name: package_name)
178
- @packages[package_name].add_deprecated_references(filename)
179
-
180
- # Walk the references to create referenced packages
181
- @packages[package_name].deprecated_references.each do |provider_name, _violations|
182
- @packages[provider_name] ||= Pocky::Package.new(name: provider_name)
183
- end
184
- end
185
- end
186
-
187
- # This must be run as the very last step of packages graph building because these won't have
188
- # dependency filename reference.
189
- def load_uninitialized_dependencies
190
- return if dependencies_files.empty?
191
-
192
- # When analyzing partial system, some packages may not be initialized as part of
193
- # dependencies/deprecated references walk. So we take care of initializing them here
194
- # before drawing.
195
- dependencies_files.each do |filename|
196
- package_name = parse_package_name(filename)
197
- @packages[package_name].dependencies.each do |dependency|
198
- @packages[dependency] ||= Pocky::Package.new(name: dependency)
199
- end
200
- end
201
- end
202
-
203
- def parse_package_name(filename)
204
- name = File.dirname(filename).gsub(@root_path.to_s, '')
205
- name == '' ? '.' : name.gsub(/^\//, '')
206
- end
207
-
208
146
  def package_name_for_dependency(name)
209
147
  name == '.' ? @default_package : name
210
148
  end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pocky
4
+ class PackwerkLoader
5
+ def self.load(root_path, package_paths)
6
+ new(root_path, package_paths).load
7
+ end
8
+
9
+ private_class_method :new
10
+ def initialize(root_path, package_paths)
11
+ @root_path = root_path
12
+ @package_paths = package_paths
13
+ @packages = {}
14
+ end
15
+
16
+ def load
17
+ load_primary_packages
18
+ load_secondary_packages
19
+
20
+ @packages
21
+ end
22
+
23
+ private
24
+
25
+ def deprecated_references_files
26
+ @deprecated_references_files ||= begin
27
+ return Dir[@root_path.join('**', Pocky::Package::DEPRECATED_REFERENCES_FILENAME).to_s] unless @package_paths
28
+
29
+ @package_paths.flat_map do |path|
30
+ Dir[@root_path.join(path, '**', Pocky::Package::DEPRECATED_REFERENCES_FILENAME).to_s]
31
+ end
32
+ end
33
+ end
34
+
35
+ def dependencies_files
36
+ @dependencies_files ||= begin
37
+ return Dir[@root_path.join('**', Pocky::Package::DEPENDENCIES_FILENAME).to_s] unless @package_paths
38
+
39
+ @package_paths.flat_map do |path|
40
+ Dir[@root_path.join(path, '**', Pocky::Package::DEPENDENCIES_FILENAME).to_s]
41
+ end
42
+ end
43
+ end
44
+
45
+ def init_package(package_name, primary)
46
+ Pocky::Package.new(
47
+ name: package_name,
48
+ path: @root_path.join(package_name).to_s,
49
+ primary: primary
50
+ )
51
+ end
52
+
53
+ def load_primary_packages
54
+ filenames = dependencies_files + deprecated_references_files
55
+ primary_package_names = filenames.map { |filename| parse_package_name(filename) }.uniq
56
+ primary_package_names.each do |name|
57
+ @packages[name] ||= init_package(name, true)
58
+ end
59
+ end
60
+
61
+ def load_secondary_packages
62
+ secondary_packages = {}
63
+ @packages.each do |_, package|
64
+ package.dependencies.each do |dependency|
65
+ secondary_packages[dependency] ||= init_package(dependency, false) unless @packages[dependency]
66
+ end
67
+
68
+ package.deprecated_references.each do |reference, _violations|
69
+ secondary_packages[reference] ||= init_package(reference, false) unless @packages[reference]
70
+ end
71
+ end
72
+
73
+ @packages.merge!(secondary_packages)
74
+ end
75
+
76
+ def parse_package_name(filename)
77
+ name = File.dirname(filename).gsub(@root_path.to_s, '')
78
+ name == '' ? '.' : name.gsub(/^\//, '')
79
+ end
80
+ end
81
+ end
data/lib/pocky/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pocky
4
- VERSION = "2.7.0"
4
+ VERSION = "2.8.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pocky
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.0
4
+ version: 2.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Quan Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-19 00:00:00.000000000 Z
11
+ date: 2021-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-graphviz
@@ -44,6 +44,7 @@ files:
44
44
  - lib/pocky/Rakefile
45
45
  - lib/pocky/package.rb
46
46
  - lib/pocky/packwerk.rb
47
+ - lib/pocky/packwerk_loader.rb
47
48
  - lib/pocky/railtie.rb
48
49
  - lib/pocky/ruby_file_size.rb
49
50
  - lib/pocky/tasks/generate.rake