test_diff 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDg5NWQ4MmE3YzUzOGNlZDIwYjdkYTI3YzczNjJhM2VhNmE4NWM2MA==
4
+ ZjhjNGZlMzgzODhmN2M0ZjMxZTg5NWM5YTEyMGE4ZTMxOTZhMGQzMg==
5
5
  data.tar.gz: !binary |-
6
- MzJjODhhYjg5MmQ0NzNlMzcwNjA1NDE2MWVmYTY1NWE4ZTVmODNhNQ==
6
+ NTU0N2FmM2VlOTZiOGU3MWRlMGZjZjU3YmE3YzJiZmQ3MjY4YmZhNw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NGI0MjdlYjVhZWM2NjQ4ZTk5MmI4OGRiMzllOWY5Y2RhZGQ0YzFhY2UzYmMy
10
- OTU0MzA3OWZjNzk3NWUwOGY1MjE3ZTYxYmMyMmQwNDU4YjcyMTE0OTI0ZWUz
11
- OGVhOGQ4ZTBlZjE4OGEzZmQ5MzJmYWNjMTdiNmRmNjVjOTA1ZjQ=
9
+ OWZmMTEzMDdmNzcxN2UzOTc2YzdlMDg1MjdmNzVjMDFmNWQwOTg2MjA5MDJm
10
+ ZTA2MTFiNDk2MWZkZTNlZWVjMGVmNjFkODhlYjgwNGI5OGY0OTQwOTNjNGU2
11
+ M2RkMjExODFhOWU4M2IxYTgzYTk1NTY0OWJmYTcxMTdhZGRjNmE=
12
12
  data.tar.gz: !binary |-
13
- OTM0M2EzZmZjZjVlOTk1NTI1NTlkNTdmODA0MjlkYjQyNTQ1MDgxYTI0ODRk
14
- OTA5ZmMyNTY0NGYyNmE4Mjk0MGY3NzM1ZWEzODJlZTc5YmExYzBmMWY2NzVm
15
- MzlmYWNiYzNhODU4MTQwZTBhNWRjMzZjNjg3OGZmNGIwYzE5NTQ=
13
+ YmJiOWY1NTIxYjA1NDYzMWZhZTY3ZTNkZjI2MDBkNWRjYjg0ZmI2YjMwNDFi
14
+ YWJmNzk2NDM2NWY1Y2IwNDAwMjRkOGI3YzZhZjZjNWVlNjI4YTc1NzljNjY4
15
+ NTJjOTIzYWUzNzg1ZDJkZGIyMTdiMjUxY2Y5OGIwNWFlMDY2M2U=
data/Rakefile CHANGED
@@ -8,4 +8,4 @@ Rake::TestTask.new do |t|
8
8
  t.pattern = 'test/**/*_spec.rb'
9
9
  end
10
10
 
11
- task default: %w(rubocop test build)
11
+ task default: %w(test build rubocop)
data/lib/test_diff.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  require 'test_diff/version'
2
2
  require 'test_diff/storage'
3
+ require 'test_diff/test_info'
4
+ require 'test_diff/version_control/git'
5
+ require 'test_diff/test_runner/rspec'
6
+ require 'test_diff/config'
3
7
  require 'test_diff/build_coverage'
4
8
  require 'test_diff/run_diff'
5
9
  require 'test_diff/build_coverage_diff'
@@ -38,7 +38,6 @@ module TestDiff
38
38
 
39
39
  def run_batch
40
40
  puts "Running #{@batch_queue.size} tests"
41
- require 'spec'
42
41
  timing_thread = start_timing_thread(Time.now, @batch_queue.size)
43
42
  start
44
43
  timing_thread.join
@@ -76,8 +75,10 @@ module TestDiff
76
75
  ActiveRecord::Base.connection.reconnect! if defined?(ActiveRecord::Base)
77
76
  Time.zone_default = (Time.zone = 'UTC') if Time.respond_to?(:zone_default) && Time.zone_default.nil?
78
77
  # ARGV = ['-b',main_spec_file]
79
- if run_tests(main_spec_file)
80
- save_coverage_data(main_spec_file)
78
+ s = Time.now
79
+ result = run_tests(main_spec_file)
80
+ if result
81
+ save_coverage_data(main_spec_file, Time.now - s)
81
82
  else
