spec_combos 0.2.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 70820418ff04ef8f2f40f0382ba4ed28d2375211
4
+ data.tar.gz: 4adfb37fcde42123dad029c4514c40ba651b3dfa
5
+ SHA512:
6
+ metadata.gz: 6ac030cb28dc2164a38fb605440a0ad0dd4bfac1dcf869ed9a615e79c6a3bd938ccbd4637eace6db9cf8d98f06bddf5bc34c30d65063a1cc6aa169038436066a
7
+ data.tar.gz: c6fced32dc8f7eb9b20777ba55074996fa5977fa136ffe2c9c9def008d9e4b6374d8d862bb5d1eb2a3ee3ed98161fa95236d00137c43a79345cce76e83c600e7
Binary file
Binary file
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .ruby-version
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ *~
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - jruby-19mode
7
+ - jruby-20mode
8
+ - rbx-19mode
9
+ - rbx-20mode
10
+ script: bundle exec rake
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rspec_matchers_combinators.gemspec
4
+ gemspec
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Philippe Bourgau
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,49 @@
1
+ # SpecCombos
2
+
3
+ Rspec matchers that can combine other matchers together, to allow precise testing elements of a sequence for example. The goal is to get :
4
+
5
+ * concise and readable specs
6
+ * factorized code
7
+ * explicit assertion failure messages
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ gem 'spec_combos'
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install spec_combos
22
+
23
+ ## Usage
24
+
25
+ The matchers can be used like any matcher, just taking other matchers as arguments.
26
+
27
+ ### All matcher
28
+
29
+ expect([1,3,5]).to all_ { be_odd }
30
+
31
+ ### Any matcher
32
+
33
+ expect([2,1,4]).to have_any_that { be_odd }
34
+
35
+ ### And matcher
36
+
37
+ expect(2).to and_(be_even, be_instance_of(Fixnum))
38
+
39
+ It can be composed with 'any' or 'all' matchers :
40
+
41
+ expect([1,3,5]).to all_ { and_(be_odd, be_instance_of(Fixnum)) }
42
+
43
+ ## Contributing
44
+
45
+ 1. Fork it
46
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
47
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
48
+ 4. Push to the branch (`git push origin my-new-feature`)
49
+ 5. Create new Pull Request
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ desc 'Run specs'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
@@ -0,0 +1,7 @@
1
+ require "spec_combos/version"
2
+ require "spec_combos/matcher_combiner"
3
+ require "spec_combos/collection_matcher"
4
+ require "spec_combos/all_matcher"
5
+ require "spec_combos/any_matcher"
6
+ require "spec_combos/and_matcher"
7
+
@@ -0,0 +1,27 @@
1
+ module SpecCombos
2
+
3
+ # Matcher to verify that all items match something else
4
+ class AllMatcher
5
+ include MatcherCombiner
6
+ include MatcherCombiner::And
7
+ include CollectionMatcher
8
+
9
+ private
10
+
11
+ def short_description
12
+ "all"
13
+ end
14
+
15
+ def failure_summary_for_should
16
+ "expected #{actual_items} to #{description}, but the following were not:"
17
+ end
18
+
19
+ def failure_summary_for_should_not
20
+ "expected #{actual_items} not to #{description}, but all were:"
21
+ end
22
+ end
23
+ end
24
+
25
+ def all_(&item_matcher_proc)
26
+ SpecCombos::AllMatcher.new(&item_matcher_proc)
27
+ end
@@ -0,0 +1,44 @@
1
+ module SpecCombos
2
+
3
+ # Matcher to verify that an item matches all matchers in a list
4
+ class AndMatcher
5
+ include MatcherCombiner
6
+ include MatcherCombiner::And
7
+
8
+ def initialize(*matchers)
9
+ @matchers = matchers
10
+ end
11
+
12
+ def description
13
+ descriptions = @matchers.map &:description
14
+
15
+ if descriptions.size <= 2
16
+ descriptions.join(" and ")
17
+ else
18
+ descriptions[0..-2].join(", ") + " and " + descriptions.last
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def perform_matches(actual)
25
+ @matchers.map do |matcher|
26
+ { matcher: matcher,
27
+ match: matcher.matches?(actual)}
28
+ end
29
+ end
30
+
31
+ def failure_summary_for_should
32
+ "expected #{actual} to #{description}, but:"
33
+ end
34
+
35
+ def failure_summary_for_should_not
36
+ "expected #{actual} not to #{description}, but it is all:"
37
+ end
38
+
39
+ end
40
+ end
41
+
42
+ def and_(*matchers)
43
+ SpecCombos::AndMatcher.new(*matchers)
44
+ end
@@ -0,0 +1,28 @@
1
+ module SpecCombos
2
+
3
+ # Matcher to verify that all items match something else
4
+ class AnyMatcher
5
+ include MatcherCombiner
6
+ include MatcherCombiner::Or
7
+ include CollectionMatcher
8
+
9
+ private
10
+
11
+ def short_description
12
+ "have any that"
13
+ end
14
+
15
+ def failure_summary_for_should
16
+ "expected #{actual_items} to #{description}, but none were:"
17
+ end
18
+
19
+ def failure_summary_for_should_not
20
+ "expected #{actual_items} not to #{description}, but the following were:"
21
+ end
22
+ end
23
+ end
24
+
25
+ def any_(&item_matcher_proc)
26
+ SpecCombos::AnyMatcher.new(&item_matcher_proc)
27
+ end
28
+ alias :have_any_that :any_
@@ -0,0 +1,39 @@
1
+ module SpecCombos
2
+
3
+ # Mixin for the :and and :any collection matchers
4
+ module CollectionMatcher
5
+
6
+ def initialize(&item_matcher_proc)
7
+ @item_matcher_proc = item_matcher_proc
8
+ end
9
+
10
+ def description
11
+ "#{short_description} #{new_matcher.description}"
12
+ end
13
+
14
+ private
15
+
16
+ def perform_matches(actual_items)
17
+ actual_items.each_with_index.map do |item, index|
18
+ matcher = new_matcher
19
+ { index: index,
20
+ item: item,
21
+ matcher: matcher,
22
+ match: matcher.matches?(item)}
23
+ end
24
+ end
25
+
26
+ def new_matcher
27
+ @item_matcher_proc.call
28
+ end
29
+
30
+ def failure_message_prefix(failure)
31
+ "[#{failure[:index]}] (#{failure[:item]}): "
32
+ end
33
+
34
+ def actual_items
35
+ @actual
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,74 @@
1
+ module SpecCombos
2
+
3
+ module MatcherCombiner
4
+
5
+ module And
6
+ def match_result
7
+ matches(NOT_MATCHING).empty?
8
+ end
9
+ end
10
+
11
+ module Or
12
+ def match_result
13
+ !matches(MATCHING).empty?
14
+ end
15
+ end
16
+
17
+ def matches?(actual)
18
+ @actual = actual
19
+ @match_details = perform_matches(actual)
20
+ match_result
21
+ end
22
+
23
+ def failure_message_for_should
24
+ failure_message(MATCHING, failure_summary_for_should)
25
+ end
26
+
27
+ def failure_message_for_should_not
28
+ failure_message(NOT_MATCHING, failure_summary_for_should_not)
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :actual
34
+
35
+ MATCHING = true
36
+ NOT_MATCHING = false
37
+ INDENT_WIDTH = 2
38
+
39
+ def failure_message(expected_match, summary)
40
+ summary + "\n" + indent(full_explanation(expected_match), INDENT_WIDTH)
41
+ end
42
+ def full_explanation(expected_match)
43
+ explanations(!expected_match).join("\n")
44
+ end
45
+ def explanations(expected_match)
46
+ matches(expected_match).map {|failure| explain(failure)}
47
+ end
48
+ def explain(failure)
49
+ failure_message_prefix(failure) + message(failure)
50
+ end
51
+ def failure_message_prefix(failure)
52
+ ""
53
+ end
54
+ def message(failure)
55
+ failure[:matcher].send(message_selector(failure))
56
+ end
57
+ def message_selector(failure)
58
+ if failure[:match]
59
+ :failure_message_for_should_not
60
+ else
61
+ :failure_message_for_should
62
+ end
63
+ end
64
+
65
+ def matches(expected_match)
66
+ @match_details.find_all {|detail| detail[:match] == expected_match}
67
+ end
68
+
69
+ def indent(text, tabs)
70
+ text.gsub(/^/, ' ' * tabs)
71
+ end
72
+ end
73
+
74
+ end
@@ -0,0 +1,3 @@
1
+ module SpecCombos
2
+ VERSION = "0.2.0"
3
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ module SpecCombos
4
+
5
+ describe AllMatcher do
6
+ it 'matches collections with all matching elements' do
7
+ expect([1,3,5]).to all_ { be_odd }
8
+ end
9
+
10
+ it 'does not match collections where not all elements match' do
11
+ expect([3,5,6]).not_to all_ { be_odd }
12
+ end
13
+
14
+ it "has a straigtforward description" do
15
+ matcher = all_ { be_odd }
16
+
17
+ expect(matcher.description).to eq "all #{be_odd.description}"
18
+ end
19
+
20
+ it 'has an explicit should message' do
21
+ expect do
22
+ expect([1,2,3]).to all_ { be_odd }
23
+
24
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError,
25
+ "expected [1, 2, 3] to all be odd, but the following were not:\n" +
26
+ " [1] (2): expected odd? to return true, got false")
27
+ end
28
+
29
+ it 'has an explicit should not message' do
30
+ expect do
31
+ expect([1,3]).not_to all_ { be_odd }
32
+
33
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError,
34
+ "expected [1, 3] not to all be odd, but all were:\n" +
35
+ " [0] (1): expected odd? to return false, got true\n" +
36
+ " [1] (3): expected odd? to return false, got true")
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ module SpecCombos
4
+
5
+ describe AndMatcher do
6
+ it 'matches items that matches all matchers' do
7
+ expect(2).to and_(be_even,
8
+ be_instance_of(Fixnum))
9
+ end
10
+
11
+ it "does not match items that don't match all matchers" do
12
+ expect(2).not_to and_(be_odd,
13
+ be_even)
14
+ end
15
+
16
+ it "has a straigtforward description" do
17
+ matcher = and_(be_odd, be_even)
18
+
19
+ expect(matcher.description).to eq "#{be_odd.description} and #{be_even.description}"
20
+ end
21
+
22
+ it "does not repeat 'and' in the description" do
23
+ matcher = and_(be_odd, be_even, be_instance_of(Fixnum))
24
+
25
+ expect(matcher.description).to eq "#{be_odd.description}, #{be_even.description} and #{be_instance_of(Fixnum).description}"
26
+ end
27
+
28
+ it 'has an explicit should message' do
29
+ expect do
30
+ expect(1).to and_(be_odd, be_even)
31
+
32
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError,
33
+ "expected 1 to be odd and be even, but:\n" +
34
+ " expected even? to return true, got false")
35
+ end
36
+
37
+ it 'has an explicit should not message' do
38
+ expect do
39
+ expect(2).not_to and_(be_even, be_instance_of(Fixnum))
40
+
41
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError,
42
+ "expected 2 not to be even and be an instance of Fixnum, but it is all:\n" +
43
+ " expected even? to return false, got true\n" +
44
+ " expected 2 not to be an instance of Fixnum")
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ module SpecCombos
4
+
5
+ describe AnyMatcher do
6
+ it 'matches collections with at least one matching element' do
7
+ expect([2,3,4]).to have_any_that { be_odd }
8
+ end
9
+
10
+ it 'does not match collections where no element match' do
11
+ expect([2,4,6]).not_to have_any_that { be_odd }
12
+ end
13
+
14
+ it "has a straigtforward description" do
15
+ matcher = have_any_that { be_odd }
16
+
17
+ expect(matcher.description).to eq "have any that #{be_odd.description}"
18
+ end
19
+
20
+ it 'has an explicit should message' do
21
+ expect do
22
+ expect([0,2]).to have_any_that { be_odd }
23
+
24
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError,
25
+ "expected [0, 2] to have any that be odd, but none were:\n" +
26
+ " [0] (0): expected odd? to return true, got false\n" +
27
+ " [1] (2): expected odd? to return true, got false")
28
+ end
29
+
30
+ it 'has an explicit should not message' do
31
+ expect do
32
+ expect([1,4,6]).not_to have_any_that { be_odd }
33
+
34
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError,
35
+ "expected [1, 4, 6] not to have any that be odd, but the following were:\n" +
36
+ " [0] (1): expected odd? to return false, got true")
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ module SpecCombos
4
+
5
+ describe MatcherCombiner do
6
+ it 'can combine :all_ and :and_ matcher messages correctly' do
7
+ expect do
8
+ expect([1,2,3]).to all_{and_(be_odd, be_instance_of(Fixnum))}
9
+
10
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError,
11
+ "expected [1, 2, 3] to all be odd and be an instance of Fixnum, but the following were not:\n"+
12
+ " [1] (2): expected 2 to be odd and be an instance of Fixnum, but:\n"+
13
+ " expected odd? to return true, got false")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1 @@
1
+ require 'spec_combos'
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'spec_combos/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "spec_combos"
8
+ spec.version = SpecCombos::VERSION
9
+ spec.authors = ["Philou"]
10
+ spec.email = ["philippe.bourgau@gmail.com"]
11
+ spec.description = %q{Rspec matchers to combine matchers together}
12
+ spec.summary = %q{Allows to build up matchers able to precisely match item from a collection for example}
13
+ spec.homepage = "http://github.com/philou/spec_combos"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "rspec", "~> 2.11"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake", "~> 10.1"
25
+ spec.add_development_dependency "guard-rspec", "~> 3.0"
26
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spec_combos
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Philou
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDkjCCAnqgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMRkwFwYDVQQDDBBwaGls
14
+ aXBwZS5ib3VyZ2F1MRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/Is
15
+ ZAEZFgNjb20wHhcNMTMwOTIzMTEwOTA3WhcNMTQwOTIzMTEwOTA3WjBHMRkwFwYD
16
+ VQQDDBBwaGlsaXBwZS5ib3VyZ2F1MRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzAR
17
+ BgoJkiaJk/IsZAEZFgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
18
+ AQC8CpoqZwEbzXr55EUxdSplgn0MYZ9xPGO/XmRa8bD63n+JYWF0AS+mj452ZY18
19
+ rwM+yKrKhtsA+aJJdlOafgIUnY5SrZOr7v7kgc6T2YNoUj+M00Um2jv+shQbOtV6
20
+ qGp0Jw1HfPNUMVa+3pXZyAGCecN6rTnsZJIuW6KNaJUq6lEMVXanoTHgAKrH5aHd
21
+ Y6ofwQL86d6LDkC1S4p86iMUWvF34w8h5ItVo+JKlPRR22rzsK/ZKgNH3lfjbS6i
22
+ JWqPva70rL2xz5kCVn6DL7XhNZtqnAO4kvCQyQeWezvcoGXEnbHacKky7B+/WKec
23
+ OIWEwedl6j+X0OD5OYki3QaTAgMBAAGjgYgwgYUwCQYDVR0TBAIwADALBgNVHQ8E
24
+ BAMCBLAwHQYDVR0OBBYEFJnLz40Onu/dfpLSipU5FgTy6WLmMCUGA1UdEQQeMByB
25
+ GnBoaWxpcHBlLmJvdXJnYXVAZ21haWwuY29tMCUGA1UdEgQeMByBGnBoaWxpcHBl
26
+ LmJvdXJnYXVAZ21haWwuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQBGoH72KWYACGZl
27
+ cMHMJ9d/DRU7rynJ8c4xuuM4c3Ri8bGPqI/a1BAp4QPJApS4+ANXXJ220hslrekP
28
+ 9/ExEKFiqiywh1clih9ttuN4cHqJzCP6QHqJznQrvaYToZLxGARDf3Mwz4mFSh4W
29
+ snSep53DZ1vrY2Gzmig/4PuBF4q3nhwPgxV6H3SH4/Py7QF5COZPQlCdBwPYczqW
30
+ XxIbXhRVXcgjBHT0w2HsXkOwmmYvBzbrfqtTx5NswwHcIeQZB/NID7berIf9awx3
31
+ yLcl1cmm5ALtJ/+Bkkmp0i4amXeTDMvq9r8PBsVsQwxYOYJBP+Umxz3PX6HjFHrQ
32
+ XdkXx3oZ
33
+ -----END CERTIFICATE-----
34
+ date: 2013-09-23 00:00:00.000000000 Z
35
+ dependencies:
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ version: '2.11'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ~>
48
+ - !ruby/object:Gem::Version
49
+ version: '2.11'
50
+ - !ruby/object:Gem::Dependency
51
+ name: bundler
52
+ requirement: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ version: '1.3'
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ version: '1.3'
64
+ - !ruby/object:Gem::Dependency
65
+ name: rake
66
+ requirement: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: '10.1'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '10.1'
78
+ - !ruby/object:Gem::Dependency
79
+ name: guard-rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ~>
83
+ - !ruby/object:Gem::Version
84
+ version: '3.0'
85
+ type: :development
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ~>
90
+ - !ruby/object:Gem::Version
91
+ version: '3.0'
92
+ description: Rspec matchers to combine matchers together
93
+ email:
94
+ - philippe.bourgau@gmail.com
95
+ executables: []
96
+ extensions: []
97
+ extra_rdoc_files: []
98
+ files:
99
+ - .gitignore
100
+ - .rspec
101
+ - .travis.yml
102
+ - Gemfile
103
+ - Guardfile
104
+ - LICENSE.txt
105
+ - README.md
106
+ - Rakefile
107
+ - lib/spec_combos.rb
108
+ - lib/spec_combos/all_matcher.rb
109
+ - lib/spec_combos/and_matcher.rb
110
+ - lib/spec_combos/any_matcher.rb
111
+ - lib/spec_combos/collection_matcher.rb
112
+ - lib/spec_combos/matcher_combiner.rb
113
+ - lib/spec_combos/version.rb
114
+ - spec/lib/spec_combos/all_matcher_spec.rb
115
+ - spec/lib/spec_combos/and_matcher_spec.rb
116
+ - spec/lib/spec_combos/any_matcher_spec.rb
117
+ - spec/lib/spec_combos/matcher_combiner_spec.rb
118
+ - spec/spec_helper.rb
119
+ - spec_combos.gemspec
120
+ homepage: http://github.com/philou/spec_combos
121
+ licenses:
122
+ - MIT
123
+ metadata: {}
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - '>='
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubyforge_project:
140
+ rubygems_version: 2.0.3
141
+ signing_key:
142
+ specification_version: 4
143
+ summary: Allows to build up matchers able to precisely match item from a collection
144
+ for example
145
+ test_files:
146
+ - spec/lib/spec_combos/all_matcher_spec.rb
147
+ - spec/lib/spec_combos/and_matcher_spec.rb
148
+ - spec/lib/spec_combos/any_matcher_spec.rb
149
+ - spec/lib/spec_combos/matcher_combiner_spec.rb
150
+ - spec/spec_helper.rb
Binary file