dry-logic 0.4.2 → 1.1.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 (97) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +214 -53
  3. data/LICENSE +1 -1
  4. data/README.md +14 -18
  5. data/dry-logic.gemspec +28 -15
  6. data/lib/dry-logic.rb +3 -1
  7. data/lib/dry/logic.rb +4 -2
  8. data/lib/dry/logic/appliable.rb +2 -0
  9. data/lib/dry/logic/evaluator.rb +3 -1
  10. data/lib/dry/logic/operations.rb +13 -11
  11. data/lib/dry/logic/operations/abstract.rb +8 -6
  12. data/lib/dry/logic/operations/and.rb +15 -3
  13. data/lib/dry/logic/operations/attr.rb +3 -1
  14. data/lib/dry/logic/operations/binary.rb +3 -1
  15. data/lib/dry/logic/operations/check.rb +6 -4
  16. data/lib/dry/logic/operations/each.rb +4 -2
  17. data/lib/dry/logic/operations/implication.rb +4 -2
  18. data/lib/dry/logic/operations/key.rb +11 -9
  19. data/lib/dry/logic/operations/negation.rb +9 -3
  20. data/lib/dry/logic/operations/or.rb +4 -2
  21. data/lib/dry/logic/operations/set.rb +5 -3
  22. data/lib/dry/logic/operations/unary.rb +3 -1
  23. data/lib/dry/logic/operations/xor.rb +4 -2
  24. data/lib/dry/logic/operators.rb +6 -4
  25. data/lib/dry/logic/predicates.rb +72 -28
  26. data/lib/dry/logic/result.rb +4 -2
  27. data/lib/dry/logic/rule.rb +35 -30
  28. data/lib/dry/logic/rule/interface.rb +141 -0
  29. data/lib/dry/logic/rule/predicate.rb +9 -3
  30. data/lib/dry/logic/rule_compiler.rb +7 -3
  31. data/lib/dry/logic/version.rb +3 -1
  32. metadata +21 -151
  33. data/.codeclimate.yml +0 -23
  34. data/.gitignore +0 -8
  35. data/.rspec +0 -3
  36. data/.rubocop.yml +0 -16
  37. data/.rubocop_todo.yml +0 -7
  38. data/.travis.yml +0 -31
  39. data/CONTRIBUTING.md +0 -29
  40. data/Gemfile +0 -18
  41. data/Rakefile +0 -12
  42. data/examples/basic.rb +0 -14
  43. data/spec/integration/result_spec.rb +0 -59
  44. data/spec/integration/rule_spec.rb +0 -53
  45. data/spec/shared/predicates.rb +0 -57
  46. data/spec/shared/rule.rb +0 -67
  47. data/spec/spec_helper.rb +0 -34
  48. data/spec/support/mutant.rb +0 -9
  49. data/spec/unit/operations/and_spec.rb +0 -64
  50. data/spec/unit/operations/attr_spec.rb +0 -27
  51. data/spec/unit/operations/check_spec.rb +0 -49
  52. data/spec/unit/operations/each_spec.rb +0 -47
  53. data/spec/unit/operations/implication_spec.rb +0 -30
  54. data/spec/unit/operations/key_spec.rb +0 -119
  55. data/spec/unit/operations/negation_spec.rb +0 -40
  56. data/spec/unit/operations/or_spec.rb +0 -73
  57. data/spec/unit/operations/set_spec.rb +0 -41
  58. data/spec/unit/operations/xor_spec.rb +0 -61
  59. data/spec/unit/predicates/array_spec.rb +0 -41
  60. data/spec/unit/predicates/attr_spec.rb +0 -29
  61. data/spec/unit/predicates/bool_spec.rb +0 -34
  62. data/spec/unit/predicates/case_spec.rb +0 -33
  63. data/spec/unit/predicates/date_spec.rb +0 -31
  64. data/spec/unit/predicates/date_time_spec.rb +0 -31
  65. data/spec/unit/predicates/decimal_spec.rb +0 -32
  66. data/spec/unit/predicates/empty_spec.rb +0 -38
  67. data/spec/unit/predicates/eql_spec.rb +0 -21
  68. data/spec/unit/predicates/even_spec.rb +0 -31
  69. data/spec/unit/predicates/excluded_from_spec.rb +0 -35
  70. data/spec/unit/predicates/excludes_spec.rb +0 -56
  71. data/spec/unit/predicates/false_spec.rb +0 -35
  72. data/spec/unit/predicates/filled_spec.rb +0 -38
  73. data/spec/unit/predicates/float_spec.rb +0 -31
  74. data/spec/unit/predicates/format_spec.rb +0 -21
  75. data/spec/unit/predicates/gt_spec.rb +0 -40
  76. data/spec/unit/predicates/gteq_spec.rb +0 -40
  77. data/spec/unit/predicates/included_in_spec.rb +0 -35
  78. data/spec/unit/predicates/includes_spec.rb +0 -24
  79. data/spec/unit/predicates/int_spec.rb +0 -34
  80. data/spec/unit/predicates/key_spec.rb +0 -29
  81. data/spec/unit/predicates/lt_spec.rb +0 -40
  82. data/spec/unit/predicates/lteq_spec.rb +0 -40
  83. data/spec/unit/predicates/max_size_spec.rb +0 -49
  84. data/spec/unit/predicates/min_size_spec.rb +0 -49
  85. data/spec/unit/predicates/none_spec.rb +0 -28
  86. data/spec/unit/predicates/not_eql_spec.rb +0 -21
  87. data/spec/unit/predicates/number_spec.rb +0 -37
  88. data/spec/unit/predicates/odd_spec.rb +0 -31
  89. data/spec/unit/predicates/size_spec.rb +0 -55
  90. data/spec/unit/predicates/str_spec.rb +0 -32
  91. data/spec/unit/predicates/time_spec.rb +0 -31
  92. data/spec/unit/predicates/true_spec.rb +0 -35
  93. data/spec/unit/predicates/type_spec.rb +0 -35
  94. data/spec/unit/predicates_spec.rb +0 -23
  95. data/spec/unit/rule/predicate_spec.rb +0 -53
  96. data/spec/unit/rule_compiler_spec.rb +0 -127
  97. data/spec/unit/rule_spec.rb +0 -141
