argspec 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/lib/argspec.rb +1 -1
- data/lib/argspec/argument.rb +23 -90
- data/lib/argspec/constants.rb +1 -1
- data/lib/argspec/dsl.rb +26 -1
- data/lib/argspec/matchers.rb +2 -60
- data/lib/argspec/matchers/all.rb +82 -0
- data/lib/argspec/matchers/base_matcher.rb +145 -0
- data/lib/argspec/matchers/be.rb +33 -0
- data/lib/argspec/matchers/be_a.rb +32 -0
- data/lib/argspec/matchers/be_empty.rb +17 -0
- data/lib/argspec/matchers/be_falsey.rb +17 -0
- data/lib/argspec/matchers/be_greater_than.rb +32 -0
- data/lib/argspec/matchers/be_greater_than_or_equal_to.rb +32 -0
- data/lib/argspec/matchers/be_less_than.rb +32 -0
- data/lib/argspec/matchers/be_less_than_or_equal_to.rb +32 -0
- data/lib/argspec/matchers/be_nil.rb +17 -0
- data/lib/argspec/matchers/be_truthy.rb +17 -0
- data/lib/argspec/matchers/be_within_range.rb +32 -0
- data/lib/argspec/matchers/case_equal.rb +32 -0
- data/lib/argspec/matchers/contain.rb +32 -0
- data/lib/argspec/matchers/cover.rb +36 -0
- data/lib/argspec/matchers/end_with.rb +32 -0
- data/lib/argspec/matchers/equal.rb +32 -0
- data/lib/argspec/matchers/match.rb +32 -0
- data/lib/argspec/matchers/respond_to.rb +32 -0
- data/lib/argspec/matchers/satisfy.rb +66 -0
- data/lib/argspec/matchers/start_with.rb +32 -0
- metadata +24 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 78bed1162720f96bec34e01c4b6f0dd1fd7d7a75
|
4
|
+
data.tar.gz: 204b8dc5273e335cf2da9f5bd6e30c86a43adc95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cbdb4f44be0effc0cefa45d89e51273af695b169d8c41e3b868e4fc6502fe4ef5d87b7fb01fa327b9d3f487d6855fc28ef68c5b7c635d7b56a2c1e6c0819d4a
|
7
|
+
data.tar.gz: c2fa42bb7e822850b1f2aafb03497888947e1f37904edff56dcf52a972e6e8e8d7c711ed75947f45ce2b87e76449d7c33b049ee3b8d0ab79df54da0fc01f59f6
|
data/README.md
CHANGED
@@ -41,9 +41,9 @@ class Person
|
|
41
41
|
attr_reader :name, :gender, :birthdate
|
42
42
|
|
43
43
|
def initialize(name, gender, birthdate)
|
44
|
-
raise ArgumentError,
|
45
|
-
raise ArgumentError,
|
46
|
-
raise ArgumentError,
|
44
|
+
raise ArgumentError, 'The name must be a string and must not be nil.' if !name.is_a?(String) || name.empty?
|
45
|
+
raise ArgumentError, 'The gender must be a symbol.' unless gender.is_a?(Symbol)
|
46
|
+
raise ArgumentError, 'The birthdate must be a date.' unless birthdate.is_a?(Date)
|
47
47
|
|
48
48
|
@name = name
|
49
49
|
@gender = gender
|
data/lib/argspec.rb
CHANGED
data/lib/argspec/argument.rb
CHANGED
@@ -1,130 +1,63 @@
|
|
1
1
|
module ArgumentSpecification
|
2
2
|
class Argument
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :actual
|
4
4
|
|
5
5
|
# Create a new argument
|
6
6
|
#
|
7
7
|
# Arguments:
|
8
|
-
#
|
8
|
+
# actual: (Object)
|
9
9
|
#
|
10
10
|
# Example:
|
11
11
|
# >> test = :test
|
12
12
|
# >> ArgumentSpecification::Argument.new(test)
|
13
|
-
# => #<Argument:0x00000000000000 @
|
13
|
+
# => #<Argument:0x00000000000000 @actual=:test>
|
14
14
|
#
|
15
|
-
def initialize(
|
16
|
-
@
|
15
|
+
def initialize(actual)
|
16
|
+
@actual = actual
|
17
17
|
end
|
18
18
|
|
19
|
-
#
|
19
|
+
# Ensure the argument matches
|
20
20
|
#
|
21
21
|
# Arguments:
|
22
|
-
# matcher: (
|
23
|
-
# args: (Splat)
|
22
|
+
# matcher: (Matchers::BaseMatcher)
|
24
23
|
#
|
25
24
|
# Example:
|
26
|
-
# >> argument.should(
|
25
|
+
# >> argument.should be_a(Symbol)
|
27
26
|
# => nil
|
28
27
|
#
|
29
28
|
# Raises:
|
30
|
-
# ArgumentError:
|
29
|
+
# ArgumentError: When the argument does not match
|
31
30
|
#
|
32
|
-
def should(matcher
|
33
|
-
|
31
|
+
def should(matcher)
|
32
|
+
return nil unless matcher.is_a?(Matchers::BaseMatcher)
|
34
33
|
|
35
|
-
|
34
|
+
matcher.send(:actual=, @actual)
|
36
35
|
|
37
|
-
|
38
|
-
end
|
36
|
+
return nil if matcher.matches?
|
39
37
|
|
40
|
-
|
41
|
-
#
|
42
|
-
# Arguments:
|
43
|
-
# matcher: (Symbol) A method name as a symbol (see the matchers.rb file)
|
44
|
-
# args: (Splat)
|
45
|
-
#
|
46
|
-
# Example:
|
47
|
-
# >> argument.should_not(:be, true)
|
48
|
-
# => nil
|
49
|
-
#
|
50
|
-
# Raises:
|
51
|
-
# ArgumentError: If the matcher determines the object does match
|
52
|
-
#
|
53
|
-
def should_not(matcher, *args)
|
54
|
-
ensure_matcher(matcher)
|
55
|
-
|
56
|
-
return if Matchers.send(matcher, self, *args) == false
|
57
|
-
|
58
|
-
raise ArgumentError, "'#{prettify_object}' should not #{prettify_matcher(matcher)} '#{prettify_args(args)}'"
|
38
|
+
raise ArgumentError, matcher.failure_message
|
59
39
|
end
|
60
40
|
|
61
|
-
|
62
|
-
# Ensure a matcher exists
|
41
|
+
# Ensure the argument does not match
|
63
42
|
#
|
64
43
|
# Arguments:
|
65
|
-
# matcher: (
|
44
|
+
# matcher: (Matchers::BaseMatcher)
|
66
45
|
#
|
67
46
|
# Example:
|
68
|
-
# >>
|
47
|
+
# >> argument.should_not be_a(Symbol)
|
69
48
|
# => nil
|
70
49
|
#
|
71
50
|
# Raises:
|
72
|
-
# ArgumentError:
|
73
|
-
#
|
74
|
-
def ensure_matcher(matcher)
|
75
|
-
return if Matchers.all.include?(matcher)
|
76
|
-
|
77
|
-
raise ArgumentError, "The matcher '#{matcher}' does not exist."
|
78
|
-
end
|
79
|
-
|
80
|
-
# Prettify a matcher
|
51
|
+
# ArgumentError: When the argument matches
|
81
52
|
#
|
82
|
-
|
83
|
-
|
84
|
-
#
|
85
|
-
# Example:
|
86
|
-
# >> prettify_matcher(:be_a)
|
87
|
-
# => "be a"
|
88
|
-
#
|
89
|
-
def prettify_matcher(matcher)
|
90
|
-
matcher.to_s.gsub('_', ' ')
|
91
|
-
end
|
53
|
+
def should_not(matcher)
|
54
|
+
return nil unless matcher.is_a?(Matchers::BaseMatcher)
|
92
55
|
|
93
|
-
|
94
|
-
#
|
95
|
-
# Arguments:
|
96
|
-
# args: (Array)
|
97
|
-
#
|
98
|
-
# Example:
|
99
|
-
# >> prettify_args([:a])
|
100
|
-
# => ":a"
|
101
|
-
#
|
102
|
-
def prettify_args(args)
|
103
|
-
pretty_args = args.map do |argument|
|
104
|
-
if argument == nil
|
105
|
-
next 'nil'
|
106
|
-
elsif argument.is_a?(Symbol)
|
107
|
-
next ":#{argument}"
|
108
|
-
else
|
109
|
-
next argument
|
110
|
-
end
|
111
|
-
end
|
56
|
+
matcher.send(:actual=, @actual)
|
112
57
|
|
113
|
-
return
|
114
|
-
return pretty_args.first if pretty_args.count == 1
|
115
|
-
|
116
|
-
pretty_args
|
117
|
-
end
|
58
|
+
return nil unless matcher.matches?
|
118
59
|
|
119
|
-
|
120
|
-
#
|
121
|
-
# Example:
|
122
|
-
# >> # argument.object = :a
|
123
|
-
# >> prettify_object
|
124
|
-
# => ":a"
|
125
|
-
#
|
126
|
-
def prettify_object
|
127
|
-
prettify_args([@object])
|
60
|
+
raise ArgumentError, matcher.failure_message_when_negated
|
128
61
|
end
|
129
62
|
end
|
130
63
|
end
|
data/lib/argspec/constants.rb
CHANGED
data/lib/argspec/dsl.rb
CHANGED
@@ -1,9 +1,34 @@
|
|
1
1
|
module ArgumentSpecification
|
2
2
|
module DSL
|
3
|
+
class << self
|
4
|
+
# Register a matcher
|
5
|
+
#
|
6
|
+
# Arguments:
|
7
|
+
# klass: (Matchers::BaseMatcher)
|
8
|
+
# name: (Symbol)
|
9
|
+
#
|
10
|
+
# Example:
|
11
|
+
# >> register_matcher(TestMatcher, :test_matcher)
|
12
|
+
# => true
|
13
|
+
#
|
14
|
+
def register_matcher(klass, name)
|
15
|
+
return unless klass.ancestors.include?(Matchers::BaseMatcher)
|
16
|
+
return unless name.is_a?(Symbol)
|
17
|
+
|
18
|
+
module_eval <<-EOS
|
19
|
+
def #{name}(*args, &block)
|
20
|
+
instance = #{klass}.new(*args, &block)
|
21
|
+
instance.send(:setup, '#{name}'.to_sym, args)
|
22
|
+
instance
|
23
|
+
end
|
24
|
+
EOS
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
3
28
|
# Get an argument object
|
4
29
|
#
|
5
30
|
# Arguments:
|
6
|
-
# object: (
|
31
|
+
# object: (Object)
|
7
32
|
#
|
8
33
|
# Example:
|
9
34
|
# >> test = :test
|
data/lib/argspec/matchers.rb
CHANGED
@@ -1,60 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
class << self
|
4
|
-
# Get an array of all available matchers
|
5
|
-
#
|
6
|
-
# Example:
|
7
|
-
# >> all
|
8
|
-
# => [:be, ...]
|
9
|
-
#
|
10
|
-
def all
|
11
|
-
[:be, :be_a, :include]
|
12
|
-
end
|
13
|
-
|
14
|
-
# The be matcher
|
15
|
-
#
|
16
|
-
# Arguments:
|
17
|
-
# argument: (ArgumentSpecification::Argument)
|
18
|
-
# object: (?)
|
19
|
-
#
|
20
|
-
# Example:
|
21
|
-
# >> test = 'Test'
|
22
|
-
# >> argument(test).should_not(:be, nil)
|
23
|
-
# => nil
|
24
|
-
#
|
25
|
-
def be(argument, object)
|
26
|
-
argument.object == object
|
27
|
-
end
|
28
|
-
|
29
|
-
# The be_a matcher
|
30
|
-
#
|
31
|
-
# Arguments:
|
32
|
-
# argument: (ArgumentSpecification::Argument)
|
33
|
-
# object: (?)
|
34
|
-
#
|
35
|
-
# Example:
|
36
|
-
# >> test = :test
|
37
|
-
# >> argument(test).should(:be_a, Symbol)
|
38
|
-
# => nil
|
39
|
-
#
|
40
|
-
def be_a(argument, klass)
|
41
|
-
argument.object.is_a?(klass)
|
42
|
-
end
|
43
|
-
|
44
|
-
# The include matcher
|
45
|
-
#
|
46
|
-
# Arguments:
|
47
|
-
# argument: (ArgumentSpecification::Argument)
|
48
|
-
# object: (?)
|
49
|
-
#
|
50
|
-
# Example:
|
51
|
-
# >> test = [:test]
|
52
|
-
# >> argument(test).should(:include, :test)
|
53
|
-
# => nil
|
54
|
-
#
|
55
|
-
def include(argument, object)
|
56
|
-
argument.object.include?(object)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
1
|
+
require 'argspec/matchers/base_matcher'
|
2
|
+
Dir.glob(File.expand_path('../matchers/**/*.rb', __FILE__)).each { |f| require(f) }
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class All < BaseMatcher
|
4
|
+
matcher_name :all
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (BaseMatcher)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> symbol_matcher = ArgumentSpecification::Matchers::BeA.new(Symbol)
|
15
|
+
# >> ArgumentSpecification::Matchers::All.new(symbol_matcher)
|
16
|
+
# => #<ArgumentSpecification::Matchers::All:0x00000000000000 @expected=#<ArgumentSpecification::Matchers::BeA:0x00000000000000 @expected=Symbol>>
|
17
|
+
#
|
18
|
+
def initialize(expected)
|
19
|
+
if expected.is_a?(BaseMatcher) == false || expected.is_a?(All)
|
20
|
+
raise ArgumentError, 'You must provide a matcher as an argument (excluding the all matcher).'
|
21
|
+
end
|
22
|
+
|
23
|
+
@expected = expected
|
24
|
+
end
|
25
|
+
|
26
|
+
# The failure message when using 'should'
|
27
|
+
#
|
28
|
+
# Example:
|
29
|
+
# >> matcher.failure_message
|
30
|
+
# => "'test' should be a 'Symbol'"
|
31
|
+
#
|
32
|
+
def failure_message
|
33
|
+
actual = prettify_args(@actual)
|
34
|
+
matcher = prettify_matcher(@expected.metadata[:name])
|
35
|
+
|
36
|
+
if @expected.metadata[:args].count > 0
|
37
|
+
args = prettify_args(*@expected.metadata[:args])
|
38
|
+
|
39
|
+
"'#{actual}' should all #{matcher} '#{args}'"
|
40
|
+
else
|
41
|
+
"'#{actual}' should all #{matcher}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# The failure message when using 'should not'
|
46
|
+
#
|
47
|
+
# Example:
|
48
|
+
# >> matcher.failure_message_when_negated
|
49
|
+
# => "':test' should not be a 'Symbol'"
|
50
|
+
#
|
51
|
+
def failure_message_when_negated
|
52
|
+
actual = prettify_args(@actual)
|
53
|
+
matcher = prettify_matcher(@expected.metadata[:name])
|
54
|
+
|
55
|
+
if @expected.metadata[:args].count > 0
|
56
|
+
args = prettify_args(*@expected.metadata[:args])
|
57
|
+
|
58
|
+
"'#{actual}' should not all #{matcher} '#{args}'"
|
59
|
+
else
|
60
|
+
"'#{actual}' should not all #{matcher}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Check if the actual object matches
|
65
|
+
#
|
66
|
+
# Example:
|
67
|
+
# >> matcher.matches?
|
68
|
+
# => true
|
69
|
+
#
|
70
|
+
def matches?
|
71
|
+
actual = @actual.is_a?(Array) ? @actual : [@actual]
|
72
|
+
actual.each do |value|
|
73
|
+
@expected.send(:actual=, value)
|
74
|
+
|
75
|
+
return false unless @expected.matches?
|
76
|
+
end
|
77
|
+
|
78
|
+
true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class BaseMatcher
|
4
|
+
class << self
|
5
|
+
# Add matcher names
|
6
|
+
#
|
7
|
+
# Arguments:
|
8
|
+
# names: (Splat)
|
9
|
+
#
|
10
|
+
# Example:
|
11
|
+
# >> class TestMatcher < BaseMatcher
|
12
|
+
# >> matcher_name :test_matcher
|
13
|
+
# >> end
|
14
|
+
# => TestMatcher
|
15
|
+
#
|
16
|
+
def matcher_name(*names)
|
17
|
+
names.each do |name|
|
18
|
+
next unless name.is_a?(Symbol)
|
19
|
+
|
20
|
+
DSL.register_matcher(self, name)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_reader :actual, :metadata
|
26
|
+
|
27
|
+
# The failure message when using 'should'
|
28
|
+
#
|
29
|
+
# Example:
|
30
|
+
# >> matcher.failure_message
|
31
|
+
# => "'test' should be a 'Symbol'"
|
32
|
+
#
|
33
|
+
def failure_message
|
34
|
+
actual = prettify_args(@actual)
|
35
|
+
matcher = prettify_matcher(@metadata[:name])
|
36
|
+
|
37
|
+
if @metadata[:args].count > 0
|
38
|
+
args = prettify_args(*@metadata[:args])
|
39
|
+
|
40
|
+
"'#{actual}' should #{matcher} '#{args}'"
|
41
|
+
else
|
42
|
+
"'#{actual}' should #{matcher}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# The failure message when using 'should not'
|
47
|
+
#
|
48
|
+
# Example:
|
49
|
+
# >> matcher.failure_message_when_negated
|
50
|
+
# => "':test' should not be a 'Symbol'"
|
51
|
+
#
|
52
|
+
def failure_message_when_negated
|
53
|
+
actual = prettify_args(@actual)
|
54
|
+
matcher = prettify_matcher(@metadata[:name])
|
55
|
+
|
56
|
+
if @metadata[:args].count > 0
|
57
|
+
args = prettify_args(*@metadata[:args])
|
58
|
+
|
59
|
+
"'#{actual}' should not #{matcher} '#{args}'"
|
60
|
+
else
|
61
|
+
"'#{actual}' should not #{matcher}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Check if the actual object matches
|
66
|
+
#
|
67
|
+
# You must override this method!
|
68
|
+
#
|
69
|
+
# Example:
|
70
|
+
# >> matcher.matches?
|
71
|
+
# => true
|
72
|
+
#
|
73
|
+
def matches?
|
74
|
+
raise NotImplementedError, 'You must override the matches? method in your matcher.'
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
# Setup the matcher
|
79
|
+
#
|
80
|
+
# Arguments:
|
81
|
+
# name: (Symbol)
|
82
|
+
# args: (Array)
|
83
|
+
#
|
84
|
+
# Example:
|
85
|
+
# >> matcher.setup(:test_matcher, [])
|
86
|
+
# => { name: :test_matcher, args: [] }
|
87
|
+
#
|
88
|
+
def setup(name, args)
|
89
|
+
@metadata = { name: name, args: args }
|
90
|
+
end
|
91
|
+
|
92
|
+
# Set the actual object
|
93
|
+
#
|
94
|
+
# Arguments:
|
95
|
+
# actual: (Object)
|
96
|
+
#
|
97
|
+
# Example:
|
98
|
+
# >> matcher.actual = :test
|
99
|
+
# => :test
|
100
|
+
#
|
101
|
+
def actual=(actual)
|
102
|
+
@actual = actual
|
103
|
+
end
|
104
|
+
|
105
|
+
# Prettify a matcher
|
106
|
+
#
|
107
|
+
# Arguments:
|
108
|
+
# matcher: (String)
|
109
|
+
#
|
110
|
+
# Example:
|
111
|
+
# >> prettify_matcher(:be_a)
|
112
|
+
# => "be a"
|
113
|
+
#
|
114
|
+
def prettify_matcher(matcher)
|
115
|
+
matcher.to_s.gsub('_', ' ')
|
116
|
+
end
|
117
|
+
|
118
|
+
# Prettify arguments
|
119
|
+
#
|
120
|
+
# Arguments:
|
121
|
+
# args: (Splat)
|
122
|
+
#
|
123
|
+
# Example:
|
124
|
+
# >> prettify_args(:a)
|
125
|
+
# => ":a"
|
126
|
+
#
|
127
|
+
def prettify_args(*args)
|
128
|
+
pretty_args = args.map do |argument|
|
129
|
+
if argument == nil
|
130
|
+
next 'nil'
|
131
|
+
elsif argument.is_a?(Symbol)
|
132
|
+
next ":#{argument}"
|
133
|
+
else
|
134
|
+
next argument
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
return 'nil' if pretty_args.empty?
|
139
|
+
return pretty_args.first if pretty_args.count == 1
|
140
|
+
|
141
|
+
pretty_args
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class Be < BaseMatcher
|
4
|
+
matcher_name :be
|
5
|
+
|
6
|
+
OPERATORS = {
|
7
|
+
:== => :equal,
|
8
|
+
:=== => :case_equal,
|
9
|
+
:=~ => :match,
|
10
|
+
:< => :be_less_than,
|
11
|
+
:> => :be_greater_than,
|
12
|
+
:<= => :be_less_than_or_equal_to,
|
13
|
+
:>= => :be_greater_than_or_equal_to
|
14
|
+
}
|
15
|
+
|
16
|
+
OPERATORS.keys.each do |operator|
|
17
|
+
define_method(operator) do |expected|
|
18
|
+
send(OPERATORS[operator], expected)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Check if the actual object matches
|
23
|
+
#
|
24
|
+
# Example:
|
25
|
+
# >> matcher.matches?
|
26
|
+
# => true
|
27
|
+
#
|
28
|
+
def matches?
|
29
|
+
!!@actual
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class BeA < BaseMatcher
|
4
|
+
matcher_name :be_a, :be_an
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (Class)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::BeA.new(Symbol)
|
15
|
+
# => #<ArgumentSpecification::Matchers::BeA:0x00000000000000 @expected=Symbol>
|
16
|
+
#
|
17
|
+
def initialize(expected)
|
18
|
+
@expected = expected
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@actual.is_a?(@expected)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class BeEmpty < BaseMatcher
|
4
|
+
matcher_name :be_empty
|
5
|
+
|
6
|
+
# Check if the actual object matches
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
# >> matcher.matches?
|
10
|
+
# => true
|
11
|
+
#
|
12
|
+
def matches?
|
13
|
+
@actual.empty?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class BeFalsey < BaseMatcher
|
4
|
+
matcher_name :be_falsey
|
5
|
+
|
6
|
+
# Check if the actual object matches
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
# >> matcher.matches?
|
10
|
+
# => true
|
11
|
+
#
|
12
|
+
def matches?
|
13
|
+
!@actual
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class BeGreaterThan < BaseMatcher
|
4
|
+
matcher_name :be_greater_than
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (Object)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::BeGreaterThan.new(10)
|
15
|
+
# => #<ArgumentSpecification::Matchers::BeGreaterThan:0x00000000000000 @expected=10>
|
16
|
+
#
|
17
|
+
def initialize(expected)
|
18
|
+
@expected = expected
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@actual > @expected
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class BeGreaterThanOrEqualTo < BaseMatcher
|
4
|
+
matcher_name :be_greater_than_or_equal_to
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (Object)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::BeGreaterThanOrEqualTo.new(10)
|
15
|
+
# => #<ArgumentSpecification::Matchers::BeGreaterThanOrEqualTo:0x00000000000000 @expected=10>
|
16
|
+
#
|
17
|
+
def initialize(expected)
|
18
|
+
@expected = expected
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@actual >= @expected
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class BeLessThan < BaseMatcher
|
4
|
+
matcher_name :be_less_than
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (Object)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::BeLessThan.new(10)
|
15
|
+
# => #<ArgumentSpecification::Matchers::BeLessThan:0x00000000000000 @expected=10>
|
16
|
+
#
|
17
|
+
def initialize(expected)
|
18
|
+
@expected = expected
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@actual < @expected
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class BeLessThanOrEqualTo < BaseMatcher
|
4
|
+
matcher_name :be_less_than_or_equal_to
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (Object)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::BeLessThanOrEqualTo.new(10)
|
15
|
+
# => #<ArgumentSpecification::Matchers::BeLessThanOrEqualTo:0x00000000000000 @expected=10>
|
16
|
+
#
|
17
|
+
def initialize(expected)
|
18
|
+
@expected = expected
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@actual <= @expected
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class BeNil < BaseMatcher
|
4
|
+
matcher_name :be_nil
|
5
|
+
|
6
|
+
# Check if the actual object matches
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
# >> matcher.matches?
|
10
|
+
# => true
|
11
|
+
#
|
12
|
+
def matches?
|
13
|
+
@actual.nil?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class BeTruthy < BaseMatcher
|
4
|
+
matcher_name :be_truthy
|
5
|
+
|
6
|
+
# Check if the actual object matches
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
# >> matcher.matches?
|
10
|
+
# => true
|
11
|
+
#
|
12
|
+
def matches?
|
13
|
+
!!@actual
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class BeWithinRange < BaseMatcher
|
4
|
+
matcher_name :be_within_range
|
5
|
+
|
6
|
+
attr_reader :range
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# range: (Range)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::BeWithinRange.new(1..10)
|
15
|
+
# => #<ArgumentSpecification::Matchers::BeWithinRange:0x00000000000000 @range=1..10>
|
16
|
+
#
|
17
|
+
def initialize(range)
|
18
|
+
@range = range
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@range.include?(@actual)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class CaseEqual < BaseMatcher
|
4
|
+
matcher_name :case_equal
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (Object)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::CaseEqual.new(:test)
|
15
|
+
# => #<ArgumentSpecification::Matchers::CaseEqual:0x00000000000000 @expected=:test>
|
16
|
+
#
|
17
|
+
def initialize(expected)
|
18
|
+
@expected = expected
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@actual === @expected
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class Contain < BaseMatcher
|
4
|
+
matcher_name :contain
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (Object)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::Contain.new(Symbol)
|
15
|
+
# => #<ArgumentSpecification::Matchers::Contain:0x00000000000000 @expected=Symbol>
|
16
|
+
#
|
17
|
+
def initialize(expected)
|
18
|
+
@expected = expected
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@actual.include?(@expected)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class Cover < BaseMatcher
|
4
|
+
matcher_name :cover
|
5
|
+
|
6
|
+
attr_reader :values
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# values: (Splat)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::Cover.new(1, 2)
|
15
|
+
# => #<ArgumentSpecification::Matchers::Cover:0x00000000000000 @values=[1, 2]>
|
16
|
+
#
|
17
|
+
def initialize(*values)
|
18
|
+
@values = values
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@values.each do |value|
|
29
|
+
return false unless @actual.include?(value)
|
30
|
+
end
|
31
|
+
|
32
|
+
true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class EndWith < BaseMatcher
|
4
|
+
matcher_name :end_with
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (String)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::EndWith.new("test")
|
15
|
+
# => #<ArgumentSpecification::Matchers::EndWith:0x00000000000000 @expected="test">
|
16
|
+
#
|
17
|
+
def initialize(expected)
|
18
|
+
@expected = expected
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@actual.end_with?(@expected)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class Equal < BaseMatcher
|
4
|
+
matcher_name :equal
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (Object)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::Equal.new(:test)
|
15
|
+
# => #<ArgumentSpecification::Matchers::Equal:0x00000000000000 @expected=:test>
|
16
|
+
#
|
17
|
+
def initialize(expected)
|
18
|
+
@expected = expected
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@actual == @expected
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class Match < BaseMatcher
|
4
|
+
matcher_name :match
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (Object)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::Match.new(Symbol)
|
15
|
+
# => #<ArgumentSpecification::Matchers::Match:0x00000000000000 @expected=Symbol>
|
16
|
+
#
|
17
|
+
def initialize(expected)
|
18
|
+
@expected = expected
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@actual =~ @expected
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class RespondTo < BaseMatcher
|
4
|
+
matcher_name :respond_to
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (Symbol)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::RespondTo.new(:hello)
|
15
|
+
# => #<ArgumentSpecification::Matchers::RespondTo:0x00000000000000 @expected=:hello>
|
16
|
+
#
|
17
|
+
def initialize(expected)
|
18
|
+
@expected = expected
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@actual.respond_to?(@expected)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class Satisfy < BaseMatcher
|
4
|
+
matcher_name :satisfy
|
5
|
+
|
6
|
+
attr_reader :description, :block
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# description: (String)
|
12
|
+
# block: (Block)
|
13
|
+
#
|
14
|
+
# Example:
|
15
|
+
# >> ArgumentSpecification::Matchers::Satisfy.new('always pass') { true }
|
16
|
+
# => #<ArgumentSpecification::Matchers::Satisfy:0x00000000000000 @block=#<Proc:0x00000000000000>>
|
17
|
+
#
|
18
|
+
def initialize(description, &block)
|
19
|
+
@description = description
|
20
|
+
@block = block
|
21
|
+
end
|
22
|
+
|
23
|
+
# The failure message when using 'should'
|
24
|
+
#
|
25
|
+
# Example:
|
26
|
+
# >> matcher.failure_message
|
27
|
+
# => "'test' should always pass"
|
28
|
+
#
|
29
|
+
def failure_message
|
30
|
+
actual = prettify_args(@actual)
|
31
|
+
|
32
|
+
if @description
|
33
|
+
"'#{actual}' should #{@description}"
|
34
|
+
else
|
35
|
+
"'#{actual}' should satisfy the requirements"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# The failure message when using 'should not'
|
40
|
+
#
|
41
|
+
# Example:
|
42
|
+
# >> matcher.failure_message_when_negated
|
43
|
+
# => "':test' should not always pass"
|
44
|
+
#
|
45
|
+
def failure_message_when_negated
|
46
|
+
actual = prettify_args(@actual)
|
47
|
+
|
48
|
+
if @description
|
49
|
+
"'#{actual}' should not #{@description}"
|
50
|
+
else
|
51
|
+
"'#{actual}' should not satisfy the requirements"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Check if the actual object matches
|
56
|
+
#
|
57
|
+
# Example:
|
58
|
+
# >> matcher.matches?
|
59
|
+
# => true
|
60
|
+
#
|
61
|
+
def matches?
|
62
|
+
@block.call(@actual)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ArgumentSpecification
|
2
|
+
module Matchers
|
3
|
+
class StartWith < BaseMatcher
|
4
|
+
matcher_name :start_with, :begin_with
|
5
|
+
|
6
|
+
attr_reader :expected
|
7
|
+
|
8
|
+
# Create a new matcher instance
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# expected: (String)
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# >> ArgumentSpecification::Matchers::StartWith.new("test")
|
15
|
+
# => #<ArgumentSpecification::Matchers::StartWith:0x00000000000000 @expected="test">
|
16
|
+
#
|
17
|
+
def initialize(expected)
|
18
|
+
@expected = expected
|
19
|
+
end
|
20
|
+
|
21
|
+
# Check if the actual object matches
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# >> matcher.matches?
|
25
|
+
# => true
|
26
|
+
#
|
27
|
+
def matches?
|
28
|
+
@actual.start_with?(@expected)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: argspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nialto Services
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -73,6 +73,28 @@ files:
|
|
73
73
|
- lib/argspec/constants.rb
|
74
74
|
- lib/argspec/dsl.rb
|
75
75
|
- lib/argspec/matchers.rb
|
76
|
+
- lib/argspec/matchers/all.rb
|
77
|
+
- lib/argspec/matchers/base_matcher.rb
|
78
|
+
- lib/argspec/matchers/be.rb
|
79
|
+
- lib/argspec/matchers/be_a.rb
|
80
|
+
- lib/argspec/matchers/be_empty.rb
|
81
|
+
- lib/argspec/matchers/be_falsey.rb
|
82
|
+
- lib/argspec/matchers/be_greater_than.rb
|
83
|
+
- lib/argspec/matchers/be_greater_than_or_equal_to.rb
|
84
|
+
- lib/argspec/matchers/be_less_than.rb
|
85
|
+
- lib/argspec/matchers/be_less_than_or_equal_to.rb
|
86
|
+
- lib/argspec/matchers/be_nil.rb
|
87
|
+
- lib/argspec/matchers/be_truthy.rb
|
88
|
+
- lib/argspec/matchers/be_within_range.rb
|
89
|
+
- lib/argspec/matchers/case_equal.rb
|
90
|
+
- lib/argspec/matchers/contain.rb
|
91
|
+
- lib/argspec/matchers/cover.rb
|
92
|
+
- lib/argspec/matchers/end_with.rb
|
93
|
+
- lib/argspec/matchers/equal.rb
|
94
|
+
- lib/argspec/matchers/match.rb
|
95
|
+
- lib/argspec/matchers/respond_to.rb
|
96
|
+
- lib/argspec/matchers/satisfy.rb
|
97
|
+
- lib/argspec/matchers/start_with.rb
|
76
98
|
- spec/argspec_spec.rb
|
77
99
|
- spec/spec_helper.rb
|
78
100
|
homepage: https://rubygems.org/gems/argspec
|