matchi 1.0.7 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +1 -1
  3. data/README.md +59 -103
  4. data/lib/matchi.rb +1 -1
  5. data/lib/matchi/helper.rb +28 -0
  6. data/lib/matchi/matcher.rb +11 -0
  7. data/lib/matchi/matcher/base.rb +45 -0
  8. data/lib/matchi/matcher/be_an_instance_of.rb +35 -0
  9. data/lib/matchi/matcher/be_false.rb +24 -0
  10. data/lib/matchi/matcher/be_nil.rb +24 -0
  11. data/lib/matchi/matcher/be_true.rb +24 -0
  12. data/lib/matchi/matcher/eql.rb +35 -0
  13. data/lib/matchi/matcher/equal.rb +35 -0
  14. data/lib/matchi/matcher/match.rb +35 -0
  15. data/lib/matchi/matcher/raise_exception.rb +39 -0
  16. metadata +63 -66
  17. data/.gitignore +0 -10
  18. data/.rubocop.yml +0 -1
  19. data/.rubocop_todo.yml +0 -7
  20. data/.travis.yml +0 -28
  21. data/.yardopts +0 -1
  22. data/CODE_OF_CONDUCT.md +0 -13
  23. data/Gemfile +0 -5
  24. data/Rakefile +0 -22
  25. data/VERSION.semver +0 -1
  26. data/bin/console +0 -8
  27. data/bin/setup +0 -6
  28. data/checksum/matchi-0.0.1.gem.sha512 +0 -1
  29. data/checksum/matchi-0.0.2.gem.sha512 +0 -1
  30. data/checksum/matchi-0.0.3.gem.sha512 +0 -1
  31. data/checksum/matchi-0.0.4.gem.sha512 +0 -1
  32. data/checksum/matchi-0.0.5.gem.sha512 +0 -1
  33. data/checksum/matchi-0.0.6.gem.sha512 +0 -1
  34. data/checksum/matchi-0.0.7.gem.sha512 +0 -1
  35. data/checksum/matchi-0.0.8.gem.sha512 +0 -1
  36. data/checksum/matchi-0.0.9.gem.sha512 +0 -1
  37. data/checksum/matchi-0.1.0.gem.sha512 +0 -1
  38. data/checksum/matchi-0.1.1.gem.sha512 +0 -1
  39. data/checksum/matchi-0.1.2.gem.sha512 +0 -1
  40. data/checksum/matchi-1.0.0.gem.sha512 +0 -1
  41. data/checksum/matchi-1.0.1.gem.sha512 +0 -1
  42. data/checksum/matchi-1.0.2.gem.sha512 +0 -1
  43. data/checksum/matchi-1.0.3.gem.sha512 +0 -1
  44. data/checksum/matchi-1.0.4.gem.sha512 +0 -1
  45. data/checksum/matchi-1.0.5.gem.sha512 +0 -1
  46. data/checksum/matchi-1.0.6.gem.sha512 +0 -1
  47. data/lib/matchi/matchers.rb +0 -11
  48. data/lib/matchi/matchers/be_false.rb +0 -30
  49. data/lib/matchi/matchers/be_nil.rb +0 -30
  50. data/lib/matchi/matchers/be_true.rb +0 -30
  51. data/lib/matchi/matchers/eql.rb +0 -40
  52. data/lib/matchi/matchers/equal.rb +0 -40
  53. data/lib/matchi/matchers/match.rb +0 -40
  54. data/lib/matchi/matchers/raise_exception.rb +0 -44
  55. data/lib/matchi/matchers_base.rb +0 -51
  56. data/matchi.gemspec +0 -24
  57. data/pkg_checksum +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9d213c300548625425d0a0e93897dee638fc782392cf1364c3e98847a73af8df
4
- data.tar.gz: a5d1766ef4051bdcbcc9c35f93f62d4e3992531112fdd1dfad5f6956e9e5c01b
3
+ metadata.gz: c15a21ea2bcdc3ea9c43344bb1ff12216a384bc3d19a996c39a1138c28d18150
4
+ data.tar.gz: d023d2472ced57399fd14aea2a35cd36b75f7a9ac3705efd48985ccc03a6b9df
5
5
  SHA512:
6
- metadata.gz: bb87e6c3d74fdcd4fc0983981c6b26bd7166e32ddf7bb69ebcbda2d9cf18e71af798f5bccb3ab5a6a45ef31db919c1c8d42d0ea26a051fee35673df833578e0b
7
- data.tar.gz: d309507d97b8561bdeaea13c2f3d4a78d40fcafd1fdd03ec125dda24de10ef9c28935d66266905ab4cdfbb63a937e791f16079406ba96a03d9a7c6260d09bdf7
6
+ metadata.gz: be27946a8a1aa3d24b978603be5efc2ce29eea9a18455dba435276329388fd1448c8e0f770b649ca34ad0cfce711a4b34939d665254741406f4bfa7602342475
7
+ data.tar.gz: dcdf2ece3a08c3dd266a9f01ebcb76013f3ab6e699b2bb8205656f7e3cd3ba76f786921c68516efc940404e72862a0bd5df9a021bb8c0c0b80720048e2738cc8
data/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015-2019 Cyril Kato
3
+ Copyright (c) 2015-2021 Cyril Kato
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,39 +1,31 @@
1
1
  # Matchi
2
2
 
3
- [![Build Status](https://api.travis-ci.org/fixrb/matchi.svg?branch=master)][travis]
3
+ [![Build Status](https://api.travis-ci.org/fixrb/matchi.svg?branch=main)][travis]
4
4
  [![Code Climate](https://codeclimate.com/github/fixrb/matchi/badges/gpa.svg)][codeclimate]
5
5
  [![Gem Version](https://badge.fury.io/rb/matchi.svg)][gem]
6
- [![Inline docs](https://inch-ci.org/github/fixrb/matchi.svg?branch=master)][inchpages]
7
6
  [![Documentation](https://img.shields.io/:yard-docs-38c800.svg)][rubydoc]
8
7
 
9
- > Collection of expectation matchers for Ruby.
10
-
11
- ## Contact
12
-
13
- * Home page: https://github.com/fixrb/matchi
14
- * Bugs/issues: https://github.com/fixrb/matchi/issues
15
-
16
- ## Rubies
17
-
18
- * [MRI](https://www.ruby-lang.org/)
19
- * [Rubinius](https://rubinius.com/)
20
- * [JRuby](https://www.jruby.org/)
8
+ > Collection of expectation matchers for Ruby 🤹
21
9
 
22
10
  ## Installation
23
11
 
24
12
  Add this line to your application's Gemfile:
25
13
 
26
14
  ```ruby
27
- gem 'matchi'
15
+ gem "matchi"
28
16
  ```
29
17
 
30
18
  And then execute:
31
19
 
32
- $ bundle
20
+ ```sh
21
+ bundle
22
+ ```
33
23
 
34
24
  Or install it yourself as:
35
25
 
36
- $ gem install matchi
26
+ ```sh
27
+ gem install matchi
28
+ ```
37
29
 
38
30
  ## Usage
39
31
 
@@ -42,52 +34,59 @@ Or install it yourself as:
42
34
  **Equivalence** matcher:
43
35
 
44
36
  ```ruby
45
- eql = Matchi::Matchers::Eql::Matcher.new('foo')
46
- eql.matches? { 'foo' } # => true
37
+ eql = Matchi::Matcher::Eql.new("foo")
38
+ eql.matches? { "foo" } # => true
47
39
  ```
48
40
 
49
41
  **Identity** matcher:
50
42
 
51
43
  ```ruby
52
- equal = Matchi::Matchers::Equal::Matcher.new(:foo)
44
+ equal = Matchi::Matcher::Equal.new(:foo)
53
45
  equal.matches? { :foo } # => true
54
46
  ```
55
47
 
56
48
  **Regular expressions** matcher:
57
49
 
58
50
  ```ruby
59
- match = Matchi::Matchers::Match::Matcher.new(/^foo$/)
60
- match.matches? { 'foo' } # => true
51
+ match = Matchi::Matcher::Match.new(/^foo$/)
52
+ match.matches? { "foo" } # => true
61
53
  ```
62
54
 
63
55
  **Expecting errors** matcher:
64
56
 
65
57
  ```ruby
66
- raise_exception = Matchi::Matchers::RaiseException::Matcher.new(NameError)
58
+ raise_exception = Matchi::Matcher::RaiseException.new(NameError)
67
59
  raise_exception.matches? { Boom } # => true
68
60
  ```
69
61
 
70
62
  **Truth** matcher:
71
63
 
72
64
  ```ruby
73
- be_true = Matchi::Matchers::BeTrue::Matcher.new
65
+ be_true = Matchi::Matcher::BeTrue.new
74
66
  be_true.matches? { true } # => true
75
67
  ```
76
68
 
77
69
  **Untruth** matcher:
78
70
 
79
71
  ```ruby
80
- be_false = Matchi::Matchers::BeFalse::Matcher.new
72
+ be_false = Matchi::Matcher::BeFalse.new
81
73
  be_false.matches? { false } # => true
82
74
  ```
83
75
 
84
76
  **Nil** matcher:
85
77
 
86
78
  ```ruby
87
- be_nil = Matchi::Matchers::BeNil::Matcher.new
79
+ be_nil = Matchi::Matcher::BeNil.new
88
80
  be_nil.matches? { nil } # => true
89
81
  ```
90
82
 
83
+ **Type/class** matcher:
84
+
85
+ ```ruby
86
+ be_an_instance_of = Matchi::Matcher::BeAnInstanceOf.new(String)
87
+ be_an_instance_of.matches? { "foo" } # => true
88
+ ```
89
+
91
90
  ### Custom matchers
92
91
 
93
92
  Custom matchers can easily be defined for expressing expectations. They can be any Ruby class that responds to `matches?`, `to_s` and `to_h` instance methods.
@@ -96,55 +95,35 @@ A **Be the answer** matcher:
96
95
 
97
96
  ```ruby
98
97
  module Matchi
99
- module Matchers
100
- module BeTheAnswer
101
- class Matcher
102
- def matches?
103
- 42.equal? yield
104
- end
105
-
106
- def to_s
107
- 'be_the_answer'
108
- end
109
-
110
- def to_h
111
- { BeTheAnswer: [] }
112
- end
98
+ module Matcher
99
+ class BeTheAnswer < ::Matchi::Matcher::Base
100
+ def matches?
101
+ 42.equal?(yield)
113
102
  end
114
103
  end
115
104
  end
116
105
  end
117
106
 
118
- be_the_answer = Matchi::Matchers::BeTheAnswer::Matcher.new
107
+ be_the_answer = Matchi::Matcher::BeTheAnswer.new
119
108
  be_the_answer.matches? { 42 } # => true
120
109
  ```
121
110
 
122
111
  A **Be prime** matcher:
123
112
 
124
113
  ```ruby
125
- require 'prime'
114
+ require "prime"
126
115
 
127
116
  module Matchi
128
- module Matchers
129
- module BePrime
130
- class Matcher
131
- def matches?
132
- Prime.prime? yield
133
- end
134
-
135
- def to_s
136
- 'be_prime'
137
- end
138
-
139
- def to_h
140
- { BePrime: [] }
141
- end
117
+ module Matcher
118
+ class BePrime < ::Matchi::Matcher::Base
119
+ def matches?
120
+ Prime.prime?(yield)
142
121
  end
143
122
  end
144
123
  end
145
124
  end
146
125
 
147
- be_prime = Matchi::Matchers::BePrime::Matcher.new
126
+ be_prime = Matchi::Matcher::BePrime.new
148
127
  be_prime.matches? { 42 } # => false
149
128
  ```
150
129
 
@@ -152,70 +131,47 @@ A **Start with** matcher:
152
131
 
153
132
  ```ruby
154
133
  module Matchi
155
- module Matchers
156
- module StartWith
157
- class Matcher
158
- def initialize(expected)
159
- @expected = expected
160
- end
161
-
162
- def matches?
163
- !Regexp.new("^#{@expected}").match(yield).nil?
164
- end
165
-
166
- def to_s
167
- 'start_with'
168
- end
169
-
170
- def to_h
171
- { StartWith: [@expected] }
172
- end
134
+ module Matcher
135
+ class StartWith < ::Matchi::Matcher::Base
136
+ def initialize(expected)
137
+ super()
138
+ @expected = expected
139
+ end
140
+
141
+ def matches?
142
+ Regexp.new(/\A#{expected}/).match?(yield)
173
143
  end
174
144
  end
175
145
  end
176
146
  end
177
147
 
178
- start_with = Matchi::Matchers::StartWith::Matcher.new('foo')
179
- start_with.matches? { 'foobar' } # => true
148
+ start_with = Matchi::Matcher::StartWith.new("foo")
149
+ start_with.matches? { "foobar" } # => true
180
150
  ```
181
151
 
182
- ## Security
183
-
184
- As a basic form of security __Matchi__ provides a set of SHA512 checksums for
185
- every Gem release. These checksums can be found in the `checksum/` directory.
186
- Although these checksums do not prevent malicious users from tampering with a
187
- built Gem they can be used for basic integrity verification purposes.
188
-
189
- The checksum of a file can be checked using the `sha512sum` command. For
190
- example:
152
+ ## Contact
191
153
 
192
- $ sha512sum pkg/matchi-0.0.1.gem
193
- 548d9f669ded4e622182791a5390aaceae0bf2e557b0864f05a842b0be2c65e10e1fb8499f49a3b9efd0e8eaeb691351b1c670d6316ce49965a99683b1071389 pkg/matchi-0.0.1.gem
154
+ * Home page: https://github.com/fixrb/matchi
155
+ * Bugs/issues: https://github.com/fixrb/matchi/issues
194
156
 
195
157
  ## Versioning
196
158
 
197
159
  __Matchi__ follows [Semantic Versioning 2.0](https://semver.org/).
198
160
 
199
- ## Contributing
161
+ ## License
200
162
 
201
- 1. [Fork it](https://github.com/fixrb/matchi/fork)
202
- 2. Create your feature branch (`git checkout -b my-new-feature`)
203
- 3. Commit your changes (`git commit -am 'Add some feature'`)
204
- 4. Push to the branch (`git push origin my-new-feature`)
205
- 5. Create a new Pull Request
163
+ The [gem](https://rubygems.org/gems/matchi) is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
206
164
 
207
- ## License
165
+ ***
208
166
 
209
- See `LICENSE.md` file.
167
+ <p>
168
+ This project is sponsored by:<br />
169
+ <a href="https://sashite.com/"><img
170
+ src="https://github.com/fixrb/matchi/raw/main/img/sashite.png"
171
+ alt="Sashite" /></a>
172
+ </p>
210
173
 
211
174
  [gem]: https://rubygems.org/gems/matchi
212
175
  [travis]: https://travis-ci.org/fixrb/matchi
213
176
  [codeclimate]: https://codeclimate.com/github/fixrb/matchi
214
- [inchpages]: https://inch-ci.org/github/fixrb/matchi
215
177
  [rubydoc]: https://rubydoc.info/gems/matchi/frames
216
-
217
- ***
218
-
219
- This project is sponsored by:
220
-
221
- [![Sashite](https://pbs.twimg.com/profile_images/618485028322975744/PZ9qPuI__400x400.png)](https://sashite.com/)
data/lib/matchi.rb CHANGED
@@ -4,4 +4,4 @@
4
4
  module Matchi
5
5
  end
6
6
 
7
- require_relative File.join('matchi', 'matchers')
7
+ require_relative File.join("matchi", "matcher")
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "matcher"
4
+
5
+ module Matchi
6
+ # Collection of helper methods.
7
+ module Helper
8
+ ::Matchi::Matcher.constants.each do |matcher_const|
9
+ next if matcher_const.equal?(:Base)
10
+
11
+ matcher_klass = ::Matchi::Matcher.const_get(matcher_const)
12
+
13
+ # Define a method for the given matcher.
14
+ #
15
+ # @example Given the `Matchi::Matchers::Equal::Matcher` matcher, its
16
+ # method would be:
17
+ #
18
+ # def equal(expected)
19
+ # Matchi::Matchers::Equal::Matcher.new(expected)
20
+ # end
21
+ #
22
+ # @return [#matches?] The matcher.
23
+ define_method(matcher_klass.to_sym) do |*args|
24
+ matcher_klass.new(*args)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Matchi
4
+ # Collection of matcher classes.
5
+ module Matcher
6
+ end
7
+ end
8
+
9
+ Dir[File.join(File.dirname(__FILE__), "matcher", "*.rb")].each do |fname|
10
+ require_relative fname
11
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Matchi
4
+ module Matcher
5
+ # Abstract matcher class.
6
+ class Base
7
+ # @return [Symbol] A symbol identifying the matcher.
8
+ def self.to_sym
9
+ name.delete_prefix("Matchi::Matcher::")
10
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
11
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
12
+ .downcase
13
+ .to_sym
14
+ end
15
+
16
+ # @return [#object_id] Any value to give to the matcher.
17
+ attr_reader :expected
18
+
19
+ # A string containing a human-readable representation of the matcher.
20
+ #
21
+ # @return [String] The human-readable representation of the matcher.
22
+ def inspect
23
+ "#{self.class}(#{expected&.inspect})"
24
+ end
25
+
26
+ # Abstract matcher class.
27
+ #
28
+ # @raise [NotImplementedError] Override me inside a matcher.
29
+ def matches?
30
+ raise ::NotImplementedError, "matcher MUST respond to this method."
31
+ end
32
+
33
+ # Returns a string representing the matcher.
34
+ #
35
+ # @example The readable definition of a FooBar matcher.
36
+ # matcher = Matchi::Matcher::FooBar.new(42)
37
+ # matcher.to_s # => "foo_bar 42"
38
+ #
39
+ # @return [String] A string representing the matcher.
40
+ def to_s
41
+ [self.class.to_sym, expected&.inspect].compact.join(" ")
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Matchi
6
+ module Matcher
7
+ # *Type/class* matcher.
8
+ class BeAnInstanceOf < ::Matchi::Matcher::Base
9
+ # Initialize the matcher with an object.
10
+ #
11
+ # @example A string matcher
12
+ # Matchi::Matcher::BeAnInstanceOf.new(String)
13
+ #
14
+ # @param expected [Class] An expected class.
15
+ def initialize(expected)
16
+ super()
17
+ @expected = expected
18
+ end
19
+
20
+ # Boolean comparison between the class of the actual value and the
21
+ # expected class.
22
+ #
23
+ # @example Is it an instance of string?
24
+ # be_an_instance_of = Matchi::Matcher::BeInstanceOf.new(String)
25
+ # be_an_instance_of.matches? { "foo" } # => true
26
+ #
27
+ # @yieldreturn [#class] the actual value to compare to the expected one.
28
+ #
29
+ # @return [Boolean] Comparison between actual and expected values.
30
+ def matches?(*, **)
31
+ expected.equal?(yield.class)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module Matchi
6
+ module Matcher
7
+ # *Untruth* matcher.
8
+ class BeFalse < ::Matchi::Matcher::Base
9
+ # Boolean comparison between the actual value and the expected value.
10
+ #
11
+ # @example Is it false?
12
+ # be_false = Matchi::Matcher::BeFalse.new
13
+ # be_false.matches? { false } # => true
14
+ #
15
+ # @yieldreturn [#object_id] The actual value to compare to the expected
16
+ # one.
17
+ #
18
+ # @return [Boolean] Comparison between actual and expected values.
19
+ def matches?(*, **)
20
+ false.equal?(yield)
21
+ end
22
+ end
23
+ end
24
+ end