ruler_coaster 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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