cobra_commander 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/CHANGELOG.md +12 -0
- data/README.md +1 -1
- data/lib/cobra_commander/affected.rb +16 -5
- data/lib/cobra_commander/change.rb +6 -2
- data/lib/cobra_commander/component_tree.rb +91 -17
- data/lib/cobra_commander/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c08e78acc81afe93b06677fe59da88133927cd5a
|
4
|
+
data.tar.gz: 060cc5c2e75fdd9d85d9686cb9d34f23e2b60eba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b9341d5b477afc484ff76eff6eab70efa90ff26e9ff4df804737ecc36db2d5b4bd0d2644565226b2d46e8db69919aa70880c48a35b1138ed272a5b832d78258
|
7
|
+
data.tar.gz: 953c630c3f7751ad8306f8098e3bf815f0d79d57931c2b23cafdfd6e70bf5d9a0a535bc9799e3bb591226b1df28bfb68256f7c29884bab455fc4ab167578bd68
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## Unreleased
|
4
|
+
|
5
|
+
## Version 0.2.0 - 2017-09-01
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
* Track javascript components via package.json links. PR [#10](https://github.com/powerhome/cobra_commander/pull/10)
|
10
|
+
|
11
|
+
* Alphabetize dependencies in `ls` & `changes` output. PR [#10](https://github.com/powerhome/cobra_commander/pull/10)
|
12
|
+
|
13
|
+
* Add component type to `changes` output. PR [#10](https://github.com/powerhome/cobra_commander/pull/10)
|
14
|
+
|
3
15
|
## Version 0.1.2 - 2017-05-08
|
4
16
|
|
5
17
|
### Fixed
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
[![Code Climate](https://img.shields.io/codeclimate/github/powerhome/cobra_commander.svg)](https://codeclimate.com/github/powerhome/cobra_commander)
|
7
7
|
[![Gemnasium](https://img.shields.io/gemnasium/powerhome/cobra_commander.svg)](https://gemnasium.com/github.com/powerhome/cobra_commander)
|
8
8
|
|
9
|
-
Tools for working with Component Based Rails Apps (see http://shageman.github.io/cbra.info/). Includes tools for graphing
|
9
|
+
Tools for working with Component Based Rails Apps (see http://shageman.github.io/cbra.info/). Includes tools for graphing both Ruby and Javascript components in an application and their relationships, as well as selectively testing components based on changes made.
|
10
10
|
|
11
11
|
## Installation
|
12
12
|
|
@@ -6,22 +6,29 @@ module CobraCommander
|
|
6
6
|
attr_reader :directly, :transitively
|
7
7
|
|
8
8
|
def initialize(tree, changes, path)
|
9
|
+
@tree = tree
|
9
10
|
@changes = changes
|
10
11
|
@path = path
|
11
|
-
|
12
|
-
@directly = Set.new
|
13
|
-
find_dependencies(tree)
|
14
|
-
@transitively.delete(name: UMBRELLA_APP_NAME, path: @path)
|
12
|
+
run!
|
15
13
|
end
|
16
14
|
|
17
15
|
def needs_testing
|
18
|
-
@needs_testing ||=
|
16
|
+
@needs_testing ||= all_affected.map! do |component|
|
19
17
|
File.join(component[:path], "test.sh")
|
20
18
|
end
|
21
19
|
end
|
22
20
|
|
23
21
|
private
|
24
22
|
|
23
|
+
def run!
|
24
|
+
@transitively = Set.new
|
25
|
+
@directly = Set.new
|
26
|
+
find_dependencies(@tree)
|
27
|
+
@transitively.delete(name: UMBRELLA_APP_NAME, path: @path, type: @tree[:type])
|
28
|
+
@transitively = @transitively.to_a.sort_by { |h| h[:name] }
|
29
|
+
@directly = @directly.to_a.sort_by { |h| h[:name] }
|
30
|
+
end
|
31
|
+
|
25
32
|
def find_dependencies(parent_component)
|
26
33
|
parent_component[:dependencies].each do |component|
|
27
34
|
add_if_changed(component)
|
@@ -37,5 +44,9 @@ module CobraCommander
|
|
37
44
|
end
|
38
45
|
end
|
39
46
|
end
|
47
|
+
|
48
|
+
def all_affected
|
49
|
+
(@directly + @transitively).uniq.sort_by { |h| h[:path] }
|
50
|
+
end
|
40
51
|
end
|
41
52
|
end
|
@@ -63,13 +63,13 @@ module CobraCommander
|
|
63
63
|
|
64
64
|
def directly_affected_components
|
65
65
|
puts "<<< Directly affected components >>>"
|
66
|
-
@affected.directly.each { |component| puts component
|
66
|
+
@affected.directly.each { |component| puts display(component) }
|
67
67
|
puts blank_line
|
68
68
|
end
|
69
69
|
|
70
70
|
def transitively_affected_components
|
71
71
|
puts "<<< Transitively affected components >>>"
|
72
|
-
@affected.transitively.each { |component| puts component
|
72
|
+
@affected.transitively.each { |component| puts display(component) }
|
73
73
|
puts blank_line
|
74
74
|
end
|
75
75
|
|
@@ -78,6 +78,10 @@ module CobraCommander
|
|
78
78
|
@affected.needs_testing.each { |script| puts script }
|
79
79
|
end
|
80
80
|
|
81
|
+
def display(component)
|
82
|
+
"#{component[:name]} - #{component[:type]}"
|
83
|
+
end
|
84
|
+
|
81
85
|
def blank_line
|
82
86
|
""
|
83
87
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "json"
|
4
|
+
|
3
5
|
module CobraCommander
|
4
6
|
# Representation of the tree of components and their dependencies
|
5
7
|
class ComponentTree
|
@@ -8,50 +10,122 @@ module CobraCommander
|
|
8
10
|
end
|
9
11
|
|
10
12
|
def to_h
|
11
|
-
|
13
|
+
Tree.new(UMBRELLA_APP_NAME, @root_path).to_h
|
12
14
|
end
|
13
15
|
|
14
|
-
#
|
15
|
-
class
|
16
|
+
# Generates component tree
|
17
|
+
class Tree
|
16
18
|
def initialize(name, path, ancestry = Set.new)
|
17
19
|
@name = name
|
18
20
|
@root_path = path
|
19
21
|
@ancestry = ancestry
|
22
|
+
@ruby = Ruby.new(path)
|
23
|
+
@js = Js.new(path)
|
24
|
+
@type = type_of_component
|
20
25
|
end
|
21
26
|
|
22
27
|
def to_h
|
23
28
|
{
|
24
29
|
name: @name,
|
25
30
|
path: @root_path,
|
31
|
+
type: @type,
|
26
32
|
ancestry: @ancestry,
|
27
|
-
dependencies:
|
33
|
+
dependencies: dependencies.map(&method(:dep_representation)),
|
28
34
|
}
|
29
35
|
end
|
30
36
|
|
31
37
|
private
|
32
38
|
|
33
|
-
def
|
34
|
-
|
39
|
+
def type_of_component
|
40
|
+
return "Ruby & JS" if @ruby.gem? && @js.node?
|
41
|
+
return "Ruby" if @ruby.gem?
|
42
|
+
return "JS" if @js.node?
|
35
43
|
end
|
36
44
|
|
37
|
-
def
|
38
|
-
|
45
|
+
def dependencies
|
46
|
+
@deps ||= begin
|
47
|
+
deps = @ruby.dependencies + @js.dependencies
|
48
|
+
deps.sort_by { |dep| dep[:name] }
|
49
|
+
end
|
39
50
|
end
|
40
51
|
|
41
|
-
def
|
42
|
-
|
52
|
+
def dep_representation(dep)
|
53
|
+
full_path = File.expand_path(File.join(@root_path, dep[:path]))
|
54
|
+
ancestry = @ancestry + [{ name: @name, path: @root_path, type: @type }]
|
55
|
+
self.class.new(dep[:name], full_path, ancestry).to_h
|
43
56
|
end
|
44
57
|
|
45
|
-
|
46
|
-
|
47
|
-
|
58
|
+
# Calculates ruby dependencies
|
59
|
+
class Ruby
|
60
|
+
def initialize(root_path)
|
61
|
+
@root_path = root_path
|
62
|
+
end
|
63
|
+
|
64
|
+
def dependencies
|
65
|
+
@deps ||= begin
|
66
|
+
return [] unless gem?
|
67
|
+
gems = bundler_definition.dependencies.select do |dep|
|
68
|
+
dep.source&.is_a_path? && dep.source.path.to_s != "."
|
69
|
+
end
|
70
|
+
format(gems)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def format(deps)
|
75
|
+
deps.map do |dep|
|
76
|
+
path = File.join(dep.source.path, dep.name)
|
77
|
+
{ name: dep.name, path: path }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def gem?
|
82
|
+
@gem ||= File.exist?(gemfile_path)
|
83
|
+
end
|
84
|
+
|
85
|
+
def bundler_definition
|
86
|
+
::Bundler::Definition.build(gemfile_path, gemfile_lock_path, nil)
|
87
|
+
end
|
88
|
+
|
89
|
+
def gemfile_path
|
90
|
+
File.join(@root_path, "Gemfile")
|
91
|
+
end
|
92
|
+
|
93
|
+
def gemfile_lock_path
|
94
|
+
File.join(@root_path, "Gemfile.lock")
|
48
95
|
end
|
49
96
|
end
|
50
97
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
98
|
+
# Calculates js dependencies
|
99
|
+
class Js
|
100
|
+
def initialize(root_path)
|
101
|
+
@root_path = root_path
|
102
|
+
end
|
103
|
+
|
104
|
+
def dependencies
|
105
|
+
@deps ||= begin
|
106
|
+
return [] unless node?
|
107
|
+
json = JSON.parse(File.read(package_json_path))
|
108
|
+
format(json["dependencies"])
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def format(deps)
|
113
|
+
return [] if deps.nil?
|
114
|
+
linked_deps = deps.select { |_, v| v.start_with? "link:" }
|
115
|
+
linked_deps.map do |_, v|
|
116
|
+
relational_path = v.split("link:")[1]
|
117
|
+
dep_name = relational_path.split("/")[-1]
|
118
|
+
{ name: dep_name, path: relational_path }
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def node?
|
123
|
+
@node ||= File.exist?(package_json_path)
|
124
|
+
end
|
125
|
+
|
126
|
+
def package_json_path
|
127
|
+
File.join(@root_path, "package.json")
|
128
|
+
end
|
55
129
|
end
|
56
130
|
end
|
57
131
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cobra_commander
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Langfeld
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-09-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -193,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
193
193
|
version: '0'
|
194
194
|
requirements: []
|
195
195
|
rubyforge_project:
|
196
|
-
rubygems_version: 2.
|
196
|
+
rubygems_version: 2.6.13
|
197
197
|
signing_key:
|
198
198
|
specification_version: 4
|
199
199
|
summary: Tools for working with Component Based Rails Apps
|