eqq 0.0.4 → 0.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 53f4f6ec548d800742874bd0d98b015891227be295c9b22a0a3cb89eafce301b
4
- data.tar.gz: 58d3f0a0513a7a4eff20d5aea9d60682d415e1582bc7fd9f39166894d03c75da
3
+ metadata.gz: 3d6619f43d14ad7f0519f68caabc8cf3128ebc3898608aaad753adb81c929201
4
+ data.tar.gz: ef9edac7cfd62cc0ba23f55e86ad9194a5396550ec9b9d1ec17614f36a0f21c4
5
5
  SHA512:
6
- metadata.gz: 0eb69ecb3e22473df10aa8256191d03d02cfbd0cc7243d096c574d56f3d00e1932bda1b5d58fe3504b5da7cd68cdd0fb5c59ca91bba94bdef60a9e65d21eaf6e
7
- data.tar.gz: 8d0393dc91eef5a40e144ab72e374e422f75302ca3b187bb8b24014ff074eca187c84ddd060e9344e3d5b75d56ed34b75e8869ed5d3cb5812f7a59a3080500b1
6
+ metadata.gz: a48164a2c1cea62810b4930fa92ca3ebb0b5a2a1b4877f743f1902de52b4ec429d590333437e54eae41ee917463ee5b3166f5c77394369bf2402ff6122cb4ee9
7
+ data.tar.gz: 880f51dbce3e27f845b05a520decd8c9a17b7c400837d29cb1ad0597ae00279d888c708632dd64eb5457f7ed9d023c9e71951e5b5c4a28c04252727043852f0f
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.4'
15
+ gem 'eqq', '>= 0.0.5', '< 0.1.0'
16
16
  ```
17
17
 
18
18
  ### Overview
@@ -97,26 +97,27 @@ Reuse as you wish!
97
97
 
98
98
  ### Builders
99
99
 
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}
100
+ * OR(*patterns) - Product returns `true` when matched even one pattern
101
+ * AND(*patterns) - Product returns `true` when matched all patterns
102
+ * NOT(pattern) - Product returns `true` when not matched the pattern
103
+ * CAN(*method_names) - Product returns `true` when it has all of the methods (checked with `respond_to?`)
104
+ * RESCUE(exception_class/module, pattern) - Product returns `true` when the pattern raises the exception
105
+ * QUIET(*patterns) - Product returns `true` when all patterns did not raise any exception
106
+ * EQ(object) - Product returns `true` when matched with `#==`
107
+ * SAME(object) - Product returns `true` when matched with `#equal?`
108
+ * SEND(name, pattern) - Basically provided for Enumerable
109
+ * BOOLEAN() - Product returns `true` when matched to `true` or `false`
110
+ * ANYTHING() - Product returns `true`, always `true`
111
+ * NEVER() - Product returns `false`, always `false`
112
+ * XOR(pattern1, pattern2) - Product returns `true` when matched one of the pattern, when matched both returns `false`
113
+ * NAND(*patterns) - Product is an inverted `AND`
114
+ * NOR(*patterns) - Product is an inverted `OR`
114
115
 
115
116
  ### Additional information
116
117
 
117
118
  When you feel annoy to write `Eqq` in many place, 2 ways exist.
118
119
 
119
- * `Eqq.define` - In the block scope, all builder methods can be used without receiver
120
+ * `Eqq.define(&block)` - In the block scope, all builder methods can be used without receiver
120
121
  * `include Eqq::Buildable` - In the class/module, all builders can be used as own method
121
122
 
