strategy_bag 0.0.1 → 0.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,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 5014b352fc4555ffdf03a6f7f0029c1a00431171
4
- data.tar.gz: 67d8898ae9fa37d35f5f01a9da1e005d89234345
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YWU4ZGEyZmFkZGQ4ZGMyNThlYTBiOWZiNWE4NGZiNDY1YmU2M2IzNg==
5
+ data.tar.gz: !binary |-
6
+ ZTkzNjYxMmRhYTU0ODM2ZDdhNzNhZDI2YjgyMWUyNjk5ODVhY2NhZQ==
5
7
  SHA512:
6
- metadata.gz: 68c7e55d8a3b9ece8b46ccaeba96240ca818cd676f70bfb50c90183081aa74fe8f1548b47bf05586f7281b8df1ce075c3aec3ca4423eb1c853869d70ba70eefc
7
- data.tar.gz: e52ddb18b55700d52c5a655fcac9bb5d5ca740276baa9c342dc3618c239e296c3cb7841e567d21d302e7477473abb142e3a73222418e274dd61cd38f0c210683
8
+ metadata.gz: !binary |-
9
+ ZDk2NGE5ZWI2MThmMGY1ZThlMzExYWJlYTczM2I3NWQ2MjNjOTNiZDdkMjZk
10
+ NDIxNmZiYmVjZTlmOWI0N2Q0MzNiNWFmZmM1OWQxYjRlNWMwZDUwYmZmOTJh
11
+ MzZmZGMyNDE3NDU3Nzg2MzMyNjgwZjFkNjE5NWJhZjhkMWRjZmE=
12
+ data.tar.gz: !binary |-
13
+ NWEyOTIxNzBmN2FlYjkwNjk4MTFhNmI1MTRlODM5N2FmMmRmNjlhNmZiMTg3
14
+ MzRkNzFhMmRjM2UxMGM3MmQwNzQ3NDFlMmEwYzg3MDcyMDI5YTg1NTdmMTdl
15
+ NjE5ZWZjNWVhMjQ3ZTc2NDNlYmEyMjc1Y2MyZDJkY2I0OWVhNzQ=
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.0
7
+ - jruby-19mode
8
+ - ruby-head
9
+ - jruby-head
data/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # StrategyBag
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/strategy_bag.png)](http://badge.fury.io/rb/strategy_bag)
4
+ [![Build Status](https://travis-ci.org/bagilevi/strategy_bag.png)](https://travis-ci.org/bagilevi/strategy_bag)
5
+ [![Code Climate](https://codeclimate.com/github/bagilevi/strategy_bag.png)](https://codeclimate.com/github/bagilevi/strategy_bag)
6
+
7
+
3
8
  Ruby DSL for making conditionals more readable by defining a set of strategies. Each strategy has a set of conditions and an action. The runner will select a strategy that meets the conditions and executes it.
4
9
 
5
10
  ## Installation
data/lib/strategy_bag.rb CHANGED
@@ -1,13 +1,21 @@
1
1
  class StrategyBag
2
2
 
3
3
  def initialize(*args)
4
+ interface, *param_values = args
5
+ if param_values.size != self.class.param_names.size
6
+ raise ArgumentError, "expected params: interface, #{self.class.param_names.map(&:to_s).join(', ')}, but only #{args.size} params given"
7
+ end
4
8
  @evaluator = Evaluator.new
9
+ @evaluator.interface = interface
5
10
  self.class.param_names.each_with_index do |name, index|
6
- @evaluator.define_value name, args[index]
11
+ @evaluator.define_value name, param_values[index]
7
12
  end
8
13
  end
9
14
 
10
15
  def run
16
+ self.class.derived_attributes.each do |name, block|
17
+ @evaluator.define_func name, block
18
+ end
11
19
  self.class.conditions.each do |positive_name, negative_name, p|
12
20
  @evaluator.define_func positive_name, p
13
21
  @evaluator.define_negative negative_name, positive_name
@@ -27,6 +35,8 @@ class StrategyBag
27
35
 
28
36
 
29
37
  class Evaluator
38
+ attr_accessor :interface
39
+
30
40
  def initialize
31
41
  @table = {}
32
42
  end
@@ -49,10 +59,12 @@ class StrategyBag
49
59
  a.all? { |c| send(c) }
50
60
  end
51
61
 
52
- def method_missing(m, *args, &proc)
62
+ def method_missing(m, *args, &block)
53
63
  #puts "missing: #{m}"
54
64
  if @table.has_key?(m.to_sym) && args.empty?
55
65
  @table[m.to_sym]
66
+ elsif interface.respond_to?(m)
67
+ interface.public_send(m, *args, &block)
56
68
  else
57
69
  super
58
70
  end
@@ -60,7 +72,7 @@ class StrategyBag
60
72
  end
61
73
 
62
74
  module ClassDSL
63
- attr_accessor :param_names, :conditions, :strategies, :default_strategy
75
+ attr_accessor :param_names, :conditions, :strategies, :default_strategy, :derived_attributes
64
76
 
65
77
  def params(*param_names)
66
78
  self.param_names = param_names
@@ -72,7 +84,7 @@ class StrategyBag
72
84
  self.conditions << [positive_name, negative_name, p]
73
85
  end
74
86
 
75
- def strategy(&block)
87
+ def strategy(title = nil, &block)
76
88
  self.strategies ||= []
77
89
  strategy = Strategy.new
78
90
  strategy.instance_eval(&block)
@@ -82,6 +94,12 @@ class StrategyBag
82
94
  def default(&block)
83
95
  self.default_strategy = block
84
96
  end
97
+
98
+ def derive(name, &block)
99
+ self.derived_attributes ||= []
100
+ self.derived_attributes << [name, block]
101
+ end
102
+
85
103
  end
86
104
 
87
105
  extend ClassDSL
@@ -1,3 +1,3 @@
1
- module StrategyBag
2
- VERSION = "0.0.1"
1
+ class StrategyBag
2
+ VERSION = "0.1.0"
3
3
  end
@@ -4,19 +4,30 @@ module StrategicCalc
4
4
  extend self
5
5
 
6
6
  def calc(a, b, c)
7
- Solver.new(a, b, c).run
7
+ Solver.new(self, a, b, c).run
8
+ end
9
+
10
+ def cmax
11
+ 20
12
+ end
13
+
14
+ def b_limit
15
+ 10
8
16
  end
9
17
 
10
18
  class Solver < StrategyBag
11
19
  params :a, :b, :c
12
20
 
21
+ derive(:bc) { b + c }
22
+ derive(:b_high) { b > b_limit }
23
+
13
24
  condition(:a_high?, :a_low?) { a > 10 }
14
- condition(:b_high?, :b_low?) { b > 10 }
25
+ condition(:b_high?, :b_low?) { b_high }
15
26
  condition(:c_high?, :c_low?) { c > 10 }
16
- condition(:c_max?, :c_not_max?) { c > 20 }
17
- condition(:bc_high?, :bc_low?) { b + c > 10 }
27
+ condition(:c_max?, :c_not_max?) { c > cmax } # cmax is provided by the interface
28
+ condition(:bc_high?, :bc_low?) { bc > 10 }
18
29
 
19
- strategy do
30
+ strategy "all high" do
20
31
  condition :a_high?
21
32
  condition :b_high?
22
33
  condition :c_high?
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strategy_bag
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Levente Bagi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-04 00:00:00.000000000 Z
11
+ date: 2014-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.5'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - ! '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - ! '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - ! '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: Ruby DSL for making conditionals more readable by defining a set of strategies.
@@ -61,7 +61,8 @@ executables: []
61
61
  extensions: []
62
62
  extra_rdoc_files: []
63
63
  files:
64
- - ".gitignore"
64
+ - .gitignore
65
+ - .travis.yml
65
66
  - Gemfile
66
67
  - LICENSE.txt
67
68
  - README.md
@@ -84,17 +85,17 @@ require_paths:
84
85
  - lib
85
86
  required_ruby_version: !ruby/object:Gem::Requirement
86
87
  requirements:
87
- - - ">="
88
+ - - ! '>='
88
89
  - !ruby/object:Gem::Version
89
90
  version: '0'
90
91
  required_rubygems_version: !ruby/object:Gem::Requirement
91
92
  requirements:
92
- - - ">="
93
+ - - ! '>='
93
94
  - !ruby/object:Gem::Version
94
95
  version: '0'
95
96
  requirements: []
96
97
  rubyforge_project:
97
- rubygems_version: 2.2.1
98
+ rubygems_version: 2.1.11
98
99
  signing_key:
99
100
  specification_version: 4
100
101
  summary: Ruby DSL for making conditionals more readable