@@ -1,4 +1,6 @@
1
- require 'dry/core/constants'
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/core/constants"
2
4
 
3
5
  module Dry
4
6
  module Logic
@@ -67,7 +69,7 @@ module Dry
67
69
  if args.empty?
68
70
  name.to_s
69
71
  else
70
- "#{name}(#{args.map(&:last).map(&:inspect).join(', ')})"
72
+ "#{name}(#{args.map(&:last).map(&:inspect).join(", ")})"
71
73
  end
72
74
  end
73
75
 
@@ -1,15 +1,19 @@
1
- require 'dry/core/constants'
2
- require 'dry/equalizer'
3
- require 'dry/logic/operations'
4
- require 'dry/logic/result'
1
+ # frozen_string_literal: true
2
+
3
+ require "concurrent/map"
4
+ require "dry/core/constants"
5
+ require "dry/core/equalizer"
6
+ require "dry/logic/operations"
7
+ require "dry/logic/result"
8
+ require "dry/logic/rule/interface"
5
9
 
6
10
  module Dry
7
11
  module Logic
8
12
  def self.Rule(*args, **options, &block)
9
13
  if args.any?
10
- Rule.new(*args, Rule::DEFAULT_OPTIONS.merge(options))
14
+ Rule.build(*args, **options)
11
15
  elsif block
12
- Rule.new(block, Rule::DEFAULT_OPTIONS.merge(options))
16
+ Rule.build(block, **options)
13
17
  end
14
18
  end
15
19
 
@@ -18,8 +22,6 @@ module Dry
18
22
  include Dry::Equalizer(:predicate, :options)
19
23
  include Operators
20
24
 
21
- DEFAULT_OPTIONS = { args: [].freeze }.freeze
22
-
23
25
  attr_reader :predicate
24
26
 
25
27
  attr_reader :options
@@ -28,10 +30,27 @@ module Dry
28
30
 
29
31
  attr_reader :arity
30
32
 
