spec_combos 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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