122
123
  This gem provides [ruby/rbs](https://github.com/ruby/rbs) signatures
data/lib/eqq/buildable.rb CHANGED
@@ -11,7 +11,7 @@ module Eqq
11
11
 
12
12
  # @api private
13
13
  # @return [String]
14
- def safe_inspect(object)
14
+ def safe_inspect_for(object)
15
15
  String.try_convert(object.inspect) || INSPECTION_FALLBACK
16
16
  rescue Exception
17
17
  # This implementation used `RSpec::Support::ObjectFormatter::UninspectableObjectInspector` as a reference, thank you!
@@ -28,8 +28,8 @@ module Eqq
28
28
 
29
29
  # @api private
30
30
  # @return [void]
31
- def set_inspect(name:, product:, arguments:)
32
- inspect = "#{name}(#{arguments.map { |argument| safe_inspect(argument) }.join(', ')})".freeze
31
+ def define_inspect_on(product, name:, arguments:)
32
+ inspect = "#{name}(#{arguments.map { |argument| safe_inspect_for(argument) }.join(', ')})".freeze
33
33
  product.define_singleton_method(:inspect) do
34
34
  inspect
35
35
  end
@@ -39,7 +39,7 @@ module Eqq
39
39
  # @return [void]
40
40
  def validate_patterns(*patterns)
41
41
  invalids = patterns.reject { |pattern| Eqq.valid?(pattern) }
42
- invalid_inspections = invalids.map { |invalid| safe_inspect(invalid) }.join(', ')
42
+ invalid_inspections = invalids.map { |invalid| safe_inspect_for(invalid) }.join(', ')
43
43
  raise ArgumentError, "given `#{invalid_inspections}` are invalid as pattern objects" unless invalids.empty?
44
44
  end
45
45
  end
@@ -58,12 +58,12 @@ module Eqq
58
58
  patterns.all? { |pattern| pattern === v }
59
59
  }
60
60
 
61
- Buildable.set_inspect(name: 'AND', product: product, arguments: patterns)
61
+ Buildable.define_inspect_on(product, name: 'AND', arguments: patterns)
62
62
 
63
63
  product
64
64
  end
65
65
 
66
- # Product is inverted {#AND}
66
+ # Product is an inverted {#AND}
67
67
  #
68
68
  # @param pattern1 [Proc, Method, #===]
69
69
  # @param pattern2 [Proc, Method, #===]
@@ -86,12 +86,12 @@ module Eqq
86
86
  product = ->v {
87
87
  patterns.any? { |pattern| pattern === v }
88
88
  }
89
- Buildable.set_inspect(name: 'OR', product: product, arguments: patterns)
89
+ Buildable.define_inspect_on(product, name: 'OR', arguments: patterns)
90
90
 
91
91
  product
92
92
  end
93
93
 
94
- # Product is inverted {#OR}
94
+ # Product is an inverted {#OR}
95
95
  #
96
96
  # @param pattern1 [Proc, Method, #===]
97
97
  # @param pattern2 [Proc, Method, #===]
@@ -113,7 +113,7 @@ module Eqq
113
113
  product = ->v {
114
114
  patterns.one? { |pattern| pattern === v }
115
115
  }
116
- Buildable.set_inspect(name: 'XOR', product: product, arguments: patterns)
116
+ Buildable.define_inspect_on(product, name: 'XOR', arguments: patterns)
117
117
 
118
118
  product
119
119
  end
@@ -127,7 +127,7 @@ module Eqq
127
127
 
128
128
  product = ->v { !(pattern === v) }
129
129
 
130
- Buildable.set_inspect(name: 'NOT', product: product, arguments: [pattern])
130
+ Buildable.define_inspect_on(product, name: 'NOT', arguments: [pattern])
131
131
 
132
132
  product
133
133
  end
@@ -137,9 +137,9 @@ module Eqq
137
137
  # @param obj [#==]
138
138
  # @return [Proc]
139
139
  def EQ(obj)
140
- ->v { obj == v }.tap do |product|
141
- Buildable.set_inspect(name: 'EQ', product: product, arguments: [obj])
142
- end
140
+ product = ->v { obj == v }
141
+ Buildable.define_inspect_on(product, name: 'EQ', arguments: [obj])
142
+ product
143
143
  end
144
144
 
145
145
  # Product returns `true` when matched with `#equal?`
@@ -147,9 +147,9 @@ module Eqq
147
147
  # @param obj [#equal?]
148
148
  # @return [Proc]
149
149
  def SAME(obj)
