mspec 1.5.9 → 1.5.10
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/Rakefile +1 -1
- data/lib/mspec/commands/mspec-ci.rb +5 -1
- data/lib/mspec/commands/mspec-run.rb +8 -5
- data/lib/mspec/guards/background.rb +2 -0
- data/lib/mspec/guards/bug.rb +5 -1
- data/lib/mspec/guards/compliance.rb +10 -0
- data/lib/mspec/guards/conflict.rb +2 -0
- data/lib/mspec/guards/endian.rb +4 -0
- data/lib/mspec/guards/extensions.rb +2 -0
- data/lib/mspec/guards/guard.rb +49 -25
- data/lib/mspec/guards/noncompliance.rb +2 -0
- data/lib/mspec/guards/platform.rb +5 -0
- data/lib/mspec/guards/quarantine.rb +2 -0
- data/lib/mspec/guards/runner.rb +4 -0
- data/lib/mspec/guards/superuser.rb +2 -0
- data/lib/mspec/guards/support.rb +2 -0
- data/lib/mspec/guards/tty.rb +2 -0
- data/lib/mspec/guards/version.rb +3 -0
- data/lib/mspec/matchers.rb +1 -0
- data/lib/mspec/matchers/have_constant.rb +30 -0
- data/lib/mspec/matchers/method.rb +4 -3
- data/lib/mspec/matchers/stringsymboladapter.rb +8 -0
- data/lib/mspec/runner/actions/tally.rb +13 -3
- data/lib/mspec/runner/context.rb +8 -1
- data/lib/mspec/runner/mspec.rb +16 -0
- data/lib/mspec/utils/options.rb +10 -3
- data/lib/mspec/version.rb +1 -1
- data/spec/guards/background_spec.rb +15 -0
- data/spec/guards/bug_spec.rb +28 -10
- data/spec/guards/compliance_spec.rb +54 -0
- data/spec/guards/conflict_spec.rb +19 -0
- data/spec/guards/endian_spec.rb +26 -0
- data/spec/guards/extensions_spec.rb +20 -0
- data/spec/guards/guard_spec.rb +69 -52
- data/spec/guards/noncompliance_spec.rb +20 -0
- data/spec/guards/platform_spec.rb +26 -0
- data/spec/guards/quarantine_spec.rb +16 -0
- data/spec/guards/runner_spec.rb +26 -0
- data/spec/guards/superuser_spec.rb +13 -0
- data/spec/guards/support_spec.rb +20 -0
- data/spec/guards/tty_spec.rb +16 -0
- data/spec/guards/version_spec.rb +13 -0
- data/spec/matchers/have_constant_spec.rb +37 -0
- data/spec/matchers/stringsymboladapter_spec.rb +40 -0
- data/spec/runner/actions/tagpurge_spec.rb +1 -0
- data/spec/runner/actions/tally_spec.rb +64 -0
- data/spec/runner/context_spec.rb +24 -11
- data/spec/runner/formatters/html_spec.rb +1 -0
- data/spec/runner/mspec_spec.rb +31 -0
- data/spec/utils/options_spec.rb +59 -0
- metadata +6 -3
- data/spec/matchers/method_spec.rb +0 -36
data/Rakefile
CHANGED
@@ -18,7 +18,7 @@ spec = Gem::Specification.new do |s|
|
|
18
18
|
|
19
19
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
20
20
|
s.authors = ["Brian Ford"]
|
21
|
-
s.date = %q{2009-
|
21
|
+
s.date = %q{2009-3-1}
|
22
22
|
s.email = %q{bford@engineyard.com}
|
23
23
|
s.has_rdoc = true
|
24
24
|
s.extra_rdoc_files = %w[ README LICENSE ]
|
@@ -13,6 +13,7 @@ class MSpecCI < MSpecScript
|
|
13
13
|
|
14
14
|
options.doc " Ask yourself:"
|
15
15
|
options.doc " 1. How to run the specs?"
|
16
|
+
options.doc " 2. How to modify the guard behavior?"
|
16
17
|
options.doc " 2. How to display the output?"
|
17
18
|
options.doc " 3. What action to perform?"
|
18
19
|
options.doc " 4. When to perform it?"
|
@@ -24,9 +25,12 @@ class MSpecCI < MSpecScript
|
|
24
25
|
options.name
|
25
26
|
options.pretend
|
26
27
|
options.background
|
27
|
-
options.unguarded
|
28
28
|
options.interrupt
|
29
29
|
|
30
|
+
options.doc "\n How to modify the guard behavior"
|
31
|
+
options.unguarded
|
32
|
+
options.verify
|
33
|
+
|
30
34
|
options.doc "\n How to display their output"
|
31
35
|
options.formatters
|
32
36
|
options.verbose
|
@@ -20,9 +20,10 @@ class MSpecRun < MSpecScript
|
|
20
20
|
options.doc " Ask yourself:"
|
21
21
|
options.doc " 1. What specs to run?"
|
22
22
|
options.doc " 2. How to modify the execution?"
|
23
|
-
options.doc " 3. How to
|
24
|
-
options.doc " 4.
|
25
|
-
options.doc " 5.
|
23
|
+
options.doc " 3. How to modify the guard behavior?"
|
24
|
+
options.doc " 4. How to display the output?"
|
25
|
+
options.doc " 5. What action to perform?"
|
26
|
+
options.doc " 6. When to perform it?"
|
26
27
|
|
27
28
|
options.doc "\n What specs to run"
|
28
29
|
options.filters
|
@@ -35,16 +36,18 @@ class MSpecRun < MSpecScript
|
|
35
36
|
options.randomize
|
36
37
|
options.pretend
|
37
38
|
options.background
|
38
|
-
options.unguarded
|
39
39
|
options.interrupt
|
40
40
|
|
41
|
+
options.doc "\n How to modify the guard behavior"
|
42
|
+
options.unguarded
|
43
|
+
options.verify
|
44
|
+
|
41
45
|
options.doc "\n How to display their output"
|
42
46
|
options.formatters
|
43
47
|
options.verbose
|
44
48
|
|
45
49
|
options.doc "\n What action to perform"
|
46
50
|
options.actions
|
47
|
-
options.verify
|
48
51
|
|
49
52
|
options.doc "\n When to perform it"
|
50
53
|
options.action_filters
|
data/lib/mspec/guards/bug.rb
CHANGED
@@ -4,17 +4,21 @@ class BugGuard < VersionGuard
|
|
4
4
|
def initialize(bug, version)
|
5
5
|
@bug = bug
|
6
6
|
@version = SpecVersion.new version, true
|
7
|
+
self.parameters = [@bug, @version]
|
7
8
|
end
|
8
9
|
|
9
10
|
def match?
|
11
|
+
return false if MSpec.mode? :no_ruby_bug
|
10
12
|
standard? && ruby_version <= @version
|
11
13
|
end
|
12
14
|
end
|
13
15
|
|
14
16
|
class Object
|
15
|
-
def ruby_bug(bug
|
17
|
+
def ruby_bug(bug, version)
|
16
18
|
g = BugGuard.new bug, version
|
19
|
+
g.name = :ruby_bug
|
17
20
|
yield if g.yield? true
|
21
|
+
ensure
|
18
22
|
g.unregister
|
19
23
|
end
|
20
24
|
end
|
@@ -2,12 +2,18 @@ require 'mspec/guards/guard'
|
|
2
2
|
|
3
3
|
class CompliantOnGuard < SpecGuard
|
4
4
|
def match?
|
5
|
+
if @args.include? :ruby
|
6
|
+
raise Exception, "improper use of compliant_on guard"
|
7
|
+
end
|
5
8
|
standard? or implementation?(*@args)
|
6
9
|
end
|
7
10
|
end
|
8
11
|
|
9
12
|
class NotCompliantOnGuard < SpecGuard
|
10
13
|
def match?
|
14
|
+
if @args.include? :ruby
|
15
|
+
raise Exception, "improper use of not_compliant_on guard"
|
16
|
+
end
|
11
17
|
standard? or !implementation?(*@args)
|
12
18
|
end
|
13
19
|
end
|
@@ -15,13 +21,17 @@ end
|
|
15
21
|
class Object
|
16
22
|
def compliant_on(*args)
|
17
23
|
g = CompliantOnGuard.new(*args)
|
24
|
+
g.name = :compliant_on
|
18
25
|
yield if g.yield?
|
26
|
+
ensure
|
19
27
|
g.unregister
|
20
28
|
end
|
21
29
|
|
22
30
|
def not_compliant_on(*args)
|
23
31
|
g = NotCompliantOnGuard.new(*args)
|
32
|
+
g.name = :not_compliant_on
|
24
33
|
yield if g.yield?
|
34
|
+
ensure
|
25
35
|
g.unregister
|
26
36
|
end
|
27
37
|
end
|
data/lib/mspec/guards/endian.rb
CHANGED
@@ -28,13 +28,17 @@ end
|
|
28
28
|
class Object
|
29
29
|
def big_endian
|
30
30
|
g = BigEndianGuard.new
|
31
|
+
g.name = :big_endian
|
31
32
|
yield if g.yield?
|
33
|
+
ensure
|
32
34
|
g.unregister
|
33
35
|
end
|
34
36
|
|
35
37
|
def little_endian
|
36
38
|
g = LittleEndianGuard.new
|
39
|
+
g.name = :little_endian
|
37
40
|
yield if g.yield?
|
41
|
+
ensure
|
38
42
|
g.unregister
|
39
43
|
end
|
40
44
|
end
|
data/lib/mspec/guards/guard.rb
CHANGED
@@ -2,21 +2,32 @@ require 'mspec/runner/mspec'
|
|
2
2
|
require 'mspec/runner/actions/tally'
|
3
3
|
|
4
4
|
class SpecGuard
|
5
|
-
def self.
|
6
|
-
|
7
|
-
@tally = TallyAction.new
|
8
|
-
@tally.register
|
9
|
-
MSpec.register :finish, self
|
10
|
-
@registered = true
|
11
|
-
end
|
5
|
+
def self.report
|
6
|
+
@report ||= Hash.new { |h,k| h[k] = [] }
|
12
7
|
end
|
13
8
|
|
14
|
-
def self.
|
15
|
-
@
|
9
|
+
def self.clear
|
10
|
+
@report = nil
|
16
11
|
end
|
17
12
|
|
18
13
|
def self.finish
|
19
|
-
|
14
|
+
report.keys.sort.each do |key|
|
15
|
+
desc = report[key]
|
16
|
+
size = desc.size
|
17
|
+
spec = size == 1 ? "spec" : "specs"
|
18
|
+
print "\n\n#{size} #{spec} omitted by guard: #{key}:\n"
|
19
|
+
desc.each { |desc| print "\n", desc }
|
20
|
+
end
|
21
|
+
|
22
|
+
print "\n\n"
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.guards
|
26
|
+
@guards ||= []
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.clear_guards
|
30
|
+
@guards = []
|
20
31
|
end
|
21
32
|
|
22
33
|
# Returns a partial Ruby version string based on +which+. For example,
|
@@ -49,41 +60,54 @@ class SpecGuard
|
|
49
60
|
!!key.match(/(mswin|mingw)/)
|
50
61
|
end
|
51
62
|
|
63
|
+
attr_accessor :name, :parameters
|
52
64
|
|
53
65
|
def initialize(*args)
|
54
|
-
@args = args
|
66
|
+
self.parameters = @args = args
|
55
67
|
end
|
56
68
|
|
57
69
|
def yield?(invert=false)
|
58
|
-
if MSpec.mode? :unguarded
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
70
|
+
return true if MSpec.mode? :unguarded
|
71
|
+
|
72
|
+
allow = match? ^ invert
|
73
|
+
|
74
|
+
if not allow and reporting?
|
75
|
+
MSpec.guard
|
76
|
+
MSpec.register :finish, SpecGuard
|
77
|
+
MSpec.register :add, self
|
63
78
|
return true
|
64
79
|
elsif MSpec.mode? :verify
|
65
|
-
self.class.register
|
66
|
-
MSpec.register :after, self
|
67
80
|
return true
|
68
81
|
end
|
69
|
-
|
82
|
+
|
83
|
+
allow
|
70
84
|
end
|
71
85
|
|
72
86
|
def ===(other)
|
73
87
|
true
|
74
88
|
end
|
75
89
|
|
76
|
-
def
|
90
|
+
def reporting?
|
91
|
+
MSpec.mode?(:report) or
|
92
|
+
(MSpec.mode?(:report_on) and SpecGuard.guards.include?(name))
|
93
|
+
end
|
94
|
+
|
95
|
+
def report_key
|
96
|
+
"#{name} #{parameters.join(", ")}"
|
97
|
+
end
|
98
|
+
|
99
|
+
def record(description)
|
100
|
+
SpecGuard.report[report_key] << description
|
77
101
|
end
|
78
102
|
|
79
|
-
def
|
103
|
+
def add(example)
|
104
|
+
record example.description
|
105
|
+
MSpec.retrieve(:formatter).tally.counter.guards!
|
80
106
|
end
|
81
107
|
|
82
108
|
def unregister
|
83
|
-
MSpec.
|
84
|
-
MSpec.unregister :
|
85
|
-
MSpec.unregister :exclude, self
|
86
|
-
self.class.unregister
|
109
|
+
MSpec.unguard
|
110
|
+
MSpec.unregister :add, self
|
87
111
|
end
|
88
112
|
|
89
113
|
def implementation?(*args)
|
@@ -7,6 +7,7 @@ class PlatformGuard < SpecGuard
|
|
7
7
|
else
|
8
8
|
@options, @platforms = {}, args
|
9
9
|
end
|
10
|
+
self.parameters = args
|
10
11
|
end
|
11
12
|
|
12
13
|
def match?
|
@@ -26,13 +27,17 @@ end
|
|
26
27
|
class Object
|
27
28
|
def platform_is(*args)
|
28
29
|
g = PlatformGuard.new(*args)
|
30
|
+
g.name = :platform_is
|
29
31
|
yield if g.yield?
|
32
|
+
ensure
|
30
33
|
g.unregister
|
31
34
|
end
|
32
35
|
|
33
36
|
def platform_is_not(*args)
|
34
37
|
g = PlatformGuard.new(*args)
|
38
|
+
g.name = :platform_is_not
|
35
39
|
yield if g.yield? true
|
40
|
+
ensure
|
36
41
|
g.unregister
|
37
42
|
end
|
38
43
|
end
|
data/lib/mspec/guards/runner.rb
CHANGED
@@ -18,13 +18,17 @@ end
|
|
18
18
|
class Object
|
19
19
|
def runner_is(*args)
|
20
20
|
g = RunnerGuard.new(*args)
|
21
|
+
g.name = :runner_is
|
21
22
|
yield if g.yield?
|
23
|
+
ensure
|
22
24
|
g.unregister
|
23
25
|
end
|
24
26
|
|
25
27
|
def runner_is_not(*args)
|
26
28
|
g = RunnerGuard.new(*args)
|
29
|
+
g.name = :runner_is_not
|
27
30
|
yield if g.yield? true
|
31
|
+
ensure
|
28
32
|
g.unregister
|
29
33
|
end
|
30
34
|
end
|
data/lib/mspec/guards/support.rb
CHANGED
data/lib/mspec/guards/tty.rb
CHANGED
data/lib/mspec/guards/version.rb
CHANGED
@@ -11,6 +11,7 @@ class VersionGuard < SpecGuard
|
|
11
11
|
b = SpecVersion.new version.last
|
12
12
|
@version = version.exclude_end? ? a...b : a..b
|
13
13
|
end
|
14
|
+
self.parameters = [version]
|
14
15
|
end
|
15
16
|
|
16
17
|
def ruby_version
|
@@ -29,7 +30,9 @@ end
|
|
29
30
|
class Object
|
30
31
|
def ruby_version_is(*args)
|
31
32
|
g = VersionGuard.new(*args)
|
33
|
+
g.name = :ruby_version_is
|
32
34
|
yield if g.yield?
|
35
|
+
ensure
|
33
36
|
g.unregister
|
34
37
|
end
|
35
38
|
end
|
data/lib/mspec/matchers.rb
CHANGED
@@ -11,6 +11,7 @@ require 'mspec/matchers/eql'
|
|
11
11
|
require 'mspec/matchers/equal'
|
12
12
|
require 'mspec/matchers/equal_element'
|
13
13
|
require 'mspec/matchers/equal_utf16'
|
14
|
+
require 'mspec/matchers/have_constant'
|
14
15
|
require 'mspec/matchers/have_instance_method'
|
15
16
|
require 'mspec/matchers/have_method'
|
16
17
|
require 'mspec/matchers/have_private_instance_method'
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'mspec/matchers/stringsymboladapter'
|
2
|
+
|
3
|
+
class HaveConstantMatcher
|
4
|
+
include StringSymbolAdapter
|
5
|
+
|
6
|
+
def initialize(name)
|
7
|
+
@name = convert_name name
|
8
|
+
end
|
9
|
+
|
10
|
+
def matches?(mod)
|
11
|
+
@mod = mod
|
12
|
+
@mod.constants.include? @name
|
13
|
+
end
|
14
|
+
|
15
|
+
def failure_message
|
16
|
+
["Expected #{@mod} to have constant '#{@name.to_s}'",
|
17
|
+
"but it does not"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def negative_failure_message
|
21
|
+
["Expected #{@mod} NOT to have constant '#{@name.to_s}'",
|
22
|
+
"but it does"]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Object
|
27
|
+
def have_constant(name)
|
28
|
+
HaveConstantMatcher.new name
|
29
|
+
end
|
30
|
+
end
|