cobra_commander 0.5.0 → 0.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 +4 -4
- data/.editorconfig +11 -0
- data/.travis.yml +3 -2
- data/CHANGELOG.md +26 -0
- data/README.md +102 -11
- data/cobra_commander.gemspec +5 -2
- data/exe/cobra +1 -1
- data/lib/cobra_commander.rb +15 -8
- data/lib/cobra_commander/affected.rb +37 -30
- data/lib/cobra_commander/change.rb +6 -7
- data/lib/cobra_commander/cli.rb +70 -39
- data/lib/cobra_commander/component.rb +52 -0
- data/lib/cobra_commander/dependencies.rb +4 -0
- data/lib/cobra_commander/dependencies/bundler.rb +38 -0
- data/lib/cobra_commander/dependencies/yarn/package.rb +37 -0
- data/lib/cobra_commander/dependencies/yarn/package_repo.rb +31 -0
- data/lib/cobra_commander/dependencies/yarn_workspace.rb +55 -0
- data/lib/cobra_commander/executor.rb +8 -22
- data/lib/cobra_commander/output.rb +3 -72
- data/lib/cobra_commander/output/ascii_tree.rb +55 -0
- data/lib/cobra_commander/output/flat_list.rb +16 -0
- data/lib/cobra_commander/output/graph_viz.rb +27 -0
- data/lib/cobra_commander/umbrella.rb +51 -0
- data/lib/cobra_commander/version.rb +1 -1
- data/renovate.json +8 -0
- metadata +42 -10
- data/lib/cobra_commander/component_tree.rb +0 -168
- data/lib/cobra_commander/graph.rb +0 -46
data/renovate.json
ADDED
metadata
CHANGED
@@ -1,30 +1,51 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cobra_commander
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Langfeld
|
8
8
|
- Garett Arrowood
|
9
|
+
- Carlos Palhares
|
9
10
|
autorequire:
|
10
11
|
bindir: exe
|
11
12
|
cert_chain: []
|
12
|
-
date:
|
13
|
+
date: 2020-07-27 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
+
name: bundler
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
17
18
|
requirements:
|
18
19
|
- - "~>"
|
19
20
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
21
|
+
version: '1.17'
|
21
22
|
type: :runtime
|
22
23
|
prerelease: false
|
23
24
|
version_requirements: !ruby/object:Gem::Requirement
|
24
25
|
requirements:
|
25
26
|
- - "~>"
|
26
27
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
28
|
+
version: '1.17'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: thor
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - "<"
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '2.0'
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 0.18.1
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - "<"
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '2.0'
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 0.18.1
|
28
49
|
- !ruby/object:Gem::Dependency
|
29
50
|
name: ruby-graphviz
|
30
51
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,14 +66,14 @@ dependencies:
|
|
45
66
|
requirements:
|
46
67
|
- - "~>"
|
47
68
|
- !ruby/object:Gem::Version
|
48
|
-
version: '1.
|
69
|
+
version: '1.17'
|
49
70
|
type: :development
|
50
71
|
prerelease: false
|
51
72
|
version_requirements: !ruby/object:Gem::Requirement
|
52
73
|
requirements:
|
53
74
|
- - "~>"
|
54
75
|
- !ruby/object:Gem::Version
|
55
|
-
version: '1.
|
76
|
+
version: '1.17'
|
56
77
|
- !ruby/object:Gem::Dependency
|
57
78
|
name: rake
|
58
79
|
requirement: !ruby/object:Gem::Requirement
|
@@ -144,11 +165,13 @@ description: |
|
|
144
165
|
email:
|
145
166
|
- blangfeld@powerhrg.com
|
146
167
|
- garett.arrowood@powerhrg.com
|
168
|
+
- carlos.palhares@powerhrg.com
|
147
169
|
executables:
|
148
170
|
- cobra
|
149
171
|
extensions: []
|
150
172
|
extra_rdoc_files: []
|
151
173
|
files:
|
174
|
+
- ".editorconfig"
|
152
175
|
- ".gitignore"
|
153
176
|
- ".rspec"
|
154
177
|
- ".rubocop.yml"
|
@@ -169,11 +192,20 @@ files:
|
|
169
192
|
- lib/cobra_commander/affected.rb
|
170
193
|
- lib/cobra_commander/change.rb
|
171
194
|
- lib/cobra_commander/cli.rb
|
172
|
-
- lib/cobra_commander/
|
195
|
+
- lib/cobra_commander/component.rb
|
196
|
+
- lib/cobra_commander/dependencies.rb
|
197
|
+
- lib/cobra_commander/dependencies/bundler.rb
|
198
|
+
- lib/cobra_commander/dependencies/yarn/package.rb
|
199
|
+
- lib/cobra_commander/dependencies/yarn/package_repo.rb
|
200
|
+
- lib/cobra_commander/dependencies/yarn_workspace.rb
|
173
201
|
- lib/cobra_commander/executor.rb
|
174
|
-
- lib/cobra_commander/graph.rb
|
175
202
|
- lib/cobra_commander/output.rb
|
203
|
+
- lib/cobra_commander/output/ascii_tree.rb
|
204
|
+
- lib/cobra_commander/output/flat_list.rb
|
205
|
+
- lib/cobra_commander/output/graph_viz.rb
|
206
|
+
- lib/cobra_commander/umbrella.rb
|
176
207
|
- lib/cobra_commander/version.rb
|
208
|
+
- renovate.json
|
177
209
|
homepage: http://tech.powerhrg.com/cobra_commander/
|
178
210
|
licenses:
|
179
211
|
- MIT
|
@@ -194,7 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
226
|
version: '0'
|
195
227
|
requirements: []
|
196
228
|
rubyforge_project:
|
197
|
-
rubygems_version: 2.7.
|
229
|
+
rubygems_version: 2.7.3
|
198
230
|
signing_key:
|
199
231
|
specification_version: 4
|
200
232
|
summary: Tools for working with Component Based Rails Apps
|
@@ -1,168 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "bundler"
|
4
|
-
require "json"
|
5
|
-
|
6
|
-
module CobraCommander
|
7
|
-
# Represents a dependency tree in a given context
|
8
|
-
class ComponentTree
|
9
|
-
attr_reader :name, :path
|
10
|
-
|
11
|
-
def initialize(name, path, ancestry = Set.new)
|
12
|
-
@name = name
|
13
|
-
@path = path
|
14
|
-
@ancestry = ancestry
|
15
|
-
@ruby = Ruby.new(path)
|
16
|
-
@js = Js.new(path)
|
17
|
-
@type = type_of_component
|
18
|
-
end
|
19
|
-
|
20
|
-
def flatten
|
21
|
-
_flatten(self)
|
22
|
-
end
|
23
|
-
|
24
|
-
def subtree(name)
|
25
|
-
_subtree(name, self)
|
26
|
-
end
|
27
|
-
|
28
|
-
def depends_on?(component_name)
|
29
|
-
dependencies.any? do |component|
|
30
|
-
component.name == component_name || component.depends_on?(component_name)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def dependents_of(component_name)
|
35
|
-
depends = depends_on?(component_name) ? self : nil
|
36
|
-
dependents_below = dependencies.map do |component|
|
37
|
-
component.dependents_of(component_name)
|
38
|
-
end
|
39
|
-
[depends, dependents_below].flatten.compact.uniq(&:name)
|
40
|
-
end
|
41
|
-
|
42
|
-
def to_h
|
43
|
-
{
|
44
|
-
name: @name,
|
45
|
-
path: path,
|
46
|
-
type: @type,
|
47
|
-
ancestry: @ancestry,
|
48
|
-
dependencies: dependencies.map(&:to_h),
|
49
|
-
}
|
50
|
-
end
|
51
|
-
|
52
|
-
def dependencies
|
53
|
-
@deps ||= begin
|
54
|
-
deps = @ruby.dependencies + @js.dependencies
|
55
|
-
deps.sort_by { |dep| dep[:name] }
|
56
|
-
.map(&method(:dep_representation))
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
private
|
61
|
-
|
62
|
-
def _flatten(component)
|
63
|
-
component.dependencies.map do |dep|
|
64
|
-
[dep] + _flatten(dep)
|
65
|
-
end.flatten.uniq(&:name)
|
66
|
-
end
|
67
|
-
|
68
|
-
def _subtree(name, tree)
|
69
|
-
return tree if tree.name == name
|
70
|
-
tree.dependencies.each do |component|
|
71
|
-
return _subtree(name, component)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def type_of_component
|
76
|
-
return "Ruby & JS" if @ruby.gem? && @js.node?
|
77
|
-
return "Ruby" if @ruby.gem?
|
78
|
-
return "JS" if @js.node?
|
79
|
-
end
|
80
|
-
|
81
|
-
def dep_representation(dep)
|
82
|
-
full_path = File.expand_path(File.join(path, dep[:path]))
|
83
|
-
ancestry = @ancestry + [{ name: @name, path: path, type: @type }]
|
84
|
-
ComponentTree.new(dep[:name], full_path, ancestry)
|
85
|
-
end
|
86
|
-
|
87
|
-
# Calculates ruby dependencies
|
88
|
-
class Ruby
|
89
|
-
def initialize(root_path)
|
90
|
-
@root_path = root_path
|
91
|
-
end
|
92
|
-
|
93
|
-
def dependencies
|
94
|
-
@deps ||= begin
|
95
|
-
return [] unless gem?
|
96
|
-
gems = bundler_definition.dependencies.select { |dep| path?(dep.source) }
|
97
|
-
format(gems)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def path?(source)
|
102
|
-
return if source.nil?
|
103
|
-
source_has_path = source.respond_to?(:path?) ? source.path? : source.is_a_path?
|
104
|
-
source_has_path && source.path.to_s != "."
|
105
|
-
end
|
106
|
-
|
107
|
-
def format(deps)
|
108
|
-
deps.map do |dep|
|
109
|
-
path = File.join(dep.source.path, dep.name)
|
110
|
-
{ name: dep.name, path: path }
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def gem?
|
115
|
-
@gem ||= File.exist?(gemfile_path)
|
116
|
-
end
|
117
|
-
|
118
|
-
def bundler_definition
|
119
|
-
::Bundler::Definition.build(gemfile_path, gemfile_lock_path, nil)
|
120
|
-
end
|
121
|
-
|
122
|
-
def gemfile_path
|
123
|
-
File.join(@root_path, "Gemfile")
|
124
|
-
end
|
125
|
-
|
126
|
-
def gemfile_lock_path
|
127
|
-
File.join(@root_path, "Gemfile.lock")
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
# Calculates js dependencies
|
132
|
-
class Js
|
133
|
-
def initialize(root_path)
|
134
|
-
@root_path = root_path
|
135
|
-
end
|
136
|
-
|
137
|
-
def dependencies
|
138
|
-
@deps ||= begin
|
139
|
-
return [] unless node?
|
140
|
-
json = JSON.parse(File.read(package_json_path))
|
141
|
-
format combined_deps(json)
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
def format(deps)
|
146
|
-
return [] if deps.nil?
|
147
|
-
linked_deps = deps.select { |_, v| v.start_with? "link:" }
|
148
|
-
linked_deps.map do |_, v|
|
149
|
-
relational_path = v.split("link:")[1]
|
150
|
-
dep_name = relational_path.split("/")[-1]
|
151
|
-
{ name: dep_name, path: relational_path }
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
def node?
|
156
|
-
@node ||= File.exist?(package_json_path)
|
157
|
-
end
|
158
|
-
|
159
|
-
def package_json_path
|
160
|
-
File.join(@root_path, "package.json")
|
161
|
-
end
|
162
|
-
|
163
|
-
def combined_deps(json)
|
164
|
-
Hash(json["dependencies"]).merge(Hash(json["devDependencies"]))
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "graphviz"
|
4
|
-
require "cobra_commander/component_tree"
|
5
|
-
|
6
|
-
module CobraCommander
|
7
|
-
# Generates graphs of components
|
8
|
-
class Graph
|
9
|
-
def initialize(app_path, format)
|
10
|
-
@format = format
|
11
|
-
@tree = CobraCommander.umbrella_tree(app_path).to_h
|
12
|
-
end
|
13
|
-
|
14
|
-
def generate!
|
15
|
-
return unless valid_format?
|
16
|
-
|
17
|
-
g = GraphViz.new(:G, type: :digraph, concentrate: true)
|
18
|
-
|
19
|
-
app_node = g.add_nodes(@tree[:name])
|
20
|
-
map_nodes(g, app_node, @tree)
|
21
|
-
output(g)
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def map_nodes(g, parent_node, tree)
|
27
|
-
tree[:dependencies].each do |dep|
|
28
|
-
node = g.find_node(dep[:name]) || g.add_nodes(dep[:name])
|
29
|
-
g.add_edges(parent_node, node)
|
30
|
-
map_nodes(g, node, dep)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def output(g)
|
35
|
-
graph = "graph.#{@format}"
|
36
|
-
g.output(@format => graph)
|
37
|
-
puts "Graph generated at #{`pwd`.chomp}/#{graph}"
|
38
|
-
end
|
39
|
-
|
40
|
-
def valid_format?
|
41
|
-
return true if @format == "png" || @format == "dot"
|
42
|
-
puts "FORMAT must be 'png' or 'dot'"
|
43
|
-
false
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|