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 +4 -4
- data/README.md +32 -6
- data/Rakefile +3 -3
- data/lib/pocky.rb +2 -1
- data/lib/pocky/Rakefile +4 -0
- data/lib/pocky/packwerk.rb +99 -0
- data/lib/pocky/railtie.rb +13 -0
- data/lib/pocky/tasks/generate.rake +10 -0
- data/lib/pocky/version.rb +1 -1
- metadata +6 -3
- data/lib/pocky/graph.rb +0 -90
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22de5def074e1cb08bee99280a266ea9ebcf29056ae4dd117f75682e2e3d3221
|
4
|
+
data.tar.gz: 7c8258dbf32e3c30099e7d3b4f7d5b7404c7d28348163b7b9a5f51671b490e2c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e659f0fd8a2a3c0f4a6c9e0bc195ae7493a0b27d774996c533cedce3898a20d14d7f703a9c6f6715e290175c02435519ddfa486ca6ce506d5ac38d97017f7f80
|
7
|
+
data.tar.gz: a67332ec4f9dc8503b4267fef328a8d98eb0894bd90554867c3b6f299eba35a898f1e42560c190adf94e4748d182bf16b016fccf0636bb1b28c2e6e44edb4432
|
data/README.md
CHANGED
@@ -1,20 +1,46 @@
|
|
1
1
|
# Pocky
|
2
2
|
|
3
|
-
Pocky
|
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
|

|
6
6
|
|
7
7
|
## Usage
|
8
8
|
|
9
|
+
Invoke from irb or code, only `root_path` is required.
|
9
10
|
```ruby
|
10
|
-
Pocky::
|
11
|
+
Pocky::Packwerk.generate(
|
11
12
|
root_path: 'path/to/app/packages',
|
12
|
-
default_package: '
|
13
|
-
|
14
|
-
|
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
|
+

|
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/
|
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
data/lib/pocky.rb
CHANGED
data/lib/pocky/Rakefile
ADDED
@@ -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,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
|
data/lib/pocky/version.rb
CHANGED
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.
|
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-
|
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/
|
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
|
data/lib/pocky/graph.rb
DELETED
@@ -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
|