remarkable 3.1.7 → 3.1.8

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.
@@ -8,7 +8,8 @@ require File.join(dir, 'remarkable', 'messages')
8
8
 
9
9
  require File.join(dir, 'remarkable', 'base')
10
10
  require File.join(dir, 'remarkable', 'macros')
11
- require File.join(dir, 'remarkable', 'pending')
11
+ require File.join(dir, 'remarkable', 'pending')
12
+ require File.join(dir, 'remarkable', 'negative')
12
13
  require File.join(dir, 'remarkable', 'core_ext', 'array')
13
14
 
14
15
  if defined?(Spec)
@@ -10,6 +10,14 @@ module Remarkable
10
10
  @spec = binding
11
11
  self
12
12
  end
13
+
14
+ def positive?
15
+ !negative?
16
+ end
17
+
18
+ def negative?
19
+ false
20
+ end
13
21
 
14
22
  protected
15
23
 
@@ -28,11 +36,20 @@ module Remarkable
28
36
 
29
37
  # Iterates over the collection given yielding the block and return false
30
38
  # if any of them also returns false.
31
- def assert_matcher_for(collection) #:nodoc:
32
- collection.each do |item|
33
- return false unless yield(item)
39
+ def assert_collection(key, collection, inspect=true) #:nodoc:
40
+ collection.each do |item|
41
+ value = yield(item)
42
+
43
+ if positive? == !value
44
+ if key
45
+ output = inspect ? item.inspect : item
46
+ return negative?, key => output
47
+ else
48
+ return negative?
49
+ end
50
+ end
34
51
  end
35
- true
52
+ positive?
36
53
  end
37
54
 
38
55
  # Asserts that the given collection contains item x. If x is a regular
@@ -280,15 +280,17 @@ module Remarkable
280
280
  def matches?(subject)
281
281
  @subject = subject
282
282
 
283
- run_before_assert_callbacks
284
-
285
- send_methods_and_generate_message(self.class.matcher_single_assertions) &&
286
- assert_matcher_for(instance_variable_get("@#{self.class.matcher_arguments[:collection]}") || []) do |value|
287
- instance_variable_set("@#{self.class.matcher_arguments[:as]}", value)
288
- send_methods_and_generate_message(self.class.matcher_collection_assertions)
289
- end
283
+ run_before_assert_callbacks
284
+
285
+ assertions = self.class.matcher_single_assertions
286
+ unless assertions.empty?
287
+ value = send_methods_and_generate_message(assertions)
288
+ return negative? if positive? == !value
289
+ end
290
+
291
+ matches_collection_assertions?
290
292
  end
291
-
293
+
292
294
  protected
293
295
 
294
296
  # You can overwrite this instance method to provide default options on
@@ -368,20 +370,42 @@ module Remarkable
368
370
  methods.each do |method|
369
371
  bool, hash = send(method)
370
372
 
371
- unless bool
373
+ if positive? == !bool
372
374
  parent_scope = matcher_i18n_scope.split('.')
373
- matcher_name = parent_scope.pop
374
- lookup = :"expectations.#{method.to_s.gsub(/(\?|\!)$/, '')}"
375
+ matcher_name = parent_scope.pop
376
+ method_name = method.to_s.gsub(/(\?|\!)$/, '')
377
+
378
+ lookup = []
379
+ lookup << :"#{matcher_name}.negative_expectations.#{method_name}" if negative?
380
+ lookup << :"#{matcher_name}.expectations.#{method_name}"
381
+ lookup << :"negative_expectations.#{method_name}" if negative?
382
+ lookup << :"expectations.#{method_name}"
375
383
 
376
384
  hash = { :scope => parent_scope, :default => lookup }.merge(hash || {})
377
- @expectation ||= Remarkable.t "#{matcher_name}.#{lookup}", default_i18n_options.merge(hash)
385
+ @expectation ||= Remarkable.t lookup.shift, default_i18n_options.merge(hash)
378
386
 
379
- return false
387
+ return negative?
380
388
  end
381
389
  end
382
390
 
383
- return true
391
+ return positive?
384
392
  end
393
+
394
+ def matches_single_assertions? #:nodoc:
395
+ assertions = self.class.matcher_single_assertions
396
+ send_methods_and_generate_message(assertions)
397
+ end
398
+
399
+ def matches_collection_assertions? #:nodoc:
400
+ arguments = self.class.matcher_arguments
401
+ assertions = self.class.matcher_collection_assertions
402
+ collection = instance_variable_get("@#{self.class.matcher_arguments[:collection]}") || []
403
+
404
+ assert_collection(nil, collection) do |value|
405
+ instance_variable_set("@#{arguments[:as]}", value)
406
+ send_methods_and_generate_message(assertions)
407
+ end
408
+ end
385
409
 
386
410
 
387
411
  end
@@ -0,0 +1,24 @@
1
+ module Remarkable
2
+ # Allows Remarkable matchers to work on the negative way. Your matcher has to
3
+ # follow some conventions to allow this to work by default.
4
+ #
5
+ # In negative cases, expectations can also be found under negative_expectations
6
+ # keys, falling back to expectations. This allows to set customized failure
7
+ # messages.
8
+ #
9
+ module Negative
10
+ def matches?(subject)
11
+ @negative ||= false
12
+ super
13
+ end
14
+
15
+ def does_not_match?(subject)
16
+ @negative = true
17
+ !matches?(subject)
18
+ end
19
+
20
+ def negative?
21
+ @negative
22
+ end
23
+ end
24
+ end
@@ -1,3 +1,3 @@
1
1
  module Remarkable
2
- VERSION = '3.1.7' unless self.const_defined?(:VERSION)
2
+ VERSION = '3.1.8' unless self.const_defined?(:VERSION)
3
3
  end
@@ -27,6 +27,11 @@ describe Remarkable::Base do
27
27
  should matcher
28
28
  matcher.instance_variable_get('@spec').class.ancestors.should include(Spec::Example::ExampleGroup)
29
29
  end
30
+
31
+ it 'should be positive' do
32
+ contain(1).should be_positive
33
+ contain(1).should_not be_negative
34
+ end
30
35
 
31
36
  it { should contain(1) }
32
37
  it { should_not contain(10) }
@@ -9,7 +9,7 @@ module Remarkable
9
9
  def matches?(subject)
10
10
  @subject = subject
11
11
 
12
- assert_matcher_for(@values) do |value|
12
+ assert_collection(nil, @values) do |value|
13
13
  @value = value
14
14
  included?
15
15
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: remarkable
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.7
4
+ version: 3.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carlos Brando
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-07-05 00:00:00 +02:00
13
+ date: 2009-07-16 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -52,6 +52,7 @@ files:
52
52
  - lib/remarkable/matchers.rb
53
53
  - lib/remarkable/core_ext/array.rb
54
54
  - lib/remarkable/messages.rb
55
+ - lib/remarkable/negative.rb
55
56
  - lib/remarkable.rb
56
57
  - locale/en.yml
57
58
  has_rdoc: true