dry-logic 1.5.0 → 1.6.0
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/CHANGELOG.md +13 -0
- data/LICENSE +1 -1
- data/README.md +3 -3
- data/dry-logic.gemspec +6 -8
- data/lib/dry/logic/builder.rb +8 -8
- data/lib/dry/logic/operations/abstract.rb +1 -1
- data/lib/dry/logic/operations/check.rb +1 -1
- data/lib/dry/logic/operations/each.rb +1 -1
- data/lib/dry/logic/predicates.rb +75 -137
- data/lib/dry/logic/result.rb +1 -1
- data/lib/dry/logic/rule/interface.rb +16 -22
- data/lib/dry/logic/rule.rb +2 -2
- data/lib/dry/logic/version.rb +1 -1
- metadata +23 -56
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c1ad8dbf80a90343c1b903d8c56682b3b83ec02fbd40b96175598d011ca6e5fb
|
4
|
+
data.tar.gz: 1bdd6f06073b61dfaa843844c72a96408dcb8745b69ecfae99758da1b7876abc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8f95362da176825e3dc22dac020ab008222980788abc472b7008b6fd9c98aae7f48a18c523b5f8194399e08fc271a457b8167438ad103faad8f6ebc7ae7a0c6
|
7
|
+
data.tar.gz: 06644cc140ae06bf5f9df176560a21aca0aa3f96ff250cabfe299c7864b7ed31c673576b68e035809645c4a24ccce6867c9232c50874da669dbe7c6c75189dbe
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
<!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
|
2
2
|
|
3
|
+
## 1.6.0 2025-01-04
|
4
|
+
|
5
|
+
|
6
|
+
### Fixed
|
7
|
+
|
8
|
+
- Fix NoMethodError when trying to get AST of a Builder's result. (via #107) (@estum)
|
9
|
+
|
10
|
+
### Changed
|
11
|
+
|
12
|
+
- Set 3.1 as minimum ruby version (@flash-gordon)
|
13
|
+
|
14
|
+
[Compare v1.5.0...v1.6.0](https://github.com/dry-rb/dry-logic/compare/v1.5.0...v1.6.0)
|
15
|
+
|
3
16
|
## 1.5.0 2022-11-24
|
4
17
|
|
5
18
|
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
[gem]: https://rubygems.org/gems/dry-logic
|
3
3
|
[actions]: https://github.com/dry-rb/dry-logic/actions
|
4
4
|
|
5
|
-
# dry-logic [][gem] [][gem] [][actions]
|
6
6
|
|
7
7
|
## Links
|
8
8
|
|
@@ -14,8 +14,8 @@
|
|
14
14
|
|
15
15
|
This library officially supports the following Ruby versions:
|
16
16
|
|
17
|
-
* MRI `>=
|
18
|
-
* jruby `>= 9.
|
17
|
+
* MRI `>= 3.1`
|
18
|
+
* jruby `>= 9.4` (not tested on CI)
|
19
19
|
|
20
20
|
## License
|
21
21
|
|
data/dry-logic.gemspec
CHANGED
@@ -25,15 +25,13 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-logic/blob/main/CHANGELOG.md"
|
26
26
|
spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-logic"
|
27
27
|
spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-logic/issues"
|
28
|
+
spec.metadata["rubygems_mfa_required"] = "true"
|
28
29
|
|
29
|
-
spec.required_ruby_version = ">=
|
30
|
+
spec.required_ruby_version = ">= 3.1.0"
|
30
31
|
|
31
32
|
# to update dependencies edit project.yml
|
32
|
-
spec.
|
33
|
-
spec.
|
34
|
-
spec.
|
35
|
-
|
36
|
-
spec.add_development_dependency "bundler"
|
37
|
-
spec.add_development_dependency "rake"
|
38
|
-
spec.add_development_dependency "rspec"
|
33
|
+
spec.add_dependency "bigdecimal"
|
34
|
+
spec.add_dependency "concurrent-ruby", "~> 1.0"
|
35
|
+
spec.add_dependency "dry-core", "~> 1.1"
|
36
|
+
spec.add_dependency "zeitwerk", "~> 2.6"
|
39
37
|
end
|
data/lib/dry/logic/builder.rb
CHANGED
@@ -28,8 +28,8 @@ module Dry
|
|
28
28
|
# p is_zero.call(1) # => false
|
29
29
|
# p is_zero.call(0) # => true
|
30
30
|
# p is_zero.call(-1) # => false
|
31
|
-
def call(&
|
32
|
-
Context.instance.call(&
|
31
|
+
def call(&)
|
32
|
+
Context.instance.call(&)
|
33
33
|
end
|
34
34
|
module_function :call
|
35
35
|
alias_method :build, :call
|
@@ -44,23 +44,23 @@ module Dry
|
|
44
44
|
end
|
45
45
|
|
46
46
|
# @see Builder#call
|
47
|
-
def call(&
|
48
|
-
instance_eval(&
|
47
|
+
def call(&)
|
48
|
+
instance_eval(&)
|
49
49
|
end
|
50
50
|
|
51
51
|
# Defines custom predicate
|
52
52
|
#
|
53
53
|
# @name [Symbol] Name of predicate
|
54
54
|
# @Context [Proc]
|
55
|
-
def predicate(name, &
|
55
|
+
def predicate(name, context = nil, &block)
|
56
56
|
if singleton_class.method_defined?(name)
|
57
57
|
singleton_class.undef_method(name)
|
58
58
|
end
|
59
59
|
|
60
|
-
|
60
|
+
predicate = Rule::Predicate.new(context || block)
|
61
61
|
|
62
62
|
define_singleton_method(name) do |*args|
|
63
|
-
|
63
|
+
predicate.curry(*args)
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
@@ -78,7 +78,7 @@ module Dry
|
|
78
78
|
|
79
79
|
Predicates::Methods.instance_methods(false).each do |name|
|
80
80
|
unless IGNORED_PREDICATES.include?(name)
|
81
|
-
predicate(name,
|
81
|
+
predicate(name, Predicates[name])
|
82
82
|
end
|
83
83
|
end
|
84
84
|
end
|
data/lib/dry/logic/predicates.rb
CHANGED
@@ -5,11 +5,12 @@ require "dry/core/constants"
|
|
5
5
|
require "bigdecimal"
|
6
6
|
require "bigdecimal/util"
|
7
7
|
require "date"
|
8
|
+
require "uri"
|
8
9
|
|
9
10
|
module Dry
|
10
11
|
module Logic
|
11
12
|
module Predicates
|
12
|
-
include Dry::Core::Constants
|
13
|
+
include ::Dry::Core::Constants
|
13
14
|
|
14
15
|
# rubocop:disable Metrics/ModuleLength
|
15
16
|
module Methods
|
@@ -29,143 +30,99 @@ module Dry
|
|
29
30
|
|
30
31
|
UUIDv5 = uuid_format(5)
|
31
32
|
|
33
|
+
UUIDv6 = uuid_format(6)
|
34
|
+
|
35
|
+
UUIDv7 = uuid_format(7)
|
36
|
+
|
37
|
+
UUIDv8 = uuid_format(8)
|
38
|
+
|
32
39
|
def [](name)
|
33
40
|
method(name)
|
34
41
|
end
|
35
42
|
|
36
|
-
def type?(type, input)
|
37
|
-
input.is_a?(type)
|
38
|
-
end
|
43
|
+
def type?(type, input) = input.is_a?(type)
|
39
44
|
|
40
|
-
def nil?(input)
|
41
|
-
input.nil?
|
42
|
-
end
|
45
|
+
def nil?(input) = input.nil?
|
43
46
|
alias_method :none?, :nil?
|
44
47
|
|
45
|
-
def key?(name, input)
|
46
|
-
input.key?(name)
|
47
|
-
end
|
48
|
+
def key?(name, input) = input.key?(name)
|
48
49
|
|
49
|
-
def attr?(name, input)
|
50
|
-
input.respond_to?(name)
|
51
|
-
end
|
50
|
+
def attr?(name, input) = input.respond_to?(name)
|
52
51
|
|
53
52
|
def empty?(input)
|
54
53
|
case input
|
55
|
-
when String, Array, Hash then input.empty?
|
54
|
+
when ::String, ::Array, ::Hash then input.empty?
|
56
55
|
when nil then true
|
57
56
|
else
|
58
57
|
false
|
59
58
|
end
|
60
59
|
end
|
61
60
|
|
62
|
-
def filled?(input)
|
63
|
-
!empty?(input)
|
64
|
-
end
|
61
|
+
def filled?(input) = !empty?(input)
|
65
62
|
|
66
|
-
def bool?(input)
|
67
|
-
input.is_a?(TrueClass) || input.is_a?(FalseClass)
|
68
|
-
end
|
63
|
+
def bool?(input) = input.equal?(true) || input.equal?(false)
|
69
64
|
|
70
|
-
def date?(input)
|
71
|
-
input.is_a?(Date)
|
72
|
-
end
|
65
|
+
def date?(input) = input.is_a?(::Date)
|
73
66
|
|
74
|
-
def date_time?(input)
|
75
|
-
input.is_a?(DateTime)
|
76
|
-
end
|
67
|
+
def date_time?(input) = input.is_a?(::DateTime)
|
77
68
|
|
78
|
-
def time?(input)
|
79
|
-
input.is_a?(Time)
|
80
|
-
end
|
69
|
+
def time?(input) = input.is_a?(::Time)
|
81
70
|
|
82
71
|
def number?(input)
|
83
72
|
true if Float(input)
|
84
|
-
rescue ArgumentError, TypeError
|
73
|
+
rescue ::ArgumentError, ::TypeError
|
85
74
|
false
|
86
75
|
end
|
87
76
|
|
88
|
-
def int?(input)
|
89
|
-
input.is_a?(Integer)
|
90
|
-
end
|
77
|
+
def int?(input) = input.is_a?(::Integer)
|
91
78
|
|
92
|
-
def float?(input)
|
93
|
-
input.is_a?(Float)
|
94
|
-
end
|
79
|
+
def float?(input) = input.is_a?(::Float)
|
95
80
|
|
96
|
-
def decimal?(input)
|
97
|
-
input.is_a?(BigDecimal)
|
98
|
-
end
|
81
|
+
def decimal?(input) = input.is_a?(::BigDecimal)
|
99
82
|
|
100
|
-
def str?(input)
|
101
|
-
input.is_a?(String)
|
102
|
-
end
|
83
|
+
def str?(input) = input.is_a?(::String)
|
103
84
|
|
104
|
-
def hash?(input)
|
105
|
-
input.is_a?(Hash)
|
106
|
-
end
|
85
|
+
def hash?(input) = input.is_a?(::Hash)
|
107
86
|
|
108
|
-
def array?(input)
|
109
|
-
input.is_a?(Array)
|
110
|
-
end
|
87
|
+
def array?(input) = input.is_a?(::Array)
|
111
88
|
|
112
|
-
def odd?(input)
|
113
|
-
input.odd?
|
114
|
-
end
|
89
|
+
def odd?(input) = input.odd?
|
115
90
|
|
116
|
-
def even?(input)
|
117
|
-
input.even?
|
118
|
-
end
|
91
|
+
def even?(input) = input.even?
|
119
92
|
|
120
|
-
def lt?(num, input)
|
121
|
-
input < num
|
122
|
-
end
|
93
|
+
def lt?(num, input) = input < num
|
123
94
|
|
124
|
-
def gt?(num, input)
|
125
|
-
input > num
|
126
|
-
end
|
95
|
+
def gt?(num, input) = input > num
|
127
96
|
|
128
|
-
def lteq?(num, input)
|
129
|
-
!gt?(num, input)
|
130
|
-
end
|
97
|
+
def lteq?(num, input) = !gt?(num, input)
|
131
98
|
|
132
|
-
def gteq?(num, input)
|
133
|
-
!lt?(num, input)
|
134
|
-
end
|
99
|
+
def gteq?(num, input) = !lt?(num, input)
|
135
100
|
|
136
101
|
def size?(size, input)
|
137
102
|
case size
|
138
|
-
when Integer then size.equal?(input.size)
|
139
|
-
when Range, Array then size.include?(input.size)
|
103
|
+
when ::Integer then size.equal?(input.size)
|
104
|
+
when ::Range, ::Array then size.include?(input.size)
|
140
105
|
else
|
141
|
-
raise ArgumentError, "+#{size}+ is not supported type for size? predicate."
|
106
|
+
raise ::ArgumentError, "+#{size}+ is not supported type for size? predicate."
|
142
107
|
end
|
143
108
|
end
|
144
109
|
|
145
|
-
def min_size?(num, input)
|
146
|
-
input.size >= num
|
147
|
-
end
|
110
|
+
def min_size?(num, input) = input.size >= num
|
148
111
|
|
149
|
-
def max_size?(num, input)
|
150
|
-
input.size <= num
|
151
|
-
end
|
112
|
+
def max_size?(num, input) = input.size <= num
|
152
113
|
|
153
114
|
def bytesize?(size, input)
|
154
115
|
case size
|
155
|
-
when Integer then size.equal?(input.bytesize)
|
156
|
-
when Range, Array then size.include?(input.bytesize)
|
116
|
+
when ::Integer then size.equal?(input.bytesize)
|
117
|
+
when ::Range, ::Array then size.include?(input.bytesize)
|
157
118
|
else
|
158
|
-
raise ArgumentError, "+#{size}+ is not supported type for bytesize? predicate."
|
119
|
+
raise ::ArgumentError, "+#{size}+ is not supported type for bytesize? predicate."
|
159
120
|
end
|
160
121
|
end
|
161
122
|
|
162
|
-
def min_bytesize?(num, input)
|
163
|
-
input.bytesize >= num
|
164
|
-
end
|
123
|
+
def min_bytesize?(num, input) = input.bytesize >= num
|
165
124
|
|
166
|
-
def max_bytesize?(num, input)
|
167
|
-
input.bytesize <= num
|
168
|
-
end
|
125
|
+
def max_bytesize?(num, input) = input.bytesize <= num
|
169
126
|
|
170
127
|
def inclusion?(list, input)
|
171
128
|
deprecated(:inclusion?, :included_in?)
|
@@ -177,13 +134,9 @@ module Dry
|
|
177
134
|
excluded_from?(list, input)
|
178
135
|
end
|
179
136
|
|
180
|
-
def included_in?(list, input)
|
181
|
-
list.include?(input)
|
182
|
-
end
|
137
|
+
def included_in?(list, input) = list.include?(input)
|
183
138
|
|
184
|
-
def excluded_from?(list, input)
|
185
|
-
!list.include?(input)
|
186
|
-
end
|
139
|
+
def excluded_from?(list, input) = !list.include?(input)
|
187
140
|
|
188
141
|
def includes?(value, input)
|
189
142
|
if input.respond_to?(:include?)
|
@@ -191,13 +144,11 @@ module Dry
|
|
191
144
|
else
|
192
145
|
false
|
193
146
|
end
|
194
|
-
rescue TypeError
|
147
|
+
rescue ::TypeError
|
195
148
|
false
|
196
149
|
end
|
197
150
|
|
198
|
-
def excludes?(value, input)
|
199
|
-
!includes?(value, input)
|
200
|
-
end
|
151
|
+
def excludes?(value, input) = !includes?(value, input)
|
201
152
|
|
202
153
|
# This overrides Object#eql? so we need to make it compatible
|
203
154
|
def eql?(left, right = Undefined)
|
@@ -206,61 +157,48 @@ module Dry
|
|
206
157
|
left.eql?(right)
|
207
158
|
end
|
208
159
|
|
209
|
-
def is?(left, right)
|
210
|
-
left.equal?(right)
|
211
|
-
end
|
160
|
+
def is?(left, right) = left.equal?(right)
|
212
161
|
|
213
|
-
def not_eql?(left, right)
|
214
|
-
!left.eql?(right)
|
215
|
-
end
|
162
|
+
def not_eql?(left, right) = !left.eql?(right)
|
216
163
|
|
217
|
-
def true?(value)
|
218
|
-
value.equal?(true)
|
219
|
-
end
|
164
|
+
def true?(value) = value.equal?(true)
|
220
165
|
|
221
|
-
def false?(value)
|
222
|
-
value.equal?(false)
|
223
|
-
end
|
166
|
+
def false?(value) = value.equal?(false)
|
224
167
|
|
225
|
-
def format?(regex, input)
|
226
|
-
!input.nil? && regex.match?(input)
|
227
|
-
end
|
168
|
+
def format?(regex, input) = !input.nil? && regex.match?(input)
|
228
169
|
|
229
|
-
def case?(pattern, input)
|
230
|
-
# rubocop:disable Style/CaseEquality
|
231
|
-
pattern === input
|
232
|
-
# rubocop:enable Style/CaseEquality
|
233
|
-
end
|
170
|
+
def case?(pattern, input) = pattern === input # rubocop:disable Style/CaseEquality
|
234
171
|
|
235
|
-
def uuid_v1?(input)
|
236
|
-
format?(UUIDv1, input)
|
237
|
-
end
|
172
|
+
def uuid_v1?(input) = format?(UUIDv1, input)
|
238
173
|
|
239
|
-
def uuid_v2?(input)
|
240
|
-
format?(UUIDv2, input)
|
241
|
-
end
|
174
|
+
def uuid_v2?(input) = format?(UUIDv2, input)
|
242
175
|
|
243
|
-
def uuid_v3?(input)
|
244
|
-
format?(UUIDv3, input)
|
245
|
-
end
|
176
|
+
def uuid_v3?(input) = format?(UUIDv3, input)
|
246
177
|
|
247
|
-
def uuid_v4?(input)
|
248
|
-
format?(UUIDv4, input)
|
249
|
-
end
|
178
|
+
def uuid_v4?(input) = format?(UUIDv4, input)
|
250
179
|
|
251
|
-
def uuid_v5?(input)
|
252
|
-
format?(UUIDv5, input)
|
253
|
-
end
|
180
|
+
def uuid_v5?(input) = format?(UUIDv5, input)
|
254
181
|
|
255
|
-
def
|
256
|
-
|
257
|
-
|
258
|
-
|
182
|
+
def uuid_v6?(input) = format?(UUIDv6, input)
|
183
|
+
|
184
|
+
def uuid_v7?(input) = format?(UUIDv7, input)
|
185
|
+
|
186
|
+
def uuid_v8?(input) = format?(UUIDv8, input)
|
259
187
|
|
260
|
-
|
261
|
-
|
188
|
+
if defined?(::URI::RFC2396_PARSER)
|
189
|
+
def uri?(schemes, input)
|
190
|
+
uri_format = ::URI::RFC2396_PARSER.make_regexp(schemes)
|
191
|
+
format?(uri_format, input)
|
192
|
+
end
|
193
|
+
else
|
194
|
+
def uri?(schemes, input)
|
195
|
+
uri_format = ::URI::DEFAULT_PARSER.make_regexp(schemes)
|
196
|
+
format?(uri_format, input)
|
197
|
+
end
|
262
198
|
end
|
263
199
|
|
200
|
+
def uri_rfc3986?(input) = format?(::URI::RFC3986_Parser::RFC3986_URI, input)
|
201
|
+
|
264
202
|
# This overrides Object#respond_to? so we need to make it compatible
|
265
203
|
def respond_to?(method, input = Undefined)
|
266
204
|
return super if input.equal?(Undefined)
|
@@ -268,8 +206,8 @@ module Dry
|
|
268
206
|
input.respond_to?(method)
|
269
207
|
end
|
270
208
|
|
271
|
-
def predicate(name, &
|
272
|
-
define_singleton_method(name, &
|
209
|
+
def predicate(name, &)
|
210
|
+
define_singleton_method(name, &)
|
273
211
|
end
|
274
212
|
|
275
213
|
def deprecated(name, in_favor_of)
|
data/lib/dry/logic/result.rb
CHANGED
@@ -29,17 +29,11 @@ module Dry
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
def constant?
|
33
|
-
arity.zero?
|
34
|
-
end
|
32
|
+
def constant? = arity.zero?
|
35
33
|
|
36
|
-
def variable_arity?
|
37
|
-
arity.negative?
|
38
|
-
end
|
34
|
+
def variable_arity? = arity.negative?
|
39
35
|
|
40
|
-
def curried?
|
41
|
-
!curried.zero?
|
42
|
-
end
|
36
|
+
def curried? = !curried.zero?
|
43
37
|
|
44
38
|
def unapplied
|
45
39
|
if variable_arity?
|
@@ -116,26 +110,26 @@ module Dry
|
|
116
110
|
application = "@predicate[#{(curried_args + unapplied_args + splat).join(", ")}]"
|
117
111
|
|
118
112
|
module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
119
|
-
def call(#{parameters})
|
120
|
-
if #{application}
|
121
|
-
Result::SUCCESS
|
122
|
-
else
|
123
|
-
Result.new(false, id) { ast(#{parameters}) }
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
def [](#{parameters})
|
128
|
-
#{application}
|
129
|
-
end
|
113
|
+
def call(#{parameters}) # def call(input0, input1, *rest)
|
114
|
+
if #{application} # if @predicate[@arg0, @arg1, input0, input1, *rest]
|
115
|
+
Result::SUCCESS # ::Dry::Logic::Result::Success
|
116
|
+
else # else
|
117
|
+
Result.new(false, id) { ast(#{parameters}) } # ::Dry::Logic::Result.new(false, id) { ast(input0, input1, *rest) }
|
118
|
+
end # end
|
119
|
+
end # end
|
120
|
+
#
|
121
|
+
def [](#{parameters}) # def [](@arg0, @arg1, input0, input1, *rest)
|
122
|
+
#{application} # @predicate[@arg0, @arg1, input0, input1, *rest]
|
123
|
+
end # end
|
130
124
|
RUBY
|
131
125
|
end
|
132
126
|
|
133
127
|
def curried_args
|
134
|
-
@curried_args ||= ::Array.new(curried) {
|
128
|
+
@curried_args ||= ::Array.new(curried) { "@arg#{_1}" }
|
135
129
|
end
|
136
130
|
|
137
131
|
def unapplied_args
|
138
|
-
@unapplied_args ||= ::Array.new(unapplied) {
|
132
|
+
@unapplied_args ||= ::Array.new(unapplied) { "input#{_1}" }
|
139
133
|
end
|
140
134
|
end
|
141
135
|
end
|
data/lib/dry/logic/rule.rb
CHANGED
@@ -14,7 +14,7 @@ module Dry
|
|
14
14
|
|
15
15
|
class Rule
|
16
16
|
include Core::Constants
|
17
|
-
include Dry::Equalizer(:predicate, :options)
|
17
|
+
include ::Dry::Equalizer(:predicate, :options)
|
18
18
|
include Operators
|
19
19
|
|
20
20
|
attr_reader :predicate
|
@@ -32,7 +32,7 @@ module Dry
|
|
32
32
|
def self.specialize(arity, curried, base = Rule)
|
33
33
|
base.interfaces.fetch_or_store([arity, curried]) do
|
34
34
|
interface = Interface.new(arity, curried)
|
35
|
-
klass = Class.new(base) { include interface }
|
35
|
+
klass = ::Class.new(base) { include interface }
|
36
36
|
base.const_set("#{base.name.split("::").last}#{interface.name}", klass)
|
37
37
|
klass
|
38
38
|
end
|
data/lib/dry/logic/version.rb
CHANGED
metadata
CHANGED
@@ -1,39 +1,36 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry-logic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Solnica
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: bigdecimal
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: concurrent-ruby
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.0'
|
34
|
-
- - "<"
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: '2'
|
37
34
|
type: :runtime
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -41,65 +38,34 @@ dependencies:
|
|
41
38
|
- - "~>"
|
42
39
|
- !ruby/object:Gem::Version
|
43
40
|
version: '1.0'
|
44
|
-
- - "<"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '2'
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
42
|
+
name: dry-core
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
50
44
|
requirements:
|
51
45
|
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
47
|
+
version: '1.1'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
51
|
requirements:
|
58
52
|
- - "~>"
|
59
53
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
54
|
+
version: '1.1'
|
61
55
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
63
|
-
requirement: !ruby/object:Gem::Requirement
|
64
|
-
requirements:
|
65
|
-
- - ">="
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: '0'
|
68
|
-
type: :development
|
69
|
-
prerelease: false
|
70
|
-
version_requirements: !ruby/object:Gem::Requirement
|
71
|
-
requirements:
|
72
|
-
- - ">="
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: '0'
|
75
|
-
- !ruby/object:Gem::Dependency
|
76
|
-
name: rake
|
77
|
-
requirement: !ruby/object:Gem::Requirement
|
78
|
-
requirements:
|
79
|
-
- - ">="
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version: '0'
|
82
|
-
type: :development
|
83
|
-
prerelease: false
|
84
|
-
version_requirements: !ruby/object:Gem::Requirement
|
85
|
-
requirements:
|
86
|
-
- - ">="
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: '0'
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
|
-
name: rspec
|
56
|
+
name: zeitwerk
|
91
57
|
requirement: !ruby/object:Gem::Requirement
|
92
58
|
requirements:
|
93
|
-
- - "
|
59
|
+
- - "~>"
|
94
60
|
- !ruby/object:Gem::Version
|
95
|
-
version: '
|
96
|
-
type: :
|
61
|
+
version: '2.6'
|
62
|
+
type: :runtime
|
97
63
|
prerelease: false
|
98
64
|
version_requirements: !ruby/object:Gem::Requirement
|
99
65
|
requirements:
|
100
|
-
- - "
|
66
|
+
- - "~>"
|
101
67
|
- !ruby/object:Gem::Version
|
102
|
-
version: '
|
68
|
+
version: '2.6'
|
103
69
|
description: Predicate logic with rule composition
|
104
70
|
email:
|
105
71
|
- piotr.solnica@gmail.com
|
@@ -145,7 +111,8 @@ metadata:
|
|
145
111
|
changelog_uri: https://github.com/dry-rb/dry-logic/blob/main/CHANGELOG.md
|
146
112
|
source_code_uri: https://github.com/dry-rb/dry-logic
|
147
113
|
bug_tracker_uri: https://github.com/dry-rb/dry-logic/issues
|
148
|
-
|
114
|
+
rubygems_mfa_required: 'true'
|
115
|
+
post_install_message:
|
149
116
|
rdoc_options: []
|
150
117
|
require_paths:
|
151
118
|
- lib
|
@@ -153,15 +120,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
153
120
|
requirements:
|
154
121
|
- - ">="
|
155
122
|
- !ruby/object:Gem::Version
|
156
|
-
version:
|
123
|
+
version: 3.1.0
|
157
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
125
|
requirements:
|
159
126
|
- - ">="
|
160
127
|
- !ruby/object:Gem::Version
|
161
128
|
version: '0'
|
162
129
|
requirements: []
|
163
|
-
rubygems_version: 3.
|
164
|
-
signing_key:
|
130
|
+
rubygems_version: 3.3.27
|
131
|
+
signing_key:
|
165
132
|
specification_version: 4
|
166
133
|
summary: Predicate logic with rule composition
|
167
134
|
test_files: []
|