minitest-bisect 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6a2f0e5308b623a3bd5ba94ef584fec183e7dd51
4
- data.tar.gz: 62eb672d93534aee515afcbf939b01d01fff7ba3
3
+ metadata.gz: 0a69c4cd04993faef276a75c10d66a9661380664
4
+ data.tar.gz: 1b98b09d3cbca5bdb4001824ea63482d9b64f688
5
5
  SHA512:
6
- metadata.gz: ded844dfc9c7dffd7a598b6a2a5fc7a3dd2de11d7091856b508e303a3f1f366797df0dcbe9e1aaa1fa8eec0002f6d460a682878463624ca9b80656671bc0fdac
7
- data.tar.gz: bffd131f915c60ed1e2185f957ffb6ac523008690b49c2a03786f9ba29c0c20a2720aad6c5090f2a8dd3d99a17ee8acd4b663f79718486dff902360d2f82d22a
6
+ metadata.gz: 1f5723f2eacf4adb6ed59f802210119793c8ac36f6cbb3dc1396bc6e0530b2a29883be75a37ba3fd8899d56473b558be5a80ff20308703ef9885ac53234505ca
7
+ data.tar.gz: ce36d7e6111c168c852d1f070c855c541bf74b0b26af21a661649645d904c78baa534d2967ab1b99afc6eed4726eeaae5dec4c508212973608ed4e4a3e4593c2
Binary file
data.tar.gz.sig CHANGED
@@ -1,2 +1,4 @@
1
- ���
2
- �ۗgEc�m1��x���wN���H��$��*Y���j���� W����N.���S`{J��\��:���X7���ru���Z�vѵ��'���`~�ESu铱�j9顅6�2�S������=ȸ��[k�j�vd�u+�n����
3
- ��n��9;`� n���'=x�e7<\�K������]��6����4y �cP]�(?>��|Qq����&jo�;7���L��WU��8\i��@3UMuM
1
+ g�&z楛Ěq�=#�A�����f3w�=ը)��2)>S��B����BÏB����.�?o�U�
2
+ @N��;����9v{IG�үp�Y@d��k�\��ͭ��g:b���R�Z����qCo7{X��N��G��e��9gn_Q��:�bH
3
+ f2'�I���01C�
4
+ ��qW&���2n��a�E���Wy]d콈�ǽD̷d���Rm?�n~�<Q�_���
@@ -1,3 +1,18 @@
1
+ === 1.1.0 / 2014-09-08
2
+
3
+ * 4 minor enhancements:
4
+
5
+ * Added MTB_DEBUG env var to add debugging output to bisect trials.
6
+ * Added MTB_VERBOSE env var to show test output.
7
+ * Remove `--server ###` from final repro to make it easer to copy/paste/debug.
8
+ * Removed `-s` option. Now only `--server` remains to be unambiguous.
9
+
10
+ * 3 bug fixes:
11
+
12
+ * Accidentally left in -v while I was debugging something.
13
+ * Reject skips in culprit accounting.
14
+ * Switched to manual escaping of regexp. Shellwords was horribly overzealous.
15
+
1
16
  === 1.0.0 / 2014-07-16
2
17
 
3
18
  * 1 major enhancement
@@ -3,8 +3,9 @@ require "minitest/server"
3
3
  require "shellwords"
4
4
 
5
5
  class Minitest::Bisect
6
- VERSION = "1.0.0"
7
- SHH = " &> /dev/null"
6
+ VERSION = "1.1.0"
7
+
8
+ SHH = ENV["MTB_VERBOSE"].to_i >= 2 ? nil : " &> /dev/null"
8
9
 
9
10
  attr_accessor :tainted, :failures, :culprits, :mode, :seen_bad
10
11
  alias :tainted? :tainted
@@ -33,7 +34,7 @@ class Minitest::Bisect
33
34
  if :until_I_have_negative_filtering_in_minitest then
34
35
  files, flags = files.partition { |arg| File.file? arg }
35
36
  rb_flags, mt_flags = flags.partition { |arg| arg =~ /^-I/ }
36
- mt_flags += ["-s", $$]
37
+ mt_flags += ["--server", $$]
37
38
 
38
39
  cmd = bisect_methods build_files_cmd(files, rb_flags, mt_flags)
39
40
  else
@@ -43,7 +44,7 @@ class Minitest::Bisect
43
44
  puts "Final reproduction:"
44
45
  puts
45
46
 
46
- system cmd
47
+ system cmd.sub(/--server \d+/, "")
47
48
  ensure
48
49
  Minitest::Server.stop
49
50
  end
@@ -53,7 +54,7 @@ class Minitest::Bisect
53
54
 
54
55
  files, flags = files.partition { |arg| File.file? arg }
55
56
  rb_flags, mt_flags = flags.partition { |arg| arg =~ /^-I/ }
56
- mt_flags += ["-s", $$]
57
+ mt_flags += ["--server", $$]
57
58
 
58
59
  puts "reproducing..."
59
60
  system "#{build_files_cmd files, rb_flags, mt_flags} #{SHH}"
@@ -87,6 +88,7 @@ class Minitest::Bisect
87
88
  # from: {"file.rb"=>{"Class"=>["test_method"]}} to: "Class#test_method"
88
89
  bad = failures.values.first.to_a.join "#"
89
90
 
91
+ # culprits populated by initial reproduction via minitest/server
90
92
  found, count = culprits.find_minimal_combination_and_count do |test|
91
93
  puts "# of culprit methods: #{test.size}"
92
94
 
@@ -118,22 +120,34 @@ class Minitest::Bisect
118
120
  if bad then
119
121
  re = []
120
122
 
121
- bbc = (culprits + [bad]).map { |s| s.split(/#/) }.group_by(&:first)
123
+ # bad by class, you perv
124
+ bbc = (culprits + [bad]).map { |s| s.split(/#/, 2) }.group_by(&:first)
125
+
122
126
  bbc.each do |klass, methods|
123
- methods = methods.map(&:last).flatten
127
+ methods = methods.map(&:last).flatten.uniq.map { |method|
128
+ method.gsub(/([`'"!?&\[\]\(\)\|\+])/, '\\\\\1')
129
+ }
124
130
 
125
- re << /#{klass}##{Regexp.union(methods)}/
131
+ re << /#{klass}#(?:#{methods.join "|"})/.to_s[7..-2] # (?-mix:...)
126
132
  end
127
133
 
128
- re = Regexp.union(re).to_s.gsub(/-mix/, "")
134
+ re = re.join("|").to_s.gsub(/-mix/, "")
129
135
 
130
- cmd += " -n '/^#{re}$/'" if bad
136
+ cmd += " -n \"/^(?:#{re})$/\"" if bad
137
+ end
138
+
139
+ if ENV["MTB_VERBOSE"].to_i >= 1 then
140
+ puts
141
+ puts cmd
142
+ puts
131
143
  end
132
144
 
133
145
  cmd
134
146
  end
135
147
 
136
148
  def result file, klass, method, fails, assertions, time
149
+ fails.reject! { |fail| Minitest::Skip === fail }
150
+
137
151
  if mode == :methods then
138
152
  if fails.empty? then
139
153
  culprits << "#{klass}##{method}" unless seen_bad # UGH
@@ -28,6 +28,8 @@ class ComboFinder
28
28
  level, n_combos = 1, 1
29
29
  seen = {}
30
30
 
31
+ d "Total number of culprits: #{ary.size}"
32
+
31
33
  loop do
32
34
  size = 2 ** (Math.log(ary.size) / Math.log(2)).round
33
35
  divs = 2 ** level
@@ -36,11 +38,17 @@ class ComboFinder
36
38
 
37
39
  subsections = ary.each_slice(size/divs).to_a.combination(n_combos)
38
40
 
41
+ d
42
+ d "# new round!"
43
+ d "# of subsections in this round: #{subsections.size}"
44
+ d
45
+
39
46
  found = subsections.find { |a|
40
47
  b = a.flatten
41
48
 
42
49
  next if seen[b]
43
50
 
51
+ d "# trying #{b.size} at level #{level} / combo #{n_combos}"
44
52
  cache_result yield(b), b, seen
45
53
  }
46
54
 
@@ -50,14 +58,20 @@ class ComboFinder
50
58
 
51
59
  seen.delete ary
52
60
 
61
+ d "# FOUND!"
62
+ d "# search space size = #{ary.size}"
63
+ d "# resetting level and n_combos to 1"
64
+
53
65
  level = n_combos = 1
54
66
  else
55
67
  if done then
56
68
  n_combos += 1
69
+ d "# increasing n_combos to #{n_combos}"
57
70
  break if n_combos > size
58
71
  else
59
72
  level += 1
60
73
  n_combos = level
74
+ d "# setting level to #{level} and n_combos to #{n_combos}"
61
75
  end
62
76
  end
63
77
  end
@@ -65,6 +79,10 @@ class ComboFinder
65
79
  ary
66
80
  end
67
81
 
82
+ def d s=""
83
+ warn s if ENV["MTB_DEBUG"]
84
+ end
85
+
68
86
  def cache_result result, data, cache
69
87
  cache[data] = true
70
88
 
@@ -4,7 +4,7 @@ module Minitest
4
4
  @server = false
5
5
 
6
6
  def self.plugin_server_options opts, options # :nodoc:
7
- opts.on "-s", "--server=pid", Integer, "Connect to minitest server w/ pid." do |s|
7
+ opts.on "--server=pid", Integer, "Connect to minitest server w/ pid." do |s|
8
8
  @server = s
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest-bisect
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Davis
@@ -29,7 +29,7 @@ cert_chain:
29
29
  Y4evBVezr3SjXz08vPqRO5YRdO3zfeMT8gBjRqZjWJGMZ2lD4XNfrs7eky74CyZw
30
30
  xx3n58i0lQkBE1EpKE0lFu/y
31
31
  -----END CERTIFICATE-----
32
- date: 2014-08-30 00:00:00.000000000 Z
32
+ date: 2014-09-09 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: minitest
metadata.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- O��
2
- �����26I����>W3�����a1\�kI@�{4�:�,"M�����{]ò��W9dgG�pKM��`��J���$�4����C��8`��S���i���!�0�Df�uܨ��.�����ً[������26���4'rXV��qL#ݟ��:�]�ӈ���\=g<�*�7l�@�Zg�#�\oRQs�e+KG�w�~0%��<�i��ˬ0{*C��(��1�I�<��OֶF���b@���u���
1
+ ��#K19?���9��5�Wvs��[�3�C�&J���^%!C���<�2�џ/���I:��z
2
+ �����'D17��'�z-�V3