respec 0.8.3 → 0.9.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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8dd8596c058fbfcdb4a97721345b2b740dff445d
4
- data.tar.gz: 22b1e40d8109cb9ddb088c0bc7450dcdda94c269
3
+ metadata.gz: 396cc6c0d51083e279d493000adb0adb7fc79cca
4
+ data.tar.gz: c426e519c224bbd542f3889332e597726c3542b2
5
5
  SHA512:
6
- metadata.gz: dcaef4a1fc8f02cffea1b960399a790299e3f677f88cdde6e6c175de88d9dcaf8716bfd5e9c86f1f785550b5cd4b21de6b5315cd79e6ceda3fa1a78477c70525
7
- data.tar.gz: 607fd40e658daf575bde72444b76b337ecc6632b26c181b6fa5032ea08269ec5ee83b7d7eeca7df912e68d4b544b4070d125a4f998c2e62276d744dae7b58adc
6
+ metadata.gz: baaa1afe7a1c8d61d079450347e5168ae95b6c2f22f9676d9237d27d1d38674f30c066a5889ddd9925c558a8719083a63eabe631dcd25de8df6f7a8f9dd11e52
7
+ data.tar.gz: 570fe25028bd088b82e5d5f2a7c5f62c9bdca953c33e91689233fe69c8c3478092dab9af3d25626844e2b7bee0f1af15ec93a827f8193f153a61e1f400fa3978
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ == 0.9.0 2015-10-10
2
+
3
+ * Fail with error if an invalid number is given, so we don't run everything.
4
+
1
5
  == 0.8.3 2015-06-12
2
6
 
3
7
  * Write .respec_failures to the right path when a test messes up the pwd.
@@ -13,7 +13,7 @@ Run your specs:
13
13
 
14
14
  respec f
15
15
 
16
- Need to debug failure #1? Pop a `debugger` in your code, and rerun it
16
+ Need to debug failure #1? Pop a `debugger` (or `pry`) in your code, and rerun it
17
17
  like this:
18
18
 
19
19
  respec 1
@@ -50,12 +50,18 @@ example name.
50
50
 
51
51
  It'll even `bundle exec` for you automatically, or use a binstub if present.
52
52
 
53
+ If you use git, run all specs modified since the last commit with:
54
+
55
+ respec d
56
+
57
+ (**d** for "git **d**iff", which this uses.)
58
+
53
59
  There are a few other shortcuts. `respec --help` to see them all.
54
60
 
55
- If you're using this on CI, you may want to control where the failure file is
56
- written. You can do this in one of 2 ways:
61
+ If you're using this on CI to [rerun your failures][junit-merge], you may want
62
+ to control where the failure file is written. You can do this in one of 2 ways:
57
63
 
58
- Either pass a FAILURES argument:
64
+ Either pass a `FAILURES=...` argument:
59
65
 
60
66
  respec FAILURES=/path/to/file ...
61
67
 
@@ -63,6 +69,8 @@ Or use the `RESPEC_FAILURES` environment variable.
63
69
 
64
70
  RESPEC_FAILURES=/path/to/file respec ...
65
71
 
72
+ [junit-merge]: https://github.com/oggy/junit_merge
73
+
66
74
  ## Contributing
67
75
 
