pocky 1.2.0 → 1.7.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
  SHA256:
3
- metadata.gz: bf07028aa68c5a375d8e63ab24b67c71632dbcce2ec3102f9aaa3f0151e2c8bd
4
- data.tar.gz: f57f39306821dda1b71d214f1f1ba9e9f92975274c6473451e51dcc6ab74fe60
3
+ metadata.gz: 22de5def074e1cb08bee99280a266ea9ebcf29056ae4dd117f75682e2e3d3221
4
+ data.tar.gz: 7c8258dbf32e3c30099e7d3b4f7d5b7404c7d28348163b7b9a5f51671b490e2c
5
5
  SHA512:
6
- metadata.gz: 8097c6fdd3a673bbb3b4c583c923a818fb0fb901fe206f105676db6803538bbc85ecf9990ce250b386c7a1e16120690220769eb9c18ff928db5ebd3c650f1e16
7
- data.tar.gz: e3a6d19e6afbc51055b15f8fed056553c8aac32b515fe462fa4fea3f60a7def7ca9d1feacbaf6c67e34ec03e3424d893a85e9fe16aec6790feaca0bfce1cab7a
6
+ metadata.gz: e659f0fd8a2a3c0f4a6c9e0bc195ae7493a0b27d774996c533cedce3898a20d14d7f703a9c6f6715e290175c02435519ddfa486ca6ce506d5ac38d97017f7f80
7
+ data.tar.gz: a67332ec4f9dc8503b4267fef328a8d98eb0894bd90554867c3b6f299eba35a898f1e42560c190adf94e4748d182bf16b016fccf0636bb1b28c2e6e44edb4432
data/README.md CHANGED
@@ -1,20 +1,46 @@
1
1
  # Pocky
2
2
 
3
- Pocky is used to generate dependency graphs for your packwerk packages. The gem is named after pocky, a beloved Japanese snack that comes in small packages.
3
+ Pocky generates dependency graphs for your packwerk packages. The gem is named after pocky, a beloved Japanese snack that comes in small packages.
4
4
 
5
5
  ![Pocky](https://user-images.githubusercontent.com/138784/103248942-c141de80-4921-11eb-99bd-3744816abc37.png)
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
 
19
+ ![pocky-graph](https://user-images.githubusercontent.com/138784/103251690-a6299b80-492e-11eb-92f1-205752d850d8.png)
20
+
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
+
18
44
 
19
45
  ## Installation
20
46
 
@@ -40,7 +66,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
40
66
 
41
67
  ## Contributing
42
68
 
43
- 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.
44
70
 
45
71
  ## License
46
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,99 @@
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
+ parse_package_name(reference_filename)
97
+ end
98
+ end
99
+ 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.2.0"
4
+ VERSION = "1.7.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.2.0
4
+ version: 1.7.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
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'yaml'
4
- require 'ruby-graphviz'
5
-
6
- module Pocky
7
- class Graph
8
- def self.generate(params)
9
- new(**params).generate
10
- end
11
-
12
- private_class_method :new
13
- def initialize(
14
- root_path:,
15
- default_package: 'Default',
16
- package_prefix: '',
17
- output_filename: 'pocky-graph.png'
18
- )
19
- @root_path = root_path
20
- @default_package = default_package
21
- @package_prefix = package_prefix
22
- @output_filename = output_filename
23
-
24
- @deprecated_references = {}
25
- @nodes = {}
26
- end
27
-
28
- def generate
29
- load_package_dependencies
30
- build_directed_graph
31
- end
32
-
33
- private
34
-
35
- def build_directed_graph
36
- graph = GraphViz.new(:G, type: :digraph, dpi: 300)
37
- @deprecated_references.each do |package, references|
38
- @nodes[package] ||= graph.add_nodes(package)
39
- references.each do |provider, dependencies|
40
- provider_package = package_name_for_dependency(provider)
41
- @nodes[provider_package] ||= graph.add_nodes(provider_package)
42
-
43
- graph.add_edges(
44
- @nodes[package],
45
- @nodes[provider_package],
46
- penwidth: edge_width(dependencies.length)
47
- )
48
- end
49
- end
50
-
51
- graph.output(png: @output_filename)
52
- end
53
-
54
- def edge_width(count)
55
- [
56
- [(count / 5).to_i, 1].max,
57
- 5
58
- ].min
59
- end
60
-
61
- def load_package_dependencies
62
- Dir.each_child(@root_path) do |elem|
63
- if Dir.exist?(File.join(@root_path, elem))
64
- load_deprecated_references_for_package(elem)
65
- end
66
- end
67
- end
68
-
69
- def load_deprecated_references_for_package(package)
70
- @deprecated_references[package] ||= begin
71
- filename = deprecated_references_file_for(package)
72
- if File.exist?(filename)
73
- YAML.load_file(filename) || {}
74
- else
75
- {}
76
- end
77
- end
78
- end
79
-
80
- def deprecated_references_file_for(package)
81
- File.join(@root_path, package, 'deprecated_references.yml')
82
- end
83
-
84
- def package_name_for_dependency(name)
85
- return @default_package if name == '.'
86
-
87
- name.gsub(@package_prefix, '').gsub(/^\//, '')
88
- end
89
- end
90
- end