heuristics 1.0.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -7,9 +7,9 @@ A typical simple example can look like this:
7
7
  Heuristics.define(:field_tester) do
8
8
  assume_default :integer
9
9
 
10
- assume(:date) { condition { Chronic.parse(value) } }
11
- assume(:string) { condition { value.instance_of? String } }
12
- assume(:hash) { condition { value.instance_of? Hash } }
10
+ assume(:date) { Chronic.parse(value) }
11
+ assume(:string) { value.instance_of? String }
12
+ assume(:hash) { value.instance_of? Hash }
13
13
  end
14
14
 
15
15
  Then you can use it like this
@@ -20,10 +20,6 @@ Then you can use it like this
20
20
  # Returns :date
21
21
  Heuristics.test(:field_tester, '23.09.1985')
22
22
 
23
- # Falls back to :integer per assume_default. None of the other assumptions returned trus
24
- Heuristics.test(:field_tester, [])
25
-
26
-
27
23
 
28
24
  ## Installation
29
25
 
@@ -52,16 +48,16 @@ This means you should write your assumptions in the order from most specific to
52
48
 
53
49
  # Assummption with multiple conditions. Returns :hash_with_values
54
50
  # if all conditions return true
55
- assume(:hash_with_values) do
56
- condition { value.instance_of? Hash }
57
- condition { value.keys.size > 0 }
51
+ assume(:hash_with_values) do
52
+ value.instance_of? Hash
53
+ value.keys.size > 0
58
54
  }
59
55
 
60
56
  # An assumption that will return :date if all conditions return true
61
- assume(:date) { condition { Chronic.parse(value) != nil } }
57
+ assume(:date) { Chronic.parse(value) != nil }
62
58
 
63
59
  # An assumption that will return :string if all conditions return true
64
- assume(:string) { condition { value.instance_of? String } }
60
+ assume(:string) { value.instance_of? String }
65
61
  end
66
62
 
67
63
 
@@ -76,9 +72,9 @@ This means you should write your assumptions in the order from most specific to
76
72
  # Default value to return if no assumptions match
77
73
  assume_default :set
78
74
 
79
- assume(:date) { condition { Chronic.parse(value) != nil } }
80
- assume(:string) { condition { value.instance_of? String } } }
81
- assume(:integer) { condition { value.instance_of? Fixnum } }}
75
+ assume(:date) { Chronic.parse(value) != nil }
76
+ assume(:string) { value.instance_of? String }
77
+ assume(:integer) { value.instance_of? Fixnum }
82
78
  end
83
79
 
84
80
  Heuristics.test([1,2,3,'23.09.85','1','2','3','4']) # returns :string
data/lib/heuristics.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'docile'
2
2
  require 'heuristics/builder'
3
- require 'heuristics/condition_evaluator'
4
3
  require 'heuristics/tester'
5
4
  require 'heuristics/version'
6
5
 
@@ -1,14 +1,24 @@
1
+ require 'ostruct'
2
+
1
3
  module Heuristics
2
4
  class Builder
3
- attr_reader :tests, :default
5
+ attr_reader :assumptions, :default
4
6
 
5
7
  def initialize
6
- @tests = {}
8
+ @assumptions = {}
7
9
  end
8
10
 
9
11
  def assume(type, &block)
10
- raise "An assumption with the name '#{type}' already exists" unless @tests[type].nil?
11
- @tests[type] = Docile.dsl_eval(ConditionEvaluator.new, &block)
12
+ raise "An assumption with the name '#{type}' already exists" unless @assumptions[type].nil?
13
+ @assumptions[type] = Proc.new(&block)
14
+ end
15
+
16
+ def check(value)
17
+ context = OpenStruct.new(value: value)
18
+
19
+ @assumptions.map do |type, prok|
20
+ (context.instance_eval(&prok) ? type : default) rescue default
21
+ end.reject(&:nil?).first
12
22
  end
13
23
 
14
24
  def assume_default(type)
@@ -7,7 +7,7 @@ module Heuristics
7
7
  def test(value)
8
8
  freq = Frequency.new
9
9
  [*value].map do |v|
10
- freq.add(@builder.tests.map{|k, e| e.check(v) ? k : nil }.reject(&:nil?).first || @builder.default)
10
+ freq.add(@builder.check(v) || @builder.default)
11
11
  end
12
12
 
13
13
  freq.list.keys.first
@@ -1,3 +1,3 @@
1
1
  module Heuristics