31
- def initialize(predicate, options = DEFAULT_OPTIONS)
33
+ def self.interfaces
34
+ @interfaces ||= ::Concurrent::Map.new
35
+ end
36
+
37
+ def self.specialize(arity, curried, base = Rule)
38
+ base.interfaces.fetch_or_store([arity, curried]) do
39
+ interface = Interface.new(arity, curried)
40
+ klass = Class.new(base) { include interface }
41
+ base.const_set("#{base.name.split("::").last}#{interface.name}", klass)
42
+ klass
43
+ end
44
+ end
45
+
46
+ def self.build(predicate, args: EMPTY_ARRAY, arity: predicate.arity, **options)
47
+ specialize(arity, args.size).new(predicate, {args: args, arity: arity, **options})
48
+ end
49
+
50
+ def initialize(predicate, options = EMPTY_HASH)
32
51
  @predicate = predicate
33
52
  @options = options
34
- @args = options[:args]
53
+ @args = options[:args] || EMPTY_ARRAY
35
54
  @arity = options[:arity] || predicate.arity
36
55
  end
37
56
 
@@ -43,31 +62,17 @@ module Dry
43
62
  options[:id]
44
63
  end
45
64
 
46
- def call(*input)
47
- Result.new(self[*input], id) { ast(*input) }
48
- end
49
-
50
- def [](*input)
51
- arity == 0 ? predicate.() : predicate[*args, *input]
52
- end
53
-
54
65
  def curry(*new_args)
55
- all_args = args + new_args
56
-
57
- if all_args.size > arity
58
- raise ArgumentError, "wrong number of arguments (#{all_args.size} for #{arity})"
59
- else
60
- with(args: all_args)
61
- end
66
+ with(args: args + new_args)
62
67
  end
63
68
 
64
69
  def bind(object)
65
- if UnboundMethod === predicate
66
- self.class.new(predicate.bind(object), options)
70
+ if predicate.respond_to?(:bind)
71
+ self.class.build(predicate.bind(object), **options)
67
72
  else