150
- ->v { obj.equal?(v) }.tap do |product|
151
- Buildable.set_inspect(name: 'SAME', product: product, arguments: [obj])
152
- end
150
+ product = ->v { obj.equal?(v) }
151
+ Buildable.define_inspect_on(product, name: 'SAME', arguments: [obj])
152
+ product
153
153
  end
154
154
 
155
155
  # Product returns `true` when it has all of the methods (checked with `respond_to?`)
@@ -176,7 +176,7 @@ module Eqq
176
176
  }
177
177
  }
178
178
 
179
- Buildable.set_inspect(name: 'CAN', product: product, arguments: messages)
179
+ Buildable.define_inspect_on(product, name: 'CAN', arguments: messages)
180
180
 
181
181
  product
182
182
  end
@@ -202,7 +202,7 @@ module Eqq
202
202
  }
203
203
  }
204
204
 
205
- Buildable.set_inspect(name: 'QUIET', product: product, arguments: patterns)
205
+ Buildable.define_inspect_on(product, name: 'QUIET', arguments: patterns)
206
206
 
207
207
  product
208
208
  end
@@ -227,7 +227,7 @@ module Eqq
227
227
  end
228
228
  }
229
229
 
230
- Buildable.set_inspect(name: 'RESCUE', product: product, arguments: [mod, pattern])
230
+ Buildable.define_inspect_on(product, name: 'RESCUE', arguments: [mod, pattern])
231
231
 
232
232
  product
233
233
  end
@@ -251,13 +251,13 @@ module Eqq
251
251
  v.__send__(name, pattern)
252
252
  }
253
253
 
254
- Buildable.set_inspect(name: 'SEND', product: product, arguments: [name, pattern])
254
+ Buildable.define_inspect_on(product, name: 'SEND', arguments: [name, pattern])
255
255
 
256
256
  product
257
257
  end
258
258
 
259
259
  ANYTHING = ->_v { true }
260
- Buildable.set_inspect(name: 'ANYTHING', product: ANYTHING, arguments: [])
260
+ define_inspect_on(ANYTHING, name: 'ANYTHING', arguments: [])
261
261
  private_constant :ANYTHING
262
262
 
263
263
  # Product returns `true`, always `true`
@@ -267,8 +267,19 @@ module Eqq
267
267
  ANYTHING
268
268
  end
269
269
 
270
+ NEVER = ->_v { false }
271
+ define_inspect_on(NEVER, name: 'NEVER', arguments: [])
272
+ private_constant :NEVER
273
+
274
+ # Product returns `false`, always `false`
275
+ #
276
+ # @return [Proc]
277
+ def NEVER
278
+ NEVER
279
+ end
280
+
270
281
  BOOLEAN = ->v { true.equal?(v) || false.equal?(v) }
271
- Buildable.set_inspect(name: 'BOOLEAN', product: BOOLEAN, arguments: [])
282
+ define_inspect_on(BOOLEAN, name: 'BOOLEAN', arguments: [])
272
283
  private_constant :BOOLEAN
273
284
 
274
285
  # Product returns `true` when matched to `true` or `false`
data/lib/eqq/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
 
4
4
  module Eqq
5
5
  # This will be same as latest published gem version
6
- VERSION = '0.0.4'
6
+ VERSION = '0.0.5'
7
7
  end
data/sig/eqq.rbs CHANGED
@@ -1,3 +1,4 @@
1
+ # Pattern objects builder
1
2
  module Eqq
2
3
  interface _Patternable
3
4
  def ===: (untyped object) -> bool
@@ -18,39 +19,74 @@ module Eqq
18
19
  # A private constant. Should not be used in your code.
19
20
  ANYTHING: product
20
21
 
22
+ # A private constant. Should not be used in your code.
23
+ NEVER: product
24
+
21
25
  # A private constant. Should not be used in your code.
22
26
  BOOLEAN: product
23
27
 
24
28
  # A private API. Should not be used in your code.
25
- def self.safe_inspect: (untyped object)-> String
29
+ def self.safe_inspect_for: (untyped object)-> String
26
30
 
