koine-test_runner 0.1.0.pre.delete → 0.1.1
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 +5 -5
- data/.gitignore +1 -0
- data/.rubocop.yml +50 -0
- data/.travis.yml +10 -1
- data/README.md +20 -14
- data/Rakefile +3 -3
- data/bin/console +3 -3
- data/config/default.yml +16 -0
- data/exe/run_test +9 -0
- data/integration_test.sh +9 -0
- data/koine-test_runner.gemspec +19 -19
- data/lib/koine/test_runner.rb +33 -2
- data/lib/koine/test_runner/adapters.rb +23 -0
- data/lib/koine/test_runner/adapters/base_adapter.rb +55 -0
- data/lib/koine/test_runner/adapters/base_regexp_adapter.rb +17 -0
- data/lib/koine/test_runner/adapters/last_command_adapter.rb +44 -0
- data/lib/koine/test_runner/adapters/null_adapter.rb +11 -0
- data/lib/koine/test_runner/adapters/phpunit.rb +37 -0
- data/lib/koine/test_runner/adapters/rspec.rb +19 -0
- data/lib/koine/test_runner/builder.rb +48 -0
- data/lib/koine/test_runner/command_executer.rb +20 -0
- data/lib/koine/test_runner/configuration.rb +70 -0
- data/lib/koine/test_runner/file_matcher.rb +23 -0
- data/lib/koine/test_runner/version.rb +2 -2
- data/tests/integration_tests.sh +12 -0
- metadata +49 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9ec65d3c6a1db49c56ceea5afb66ee6b8398f3a94849e2833c7d547eb44ae735
|
4
|
+
data.tar.gz: d68aced56021535a0ba39c885903f4a2e5d498781e361540594cded8ff70093b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d923060a8fa002b2355e0bce237c714896bc5cdb3093b68adab680e12584e25f017097212864419f4770cb920d1998f3ac9b419ee42f9c694c762df3e6248ac
|
7
|
+
data.tar.gz: fde040a024de8232e46eea1db6f27e29e1bc2c1ccb473ac4dc1d1faae9a6b1291b615bdafe2fe5173f771c432c4440fff3ee98e8d01f70c995dc1b0d5e61c368
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
Lint/AmbiguousBlockAssociation:
|
2
|
+
Enabled: false
|
3
|
+
|
4
|
+
Metrics/BlockLength:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Metrics/LineLength:
|
8
|
+
Max: 100
|
9
|
+
|
10
|
+
Metrics/ClassLength:
|
11
|
+
CountComments: false
|
12
|
+
Max: 250
|
13
|
+
|
14
|
+
Metrics/MethodLength:
|
15
|
+
CountComments: false
|
16
|
+
Max: 30
|
17
|
+
|
18
|
+
Metrics/CyclomaticComplexity:
|
19
|
+
Max: 7
|
20
|
+
|
21
|
+
Style/GuardClause:
|
22
|
+
Enabled: false
|
23
|
+
|
24
|
+
Style/IfUnlessModifier:
|
25
|
+
Enabled: false
|
26
|
+
|
27
|
+
Style/PredicateName:
|
28
|
+
NamePrefix:
|
29
|
+
- is_
|
30
|
+
- has_
|
31
|
+
|
32
|
+
NamePrefixBlacklist:
|
33
|
+
- is_
|
34
|
+
- has_
|
35
|
+
|
36
|
+
Metrics/AbcSize:
|
37
|
+
Max: 45
|
38
|
+
|
39
|
+
Metrics/PerceivedComplexity:
|
40
|
+
Max: 10
|
41
|
+
|
42
|
+
Documentation:
|
43
|
+
Enabled: false
|
44
|
+
|
45
|
+
AllCops:
|
46
|
+
Exclude:
|
47
|
+
- Gemfile
|
48
|
+
|
49
|
+
Style/ExtraSpacing:
|
50
|
+
AllowForAlignment: true
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -2,9 +2,8 @@
|
|
2
2
|
|
3
3
|
Easy test runner customization
|
4
4
|
|
5
|
-
[](https://travis-ci.org/mjacobus/
|
5
|
+
[](https://travis-ci.org/mjacobus/test_runner)
|
6
6
|
[](https://coveralls.io/github/mjacobus/test_runner?branch=master)
|
7
|
-
[](https://scrutinizer-ci.com/g/mjacobus/test_runner/?branch=master)
|
8
7
|
[](https://codeclimate.com/github/mjacobus/test_runner)
|
9
8
|
[](https://codeclimate.com/github/mjacobus/test_runner)
|
10
9
|
|
@@ -34,7 +33,7 @@ bundle exec run_test some/file_spec.rb --line=55
|
|
34
33
|
bundle exec run_test some/file.php
|
35
34
|
|
36
35
|
# unknown file
|
37
|
-
bundle exec run_test some/file_spec.custom
|
36
|
+
bundle exec run_test some/file_spec.custom
|
38
37
|
# => error: No test runner found for file 'some/file_spec.custom'
|
39
38
|
```
|
40
39
|
|
@@ -76,18 +75,11 @@ module My
|
|
76
75
|
@suffix = suffix
|
77
76
|
end
|
78
77
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
def test_command_for_file(file_path: line: nil)
|
84
|
-
cmd = ["/usr/bin/my_test --file=#{file_path}"]
|
85
|
-
|
86
|
-
if line
|
87
|
-
cmd << "--line=#{line}"
|
78
|
+
# return nil if you do not want to deal with it
|
79
|
+
def test_command(config)
|
80
|
+
if config.file_path.end_with?(@suffix)
|
81
|
+
return "./bin/test #{config.file_path}"
|
88
82
|
end
|
89
|
-
|
90
|
-
cmd.join(' ')
|
91
83
|
end
|
92
84
|
end
|
93
85
|
end
|
@@ -99,6 +91,20 @@ Now you can run:
|
|
99
91
|
bundle exec run_test some/file_spec.custom
|
100
92
|
```
|
101
93
|
|
94
|
+
## Running the last test
|
95
|
+
|
96
|
+
Either run a file that does not get caught by any adapter
|
97
|
+
|
98
|
+
```bash
|
99
|
+
bundle exec run_test some/file_spec.unkown # run last test
|
100
|
+
```
|
101
|
+
|
102
|
+
Or
|
103
|
+
|
104
|
+
```bash
|
105
|
+
bundle exec run_test --last
|
106
|
+
```
|
107
|
+
|
102
108
|
## Development
|
103
109
|
|
104
110
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'test_runner'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "test_runner"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start(__FILE__)
|
data/config/default.yml
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
adapters:
|
2
|
+
rspec:
|
3
|
+
adapter: rspec
|
4
|
+
file_pattern: ".*_spec.rb$"
|
5
|
+
|
6
|
+
phpunit:
|
7
|
+
adapter: phpunit
|
8
|
+
file_pattern: ".*Test.php$"
|
9
|
+
#
|
10
|
+
# codeception:
|
11
|
+
# adapter: Koine\TestRunner\Adapter\Php\Codeception
|
12
|
+
# file_pattern: "*Spec.php"
|
13
|
+
#
|
14
|
+
# jest:
|
15
|
+
# adapter: Koine\TestRunner\Adapter\Javascript\Jest
|
16
|
+
# file_pattern: "*_(test|spec).(js|jsx)"
|
data/exe/run_test
ADDED
data/integration_test.sh
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
set -v
|
5
|
+
|
6
|
+
./exe/run_test spec/fixtures/FixturePhpUnitTest.php --line=30
|
7
|
+
./exe/run_test spec/koine/test_runner_spec.rb
|
8
|
+
./exe/run_test spec/koine/test_runner_spec.rb --line=9
|
9
|
+
./exe/run_test spec/koine/test_runner_spec.rb --all
|
data/koine-test_runner.gemspec
CHANGED
@@ -1,39 +1,39 @@
|
|
1
|
-
# coding: utf-8
|
2
1
|
lib = File.expand_path('../lib', __FILE__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
|
5
4
|
require 'koine/test_runner'
|
6
5
|
|
7
6
|
Gem::Specification.new do |spec|
|
8
|
-
spec.name =
|
7
|
+
spec.name = 'koine-test_runner'
|
9
8
|
spec.version = TestRunner::VERSION
|
10
|
-
spec.authors = [
|
11
|
-
spec.email = [
|
9
|
+
spec.authors = ['Marcelo Jacobus']
|
10
|
+
spec.email = ['marcelo.jacobus@gmail.com']
|
12
11
|
|
13
|
-
spec.summary =
|
14
|
-
spec.description =
|
15
|
-
spec.homepage =
|
16
|
-
spec.license =
|
12
|
+
spec.summary = 'Easy test runner'
|
13
|
+
spec.description = 'Easy test runner'
|
14
|
+
spec.homepage = 'https://github.com/mjacobus/test_runner'
|
15
|
+
spec.license = 'MIT'
|
17
16
|
|
18
17
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
19
18
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
20
19
|
if spec.respond_to?(:metadata)
|
21
|
-
spec.metadata['allowed_push_host'] =
|
20
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
22
21
|
else
|
23
|
-
raise
|
24
|
-
|
22
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
23
|
+
'public gem pushes.'
|
25
24
|
end
|
26
25
|
|
27
|
-
spec.files
|
26
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
28
27
|
f.match(%r{^(test|spec|features)/})
|
29
28
|
end
|
30
|
-
spec.bindir =
|
29
|
+
spec.bindir = 'exe'
|
31
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
32
|
-
spec.require_paths = [
|
31
|
+
spec.require_paths = ['lib']
|
33
32
|
|
34
|
-
spec.add_development_dependency
|
35
|
-
spec.add_development_dependency
|
36
|
-
spec.add_development_dependency
|
37
|
-
spec.add_development_dependency
|
38
|
-
spec.add_development_dependency
|
33
|
+
spec.add_development_dependency 'bundler', '~> 1.14'
|
34
|
+
spec.add_development_dependency 'coveralls', '~> 0.8.21'
|
35
|
+
spec.add_development_dependency 'object_comparator', '~> 0.1.3'
|
36
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
37
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
38
|
+
spec.add_development_dependency 'simplecov', '~> 0.14.1'
|
39
39
|
end
|
data/lib/koine/test_runner.rb
CHANGED
@@ -1,4 +1,35 @@
|
|
1
|
-
require
|
1
|
+
require 'koine/test_runner/version'
|
2
|
+
require 'koine/test_runner/command_executer'
|
3
|
+
require 'koine/test_runner/configuration'
|
4
|
+
require 'koine/test_runner/builder'
|
5
|
+
require 'koine/test_runner/adapters'
|
6
|
+
require 'koine/test_runner/adapters/base_adapter'
|
7
|
+
require 'koine/test_runner/adapters/null_adapter'
|
8
|
+
require 'koine/test_runner/adapters/last_command_adapter'
|
2
9
|
|
3
|
-
module
|
10
|
+
module Koine
|
11
|
+
class TestRunner
|
12
|
+
autoload :FileMatcher, 'koine/test_runner/file_matcher'
|
13
|
+
|
14
|
+
class Adapters
|
15
|
+
autoload :BaseRegexpAdapter, 'koine/test_runner/adapters/base_regexp_adapter'
|
16
|
+
autoload :Rspec, 'koine/test_runner/adapters/rspec'
|
17
|
+
autoload :Phpunit, 'koine/test_runner/adapters/phpunit'
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(adapters = [])
|
21
|
+
@adapters = Adapters.new(adapters)
|
22
|
+
end
|
23
|
+
|
24
|
+
def run(configuration)
|
25
|
+
test_command = @adapters.test_command(configuration)
|
26
|
+
executer = CommandExecuter.new
|
27
|
+
|
28
|
+
if test_command
|
29
|
+
return executer.execute_and_exit(test_command)
|
30
|
+
end
|
31
|
+
|
32
|
+
executer.fail('No tests run')
|
33
|
+
end
|
34
|
+
end
|
4
35
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Koine
|
2
|
+
class TestRunner
|
3
|
+
class Adapters
|
4
|
+
def initialize(adapters = [], fallback: LastCommandAdapter.new)
|
5
|
+
adapters = adapters.dup
|
6
|
+
|
7
|
+
adapters.unshift(fallback)
|
8
|
+
adapters.push(Adapters::NullAdapter.new)
|
9
|
+
|
10
|
+
adapters.inject do |previous, adapter|
|
11
|
+
previous.next_adapter = adapter
|
12
|
+
adapter
|
13
|
+
end
|
14
|
+
|
15
|
+
@chain = adapters.first
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_command(config)
|
19
|
+
@chain.test_command(config)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Koine
|
2
|
+
class TestRunner
|
3
|
+
class Adapters
|
4
|
+
class BaseAdapter
|
5
|
+
# attr_writer :next_adapter
|
6
|
+
|
7
|
+
def next_adapter=(adapter)
|
8
|
+
@next_adapter = adapter
|
9
|
+
end
|
10
|
+
|
11
|
+
def next_adapter
|
12
|
+
@next_adapter || raise("next_adapter is not set for #{self.class}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_command(config)
|
16
|
+
unless accept?(config)
|
17
|
+
return next_adapter.test_command(config)
|
18
|
+
end
|
19
|
+
|
20
|
+
if config.all?
|
21
|
+
return all_tests(config)
|
22
|
+
end
|
23
|
+
|
24
|
+
if config.line?
|
25
|
+
return file_line_command(config)
|
26
|
+
end
|
27
|
+
|
28
|
+
single_file_command(config)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def accept?(_config)
|
34
|
+
false
|
35
|
+
end
|
36
|
+
|
37
|
+
def all_tests(config)
|
38
|
+
script_for(config)
|
39
|
+
end
|
40
|
+
|
41
|
+
def file_line_command(config)
|
42
|
+
[single_file_command(config), config.line].join(':')
|
43
|
+
end
|
44
|
+
|
45
|
+
def single_file_command(config)
|
46
|
+
[script_for(config), config.file_path].join(' ')
|
47
|
+
end
|
48
|
+
|
49
|
+
def script_for(_config)
|
50
|
+
raise 'Not implemented'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Koine
|
2
|
+
class TestRunner
|
3
|
+
class Adapters
|
4
|
+
class BaseRegexpAdapter < BaseAdapter
|
5
|
+
def initialize(file_pattern:)
|
6
|
+
@file_pattern = file_pattern.is_a?(Regexp) ? file_pattern : Regexp.new(file_pattern)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def accept?(config)
|
12
|
+
!@file_pattern.match(config.file_path).nil?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Koine
|
2
|
+
class TestRunner
|
3
|
+
class Adapters
|
4
|
+
class LastCommandAdapter < BaseAdapter
|
5
|
+
def initialize(storage: Storage.new)
|
6
|
+
@storage = storage
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_command(config)
|
10
|
+
command = next_adapter.test_command(config)
|
11
|
+
|
12
|
+
unless command
|
13
|
+
return @storage.retrieve
|
14
|
+
end
|
15
|
+
|
16
|
+
@storage.store(command)
|
17
|
+
command
|
18
|
+
end
|
19
|
+
|
20
|
+
class Storage
|
21
|
+
def initialize(file_path: '.cache/koine/last-test-command.cache')
|
22
|
+
@file_path = file_path
|
23
|
+
end
|
24
|
+
|
25
|
+
def retrieve
|
26
|
+
if File.exist?(@file_path)
|
27
|
+
File.read(@file_path).strip
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def store(value)
|
32
|
+
folder = File.dirname(@file_path)
|
33
|
+
|
34
|
+
unless File.exist?(folder)
|
35
|
+
FileUtils.mkdir_p(folder)
|
36
|
+
end
|
37
|
+
|
38
|
+
File.open(@file_path, 'w') { |f| f.puts(value) }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Koine
|
2
|
+
class TestRunner
|
3
|
+
class Adapters
|
4
|
+
class Phpunit < BaseRegexpAdapter
|
5
|
+
DEFAULT_OPTIONS = [
|
6
|
+
'--color'
|
7
|
+
].freeze
|
8
|
+
|
9
|
+
def initialize(file_pattern: /.*Test.php$/, options: nil)
|
10
|
+
super(file_pattern: file_pattern)
|
11
|
+
@options = Array(options || DEFAULT_OPTIONS)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def file_line_command(config)
|
17
|
+
regexp = /public function ([^\(]+)/
|
18
|
+
matcher = FileMatcher.new(file_path: config.file_path)
|
19
|
+
match = matcher.above_line(config.line, regexp: regexp)[1]
|
20
|
+
[single_file_command(config), '--filter', "'/\\b#{match}\\b/'"].join(' ')
|
21
|
+
end
|
22
|
+
|
23
|
+
def script_for(_config)
|
24
|
+
if File.exist?('vendor/bin/phpunit')
|
25
|
+
return with_options('./vendor/bin/phpunit')
|
26
|
+
end
|
27
|
+
|
28
|
+
with_options('phpunit')
|
29
|
+
end
|
30
|
+
|
31
|
+
def with_options(script)
|
32
|
+
[script, @options].flatten.join(' ')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Koine
|
2
|
+
class TestRunner
|
3
|
+
class Adapters
|
4
|
+
class Rspec < BaseRegexpAdapter
|
5
|
+
def initialize(file_pattern: /.*_spec.rb$/)
|
6
|
+
super(file_pattern: file_pattern)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def script_for(_config)
|
12
|
+
return './bin/rspec' if File.exist?('bin/rspec')
|
13
|
+
|
14
|
+
'bundle exec rspec'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Koine
|
4
|
+
class TestRunner
|
5
|
+
class Builder
|
6
|
+
def initialize(arguments)
|
7
|
+
initialize_from_yaml_config(arguments.config_file)
|
8
|
+
end
|
9
|
+
|
10
|
+
def build
|
11
|
+
TestRunner.new(@adapters)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def initialize_from_yaml_config(config_file)
|
17
|
+
config = YAML.load_file(config_file)
|
18
|
+
|
19
|
+
@adapters = config['adapters'].map do |adapter_config|
|
20
|
+
build_adapter(adapter_config.last)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def build_adapter(config)
|
25
|
+
adapter = config.delete('adapter')
|
26
|
+
|
27
|
+
if adapter.downcase == adapter.to_s
|
28
|
+
adapter_class = "Koine::TestRunner::Adapters::#{adapter.capitalize}"
|
29
|
+
end
|
30
|
+
|
31
|
+
unless Object.const_defined?(adapter_class)
|
32
|
+
raise ArgumentError, "Cannot locate adapter #{adapter} => #{adapter_class}"
|
33
|
+
end
|
34
|
+
|
35
|
+
klass = Object.const_get(adapter_class)
|
36
|
+
klass.new(symbolize_keys(config))
|
37
|
+
end
|
38
|
+
|
39
|
+
def symbolize_keys(hash)
|
40
|
+
{}.tap do |new_hash|
|
41
|
+
hash.each do |key, value|
|
42
|
+
new_hash[key.to_sym] = value
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Koine
|
2
|
+
class TestRunner
|
3
|
+
class CommandExecuter
|
4
|
+
def execute(command)
|
5
|
+
system(command.to_s)
|
6
|
+
$?.exitstatus
|
7
|
+
end
|
8
|
+
|
9
|
+
def fail(reason)
|
10
|
+
puts reason
|
11
|
+
exit(1)
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute_and_exit(command)
|
15
|
+
puts command
|
16
|
+
exit(execute(command))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Koine
|
2
|
+
class TestRunner
|
3
|
+
class Configuration
|
4
|
+
attr_reader :file_path
|
5
|
+
|
6
|
+
def initialize(attributes = [])
|
7
|
+
initialize_options(attributes.dup)
|
8
|
+
initialize_attributes(attributes.dup)
|
9
|
+
end
|
10
|
+
|
11
|
+
def line
|
12
|
+
@options[:line].to_i if line?
|
13
|
+
end
|
14
|
+
|
15
|
+
def line?
|
16
|
+
@options[:line].to_s.tr('true', '').strip != ''
|
17
|
+
end
|
18
|
+
|
19
|
+
def all?
|
20
|
+
@options[:all]
|
21
|
+
end
|
22
|
+
|
23
|
+
def last?
|
24
|
+
@options[:last]
|
25
|
+
end
|
26
|
+
|
27
|
+
def config_file
|
28
|
+
return @options[:config_file] if @options[:config_file]
|
29
|
+
return '.test_runner.yml' if File.exist?('.test_runner.yml')
|
30
|
+
File.expand_path('../../../../config/default.yml', __FILE__)
|
31
|
+
end
|
32
|
+
|
33
|
+
def run_options
|
34
|
+
{ file_path: file_path, line: line }
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def initialize_attributes(arguments)
|
40
|
+
@file_path = arguments.reject { |arg| arg =~ /^--/ }.shift
|
41
|
+
|
42
|
+
if require_file_name? && @file_path.nil?
|
43
|
+
raise ArgumentError, 'file name was not given'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def require_file_name?
|
48
|
+
!last?
|
49
|
+
end
|
50
|
+
|
51
|
+
def initialize_options(data)
|
52
|
+
@options = { all: false }
|
53
|
+
|
54
|
+
data = data.select { |arg| arg =~ /^--([a-z-]+)/ }.map do |arg|
|
55
|
+
arg.split('--').last.split('=')
|
56
|
+
end
|
57
|
+
|
58
|
+
data.each do |values|
|
59
|
+
key = values.first
|
60
|
+
value = values.length == 2 ? values.last : true
|
61
|
+
@options[normalize_key(key)] = value
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def normalize_key(key)
|
66
|
+
key.tr('-', '_').to_sym
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Koine
|
2
|
+
class TestRunner
|
3
|
+
class FileMatcher
|
4
|
+
NoMatchError = Class.new(RuntimeError)
|
5
|
+
|
6
|
+
def initialize(file_path:)
|
7
|
+
@lines = File.readlines(file_path)
|
8
|
+
end
|
9
|
+
|
10
|
+
def above_line(line, regexp:)
|
11
|
+
length = @lines.length
|
12
|
+
slice = length - line
|
13
|
+
lines = @lines.reverse.slice(slice, length)
|
14
|
+
lines.each do |line|
|
15
|
+
match = regexp.match(line)
|
16
|
+
return match if match
|
17
|
+
end
|
18
|
+
|
19
|
+
raise NoMatchError
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION =
|
1
|
+
class TestRunner
|
2
|
+
VERSION = '0.1.1'.freeze
|
3
3
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
set -v
|
5
|
+
|
6
|
+
export SKIP_COVERAGE='true'
|
7
|
+
|
8
|
+
./exe/run_test spec/fixtures/FixturePhpUnitTest.php --line=30
|
9
|
+
./exe/run_test spec/koine/test_runner_spec.rb
|
10
|
+
./exe/run_test spec/koine/test_runner_spec.rb --line=9
|
11
|
+
./exe/run_test spec/koine/test_runner_spec.rb --last
|
12
|
+
./exe/run_test spec/koine/test_runner_spec.rb --all
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: koine-test_runner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcelo Jacobus
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -25,70 +25,86 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.14'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: coveralls
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.8.21
|
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:
|
40
|
+
version: 0.8.21
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: object_comparator
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.1.3
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 0.1.3
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0
|
61
|
+
version: '10.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0
|
68
|
+
version: '10.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0
|
75
|
+
version: '3.0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0
|
82
|
+
version: '3.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: simplecov
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.14.1
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.14.1
|
83
97
|
description: Easy test runner
|
84
98
|
email:
|
85
99
|
- marcelo.jacobus@gmail.com
|
86
|
-
executables:
|
100
|
+
executables:
|
101
|
+
- run_test
|
87
102
|
extensions: []
|
88
103
|
extra_rdoc_files: []
|
89
104
|
files:
|
90
105
|
- ".gitignore"
|
91
106
|
- ".rspec"
|
107
|
+
- ".rubocop.yml"
|
92
108
|
- ".travis.yml"
|
93
109
|
- CODE_OF_CONDUCT.md
|
94
110
|
- Gemfile
|
@@ -97,9 +113,24 @@ files:
|
|
97
113
|
- Rakefile
|
98
114
|
- bin/console
|
99
115
|
- bin/setup
|
116
|
+
- config/default.yml
|
117
|
+
- exe/run_test
|
118
|
+
- integration_test.sh
|
100
119
|
- koine-test_runner.gemspec
|
101
120
|
- lib/koine/test_runner.rb
|
121
|
+
- lib/koine/test_runner/adapters.rb
|
122
|
+
- lib/koine/test_runner/adapters/base_adapter.rb
|
123
|
+
- lib/koine/test_runner/adapters/base_regexp_adapter.rb
|
124
|
+
- lib/koine/test_runner/adapters/last_command_adapter.rb
|
125
|
+
- lib/koine/test_runner/adapters/null_adapter.rb
|
126
|
+
- lib/koine/test_runner/adapters/phpunit.rb
|
127
|
+
- lib/koine/test_runner/adapters/rspec.rb
|
128
|
+
- lib/koine/test_runner/builder.rb
|
129
|
+
- lib/koine/test_runner/command_executer.rb
|
130
|
+
- lib/koine/test_runner/configuration.rb
|
131
|
+
- lib/koine/test_runner/file_matcher.rb
|
102
132
|
- lib/koine/test_runner/version.rb
|
133
|
+
- tests/integration_tests.sh
|
103
134
|
homepage: https://github.com/mjacobus/test_runner
|
104
135
|
licenses:
|
105
136
|
- MIT
|
@@ -116,12 +147,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
147
|
version: '0'
|
117
148
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
149
|
requirements:
|
119
|
-
- - "
|
150
|
+
- - ">="
|
120
151
|
- !ruby/object:Gem::Version
|
121
|
-
version:
|
152
|
+
version: '0'
|
122
153
|
requirements: []
|
123
154
|
rubyforge_project:
|
124
|
-
rubygems_version: 2.6
|
155
|
+
rubygems_version: 2.7.6
|
125
156
|
signing_key:
|
126
157
|
specification_version: 4
|
127
158
|
summary: Easy test runner
|