82
83
  Coverage.result # disable coverage
83
84
  exit!(false) unless @continue
@@ -87,17 +88,21 @@ module TestDiff
87
88
  end
88
89
 
89
90
  def run_tests(main_spec_file)
90
- options ||= begin
91
- parser = ::Spec::Runner::OptionParser.new($stderr, $stdout)
92
- parser.order!(['-b', main_spec_file])
93
- parser.options
91
+ if defined?(::RSpec::Core::Runner)
92
+ ::RSpec::Core::Runner.run([main_spec_file], $stderr, $stdout) == 0
93
+ else
94
+ options ||= begin
95
+ parser = ::Spec::Runner::OptionParser.new($stderr, $stdout)
96
+ parser.order!(['-b', main_spec_file])
97
+ parser.options
98
+ end
99
+ Spec::Runner.use options
100
+ options.run_examples
94
101
  end
95
- Spec::Runner.use options
96
- options.run_examples
97
102
  end
98
103
 
99
- def save_coverage_data(main_spec_file)
100
- data = {}
104
+ def save_coverage_data(main_spec_file, execution_time)
105
+ data = { '__execution_time__' => execution_time }
101
106
  Coverage.result.each do |file_name, stats|
102
107
  relative_file_name = file_name.gsub("#{FileUtils.pwd}/", '')
103
108
  if file_name.include?(FileUtils.pwd)
@@ -0,0 +1,48 @@
1
+ require 'singleton'
2
+ # TestDiff module
3
+ module TestDiff
4
+ # Holds all the configuration details
5
+ class Config
6
+ include Singleton
7
+ attr_accessor :working_directory, :map_subfolder,
8
+ :current_tracking_filename, :test_pattern
9
+
10
+ attr_writer :test_runner, :version_control, :storage
11
+
12
+ def initialize
13
+ self.working_directory = '.'
14
+ self.map_subfolder = 'test_diff_coverage'
15
+ self.current_tracking_filename = 'sha'
16
+ self.test_pattern = /spec.rb\z/
17
+ end
18
+
19
+ def version_control
20
+ @version_control ||= VersionControl::Git.new(working_directory,
21
+ File.read(current_tracking_file))
22
+ end
23
+
24
+ def storage
25
+ @storage ||= Storage.new(map_folder)
26
+ end
27
+
28
+ def test_runner
29
+ @test_runner ||= TestRunner::Rspec.new
30
+ end
31
+
32
+ def map_folder
33
+ "#{working_directory}/#{map_subfolder}"
34
+ end
35
+
36
+ def current_tracking_file
37
+ "#{map_folder}/#{current_tracking_filename}"
38
+ end
39
+
40
+ def self.method_missing(method, *args)
41
+ if instance.respond_to?(method)
42
+ instance.send(method, *args)
43
+ else
44
+ super
45
+ end
46
+ end
47
+ end
48
+ end
@@ -2,13 +2,11 @@
2
2
  module TestDiff
3
3
  # Class used to calculate the tests than need to be run
4
4
  class RunDiff
5
- attr_reader :spec_folder, :sha1, :groups_of, :group
5
+ attr_reader :tests_folder, :groups_of, :group
6
6
 
7
- def initialize(spec_folder, groups_of, group)
8
- @spec_folder = spec_folder
9
- @sha1 = File.read('test_diff_coverage/sha')
10
- @specs_to_run = []
11
- @storage = Storage.new
7
+ def initialize(tests_folder, groups_of, group)
8
+ @tests_folder = tests_folder
9
+ @tests_to_run = []
12
10
  @groups_of = groups_of
13
11
  @group = group
14
12
  end
@@ -24,46 +22,41 @@ module TestDiff
24
22
  private
25
23
 
26
24
  def run_test_group
27
- if @specs_to_run.any?
28
- puts "bundle exec spec -fo #{@specs_to_run.join(' ')}"
29
- exec "bundle exec spec -fo #{@specs_to_run.join(' ')}"
30
- else
31
- puts 'no specs found to run'
32
- end
25
+ Config.test_runner.run_tests(@tests_to_run.map(&:filename))
33
26
  end
