pocky 1.3.0 → 1.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
- SHA1:
3
- metadata.gz: fce51337b66240934ecb460959861226aafedb75
4
- data.tar.gz: 75f97f5c6c17fade8d7e70b1119256e70bddd833
2
+ SHA256:
3
+ metadata.gz: 612ee34127a910813870f48cc2e84a09da9fcb548e7c81a447205c9a3b84ef8b
4
+ data.tar.gz: 98b7be34c21ac045bafafa8ceb4c01fbcb0461495d19807ec1ab26970a11e4b8
5
5
  SHA512:
6
- metadata.gz: c71ef6721a70df6cbe50e76faf256faf8021255e08406fcca9f9d1d0a22acee48c1cdf44b074db6703b183746ac5513a27620975936302f4199218511ba79b21
7
- data.tar.gz: 1a3ee14c5c8f52150ec2e46bff9208d5f82c45d3163098117904ecf4994e52ecb8f36ae1dd6e09347195266a821a603d5f6624ff64a68088eb5ce26151ba32f6
6
+ metadata.gz: '07728e53d8c4e6950af51520abe37c0818fabbd25d84cf57cf8cffb7ee925ef10c87d68e7e2bc113cb5c2cc7bf1d7357ee0c3fa608f8aac83df503ea1c68d02c'
7
+ data.tar.gz: 68bb11723dff8b526aaccc0c9153a6a2879b1b6dc2efdb223d4b5246ee3c9e14d210e3ec5a49b8c168237ca823e4a687ec54bfbf1f697307caef4bae67ed20a3
data/README.md CHANGED
@@ -6,18 +6,41 @@ 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, only `root_path` is required.
9
10
  ```ruby
10
- Pocky::Graph.generate(
11
+ Pocky::Packwerk.generate(
11
12
  root_path: 'path/to/app/packages',
12
- default_package: 'The Monolith', # The default package listed as "." in deprecated_references.yml
13
- package_prefix: 'app/packages', # this is for matching package names listed in deprecated_references.yml
14
- output_filename: 'pocky-graph.png'
13
+ default_package: 'Default', # The default package listed as "." in deprecated_references.yml
14
+ filename: 'packwerk-viz.png', # Name of output file
15
+ dpi: 150 # Output file resolution
15
16
  )
16
17
  ```
17
18
 
