pocky 1.6.0 → 1.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 85bd82c4180bd9152f53dcf8dcfa2e0cdb54f93211f926823c62572b9c98c7bf
4
- data.tar.gz: 759e6fe70c7981b6342957da759754833c275d086bf4c2b7caab6e4406cf6bf5
3
+ metadata.gz: 8ad303bcc76eff49ab35053c61a7ad277165d40b999fcadac1d310be525ab69b
4
+ data.tar.gz: 16e002a3989465994fa932da11696b166468da711336f354fae58ece194087c4
5
5
  SHA512:
6
- metadata.gz: d7db906a22cfd1c05fca50101bc0f5c896c6d3ade27cb998a7ab0e6218094a420577a0bd59a67bc41c851007bd73590735b4251e6ed60cff79ef41532572e8c8
7
- data.tar.gz: 2a8078b50d6d0f0fd46ae1269b18f2602d5f69487ac431400d122b4bcddf4415457cd2b695483eda803c3117f80a4b52d5c2c78221406fdbc156bae6b1530dcd
6
+ metadata.gz: 9bc982c815e4becd96436596522ea9adf543ec3830e04e812185a452a263ee8715572dd260d2b912d2fd7ffaa2f2866ab5d9445b3ea841fa6486a9fd4bc1880e
7
+ data.tar.gz: 82a64fb0e51915f78085510a3b1aa78ea1e9a9b48a2a163f29610b280e613e2cfccfb7fb9e1bd6ff59df7b053b8decbcfd389f73d4aa96b0b2785aab318cb692
data/README.md CHANGED
@@ -6,14 +6,16 @@ Pocky generates dependency graphs for your packwerk packages. The gem is named a
6
6
 
7
7
  ## Usage
8
8
 
9
- Invoke from irb or code
9
+ Invoke from irb or code, only `root_path` is required.
10
10
  ```ruby
11
11
  Pocky::Packwerk.generate(
12
12
  root_path: 'path/to/app/packages',
13
- default_package: 'Default', # The default package listed as "." in deprecated_references.yml
14
- package_prefix: 'app/packages', # this is for matching package names listed in deprecated_references.yml
13
+ default_package: 'app', # The default package listed as "." in package.yml and deprecated_references.yml
15
14
  filename: 'packwerk-viz.png', # Name of output file
16
- dpi: 150 # Output file resolution
15
+ dpi: 100, # Output file resolution
16
+ package_color: 'darkgray', # color name or hex color, see https://graphviz.org/doc/info/colors.html for more details
17
+ deprecated_reference_edge: 'black',
18
+ dependency_edge: 'darkgreen',
17
19
  )
18
20
  ```
19
21
 
