mspec 1.5.3 → 1.5.4
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.
- 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
|