ruler_coaster 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a0e05476d535a6233089b695847c1255e5f7a5be
4
- data.tar.gz: 6cbc46b2fa5d7b5de7522d1584fb1735210b842f
3
+ metadata.gz: 82f22410e008b993d8c7fefcdd9f51a4fb31a09c
4
+ data.tar.gz: f6850f85ff5ccd93c658390e281a96a731de686f
5
5
  SHA512:
6
- metadata.gz: e76604cd95f592e4012347009d41a94b9a7f246510854c61dd555734d9345c00e8b7dfc40287759fc6b3a0e36a8b0e35a740c97cc45e83d290e35188a4fad798
7
- data.tar.gz: aa71976f45af684adc997d9a6639a0adaa3aa3f8b1dbc27654587421f99abd3f6121ba677ff6887d725be7016ecb78de40106afb8ec4e19fff639e68bc892441
6
+ metadata.gz: 3aadd2800dce23c9760c3b6e7dfd15f5eafe272d0bf3120e7d33eca77fedd56f816e267eacad3134a55d62d9b3380055a4a0c4f2f1169fb9fe80b68c732155f5
7
+ data.tar.gz: 9b24b1af8b7aa6493156de273743e09177cbe903952cfad2f28a0e76252b109ed802bc107da87a38782fff5786f0ae1169253054f436df4fbb84f4381475fc87
@@ -1,10 +1,37 @@
1
1
  module RulerCoaster
2
2
  module Operator
3
3
  class Base
4
- attr_reader :assert_value
4
+ attr_reader :assert_value,
5
+ :value_type
5
6
 
6
- def initialize(assert_value)
7
- @assert_value = assert_value
7
+ def initialize(value, value_type = nil)
8
+ @value_type = infere_value_type(value_type, value)
9
+ @assert_value = build_term(value, @value_type).value
10
+ end
11
+
12
+ protected
13
+
14
+ def term_for(value)
15
+ Term.call(value, @value_type).value
16
+ end
17
+
18
+ private
19
+
20
+ def build_term(value, value_type)
21
+ value.is_a?(Term::Base) ? value : Term.call(value, value_type)
22
+ end
23
+
24
+ def infere_value_type(type, value)
25
+ mapping = {
26
+ String => 'string',
27
+ Fixnum => 'number',
28
+ Float => 'decimal',
29
+ Array => 'array'
30
+ }
31
+
32
+ return mapping[value.class] || 'string' if type.nil?
33
+
34
+ type
8
35
  end
9
36
  end
10
37
  end
@@ -2,7 +2,7 @@ module RulerCoaster
2
2
  module Operator
3
3
  class Equal < Base
4
4
  def call(value)
5
- assert_value.to_s.casecmp(value.to_s) == 0
5
+ assert_value.to_s.casecmp(term_for(value).to_s) == 0
6
6
  end
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ module RulerCoaster
2
2
  module Operator
3
3
  class GreaterThan < Base
4
4
  def call(value)
5
- value > assert_value
5
+ term_for(value) > assert_value
6
6
  end
7
7
  end
8
8
  end
@@ -29,35 +29,35 @@ module RulerCoaster
29
29
  end
30
30
 
31
31
  def visit_equal(node)
32
- Operator::Equal.new(node[:value])
32
+ Operator::Equal.new node[:value], node[:value_type]
33
33
  end
34
34
 
35
35
  def visit_not_equal(node)
36
- Operator::NotEqual.new(node[:value])
36
+ Operator::NotEqual.new node[:value], node[:value_type]
37
37
  end
38
38
 
39
39
  def visit_greater_than(node)
40
- Operator::GreaterThan.new(node[:value])
40
+ Operator::GreaterThan.new node[:value], node[:value_type]
41
41
  end
42
42
 
43
43
  def visit_less_than(node)
44
- Operator::LessThan.new(node[:value])
44
+ Operator::LessThan.new node[:value], node[:value_type]
45
45
  end
46
46
 
47
47
  def visit_contain(node)
48
- Operator::Contain.new(node[:value])
48
+ Operator::Contain.new node[:value], node[:value_type]
49
49
  end
50
50
 