68
76
  * [Bug reports](https://github.com/oggy/respec/issues)
data/bin/respec CHANGED
@@ -8,6 +8,9 @@ require 'shellwords'
8
8
  app = Respec::App.new(*ARGV)
9
9
  if app.help_only?
10
10
  STDERR.puts app.help
11
+ elsif app.error
12
+ STDERR.puts app.error
13
+ exit 1
11
14
  else
12
15
  STDERR.puts "++ #{app.command.shelljoin}"
13
16
  exec *app.command
@@ -12,11 +12,17 @@ module Respec
12
12
  end
13
13
  @failures_path = self.class.default_failures_path
14
14
  @update_failures = true
15
+ @error = nil
15
16
  process_args
16
17
  end
17
18
 
18
19
  attr_accessor :failures_path
19
20
 
21
+ def error
22
+ command
23
+ @error
24
+ end
25
+
20
26
  def command
21
27
  @command ||= program_args + generated_args + raw_args + formatter_args
22
28
  end
@@ -58,6 +64,7 @@ module Respec
58
64
  |
59
65
  |RESPEC-ARGS may consist of:
60
66
  |
67
+ | d Run all spec files changed since the last git commit
61
68
  | f Rerun all failed examples
62
69
  | <N> Rerun only the N-th failure
63
70
  | <file name> Run all specs in this file
@@ -79,6 +86,7 @@ module Respec
79
86
  files = []
80
87
  pass_next_arg = false
81
88
  using_filters = false
89
+ changed_only = false
82
90
  @args.each do |arg|
83
91
  if pass_next_arg
84
92
  args << arg
@@ -94,6 +102,8 @@ module Respec
94
102
  args << arg
95
103
  elsif arg =~ /\AFAILURES=(.*)\z/
96
104
  self.failures_path = $1
105
+ elsif arg == 'd'
106
+ changed_only = true
97
107
  elsif arg == 'f'
98
108
  # failures_path could still be overridden -- delay evaluation of this.
99
109
  args << lambda do
@@ -117,7 +127,7 @@ module Respec
117
127
  @update_failures = false
118
128
  using_filters = true
119
129
  else
120
- warn "invalid failure: #{i} for (1..#{failures.size})"
130
+ @error = "invalid failure: #{i} for (1..#{failures.size})"
121
131
  end
122
132
  else
123
133
  args << '-e' << arg.gsub(/[$]/, '\\\\\\0')
@@ -143,12 +153,25 @@ module Respec
143
153
  # using 'spec' by default. Add it explicitly here.
144
154
  files << 'spec' if files.empty?
145
155
 
156
+ # Filter files only to those changed if 'd' is present.
157
+ if changed_only
158
+ files = changed_paths(files)
159
+ end
160
+
146
161
  # If we selected individual failures to rerun, don't give the files to
147
162
  # rspec, as those files will be run in their entirety.
148
163
  @generated_args = expanded
149
164
  @generated_args.concat(files)
150
165
  end
151
166
 
167
+ def changed_paths(paths)
168
+ changes = `git status --short --untracked-files=all #{paths.shelljoin}`
169
+ changes.lines.map do |line|
170
+ path = line[3..-1].chomp
171
+ path if File.exist?(path) && path =~ /\.rb\z/i
172
+ end.compact.uniq
173
+ end
174
+
152
175
  def failures
153
176
  @failures ||=
154
177
  if File.exist?(failures_path)
@@ -1,5 +1,5 @@
1
1
  module Respec
2
- VERSION = [0, 8, 3]
2
+ VERSION = [0, 9, 0]
3
3
 
4
4
  class << VERSION
5
5
  include Comparable
@@ -89,6 +89,47 @@ describe Respec::App do
89
89
  end
90
90
 
91
91
  describe "#generated_args" do
92
+ def in_git_repo
93
+ dir = "#{tmp}/repo"
94
+ FileUtils.mkdir_p dir
95
+ Dir.chdir(dir) do
96
+ system 'git init --quiet .'
97
+ yield
98
+ end
99
+ end
100
+
101
+ def make_git_file(path, index_status, status)
102
+ FileUtils.mkdir_p File.dirname(path)
103
+
104
+ unless index_status == nil || index_status == :new
105
+ open(path, 'w') { |f| f.print 1 }
106
+ system "git add #{path.shellescape}"
107
+ system "git commit --quiet --message . #{path.shellescape}"
108
+ end
109
+
110
+ case index_status
111
+ when :new, :updated
112
+ open(path, 'w') { |f| f.print 2 }
113
+ when :up_to_date, nil
114
+ when :removed
115
+ File.delete path
116
+ else
117
+ raise ArgumentError, "invalid index_status: #{index_status}"
118
+ end
119
+
120
+ system "git add -- #{path.shellescape}" unless index_status.nil?
121
+
122
+ case status
123
+ when :new, :updated
124
+ open(path, 'w') { |f| f.print 3 }
125
+ when :up_to_date
126
+ when :removed
127
+ File.delete path
128
+ else
129
+ raise ArgumentError, "invalid status: #{status}"
130
+ end
131
+ end
132
+
92
133
  it "should pass all arguments that start with '-' to rspec" do
93
134
  FileUtils.touch "#{tmp}/file"
94
135
  app = Respec::App.new('-a', '-b', '-c', "#{tmp}/file")
@@ -106,6 +147,62 @@ describe Respec::App do
106
147
  expect(app.generated_args).to eq ['-e', 'a', '-e', 'b', 'spec']
107
148
  end
108
149
 
150
+ it "should run all new and updated files if 'd' is given" do
151
+ in_git_repo do
152
+ make_git_file 'a/01.rb', nil, :new
153
+
154
+ make_git_file 'a/02.rb', :new, :up_to_date
155
+ make_git_file 'a/03.rb', :new, :updated
156
+ make_git_file 'a/04.rb', :new, :removed
157
+
158
+ make_git_file 'a/05.rb', :up_to_date, :up_to_date
159
+ make_git_file 'a/06.rb', :up_to_date, :updated
160
+ make_git_file 'a/07.rb', :up_to_date, :removed
161
+
162
+ make_git_file 'a/08.rb', :updated, :up_to_date
163
+ make_git_file 'a/09.rb', :updated, :updated
164
+ make_git_file 'a/10.rb', :updated, :removed
165
+
166
+ make_git_file 'a/11.rb', :removed, :up_to_date
167
+ make_git_file 'a/12.rb', :removed, :new
168
+
169
+ app = Respec::App.new('d', 'a')
170
+ expect(app.generated_args).to \
171
+ contain_exactly(*[1, 2, 3, 6, 8, 9, 12].map { |i| 'a/%02d.rb' % i})
172
+ end
173
+ end
174
+
175
+ it "should only include .rb files for 'd'" do
176
+ in_git_repo do
177
+ make_git_file 'a/1.rb', :new, :up_to_date
178
+ make_git_file 'a/1.br', :new, :up_to_date
179
+
180
+ app = Respec::App.new('d', 'a')
181
+ expect(app.generated_args).to eq %w[a/1.rb]
182
+ end
183
+ end
184
+
185
+ it "should not include files outside the given spec directories for 'd'" do
186
+ in_git_repo do
187
+ make_git_file 'a/1.rb', :new, :up_to_date
188
+ make_git_file 'b/1.rb', :new, :up_to_date
189
+ make_git_file 'c/1.rb', :new, :up_to_date
190
+
191
+ app = Respec::App.new('d', 'a', 'b')
192
+ expect(app.generated_args).to eq %w[a/1.rb b/1.rb]
193
+ end
194
+ end
195
+
196
+ it "should filter files from the default spec directory for 'd'" do
197
+ in_git_repo do
198
+ make_git_file 'spec/1.rb', :new, :up_to_date
199
+ make_git_file 'other/1.rb', :new, :up_to_date
200
+
201
+ app = Respec::App.new('d')
202
+ expect(app.generated_args).to eq %w[spec/1.rb]
203
+ end
204
+ end
205
+
109
206
  it "should pass failures with spaces in them as a single argument" do
110
207
  make_failures_file 'a a'
111
208
  app = Respec::App.new('f')
@@ -209,4 +306,18 @@ describe Respec::App do
209
306
  end
210
307
  end
211
308
  end
309
+
310
+ describe "#error" do
311
+ it "should not be set if the arguments are valid" do
312
+ make_failures_file 'a'
313
+ app = Respec::App.new('1')
314
+ expect(app.error).to be_nil
315
+ end
316
+
317
+ it "should be set if an invalid failure is given" do
318
+ make_failures_file 'a', 'b'
319
+ app = Respec::App.new('3')
320
+ expect(app.error).to include 'invalid failure: 3 for (1..2)'
321
+ end
322
+ end
212
323
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: respec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.3
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - George Ogata
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-12 00:00:00.000000000 Z
11
+ date: 2015-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -69,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
69
  version: '0'
70
70
  requirements: []
71
71
  rubyforge_project:
72
- rubygems_version: 2.4.5
72
+ rubygems_version: 2.4.8
73
73
  signing_key:
74
74
  specification_version: 4
75
75
  summary: Rerun failing RSpec examples easily.