27
31
  # A private API. Should not be used in your code.
28
- def self.set_inspect: (name: String, product: patternable_lambda, arguments: Array[untyped])-> void
32
+ def self.define_inspect_on: (patternable_lambda product, name: String, arguments: Array[untyped])-> void
29
33
 
30
34
  # A private API. Should not be used in your code.
31
35
  def self.validate_patterns: (*untyped) -> void
32
36
 
37
+ # Product returns `true` when matched even one pattern
33
38
  def OR: (_Patternable, _Patternable, *_Patternable) -> product
39
+
40
+ # Product returns `true` when matched all patterns
34
41
  def AND: (_Patternable, _Patternable, *_Patternable) -> product
42
+
43
+ # Product is an inverted `AND`
35
44
  def NAND: (_Patternable, _Patternable, *_Patternable) -> product
45
+
46
+ # Product is an inverted `OR`
36
47
  def NOR: (_Patternable, _Patternable, *_Patternable) -> product
48
+
49
+ # Product returns `true` when matched one of the pattern, when matched both returns `false`
37
50
  def XOR: (_Patternable, _Patternable) -> product
51
+
52
+ # Product returns `true` when not matched the pattern
38
53
  def NOT: (_Patternable) -> product
54
+
55
+ # Product returns `true` when matched with `#==`
39
56
  def EQ: (untyped object) -> product
57
+
58
+ # Product returns `true` when matched with `#equal?`
40
59
  def SAME: (untyped object) -> product
60
+
61
+ # Product returns `true` when it has all of the methods (checked with `respond_to?`)
41
62
  def CAN: (_ToSym, *_ToSym) -> product
63
+
64
+ # Product returns `true` when the pattern raises the exception
42
65
  def RESCUE: (Module, _Patternable) -> product
66
+
67
+ # Product returns `true` when all patterns did not raise any exception
43
68
  def QUIET: (_Patternable, *_Patternable) -> product
69
+
70
+ # Basically provided for Enumerable
44
71
  def SEND: (Symbol | String name, _Patternable) -> product
72
+
73
+ # Product returns `true`, always `true`
45
74
  def ANYTHING: () -> product
75
+
76
+ # Product returns `false`, always `false`
77
+ def NEVER: () -> product
78
+
79
+ # Product returns `true` when matched to `true` or `false`
46
80
  def BOOLEAN: () -> product
47
81
  end
48
82
 
49
83
  extend Buildable
50
84
 
85
+ # Base error of this library
51
86
  class Error < StandardError
52
87
  end
53
88
 
89
+ # Raised when found some products are invalid as a pattern object
54
90
  class InvalidProductError < Error
55
91
  end
56
92
 
@@ -61,9 +97,9 @@ module Eqq
61
97
 
62
98
  VERSION: String
63
99
 
64
- # A private constant. Should not be used in your code.
65
- INSPECTION_FALLBACK: String
66
-
100
+ # Returns `true` when given object has patternable signature
67
101
  def self.valid?: (untyped object) -> bool
102
+
103
+ # In the block scope, all builder methods can be used without receiver
68
104
  def self.define: { () -> _Patternable } -> _Patternable
69
105
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eqq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenichi Kamiya
@@ -10,7 +10,14 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2021-06-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: " [4.2, 42, 42.0, 420].grep(Eqq.AND(Integer, 20..50)) #=> [42]\n"
13
+ description: |2
14
+ Pattern objects builder.
15
+
16
+ All products can be used as `pattern === something`.
17
+
18
+ All products can be mixed with other products as a parts.
19
+
20
+ Reuse as you wish!
14
21
  email:
15
22
  - kachick1+ruby@gmail.com
16
23
  executables: []
@@ -49,5 +56,5 @@ requirements: []
49
56
  rubygems_version: 3.2.15
50
57
  signing_key:
51
58
  specification_version: 4
52
- summary: Pattern objects builder. `eqq` means `#===`
59
+ summary: Pattern objects builder
53
60
  test_files: []