remarkable 3.0.1 → 3.0.2
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/CHANGELOG +11 -11
- data/LICENSE +1 -1
- data/README +189 -189
- data/lib/remarkable.rb +6 -6
- data/lib/remarkable/base.rb +2 -2
- data/lib/remarkable/dsl.rb +15 -15
- data/lib/remarkable/dsl/assertions.rb +8 -8
- data/lib/remarkable/dsl/callbacks.rb +39 -39
- data/lib/remarkable/dsl/matches.rb +52 -52
- data/lib/remarkable/dsl/optionals.rb +46 -46
- data/lib/remarkable/macros.rb +33 -33
- data/lib/remarkable/matchers.rb +13 -13
- data/lib/remarkable/messages.rb +10 -10
- data/lib/remarkable/pending.rb +27 -27
- data/lib/remarkable/version.rb +1 -1
- data/spec/base_spec.rb +8 -8
- data/spec/dsl/assertions_spec.rb +3 -3
- data/spec/dsl/optionals_spec.rb +2 -2
- data/spec/locale/en.yml +1 -1
- data/spec/locale/pt-BR.yml +1 -1
- data/spec/macros_spec.rb +7 -7
- data/spec/matchers/single_contain_matcher.rb +6 -6
- data/spec/messages_spec.rb +5 -5
- data/spec/pending_spec.rb +7 -7
- metadata +2 -2
data/lib/remarkable/dsl.rb
CHANGED
@@ -5,18 +5,18 @@ require File.join(dir, 'dsl', 'matches')
|
|
5
5
|
require File.join(dir, 'dsl', 'callbacks')
|
6
6
|
|
7
7
|
module Remarkable
|
8
|
-
module DSL
|
9
|
-
ATTR_READERS = [ :matcher_arguments, :matcher_optionals, :matcher_single_assertions,
|
10
|
-
:matcher_collection_assertions, :before_assert_callbacks, :after_initialize_callbacks
|
11
|
-
] unless self.const_defined?(:ATTR_READERS)
|
8
|
+
module DSL
|
9
|
+
ATTR_READERS = [ :matcher_arguments, :matcher_optionals, :matcher_single_assertions,
|
10
|
+
:matcher_collection_assertions, :before_assert_callbacks, :after_initialize_callbacks
|
11
|
+
] unless self.const_defined?(:ATTR_READERS)
|
12
12
|
|
13
|
-
def self.extended(base) #:nodoc:
|
14
|
-
base.extend Assertions
|
15
|
-
base.send :include, Callbacks
|
13
|
+
def self.extended(base) #:nodoc:
|
14
|
+
base.extend Assertions
|
15
|
+
base.send :include, Callbacks
|
16
16
|
base.send :include, Matches
|
17
|
-
base.send :include, Optionals
|
18
|
-
|
19
|
-
# Initialize matcher_arguments hash with names as an empty array
|
17
|
+
base.send :include, Optionals
|
18
|
+
|
19
|
+
# Initialize matcher_arguments hash with names as an empty array
|
20
20
|
base.instance_variable_set('@matcher_arguments', { :names => [] })
|
21
21
|
end
|
22
22
|
|
@@ -28,11 +28,11 @@ module Remarkable
|
|
28
28
|
attr_reader *ATTR_READERS
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
32
|
-
ATTR_READERS.each do |attr|
|
33
|
-
current_value = self.instance_variable_get("@#{attr}")
|
34
|
-
base.instance_variable_set("@#{attr}", current_value ? current_value.dup : [])
|
35
|
-
end
|
31
|
+
|
32
|
+
ATTR_READERS.each do |attr|
|
33
|
+
current_value = self.instance_variable_get("@#{attr}")
|
34
|
+
base.instance_variable_set("@#{attr}", current_value ? current_value.dup : [])
|
35
|
+
end
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -64,12 +64,12 @@ module Remarkable
|
|
64
64
|
@matcher_arguments[:names] = names
|
65
65
|
|
66
66
|
if collection = options.delete(:collection)
|
67
|
-
@matcher_arguments[:collection] = collection
|
68
|
-
|
67
|
+
@matcher_arguments[:collection] = collection
|
68
|
+
|
69
69
|
if options[:as]
|
70
|
-
@matcher_arguments[:as] = options.delete(:as)
|
71
|
-
else
|
72
|
-
raise ArgumentError, 'You gave me :collection as option but have not give me :as as well'
|
70
|
+
@matcher_arguments[:as] = options.delete(:as)
|
71
|
+
else
|
72
|
+
raise ArgumentError, 'You gave me :collection as option but have not give me :as as well'
|
73
73
|
end
|
74
74
|
|
75
75
|
args << "*#{collection}"
|
@@ -147,7 +147,7 @@ END
|
|
147
147
|
# Or you can set the message in the instance variable @expectation in the
|
148
148
|
# assertion method if you don't want to rely on I18n API.
|
149
149
|
#
|
150
|
-
# As you might have noticed from the examples above, this method is also
|
150
|
+
# As you might have noticed from the examples above, this method is also
|
151
151
|
# aliased as <tt>collection_assertion</tt>.
|
152
152
|
#
|
153
153
|
def collection_assertions(*methods, &block)
|
@@ -156,8 +156,8 @@ END
|
|
156
156
|
end
|
157
157
|
alias :collection_assertion :collection_assertions
|
158
158
|
|
159
|
-
# In contrast to <tt>collection_assertions</tt>, the methods given here
|
160
|
-
# are called just once. In other words, it does not iterate through the
|
159
|
+
# In contrast to <tt>collection_assertions</tt>, the methods given here
|
160
|
+
# are called just once. In other words, it does not iterate through the
|
161
161
|
# collection given in arguments.
|
162
162
|
#
|
163
163
|
# It also accepts blocks and is aliased as assertion.
|
@@ -1,52 +1,52 @@
|
|
1
1
|
module Remarkable
|
2
2
|
module DSL
|
3
3
|
module Callbacks
|
4
|
-
|
5
|
-
def self.included(base) #:nodoc:
|
6
|
-
base.extend ClassMethods
|
7
|
-
end
|
8
|
-
|
9
|
-
module ClassMethods
|
4
|
+
|
5
|
+
def self.included(base) #:nodoc:
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
10
|
protected
|
11
11
|
# Class method that accepts a block or a symbol which is called after initialization.
|
12
12
|
#
|
13
|
-
def after_initialize(symbol=nil, &block)
|
14
|
-
if block_given?
|
15
|
-
@after_initialize_callbacks << block
|
16
|
-
elsif symbol
|
17
|
-
@after_initialize_callbacks << symbol
|
18
|
-
end
|
13
|
+
def after_initialize(symbol=nil, &block)
|
14
|
+
if block_given?
|
15
|
+
@after_initialize_callbacks << block
|
16
|
+
elsif symbol
|
17
|
+
@after_initialize_callbacks << symbol
|
18
|
+
end
|
19
19
|
end
|
20
20
|
|
21
21
|
# Class method that accepts a block or a symbol which is called before assertion.
|
22
22
|
#
|
23
|
-
def before_assert(symbol=nil, &block)
|
24
|
-
if block_given?
|
25
|
-
@before_assert_callbacks << block
|
26
|
-
elsif symbol
|
27
|
-
@before_assert_callbacks << symbol
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def run_after_initialize_callbacks #:nodoc:
|
33
|
-
self.class.after_initialize_callbacks.each do |method|
|
34
|
-
if method.is_a?(Proc)
|
35
|
-
instance_eval &method
|
36
|
-
elsif method.is_a?(Symbol)
|
37
|
-
send(method)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def run_before_assert_callbacks #:nodoc:
|
43
|
-
self.class.before_assert_callbacks.each do |method|
|
44
|
-
if method.is_a?(Proc)
|
45
|
-
instance_eval &method
|
46
|
-
elsif method.is_a?(Symbol)
|
47
|
-
send(method)
|
48
|
-
end
|
49
|
-
end
|
23
|
+
def before_assert(symbol=nil, &block)
|
24
|
+
if block_given?
|
25
|
+
@before_assert_callbacks << block
|
26
|
+
elsif symbol
|
27
|
+
@before_assert_callbacks << symbol
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def run_after_initialize_callbacks #:nodoc:
|
33
|
+
self.class.after_initialize_callbacks.each do |method|
|
34
|
+
if method.is_a?(Proc)
|
35
|
+
instance_eval &method
|
36
|
+
elsif method.is_a?(Symbol)
|
37
|
+
send(method)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def run_before_assert_callbacks #:nodoc:
|
43
|
+
self.class.before_assert_callbacks.each do |method|
|
44
|
+
if method.is_a?(Proc)
|
45
|
+
instance_eval &method
|
46
|
+
elsif method.is_a?(Symbol)
|
47
|
+
send(method)
|
48
|
+
end
|
49
|
+
end
|
50
50
|
end
|
51
51
|
|
52
52
|
end
|
@@ -49,51 +49,51 @@ module Remarkable
|
|
49
49
|
{}
|
50
50
|
end
|
51
51
|
|
52
|
-
# Overwrites default_i18n_options to provide arguments and optionals
|
53
|
-
# to interpolation options.
|
54
|
-
#
|
55
|
-
# If you still need to provide more other interpolation options, you can
|
56
|
-
# do that in two ways:
|
57
|
-
#
|
58
|
-
# 1. Overwrite interpolation_options:
|
59
|
-
#
|
60
|
-
# def interpolation_options
|
61
|
-
# { :real_value => real_value }
|
62
|
-
# end
|
63
|
-
#
|
64
|
-
# 2. Return a hash from your assertion method:
|
65
|
-
#
|
66
|
-
# def my_assertion
|
67
|
-
# return true if real_value == expected_value
|
68
|
-
# return false, :real_value => real_value
|
69
|
-
# end
|
70
|
-
#
|
52
|
+
# Overwrites default_i18n_options to provide arguments and optionals
|
53
|
+
# to interpolation options.
|
54
|
+
#
|
55
|
+
# If you still need to provide more other interpolation options, you can
|
56
|
+
# do that in two ways:
|
57
|
+
#
|
58
|
+
# 1. Overwrite interpolation_options:
|
59
|
+
#
|
60
|
+
# def interpolation_options
|
61
|
+
# { :real_value => real_value }
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# 2. Return a hash from your assertion method:
|
65
|
+
#
|
66
|
+
# def my_assertion
|
67
|
+
# return true if real_value == expected_value
|
68
|
+
# return false, :real_value => real_value
|
69
|
+
# end
|
70
|
+
#
|
71
71
|
# In both cases, :real_value will be available as interpolation option.
|
72
72
|
#
|
73
73
|
def default_i18n_options #:nodoc:
|
74
|
-
i18n_options = {}
|
75
|
-
|
76
|
-
@options.each do |key, value|
|
77
|
-
i18n_options[key] = value.inspect
|
78
|
-
end if @options
|
79
|
-
|
74
|
+
i18n_options = {}
|
75
|
+
|
76
|
+
@options.each do |key, value|
|
77
|
+
i18n_options[key] = value.inspect
|
78
|
+
end if @options
|
79
|
+
|
80
80
|
# Also add arguments as interpolation options.
|
81
81
|
self.class.matcher_arguments[:names].each do |name|
|
82
82
|
i18n_options[name] = instance_variable_get("@#{name}").inspect
|
83
|
-
end
|
84
|
-
|
85
|
-
# Add collection interpolation options.
|
86
|
-
i18n_options.update(collection_interpolation)
|
87
|
-
|
88
|
-
# Add default options (highest priority). They should not be overwritten.
|
83
|
+
end
|
84
|
+
|
85
|
+
# Add collection interpolation options.
|
86
|
+
i18n_options.update(collection_interpolation)
|
87
|
+
|
88
|
+
# Add default options (highest priority). They should not be overwritten.
|
89
89
|
i18n_options.update(super)
|
90
|
-
end
|
91
|
-
|
92
|
-
# Method responsible to add collection as interpolation.
|
93
|
-
#
|
94
|
-
def collection_interpolation #:nodoc:
|
95
|
-
options = {}
|
96
|
-
|
90
|
+
end
|
91
|
+
|
92
|
+
# Method responsible to add collection as interpolation.
|
93
|
+
#
|
94
|
+
def collection_interpolation #:nodoc:
|
95
|
+
options = {}
|
96
|
+
|
97
97
|
if collection_name = self.class.matcher_arguments[:collection]
|
98
98
|
collection_name = collection_name.to_sym
|
99
99
|
collection = instance_variable_get("@#{collection_name}")
|
@@ -102,26 +102,26 @@ module Remarkable
|
|
102
102
|
object_name = self.class.matcher_arguments[:as].to_sym
|
103
103
|
object = instance_variable_get("@#{object_name}")
|
104
104
|
options[object_name] = object if object
|
105
|
-
end
|
106
|
-
|
107
|
-
options
|
105
|
+
end
|
106
|
+
|
107
|
+
options
|
108
108
|
end
|
109
109
|
|
110
|
-
# Send the assertion methods given and create a expectation message
|
111
|
-
# if any of those methods returns false.
|
112
|
-
#
|
113
|
-
# Since most assertion methods ends with an question mark and it's not
|
114
|
-
# readable in yml files, we remove question and exclation marks at the
|
115
|
-
# end of the method name before translating it. So if you have a method
|
116
|
-
# called is_valid? on I18n yml file we will check for a key :is_valid.
|
110
|
+
# Send the assertion methods given and create a expectation message
|
111
|
+
# if any of those methods returns false.
|
112
|
+
#
|
113
|
+
# Since most assertion methods ends with an question mark and it's not
|
114
|
+
# readable in yml files, we remove question and exclation marks at the
|
115
|
+
# end of the method name before translating it. So if you have a method
|
116
|
+
# called is_valid? on I18n yml file we will check for a key :is_valid.
|
117
117
|
#
|
118
118
|
def send_methods_and_generate_message(methods) #:nodoc:
|
119
119
|
methods.each do |method|
|
120
|
-
bool, hash = send(method)
|
120
|
+
bool, hash = send(method)
|
121
121
|
|
122
|
-
unless bool
|
123
|
-
@expectation ||= Remarkable.t "expectations.#{method.to_s.gsub(/(\?|\!)$/, '')}",
|
124
|
-
default_i18n_options.merge(hash || {})
|
122
|
+
unless bool
|
123
|
+
@expectation ||= Remarkable.t "expectations.#{method.to_s.gsub(/(\?|\!)$/, '')}",
|
124
|
+
default_i18n_options.merge(hash || {})
|
125
125
|
return false
|
126
126
|
end
|
127
127
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Remarkable
|
2
2
|
module DSL
|
3
|
-
module Optionals
|
4
|
-
|
5
|
-
OPTIONAL_KEYS = [ :positive, :negative, :not_given ]
|
6
|
-
|
7
|
-
def self.included(base) #:nodoc:
|
8
|
-
base.extend ClassMethods
|
3
|
+
module Optionals
|
4
|
+
|
5
|
+
OPTIONAL_KEYS = [ :positive, :negative, :not_given ]
|
6
|
+
|
7
|
+
def self.included(base) #:nodoc:
|
8
|
+
base.extend ClassMethods
|
9
9
|
end
|
10
|
-
|
11
|
-
module ClassMethods
|
12
|
-
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
|
13
13
|
protected
|
14
14
|
|
15
15
|
# Creates optional handlers for matchers dynamically. The following
|
@@ -28,7 +28,7 @@ module Remarkable
|
|
28
28
|
# Options:
|
29
29
|
#
|
30
30
|
# * <tt>:default</tt> - The default value for this optional
|
31
|
-
# * <tt>:alias</tt> - An alias for this optional
|
31
|
+
# * <tt>:alias</tt> - An alias for this optional
|
32
32
|
# * <tt>:splat</tt> - Should be true if you expects multiple arguments
|
33
33
|
#
|
34
34
|
# Examples:
|
@@ -59,11 +59,11 @@ module Remarkable
|
|
59
59
|
# validate_uniqueness_of :project_id, :scope => :company_id, :case_sensitive => false
|
60
60
|
# #=> "validate uniqueness of project_id scoped to company_id and case insensitive"
|
61
61
|
#
|
62
|
-
# The interpolation options available are "value" and "inspect". Where
|
63
|
-
# the first is the optional value transformed into a string and the
|
64
|
-
# second is the inspected value.
|
65
|
-
#
|
66
|
-
# Three keys are available to be used in I18n files and control how
|
62
|
+
# The interpolation options available are "value" and "inspect". Where
|
63
|
+
# the first is the optional value transformed into a string and the
|
64
|
+
# second is the inspected value.
|
65
|
+
#
|
66
|
+
# Three keys are available to be used in I18n files and control how
|
67
67
|
# optionals are appended to your description:
|
68
68
|
#
|
69
69
|
# * <tt>positive</tt> - When the optional is given and it evaluates to true (everything but false and nil).
|
@@ -72,9 +72,9 @@ module Remarkable
|
|
72
72
|
#
|
73
73
|
def optionals(*names)
|
74
74
|
options = names.extract_options!
|
75
|
-
@matcher_optionals += names
|
76
|
-
|
77
|
-
splat = options[:splat] ? '*' : ''
|
75
|
+
@matcher_optionals += names
|
76
|
+
|
77
|
+
splat = options[:splat] ? '*' : ''
|
78
78
|
default = options[:default] ? "=#{options[:default].inspect}" : ""
|
79
79
|
|
80
80
|
names.each do |name|
|
@@ -90,50 +90,50 @@ module Remarkable
|
|
90
90
|
|
91
91
|
# Call unique to avoid duplicate optionals.
|
92
92
|
@matcher_optionals.uniq!
|
93
|
-
end
|
94
|
-
alias :optional :optionals
|
95
|
-
|
96
|
-
# Instead of appending, prepend optionals to the beginning of optionals
|
97
|
-
# array. This is important because this decide how the description
|
98
|
-
# message is generated.
|
99
|
-
#
|
100
|
-
def prepend_optionals(*names)
|
101
|
-
current_optionals = @matcher_optionals.dup
|
102
|
-
@matcher_optionals = []
|
103
|
-
optional(*names)
|
104
|
-
@matcher_optionals += current_optionals
|
105
|
-
@matcher_optionals.uniq!
|
106
|
-
end
|
107
|
-
alias :prepend_optional :prepend_optionals
|
108
|
-
|
109
|
-
end
|
110
|
-
|
93
|
+
end
|
94
|
+
alias :optional :optionals
|
95
|
+
|
96
|
+
# Instead of appending, prepend optionals to the beginning of optionals
|
97
|
+
# array. This is important because this decide how the description
|
98
|
+
# message is generated.
|
99
|
+
#
|
100
|
+
def prepend_optionals(*names)
|
101
|
+
current_optionals = @matcher_optionals.dup
|
102
|
+
@matcher_optionals = []
|
103
|
+
optional(*names)
|
104
|
+
@matcher_optionals += current_optionals
|
105
|
+
@matcher_optionals.uniq!
|
106
|
+
end
|
107
|
+
alias :prepend_optional :prepend_optionals
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
111
|
# Overwrites description to support optionals. Check <tt>optional</tt> for
|
112
112
|
# more information.
|
113
113
|
#
|
114
114
|
def description(options={}) #:nodoc:
|
115
|
-
message = super(options)
|
115
|
+
message = super(options)
|
116
116
|
message.strip!
|
117
117
|
|
118
118
|
optionals = self.class.matcher_optionals.map do |optional|
|
119
119
|
scope = matcher_i18n_scope + ".optionals.#{optional}"
|
120
120
|
|
121
|
-
if @options.key?(optional)
|
121
|
+
if @options.key?(optional)
|
122
122
|
value = @options[optional]
|
123
|
-
defaults = [ (value ? :positive : :negative) ]
|
124
|
-
|
125
|
-
# If optional is a symbol and it's not any to any of the reserved symbols, search for it also
|
126
|
-
defaults.unshift(value) if value.is_a?(Symbol) && !OPTIONAL_KEYS.include?(value)
|
123
|
+
defaults = [ (value ? :positive : :negative) ]
|
124
|
+
|
125
|
+
# If optional is a symbol and it's not any to any of the reserved symbols, search for it also
|
126
|
+
defaults.unshift(value) if value.is_a?(Symbol) && !OPTIONAL_KEYS.include?(value)
|
127
127
|
|
128
|
-
Remarkable.t defaults.shift, :default => defaults, :raise => true, :scope => scope,
|
129
|
-
:inspect => value.inspect, :value => value.to_s
|
128
|
+
Remarkable.t defaults.shift, :default => defaults, :raise => true, :scope => scope,
|
129
|
+
:inspect => value.inspect, :value => value.to_s
|
130
130
|
else
|
131
131
|
Remarkable.t :not_given, :raise => true, :scope => scope
|
132
132
|
end rescue nil
|
133
133
|
end.compact
|
134
134
|
|
135
|
-
message << ' ' << array_to_sentence(optionals)
|
136
|
-
message.strip!
|
135
|
+
message << ' ' << array_to_sentence(optionals)
|
136
|
+
message.strip!
|
137
137
|
message
|
138
138
|
end
|
139
139
|
|
data/lib/remarkable/macros.rb
CHANGED
@@ -1,48 +1,48 @@
|
|
1
1
|
module Remarkable
|
2
|
-
module Macros
|
2
|
+
module Macros
|
3
3
|
|
4
4
|
protected
|
5
|
-
|
5
|
+
|
6
6
|
def method_missing(method_id, *args, &block) #:nodoc:
|
7
|
-
if method_id.to_s =~ /^(should_not|should)_(.+)/
|
8
|
-
should_or_should_not_method_missing($1, $2, caller, *args, &block)
|
7
|
+
if method_id.to_s =~ /^(should_not|should)_(.+)/
|
8
|
+
should_or_should_not_method_missing($1, $2, caller, *args, &block)
|
9
9
|
elsif method_id.to_s =~ /^x(should_not|should)_(.+)/
|
10
10
|
disabled_method_missing($1, $2, *args, &block)
|
11
|
-
else
|
11
|
+
else
|
12
12
|
super(method_id, *args, &block)
|
13
13
|
end
|
14
|
-
end
|
15
|
-
|
14
|
+
end
|
15
|
+
|
16
16
|
def should_or_should_not_method_missing(should_or_should_not, method, calltrace, *args, &block) #:nodoc:
|
17
|
-
it {
|
18
|
-
begin
|
19
|
-
send(should_or_should_not, send(method, *args, &block))
|
20
|
-
rescue Exception => e
|
21
|
-
e.set_backtrace(calltrace.to_a)
|
22
|
-
raise e
|
23
|
-
end
|
17
|
+
it {
|
18
|
+
begin
|
19
|
+
send(should_or_should_not, send(method, *args, &block))
|
20
|
+
rescue Exception => e
|
21
|
+
e.set_backtrace(calltrace.to_a)
|
22
|
+
raise e
|
23
|
+
end
|
24
24
|
}
|
25
|
-
end
|
25
|
+
end
|
26
26
|
|
27
|
-
def disabled_method_missing(should_or_should_not, method, *args, &block) #:nodoc:
|
28
|
-
description = get_description_from_matcher(should_or_should_not, method, *args, &block)
|
27
|
+
def disabled_method_missing(should_or_should_not, method, *args, &block) #:nodoc:
|
28
|
+
description = get_description_from_matcher(should_or_should_not, method, *args, &block)
|
29
29
|
xexample(description)
|
30
|
-
end
|
31
|
-
|
32
|
-
# Try to get the description from the matcher. If an error is raised, we
|
33
|
-
# deduct the description from the matcher name, but it will be shown in
|
34
|
-
# english.
|
35
|
-
#
|
36
|
-
def get_description_from_matcher(should_or_should_not, method, *args, &block) #:nodoc:
|
37
|
-
verb = should_or_should_not.to_s.gsub('_', ' ')
|
38
|
-
|
39
|
-
desc = Remarkable::Matchers.send(method, *args, &block).spec(self).description
|
40
|
-
verb = Remarkable.t("remarkable.core.#{should_or_should_not}", :default => verb)
|
41
|
-
rescue
|
42
|
-
desc = method.to_s.gsub('_', ' ')
|
43
|
-
ensure
|
44
|
-
verb << ' ' << desc
|
45
|
-
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Try to get the description from the matcher. If an error is raised, we
|
33
|
+
# deduct the description from the matcher name, but it will be shown in
|
34
|
+
# english.
|
35
|
+
#
|
36
|
+
def get_description_from_matcher(should_or_should_not, method, *args, &block) #:nodoc:
|
37
|
+
verb = should_or_should_not.to_s.gsub('_', ' ')
|
38
|
+
|
39
|
+
desc = Remarkable::Matchers.send(method, *args, &block).spec(self).description
|
40
|
+
verb = Remarkable.t("remarkable.core.#{should_or_should_not}", :default => verb)
|
41
|
+
rescue
|
42
|
+
desc = method.to_s.gsub('_', ' ')
|
43
|
+
ensure
|
44
|
+
verb << ' ' << desc
|
45
|
+
end
|
46
46
|
|
47
47
|
end
|
48
48
|
end
|