pocky 1.5.0 → 1.9.1

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: 4006410ded2bda58a3ada5f5a9efc3e70059ec1258116a871386cc253eccfd10
4
- data.tar.gz: 75315c43f9f04e9c2808dad7b762121cf5d68ce63833e2e89f07a025b91843b4
3
+ metadata.gz: ab45111779ec64a861557a7efeb7fefb02a255e0aa34ab791b8ae747475e7614
4
+ data.tar.gz: e9b23a9174780956f67ab1db2746050e94649b7a56243b8a201598e18cb49181
5
5
  SHA512:
6
- metadata.gz: ce4e7c98a283881bba3c321b708a7f6488c7e230ac76ffcbeab54781f4b0ddc627d48b5bacf1a371a4b78b9fc164748c88a52266dce817652d954b1292effedc
7
- data.tar.gz: ba80fe686f39a68a8c6dfc7b7129a195d6d0361182cef7f2b96a2e39fed70315dcb1eba1c6a70a2ecd34c502bb6f83b4b8b16da428436f46aab18853a7741bc4
6
+ metadata.gz: 29bcf083442dfe4e2267b8475fcc872a90161f6ee9a0bc4321fec130acfaad2598557ebd2084ef106ea41887a9d86de9e35c36e2c73b74690c2b4bd1f567a3ca
7
+ data.tar.gz: c843b24dcc15b025d7426821abfd58da27dcfdef877752e75c53b6750dce4783a618ba7a1df0125658888c6b1c688ef8fe1cd35b82a5fab522e25d754ebde013
data/README.md CHANGED
@@ -6,14 +6,13 @@ 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 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
17
16
  )
18
17
  ```
19
18
 
@@ -21,11 +20,27 @@ Pocky::Packwerk.generate(
21
20
 
22
21
  Note that the the bold edges indicate heavier dependencies.
23
22
 
24
- Invoke as a rake task
23
+ Invoke as a rake task:
25
24
 
25
+ $ rake pocky:generate"[path/to/app/packages,Monolith,packages.png,100]"
26
+
27
+
28
+ #### `root_path` as an array
29
+ `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.
30
+
31
+ ```ruby
32
+ Pocky::Packwerk.generate(
33
+ root_path: [
34
+ 'path/to/app/packages/a',
35
+ 'path/to/app/packages/z',
36
+ ]
37
+ )
26
38
  ```
27
- rake pocky:generate[path/to/app/packages,Default,app/packages,packwerk-viz.png,150]
28
- ```
39
+
40
+ Generate the same graph using the rake task:
41
+
42
+ $ rake pocky:generate"[path/to/app/packages/a path/to/app/packages/z]"
43
+
29
44
 
30
45
  ## Installation
31
46
 
@@ -51,7 +66,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
51
66
 
52
67
  ## Contributing
53
68
 
54
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/pocky.
69
+ Bug reports and pull requests are welcome on GitHub at https://github.com/mquan/pocky.
55
70
 
56
71
  ## License
57
72
 
@@ -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,65 @@ 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
21
25
  )
22
- @root_path = root_path
26
+ @root_paths = [*root_path]
27
+ raise InvalidRootPathError, 'root_path is required' if @root_paths.empty?
28
+
23
29
  @default_package = default_package
24
- @package_prefix = package_prefix
25
30
  @filename = filename
26
31
  @dpi = dpi.to_i
27
32
  @deprecated_references = {}
33
+ @package_dependencies = {}
28
34
  @nodes = {}
29
35
  end
30
36
 
31
37
  def generate
32
- load_package_dependencies
38
+ load_dependencies
39
+ load_deprecated_references
33
40
  build_directed_graph
34
41
  end
35
42
 
36
43
  private
37
44
 
38
45
  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|
46
+ @graph = GraphViz.new(:G, type: :digraph, dpi: @dpi)
47
+ draw_dependencies
48
+ draw_deprecated_references
49
+ @graph.output(png: @filename)
50
+ end
51
+
52
+ def draw_dependencies
53
+ @package_dependencies.each do |package, file|
54
+ @nodes[package] ||= @graph.add_nodes(package)
55
+ file['dependencies'].each do |provider|
43
56
  provider_package = package_name_for_dependency(provider)
44
- @nodes[provider_package] ||= graph.add_nodes(provider_package)
57
+ @nodes[provider_package] ||= @graph.add_nodes(provider_package)
45
58
 
46
- graph.add_edges(
47
- @nodes[provider_package],
59
+ @graph.add_edges(
48
60
  @nodes[package],
49
- penwidth: edge_width(dependencies.length)
61
+ @nodes[provider_package]
50
62
  )
51
63
  end
52
64
  end
65
+ end
53
66
 
54
- graph.output(png: @filename)
67
+ def draw_deprecated_references
68
+ @deprecated_references.each do |package, references|
69
+ @nodes[package] ||= @graph.add_nodes(package)
70
+ references.each do |provider, invocations|
71
+ provider_package = package_name_for_dependency(provider)
72
+ @nodes[provider_package] ||= @graph.add_nodes(provider_package)
73
+
74
+ @graph.add_edges(
75
+ @nodes[package],
76
+ @nodes[provider_package],
77
+ pendwidth: edge_width(invocations.length)
78
+ )
79
+ end
80
+ end
55
81
  end
56
82
 
57
83
  def edge_width(count)
@@ -61,33 +87,52 @@ module Pocky
61
87
  ].min
62
88
  end
63
89
 
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
90
+ def deprecated_references_files
91
+ @deprecated_references_files ||= @root_paths.flat_map do |path|
92
+ Dir["#{path}/**/#{DEPRECATED_REFERENCES_FILENAME}"]
69
93
  end
70
94
  end
71
95
 
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
- {}
79
- end
96
+ def dependencies_files
97
+ @dependencies_files ||= @root_paths.flat_map do |path|
98
+ Dir["#{path}/**/#{DEPENDENCIES_FILENAME}"]
99
+ end
100
+ end
101
+
102
+ def load_dependencies
103
+ return if dependencies_files.empty?
104
+
105
+ dependencies_files.each do |filename|
106
+ package = parse_package_name(filename)
107
+ @package_dependencies[package] ||= YAML.load_file(filename) || {}
80
108
  end
81
109
  end
82
110
 
83
- def deprecated_references_file_for(package)
84
- File.join(@root_path, package, 'deprecated_references.yml')
111
+ def load_deprecated_references
112
+ return if deprecated_references_files.empty?
113
+
114
+ deprecated_references_files.each do |filename|
115
+ package = parse_package_name(filename)
116
+ @deprecated_references[package] ||= YAML.load_file(filename) || {}
117
+ end
118
+ end
119
+
120
+ def parse_package_name(filename)
121
+ File.basename(File.dirname(filename))
85
122
  end
86
123
 
87
124
  def package_name_for_dependency(name)
88
125
  return @default_package if name == '.'
89
126
 
90
- name.gsub(@package_prefix, '').gsub(/^\//, '')
127
+ reference_filename = deprecated_references.find do |ref|
128
+ ref.match(/#{name}\/#{REFERENCE_FILE_NAME}$/)
129
+ end
130
+
131
+ if reference_filename
132
+ parse_package_name(reference_filename)
133
+ else
134
+ name
135
+ end
91
136
  end
92
137
  end
93
138
  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]: :environment 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.5.0"
4
+ VERSION = "1.9.1"
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: 1.5.0
4
+ version: 1.9.1
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