dry-logic 0.6.1 → 1.0.6

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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +121 -22
  3. data/LICENSE +1 -1
  4. data/README.md +12 -14
  5. data/dry-logic.gemspec +29 -14
  6. data/lib/dry-logic.rb +2 -0
  7. data/lib/dry/logic.rb +2 -0
  8. data/lib/dry/logic/appliable.rb +2 -0
  9. data/lib/dry/logic/evaluator.rb +2 -0
  10. data/lib/dry/logic/operations.rb +2 -0
  11. data/lib/dry/logic/operations/abstract.rb +5 -3
  12. data/lib/dry/logic/operations/and.rb +3 -1
  13. data/lib/dry/logic/operations/attr.rb +2 -0
  14. data/lib/dry/logic/operations/binary.rb +2 -0
  15. data/lib/dry/logic/operations/check.rb +3 -1
  16. data/lib/dry/logic/operations/each.rb +2 -0
  17. data/lib/dry/logic/operations/implication.rb +2 -0
  18. data/lib/dry/logic/operations/key.rb +4 -2
  19. data/lib/dry/logic/operations/negation.rb +2 -0
  20. data/lib/dry/logic/operations/or.rb +2 -0
  21. data/lib/dry/logic/operations/set.rb +2 -0
  22. data/lib/dry/logic/operations/unary.rb +2 -0
  23. data/lib/dry/logic/operations/xor.rb +2 -0
  24. data/lib/dry/logic/operators.rb +2 -0
  25. data/lib/dry/logic/predicates.rb +39 -21
  26. data/lib/dry/logic/result.rb +2 -0
  27. data/lib/dry/logic/rule.rb +5 -3
  28. data/lib/dry/logic/rule/interface.rb +3 -1
  29. data/lib/dry/logic/rule/predicate.rb +2 -0
  30. data/lib/dry/logic/rule_compiler.rb +2 -0
  31. data/lib/dry/logic/version.rb +3 -1
  32. metadata +11 -128
  33. data/.codeclimate.yml +0 -15
  34. data/.gitignore +0 -8
  35. data/.rspec +0 -3
  36. data/.travis.yml +0 -31
  37. data/CONTRIBUTING.md +0 -29
  38. data/Gemfile +0 -13
  39. data/Rakefile +0 -12
  40. data/benchmarks/rule_application.rb +0 -28
  41. data/benchmarks/setup.rb +0 -11
  42. data/bin/console +0 -10
  43. data/examples/basic.rb +0 -14
  44. data/spec/integration/result_spec.rb +0 -59
  45. data/spec/integration/rule_spec.rb +0 -53
  46. data/spec/shared/predicates.rb +0 -57
  47. data/spec/shared/rule.rb +0 -72
  48. data/spec/spec_helper.rb +0 -34
  49. data/spec/support/mutant.rb +0 -9
  50. data/spec/unit/operations/and_spec.rb +0 -68
  51. data/spec/unit/operations/attr_spec.rb +0 -27
  52. data/spec/unit/operations/check_spec.rb +0 -49
  53. data/spec/unit/operations/each_spec.rb +0 -47
  54. data/spec/unit/operations/implication_spec.rb +0 -30
  55. data/spec/unit/operations/key_spec.rb +0 -133
  56. data/spec/unit/operations/negation_spec.rb +0 -49
  57. data/spec/unit/operations/or_spec.rb +0 -73
  58. data/spec/unit/operations/set_spec.rb +0 -41
  59. data/spec/unit/operations/xor_spec.rb +0 -61
  60. data/spec/unit/predicates/array_spec.rb +0 -41
  61. data/spec/unit/predicates/attr_spec.rb +0 -29
  62. data/spec/unit/predicates/bool_spec.rb +0 -34
  63. data/spec/unit/predicates/case_spec.rb +0 -33
  64. data/spec/unit/predicates/date_spec.rb +0 -31
  65. data/spec/unit/predicates/date_time_spec.rb +0 -31
  66. data/spec/unit/predicates/decimal_spec.rb +0 -32
  67. data/spec/unit/predicates/empty_spec.rb +0 -38
  68. data/spec/unit/predicates/eql_spec.rb +0 -21
  69. data/spec/unit/predicates/even_spec.rb +0 -31
  70. data/spec/unit/predicates/excluded_from_spec.rb +0 -35
  71. data/spec/unit/predicates/excludes_spec.rb +0 -56
  72. data/spec/unit/predicates/false_spec.rb +0 -35
  73. data/spec/unit/predicates/filled_spec.rb +0 -38
  74. data/spec/unit/predicates/float_spec.rb +0 -31
  75. data/spec/unit/predicates/format_spec.rb +0 -21
  76. data/spec/unit/predicates/gt_spec.rb +0 -40
  77. data/spec/unit/predicates/gteq_spec.rb +0 -40
  78. data/spec/unit/predicates/included_in_spec.rb +0 -35
  79. data/spec/unit/predicates/includes_spec.rb +0 -24
  80. data/spec/unit/predicates/int_spec.rb +0 -34
  81. data/spec/unit/predicates/key_spec.rb +0 -29
  82. data/spec/unit/predicates/lt_spec.rb +0 -40
  83. data/spec/unit/predicates/lteq_spec.rb +0 -40
  84. data/spec/unit/predicates/max_size_spec.rb +0 -49
  85. data/spec/unit/predicates/min_size_spec.rb +0 -49
  86. data/spec/unit/predicates/none_spec.rb +0 -28
  87. data/spec/unit/predicates/not_eql_spec.rb +0 -21
  88. data/spec/unit/predicates/number_spec.rb +0 -37
  89. data/spec/unit/predicates/odd_spec.rb +0 -31
  90. data/spec/unit/predicates/size_spec.rb +0 -55
  91. data/spec/unit/predicates/str_spec.rb +0 -32
  92. data/spec/unit/predicates/time_spec.rb +0 -31
  93. data/spec/unit/predicates/true_spec.rb +0 -35
  94. data/spec/unit/predicates/type_spec.rb +0 -35
  95. data/spec/unit/predicates_spec.rb +0 -23
  96. data/spec/unit/rule/predicate_spec.rb +0 -53
  97. data/spec/unit/rule_compiler_spec.rb +0 -127
  98. data/spec/unit/rule_spec.rb +0 -211
