bundler-why-plugin 0.1.1 → 0.2.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/lib/bundler/why/cli.rb +29 -25
- data/lib/bundler/why/dependency_resolver.rb +84 -11
- data/lib/bundler/why/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 784f40795674686c348fa654e902d7ac6be67ecbb8b6654a75b85e2cc26f9b62
|
|
4
|
+
data.tar.gz: b9a7569b7fac61fe2286ba607d5389666c83600d4f2879c37680122edf15b546
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a3861d7d00e459bb6be4d23ed3bb091170b8560f007490c1edd66451262e6857fa5015741f0beb23f4513f26a6128c96d92f7391414a3836bbeb6ea5fba3582b
|
|
7
|
+
data.tar.gz: 80391cd81cb103720e315dc80ae04cd25abab120653e5467b0b1463f350f6037d8cb37309e801f5c96a9fb1c1c925346bdb9a2e917224acb35c6b28b4a05f587
|
data/lib/bundler/why/cli.rb
CHANGED
|
@@ -19,7 +19,7 @@ module Bundler
|
|
|
19
19
|
first = given_args.first
|
|
20
20
|
known = tasks.keys + %w[help]
|
|
21
21
|
if known.include?(first)
|
|
22
|
-
super
|
|
22
|
+
super
|
|
23
23
|
else
|
|
24
24
|
super(["why"] + given_args, config)
|
|
25
25
|
end
|
|
@@ -41,6 +41,9 @@ module Bundler
|
|
|
41
41
|
exit 1
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
+
# ツリー構造を追加
|
|
45
|
+
result[:dependents_tree] = resolver.build_dependents_tree(package_name)
|
|
46
|
+
|
|
44
47
|
display_result(result, resolver)
|
|
45
48
|
end
|
|
46
49
|
|
|
@@ -54,33 +57,20 @@ module Bundler
|
|
|
54
57
|
Bundler.ui.info("#{result[:name]} (#{result[:version]})")
|
|
55
58
|
Bundler.ui.info("")
|
|
56
59
|
|
|
57
|
-
#
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
chains.each do |chain|
|
|
63
|
-
chain_str = chain.join(" > ")
|
|
64
|
-
Bundler.ui.info(" #{chain_str}")
|
|
65
|
-
end
|
|
60
|
+
# ツリー形式で依存関係を表示
|
|
61
|
+
dependents_tree = result[:dependents_tree]
|
|
62
|
+
if dependents_tree.any?
|
|
63
|
+
Bundler.ui.info("Directly required by:")
|
|
64
|
+
display_tree(dependents_tree, " ")
|
|
66
65
|
else
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
Bundler.ui.info(" #{dependent[:name]} (#{dependent[:version]}) [#{dependent[:requirement]}]")
|
|
66
|
+
Bundler.ui.info("Required by:")
|
|
67
|
+
all_dependents = result[:all_dependents]
|
|
68
|
+
if all_dependents.any?
|
|
69
|
+
all_dependents.each do |dependent|
|
|
70
|
+
Bundler.ui.info(" #{dependent[:name]} (#{dependent[:version]})")
|
|
73
71
|
end
|
|
74
72
|
else
|
|
75
|
-
Bundler.ui.
|
|
76
|
-
all_dependents = result[:all_dependents]
|
|
77
|
-
if all_dependents.any?
|
|
78
|
-
all_dependents.each do |dependent|
|
|
79
|
-
Bundler.ui.info(" #{dependent[:name]} (#{dependent[:version]})")
|
|
80
|
-
end
|
|
81
|
-
else
|
|
82
|
-
Bundler.ui.warn("Not required by any other packages (may be a direct dependency)")
|
|
83
|
-
end
|
|
73
|
+
Bundler.ui.warn("Not required by any other packages (may be a direct dependency)")
|
|
84
74
|
end
|
|
85
75
|
end
|
|
86
76
|
|
|
@@ -89,6 +79,20 @@ module Bundler
|
|
|
89
79
|
Bundler.ui.info("Location: #{result[:path]}")
|
|
90
80
|
end
|
|
91
81
|
end
|
|
82
|
+
|
|
83
|
+
def display_tree(items, prefix = "")
|
|
84
|
+
items.each_with_index do |item, index|
|
|
85
|
+
is_last = index == items.length - 1
|
|
86
|
+
current_prefix = is_last ? "└── " : "├── "
|
|
87
|
+
next_prefix = is_last ? " " : "│ "
|
|
88
|
+
|
|
89
|
+
Bundler.ui.info("#{prefix}#{current_prefix}#{item[:name]} (#{item[:version]}) [#{item[:requirement]}]")
|
|
90
|
+
|
|
91
|
+
if item[:children] && item[:children].any?
|
|
92
|
+
display_tree(item[:children], prefix + next_prefix)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
92
96
|
end
|
|
93
97
|
end
|
|
94
98
|
end
|
|
@@ -32,7 +32,7 @@ module Bundler
|
|
|
32
32
|
# 直接的な依存元(親)を取得
|
|
33
33
|
def find_direct_dependents(spec)
|
|
34
34
|
dependents = []
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
@specs.each do |other_spec|
|
|
37
37
|
other_spec.dependencies.each do |dep|
|
|
38
38
|
if dep.name == spec.name
|
|
@@ -44,7 +44,7 @@ module Bundler
|
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
|
-
|
|
47
|
+
|
|
48
48
|
dependents
|
|
49
49
|
end
|
|
50
50
|
|
|
@@ -78,26 +78,99 @@ module Bundler
|
|
|
78
78
|
end
|
|
79
79
|
end
|
|
80
80
|
|
|
81
|
-
#
|
|
81
|
+
# 依存関係チェーンを取得(Gemfileに書かれたgemまで遡る)
|
|
82
82
|
def find_dependency_chain(target_name)
|
|
83
83
|
spec = find_spec(target_name)
|
|
84
|
-
return
|
|
84
|
+
return [] unless spec
|
|
85
85
|
|
|
86
86
|
chains = []
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
87
|
+
gemfile_dependencies = @definition.dependencies.map(&:name)
|
|
88
|
+
|
|
89
|
+
# 直接の依存元を探す
|
|
90
|
+
direct_dependents = find_direct_dependents(spec)
|
|
91
|
+
|
|
92
|
+
direct_dependents.each do |dependent|
|
|
93
|
+
# 依存元がGemfileに記載されているかチェック
|
|
94
|
+
if gemfile_dependencies.include?(dependent[:name])
|
|
95
|
+
chains << [dependent[:name], target_name]
|
|
96
|
+
else
|
|
97
|
+
# 依存元をさらに遡る
|
|
98
|
+
parent_chains = find_dependency_chain_recursive(dependent[:name], [target_name], gemfile_dependencies)
|
|
99
|
+
chains.concat(parent_chains)
|
|
93
100
|
end
|
|
94
101
|
end
|
|
95
102
|
|
|
96
|
-
chains
|
|
103
|
+
chains.uniq
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Gemfileのdependenciesを取得
|
|
107
|
+
def gemfile_dependencies
|
|
108
|
+
@definition.dependencies.map(&:name)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# 依存関係ツリーを構築(各ノードの子を取得)
|
|
112
|
+
def build_dependents_tree(spec_name, visited = Set.new, depth = 0)
|
|
113
|
+
return [] if visited.include?(spec_name) || depth > 10
|
|
114
|
+
|
|
115
|
+
visited.add(spec_name)
|
|
116
|
+
spec = find_spec(spec_name)
|
|
117
|
+
return [] unless spec
|
|
118
|
+
|
|
119
|
+
direct_dependents = []
|
|
120
|
+
@specs.each do |other_spec|
|
|
121
|
+
other_spec.dependencies.each do |dep|
|
|
122
|
+
if dep.name == spec_name
|
|
123
|
+
direct_dependents << {
|
|
124
|
+
name: other_spec.name,
|
|
125
|
+
version: other_spec.version.to_s,
|
|
126
|
+
requirement: dep.requirement.to_s,
|
|
127
|
+
children: build_dependents_tree(other_spec.name, visited.dup, depth + 1)
|
|
128
|
+
}
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
direct_dependents
|
|
97
134
|
end
|
|
98
135
|
|
|
99
136
|
private
|
|
100
137
|
|
|
138
|
+
# 依存関係チェーンを再帰的に遡る
|
|
139
|
+
def find_dependency_chain_recursive(current_name, path, gemfile_deps)
|
|
140
|
+
chains = []
|
|
141
|
+
|
|
142
|
+
# 循環参照を防ぐため、すでにpathに含まれている場合は処理しない
|
|
143
|
+
return chains if path.include?(current_name)
|
|
144
|
+
|
|
145
|
+
current_spec = find_spec(current_name)
|
|
146
|
+
return chains unless current_spec
|
|
147
|
+
|
|
148
|
+
# 現在のgemの依存元を取得
|
|
149
|
+
direct_dependents = find_direct_dependents(current_spec)
|
|
150
|
+
|
|
151
|
+
if direct_dependents.empty?
|
|
152
|
+
# 依存元がない場合でも、Gemfileに記載されていれば追加
|
|
153
|
+
if gemfile_deps.include?(current_name)
|
|
154
|
+
chains << ([current_name] + path)
|
|
155
|
+
end
|
|
156
|
+
else
|
|
157
|
+
direct_dependents.each do |dependent|
|
|
158
|
+
new_path = [current_name] + path
|
|
159
|
+
|
|
160
|
+
if gemfile_deps.include?(dependent[:name])
|
|
161
|
+
# Gemfileに記載されているgemに到達したらチェーンを確定
|
|
162
|
+
chains << ([dependent[:name]] + new_path)
|
|
163
|
+
else
|
|
164
|
+
# さらに親を遡る
|
|
165
|
+
parent_chains = find_dependency_chain_recursive(dependent[:name], new_path, gemfile_deps)
|
|
166
|
+
chains.concat(parent_chains)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
chains
|
|
172
|
+
end
|
|
173
|
+
|
|
101
174
|
# targetが sourceの依存関係にあるかチェック
|
|
102
175
|
def is_dependency_of?(target, source)
|
|
103
176
|
source_spec = find_spec(source)
|
data/lib/bundler/why/version.rb
CHANGED