@@ -21,11 +23,27 @@ Pocky::Packwerk.generate(
21
23
 
22
24
  Note that the the bold edges indicate heavier dependencies.
23
25
 
24
- Invoke as a rake task
26
+ Invoke as a rake task:
25
27
 
28
+ $ rake pocky:generate"[path/to/app/packages,Monolith,packages.png,100]"
29
+
30
+
31
+ #### `root_path` as an array
32
+ `root_path` can also be an array in case your packages are organized in multiple directories. Alternatively, you can also provide paths to individual packages to generate more focused graphs for your package subsystems.
33
+
34
+ ```ruby
35
+ Pocky::Packwerk.generate(
36
+ root_path: [
37
+ 'path/to/app/packages/a',
38
+ 'path/to/app/packages/z',
39
+ ]
40
+ )
26
41
  ```
27
- rake pocky:generate[path/to/app/packages,Default,app/packages,packwerk-viz.png,150]
28
- ```
42
+
43
+ Generate the same graph using the rake task:
44
+
45
+ $ rake pocky:generate"[path/to/app/packages/a path/to/app/packages/z]"
46
+
29
47
 
30
48
  ## Installation
31
49
 
@@ -51,7 +69,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
51
69
 
52
70
  ## Contributing
53
71
 
54
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/pocky.
72
+ Bug reports and pull requests are welcome on GitHub at https://github.com/mquan/pocky.
55
73
 
56
74
  ## License
57
75
 
@@ -4,7 +4,12 @@ require 'yaml'
4
4
  require 'ruby-graphviz'
5
5
 
6
6
  module Pocky
7
+ class InvalidRootPathError < StandardError
8
+ end
9
+
7
10
  class Packwerk
11
+ DEPENDENCIES_FILENAME = 'package.yml'
12
+ DEPRECATED_REFERENCES_FILENAME = 'deprecated_references.yml'
8
13
  MAX_EDGE_WIDTH = 5
9
14
 
10
15
  def self.generate(params)
@@ -14,44 +19,86 @@ module Pocky
14
19
  private_class_method :new
15
20
  def initialize(
16
21
  root_path:,
17
- default_package: 'Default',
18
- package_prefix: '',
22
+ default_package: 'app',
19
23
  filename: 'packwerk-viz.png',
20
- dpi: 150
24
+ dpi: 100,
25
+ package_color: 'darkgray',
26
+ dependency_edge: 'green3',
27
+ deprecated_reference_edge: 'black'
21
28
  )
22
- @root_path = root_path
29
+ @root_paths = [*root_path]
30
+ raise InvalidRootPathError, 'root_path is required' if @root_paths.empty?
31
+
23
32
  @default_package = default_package
24
- @package_prefix = package_prefix
25
33
  @filename = filename
26
34
  @dpi = dpi.to_i
27
35
  @deprecated_references = {}
36
+ @package_dependencies = {}
28
37
  @nodes = {}
38
+
39
+ @node_options = {
40
+ fontsize: 26.0,
41
+ fontcolor: 'white',
42
+ fillcolor: package_color,
43
+ color: package_color,
44
+ style: 'filled, rounded',
45
+ shape: 'box',
46
+ }
47
+
48
+ @deprecated_references_edge_options = {
49
+ color: deprecated_reference_edge,
50
+ }
51
+
52
+ @dependency_edge_options = {
53
+ color: dependency_edge
54
+ }
29
55
  end
30
56
 
31
57
  def generate
32
- load_package_dependencies
58
+ load_dependencies
59
+ load_deprecated_references
33
60
  build_directed_graph
34
61
  end
35
62
 
36
63
  private
37
64
 
38
65
  def build_directed_graph
39
- graph = GraphViz.new(:G, type: :digraph, dpi: @dpi)
40
- @deprecated_references.each do |package, references|
41
- @nodes[package] ||= graph.add_nodes(package)
42
- references.each do |provider, dependencies|
66
+ @graph = GraphViz.new(:G, type: :digraph, dpi: @dpi)
67
+ draw_dependencies
68
+ draw_deprecated_references
69
+ @graph.output(png: @filename)
70
+ end
71
+
72
+ def draw_dependencies
73
+ @package_dependencies.each do |package, file|
74
+ @nodes[package] ||= @graph.add_nodes(package, **@node_options)
75
+ file.each do |provider|
43
76
  provider_package = package_name_for_dependency(provider)
44
- @nodes[provider_package] ||= graph.add_nodes(provider_package)
77
+ @nodes[provider_package] ||= @graph.add_nodes(provider_package, **@node_options)
45
78
 
46
- graph.add_edges(
47
- @nodes[provider_package],
79
+ @graph.add_edges(
48
80
  @nodes[package],
49
- penwidth: edge_width(dependencies.length)
81
+ @nodes[provider_package],
82
+ **@dependency_edge_options
50
83
  )
51
84
  end
52
85
  end
86
+ end
53
87
 
54
- graph.output(png: @filename)
88
+ def draw_deprecated_references
89
+ @deprecated_references.each do |package, references|
90
+ @nodes[package] ||= @graph.add_nodes(package, **@node_options)
91
+ references.each do |provider, invocations|
92
+ provider_package = package_name_for_dependency(provider)
93
+ @nodes[provider_package] ||= @graph.add_nodes(provider_package, **@node_options)
94
+
95
+ @graph.add_edges(
96
+ @nodes[package],
97
+ @nodes[provider_package],
98
+ **@deprecated_references_edge_options.merge(penwidth: edge_width(invocations.length)),
99
+ )
100
+ end
101
+ end
55
102
  end
56
103
 
57
104
  def edge_width(count)
@@ -61,33 +108,55 @@ module Pocky
61
108
  ].min
62
109
  end
63
110
 
64
- def load_package_dependencies
65
- Dir.each_child(@root_path) do |elem|
66
- if Dir.exist?(File.join(@root_path, elem))
67
- load_deprecated_references_for_package(elem)
68
- end
111
+ def deprecated_references_files
112
+ @deprecated_references_files ||= @root_paths.flat_map do |path|
113
+ Dir["#{path}/**/#{DEPRECATED_REFERENCES_FILENAME}"]
114
+ end
115
+ end
116
+
117
+ def dependencies_files
118
+ @dependencies_files ||= @root_paths.flat_map do |path|
119
+ Dir["#{path}/**/#{DEPENDENCIES_FILENAME}"]
69
120
  end
70
121
  end
71
122
 
72
- def load_deprecated_references_for_package(package)
73
- @deprecated_references[package] ||= begin
74
- filename = deprecated_references_file_for(package)
75
- if File.exist?(filename)
76
- YAML.load_file(filename) || {}
77
- else
78
- {}
123
+ def load_dependencies
124
+ return if dependencies_files.empty?
125
+
126
+ dependencies_files.each do |filename|
127
+ package = parse_package_name(filename)
128
+ @package_dependencies[package] ||= begin
129
+ yml = YAML.load_file(filename) || {}
130
+ yml['dependencies'] || []
79
131
  end
80
132
  end
81
133
  end
82
134
 
83
- def deprecated_references_file_for(package)
84
- File.join(@root_path, package, 'deprecated_references.yml')
135
+ def load_deprecated_references
136
+ return if deprecated_references_files.empty?
137
+
138
+ deprecated_references_files.each do |filename|
139
+ package = parse_package_name(filename)
140
+ @deprecated_references[package] ||= YAML.load_file(filename) || {}
141
+ end
142
+ end
143
+
144
+ def parse_package_name(filename)
145
+ File.basename(File.dirname(filename))
85
146
  end
86
147
 
87
148
  def package_name_for_dependency(name)
88
149
  return @default_package if name == '.'
89
150
 
90
- name.gsub(@package_prefix, '').gsub(/^\//, '')
151
+ reference_filename = deprecated_references_files.find do |ref|
152
+ ref.match(/#{name}\/#{DEPRECATED_REFERENCES_FILENAME}$/)
153
+ end
154
+
155
+ if reference_filename
156
+ parse_package_name(reference_filename)
157
+ else
158
+ name
159
+ end
91
160
  end
92
161
  end
93
162
  end
@@ -2,7 +2,9 @@ require 'pocky'
2
2
 
3
3
  namespace :pocky do
4
4
  desc 'Generate dependency graph for packwerk packages'
5
- task :generate, [:root_path, :default_package, :package_prefix, :filename, :dpi] do |_task, args|
6
- Pocky::Packwerk.generate(args)
5
+ task :generate, [:root_path, :default_package, :filename, :dpi] do |_task, args|
6
+ Pocky::Packwerk.generate(args.merge(
7
+ root_path: arg[:root_path].split(/\s+/)
8
+ ))
7
9
  end
8
10
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pocky
4
- VERSION = "1.6.0"
4
+ VERSION = "1.9.2"
5
5
  end
@@ -14,7 +14,6 @@ Gem::Specification.new do |spec|
14
14
  spec.license = "MIT"
15
15
  spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
16
16
 
17
-
18
17
  spec.metadata["homepage_uri"] = spec.homepage
19
18
  spec.metadata["source_code_uri"] = "https://github.com/mquan/pocky"
20
19
  spec.metadata["changelog_uri"] = "https://github.com/mquan/pocky"
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: 1.6.0
4
+ version: 1.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Quan Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-29 00:00:00.000000000 Z
11
+ date: 2021-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-graphviz