2
- VERSION = "1.0.2"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -2,7 +2,7 @@ require_relative '../../test_helper'
2
2
 
3
3
  describe Heuristics::Builder do
4
4
  it 'should respond to #tests' do
5
- Heuristics::Builder.new.must_respond_to :tests
5
+ Heuristics::Builder.new.must_respond_to :assumptions
6
6
  end
7
7
 
8
8
  it 'must allow setting a default assumption' do
@@ -2,13 +2,13 @@ require_relative '../../test_helper'
2
2
 
3
3
  describe Heuristics do
4
4
  it 'should allow skipping the heuristics name' do
5
- Heuristics.define { assume_default :string; assume(:email) { condition { false } } }
5
+ Heuristics.define { assume_default :string; assume(:email) { false } }
6
6
  Heuristics.test(1).must_equal :string
7
7
  end
8
8
 
9
9
  it 'should allow to use external libs for testing' do
10
10
  require 'chronic'
11
- Heuristics.define(:external_lib_test) { assume(:date) { condition { Chronic.parse(value) != nil } } }
11
+ Heuristics.define(:external_lib_test) { assume(:date) { Chronic.parse(value) != nil } }
12
12
  Heuristics.test('23.09.85', :external_lib_test).must_equal :date
13
13
  end
14
14
 
@@ -17,9 +17,9 @@ describe Heuristics do
17
17
  Heuristics.define(:first_come_first_serve) do
18
18
  assume_default nil # This is implicit anyway
19
19
 
20
- assume(:date) { condition { Chronic.parse(value) != nil } }
21
- assume(:integer_string) { condition { value =~ /\A\d+\Z/ } }
22
- assume(:string) { condition { value.instance_of? String } }
20
+ assume(:date) { Chronic.parse(value) != nil }
21
+ assume(:integer_string) { value =~ /\A\d+\Z/ }
22
+ assume(:string) { value.instance_of? String }
23
23
  end
24
24
 
25
25
  Heuristics.test('23.09.85', :first_come_first_serve).must_equal :date
@@ -40,8 +40,8 @@ describe Heuristics do
40
40
  it 'should return the first true assumption' do
41
41
  Heuristics.define(:assumption_test) do
42
42
  assume_default :integer
43
- assume(:string) { condition { value.instance_of? String } }
44
- assume(:hash) { condition { value.instance_of? String } }
43
+ assume(:string) { value.instance_of? String }
44
+ assume(:hash) { value.instance_of? Hash }
45
45
  end
46
46
  Heuristics.test('abc', :assumption_test).must_equal :string
47
47
  end
@@ -55,9 +55,9 @@ describe Heuristics do
55
55
  require 'chronic'
56
56
 
57
57
  Heuristics.define(:array_test) do
58
- assume(:date) { condition { Chronic.parse(value) } }
59
- assume(:string) { condition { value.instance_of? String } }
60
- assume(:integer) { condition { value.instance_of? Fixnum } }
58
+ assume(:date) { Chronic.parse(value) }
59
+ assume(:string) { value.instance_of? String }
60
+ assume(:integer) { value.instance_of? Fixnum }
61
61
  end
62
62
 
63
63
  Heuristics.test([1,2,3,'a','b','c','d'], :array_test).must_equal :string
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: heuristics
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.0.2
5
+ version: 2.0.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Peter Haza
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-23 00:00:00.000000000 Z
12
+ date: 2013-02-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  version_requirements: !ruby/object:Gem::Requirement
@@ -75,7 +75,6 @@ files:
75
75
  - heuristics.gemspec
76
76
  - lib/heuristics.rb
77
77
  - lib/heuristics/builder.rb
78
- - lib/heuristics/condition_evaluator.rb
79
78
  - lib/heuristics/tester.rb
80
79
  - lib/heuristics/version.rb
81
80
  - test/lib/heuristics/builder_test.rb
@@ -1,20 +0,0 @@
1
- require 'ostruct'
2
-
3
- module Heuristics
4
- class ConditionEvaluator
5
-
6
- def initialize
7
- @conditions = []
8
- end
9
-
10
- def condition(&block)
11
- @conditions << Proc.new(&block)
12
- end
13
-
14
- def check(value)
15
- context = OpenStruct.new(value: value)
16
-
17
- @conditions.map{|cond| context.instance_eval(&cond) rescue false}.reject{|v| v}.length == 0
18
- end
19
- end
20
- end