eqq 0.0.5 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3d6619f43d14ad7f0519f68caabc8cf3128ebc3898608aaad753adb81c929201
4
- data.tar.gz: ef9edac7cfd62cc0ba23f55e86ad9194a5396550ec9b9d1ec17614f36a0f21c4
3
+ metadata.gz: dbc7af119664c115468e578edb51c0702530299538f1b067520295b41a150f7d
4
+ data.tar.gz: e47dbde377b0ca22a2e92a620c3cb5f87b4b09a061833416ebb4ffc88c311521
5
5
  SHA512:
6
- metadata.gz: a48164a2c1cea62810b4930fa92ca3ebb0b5a2a1b4877f743f1902de52b4ec429d590333437e54eae41ee917463ee5b3166f5c77394369bf2402ff6122cb4ee9
7
- data.tar.gz: 880f51dbce3e27f845b05a520decd8c9a17b7c400837d29cb1ad0597ae00279d888c708632dd64eb5457f7ed9d023c9e71951e5b5c4a28c04252727043852f0f
6
+ metadata.gz: c43cd582ac38023b1bc1521abc9dd1f15ec56e7bd2608553e1c7cddccecbf1765f331863c1e1ffabff4a9016698776aec99da16d6bc11ac63758e19af273e9da
7
+ data.tar.gz: b1f5c8d9868a02bc159b6a7eb18f3f8d7c1894af2f9b0f093867f30e73083add427ab4d79bb707381fe883317f8abb3c9cd8dcef79a36cf2a077ace202a4f295
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.5', '< 0.1.0'
15
+ gem 'eqq', '~> 0.1.1'
16
16
  ```
17
17
 
18
18
  ### Overview
@@ -24,7 +24,7 @@ require 'eqq'
24
24
  [42, nil, true, false, '', 0].grep(Eqq.BOOLEAN) #=> [true, false]
25
25
  [42, [], {}, 'string', Object.new, nil].grep(Eqq.CAN(:to_h)) #=> [[], {}, nil]
26
26
 
27
- pattern = Eqq.define do
27
+ pattern = Eqq.build do
28
28
  OR(AND(Float, 20..50), Integer)
29
29
  end
30
30
 
@@ -107,20 +107,44 @@ Reuse as you wish!
107
107
  * SAME(object) - Product returns `true` when matched with `#equal?`
108
108
  * SEND(name, pattern) - Basically provided for Enumerable
109
109
  * BOOLEAN() - Product returns `true` when matched to `true` or `false`
110
+ * NIL() - Product returns `true` when matched to `nil` (Not consider `nil?`)
110
111
  * ANYTHING() - Product returns `true`, always `true`
111
112
  * NEVER() - Product returns `false`, always `false`
112
113
  * XOR(pattern1, pattern2) - Product returns `true` when matched one of the pattern, when matched both returns `false`
113
114
  * NAND(*patterns) - Product is an inverted `AND`
114
115
  * NOR(*patterns) - Product is an inverted `OR`
115
116
 
116
- ### Additional information
117
+ ### Best fit for RSpec's `satisfy` matcher too
117
118
 
118
- When you feel annoy to write `Eqq` in many place, 2 ways exist.
119
+ All builders actually generate a `Proc (lambda)` instance.
120
+ The signature will fit for RSpec's built-in ["satisfy" matcher](https://relishapp.com/rspec/rspec-expectations/v/3-10/docs/built-in-matchers/satisfy-matcher) too.
119
121
 
120
- * `Eqq.define(&block)` - In the block scope, all builder methods can be used without receiver
121
- * `include Eqq::Buildable` - In the class/module, all builders can be used as own method
122
+ ```ruby
123
+ RSpec.describe RSpec::Matchers::BuiltIn::Satisfy do
124
+ let(:product) { Eqq.AND(Integer, 24..42) }
125
+
126
+ it 'perfectly works' do
127
+ expect(23).not_to satisfy(&product)
128
+ expect(24).to satisfy(&product)
129
+ expect(24.0).not_to satisfy(&product)
130
+ expect(42).to satisfy(&product)
131
+ expect(42.0).not_to satisfy(&product)
132
+ expect(43).not_to satisfy(&product)
133
+ end
134
+ end
135
+ ```
136
+
137
+ ### Use builders without receiver specifying
138
+
139
+ When you felt annoy to write `Eqq` in many place, some ways exist.
140
+
141
+ * `Eqq.build(&block)` - In the block scope, all builder methods can be used without receiver
142
+ * `extend Eqq::Buildable` - In the class/module, all builders can be used as class methods
143
+ * `include Eqq::Buildable` - In the class/module, all builders can be used as instance methods
144
+
145
+ ### Signature
122
146
 