34
27
 
35
28
  def select_test_group
36
29
  return unless groups_of
37
- groups_size = (@specs_to_run.length / groups_of.to_f).ceil
38
- @specs_to_run = @specs_to_run.slice(group.to_i * groups_size, groups_size) || []
30
+ groups_size = (@tests_to_run.length / groups_of.to_f).ceil
31
+ @tests_to_run = @tests_to_run.slice(group.to_i * groups_size, groups_size) || []
39
32
  end
40
33
 
41
34
  def remove_tests_that_do_not_exist
42
- @specs_to_run.delete_if do |s|
43
- !File.exist?(s)
35
+ @tests_to_run.delete_if do |s|
36
+ !File.exist?("#{Config.working_directory}/#{s.filename}")
44
37
  end
45
38
  end
46
39
 
47
40
  def remove_tests_in_wrong_folder
48
- @specs_to_run.delete_if do |s|
49
- !s.start_with?("#{spec_folder}/")
41
+ @tests_to_run.delete_if do |s|
42
+ !s.filename.start_with?("#{tests_folder}/")
50
43
  end
51
44
  end
52
45
 
53
46
  def add_changed_files
54
- _build_specs_to_run
47
+ _build_tests_to_run
55
48
 
56
- @specs_to_run.flatten!
57
- @specs_to_run.sort!
58
- @specs_to_run.uniq!
49
+ @tests_to_run.flatten!
50
+ @tests_to_run.sort!
51
+ @tests_to_run.uniq!
59
52
  end
60
53
 
61
- def _build_specs_to_run
54
+ def _build_tests_to_run
62
55
  files = []
63
- `git diff --name-only #{sha1} HEAD`.split("\n").each do |file_name|
64
- if file_name.end_with?('spec.rb') || file_name.end_with?('test.rb')
65
- @specs_to_run << file_name
66
- elsif !file_name.start_with?(@storage.folder)
56
+ Config.version_control.changed_files.each do |file_name|
57
+ if Config.test_pattern.match(file_name)
58
+ @tests_to_run << Config.storage.test_info_for(file_name)
59
+ elsif !file_name.start_with?(@tests_folder)
67
60
  files << file_name
68
61
  _add_rails_view_spec(file_name)
69
62
  end
@@ -72,15 +65,15 @@ module TestDiff
72
65
  end
73
66
 
74
67
  def _add_calculated_tests(files)
75
- @specs_to_run << @storage.find_for(files, spec_folder)
68
+ @tests_to_run << Config.storage.select_tests_for(files, tests_folder)
76
69
  end
77
70
 
78
71
  def _add_rails_view_spec(file_name)
79
72
  # try and find a matching view spec
80
73
  return unless file_name.include?('app/views')
81
- view_spec_name = file_name.gsub('app/views', "#{spec_folder}/views").gsub('.erb', '.erb_spec.rb')
74
+ view_spec_name = file_name.gsub('app/views', "#{tests_folder}/views").gsub('.erb', '.erb_spec.rb')
82
75
  return unless File.exist?(view_spec_name)
83
- @specs_to_run << view_spec_name
76
+ @tests_to_run << view_spec_name
84
77
  end
85
78
  end
86
79
  end
@@ -41,6 +41,27 @@ module TestDiff
41
41
  results
42
42
  end
43
43
 
44
+ def select_tests_for(files, sub_folder = nil)
45
+ results = []
46
+ root_folder = @folder
47
+ root_folder += "/#{sub_folder}" if sub_folder
48
+ Dir["#{root_folder}/**/*.yml"].each do |storage_file|
49
+ select_tests_for_storage_file(results, storage_file, files)
50
+ end
51
+ results
52
+ end
53
+
54
+ def test_info_for(file)
55
+ result = TestInfo.new(file, nil)
56
+ YAML::Store.new("#{file}.yml").transaction(true) do |store|
57
+ result = TestInfo.new(file, store['__execution_time__'])
58
+ end
59
+ result
60
+ rescue PStore::Error => e
61
+ STDERR.puts e.message
62
+ result
63
+ end
64
+
44
65
  def clear
45
66
  Dir["#{@folder}/**/*.yml"].each do |storage_file|
