dry-logic 1.0.2 → 1.0.8

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 +129 -26
  3. data/LICENSE +1 -1
  4. data/README.md +12 -14
  5. data/dry-logic.gemspec +27 -14
  6. data/lib/dry-logic.rb +1 -1
  7. data/lib/dry/logic.rb +2 -2
  8. data/lib/dry/logic/evaluator.rb +1 -1
  9. data/lib/dry/logic/operations.rb +11 -11
  10. data/lib/dry/logic/operations/abstract.rb +6 -6
  11. data/lib/dry/logic/operations/and.rb +4 -4
  12. data/lib/dry/logic/operations/attr.rb +1 -1
  13. data/lib/dry/logic/operations/binary.rb +1 -1
  14. data/lib/dry/logic/operations/check.rb +4 -4
  15. data/lib/dry/logic/operations/each.rb +2 -2
  16. data/lib/dry/logic/operations/implication.rb +2 -2
  17. data/lib/dry/logic/operations/key.rb +5 -5
  18. data/lib/dry/logic/operations/negation.rb +2 -2
  19. data/lib/dry/logic/operations/or.rb +2 -2
  20. data/lib/dry/logic/operations/set.rb +3 -3
  21. data/lib/dry/logic/operations/unary.rb +1 -1
  22. data/lib/dry/logic/operations/xor.rb +2 -2
  23. data/lib/dry/logic/operators.rb +4 -4
  24. data/lib/dry/logic/predicates.rb +60 -28
  25. data/lib/dry/logic/result.rb +2 -2
  26. data/lib/dry/logic/rule.rb +11 -11
  27. data/lib/dry/logic/rule/interface.rb +32 -37
  28. data/lib/dry/logic/rule/predicate.rb +3 -3
  29. data/lib/dry/logic/rule_compiler.rb +3 -3
  30. data/lib/dry/logic/version.rb +1 -1
  31. metadata +12 -133
  32. data/.codeclimate.yml +0 -15
  33. data/.gitignore +0 -9
  34. data/.rspec +0 -3
  35. data/.travis.yml +0 -31
  36. data/CONTRIBUTING.md +0 -29
  37. data/Gemfile +0 -15
  38. data/Rakefile +0 -14
  39. data/benchmarks/rule_application.rb +0 -30
  40. data/benchmarks/setup.rb +0 -13
  41. data/bin/console +0 -11
  42. data/examples/basic.rb +0 -16
  43. data/spec/integration/result_spec.rb +0 -61
  44. data/spec/integration/rule_spec.rb +0 -55
  45. data/spec/shared/predicates.rb +0 -59
  46. data/spec/shared/rule.rb +0 -74
  47. data/spec/spec_helper.rb +0 -36
  48. data/spec/support/mutant.rb +0 -11
  49. data/spec/unit/operations/and_spec.rb +0 -70
  50. data/spec/unit/operations/attr_spec.rb +0 -29
  51. data/spec/unit/operations/check_spec.rb +0 -51
  52. data/spec/unit/operations/each_spec.rb +0 -49
  53. data/spec/unit/operations/implication_spec.rb +0 -32
  54. data/spec/unit/operations/key_spec.rb +0 -135
  55. data/spec/unit/operations/negation_spec.rb +0 -51
  56. data/spec/unit/operations/or_spec.rb +0 -75
  57. data/spec/unit/operations/set_spec.rb +0 -43
  58. data/spec/unit/operations/xor_spec.rb +0 -63
  59. data/spec/unit/predicates/array_spec.rb +0 -43
  60. data/spec/unit/predicates/attr_spec.rb +0 -31
  61. data/spec/unit/predicates/bool_spec.rb +0 -36
  62. data/spec/unit/predicates/case_spec.rb +0 -35
  63. data/spec/unit/predicates/date_spec.rb +0 -33
  64. data/spec/unit/predicates/date_time_spec.rb +0 -33
  65. data/spec/unit/predicates/decimal_spec.rb +0 -34
  66. data/spec/unit/predicates/empty_spec.rb +0 -40
  67. data/spec/unit/predicates/eql_spec.rb +0 -23
  68. data/spec/unit/predicates/even_spec.rb +0 -33
  69. data/spec/unit/predicates/excluded_from_spec.rb +0 -37
  70. data/spec/unit/predicates/excludes_spec.rb +0 -58
  71. data/spec/unit/predicates/false_spec.rb +0 -37
  72. data/spec/unit/predicates/filled_spec.rb +0 -40
  73. data/spec/unit/predicates/float_spec.rb +0 -33
  74. data/spec/unit/predicates/format_spec.rb +0 -23
  75. data/spec/unit/predicates/gt_spec.rb +0 -42
  76. data/spec/unit/predicates/gteq_spec.rb +0 -42
  77. data/spec/unit/predicates/included_in_spec.rb +0 -37
  78. data/spec/unit/predicates/includes_spec.rb +0 -24
  79. data/spec/unit/predicates/int_spec.rb +0 -36
  80. data/spec/unit/predicates/key_spec.rb +0 -31
  81. data/spec/unit/predicates/lt_spec.rb +0 -42
  82. data/spec/unit/predicates/lteq_spec.rb +0 -42
  83. data/spec/unit/predicates/max_size_spec.rb +0 -51
  84. data/spec/unit/predicates/min_size_spec.rb +0 -51
  85. data/spec/unit/predicates/none_spec.rb +0 -30
  86. data/spec/unit/predicates/not_eql_spec.rb +0 -23
  87. data/spec/unit/predicates/number_spec.rb +0 -39
  88. data/spec/unit/predicates/odd_spec.rb +0 -33
  89. data/spec/unit/predicates/respond_to_spec.rb +0 -31
  90. data/spec/unit/predicates/size_spec.rb +0 -57
  91. data/spec/unit/predicates/str_spec.rb +0 -34
  92. data/spec/unit/predicates/time_spec.rb +0 -33
  93. data/spec/unit/predicates/true_spec.rb +0 -37
  94. data/spec/unit/predicates/type_spec.rb +0 -37
  95. data/spec/unit/predicates/uuid_v4_spec.rb +0 -29
  96. data/spec/unit/predicates_spec.rb +0 -25
  97. data/spec/unit/rule/predicate_spec.rb +0 -55
  98. data/spec/unit/rule_compiler_spec.rb +0 -129
  99. data/spec/unit/rule_spec.rb +0 -213
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/logic/predicates'
4
-
5
- RSpec.describe Dry::Logic::Predicates do
6
- describe '#nil?' do
7
- let(:predicate_name) { :nil? }
8
-
9
- context 'when value is nil' do
10
- let(:arguments_list) { [[nil]] }
11
- it_behaves_like 'a passing predicate'
12
- end
13
-
14
- context 'when value is not nil' do
15
- let(:arguments_list) do
16
- [
17
- [''],
18
- [true],
19
- [false],
20
- [0],
21
- [:symbol],
22
- [[]],
23
- [{}],
24
- [String]
25
- ]
26
- end
27
- it_behaves_like 'a failing predicate'
28
- end
29
- end
30
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/logic/predicates'
4
-
5
- RSpec.describe Dry::Logic::Predicates, '#not_eql?' do
6
- let(:predicate_name) { :not_eql? }
7
-
8
- context 'when value is equal to the arg' do
9
- let(:arguments_list) do
10
- [['Foo', 'Foo']]
11
- end
12
-
13
- it_behaves_like 'a failing predicate'
14
- end
15
-
16
- context 'with value is not equal to the arg' do
17
- let(:arguments_list) do
18
- [['Bar', 'Foo']]
19
- end
20
-
21
- it_behaves_like 'a passing predicate'
22
- end
23
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/logic/predicates'
4
-
5
- RSpec.describe Dry::Logic::Predicates do
6
- describe '#number?' do
7
- let(:predicate_name) { :number? }
8
-
9
- context 'when value is numerical' do
10
- let(:arguments_list) do
11
- [
12
- ["34"],
13
- ["1.000004"],
14
- ["0"],
15
- [4],
16
- ["-15.24"],
17
- [-3.5]
18
- ]
19
- end
20
-
21
- it_behaves_like 'a passing predicate'
22
- end
23
-
24
- context 'with value is not numerical' do
25
- let(:arguments_list) do
26
- [
27
- [''],
28
- ["-14px"],
29
- ["10,150.00"],
30
- [nil],
31
- [:symbol],
32
- [String]
33
- ]
34
- end
35
-
36
- it_behaves_like 'a failing predicate'
37
- end
38
- end
39
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/logic/predicates'
4
-
5
- RSpec.describe Dry::Logic::Predicates do
6
- describe '#odd?' do
7
- let(:predicate_name) { :odd? }
8
-
9
- context 'when value is an odd int' do
10
- let(:arguments_list) do
11
- [
12
- [13],
13
- [1],
14
- [1111]
15
- ]
16
- end
17
-
18
- it_behaves_like 'a passing predicate'
19
- end
20
-
21
- context 'with value is an even int' do
22
- let(:arguments_list) do
23
- [
24
- [0],
25
- [2],
26
- [2222]
27
- ]
28
- end
29
-
30
- it_behaves_like 'a failing predicate'
31
- end
32
- end
33
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/logic/predicates'
4
-
5
- RSpec.describe Dry::Logic::Predicates do
6
- describe '#respond_to?' do
7
- let(:predicate_name) { :respond_to? }
8
-
9
- context 'when value responds to method' do
10
- let(:arguments_list) do
11
- [
12
- [:method, Object],
13
- [:new, Hash]
14
- ]
15
- end
16
-
17
- it_behaves_like 'a passing predicate'
18
- end
19
-
20
- context 'when value does not respond to method' do
21
- let(:arguments_list) do
22
- [
23
- [:foo, Object],
24
- [:bar, Hash]
25
- ]
26
- end
27
-
28
- it_behaves_like 'a failing predicate'
29
- end
30
- end
31
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/logic/predicates'
4
-
5
- RSpec.describe Dry::Logic::Predicates do
6
- describe '#size?' do
7
- let(:predicate_name) { :size? }
8
-
9
- context 'when value size is equal to n' do
10
- let(:arguments_list) do
11
- [
12
- [[8], 2],
13
- [4, 'Jill'],
14
- [2, { 1 => 'st', 2 => 'nd' }],
15
- [8, 8],
16
- [1..8, 5]
17
- ]
18
- end
19
-
20
- it_behaves_like 'a passing predicate'
21
- end
22
-
23
- context 'when value size is greater than n' do
24
- let(:arguments_list) do
25
- [
26
- [[1, 2], 3],
27
- [5, 'Jill'],
28
- [3, { 1 => 'st', 2 => 'nd' }],
29
- [1, 9],
30
- [1..5, 6]
31
- ]
32
- end
33
-
34
- it_behaves_like 'a failing predicate'
35
- end
36
-
37
- context 'with value size is less than n' do
38
- let(:arguments_list) do
39
- [
40
- [[1, 2], 1],
41
- [3, 'Jill'],
42
- [1, { 1 => 'st', 2 => 'nd' }],
43
- [1, 7],
44
- [1..5, 4]
45
- ]
46
- end
47
-
48
- it_behaves_like 'a failing predicate'
49
- end
50
-
51
- context 'with an unsupported size' do
52
- it 'raises an error' do
53
- expect { Predicates[:size?].call('oops', 1) }.to raise_error(ArgumentError, /oops/)
54
- end
55
- end
56
- end
57
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/logic/predicates'
4
-
5
- RSpec.describe Dry::Logic::Predicates do
6
- describe '#str?' do
7
- let(:predicate_name) { :str? }
8
-
9
- context 'when value is a string' do
10
- let(:arguments_list) do
11
- [
12
- [''],
13
- ['John']
14
- ]
15
- end
16
-
17
- it_behaves_like 'a passing predicate'
18
- end
19
-
20
- context 'with value is not a string' do
21
- let(:arguments_list) do
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,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/logic/predicates'
4
-
5
- RSpec.describe Dry::Logic::Predicates do
6
- describe '#time?' do
7
- let(:predicate_name) { :time? }
8
-
9
- context 'when value is a time' do
10
- let(:arguments_list) do
11
- [[Time.now]]
12
- end
13
-
14
- it_behaves_like 'a passing predicate'
15
- end
16
-
17
- context 'with value is not an integer' do
18
- let(:arguments_list) do
19
- [
20
- [''],
21
- [[]],
22
- [{}],
23
- [nil],
24
- [:symbol],
25
- [String],
26
- [1]
27
- ]
28
- end
29
-
30
- it_behaves_like 'a failing predicate'
31
- end
32
- end
33
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/logic/predicates'
4
-
5
- RSpec.describe Dry::Logic::Predicates do
6
- describe '#true?' do
7
- let(:predicate_name) { :true? }
8
-
9
- context 'when value is true' do
10
- let(:arguments_list) do
11
- [[true]]
12
- end
13
-
14
- it_behaves_like 'a passing predicate'
15
- end
16
-
17
- context 'with value is not true' do
18
- let(:arguments_list) do
19
- [
20
- [false],
21
- [''],
22
- [[]],
23
- [{}],
24
- [nil],
25
- [:symbol],
26
- [String],
27
- [1],
28
- [0],
29
- ['true'],
30
- ['false']
31
- ]
32
- end
33
-
34
- it_behaves_like 'a failing predicate'
35
- end
36
- end
37
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/logic/predicates'
4
-
5
- RSpec.describe Dry::Logic::Predicates do
6
- describe '#type?' do
7
- let(:predicate_name) { :type? }
8
-
9
- context 'when value has a correct type' do
10
- let(:arguments_list) do
11
- [[TrueClass, true]]
12
- end
13
-
14
- it_behaves_like 'a passing predicate'
15
- end
16
-
17
- context 'with value is not true' do
18
- let(:arguments_list) do
19
- [
20
- [TrueClass, false],
21
- [TrueClass, ''],
22
- [TrueClass, []],
23
- [TrueClass, {}],
24
- [TrueClass, nil],
25
- [TrueClass, :symbol],
26
- [TrueClass, String],
27
- [TrueClass, 1],
28
- [TrueClass, 0],
29
- [TrueClass, 'true'],
30
- [TrueClass, 'false']
31
- ]
32
- end
33
-
34
- it_behaves_like 'a failing predicate'
35
- end
36
- end
37
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/logic/predicates'
4
-
5
- RSpec.describe Dry::Logic::Predicates do
6
- describe '#uuid_v4?' do
7
- let(:predicate_name) { :uuid_v4? }
8
-
9
- context 'when value is a valid V4 UUID' do
10
- let(:arguments_list) do
11
- [['f2d26c57-e07c-4416-a749-57e937930e04']]
12
- end
13
-
14
- it_behaves_like 'a passing predicate'
15
- end
16
-
17
- context 'with value is not a valid V4 UUID' do
18
- let(:arguments_list) do
19
- [
20
- ['f2d26c57-e07c-3416-a749-57e937930e04'], # wrong version number (3, not 4)
21
- ['20633928-6a07-11e9-a923-1681be663d3e'], # UUID V1
22
- ['not-a-uuid-at-all']
23
- ]
24
- end
25
-
26
- it_behaves_like 'a failing predicate'
27
- end
28
- end
29
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/logic/predicates'
4
-
5
- RSpec.describe Predicates do
6
- it 'can be included in another module' do
7
- mod = Module.new { include Predicates }
8
-
9
- expect(mod[:key?]).to be_a(Method)
10
- end
11
-
12
- describe '.predicate' do
13
- it 'defines a predicate method' do
14
- mod = Module.new {
15
- include Predicates
16
-
17
- predicate(:test?) do |foo|
18
- true
19
- end
20
- }
21
-
22
- expect(mod.test?('arg')).to be(true)
23
- end
24
- end
25
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Rule::Predicate do
4
- subject(:rule) { Rule::Predicate.build(predicate) }
5
-
6
- let(:predicate) { str? }
7
-
8
- include_context 'predicates'
9
-
10
- it_behaves_like Rule
11
-
12
- describe '#name' do
13
- it 'returns predicate identifier' do
14
- expect(rule.name).to be(:str?)
15
- end
16
- end
17
-
18
- describe '#to_ast' do
19
- context 'without a result' do
20
- it 'returns rule ast' do
21
- expect(rule.to_ast).to eql([:predicate, [:str?, [[:input, Undefined]]]])
22
- end
23
-
24
- it 'returns :failure with an id' do
25
- email = rule.with(id: :email)
26
-
27
- expect(email.(11).to_ast).to eql([:failure, [:email, [:predicate, [:str?, [[:input, 11]]]]]])
28
- end
29
- end
30
-
31
- context 'with a result' do
32
- it 'returns success' do
33
- expect(rule.('foo')).to be_success
34
- end
35
-
36
- it 'returns failure ast' do
37
- expect(rule.(5).to_ast).to eql([:predicate, [:str?, [[:input, 5]]]])
38
- end
39
- end
40
-
41
- context 'with a zero-arity predicate' do
42
- let(:predicate) { Module.new { def self.test?; true; end }.method(:test?) }
43
-
44
- it 'returns ast' do
45
- expect(rule.to_ast).to eql([:predicate, [:test?, []]])
46
- end
47
- end
48
- end
49
-
50
- describe '#to_s' do
51
- it 'returns string representation' do
52
- expect(rule.curry('foo').to_s).to eql('str?("foo")')
53
- end
54
- end
55
- end