cobratest 0.1.2 → 0.1.3
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 -26
- data/bin/cobratest +37 -35
- data/cobratest.gemspec +2 -2
- data/lib/cobratest.rb +11 -7
- data/lib/cobratest/gemfile_scraper.rb +1 -29
- data/lib/cobratest/tests_to_run_selector.rb +8 -2
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98315772b10093ce2a85ec8ba59f2574202e2aab
|
4
|
+
data.tar.gz: 1fd03ebe1f3e34155f7561d9d92ceefba7098e2e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c9c628f0dd3260bf5550b154b8912aa495dbf3beb6167edd98cfe1f1d1d64a78afec835fdee4a5719137dbcebe95d3ee4b0482a36d6df77bf50295f04e5bab2
|
7
|
+
data.tar.gz: 6d4161308e0ed7278ae531709d8c91edb21d9d46d28c9fe11aa3d44102b58093f953689cf08ebf912736f282d07946bb748a0a45cf931930f2cf59e10ca37a5b
|
data/README.md
CHANGED
@@ -24,57 +24,63 @@ Or install it yourself as:
|
|
24
24
|
|
25
25
|
Options are...
|
26
26
|
-h, -H, --help Display this help message.
|
27
|
-
|
28
27
|
-r, --results DEFAULT Display the directories of the components in need of running tests
|
28
|
+
-t, --test-runner RUNNER Choose a test runner
|
29
29
|
-v, --verbose Verbose output of all parts of the calculation
|
30
|
+
-s, --since BRANCH Specify BRANCH target to calculate against
|
30
31
|
|
31
32
|
## Example
|
32
33
|
|
33
34
|
There are sample #cbra folder structures in `spec/examples`. Here is an example run when changing a file in component `C`:
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
$ bin/cobratest ./cobratest/spec/examples/letters/A
|
37
|
+
./cobratest/spec/examples/letters/B/test.sh
|
38
|
+
./cobratest/spec/examples/letters/C/test.sh
|
39
|
+
./cobratest/spec/examples/letters/A/test.sh
|
39
40
|
|
40
41
|
This output can be used to run the necessary tests like so:
|
41
42
|
|
42
|
-
bin/cobratest
|
43
|
+
bin/cobratest ./cobratest/spec/examples/letters/A | xargs -n1 /bin/bash
|
44
|
+
|
45
|
+
You can choose a different test runner like so:
|
46
|
+
|
47
|
+
$ bin/cobratest --test-runner 'myrunner --option 1' ./cobratest/spec/examples/letters/A
|
48
|
+
./cobratest/spec/examples/letters/B/myrunner --option 1
|
49
|
+
./cobratest/spec/examples/letters/C/myrunner --option 1
|
50
|
+
./cobratest/spec/examples/letters/A/myrunner --option 1
|
43
51
|
|
44
52
|
In verbose mode one can check the correctness of cobratest's calculation:
|
45
53
|
|
46
|
-
|
54
|
+
$ bin/cobratest -v ./cobra/cobratest/spec/examples/letters/A
|
47
55
|
All components
|
48
|
-
B
|
49
|
-
C
|
50
|
-
D
|
51
|
-
E1
|
52
|
-
E2
|
53
|
-
F
|
54
|
-
A
|
56
|
+
B ./cobra/cobratest/spec/examples/letters/B
|
57
|
+
C ./cobra/cobratest/spec/examples/letters/C
|
58
|
+
D ./cobra/cobratest/spec/examples/letters/D
|
59
|
+
E1 ./cobra/cobratest/spec/examples/letters/E1
|
60
|
+
E2 ./cobra/cobratest/spec/examples/letters/E2
|
61
|
+
F ./cobra/cobratest/spec/examples/letters/F
|
62
|
+
A ./cobra/cobratest/spec/examples/letters/A
|
55
63
|
|
56
64
|
Changes since last commit
|
57
|
-
|
58
|
-
|
65
|
+
./cobra/cobratest/README.md
|
66
|
+
./cobra/cobratest/spec/examples/letters/C/Gemfile
|
59
67
|
|
60
68
|
Directly affected components
|
61
|
-
C
|
69
|
+
C ./cobra/cobratest/spec/examples/letters/C
|
62
70
|
|
63
71
|
Transitively affected components
|
64
|
-
B
|
65
|
-
C
|
66
|
-
A
|
72
|
+
B ./cobra/cobratest/spec/examples/letters/B
|
73
|
+
C ./cobra/cobratest/spec/examples/letters/C
|
74
|
+
A ./cobra/cobratest/spec/examples/letters/A
|
67
75
|
|
68
76
|
Test scripts to run
|
69
|
-
|
70
|
-
|
71
|
-
|
77
|
+
./cobra/cobratest/spec/examples/letters/B/test.sh
|
78
|
+
./cobra/cobratest/spec/examples/letters/C/test.sh
|
79
|
+
./cobra/cobratest/spec/examples/letters/A/test.sh
|
72
80
|
|
73
81
|
## Todos
|
74
|
-
* make algorithm work for structures where a gem is in a sub folder of another gem (only the inner gem should be
|
82
|
+
* make algorithm work for structures where a gem is in a sub folder of another gem (only the inner gem should be directly affected)
|
75
83
|
* allow for other test runners to be specified
|
76
|
-
* optionally check for changes since origin/master
|
77
|
-
* optionally allow branch to compare against to be specified
|
78
84
|
|
79
85
|
## License
|
80
86
|
|
data/bin/cobratest
CHANGED
@@ -1,47 +1,49 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
3
|
require_relative "../lib/cobratest"
|
4
|
+
require "optparse"
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
6
|
+
options = {
|
7
|
+
display: "results",
|
8
|
+
path: nil
|
9
|
+
}
|
8
10
|
|
9
|
-
|
11
|
+
instructions = OptionParser.new do |opts|
|
12
|
+
opts.banner = "cobratest [OPTION] [application path]\n\n"
|
13
|
+
opts.separator "Test runner employing the structure of Component-based Ruby/Rails apps to optimize what needs to run.\n\n"
|
14
|
+
opts.separator "Options are...\n"
|
10
15
|
|
11
|
-
|
12
|
-
|
16
|
+
opts.on("-h", "-H", "--help", "Display this help message.") do
|
17
|
+
puts opts
|
18
|
+
exit
|
19
|
+
end
|
13
20
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
21
|
+
opts.on("-r", "--results", "DEFAULT Display the directories of the components in need of running tests") do
|
22
|
+
options[:display] = "results"
|
23
|
+
end
|
18
24
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
when 2
|
31
|
-
option = ARGV[0]
|
32
|
-
path = ARGV[1]
|
33
|
-
else
|
34
|
-
puts "Incorrect invocation. Please see help:\n\n"
|
35
|
-
puts help_text
|
36
|
-
exit 1
|
25
|
+
opts.on("-t", "--test-runner RUNNER", "Choose a test runner") do |runner|
|
26
|
+
options[:runner] = runner
|
27
|
+
end
|
28
|
+
|
29
|
+
opts.on("-v", "--verbose", "Verbose output of all parts of the calculation") do
|
30
|
+
options[:display] = "verbose"
|
31
|
+
end
|
32
|
+
|
33
|
+
opts.on("-s", "--since BRANCH", "Specify BRANCH target to calculate against") do |branch|
|
34
|
+
options[:since] = branch
|
35
|
+
end
|
37
36
|
end
|
38
37
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
Cbratest::Runner.new(true).run path
|
38
|
+
begin
|
39
|
+
instructions.parse!
|
40
|
+
if ARGV.size >= 1
|
41
|
+
Cbratest::Runner.new(options).run ARGV[0]
|
42
|
+
else
|
43
|
+
raise OptionParser::MissingArgument.new("Must specify the application path")
|
46
44
|
end
|
45
|
+
rescue OptionParser::InvalidOption, OptionParser::MissingArgument => error
|
46
|
+
puts error
|
47
|
+
puts instructions
|
48
|
+
exit
|
47
49
|
end
|
data/cobratest.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'cobratest'
|
7
|
-
spec.version = '0.1.
|
7
|
+
spec.version = '0.1.3'
|
8
8
|
spec.authors = ['Stephan Hagemann']
|
9
9
|
spec.email = ['stephan.hagemann@gmail.com']
|
10
10
|
spec.summary = %q{A test selector for your component-based Rails application}
|
@@ -31,6 +31,6 @@ Gem::Specification.new do |spec|
|
|
31
31
|
|
32
32
|
spec.add_dependency 'bundler', '~> 1.13'
|
33
33
|
|
34
|
-
spec.add_development_dependency 'rake'
|
34
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
35
35
|
spec.add_development_dependency 'rspec', '~> 3.5'
|
36
36
|
end
|
data/lib/cobratest.rb
CHANGED
@@ -8,8 +8,10 @@ module Cbratest
|
|
8
8
|
require_relative "cobratest/tests_to_run_selector"
|
9
9
|
|
10
10
|
class Runner
|
11
|
-
def initialize(
|
12
|
-
@verbose_output =
|
11
|
+
def initialize(opts)
|
12
|
+
@verbose_output = opts[:display] == "verbose"
|
13
|
+
@since = opts[:since] || "current branch"
|
14
|
+
@test_runner = opts[:runner] || "test.sh"
|
13
15
|
end
|
14
16
|
|
15
17
|
def run(root_path)
|
@@ -21,13 +23,15 @@ module Cbratest
|
|
21
23
|
components = cobra_deps << app.to_s
|
22
24
|
outputs component_out(components.to_a)
|
23
25
|
|
24
|
-
|
25
|
-
outputs "\nChanges since last commit"
|
26
|
+
outputs "\nChanges since last commit on #{@since}"
|
26
27
|
root_dir = `cd "#{path}" && git rev-parse --show-toplevel`.chomp
|
27
|
-
|
28
|
+
if @since != "current branch"
|
29
|
+
changes = `cd "#{root_dir}" && git diff --name-only #{@since}`.split("\n").map { |file| File.join(root_dir, file) }
|
30
|
+
else
|
31
|
+
changes = `cd "#{root_dir}" && git status -s -u`.split("\n").map { |file| File.join(root_dir, file.sub(/^.../, "")) }
|
32
|
+
end
|
28
33
|
outputs changes
|
29
34
|
|
30
|
-
|
31
35
|
outputs "\nDirectly affected components"
|
32
36
|
affected = AffectedComponentFinder.new.find(components, changes)
|
33
37
|
outputs affected_out(affected)
|
@@ -37,7 +41,7 @@ module Cbratest
|
|
37
41
|
outputs affected_out(all_affected)
|
38
42
|
|
39
43
|
outputs "\nTest scripts to run"
|
40
|
-
outputs all_in_need_of_running = TestsToRunSelector.new.list(all_affected), true
|
44
|
+
outputs all_in_need_of_running = TestsToRunSelector.new(@test_runner).list(all_affected), true
|
41
45
|
end
|
42
46
|
|
43
47
|
private
|
@@ -14,13 +14,6 @@ module Cbratest
|
|
14
14
|
{name: name, options: {path: @root_path}}
|
15
15
|
end
|
16
16
|
|
17
|
-
def cobra_dependencies
|
18
|
-
dirdep = direct_dependencies
|
19
|
-
transitive_cobra_dependencies.select do |dep|
|
20
|
-
dirdep.include?(dep[:name]) || dep[:options][:direct]
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
17
|
def transitive_cobra_dependencies
|
25
18
|
gem_dependencies.inject([]) do |memo, dep|
|
26
19
|
if !!dep[:options][:path]
|
@@ -34,24 +27,11 @@ module Cbratest
|
|
34
27
|
|
35
28
|
private
|
36
29
|
|
37
|
-
def raw_gemspec
|
38
|
-
path = File.expand_path(File.join(@root_path, "#{underscore(name)}.gemspec"))
|
39
|
-
File.exist?(path) ? File.read(path) : ""
|
40
|
-
end
|
41
|
-
|
42
|
-
def direct_dependencies
|
43
|
-
raw_gemspec.split("\n").inject([]) do |memo, line|
|
44
|
-
match = line.match(/add_(?:development_)?dependency\s+["']([^'"]+)["']/)
|
45
|
-
memo << match[1] if match
|
46
|
-
memo
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
30
|
def gem_dependencies
|
51
31
|
gemfile_path = File.join(@root_path, "Gemfile")
|
52
32
|
lockfile_path = File.join(@root_path, "Gemfile.lock")
|
53
33
|
::Bundler::Definition.build(gemfile_path, lockfile_path, nil).dependencies.inject([]) do |memo, dep|
|
54
|
-
path = dep.source.path.to_s if dep.source && dep.source.
|
34
|
+
path = dep.source.path.to_s if dep.source && dep.source.path?
|
55
35
|
if path == "."
|
56
36
|
path = nil
|
57
37
|
elsif path && !path.match(/#{dep.name}/)
|
@@ -61,13 +41,5 @@ module Cbratest
|
|
61
41
|
memo
|
62
42
|
end
|
63
43
|
end
|
64
|
-
|
65
|
-
def underscore(string)
|
66
|
-
string.gsub(/::/, '/').
|
67
|
-
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
|
68
|
-
gsub(/([a-z\d])([A-Z])/, '\1_\2').
|
69
|
-
tr("-", "_").
|
70
|
-
downcase
|
71
|
-
end
|
72
44
|
end
|
73
45
|
end
|
@@ -1,10 +1,16 @@
|
|
1
1
|
module Cbratest
|
2
2
|
class TestsToRunSelector
|
3
|
+
attr_reader :suffix
|
4
|
+
|
5
|
+
def initialize(suffix = 'test.sh')
|
6
|
+
@suffix = suffix
|
7
|
+
end
|
8
|
+
|
3
9
|
def list(affected)
|
4
10
|
affected.keys.inject([]) do |memo, key|
|
5
|
-
memo << File.join(key[:options][:path],
|
11
|
+
memo << File.join(key[:options][:path], suffix) if affected[key]
|
6
12
|
memo
|
7
13
|
end
|
8
14
|
end
|
9
15
|
end
|
10
|
-
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cobratest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephan Hagemann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
33
|
+
version: '12.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
40
|
+
version: '12.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
94
|
version: '0'
|
95
95
|
requirements: []
|
96
96
|
rubyforge_project:
|
97
|
-
rubygems_version: 2.6.
|
97
|
+
rubygems_version: 2.6.13
|
98
98
|
signing_key:
|
99
99
|
specification_version: 4
|
100
100
|
summary: A test selector for your component-based Rails application
|