dry-logic 0.5.0 → 1.5.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.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +222 -17
  3. data/LICENSE +1 -1
  4. data/README.md +11 -20
  5. data/dry-logic.gemspec +36 -20
  6. data/lib/dry/logic/appliable.rb +2 -0
  7. data/lib/dry/logic/builder.rb +88 -0
  8. data/lib/dry/logic/evaluator.rb +1 -1
  9. data/lib/dry/logic/operations/abstract.rb +4 -6
  10. data/lib/dry/logic/operations/and.rb +12 -3
  11. data/lib/dry/logic/operations/attr.rb +1 -1
  12. data/lib/dry/logic/operations/binary.rb +4 -3
  13. data/lib/dry/logic/operations/check.rb +3 -5
  14. data/lib/dry/logic/operations/each.rb +1 -2
  15. data/lib/dry/logic/operations/implication.rb +1 -2
  16. data/lib/dry/logic/operations/key.rb +3 -5
  17. data/lib/dry/logic/operations/negation.rb +1 -2
  18. data/lib/dry/logic/operations/or.rb +1 -2
  19. data/lib/dry/logic/operations/set.rb +3 -4
  20. data/lib/dry/logic/operations/unary.rb +1 -1
  21. data/lib/dry/logic/operations/xor.rb +1 -2
  22. data/lib/dry/logic/operators.rb +6 -4
  23. data/lib/dry/logic/predicates.rb +110 -28
  24. data/lib/dry/logic/result.rb +2 -4
  25. data/lib/dry/logic/rule/interface.rb +143 -0
  26. data/lib/dry/logic/rule/predicate.rb +23 -17
  27. data/lib/dry/logic/rule.rb +31 -31
  28. data/lib/dry/logic/rule_compiler.rb +2 -7
  29. data/lib/dry/logic/version.rb +3 -1
  30. data/lib/dry/logic.rb +21 -5
  31. data/lib/dry-logic.rb +3 -1
  32. metadata +27 -143
  33. data/.codeclimate.yml +0 -23
  34. data/.gitignore +0 -7
  35. data/.rspec +0 -3
  36. data/.rubocop.yml +0 -16
  37. data/.rubocop_todo.yml +0 -7
  38. data/.travis.yml +0 -30
  39. data/CONTRIBUTING.md +0 -29
  40. data/Gemfile +0 -17
  41. data/Rakefile +0 -12
  42. data/bin/console +0 -10
  43. data/examples/basic.rb +0 -14
  44. data/lib/dry/logic/operations.rb +0 -13
  45. data/spec/integration/result_spec.rb +0 -59
  46. data/spec/integration/rule_spec.rb +0 -53
  47. data/spec/shared/predicates.rb +0 -57
  48. data/spec/shared/rule.rb +0 -67
  49. data/spec/spec_helper.rb +0 -34
  50. data/spec/support/mutant.rb +0 -9
  51. data/spec/unit/operations/and_spec.rb +0 -64
  52. data/spec/unit/operations/attr_spec.rb +0 -27
  53. data/spec/unit/operations/check_spec.rb +0 -49
  54. data/spec/unit/operations/each_spec.rb +0 -47
  55. data/spec/unit/operations/implication_spec.rb +0 -30
  56. data/spec/unit/operations/key_spec.rb +0 -133
  57. data/spec/unit/operations/negation_spec.rb +0 -49
  58. data/spec/unit/operations/or_spec.rb +0 -73
  59. data/spec/unit/operations/set_spec.rb +0 -41
  60. data/spec/unit/operations/xor_spec.rb +0 -61
  61. data/spec/unit/predicates/array_spec.rb +0 -41
  62. data/spec/unit/predicates/attr_spec.rb +0 -29
  63. data/spec/unit/predicates/bool_spec.rb +0 -34
  64. data/spec/unit/predicates/case_spec.rb +0 -33
  65. data/spec/unit/predicates/date_spec.rb +0 -31
  66. data/spec/unit/predicates/date_time_spec.rb +0 -31
  67. data/spec/unit/predicates/decimal_spec.rb +0 -32
  68. data/spec/unit/predicates/empty_spec.rb +0 -38
  69. data/spec/unit/predicates/eql_spec.rb +0 -21
  70. data/spec/unit/predicates/even_spec.rb +0 -31
  71. data/spec/unit/predicates/excluded_from_spec.rb +0 -35
  72. data/spec/unit/predicates/excludes_spec.rb +0 -56
  73. data/spec/unit/predicates/false_spec.rb +0 -35
  74. data/spec/unit/predicates/filled_spec.rb +0 -38
  75. data/spec/unit/predicates/float_spec.rb +0 -31
  76. data/spec/unit/predicates/format_spec.rb +0 -21
  77. data/spec/unit/predicates/gt_spec.rb +0 -40
  78. data/spec/unit/predicates/gteq_spec.rb +0 -40
  79. data/spec/unit/predicates/included_in_spec.rb +0 -35
  80. data/spec/unit/predicates/includes_spec.rb +0 -24
  81. data/spec/unit/predicates/int_spec.rb +0 -34
  82. data/spec/unit/predicates/key_spec.rb +0 -29
  83. data/spec/unit/predicates/lt_spec.rb +0 -40
  84. data/spec/unit/predicates/lteq_spec.rb +0 -40
  85. data/spec/unit/predicates/max_size_spec.rb +0 -49
  86. data/spec/unit/predicates/min_size_spec.rb +0 -49
  87. data/spec/unit/predicates/none_spec.rb +0 -28
  88. data/spec/unit/predicates/not_eql_spec.rb +0 -21
  89. data/spec/unit/predicates/number_spec.rb +0 -37
  90. data/spec/unit/predicates/odd_spec.rb +0 -31
  91. data/spec/unit/predicates/size_spec.rb +0 -55
  92. data/spec/unit/predicates/str_spec.rb +0 -32
  93. data/spec/unit/predicates/time_spec.rb +0 -31
  94. data/spec/unit/predicates/true_spec.rb +0 -35
  95. data/spec/unit/predicates/type_spec.rb +0 -35
  96. data/spec/unit/predicates_spec.rb +0 -23
  97. data/spec/unit/rule/predicate_spec.rb +0 -53
  98. data/spec/unit/rule_compiler_spec.rb +0 -127
  99. data/spec/unit/rule_spec.rb +0 -141
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a6ff887f61b513496991a96d7903685886ab29dae71cb4f75185cd7866fd4b2
4
- data.tar.gz: 9e063f346341b395ac21645f84319e619af19151e62bd97413badf246440d353
3
+ metadata.gz: 58ce7aca14ea687be3852f8f6359ea33de4da0f057091127f828dbb2e6db8856
4
+ data.tar.gz: 283cf7ff61520f4ca1822bea434bd9b98ccb07c10e17f628e0f440029ca76092
5
5
  SHA512:
