mspec 1.5.3 → 1.5.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/mspec/commands/mspec-tag.rb +7 -0
- data/lib/mspec/guards/endian.rb +2 -2
- data/lib/mspec/helpers.rb +2 -1
- data/lib/mspec/helpers/argv.rb +43 -0
- data/lib/mspec/helpers/fixture.rb +20 -0
- data/lib/mspec/helpers/flunk.rb +2 -2
- data/lib/mspec/helpers/ruby_exe.rb +27 -7
- data/lib/mspec/runner/actions.rb +1 -0
- data/lib/mspec/runner/actions/tagpurge.rb +56 -0
- data/lib/mspec/runner/mspec.rb +25 -1
- data/lib/mspec/utils/script.rb +27 -7
- data/lib/mspec/version.rb +1 -1
- data/spec/commands/mspec_spec.rb +1 -1
- data/spec/commands/mspec_tag_spec.rb +37 -0
- data/spec/helpers/argv_spec.rb +26 -0
- data/spec/helpers/fixture_spec.rb +18 -0
- data/spec/helpers/flunk_spec.rb +4 -0
- data/spec/helpers/ruby_exe_spec.rb +59 -13
- data/spec/runner/actions/taglist_spec.rb +1 -1
- data/spec/runner/actions/tagpurge_spec.rb +153 -0
- data/spec/runner/mspec_spec.rb +53 -0
- data/spec/utils/script_spec.rb +33 -8
- metadata +7 -3
- data/lib/mspec/helpers/metaclass.rb +0 -12
- data/spec/helpers/metaclass_spec.rb +0 -14
@@ -66,6 +66,9 @@ class MSpecTag < MSpecScript
|
|
66
66
|
options.on("--list-all", "Display descriptions of any tagged specs") do
|
67
67
|
config[:tagger] = :list_all
|
68
68
|
end
|
69
|
+
options.on("--purge", "Remove all tags not matching any specs") do
|
70
|
+
config[:tagger] = :purge
|
71
|
+
end
|
69
72
|
|
70
73
|
options.doc "\n Help!"
|
71
74
|
options.version MSpec::VERSION
|
@@ -99,6 +102,10 @@ class MSpecTag < MSpecScript
|
|
99
102
|
tagger = TagListAction.new config[:tagger] == :list_all ? nil : config[:ltags]
|
100
103
|
MSpec.register_mode :pretend
|
101
104
|
config[:formatter] = false
|
105
|
+
when :purge
|
106
|
+
tagger = TagPurgeAction.new
|
107
|
+
MSpec.register_mode :pretend
|
108
|
+
config[:formatter] = false
|
102
109
|
else
|
103
110
|
raise ArgumentError, "No recognized action given"
|
104
111
|
end
|
data/lib/mspec/guards/endian.rb
CHANGED
@@ -10,7 +10,7 @@ class BigEndianGuard < SpecGuard
|
|
10
10
|
private :pattern
|
11
11
|
|
12
12
|
def match?
|
13
|
-
pattern[-1] ==
|
13
|
+
pattern[-1] == ?\001
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -21,7 +21,7 @@ class LittleEndianGuard < SpecGuard
|
|
21
21
|
private :pattern
|
22
22
|
|
23
23
|
def match?
|
24
|
-
pattern[-1] ==
|
24
|
+
pattern[-1] == ?\000
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
data/lib/mspec/helpers.rb
CHANGED
@@ -0,0 +1,43 @@
|
|
1
|
+
class Object
|
2
|
+
# Convenience helper for altering ARGV. Saves the
|
3
|
+
# value of ARGV and sets it to +args+. If a block
|
4
|
+
# is given, yields to the block and then restores
|
5
|
+
# the value of ARGV. The previously saved value of
|
6
|
+
# ARGV can be restored by passing +:restore+. The
|
7
|
+
# former is useful in a single spec. The latter is
|
8
|
+
# useful in before/after actions. For example:
|
9
|
+
#
|
10
|
+
# describe "This" do
|
11
|
+
# before do
|
12
|
+
# argv ['a', 'b']
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# after do
|
16
|
+
# argv :restore
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# it "does something" do
|
20
|
+
# # do something
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# describe "That" do
|
25
|
+
# it "does something" do
|
26
|
+
# argv ['a', 'b'] do
|
27
|
+
# # do something
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
def argv(args)
|
32
|
+
if args == :restore
|
33
|
+
ARGV.replace(@__mspec_saved_argv__ || [])
|
34
|
+
else
|
35
|
+
@__mspec_saved_argv__ = ARGV
|
36
|
+
ARGV.replace args
|
37
|
+
if block_given?
|
38
|
+
yield
|
39
|
+
argv :restore
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Object
|
2
|
+
# Returns the name of a fixture file by adjoining the directory
|
3
|
+
# of the +dir+ argument with "fixtures" and the contents of the
|
4
|
+
# +args+ array. For example,
|
5
|
+
#
|
6
|
+
# +dir+ == "some/path"
|
7
|
+
#
|
8
|
+
# and
|
9
|
+
#
|
10
|
+
# +args+ == ["dir", "file.txt"]
|
11
|
+
#
|
12
|
+
# then the result is the expanded path of
|
13
|
+
#
|
14
|
+
# "some/fixtures/dir/file.txt".
|
15
|
+
def fixture(dir, *args)
|
16
|
+
path = File.dirname(dir)
|
17
|
+
path = path[0..-7] if path[-7..-1] == "/shared"
|
18
|
+
File.expand_path(File.join(path, "fixtures", args))
|
19
|
+
end
|
20
|
+
end
|
data/lib/mspec/helpers/flunk.rb
CHANGED
@@ -21,6 +21,18 @@ require 'mspec/ruby_name'
|
|
21
21
|
#
|
22
22
|
# `#{RUBY_EXE} -e #{'puts "hello, world."'}`
|
23
23
|
#
|
24
|
+
# The ruby_exe helper also accepts an options hash with two
|
25
|
+
# keys: :options and :args. For example:
|
26
|
+
#
|
27
|
+
# ruby_exe('file.rb', :options => "-w", :args => "> file.txt")
|
28
|
+
#
|
29
|
+
# will be executed as
|
30
|
+
#
|
31
|
+
# `#{RUBY_EXE} -w #{'file.rb'} > file.txt`
|
32
|
+
#
|
33
|
+
# If +nil+ is passed for the first argument, the command line
|
34
|
+
# will be built only from the options hash.
|
35
|
+
#
|
24
36
|
# The RUBY_EXE constant can be set explicitly since the value
|
25
37
|
# is used each time ruby_exe is invoked. The mspec runner script
|
26
38
|
# will set ENV['RUBY_EXE'] to the name of the executable used
|
@@ -79,17 +91,25 @@ class Object
|
|
79
91
|
def resolve_ruby_exe
|
80
92
|
[:env, :engine, :name, :install_name].each do |option|
|
81
93
|
exe = ruby_exe_options option
|
82
|
-
|
94
|
+
|
95
|
+
# TODO: It has been reported that File.executable is not reliable
|
96
|
+
# on Windows platforms (see commit 56bc555c). So, we check the
|
97
|
+
# platform. This check is the same as the one used by the guards.
|
98
|
+
# This test should be abstracted so it is available in general to
|
99
|
+
# MSpec code.
|
100
|
+
if exe and File.exists?(exe) and
|
101
|
+
(RUBY_PLATFORM.match(/(mswin|mingw)/) || File.executable?(exe))
|
102
|
+
return exe
|
103
|
+
end
|
83
104
|
end
|
84
105
|
nil
|
85
106
|
end
|
86
107
|
|
87
|
-
def ruby_exe(code)
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
end
|
108
|
+
def ruby_exe(code, opts = {})
|
109
|
+
body = code
|
110
|
+
body = "-e #{code.inspect}" if code and not File.exists?(code)
|
111
|
+
cmd = [RUBY_EXE, ENV['RUBY_FLAGS'], opts[:options], body, opts[:args]]
|
112
|
+
`#{cmd.compact.join(' ')}`
|
93
113
|
end
|
94
114
|
|
95
115
|
unless Object.const_defined?(:RUBY_EXE) and RUBY_EXE
|
data/lib/mspec/runner/actions.rb
CHANGED
@@ -3,5 +3,6 @@ require 'mspec/runner/actions/timer'
|
|
3
3
|
require 'mspec/runner/actions/filter'
|
4
4
|
require 'mspec/runner/actions/tag'
|
5
5
|
require 'mspec/runner/actions/taglist'
|
6
|
+
require 'mspec/runner/actions/tagpurge'
|
6
7
|
require 'mspec/runner/actions/debug'
|
7
8
|
require 'mspec/runner/actions/gdb'
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'mspec/runner/actions/filter'
|
2
|
+
require 'mspec/runner/actions/taglist'
|
3
|
+
|
4
|
+
# TagPurgeAction - removes all tags not matching any spec
|
5
|
+
# descriptions.
|
6
|
+
class TagPurgeAction < TagListAction
|
7
|
+
attr_reader :matching
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@matching = []
|
11
|
+
@filter = nil
|
12
|
+
@tags = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
# Prints a banner about purging tags.
|
16
|
+
def start
|
17
|
+
print "\nRemoving tags not matching any specs\n\n"
|
18
|
+
end
|
19
|
+
|
20
|
+
# Creates a MatchFilter for all tags.
|
21
|
+
def load
|
22
|
+
@filter = nil
|
23
|
+
@tags = MSpec.read_tags self
|
24
|
+
desc = @tags.map { |t| t.description }
|
25
|
+
@filter = MatchFilter.new(nil, *desc) unless desc.empty?
|
26
|
+
end
|
27
|
+
|
28
|
+
# Saves any matching tags
|
29
|
+
def after(state)
|
30
|
+
@matching << state.description if self === state.description
|
31
|
+
end
|
32
|
+
|
33
|
+
# Rewrites any matching tags. Prints non-matching tags.
|
34
|
+
# Deletes the tag file if there were no tags (this cleans
|
35
|
+
# up empty or malformed tag files).
|
36
|
+
def unload
|
37
|
+
if @filter
|
38
|
+
matched = @tags.select { |t| @matching.any? { |s| s == t.description } }
|
39
|
+
MSpec.write_tags matched
|
40
|
+
|
41
|
+
(@tags - matched).each { |t| print t.description, "\n" }
|
42
|
+
else
|
43
|
+
MSpec.delete_tags
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def register
|
48
|
+
super
|
49
|
+
MSpec.register :unload, self
|
50
|
+
end
|
51
|
+
|
52
|
+
def unregister
|
53
|
+
super
|
54
|
+
MSpec.unregister :unload, self
|
55
|
+
end
|
56
|
+
end
|
data/lib/mspec/runner/mspec.rb
CHANGED
@@ -245,6 +245,8 @@ module MSpec
|
|
245
245
|
if File.exist? file
|
246
246
|
File.open(file, "r") do |f|
|
247
247
|
f.each_line do |line|
|
248
|
+
line.chomp!
|
249
|
+
next if line.empty?
|
248
250
|
tag = SpecTag.new line.chomp
|
249
251
|
tags << tag if keys.include? tag.tag
|
250
252
|
end
|
@@ -253,11 +255,24 @@ module MSpec
|
|
253
255
|
tags
|
254
256
|
end
|
255
257
|
|
258
|
+
# Writes each tag in +tags+ to the tag file. Overwrites the
|
259
|
+
# tag file if it exists.
|
260
|
+
def self.write_tags(tags)
|
261
|
+
file = tags_file
|
262
|
+
path = File.dirname file
|
263
|
+
FileUtils.mkdir_p path unless File.exist? path
|
264
|
+
File.open(file, "w") do |f|
|
265
|
+
tags.each { |t| f.puts t }
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
# Writes +tag+ to the tag file if it does not already exist.
|
270
|
+
# Returns +true+ if the tag is written, +false+ otherwise.
|
256
271
|
def self.write_tag(tag)
|
257
272
|
string = tag.to_s
|
258
273
|
file = tags_file
|
259
274
|
path = File.dirname file
|
260
|
-
FileUtils.mkdir_p
|
275
|
+
FileUtils.mkdir_p path unless File.exist? path
|
261
276
|
if File.exist? file
|
262
277
|
File.open(file, "r") do |f|
|
263
278
|
f.each_line { |line| return false if line.chomp == string }
|
@@ -267,6 +282,9 @@ module MSpec
|
|
267
282
|
return true
|
268
283
|
end
|
269
284
|
|
285
|
+
# Deletes +tag+ from the tag file if it exists. Returns +true+
|
286
|
+
# if the tag is deleted, +false+ otherwise. Deletes the tag
|
287
|
+
# file if it is empty.
|
270
288
|
def self.delete_tag(tag)
|
271
289
|
deleted = false
|
272
290
|
pattern = /#{tag.tag}.*#{Regexp.escape tag.description}/
|
@@ -286,4 +304,10 @@ module MSpec
|
|
286
304
|
end
|
287
305
|
return deleted
|
288
306
|
end
|
307
|
+
|
308
|
+
# Removes the tag file associated with a spec file.
|
309
|
+
def self.delete_tags
|
310
|
+
file = tags_file
|
311
|
+
File.delete file if File.exists? file
|
312
|
+
end
|
289
313
|
end
|
data/lib/mspec/utils/script.rb
CHANGED
@@ -116,15 +116,35 @@ class MSpecScript
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
-
#
|
119
|
+
# Attempts to resolve +partial+ as a file or directory name in the
|
120
|
+
# following order:
|
121
|
+
#
|
122
|
+
# 1. +partial+
|
123
|
+
# 2. +partial+ + "_spec.rb"
|
124
|
+
# 3. <tt>File.join(config[:prefix], partial)</tt>
|
125
|
+
# 4. <tt>File.join(config[:prefix], partial + "_spec.rb")</tt>
|
126
|
+
#
|
120
127
|
# If it is a file name, returns the name as an entry in an array.
|
121
128
|
# If it is a directory, returns all *_spec.rb files in the
|
122
|
-
# directory and
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
129
|
+
# directory and subdirectories.
|
130
|
+
#
|
131
|
+
# If unable to resolve +partial+, returns <tt>Dir[partial]</tt>.
|
132
|
+
def entries(partial)
|
133
|
+
file = partial + "_spec.rb"
|
134
|
+
patterns = [partial]
|
135
|
+
patterns << file
|
136
|
+
if config[:prefix]
|
137
|
+
patterns << File.join(config[:prefix], partial)
|
138
|
+
patterns << File.join(config[:prefix], file)
|
139
|
+
end
|
140
|
+
|
141
|
+
patterns.each do |pattern|
|
142
|
+
expanded = File.expand_path(pattern)
|
143
|
+
return [pattern] if File.file?(expanded)
|
144
|
+
return Dir[pattern+"/**/*_spec.rb"].sort if File.directory?(expanded)
|
145
|
+
end
|
146
|
+
|
147
|
+
Dir[partial]
|
128
148
|
end
|
129
149
|
|
130
150
|
# Resolves each entry in +list+ to a set of files. If the entry
|
data/lib/mspec/version.rb
CHANGED
data/spec/commands/mspec_spec.rb
CHANGED
@@ -3,6 +3,7 @@ require 'mspec/runner/mspec'
|
|
3
3
|
require 'mspec/commands/mspec-tag'
|
4
4
|
require 'mspec/runner/actions/tag'
|
5
5
|
require 'mspec/runner/actions/taglist'
|
6
|
+
require 'mspec/runner/actions/tagpurge'
|
6
7
|
|
7
8
|
describe MSpecTag, ".new" do
|
8
9
|
before :each do
|
@@ -228,6 +229,20 @@ describe MSpecTag, "options" do
|
|
228
229
|
@config[:tagger].should == :list_all
|
229
230
|
end
|
230
231
|
end
|
232
|
+
|
233
|
+
describe "--purge" do
|
234
|
+
it "is enabled with #options" do
|
235
|
+
@options.stub!(:on)
|
236
|
+
@options.should_receive(:on).with("--purge", an_instance_of(String))
|
237
|
+
@script.options ["file.rb"]
|
238
|
+
end
|
239
|
+
|
240
|
+
it "sets the mode to :purge" do
|
241
|
+
@config[:tagger] = nil
|
242
|
+
@script.options ["--purge", "file.rb"]
|
243
|
+
@config[:tagger].should == :purge
|
244
|
+
end
|
245
|
+
end
|
231
246
|
end
|
232
247
|
|
233
248
|
describe MSpecTag, "#run" do
|
@@ -354,4 +369,26 @@ describe MSpecTag, "#register" do
|
|
354
369
|
@config[:formatter].should be_false
|
355
370
|
end
|
356
371
|
end
|
372
|
+
|
373
|
+
describe "when config[:tagger] is :purge" do
|
374
|
+
before :each do
|
375
|
+
@config[:tagger] = :purge
|
376
|
+
end
|
377
|
+
|
378
|
+
it "creates a TagPurgeAction" do
|
379
|
+
TagPurgeAction.should_receive(:new).and_return(@tl)
|
380
|
+
@tl.should_receive(:register)
|
381
|
+
@script.register
|
382
|
+
end
|
383
|
+
|
384
|
+
it "registers MSpec in pretend mode" do
|
385
|
+
MSpec.should_receive(:register_mode).with(:pretend)
|
386
|
+
@script.register
|
387
|
+
end
|
388
|
+
|
389
|
+
it "sets config[:formatter] to false" do
|
390
|
+
@script.register
|
391
|
+
@config[:formatter].should be_false
|
392
|
+
end
|
393
|
+
end
|
357
394
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require 'mspec/helpers/argv'
|
3
|
+
|
4
|
+
describe Object, "#argv" do
|
5
|
+
before :each do
|
6
|
+
ScratchPad.clear
|
7
|
+
|
8
|
+
@saved_argv = ARGV
|
9
|
+
@argv = ["a", "b"]
|
10
|
+
end
|
11
|
+
|
12
|
+
it "replaces and restores the value of ARGV" do
|
13
|
+
argv @argv
|
14
|
+
ARGV.should == @argv
|
15
|
+
argv :restore
|
16
|
+
ARGV.should == @saved_argv
|
17
|
+
end
|
18
|
+
|
19
|
+
it "yields to the block after setting ARGV" do
|
20
|
+
argv @argv do
|
21
|
+
ScratchPad.record ARGV
|
22
|
+
end
|
23
|
+
ScratchPad.recorded.should == @argv
|
24
|
+
ARGV.should == @saved_argv
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require 'mspec/helpers/fixture'
|
3
|
+
|
4
|
+
describe Object, "#fixture" do
|
5
|
+
before :each do
|
6
|
+
@dir = File.expand_path(Dir.pwd)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "returns the expanded path to a fixture file" do
|
10
|
+
name = fixture("some/path/file.rb", "dir", "file.txt")
|
11
|
+
name.should == "#{@dir}/some/path/fixtures/dir/file.txt"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "omits '/shared' if it the suffix of the directory string" do
|
15
|
+
name = fixture("some/path/shared/file.rb", "dir", "file.txt")
|
16
|
+
name.should == "#{@dir}/some/path/fixtures/dir/file.txt"
|
17
|
+
end
|
18
|
+
end
|
data/spec/helpers/flunk_spec.rb
CHANGED
@@ -12,4 +12,8 @@ describe Object, "#flunk" do
|
|
12
12
|
it "raises an ExpectationNotMetError unconditionally" do
|
13
13
|
lambda { flunk }.should raise_error(ExpectationNotMetError)
|
14
14
|
end
|
15
|
+
|
16
|
+
it "accepts on argument for an optional message" do
|
17
|
+
lambda {flunk "test"}.should raise_error(ExpectationNotMetError)
|
18
|
+
end
|
15
19
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
require 'mspec/helpers/ruby_exe'
|
2
|
+
require 'mspec/helpers/ruby_exe'
|
3
3
|
require 'rbconfig'
|
4
4
|
|
5
5
|
class RubyExeSpecs
|
@@ -61,15 +61,40 @@ end
|
|
61
61
|
|
62
62
|
describe "#resolve_ruby_exe" do
|
63
63
|
before :all do
|
64
|
+
@verbose = $VERBOSE
|
65
|
+
$VERBOSE = nil
|
66
|
+
|
67
|
+
@name = "ruby_spec_exe"
|
68
|
+
end
|
69
|
+
|
70
|
+
before :each do
|
71
|
+
@ruby_platform = Object.const_get :RUBY_PLATFORM
|
72
|
+
|
64
73
|
@script = RubyExeSpecs.new
|
65
74
|
end
|
66
75
|
|
76
|
+
after :each do
|
77
|
+
Object.const_set :RUBY_PLATFORM, @ruby_platform
|
78
|
+
end
|
79
|
+
|
80
|
+
after :all do
|
81
|
+
$VERBOSE = @verbose
|
82
|
+
end
|
83
|
+
|
67
84
|
it "returns the value returned by #ruby_exe_options if it exists and is executable" do
|
68
|
-
|
69
|
-
@script.should_receive(:ruby_exe_options).and_return(name)
|
70
|
-
File.should_receive(:exists?).with(name).and_return(true)
|
71
|
-
File.should_receive(:executable?).with(name).and_return(true)
|
72
|
-
@script.resolve_ruby_exe.should == name
|
85
|
+
Object.const_set :RUBY_PLATFORM, "notwindows"
|
86
|
+
@script.should_receive(:ruby_exe_options).and_return(@name)
|
87
|
+
File.should_receive(:exists?).with(@name).and_return(true)
|
88
|
+
File.should_receive(:executable?).with(@name).and_return(true)
|
89
|
+
@script.resolve_ruby_exe.should == @name
|
90
|
+
end
|
91
|
+
|
92
|
+
it "returns the value returned by #ruby_exe_options if it exists on Windows platforms" do
|
93
|
+
Object.const_set :RUBY_PLATFORM, "mswin"
|
94
|
+
@script.should_receive(:ruby_exe_options).and_return(@name)
|
95
|
+
File.should_receive(:exists?).with(@name).and_return(true)
|
96
|
+
File.should_not_receive(:executable?)
|
97
|
+
@script.resolve_ruby_exe.should == @name
|
73
98
|
end
|
74
99
|
|
75
100
|
it "returns nil if no exe is found" do
|
@@ -89,6 +114,9 @@ describe Object, "#ruby_exe" do
|
|
89
114
|
@ruby_exe = Object.const_get :RUBY_EXE
|
90
115
|
Object.const_set :RUBY_EXE, 'ruby_spec_exe'
|
91
116
|
|
117
|
+
@file = "some/ruby/file.rb"
|
118
|
+
@code = %(some "real" 'ruby' code)
|
119
|
+
|
92
120
|
@script = RubyExeSpecs.new
|
93
121
|
end
|
94
122
|
|
@@ -99,16 +127,34 @@ describe Object, "#ruby_exe" do
|
|
99
127
|
end
|
100
128
|
|
101
129
|
it "executes the argument if it is a file that exists" do
|
102
|
-
|
103
|
-
File.should_receive(:exists?).with(code).and_return(true)
|
130
|
+
File.should_receive(:exists?).with(@file).and_return(true)
|
104
131
|
@script.should_receive(:`).with("ruby_spec_exe -w -Q some/ruby/file.rb")
|
105
|
-
@script.ruby_exe
|
132
|
+
@script.ruby_exe @file
|
133
|
+
end
|
134
|
+
|
135
|
+
it "executes the file with options and arguments" do
|
136
|
+
File.should_receive(:exists?).with(@file).and_return(true)
|
137
|
+
@script.should_receive(:`).with(
|
138
|
+
"ruby_spec_exe -w -Q -w -Cdir some/ruby/file.rb < file.txt")
|
139
|
+
@script.ruby_exe @file, :options => "-w -Cdir", :args => "< file.txt"
|
106
140
|
end
|
107
141
|
|
108
142
|
it "executes the argument with -e" do
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
@script.ruby_exe code
|
143
|
+
File.should_receive(:exists?).with(@code).and_return(false)
|
144
|
+
@script.should_receive(:`).with(
|
145
|
+
%(ruby_spec_exe -w -Q -e "some \\"real\\" 'ruby' code"))
|
146
|
+
@script.ruby_exe @code
|
147
|
+
end
|
148
|
+
|
149
|
+
it "executes the code with options and arguments" do
|
150
|
+
File.should_receive(:exists?).with(@code).and_return(false)
|
151
|
+
@script.should_receive(:`).with(
|
152
|
+
%(ruby_spec_exe -w -Q -W0 -Cdir -e "some \\"real\\" 'ruby' code" < file.txt))
|
153
|
+
@script.ruby_exe @code, :options => "-W0 -Cdir", :args => "< file.txt"
|
154
|
+
end
|
155
|
+
|
156
|
+
it "executes with options and arguments but without code or file" do
|
157
|
+
@script.should_receive(:`).with("ruby_spec_exe -w -Q -c > file.txt")
|
158
|
+
@script.ruby_exe nil, :options => "-c", :args => "> file.txt"
|
113
159
|
end
|
114
160
|
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
require 'mspec/runner/actions/tagpurge'
|
3
|
+
require 'mspec/runner/mspec'
|
4
|
+
require 'mspec/runner/example'
|
5
|
+
require 'mspec/runner/tag'
|
6
|
+
|
7
|
+
describe TagPurgeAction, "#start" do
|
8
|
+
before :each do
|
9
|
+
@stdout = $stdout
|
10
|
+
$stdout = IOStub.new
|
11
|
+
end
|
12
|
+
|
13
|
+
after :each do
|
14
|
+
$stdout = @stdout
|
15
|
+
end
|
16
|
+
|
17
|
+
it "prints a banner" do
|
18
|
+
action = TagPurgeAction.new
|
19
|
+
action.start
|
20
|
+
$stdout.should == "\nRemoving tags not matching any specs\n\n"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe TagPurgeAction, "#load" do
|
25
|
+
before :each do
|
26
|
+
@t1 = SpecTag.new "fails:I fail"
|
27
|
+
@t2 = SpecTag.new "unstable:I'm unstable"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "creates a MatchFilter for all tags" do
|
31
|
+
MSpec.should_receive(:read_tags).and_return([@t1, @t2])
|
32
|
+
MatchFilter.should_receive(:new).with(nil, "I fail", "I'm unstable")
|
33
|
+
TagPurgeAction.new.load
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe TagPurgeAction, "#after" do
|
38
|
+
before :each do
|
39
|
+
@state = mock("ExampleState")
|
40
|
+
@state.stub!(:description).and_return("str")
|
41
|
+
|
42
|
+
@action = TagPurgeAction.new
|
43
|
+
end
|
44
|
+
|
45
|
+
it "does not save the description if the filter does not match" do
|
46
|
+
@action.should_receive(:===).with("str").and_return(false)
|
47
|
+
@action.after @state
|
48
|
+
@action.matching.should == []
|
49
|
+
end
|
50
|
+
|
51
|
+
it "saves the description if the filter matches" do
|
52
|
+
@action.should_receive(:===).with("str").and_return(true)
|
53
|
+
@action.after @state
|
54
|
+
@action.matching.should == ["str"]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe TagPurgeAction, "#unload" do
|
59
|
+
before :each do
|
60
|
+
@stdout = $stdout
|
61
|
+
$stdout = IOStub.new
|
62
|
+
|
63
|
+
@t1 = SpecTag.new "fails:I fail"
|
64
|
+
@t2 = SpecTag.new "unstable:I'm unstable"
|
65
|
+
@t3 = SpecTag.new "fails:I'm unstable"
|
66
|
+
|
67
|
+
MSpec.stub!(:read_tags).and_return([@t1, @t2, @t3])
|
68
|
+
MSpec.stub!(:write_tags)
|
69
|
+
|
70
|
+
@state = mock("ExampleState")
|
71
|
+
@state.stub!(:description).and_return("I'm unstable")
|
72
|
+
|
73
|
+
@action = TagPurgeAction.new
|
74
|
+
@action.load
|
75
|
+
@action.after @state
|
76
|
+
end
|
77
|
+
|
78
|
+
after :each do
|
79
|
+
$stdout = @stdout
|
80
|
+
end
|
81
|
+
|
82
|
+
it "does not rewrite any tags if there were no tags for the specs" do
|
83
|
+
MSpec.should_receive(:read_tags).and_return([])
|
84
|
+
MSpec.should_not_receive(:write_tags)
|
85
|
+
|
86
|
+
@action.load
|
87
|
+
@action.after @state
|
88
|
+
@action.unload
|
89
|
+
|
90
|
+
$stdout.should == ""
|
91
|
+
end
|
92
|
+
|
93
|
+
it "rewrites tags that were matched" do
|
94
|
+
MSpec.should_receive(:write_tags).with([@t2, @t3])
|
95
|
+
@action.unload
|
96
|
+
end
|
97
|
+
|
98
|
+
it "prints tags that were not matched" do
|
99
|
+
@action.unload
|
100
|
+
$stdout.should == "I fail\n"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe TagPurgeAction, "#unload" do
|
105
|
+
before :each do
|
106
|
+
@stdout = $stdout
|
107
|
+
$stdout = IOStub.new
|
108
|
+
|
109
|
+
MSpec.stub!(:read_tags).and_return([])
|
110
|
+
|
111
|
+
@state = mock("ExampleState")
|
112
|
+
@state.stub!(:description).and_return("I'm unstable")
|
113
|
+
|
114
|
+
@action = TagPurgeAction.new
|
115
|
+
@action.load
|
116
|
+
@action.after @state
|
117
|
+
end
|
118
|
+
|
119
|
+
after :each do
|
120
|
+
$stdout = @stdout
|
121
|
+
end
|
122
|
+
|
123
|
+
it "deletes the tag file if no tags were found" do
|
124
|
+
MSpec.should_not_receive(:write_tags)
|
125
|
+
MSpec.should_receive(:delete_tags)
|
126
|
+
@action.unload
|
127
|
+
$stdout.should == ""
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe TagPurgeAction, "#register" do
|
132
|
+
before :each do
|
133
|
+
MSpec.stub!(:register)
|
134
|
+
@action = TagPurgeAction.new
|
135
|
+
end
|
136
|
+
|
137
|
+
it "registers itself with MSpec for the :unload event" do
|
138
|
+
MSpec.should_receive(:register).with(:unload, @action)
|
139
|
+
@action.register
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe TagPurgeAction, "#unregister" do
|
144
|
+
before :each do
|
145
|
+
MSpec.stub!(:unregister)
|
146
|
+
@action = TagPurgeAction.new
|
147
|
+
end
|
148
|
+
|
149
|
+
it "unregisters itself with MSpec for the :unload event" do
|
150
|
+
MSpec.should_receive(:unregister).with(:unload, @action)
|
151
|
+
@action.unregister
|
152
|
+
end
|
153
|
+
end
|
data/spec/runner/mspec_spec.rb
CHANGED
@@ -376,6 +376,46 @@ describe MSpec, ".read_tags" do
|
|
376
376
|
end
|
377
377
|
end
|
378
378
|
|
379
|
+
describe MSpec, ".read_tags" do
|
380
|
+
before :each do
|
381
|
+
@tag = SpecTag.new "fails:Some#method"
|
382
|
+
File.open(tmp("tags.txt"), "w") do |f|
|
383
|
+
f.puts ""
|
384
|
+
f.puts @tag
|
385
|
+
f.puts ""
|
386
|
+
end
|
387
|
+
MSpec.stub!(:tags_file).and_return(tmp("tags.txt"))
|
388
|
+
end
|
389
|
+
|
390
|
+
it "does not return a tag object for empty lines" do
|
391
|
+
MSpec.read_tags(["fails"]).should == [@tag]
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
describe MSpec, ".write_tags" do
|
396
|
+
before :each do
|
397
|
+
FileUtils.cp File.dirname(__FILE__) + "/tags.txt", tmp("tags.txt")
|
398
|
+
MSpec.stub!(:tags_file).and_return(tmp("tags.txt"))
|
399
|
+
@tag1 = SpecTag.new "check(broken):Tag#rewrite works"
|
400
|
+
@tag2 = SpecTag.new "broken:Tag#write_tags fails"
|
401
|
+
end
|
402
|
+
|
403
|
+
after :all do
|
404
|
+
File.delete tmp("tags.txt") rescue nil
|
405
|
+
end
|
406
|
+
|
407
|
+
it "overwrites the tags in the tag file" do
|
408
|
+
IO.read(tmp("tags.txt")).should == %[fail(broken):Some#method? works
|
409
|
+
incomplete(20%):The#best method ever
|
410
|
+
benchmark(0.01825):The#fastest method today
|
411
|
+
]
|
412
|
+
MSpec.write_tags [@tag1, @tag2]
|
413
|
+
IO.read(tmp("tags.txt")).should == %[check(broken):Tag#rewrite works
|
414
|
+
broken:Tag#write_tags fails
|
415
|
+
]
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
379
419
|
describe MSpec, ".write_tag" do
|
380
420
|
before :each do
|
381
421
|
FileUtils.stub!(:mkdir_p)
|
@@ -434,6 +474,19 @@ benchmark(0.01825):The#fastest method today
|
|
434
474
|
end
|
435
475
|
end
|
436
476
|
|
477
|
+
describe MSpec, ".delete_tags" do
|
478
|
+
before :each do
|
479
|
+
@tags = tmp("tags.txt")
|
480
|
+
FileUtils.cp File.dirname(__FILE__) + "/tags.txt", @tags
|
481
|
+
MSpec.stub!(:tags_file).and_return(@tags)
|
482
|
+
end
|
483
|
+
|
484
|
+
it "deletes the tag file" do
|
485
|
+
MSpec.delete_tags
|
486
|
+
File.exists?(@tags).should be_false
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
437
490
|
describe MSpec, ".expectation" do
|
438
491
|
it "sets the flag that an expectation has been reported" do
|
439
492
|
MSpec.clear_expectations
|
data/spec/utils/script_spec.rb
CHANGED
@@ -310,6 +310,10 @@ end
|
|
310
310
|
describe MSpecScript, "#entries" do
|
311
311
|
before :each do
|
312
312
|
@script = MSpecScript.new
|
313
|
+
|
314
|
+
File.stub!(:expand_path).and_return("name")
|
315
|
+
File.stub!(:file?).and_return(false)
|
316
|
+
File.stub!(:directory?).and_return(false)
|
313
317
|
end
|
314
318
|
|
315
319
|
it "returns the pattern in an array if it is a file" do
|
@@ -319,20 +323,41 @@ describe MSpecScript, "#entries" do
|
|
319
323
|
end
|
320
324
|
|
321
325
|
it "returns Dir['pattern/**/*_spec.rb'] if pattern is a directory" do
|
322
|
-
File.should_receive(:
|
323
|
-
|
324
|
-
|
325
|
-
Dir.should_receive(:[]).with("dir/**/*_spec.rb").and_return(["dir1", "dir2"])
|
326
|
-
@script.entries("dir").should == ["dir1", "dir2"]
|
326
|
+
File.should_receive(:directory?).with("name").and_return(true)
|
327
|
+
Dir.should_receive(:[]).with("name/**/*_spec.rb").and_return(["dir1", "dir2"])
|
328
|
+
@script.entries("name").should == ["dir1", "dir2"]
|
327
329
|
end
|
328
330
|
|
329
331
|
it "returns Dir[pattern] if pattern is neither a file nor a directory" do
|
330
|
-
File.should_receive(:expand_path).with("pattern").and_return("pattern")
|
331
|
-
File.should_receive(:file?).with("pattern").and_return(false)
|
332
|
-
File.should_receive(:directory?).with("pattern").and_return(false)
|
333
332
|
Dir.should_receive(:[]).with("pattern").and_return(["file1", "file2"])
|
334
333
|
@script.entries("pattern").should == ["file1", "file2"]
|
335
334
|
end
|
335
|
+
|
336
|
+
describe "with config[:prefix] set" do
|
337
|
+
before :each do
|
338
|
+
prefix = "prefix/dir"
|
339
|
+
@script.config[:prefix] = prefix
|
340
|
+
@name = prefix + "/name"
|
341
|
+
end
|
342
|
+
|
343
|
+
it "returns the pattern in an array if it is a file" do
|
344
|
+
File.should_receive(:expand_path).with(@name).and_return(@name)
|
345
|
+
File.should_receive(:file?).with(@name).and_return(true)
|
346
|
+
@script.entries("name").should == [@name]
|
347
|
+
end
|
348
|
+
|
349
|
+
it "returns Dir['pattern/**/*_spec.rb'] if pattern is a directory" do
|
350
|
+
File.should_receive(:expand_path).with(@name).and_return(@name)
|
351
|
+
File.should_receive(:directory?).with(@name).and_return(true)
|
352
|
+
Dir.should_receive(:[]).with(@name + "/**/*_spec.rb").and_return(["dir1", "dir2"])
|
353
|
+
@script.entries("name").should == ["dir1", "dir2"]
|
354
|
+
end
|
355
|
+
|
356
|
+
it "returns Dir[pattern] if pattern is neither a file nor a directory" do
|
357
|
+
Dir.should_receive(:[]).with("pattern").and_return(["file1", "file2"])
|
358
|
+
@script.entries("pattern").should == ["file1", "file2"]
|
359
|
+
end
|
360
|
+
end
|
336
361
|
end
|
337
362
|
|
338
363
|
describe MSpecScript, "#files" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Ford
|
@@ -49,11 +49,12 @@ files:
|
|
49
49
|
- lib/mspec/guards/support.rb
|
50
50
|
- lib/mspec/guards/version.rb
|
51
51
|
- lib/mspec/guards.rb
|
52
|
+
- lib/mspec/helpers/argv.rb
|
52
53
|
- lib/mspec/helpers/bignum.rb
|
53
54
|
- lib/mspec/helpers/const_lookup.rb
|
55
|
+
- lib/mspec/helpers/fixture.rb
|
54
56
|
- lib/mspec/helpers/flunk.rb
|
55
57
|
- lib/mspec/helpers/io.rb
|
56
|
-
- lib/mspec/helpers/metaclass.rb
|
57
58
|
- lib/mspec/helpers/ruby_exe.rb
|
58
59
|
- lib/mspec/helpers/scratch.rb
|
59
60
|
- lib/mspec/helpers/tmp.rb
|
@@ -88,6 +89,7 @@ files:
|
|
88
89
|
- lib/mspec/runner/actions/gdb.rb
|
89
90
|
- lib/mspec/runner/actions/tag.rb
|
90
91
|
- lib/mspec/runner/actions/taglist.rb
|
92
|
+
- lib/mspec/runner/actions/tagpurge.rb
|
91
93
|
- lib/mspec/runner/actions/tally.rb
|
92
94
|
- lib/mspec/runner/actions/timer.rb
|
93
95
|
- lib/mspec/runner/actions.rb
|
@@ -147,11 +149,12 @@ files:
|
|
147
149
|
- spec/guards/superuser_spec.rb
|
148
150
|
- spec/guards/support_spec.rb
|
149
151
|
- spec/guards/version_spec.rb
|
152
|
+
- spec/helpers/argv_spec.rb
|
150
153
|
- spec/helpers/bignum_spec.rb
|
151
154
|
- spec/helpers/const_lookup_spec.rb
|
155
|
+
- spec/helpers/fixture_spec.rb
|
152
156
|
- spec/helpers/flunk_spec.rb
|
153
157
|
- spec/helpers/io_spec.rb
|
154
|
-
- spec/helpers/metaclass_spec.rb
|
155
158
|
- spec/helpers/ruby_exe_spec.rb
|
156
159
|
- spec/helpers/scratch_spec.rb
|
157
160
|
- spec/helpers/tmp_spec.rb
|
@@ -181,6 +184,7 @@ files:
|
|
181
184
|
- spec/runner/actions/gdb_spec.rb
|
182
185
|
- spec/runner/actions/tag_spec.rb
|
183
186
|
- spec/runner/actions/taglist_spec.rb
|
187
|
+
- spec/runner/actions/tagpurge_spec.rb
|
184
188
|
- spec/runner/actions/tally_spec.rb
|
185
189
|
- spec/runner/actions/timer_spec.rb
|
186
190
|
- spec/runner/context_spec.rb
|
@@ -1,12 +0,0 @@
|
|
1
|
-
# Provides a convenience method for accessing the metaclass
|
2
|
-
# of any object without overriding the method if it already
|
3
|
-
# exists in an implementation.
|
4
|
-
unless respond_to? :metaclass
|
5
|
-
class Object
|
6
|
-
def metaclass
|
7
|
-
class << self
|
8
|
-
self
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
require 'mspec/helpers/metaclass'
|
3
|
-
|
4
|
-
describe Object, "#metaclass" do
|
5
|
-
it "returns the singleton class for an object" do
|
6
|
-
obj = Object.new
|
7
|
-
def obj.metaclass_test; end
|
8
|
-
meta = obj.metaclass
|
9
|
-
|
10
|
-
meta.instance_methods(false).should include("metaclass_test")
|
11
|
-
obj.should_not be_instance_of(meta)
|
12
|
-
obj.should be_kind_of(meta)
|
13
|
-
end
|
14
|
-
end
|