46
67
  File.delete(storage_file)
@@ -60,6 +81,19 @@ module TestDiff
60
81
  end
61
82
  end
62
83
 
84
+ def select_tests_for_storage_file(results, storage_file, files)
85
+ YAML::Store.new(storage_file).transaction(true) do |store|
86
+ found_files = files & store.roots
87
+ found_files.each do |file|
88
+ next unless _active_file?(store[file])
89
+ results << TestInfo.new(
90
+ storage_file.gsub('.yml', '').gsub("#{@folder}/", ''),
91
+ store['__execution_time__']
92
+ )
93
+ end
94
+ end
95
+ end
96
+
63
97
  def _active_file?(file)
64
98
  !file.to_s.split(',').delete_if { |s| s == '' || s == '0' }.empty?
65
99
  end
@@ -0,0 +1,26 @@
1
+ # TestDiff module
2
+ module TestDiff
3
+ # class used to hold infomation about the test
4
+ class TestInfo
5
+ include Comparable
6
+ attr_reader :execution_time, :filename
7
+ FIXNUM_MAX = (2**(0.size * 8 - 2) - 1)
8
+
9
+ def initialize(f, et)
10
+ @filename = f
11
+ @execution_time = et
12
+ end
13
+
14
+ def compare_execution_time
15
+ @execution_time || FIXNUM_MAX
16
+ end
17
+
18
+ def <=>(other)
19
+ if compare_execution_time == other.compare_execution_time
20
+ filename <=> other.filename
21
+ else
22
+ compare_execution_time <=> other.compare_execution_time
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ require 'git'
2
+ # TestDiff module
3
+ module TestDiff
4
+ # module for test runners
5
+ module TestRunner
6
+ # class to run rspec tests
7
+ class Rspec
8
+ def run_tests(specs)
9
+ if specs.any?
10
+ puts "bundle exec rspec #{specs.join(' ')}"
11
+ exec "bundle exec rspec #{specs.join(' ')}"
12
+ else
13
+ puts 'no specs found to run'
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ require 'git'
2
+ # TestDiff module
3
+ module TestDiff
4
+ # module for test runners
5
+ module TestRunner
6
+ # class to run rspec tests
7
+ class Spec
8
+ def run_tests(specs)
9
+ if specs.any?
10
+ puts "bundle exec spec #{specs.join(' ')}"
11
+ exec "bundle exec spec #{specs.join(' ')}"
12
+ else
13
+ puts 'no specs found to run'
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,4 +1,4 @@
1
1
  # version number
2
2
  module TestDiff
3
- VERSION = '0.2.0'
3
+ VERSION = '0.3.0'
4
4
  end
@@ -0,0 +1,19 @@
1
+ require 'git'
2
+ # TestDiff module
3
+ module TestDiff
4
+ # module for version control adapters
5
+ module VersionControl
6
+ # class to find changed files for git
7
+ class Git
8
+ def initialize(wd, last_tracked, current = 'HEAD')
9
+ @git = ::Git.open(wd)
10
+ @last_tracked = last_tracked
11
+ @current = current
12
+ end
13
+
14
+ def changed_files
15
+ @git.diff(@last_tracked, @current).map(&:path)
16
+ end
17
+ end
18
+ end
19
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test_diff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Grant Speelman
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-03-27 00:00:00.000000000 Z
11
+ date: 2015-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -131,10 +131,15 @@ files:
131
131
  - lib/test_diff.rb
132
132
  - lib/test_diff/build_coverage.rb
133
133
  - lib/test_diff/build_coverage_diff.rb
134
+ - lib/test_diff/config.rb
134
135
  - lib/test_diff/run_diff.rb
135
136
  - lib/test_diff/storage.rb
137
+ - lib/test_diff/test_info.rb
138
+ - lib/test_diff/test_runner/rspec.rb
139
+ - lib/test_diff/test_runner/spec.rb
136
140
  - lib/test_diff/track_build.rb
137
141
  - lib/test_diff/version.rb
142
+ - lib/test_diff/version_control/git.rb
138
143
  - test_diff.gemspec
139
144
  homepage: https://github.com/grantspeelman/test_diff
140
145
  licenses: