test_diff 0.2.0 → 0.3.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 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: