eqq 0.0.3 → 0.0.4
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.
- checksums.yaml +4 -4
- data/README.md +31 -20
- data/lib/eqq.rb +6 -0
- data/lib/eqq/buildable.rb +35 -5
- data/lib/eqq/version.rb +2 -1
- data/sig/eqq.rbs +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53f4f6ec548d800742874bd0d98b015891227be295c9b22a0a3cb89eafce301b
|
4
|
+
data.tar.gz: 58d3f0a0513a7a4eff20d5aea9d60682d415e1582bc7fd9f39166894d03c75da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0eb69ecb3e22473df10aa8256191d03d02cfbd0cc7243d096c574d56f3d00e1932bda1b5d58fe3504b5da7cd68cdd0fb5c59ca91bba94bdef60a9e65d21eaf6e
|
7
|
+
data.tar.gz: 8d0393dc91eef5a40e144ab72e374e422f75302ca3b187bb8b24014ff074eca187c84ddd060e9344e3d5b75d56ed34b75e8869ed5d3cb5812f7a59a3080500b1
|
data/README.md
CHANGED
@@ -12,7 +12,7 @@ Require Ruby 2.6 or later
|
|
12
12
|
Add below code into your Gemfile
|
13
13
|
|
14
14
|
```ruby
|
15
|
-
gem 'eqq', '0.0.
|
15
|
+
gem 'eqq', '0.0.4'
|
16
16
|
```
|
17
17
|
|
18
18
|
### Overview
|
@@ -63,6 +63,15 @@ ret_in_case = (
|
|
63
63
|
)
|
64
64
|
|
65
65
|
p ret_in_case #=> Should be matched here! :)
|
66
|
+
|
67
|
+
class MyClass
|
68
|
+
include Eqq::Buildable
|
69
|
+
|
70
|
+
def example
|
71
|
+
[4.2, 42, 42.0, 420].grep(OR(AND(Float, 20..50), Integer))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
MyClass.new.example #=> [42, 42.0, 420]
|
66
75
|
```
|
67
76
|
|
68
77
|
### Explanation
|
@@ -86,34 +95,36 @@ They can take this interface as the `pattern`.
|
|
86
95
|
And you already saw. All of patterns can be mixed with other patterns as a parts.
|
87
96
|
Reuse as you wish!
|
88
97
|
|
89
|
-
|
98
|
+
### Builders
|
90
99
|
|
91
|
-
* OR(*patterns) - Product returns true when matched even one pattern
|
92
|
-
* AND(*patterns) - Product returns true when matched all patterns
|
93
|
-
* NOT(pattern) - Product returns true when not matched the pattern
|
94
|
-
* CAN(*method_names) - Product returns true when it has all of the methods (checked with `respond_to?`)
|
95
|
-
* RESCUE(exception_class/module, pattern) - Product returns true when the pattern raises the exception
|
96
|
-
* QUIET(*patterns) - Product returns true when all patterns did not raise any exception
|
97
|
-
* EQ(object) - Product returns true when matched with `#==`
|
98
|
-
* SAME(object) - Product returns true when matched with `#equal?`
|
99
|
-
* SEND(name, pattern) - Basically provided for Enumerable
|
100
|
-
* BOOLEAN() - Product returns true when matched to true or false
|
101
|
-
* ANYTHING() - Product returns true
|
100
|
+
* OR(*patterns) / {Eqq::Buildable#OR} - Product returns `true` when matched even one pattern
|
101
|
+
* AND(*patterns) / {Eqq::Buildable#AND} - Product returns `true` when matched all patterns
|
102
|
+
* NOT(pattern) / {Eqq::Buildable#NOT} - Product returns `true` when not matched the pattern
|
103
|
+
* CAN(*method_names) / {Eqq::Buildable#CAN} - Product returns `true` when it has all of the methods (checked with `respond_to?`)
|
104
|
+
* RESCUE(exception_class/module, pattern) / {Eqq::Buildable#RESCUE} - Product returns `true` when the pattern raises the exception
|
105
|
+
* QUIET(*patterns) / {Eqq::Buildable#QUIET} - Product returns `true` when all patterns did not raise any exception
|
106
|
+
* EQ(object) / {Eqq::Buildable#EQ} - Product returns `true` when matched with `#==`
|
107
|
+
* SAME(object) / {Eqq::Buildable#SAME} - Product returns `true` when matched with `#equal?`
|
108
|
+
* SEND(name, pattern) / {Eqq::Buildable#SEND} - Basically provided for Enumerable
|
109
|
+
* BOOLEAN() / {Eqq::Buildable#BOOLEAN} - Product returns `true` when matched to `true` or `false`
|
110
|
+
* ANYTHING() / {Eqq::Buildable#ANYTHING} - Product returns `true`, always `true`
|
111
|
+
* XOR(pattern1, pattern2) / {Eqq::Buildable#XOR} - Product returns `true` when matched one of the pattern, when matched both returns `false`
|
112
|
+
* NAND(*patterns) / {Eqq::Buildable#NAND} - Product is inverted {Eqq::Buildable#AND}
|
113
|
+
* NOR(*patterns) / {Eqq::Buildable#NOR} - Product is inverted {Eqq::Buildable#OR}
|
102
114
|
|
103
|
-
|
115
|
+
### Additional information
|
104
116
|
|
105
|
-
|
106
|
-
* NOR
|
107
|
-
* XOR
|
117
|
+
When you feel annoy to write `Eqq` in many place, 2 ways exist.
|
108
118
|
|
109
|
-
|
110
|
-
In the
|
119
|
+
* `Eqq.define` - In the block scope, all builder methods can be used without receiver
|
120
|
+
* `include Eqq::Buildable` - In the class/module, all builders can be used as own method
|
111
121
|
|
112
|
-
This gem
|
122
|
+
This gem provides [ruby/rbs](https://github.com/ruby/rbs) signatures
|
113
123
|
|
114
124
|
## Links
|
115
125
|
|
116
126
|
* [Repository](https://github.com/kachick/eqq)
|
127
|
+
* [API documents](https://kachick.github.io/eqq)
|
117
128
|
|
118
129
|
## NOTE
|
119
130
|
|
data/lib/eqq.rb
CHANGED
@@ -6,8 +6,12 @@
|
|
6
6
|
|
7
7
|
require_relative 'eqq/version'
|
8
8
|
|
9
|
+
# Pattern objects builder
|
9
10
|
module Eqq
|
11
|
+
# Base error of this library
|
10
12
|
class Error < StandardError; end
|
13
|
+
|
14
|
+
# Raised when found some products are invalid as a pattern object
|
11
15
|
class InvalidProductError < Error; end
|
12
16
|
|
13
17
|
class << self
|
@@ -25,6 +29,7 @@ module Eqq
|
|
25
29
|
end
|
26
30
|
|
27
31
|
# @return [#===]
|
32
|
+
# @raise [InvalidProductError] if the return value is invalid as a pattern object
|
28
33
|
def define(&block)
|
29
34
|
pattern = DSLScope.new.instance_exec(&block)
|
30
35
|
raise InvalidProductError unless valid?(pattern)
|
@@ -42,4 +47,5 @@ module Eqq
|
|
42
47
|
class DSLScope
|
43
48
|
include Buildable
|
44
49
|
end
|
50
|
+
private_constant :DSLScope
|
45
51
|
end
|
data/lib/eqq/buildable.rb
CHANGED
@@ -2,10 +2,11 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Eqq
|
5
|
+
# Actually having definitions for the pattern builders
|
5
6
|
module Buildable
|
6
|
-
extend self
|
7
|
-
|
8
7
|
class << self
|
8
|
+
# When the inspection is failed some unexpected reasons, it will fallback to this value
|
9
|
+
# This value is not fixed as a spec, might be changed in future
|
9
10
|
INSPECTION_FALLBACK = 'UninspectableObject'
|
10
11
|
|
11
12
|
# @api private
|
@@ -43,6 +44,8 @@ module Eqq
|
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
47
|
+
# Product returns `true` when matched all patterns
|
48
|
+
#
|
46
49
|
# @param pattern1 [Proc, Method, #===]
|
47
50
|
# @param pattern2 [Proc, Method, #===]
|
48
51
|
# @param patterns [Array<Proc, Method, #===>]
|
@@ -60,6 +63,8 @@ module Eqq
|
|
60
63
|
product
|
61
64
|
end
|
62
65
|
|
66
|
+
# Product is inverted {#AND}
|
67
|
+
#
|
63
68
|
# @param pattern1 [Proc, Method, #===]
|
64
69
|
# @param pattern2 [Proc, Method, #===]
|
65
70
|
# @param patterns [Array<Proc, Method, #===>]
|
@@ -68,6 +73,8 @@ module Eqq
|
|
68
73
|
NOT(AND(pattern1, pattern2, *patterns))
|
69
74
|
end
|
70
75
|
|
76
|
+
# Product returns `true` when matched even one pattern
|
77
|
+
#
|
71
78
|
# @param pattern1 [Proc, Method, #===]
|
72
79
|
# @param pattern2 [Proc, Method, #===]
|
73
80
|
# @param patterns [Array<Proc, Method, #===>]
|
@@ -84,6 +91,8 @@ module Eqq
|
|
84
91
|
product
|
85
92
|
end
|
86
93
|
|
94
|
+
# Product is inverted {#OR}
|
95
|
+
#
|
87
96
|
# @param pattern1 [Proc, Method, #===]
|
88
97
|
# @param pattern2 [Proc, Method, #===]
|
89
98
|
# @param patterns [Array<Proc, Method, #===>]
|
@@ -92,6 +101,8 @@ module Eqq
|
|
92
101
|
NOT(OR(pattern1, pattern2, *patterns))
|
93
102
|
end
|
94
103
|
|
104
|
+
# Product returns `true` when matched one of the pattern, when matched both returns `false`
|
105
|
+
#
|
95
106
|
# @param pattern1 [Proc, Method, #===]
|
96
107
|
# @param pattern2 [Proc, Method, #===]
|
97
108
|
# @return [Proc]
|
@@ -107,6 +118,8 @@ module Eqq
|
|
107
118
|
product
|
108
119
|
end
|
109
120
|
|
121
|
+
# Product returns `true` when not matched the pattern
|
122
|
+
#
|
110
123
|
# @param pattern [Proc, Method, #===]
|
111
124
|
# @return [Proc]
|
112
125
|
def NOT(pattern)
|
@@ -119,6 +132,8 @@ module Eqq
|
|
119
132
|
product
|
120
133
|
end
|
121
134
|
|
135
|
+
# Product returns `true` when matched with `#==`
|
136
|
+
#
|
122
137
|
# @param obj [#==]
|
123
138
|
# @return [Proc]
|
124
139
|
def EQ(obj)
|
@@ -127,6 +142,8 @@ module Eqq
|
|
127
142
|
end
|
128
143
|
end
|
129
144
|
|
145
|
+
# Product returns `true` when matched with `#equal?`
|
146
|
+
#
|
130
147
|
# @param obj [#equal?]
|
131
148
|
# @return [Proc]
|
132
149
|
def SAME(obj)
|
@@ -135,6 +152,8 @@ module Eqq
|
|
135
152
|
end
|
136
153
|
end
|
137
154
|
|
155
|
+
# Product returns `true` when it has all of the methods (checked with `respond_to?`)
|
156
|
+
#
|
138
157
|
# @param message1 [Symbol, String, #to_sym]
|
139
158
|
# @param messages [Array<Symbol, String, #to_sym>]
|
140
159
|
# @return [Proc]
|
@@ -162,6 +181,8 @@ module Eqq
|
|
162
181
|
product
|
163
182
|
end
|
164
183
|
|
184
|
+
# Product returns `true` when all patterns did not raise any exception
|
185
|
+
#
|
165
186
|
# @param pattern1 [Proc, Method, #===]
|
166
187
|
# @param patterns [Array<Proc, Method, #===>]
|
167
188
|
# @return [Proc]
|
@@ -186,6 +207,8 @@ module Eqq
|
|
186
207
|
product
|
187
208
|
end
|
188
209
|
|
210
|
+
# Product returns `true` when the pattern raises the exception
|
211
|
+
#
|
189
212
|
# @param mod [Module]
|
190
213
|
# @param pattern [Proc, Method, #===]
|
191
214
|
# @return [Proc]
|
@@ -209,6 +232,8 @@ module Eqq
|
|
209
232
|
product
|
210
233
|
end
|
211
234
|
|
235
|
+
# Basically provided for Enumerable
|
236
|
+
#
|
212
237
|
# @param name [Symbol, String, #to_sym]
|
213
238
|
# @param pattern [Proc, Method, #===]
|
214
239
|
# @return [Proc]
|
@@ -235,15 +260,20 @@ module Eqq
|
|
235
260
|
Buildable.set_inspect(name: 'ANYTHING', product: ANYTHING, arguments: [])
|
236
261
|
private_constant :ANYTHING
|
237
262
|
|
238
|
-
#
|
263
|
+
# Product returns `true`, always `true`
|
264
|
+
#
|
265
|
+
# @return [Proc]
|
239
266
|
def ANYTHING
|
240
267
|
ANYTHING
|
241
268
|
end
|
242
269
|
|
243
|
-
BOOLEAN =
|
270
|
+
BOOLEAN = ->v { true.equal?(v) || false.equal?(v) }
|
271
|
+
Buildable.set_inspect(name: 'BOOLEAN', product: BOOLEAN, arguments: [])
|
244
272
|
private_constant :BOOLEAN
|
245
273
|
|
246
|
-
#
|
274
|
+
# Product returns `true` when matched to `true` or `false`
|
275
|
+
#
|
276
|
+
# @return [Proc]
|
247
277
|
def BOOLEAN
|
248
278
|
BOOLEAN
|
249
279
|
end
|
data/lib/eqq/version.rb
CHANGED
data/sig/eqq.rbs
CHANGED
@@ -30,7 +30,6 @@ module Eqq
|
|
30
30
|
# A private API. Should not be used in your code.
|
31
31
|
def self.validate_patterns: (*untyped) -> void
|
32
32
|
|
33
|
-
extend Buildable
|
34
33
|
def OR: (_Patternable, _Patternable, *_Patternable) -> product
|
35
34
|
def AND: (_Patternable, _Patternable, *_Patternable) -> product
|
36
35
|
def NAND: (_Patternable, _Patternable, *_Patternable) -> product
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eqq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenichi Kamiya
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-06-
|
11
|
+
date: 2021-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: " [4.2, 42, 42.0, 420].grep(Eqq.AND(Integer, 20..50)) #=> [42]\n"
|
14
14
|
email:
|