18
19
  ![pocky-graph](https://user-images.githubusercontent.com/138784/103251690-a6299b80-492e-11eb-92f1-205752d850d8.png)
19
20
 
20
- Note that the the wider edges indicate more references.
21
+ Note that the the bold edges indicate heavier dependencies.
22
+
23
+ Invoke as a rake task:
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
+ )
38
+ ```
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
+
21
44
 
22
45
  ## Installation
23
46
 
@@ -43,7 +66,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
43
66
 
44
67
  ## Contributing
45
68
 
46
- 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.
47
70
 
48
71
  ## License
49
72
 
data/Rakefile CHANGED
@@ -3,6 +3,6 @@
3
3
  require "bundler/gem_tasks"
4
4
  require "rspec/core/rake_task"
5
5
 
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- task default: :spec
6
+ spec = Gem::Specification.find_by_name 'pocky'
7
+ rakefile = "#{spec.gem_dir}/lib/pocky/Rakefile"
8
+ load rakefile
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'pocky/version'
4
- require_relative 'pocky/graph'
4
+ require_relative 'pocky/packwerk'
5
5
 
6
6
  module Pocky
7
+ require 'pocky/railtie' if defined?(Rails)
7
8
  end
@@ -0,0 +1,4 @@
1
+ require 'pocky'
2
+
3
+ path = File.expand_path(__dir__)
4
+ Dir.glob("#{path}/tasks/**/*.rake").each { |f| import f }
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require 'ruby-graphviz'
5
+
6
+ module Pocky
7
+ class InvalidRootPathError < StandardError
8
+ end
9
+
10
+ class Packwerk
11
+ REFERENCE_FILE_NAME = 'deprecated_references.yml'
12
+ MAX_EDGE_WIDTH = 5
13
+
14
+ def self.generate(params)
15
+ new(**params).generate
16
+ end
17
+
18
+ private_class_method :new
19
+ def initialize(
20
+ root_path:,
21
+ default_package: 'Default',
22
+ filename: 'packwerk-viz.png',
23
+ dpi: 150
24
+ )
25
+ @root_paths = [*root_path]
26
+ raise InvalidRootPathError, 'root_path is required' if @root_paths.empty?
27
+
28
+ @default_package = default_package
29
+ @filename = filename
30
+ @dpi = dpi.to_i
31
+ @deprecated_references = {}
32
+ @nodes = {}
33
+ end
34
+
35
+ def generate
36
+ load_package_references
37
+ build_directed_graph
38
+ end
39
+
40
+ private
41
+
42
+ def build_directed_graph
43
+ graph = GraphViz.new(:G, type: :digraph, dpi: @dpi)
44
+ @deprecated_references.each do |package, references|
45
+ @nodes[package] ||= graph.add_nodes(package)
46
+ references.each do |provider, dependencies|
47
+ provider_package = package_name_for_dependency(provider)
48
+ @nodes[provider_package] ||= graph.add_nodes(provider_package)
49
+
50
+ graph.add_edges(
51
+ @nodes[provider_package],
52
+ @nodes[package],
53
+ penwidth: edge_width(dependencies.length)
54
+ )
55
+ end
56
+ end
57
+
58
+ graph.output(png: @filename)
59
+ end
60
+
61
+ def edge_width(count)
62
+ [
63
+ [(count / 5).to_i, 1].max,
64
+ MAX_EDGE_WIDTH
65
+ ].min
66
+ end
67
+
68
+ def package_references
69
+ @package_references ||= @root_paths.flat_map do |path|
70
+ Dir["#{path}/**/#{REFERENCE_FILE_NAME}"]
71
+ end
72
+ end
73
+
74
+ def load_package_references
75
+ if package_references.empty?
76
+ raise InvalidRootPathError, "Cannot find any #{REFERENCE_FILE_NAME} in provided root_path"
77
+ end
78
+
79
+ package_references.each do |filename|
80
+ package = parse_package_name(filename)
81
+ @deprecated_references[package] ||= YAML.load_file(filename) || {}
82
+ end
83
+ end
84
+
85
+ def parse_package_name(filename)
86
+ File.basename(File.dirname(filename))
87
+ end
88
+
89
+ def package_name_for_dependency(name)
90
+ return @default_package if name == '.'
91
+
92
+ reference_filename = package_references.find do |ref|
93
+ ref.match(/#{name}\/#{REFERENCE_FILE_NAME}$/)
94
+ end
95
+
96
+ if reference_filename
97
+ parse_package_name(reference_filename)
98
+ else
99
+ name
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,13 @@
1
+ require 'pocky'
2
+ require 'rails'
3
+
4
+ module Pocky
5
+ class Railtie < Rails::Railtie
6
+ railtie_name :pocky
7
+
8
+ rake_tasks do
9
+ path = File.expand_path(__dir__)
10
+ Dir.glob("#{path}/tasks/**/*.rake").each { |f| load f }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ require 'pocky'
2
+
3
+ namespace :pocky do
4
+ desc 'Generate dependency graph for packwerk packages'
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
+ ))
9
+ end
10
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pocky
4
- VERSION = "1.3.0"
4
+ VERSION = "1.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: 1.3.0
4
+ version: 1.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: 2020-12-29 00:00:00.000000000 Z
11
+ date: 2020-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-graphviz
@@ -41,7 +41,10 @@ files:
41
41
  - bin/console
42
42
  - bin/setup
43
43
  - lib/pocky.rb
44
- - lib/pocky/graph.rb
44
+ - lib/pocky/Rakefile
45
+ - lib/pocky/packwerk.rb
46
+ - lib/pocky/railtie.rb
47
+ - lib/pocky/tasks/generate.rake
45
48
  - lib/pocky/version.rb
46
49
  - pocky.gemspec
47
50
  homepage: https://github.com/mquan/pocky
@@ -66,8 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
66
69
  - !ruby/object:Gem::Version
67
70
  version: '0'
68
71
  requirements: []
69
- rubyforge_project:
70
- rubygems_version: 2.4.5
72
+ rubygems_version: 3.1.4
71
73
  signing_key:
72
74
  specification_version: 4
73
75
  summary: A ruby gem that generates dependency graph for your packwerk packages
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'yaml'
4
- require 'ruby-graphviz'
5
-
6
- module Pocky
7
- class Graph
8
- MAX_EDGE_WIDTH = 5
9
-
10
- def self.generate(params)
11
- new(**params).generate
12
- end
13
-
14
- private_class_method :new
15
- def initialize(
16
- root_path:,
17
- default_package: 'Default',
18
- package_prefix: '',
19
- output_filename: 'pocky-graph.png'
20
- )
21
- @root_path = root_path
22
- @default_package = default_package
23
- @package_prefix = package_prefix
24
- @output_filename = output_filename
25
-
26
- @deprecated_references = {}
27
- @nodes = {}
28
- end
29
-
30
- def generate
31
- load_package_dependencies
32
- build_directed_graph
33
- end
34
-
35
- private
36
-
37
- def build_directed_graph
38
- graph = GraphViz.new(:G, type: :digraph, dpi: 300)
39
- @deprecated_references.each do |package, references|
40
- @nodes[package] ||= graph.add_nodes(package)
41
- references.each do |provider, dependencies|
42
- provider_package = package_name_for_dependency(provider)
43
- @nodes[provider_package] ||= graph.add_nodes(provider_package)
44
-
45
- graph.add_edges(
46
- @nodes[provider_package],
47
- @nodes[package],
48
- penwidth: edge_width(dependencies.length)
49
- )
50
- end
51
- end
52
-
53
- graph.output(png: @output_filename)
54
- end
55
-
56
- def edge_width(count)
57
- [
58
- [(count / 5).to_i, 1].max,
59
- MAX_EDGE_WIDTH
60
- ].min
61
- end
62
-
63
- def load_package_dependencies
64
- Dir.each_child(@root_path) do |elem|
65
- if Dir.exist?(File.join(@root_path, elem))
66
- load_deprecated_references_for_package(elem)
67
- end
68
- end
69
- end
70
-
71
- def load_deprecated_references_for_package(package)
72
- @deprecated_references[package] ||= begin
73
- filename = deprecated_references_file_for(package)
74
- if File.exist?(filename)
75
- YAML.load_file(filename) || {}
76
- else
77
- {}
78
- end
79
- end
80
- end
81
-
82
- def deprecated_references_file_for(package)
83
- File.join(@root_path, package, 'deprecated_references.yml')
84
- end
85
-
86
- def package_name_for_dependency(name)
87
- return @default_package if name == '.'
88
-
89
- name.gsub(@package_prefix, '').gsub(/^\//, '')
90
- end
91
- end
92
- end