51
51
  def visit_not_contain(node)
52
- Operator::NotContain.new(node[:value])
52
+ Operator::NotContain.new node[:value], node[:value_type]
53
53
  end
54
54
 
55
55
  def visit_empty(node)
56
- Operator::Empty.new(node[:value])
56
+ Operator::Empty.new node[:value], node[:value_type]
57
57
  end
58
58
 
59
59
  def visit_not_empty(node)
60
- Operator::NotEmpty.new(node[:value])
60
+ Operator::NotEmpty.new node[:value], node[:value_type]
61
61
  end
62
62
 
63
63
  module_function
@@ -0,0 +1,31 @@
1
+ module RulerCoaster
2
+ module Term
3
+ class Array < Base
4
+ def value
5
+ array_value.map(&:to_s).map(&:strip)
6
+ end
7
+
8
+ protected
9
+
10
+ def array_value
11
+ @value.is_a?(::Array) ? @value : @value.split(',')
12
+ end
13
+ end
14
+
15
+ class ArrayNumber < Term::Array
16
+ def value
17
+ array_value.map do |item|
18
+ item.to_s.strip.to_i
19
+ end
20
+ end
21
+ end
22
+
23
+ class ArrayDecimal < Term::Array
24
+ def value
25
+ array_value.map do |item|
26
+ item.to_s.strip.to_f
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ module RulerCoaster
2
+ module Term
3
+ def self.call(value, value_type = nil)
4
+ mapping = {
5
+ 'string' => Term::String,
6
+ 'number' => Term::Number,
7
+ 'decimal' => Term::Decimal,
8
+ 'array' => Term::Array,
9
+ 'array[string]' => Term::Array,
10
+ 'array[number]' => Term::ArrayNumber,
11
+ 'array[decimal]' => Term::ArrayDecimal
12
+ }
13
+
14
+ (mapping[value_type] || Term::String).new(value)
15
+ end
16
+
17
+ class Base
18
+ attr_accessor :value
19
+
20
+ def initialize(value)
21
+ @value = value
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ require 'ruler_coaster/term/string'
28
+ require 'ruler_coaster/term/number'
29
+ require 'ruler_coaster/term/decimal'
30
+ require 'ruler_coaster/term/array'
@@ -0,0 +1,9 @@
1
+ module RulerCoaster
2
+ module Term
3
+ class Decimal < Base
4
+ def value
5
+ @value.to_f
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module RulerCoaster
2
+ module Term
3
+ class Number < Base
4
+ def value
5
+ @value.to_i
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module RulerCoaster
2
+ module Term
3
+ class String < Base
4
+ def value
5
+ @value.to_s
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module RulerCoaster
2
- VERSION = '1.0.2'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
data/lib/ruler_coaster.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'ruler_coaster/parser'
2
+ require 'ruler_coaster/term/base'
2
3
  require 'ruler_coaster/operator/base'
3
4
  require 'ruler_coaster/logic/base'
4
5
  require 'ruler_coaster/rule'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruler_coaster
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Streetbees Dev Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-03 00:00:00.000000000 Z
11
+ date: 2016-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -96,8 +96,13 @@ files:
96
96
  - lib/ruler_coaster/parser.rb
97
97
  - lib/ruler_coaster/result.rb
98
98
  - lib/ruler_coaster/rule.rb
99
+ - lib/ruler_coaster/term/array.rb
100
+ - lib/ruler_coaster/term/base.rb
101
+ - lib/ruler_coaster/term/decimal.rb
102
+ - lib/ruler_coaster/term/number.rb
103
+ - lib/ruler_coaster/term/string.rb
99
104
  - lib/ruler_coaster/version.rb
100
- homepage: https://github.com/streetbees/rule-coaster
105
+ homepage: https://github.com/streetbees/ruler-coaster
101
106
  licenses: []
102
107
  metadata: {}
103
108
  post_install_message:
@@ -116,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
121
  version: '0'
117
122
  requirements: []
118
123
  rubyforge_project:
119
- rubygems_version: 2.4.6
124
+ rubygems_version: 2.5.1
120
125
  signing_key:
121
126
  specification_version: 4
122
127
  summary: Rule engine