123
- This gem provides [ruby/rbs](https://github.com/ruby/rbs) signatures
147
+ * This gem provides [ruby/rbs](https://github.com/ruby/rbs) signature file
124
148
 
125
149
  ## Links
126
150
 
@@ -129,4 +153,4 @@ This gem provides [ruby/rbs](https://github.com/ruby/rbs) signatures
129
153
 
130
154
  ## NOTE
131
155
 
132
- * [`eqq` is the implementation name of `#===` in CRuby](https://github.com/ruby/ruby/blob/2a685da1fcd928530509e99f5edb4117bc377994/range.c#L1859)
156
+ * ["eqq" is the implementation name of "#===" in CRuby](https://github.com/ruby/ruby/blob/2a685da1fcd928530509e99f5edb4117bc377994/range.c#L1859)
data/lib/eqq/buildable.rb CHANGED
@@ -38,7 +38,7 @@ module Eqq
38
38
  # @api private
39
39
  # @return [void]
40
40
  def validate_patterns(*patterns)
41
- invalids = patterns.reject { |pattern| Eqq.valid?(pattern) }
41
+ invalids = patterns.reject { |pattern| Eqq.pattern?(pattern) }
42
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
@@ -256,37 +256,46 @@ module Eqq
256
256
  product
257
257
  end
258
258
 
259
- ANYTHING = ->_v { true }
260
- define_inspect_on(ANYTHING, name: 'ANYTHING', arguments: [])
261
- private_constant :ANYTHING
259
+ EQQ_BUILTIN_ANYTHING = ->_v { true }
260
+ define_inspect_on(EQQ_BUILTIN_ANYTHING, name: 'ANYTHING', arguments: [])
262
261
 
263
262
  # Product returns `true`, always `true`
264
263
  #
265
264
  # @return [Proc]
266
265
  def ANYTHING
267
- ANYTHING
266
+ EQQ_BUILTIN_ANYTHING
268
267
  end
269
268
 
270
- NEVER = ->_v { false }
271
- define_inspect_on(NEVER, name: 'NEVER', arguments: [])
272
- private_constant :NEVER
269
+ EQQ_BUILTIN_NEVER = ->_v { false }
270
+ define_inspect_on(EQQ_BUILTIN_NEVER, name: 'NEVER', arguments: [])
273
271
 
274
272
  # Product returns `false`, always `false`
275
273
  #
276
274
  # @return [Proc]
277
275
  def NEVER
278
- NEVER
276
+ EQQ_BUILTIN_NEVER
279
277
  end
280
278
 
281
- BOOLEAN = ->v { true.equal?(v) || false.equal?(v) }
282
- define_inspect_on(BOOLEAN, name: 'BOOLEAN', arguments: [])
283
- private_constant :BOOLEAN
279
+ EQQ_BUILTIN_BOOLEAN = ->v { true.equal?(v) || false.equal?(v) }
280
+ define_inspect_on(EQQ_BUILTIN_BOOLEAN, name: 'BOOLEAN', arguments: [])
284
281
 
285
282
  # Product returns `true` when matched to `true` or `false`
286
283
  #
287
284
  # @return [Proc]
288
285
  def BOOLEAN
289
- BOOLEAN
286
+ EQQ_BUILTIN_BOOLEAN
290
287
  end
288
+
289
+ EQQ_BUILTIN_NIL = ->v { nil.equal?(v) }
290
+ define_inspect_on(EQQ_BUILTIN_NIL, name: 'NIL', arguments: [])
291
+
292
+ # Product returns `true` when matched to `nil` (Not consider `nil?`)
293
+ #
294
+ # @return [Proc]
295
+ def NIL
296
+ EQQ_BUILTIN_NIL
297
+ end
298
+
299
+ private_constant(:EQQ_BUILTIN_ANYTHING, :EQQ_BUILTIN_NEVER, :EQQ_BUILTIN_BOOLEAN, :EQQ_BUILTIN_NIL)
291
300
  end
292
301
  end
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.5'
6
+ VERSION = '0.1.1'
7
7
  end
data/lib/eqq.rb CHANGED
@@ -15,7 +15,7 @@ module Eqq
15
15
  class InvalidProductError < Error; end
16
16
 
17
17
  class << self
18
- def valid?(object)
18
+ def pattern?(object)
19
19
  case object
20
20
  when Proc, Method
21
21
  object.arity == 1
@@ -28,11 +28,20 @@ module Eqq
28
28
  end
29
29
  end
30
30
 
31
- # @return [#===]
32
- # @raise [InvalidProductError] if the return value is invalid as a pattern object
33
- def define(&block)
31
+ # @api private
32
+ def satisfy?(object)
33
+ (Proc === object) && object.lambda? && (object.arity == 1) && object.respond_to?(:inspect)
34
+ end
35
+
36
+ # In the block scope, all builder methods can be used without receiver
37
+ #
38
+ # @return [Proc]
39
+ # @raise [InvalidProductError] if the return value is not looks to be built with builders
40
+ def build(&block)
41
+ raise ArgumentError, 'might be mis used the `Eqq.build` in your code' unless block
42
+
34
43
  pattern = DSLScope.new.instance_exec(&block)
35
- raise InvalidProductError unless valid?(pattern)
44
+ raise InvalidProductError, 'might be mis used the `Eqq.build` in your code' unless satisfy?(pattern)
36
45
 
37
46
  pattern
38
47
  end
@@ -47,5 +56,5 @@ module Eqq
47
56
  class DSLScope
48
57
  include Buildable
49
58
  end
50
- private_constant :DSLScope
59
+ private_constant(:DSLScope)
51
60
  end
data/sig/eqq.rbs CHANGED
@@ -17,13 +17,16 @@ module Eqq
17
17
  type product = patternable_lambda & _Inspectable
18
18
 
19
19
  # A private constant. Should not be used in your code.
20
- ANYTHING: product
20
+ EQQ_BUILTIN_ANYTHING: product
21
21
 
22
22
  # A private constant. Should not be used in your code.
23
- NEVER: product
23
+ EQQ_BUILTIN_NEVER: product
24
24
 
25
25
  # A private constant. Should not be used in your code.
26
- BOOLEAN: product
26
+ EQQ_BUILTIN_BOOLEAN: product
27
+
28
+ # A private constant. Should not be used in your code.
29
+ EQQ_BUILTIN_NIL: product
27
30
 
28
31
  # A private API. Should not be used in your code.
29
32
  def self.safe_inspect_for: (untyped object)-> String
@@ -78,6 +81,9 @@ module Eqq
78
81
 
79
82
  # Product returns `true` when matched to `true` or `false`
80
83
  def BOOLEAN: () -> product
84
+
85
+ # Product returns `true` when matched to `nil` (Not consider `nil?`)
86
+ def NIL: () -> product
81
87
  end
82
88
 
83
89
  extend Buildable
@@ -98,8 +104,12 @@ module Eqq
98
104
  VERSION: String
99
105
 
100
106
  # Returns `true` when given object has patternable signature
101
- def self.valid?: (untyped object) -> bool
107
+ def self.pattern?: (untyped object) -> bool
108
+
109
+ # Returns `true` when given object has correct signature as a product of builders
110
+ # Basically this is a private API. Should not be used in your code.
111
+ def self.satisfy?: (untyped object) -> bool
102
112
 
103
113
  # In the block scope, all builder methods can be used without receiver
104
- def self.define: { () -> _Patternable } -> _Patternable
114
+ def self.build: { () -> _Patternable } -> _Patternable
105
115
  end
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.5
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenichi Kamiya
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-03 00:00:00.000000000 Z
11
+ date: 2022-05-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |2
14
14
  Pattern objects builder.
@@ -38,7 +38,8 @@ metadata:
38
38
  homepage_uri: https://github.com/kachick/eqq
39
39
  source_code_uri: https://github.com/kachick/eqq
40
40
  bug_tracker_uri: https://github.com/kachick/eqq/issues
41
- post_install_message:
41
+ rubygems_mfa_required: 'true'
42
+ post_install_message:
42
43
  rdoc_options: []
43
44
  require_paths:
44
45
  - lib
@@ -53,8 +54,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
53
54
  - !ruby/object:Gem::Version
54
55
  version: '0'
55
56
  requirements: []
56
- rubygems_version: 3.2.15
57
- signing_key:
57
+ rubygems_version: 3.3.7
58
+ signing_key:
58
59
  specification_version: 4
59
60
  summary: Pattern objects builder
60
61
  test_files: []