68
- self.class.new(
73
+ self.class.build(
69
74
  -> *args { object.instance_exec(*args, &predicate) },
70
- options.merge(arity: arity, parameters: parameters)
75
+ **options, arity: arity, parameters: parameters
71
76
  )
72
77
  end
73
78
  end
@@ -77,7 +82,7 @@ module Dry
77
82
  end
78
83
 
79
84
  def with(new_opts)
80
- self.class.new(predicate, options.merge(new_opts))
85
+ self.class.build(predicate, **options, **new_opts)
81
86
  end
82
87
 
83
88
  def parameters
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dry
4
+ module Logic
5
+ class Rule
6
+ class Interface < ::Module
7
+ SPLAT = ["*rest"].freeze
8
+
9
+ attr_reader :arity
10
+
11
+ attr_reader :curried
12
+
13
+ def initialize(arity, curried)
14
+ @arity = arity
15
+ @curried = curried
16
+
17
+ if !variable_arity? && curried > arity
18
+ raise ArgumentError, "wrong number of arguments (#{curried} for #{arity})"
19
+ end
20
+
21
+ define_constructor if curried?
22
+
23
+ if constant?
24
+ define_constant_application
25
+ else
26
+ define_application
27
+ end
28
+ end
29
+
30
+ def constant?
31
+ arity.zero?
32
+ end
33
+
34
+ def variable_arity?
35
+ arity.negative?
36
+ end
37
+
38
+ def curried?
39
+ !curried.zero?
40
+ end
41
+
42
+ def unapplied
43
+ if variable_arity?
44
+ unapplied = arity.abs - 1 - curried
45
+
46
+ if unapplied.negative?
47
+ 0
48
+ else
49
+ unapplied
50
+ end
51
+ else
52
+ arity - curried
53
+ end
54
+ end
55
+
56
+ def name
57
+ if constant?
58
+ "Constant"
59
+ else
60
+ arity_str =
61
+ if variable_arity?
62
+ "Variable#{arity.abs - 1}Arity"
63
+ else
64
+ "#{arity}Arity"
65
+ end
66
+
67
+ curried_str =
68
+ if curried?
69
+ "#{curried}Curried"
70
+ else
71
+ EMPTY_STRING
72
+ end
73
+
74
+ "#{arity_str}#{curried_str}"
75
+ end
76
+ end
77
+
78
+ def define_constructor
79
+ assignment =
80
+ if curried.equal?(1)
81
+ "@arg0 = @args[0]"
82
+ else
83
+ "#{curried_args.join(", ")} = @args"
84
+ end
85
+
86
+ module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
87
+ def initialize(*)
88
+ super
89
+
90
+ #{assignment}
91
+ end
92
+ RUBY
93
+ end
94
+
95
+ def define_constant_application
96
+ module_exec do
97
+ def call(*)
98
+ if @predicate[]
99
+ Result::SUCCESS
100
+ else
101
+ Result.new(false, id) { ast }
102
+ end
103
+ end
104
+
105
+ def [](*)
106
+ @predicate[]
107
+ end
108
+ end
109
+ end
110
+
111
+ def define_application
112
+ splat = variable_arity? ? SPLAT : EMPTY_ARRAY
113
+ parameters = (unapplied_args + splat).join(", ")
114
+ application = "@predicate[#{(curried_args + unapplied_args + splat).join(", ")}]"
115
+
116
+ module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
117
+ def call(#{parameters})
118
+ if #{application}
119
+ Result::SUCCESS
120
+ else
121
+ Result.new(false, id) { ast(#{parameters}) }
122
+ end
123
+ end
124
+
125
+ def [](#{parameters})
126
+ #{application}
127
+ end
128
+ RUBY
129
+ end
130
+
131
+ def curried_args
132
+ @curried_args ||= ::Array.new(curried) { |i| "@arg#{i}" }
133
+ end
134
+
135
+ def unapplied_args
136
+ @unapplied_args ||= ::Array.new(unapplied) { |i| "input#{i}" }
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
@@ -1,8 +1,14 @@
1
- require 'dry/logic/rule'
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/logic/rule"
2
4
 
3
5
  module Dry
4
6
  module Logic
5
7
  class Rule::Predicate < Rule
8
+ def self.specialize(arity, curried, base = Predicate)
9
+ super
10
+ end
11
+
6
12
  def type
7
13
  :predicate
8
14
  end
@@ -13,9 +19,9 @@ module Dry
13
19
 
14
20
  def to_s
15
21
  if args.size > 0
16
- "#{name}(#{args.map(&:inspect).join(', ')})"
22
+ "#{name}(#{args.map(&:inspect).join(", ")})"
17
23
  else
18
- "#{name}"
24
+ name.to_s
19
25
  end
20
26
  end
21
27
 
@@ -1,5 +1,9 @@
1
- require 'dry/core/constants'
2
- require 'dry/logic/rule'
1
+ # frozen_string_literal: true
2
+
3
+ require "dry/core/constants"
4
+
5
+ require "dry/logic/rule"
6
+ require "dry/logic/rule/predicate"
3
7
 
4
8
  module Dry
5
9
  module Logic
@@ -50,7 +54,7 @@ module Dry
50
54
 
51
55
  def visit_predicate(node)
52
56
  name, params = node
53
- predicate = Rule::Predicate.new(predicates[name])
57
+ predicate = Rule::Predicate.build(predicates[name])
54
58
 
55
59
  if params.size > 1
56
60
  args = params.map(&:last).reject { |val| val == Undefined }
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dry
2
4
  module Logic
3
- VERSION = '0.4.2'.freeze
5
+ VERSION = "1.1.0"
4
6
  end
5
7
  end
metadata CHANGED
@@ -1,63 +1,49 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-logic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-15 00:00:00.000000000 Z
11
+ date: 2020-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: dry-core
14
+ name: concurrent-ruby
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.2'
19
+ version: '1.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: '0.2'
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: dry-container
28
+ name: dry-core
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.2'
33
+ version: '0.5'
34
34
  - - ">="
35
35
  - !ruby/object:Gem::Version
36
- version: 0.2.6
36
+ version: '0.5'
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
- version: '0.2'
43
+ version: '0.5'
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 0.2.6
47
- - !ruby/object:Gem::Dependency
48
- name: dry-equalizer
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '0.2'
54
- type: :runtime
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - "~>"
59
- - !ruby/object:Gem::Version
60
- version: '0.2'
46
+ version: '0.5'
61
47
  - !ruby/object:Gem::Dependency
62
48
  name: bundler
63
49
  requirement: !ruby/object:Gem::Requirement
@@ -100,27 +86,17 @@ dependencies:
100
86
  - - ">="
101
87
  - !ruby/object:Gem::Version
102
88
  version: '0'
103
- description:
89
+ description: Predicate logic with rule composition
104
90
  email:
105
91
  - piotr.solnica@gmail.com
106
92
  executables: []
107
93
  extensions: []
108
94
  extra_rdoc_files: []
109
95
  files:
110
- - ".codeclimate.yml"
111
- - ".gitignore"
112
- - ".rspec"
113
- - ".rubocop.yml"
114
- - ".rubocop_todo.yml"
115
- - ".travis.yml"
116
96
  - CHANGELOG.md
117
- - CONTRIBUTING.md
118
- - Gemfile
119
97
  - LICENSE
120
98
  - README.md
121
- - Rakefile
122
99
  - dry-logic.gemspec
123
- - examples/basic.rb
124
100
  - lib/dry-logic.rb
125
101
  - lib/dry/logic.rb
126
102
  - lib/dry/logic/appliable.rb
@@ -143,68 +119,18 @@ files:
143
119
  - lib/dry/logic/predicates.rb
144
120
  - lib/dry/logic/result.rb
145
121
  - lib/dry/logic/rule.rb
122
+ - lib/dry/logic/rule/interface.rb
146
123
  - lib/dry/logic/rule/predicate.rb
147
124
  - lib/dry/logic/rule_compiler.rb
148
125
  - lib/dry/logic/version.rb
149
- - spec/integration/result_spec.rb
150
- - spec/integration/rule_spec.rb
151
- - spec/shared/predicates.rb
152
- - spec/shared/rule.rb
153
- - spec/spec_helper.rb
154
- - spec/support/mutant.rb
155
- - spec/unit/operations/and_spec.rb
156
- - spec/unit/operations/attr_spec.rb
157
- - spec/unit/operations/check_spec.rb
158
- - spec/unit/operations/each_spec.rb
159
- - spec/unit/operations/implication_spec.rb
160
- - spec/unit/operations/key_spec.rb
161
- - spec/unit/operations/negation_spec.rb
162
- - spec/unit/operations/or_spec.rb
163
- - spec/unit/operations/set_spec.rb
164
- - spec/unit/operations/xor_spec.rb
165
- - spec/unit/predicates/array_spec.rb
166
- - spec/unit/predicates/attr_spec.rb
167
- - spec/unit/predicates/bool_spec.rb
168
- - spec/unit/predicates/case_spec.rb
169
- - spec/unit/predicates/date_spec.rb
170
- - spec/unit/predicates/date_time_spec.rb
171
- - spec/unit/predicates/decimal_spec.rb
172
- - spec/unit/predicates/empty_spec.rb
173
- - spec/unit/predicates/eql_spec.rb
174
- - spec/unit/predicates/even_spec.rb
175
- - spec/unit/predicates/excluded_from_spec.rb
176
- - spec/unit/predicates/excludes_spec.rb
177
- - spec/unit/predicates/false_spec.rb
178
- - spec/unit/predicates/filled_spec.rb
179
- - spec/unit/predicates/float_spec.rb
180
- - spec/unit/predicates/format_spec.rb
181
- - spec/unit/predicates/gt_spec.rb
182
- - spec/unit/predicates/gteq_spec.rb
183
- - spec/unit/predicates/included_in_spec.rb
184
- - spec/unit/predicates/includes_spec.rb
185
- - spec/unit/predicates/int_spec.rb
186
- - spec/unit/predicates/key_spec.rb
187
- - spec/unit/predicates/lt_spec.rb
188
- - spec/unit/predicates/lteq_spec.rb
189
- - spec/unit/predicates/max_size_spec.rb
190
- - spec/unit/predicates/min_size_spec.rb
191
- - spec/unit/predicates/none_spec.rb
192
- - spec/unit/predicates/not_eql_spec.rb
193
- - spec/unit/predicates/number_spec.rb
194
- - spec/unit/predicates/odd_spec.rb
195
- - spec/unit/predicates/size_spec.rb
196
- - spec/unit/predicates/str_spec.rb
197
- - spec/unit/predicates/time_spec.rb
198
- - spec/unit/predicates/true_spec.rb
199
- - spec/unit/predicates/type_spec.rb
200
- - spec/unit/predicates_spec.rb
201
- - spec/unit/rule/predicate_spec.rb
202
- - spec/unit/rule_compiler_spec.rb
203
- - spec/unit/rule_spec.rb
204
- homepage: https://github.com/dry-rb/dry-logic
126
+ homepage: https://dry-rb.org/gems/dry-logic
205
127
  licenses:
206
128
  - MIT
207
- metadata: {}
129
+ metadata:
130
+ allowed_push_host: https://rubygems.org
131
+ changelog_uri: https://github.com/dry-rb/dry-logic/blob/master/CHANGELOG.md
132
+ source_code_uri: https://github.com/dry-rb/dry-logic
133
+ bug_tracker_uri: https://github.com/dry-rb/dry-logic/issues
208
134
  post_install_message:
209
135
  rdoc_options: []
210
136
  require_paths:
@@ -213,71 +139,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
213
139
  requirements:
214
140
  - - ">="
215
141
  - !ruby/object:Gem::Version
216
- version: '0'
142
+ version: 2.5.0
217
143
  required_rubygems_version: !ruby/object:Gem::Requirement
218
144
  requirements:
219
145
  - - ">="
220
146
  - !ruby/object:Gem::Version
221
147
  version: '0'
222
148
  requirements: []
223
- rubyforge_project:
224
- rubygems_version: 2.6.11
149
+ rubygems_version: 3.1.4
225
150
  signing_key:
226
151
  specification_version: 4
227
152
  summary: Predicate logic with rule composition
228
- test_files:
229
- - spec/integration/result_spec.rb
230
- - spec/integration/rule_spec.rb
231
- - spec/shared/predicates.rb
232
- - spec/shared/rule.rb
233
- - spec/spec_helper.rb
234
- - spec/support/mutant.rb
235
- - spec/unit/operations/and_spec.rb
236
- - spec/unit/operations/attr_spec.rb
237
- - spec/unit/operations/check_spec.rb
238
- - spec/unit/operations/each_spec.rb
239
- - spec/unit/operations/implication_spec.rb
240
- - spec/unit/operations/key_spec.rb
241
- - spec/unit/operations/negation_spec.rb
242
- - spec/unit/operations/or_spec.rb
243
- - spec/unit/operations/set_spec.rb
244
- - spec/unit/operations/xor_spec.rb
245
- - spec/unit/predicates/array_spec.rb
246
- - spec/unit/predicates/attr_spec.rb
247
- - spec/unit/predicates/bool_spec.rb
248
- - spec/unit/predicates/case_spec.rb
249
- - spec/unit/predicates/date_spec.rb
250
- - spec/unit/predicates/date_time_spec.rb
251
- - spec/unit/predicates/decimal_spec.rb
252
- - spec/unit/predicates/empty_spec.rb
253
- - spec/unit/predicates/eql_spec.rb
254
- - spec/unit/predicates/even_spec.rb
255
- - spec/unit/predicates/excluded_from_spec.rb
256
- - spec/unit/predicates/excludes_spec.rb
257
- - spec/unit/predicates/false_spec.rb
258
- - spec/unit/predicates/filled_spec.rb
259
- - spec/unit/predicates/float_spec.rb
260
- - spec/unit/predicates/format_spec.rb
261
- - spec/unit/predicates/gt_spec.rb
262
- - spec/unit/predicates/gteq_spec.rb
263
- - spec/unit/predicates/included_in_spec.rb
264
- - spec/unit/predicates/includes_spec.rb
265
- - spec/unit/predicates/int_spec.rb
266
- - spec/unit/predicates/key_spec.rb
267
- - spec/unit/predicates/lt_spec.rb
268
- - spec/unit/predicates/lteq_spec.rb
269
- - spec/unit/predicates/max_size_spec.rb
270
- - spec/unit/predicates/min_size_spec.rb
271
- - spec/unit/predicates/none_spec.rb
272
- - spec/unit/predicates/not_eql_spec.rb
273
- - spec/unit/predicates/number_spec.rb
274
- - spec/unit/predicates/odd_spec.rb
275
- - spec/unit/predicates/size_spec.rb
276
- - spec/unit/predicates/str_spec.rb
277
- - spec/unit/predicates/time_spec.rb
278
- - spec/unit/predicates/true_spec.rb
279
- - spec/unit/predicates/type_spec.rb
280
- - spec/unit/predicates_spec.rb
281
- - spec/unit/rule/predicate_spec.rb
282
- - spec/unit/rule_compiler_spec.rb
283
- - spec/unit/rule_spec.rb
153
+ test_files: []