6
- metadata.gz: f643a0238e3b67c91c83af1e90cb4398279b4c01957ce663a5186ae8437a87e94c9d9cb2f7a2aabca1c7edb47be28a531317a044e58e270ffff59c44e6a9ccf5
7
- data.tar.gz: 17b0ff20fc5c41258a537ad0c57e959cd3359765801261157772a62ee5d1ce525c15bca2ce92c8ee624b1fda67a5cf6cbf4228af552cf99efc8e8428026dbccb
6
+ metadata.gz: 8d16672e062a05eb7c79a5ce34f47307b8eb7cba7cefce4c39d513f835b59fd711968e5bccb8a5f6e7c125aeec6485a4ff9193cc046390c44e2f4f4090f3ad44
7
+ data.tar.gz: 4fbe122584b52eda9d699726023c09fcc9e636f8f67d3670de584b0a7d6345ebdac17ea7173bfa753aab35500eeb8f95d9941b851c980cd6fcac5c3cac8d879d
data/CHANGELOG.md CHANGED
@@ -1,4 +1,189 @@
1
- # v0.5.0 2019-01-29
1
+ <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
+
3
+ ## 1.5.0 2022-11-24
4
+
5
+
6
+ ### Added
7
+
8
+ - `uri_rfc3986?` predicate that uses a better regexp than `uri?` (see #94 for more details) (@hieuk09)
9
+
10
+ ### Changed
11
+
12
+ - Made `Predicates.respond_to?` compatible with `Object#respond_to?` (via #105) (@solnic)
13
+ - Made `Predicates.eql?` compatible with `Object#eql?` (via #106) (@solnic)
14
+
15
+ [Compare v1.4.0...v1.5.0](https://github.com/dry-rb/dry-logic/compare/v1.4.0...v1.5.0)
16
+
17
+ ## 1.4.0 2022-11-04
18
+
19
+
20
+ ### Changed
21
+
22
+ - Updated to dry-core 1.0 (@flash-gordon + @solnic)
23
+
24
+ [Compare v1.3.0...v1.4.0](https://github.com/dry-rb/dry-logic/compare/v1.3.0...v1.4.0)
25
+
26
+ ## 1.3.0 2022-10-15
27
+
28
+
29
+ ### Changed
30
+
31
+ - Use zeitwerk for auto-loading (@solnic + @flash-gordon)
32
+
33
+ [Compare v1.2.0...v1.3.0](https://github.com/dry-rb/dry-logic/compare/v1.2.0...v1.3.0)
34
+
35
+ ## 1.2.0 2021-04-26
36
+
37
+
38
+ ### Added
39
+
40
+ - Add predicate and operation builder DSL (@oleander)
41
+
42
+
43
+ [Compare v1.1.1...v1.2.0](https://github.com/dry-rb/dry-logic/compare/v1.1.1...v1.2.0)
44
+
45
+ ## 1.1.1 2021-04-14
46
+
47
+
48
+ ### Fixed
49
+
50
+ - Fixed a crash under jruby caused by arg splatting in Binary operations (@flash-gordon)
51
+
52
+
53
+ [Compare v1.1.0...v1.1.1](https://github.com/dry-rb/dry-logic/compare/v1.1.0...v1.1.1)
54
+
55
+ ## 1.1.0 2020-12-26
56
+
57
+
58
+ ### Fixed
59
+
60
+ - Nested `Check` operations no longer crash under MRI 3.0 (@oleander)
61
+
62
+ ### Changed
63
+
64
+ - Switched to equalizer from dry-core (@solnic)
65
+
66
+ [Compare v1.0.8...v1.1.0](https://github.com/dry-rb/dry-logic/compare/v1.0.8...v1.1.0)
67
+
68
+ ## 1.0.8 2020-09-28
69
+
70
+
71
+ ### Fixed
72
+
73
+ - Better Ruby 3 support with fixed specialization for rules of negative arity (@flash-gordon)
74
+
75
+
76
+ [Compare v1.0.7...v1.0.8](https://github.com/dry-rb/dry-logic/compare/v1.0.7...v1.0.8)
77
+
78
+ ## 1.0.7 2020-08-13
79
+
80
+
81
+ ### Added
82
+
83
+ - A new `uri?` predicate that you can use to verify `URI` strings, ie `uri?("https", "https://dry-rb.org")` (@nerburish)
84
+ - New predicates: `uuid_v1?`, `uuid_v2?`, `uuid_v3?` and `uuid_v5?` (via #75) (@jamesbrauman)
85
+
86
+
87
+ [Compare v1.0.6...v1.0.7](https://github.com/dry-rb/dry-logic/compare/v1.0.6...v1.0.7)
88
+
89
+ ## 1.0.6 2020-02-10
90
+
91
+
92
+ ### Fixed
93
+
94
+ - Made the regexp used by `uuid_v4?` more secure (@kml)
95
+
96
+
97
+ [Compare v1.0.5...v1.0.6](https://github.com/dry-rb/dry-logic/compare/v1.0.5...v1.0.6)
98
+
99
+ ## 1.0.5 2019-11-07
100
+
101
+
102
+ ### Fixed
103
+
104
+ - Make `format?` tolerant to `nil` values. It already worked like that before, but starting Ruby 2.7 it would produce warnings. Now it won't. Don't rely on this behavior, it's only added to make tests pass in dry-schema. Use explicit type checks instead (@flash-gordon)
105
+
106
+
107
+ [Compare v1.0.4...v1.0.5](https://github.com/dry-rb/dry-logic/compare/v1.0.4...v1.0.5)
108
+
109
+ ## 1.0.4 2019-11-06
110
+
111
+
112
+ ### Fixed
113
+
114
+ - Fix keyword warnings (@flash-gordon)
115
+
116
+
117
+ [Compare v1.0.3...v1.0.4](https://github.com/dry-rb/dry-logic/compare/v1.0.3...v1.0.4)
118
+
119
+ ## 1.0.3 2019-08-01
120
+
121
+
122
+ ### Added
123
+
124
+ - `bytesize?` predicate (@bmalinconico)
125
+ - `min_bytesize?` predicate (@bmalinconico)
126
+ - `max_bytesize? predicate (@bmalinconico)
127
+
128
+ ### Changed
129
+
130
+ - Min ruby version was set to `>= 2.4.0` (@flash-gordon)
131
+
132
+ [Compare v1.0.2...v1.0.3](https://github.com/dry-rb/dry-logic/compare/v1.0.2...v1.0.3)
133
+
134
+ ## 1.0.2 2019-06-14
135
+
136
+ Re-pushed 1.0.1 after dry-schema 1.2.0 release.
137
+
138
+
139
+ [Compare v1.0.1...v1.0.2](https://github.com/dry-rb/dry-logic/compare/v1.0.1...v1.0.2)
140
+
141
+ ## 1.0.1 2019-06-04
142
+
143
+ This release was removed from rubygems because it broke dry-schema.
144
+
145
+ ### Added
146
+
147
+ - `uuid_v4?` predicate (radar)
148
+ - `respond_to?` predicate (waiting-for-dev)
149
+
150
+
151
+ [Compare v1.0.0...v1.0.1](https://github.com/dry-rb/dry-logic/compare/v1.0.0...v1.0.1)
152
+
153
+ ## 1.0.0 2019-04-23
154
+
155
+
156
+ ### Changed
157
+
158
+ - Version bump to `1.0.0` (flash-gordon)
159
+
160
+ [Compare v0.6.1...v1.0.0](https://github.com/dry-rb/dry-logic/compare/v0.6.1...v1.0.0)
161
+
162
+ ## 0.6.1 2019-04-18
163
+
164
+
165
+ ### Fixed
166
+
167
+ - Fix a regression in dry-validation 0.x for argument-less predicates (flash-gordon)
168
+
169
+
170
+ [Compare v0.6.0...v0.6.1](https://github.com/dry-rb/dry-logic/compare/v0.6.0...v0.6.1)
171
+
172
+ ## 0.6.0 2019-04-04
173
+
174
+
175
+ ### Added
176
+
177
+ - Generating hints can be disabled by building `Operations::And` with `hints: false` option set (solnic)
178
+
179
+ ### Changed
180
+
181
+ - `Rule` construction has been optimized so that currying and application is multiple-times faster (flash-gordon)
182
+
183
+ [Compare v0.5.0...v0.6.0](https://github.com/dry-rb/dry-logic/compare/v0.5.0...v0.6.0)
184
+
185
+ ## 0.5.0 2019-01-29
186
+
2
187
 
3
188
  ### Added
4
189
 
@@ -8,9 +193,11 @@
8
193
 
9
194
  - `Operation::Key#ast` will now return a correct AST with non-Undefined inputs (solnic)
10
195
 
196
+
11
197
  [Compare v0.4.2...v0.5.0](https://github.com/dry-rb/dry-logic/compare/v0.4.2...v0.5.0)
12
198
 
13
- # v0.4.2 2017-09-15
199
+ ## 0.4.2 2017-09-15
200
+
14
201
 
15
202
  ### Added
16
203
 
@@ -21,21 +208,23 @@
21
208
 
22
209
  - A bug with using custom predicates within a standalone module in `dry-validation` (flash-gordon)
23
210
 
24
- [Compare v0.4.1...v0.4.2](https://github.com/dry-rb/dry-logic/compare/v0.4.1...v0.4.2)
25
211
 
26
- # v0.4.1 2017-01-23
212
+ [Compare v0.4.1...v0.4.2](https://github.com/dry-rb/dry-logic/compare/v0.4.1...v0.4.2)
27
213
 
28
- ### Changed
214
+ ## 0.4.1 2017-01-23
29
215
 
30
- - Predicates simply reuse other predicate methods instead of referring to them via `#[]` (georgemillo)
31
216
 
32
217
  ### Fixed
33
218
 
34
219
  - Warnings on MRI 2.4.0 are gone (jtippett)
35
220
 
221
+ ### Changed
222
+
223
+ - Predicates simply reuse other predicate methods instead of referring to them via `#[]` (georgemillo)
224
+
36
225
  [Compare v0.4.0...v0.4.1](https://github.com/dry-rb/dry-logic/compare/v0.4.0...v0.4.1)
37
226
 
38
- # v0.4.0 2016-09-21
227
+ ## 0.4.0 2016-09-21
39
228
 
40
229
  This is a partial rewrite focused on internal clean up and major performance improvements. This is also the beginning of the work to make this library first-class rather than "just" a rule backend for dry-validation and dry-types.
41
230
 
@@ -63,7 +252,8 @@ This is a partial rewrite focused on internal clean up and major performance imp
63
252
 
64
253
  [Compare v0.3.0...v0.4.0](https://github.com/dry-rb/dry-logic/compare/v0.3.0...v0.4.0)
65
254
 
66
- # v0.3.0 2016-07-01
255
+ ## 0.3.0 2016-07-01
256
+
67
257
 
68
258
  ### Added
69
259
 
@@ -78,7 +268,8 @@ This is a partial rewrite focused on internal clean up and major performance imp
78
268
 
79
269
  [Compare v0.2.3...v0.3.0](https://github.com/dry-rb/dry-logic/compare/v0.2.3...v0.3.0)
80
270
 
81
- # v0.2.3 2016-05-11
271
+ ## 0.2.3 2016-05-11
272
+
82
273
 
83
274
  ### Added
84
275
 
@@ -91,21 +282,28 @@ This is a partial rewrite focused on internal clean up and major performance imp
91
282
 
92
283
  [Compare v0.2.2...v0.2.3](https://github.com/dry-rb/dry-logic/compare/v0.2.2...v0.2.3)
93
284
 
94
- # v0.2.2 2016-03-30
285
+ ## 0.2.2 2016-03-30
286
+
95
287
 
96
288
  ### Added
97
289
 
98
290
  - `number?`, `odd?`, `even?` predicates (fran-worley)
99
291
 
292
+
100
293
  [Compare v0.2.1...v0.2.2](https://github.com/dry-rb/dry-logic/compare/v0.2.1...v0.2.2)
101
294
 
102
- # v0.2.1 2016-03-20
295
+ ## 0.2.1 2016-03-20
296
+
103
297
 
104
298
  ### Fixed
105
299
 
106
300
  - Result AST for `Rule::Each` correctly maps elements with eql inputs (solnic)
107
301
 
108
- # v0.2.0 2016-03-11
302
+
303
+ [Compare v0.2.0...v0.2.1](https://github.com/dry-rb/dry-logic/compare/v0.2.0...v0.2.1)
304
+
305
+ ## 0.2.0 2016-03-11
306
+
109
307
 
110
308
  ### Changed
111
309
 
@@ -113,16 +311,19 @@ This is a partial rewrite focused on internal clean up and major performance imp
113
311
 
114
312
  [Compare v0.1.4...v0.2.0](https://github.com/dry-rb/dry-logic/compare/v0.1.4...v0.2.0)
115
313
 
116
- # v0.1.4 2016-01-27
314
+ ## 0.1.4 2016-01-27
315
+
117
316
 
118
317
  ### Added
119
318
 
120
319
  - Support for hash-names in `Check` and `Result` which can properly resolve input
121
320
  from nested results (solnic)
122
321
 
322
+
123
323
  [Compare v0.1.3...v0.1.4](https://github.com/dry-rb/dry-logic/compare/v0.1.3...v0.1.4)
124
324
 
125
- # v0.1.3 2016-01-27
325
+ ## 0.1.3 2016-01-27
326
+
126
327
 
127
328
  ### Added
128
329
 
@@ -134,15 +335,18 @@ This is a partial rewrite focused on internal clean up and major performance imp
134
335
 
135
336
  [Compare v0.1.2...v0.1.3](https://github.com/dry-rb/dry-logic/compare/v0.1.2...v0.1.3)
136
337
 
137
- # v0.1.2 2016-01-19
338
+ ## 0.1.2 2016-01-19
339
+
138
340
 
139
341
  ### Fixed
140
342
 
141
343
  - `xor` returns wrapped results when used against another result-rule (solnic)
142
344
 
345
+
143
346
  [Compare v0.1.1...v0.1.2](https://github.com/dry-rb/dry-logic/compare/v0.1.1...v0.1.2)
144
347
 
145
- # v0.1.1 2016-01-18
348
+ ## 0.1.1 2016-01-18
349
+
146
350
 
147
351
  ### Added
148
352
 
@@ -150,8 +354,9 @@ This is a partial rewrite focused on internal clean up and major performance imp
150
354
  - `Rule::Result` which can be applied to a result object (solnic)
151
355
  - `true?` and `false?` predicates (solnic)
152
356
 
357
+
153
358
  [Compare v0.1.0...v0.1.1](https://github.com/dry-rb/dry-logic/compare/v0.1.0...v0.1.1)
154
359
 
155
- # v0.1.0 2016-01-11
360
+ ## 0.1.0 2016-01-11
156
361
 
157
362
  Code extracted from dry-validation 0.4.1
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2014 Ruby Object Mapper
3
+ Copyright (c) 2015-2022 dry-rb team
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy of
6
6
  this software and associated documentation files (the "Software"), to deal in
data/README.md CHANGED
@@ -1,30 +1,21 @@
1
+ <!--- this file is synced from dry-rb/template-gem project -->
1
2
  [gem]: https://rubygems.org/gems/dry-logic
2
- [travis]: https://travis-ci.org/dry-rb/dry-logic
3
- [codeclimate]: https://codeclimate.com/github/dry-rb/dry-logic
4
- [coveralls]: https://coveralls.io/r/dry-rb/dry-logic
5
- [inchpages]: http://inch-ci.org/github/dry-rb/dry-logic
3
+ [actions]: https://github.com/dry-rb/dry-logic/actions
6
4
 
7
- # dry-logic [![Join the chat at https://gitter.im/dry-rb/chat](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/dry-rb/chat)
8
-
9
- [![Gem Version](https://badge.fury.io/rb/dry-logic.svg)][gem]
10
- [![Build Status](https://travis-ci.org/dry-rb/dry-logic.svg?branch=master)][travis]
11
- [![Code Climate](https://codeclimate.com/github/dry-rb/dry-logic/badges/gpa.svg)][codeclimate]
12
- [![Test Coverage](https://codeclimate.com/github/dry-rb/dry-logic/badges/coverage.svg)][codeclimate]
13
- [![Inline docs](http://inch-ci.org/github/dry-rb/dry-logic.svg?branch=master)][inchpages]
14
-
15
- Predicate logic and rule composition used by:
16
-
17
- * [dry-types](https://github.com/dry-rb/dry-types) for constrained types
18
- * [dry-validation](https://github.com/dry-rb/dry-validation) for composing validation rules
19
- * your project...?
5
+ # dry-logic [![Gem Version](https://badge.fury.io/rb/dry-logic.svg)][gem] [![CI Status](https://github.com/dry-rb/dry-logic/workflows/ci/badge.svg)][actions]
20
6
 
21
7
  ## Links
22
8
 
23
- * [Documentation](http://dry-rb.org/gems/dry-logic)
9
+ * [User documentation](https://dry-rb.org/gems/dry-logic)
10
+ * [API documentation](http://rubydoc.info/gems/dry-logic)
11
+ * [Forum](https://discourse.dry-rb.org)
12
+
13
+ ## Supported Ruby versions
24
14
 
25
- ## Contributing
15
+ This library officially supports the following Ruby versions:
26
16
 
27
- Bug reports and pull requests are welcome on GitHub at https://github.com/dry-rb/dry-logic.
17
+ * MRI `>= 2.7.0`
18
+ * jruby `>= 9.3` (postponed until 2.7 is supported)
28
19
 
29
20
  ## License
30
21
 
data/dry-logic.gemspec CHANGED
@@ -1,23 +1,39 @@
1
- require File.expand_path('../lib/dry/logic/version', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ # this file is synced from dry-rb/template-gem project
4
+
5
+ lib = File.expand_path("lib", __dir__)
6
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
7
+ require "dry/logic/version"
2
8
 
3
9
  Gem::Specification.new do |spec|
4
- spec.name = 'dry-logic'
5
- spec.version = Dry::Logic::VERSION
6
- spec.authors = ['Piotr Solnica']
7
- spec.email = ['piotr.solnica@gmail.com']
8
- spec.summary = 'Predicate logic with rule composition'
9
- spec.homepage = 'https://github.com/dry-rb/dry-logic'
10
- spec.license = 'MIT'
11
-
12
- spec.files = `git ls-files -z`.split("\x0")
13
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
14
- spec.require_paths = ['lib']
15
-
16
- spec.add_runtime_dependency 'dry-core', '~> 0.2'
17
- spec.add_runtime_dependency 'dry-container', '~> 0.2', '>= 0.2.6'
18
- spec.add_runtime_dependency 'dry-equalizer', '~> 0.2'
19
-
20
- spec.add_development_dependency 'bundler'
21
- spec.add_development_dependency 'rake'
22
- spec.add_development_dependency 'rspec'
10
+ spec.name = "dry-logic"
11
+ spec.authors = ["Piotr Solnica"]
12
+ spec.email = ["piotr.solnica@gmail.com"]
13
+ spec.license = "MIT"
14
+ spec.version = Dry::Logic::VERSION.dup
15
+
16
+ spec.summary = "Predicate logic with rule composition"
17
+ spec.description = spec.summary
18
+ spec.homepage = "https://dry-rb.org/gems/dry-logic"
19
+ spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-logic.gemspec", "lib/**/*"]
20
+ spec.bindir = "bin"
21
+ spec.executables = []
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
25
+ spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-logic/blob/main/CHANGELOG.md"
26
+ spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-logic"
27
+ spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-logic/issues"
28
+
29
+ spec.required_ruby_version = ">= 2.7.0"
30
+
31
+ # to update dependencies edit project.yml
32
+ spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
33
+ spec.add_runtime_dependency "dry-core", "~> 1.0", "< 2"
34
+ spec.add_runtime_dependency "zeitwerk", "~> 2.6"
35
+
36
+ spec.add_development_dependency "bundler"
37
+ spec.add_development_dependency "rake"
38
+ spec.add_development_dependency "rspec"
23
39
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dry
2
4
  module Logic
3
5
  module Appliable
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "singleton"
4
+ require "delegate"
5
+
6
+ module Dry
7
+ module Logic
8
+ module Builder
9
+ IGNORED_OPERATIONS = %i[
10
+ Abstract
11
+ Binary
12
+ Unary
13
+ ].freeze
14
+
15
+ IGNORED_PREDICATES = [
16
+ :predicate
17
+ ].freeze
18
+
19
+ # Predicate and operation builder
20
+ #
21
+ # @block [Proc]
22
+ # @return [Builder::Result]
23
+ # @example Check if input is zero
24
+ # is_zero = Dry::Logic::Builder.call do
25
+ # negation { lt?(0) ^ gt?(0) }
26
+ # end
27
+ #
28
+ # p is_zero.call(1) # => false
29
+ # p is_zero.call(0) # => true
30
+ # p is_zero.call(-1) # => false
31
+ def call(&context)
32
+ Context.instance.call(&context)
33
+ end
34
+ module_function :call
35
+ alias_method :build, :call
36
+ public :call, :build
37
+
38
+ class Context
39
+ include Dry::Logic
40
+ include Singleton
41
+
42
+ module Predicates
43
+ include Logic::Predicates
44
+ end
45
+
46
+ # @see Builder#call
47
+ def call(&context)
48
+ instance_eval(&context)
49
+ end
50
+
51
+ # Defines custom predicate
52
+ #
53
+ # @name [Symbol] Name of predicate
54
+ # @Context [Proc]
55
+ def predicate(name, &context)
56
+ if singleton_class.method_defined?(name)
57
+ singleton_class.undef_method(name)
58
+ end
59
+
60
+ prerdicate = Rule::Predicate.new(context)
61
+
62
+ define_singleton_method(name) do |*args|
63
+ prerdicate.curry(*args)
64
+ end
65
+ end
66
+
67
+ # Defines methods for operations and predicates
68
+ def initialize
69
+ Operations.constants(false).each do |name|
70
+ next if IGNORED_OPERATIONS.include?(name)
71
+
72
+ operation = Operations.const_get(name)
73
+
74
+ define_singleton_method(name.downcase) do |*args, **kwargs, &block|
75
+ operation.new(*call(&block), *args, **kwargs)
76
+ end
77
+ end
78
+
79
+ Predicates::Methods.instance_methods(false).each do |name|
80
+ unless IGNORED_PREDICATES.include?(name)
81
+ predicate(name, &Predicates[name])
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -1,4 +1,4 @@
1
- require 'dry/equalizer'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dry
4
4
  module Logic
@@ -1,6 +1,4 @@
1
- require 'dry/core/constants'
2
- require 'dry/equalizer'
3
- require 'dry/logic/operators'
1
+ # frozen_string_literal: true
4
2
 
5
3
  module Dry
6
4
  module Logic
@@ -24,15 +22,15 @@ module Dry
24
22
  end
25
23
 
26
24
  def curry(*args)
27
- new(rules.map { |rule| rule.curry(*args) }, options)
25
+ new(rules.map { |rule| rule.curry(*args) }, **options)
28
26
  end
29
27
 
30
28
  def new(rules, **new_options)
31
- self.class.new(*rules, options.merge(new_options))
29
+ self.class.new(*rules, **options, **new_options)
32
30
  end
33
31
 
34
32
  def with(new_options)
35
- new(rules, options.merge(new_options))
33
+ new(rules, **options, **new_options)
36
34
  end
37
35
 
38
36
  def to_ast
@@ -1,10 +1,16 @@
1
- require 'dry/logic/operations/binary'
2
- require 'dry/logic/result'
1
+ # frozen_string_literal: true
3
2
 
4
3
  module Dry
5
4
  module Logic
6
5
  module Operations
7
6
  class And < Binary
7
+ attr_reader :hints
8
+
9
+ def initialize(*, **)
10
+ super
11
+ @hints = options.fetch(:hints, true)
12
+ end
13
+
8
14
  def type
9
15
  :and
10
16
  end
@@ -22,7 +28,10 @@ module Dry
22
28
  Result.new(false, id) { right_result.ast(input) }
23
29
  end
24
30
  else
25
- Result.new(false, id) { [type, [left_result.to_ast, [:hint, right.ast(input)]]] }
31
+ Result.new(false, id) do
32
+ left_ast = left_result.to_ast
33
+ hints ? [type, [left_ast, [:hint, right.ast(input)]]] : left_ast
34
+ end
26
35
  end
27
36
  end
28
37
 
@@ -1,4 +1,4 @@
1
- require 'dry/logic/operations/key'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dry
4
4
  module Logic
@@ -1,4 +1,4 @@
1
- require 'dry/logic/operations/abstract'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dry
4
4
  module Logic
@@ -8,9 +8,10 @@ module Dry
8
8
 
9
9
  attr_reader :right
10
10
 
11
- def initialize(*rules, **options)
11
+ def initialize(left, right, **options)
12
12
  super
13
- @left, @right = rules
13
+ @left = left
14
+ @right = right
14
15
  end
15
16
 
16
17
  def ast(input = Undefined)
@@ -1,6 +1,4 @@
1
- require 'dry/logic/operations/unary'
2
- require 'dry/logic/evaluator'
3
- require 'dry/logic/result'
1
+ # frozen_string_literal: true
4
2
 
5
3
  module Dry
6
4
  module Logic
@@ -10,12 +8,12 @@ module Dry
10
8
 
11
9
  def self.new(rule, **options)
12
10
  if options[:evaluator]
13
- super(rule, options)
11
+ super(rule, **options)
14
12
  else
15
13
  keys = options.fetch(:keys)
16
14
  evaluator = Evaluator::Set.new(keys)
17
15
 
18
- super(rule, options.merge(evaluator: evaluator))
16
+ super(rule, **options, evaluator: evaluator)
19
17
  end
20
18
  end
21
19
 
@@ -1,5 +1,4 @@
1
- require 'dry/logic/operations/unary'
2
- require 'dry/logic/result'
1
+ # frozen_string_literal: true
3
2
 
4
3
  module Dry
5
4
  module Logic
@@ -1,5 +1,4 @@
1
- require 'dry/logic/operations/binary'
2
- require 'dry/logic/result'
1
+ # frozen_string_literal: true
3
2
 
4
3
  module Dry
5
4
  module Logic