@@ -1,56 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates do
4
- describe '#excludes?' do
5
- let(:predicate_name) { :excludes? }
6
-
7
- context 'with input excludes value' do
8
- let(:arguments_list) do
9
- [
10
- ['Jack', ['Jill', 'John']],
11
- [0, 1..2],
12
- [3, 1..2],
13
- ['foo', 'Hello World'],
14
- [:foo, { bar: 0 }],
15
- [true, [nil, false]]
16
- ]
17
- end
18
-
19
- it_behaves_like 'a passing predicate'
20
- end
21
-
22
- context 'with input of invalid type' do
23
- let(:arguments_list) do
24
- [
25
- [2, 1],
26
- [1, nil],
27
- ["foo", 1],
28
- [1, "foo"],
29
- [1..2, "foo"],
30
- ["foo", 1..2],
31
- [:key, "foo"]
32
- ]
33
- end
34
-
35
- it_behaves_like 'a passing predicate'
36
- end
37
-
38
- context 'when input includes value' do
39
- let(:arguments_list) do
40
- [
41
- ['Jill', ['Jill', 'John']],
42
- ['John', ['Jill', 'John']],
43
- [1, 1..2],
44
- [2, 1..2],
45
- ['Hello', 'Hello World'],
46
- ['World', 'Hello World'],
47
- [:bar, { bar: 0 }],
48
- [nil, [nil, false]],
49
- [false, [nil, false]]
50
- ]
51
- end
52
-
53
- it_behaves_like 'a failing predicate'
54
- end
55
- end
56
- end
@@ -1,35 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates do
4
- describe '#false?' do
5
- let(:predicate_name) { :false? }
6
-
7
- context 'when value is a date' do
8
- let(:arguments_list) do
9
- [[false]]
10
- end
11
-
12
- it_behaves_like 'a passing predicate'
13
- end
14
-
15
- context 'when value is not false' do
16
- let(:arguments_list) do
17
- [
18
- [true],
19
- [''],
20
- [[]],
21
- [{}],
22
- [nil],
23
- [:symbol],
24
- [String],
25
- [1],
26
- [0],
27
- ['true'],
28
- ['false']
29
- ]
30
- end
31
-
32
- it_behaves_like 'a failing predicate'
33
- end
34
- end
35
- end
@@ -1,38 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates do
4
- describe '#filled?' do
5
- let(:predicate_name) { :filled? }
6
-
7
- context 'when value is filled' do
8
- let(:arguments_list) do
9
- [
10
- ['Jill'],
11
- [[1, 2, 3]],
12
- [{ name: 'John' }],
13
- [true],
14
- [false],
15
- ['1'],
16
- ['0'],
17
- [:symbol],
18
- [String]
19
- ]
20
- end
21
-
22
- it_behaves_like 'a passing predicate'
23
- end
24
-
25
- context 'with value is not filled' do
26
- let(:arguments_list) do
27
- [
28
- [''],
29
- [[]],
30
- [{}],
31
- [nil]
32
- ]
33
- end
34
-
35
- it_behaves_like 'a failing predicate'
36
- end
37
- end
38
- end
@@ -1,31 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates do
4
- describe '#float?' do
5
- let(:predicate_name) { :float? }
6
-
7
- context 'when value is a float' do
8
- let(:arguments_list) do
9
- [[1.0]]
10
- end
11
-
12
- it_behaves_like 'a passing predicate'
13
- end
14
-
15
- context 'with value is not an integer' do
16
- let(:arguments_list) do
17
- [
18
- [''],
19
- [[]],
20
- [{}],
21
- [nil],
22
- [:symbol],
23
- [String],
24
- [1]
25
- ]
26
- end
27
-
28
- it_behaves_like 'a failing predicate'
29
- end
30
- end
31
- end
@@ -1,21 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates, '#format?' do
4
- let(:predicate_name) { :format? }
5
-
6
- context 'when value matches provided regexp' do
7
- let(:arguments_list) do
8
- [['Foo', /^F/]]
9
- end
10
-
11
- it_behaves_like 'a passing predicate'
12
- end
13
-
14
- context 'when value does not match provided regexp' do
15
- let(:arguments_list) do
16
- [['Bar', /^F/]]
17
- end
18
-
19
- it_behaves_like 'a failing predicate'
20
- end
21
- end
@@ -1,40 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates do
4
- describe '#gt?' do
5
- let(:predicate_name) { :gt? }
6
-
7
- context 'when value is greater than n' do
8
- let(:arguments_list) do
9
- [
10
- [13, 14],
11
- [13.37, 13.38]
12
- ]
13
- end
14
-
15
- it_behaves_like 'a passing predicate'
16
- end
17
-
18
- context 'when value is equal to n' do
19
- let(:arguments_list) do
20
- [
21
- [13, 13],
22
- [13.37, 13.37]
23
- ]
24
- end
25
-
26
- it_behaves_like 'a failing predicate'
27
- end
28
-
29
- context 'with value is less than n' do
30
- let(:arguments_list) do
31
- [
32
- [13, 12],
33
- [13.37, 13.36]
34
- ]
35
- end
36
-
37
- it_behaves_like 'a failing predicate'
38
- end
39
- end
40
- end
@@ -1,40 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates do
4
- describe '#gteq?' do
5
- let(:predicate_name) { :gteq? }
6
-
7
- context 'when value is greater than n' do
8
- let(:arguments_list) do
9
- [
10
- [13, 14],
11
- [13.37, 13.38]
12
- ]
13
- end
14
-
15
- it_behaves_like 'a passing predicate'
16
- end
17
-
18
- context 'when value is equal to n' do
19
- let(:arguments_list) do
20
- [
21
- [13, 13],
22
- [13.37, 13.37]
23
- ]
24
- end
25
-
26
- it_behaves_like 'a passing predicate'
27
- end
28
-
29
- context 'with value is less than n' do
30
- let(:arguments_list) do
31
- [
32
- [13, 12],
33
- [13.37, 13.36]
34
- ]
35
- end
36
-
37
- it_behaves_like 'a failing predicate'
38
- end
39
- end
40
- end
@@ -1,35 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates do
4
- describe '#included_in?' do
5
- let(:predicate_name) { :included_in? }
6
-
7
- context 'when value is present in list' do
8
- let(:arguments_list) do
9
- [
10
- [['Jill', 'John'], 'Jill'],
11
- [['Jill', 'John'], 'John'],
12
- [1..2, 1],
13
- [1..2, 2],
14
- [[nil, false], nil],
15
- [[nil, false], false]
16
- ]
17
- end
18
-
19
- it_behaves_like 'a passing predicate'
20
- end
21
-
22
- context 'with value is not present in list' do
23
- let(:arguments_list) do
24
- [
25
- [['Jill', 'John'], 'Jack'],
26
- [1..2, 0],
27
- [1..2, 3],
28
- [[nil, false], true]
29
- ]
30
- end
31
-
32
- it_behaves_like 'a failing predicate'
33
- end
34
- end
35
- end
@@ -1,24 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates, '#is?' do
4
- let(:predicate_name) { :is? }
5
- let(:one) { Object.new }
6
- let(:two) { Object.new }
7
-
8
- context 'when value is equal to the arg' do
9
- let(:arguments_list) do
10
- [[one, one], [:one, :one]]
11
- end
12
-
13
- it_behaves_like 'a passing predicate'
14
- end
15
-
16
- context 'with value is not equal to the arg' do
17
- let(:arguments_list) do
18
- # Strings are not equal. Yet
19
- [[one, two], ['one', 'one']]
20
- end
21
-
22
- it_behaves_like 'a failing predicate'
23
- end
24
- end
@@ -1,34 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates do
4
- describe '#int?' do
5
- let(:predicate_name) { :int? }
6
-
7
- context 'when value is an integer' do
8
- let(:arguments_list) do
9
- [
10
- [1],
11
- [33],
12
- [7]
13
- ]
14
- end
15
-
16
- it_behaves_like 'a passing predicate'
17
- end
18
-
19
- context 'with value is not an integer' do
20
- let(:arguments_list) do
21
- [
22
- [''],
23
- [[]],
24
- [{}],
25
- [nil],
26
- [:symbol],
27
- [String]
28
- ]
29
- end
30
-
31
- it_behaves_like 'a failing predicate'
32
- end
33
- end
34
- end
@@ -1,29 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates do
4
- describe '#key?' do
5
- let(:predicate_name) { :key? }
6
-
7
- context 'when key is present in value' do
8
- let(:arguments_list) do
9
- [
10
- [:name, { name: 'John' }],
11
- [:age, { age: 18 }]
12
- ]
13
- end
14
-
15
- it_behaves_like 'a passing predicate'
16
- end
17
-
18
- context 'with key is not present in value' do
19
- let(:arguments_list) do
20
- [
21
- [:name, { age: 18 }],
22
- [:age, { name: 'Jill' }]
23
- ]
24
- end
25
-
26
- it_behaves_like 'a failing predicate'
27
- end
28
- end
29
- end
@@ -1,40 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates do
4
- describe '#lt?' do
5
- let(:predicate_name) { :lt? }
6
-
7
- context 'when value is less than n' do
8
- let(:arguments_list) do
9
- [
10
- [13, 12],
11
- [13.37, 13.36],
12
- ]
13
- end
14
-
15
- it_behaves_like 'a passing predicate'
16
- end
17
-
18
- context 'when value is equal to n' do
19
- let(:arguments_list) do
20
- [
21
- [13, 13],
22
- [13.37, 13.37]
23
- ]
24
- end
25
-
26
- it_behaves_like 'a failing predicate'
27
- end
28
-
29
- context 'with value is greater than n' do
30
- let(:arguments_list) do
31
- [
32
- [13, 14],
33
- [13.37, 13.38]
34
- ]
35
- end
36
-
37
- it_behaves_like 'a failing predicate'
38
- end
39
- end
40
- end
@@ -1,40 +0,0 @@
1
- require 'dry/logic/predicates'
2
-
3
- RSpec.describe Dry::Logic::Predicates do
4
- describe '#lteq?' do
5
- let(:predicate_name) { :lteq? }
6
-
7
- context 'when value is less than n' do
8
- let(:arguments_list) do
9
- [
10
- [13, 12],
11
- [13.37, 13.36]
12
- ]
13
- end
14
-
15
- it_behaves_like 'a passing predicate'
16
- end
17
-
18
- context 'when value is equal to n' do
19
- let(:arguments_list) do
20
- [
21
- [13, 13],
22
- [13.37, 13.37]
23
- ]
24
- end
25
-
26
- it_behaves_like 'a passing predicate'
27
- end
28
-
29
- context 'with value is greater than n' do
30
- let(:arguments_list) do
31
- [
32
- [13, 14],
33
- [13.37, 13.38]
34
- ]
35
- end
36
-
37
- it_behaves_like 'a failing predicate'
38
- end
39
- end
40
- end