mod_factor 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -27,6 +27,12 @@ Include ModFactor::Owner to owner:
27
27
  :formula => proc {|extra| prop_one || raise("prop one is nil")}
28
28
  factor :prop_default, :default=>10
29
29
  end
30
+
31
+ properties :preferences do
32
+ property :pref_boolean, :boolean, :default=>false
33
+ property :pref_name, :string, :default=>'name'
34
+ end
35
+
30
36
  end
31
37
 
32
38
 
@@ -39,6 +45,11 @@ Sample usages:
39
45
  some_model.calculate
40
46
  some_model.prop_one_times_ten # 100
41
47
 
48
+ some_model.pref_boolean # true
49
+ some_model.pref_boolean = false
50
+
51
+ some_model.save
52
+
42
53
  Include Math helper:
43
54
 
44
55
  class SomeModel < ActiveRecord::Base
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.10
1
+ 0.0.11
@@ -24,7 +24,7 @@ module ModFactor
24
24
  if base.instance_variable_defined? :@factor_model
25
25
  factor_model = base.instance_variable_get :@factor_model
26
26
 
27
- changeset.each do |key|
27
+ factor_changes.each do |key|
28
28
  factor = obj.send(factor_model).find_or_initialize_by_key key
29
29
  factor.amount = BigDecimal.new(obj.send(key).to_s)
30
30
  factor.save!
@@ -33,6 +33,18 @@ module ModFactor
33
33
  obj.reload
34
34
  end
35
35
 
36
+ if base.instance_variable_defined? :@property_model
37
+ property_model = base.instance_variable_get :@property_model
38
+
39
+ property_changes.each do |key|
40
+ property = obj.send(property_model).find_or_initialize_by_key key
41
+ property.value = obj.send(key)
42
+ property.save!
43
+ obj.instance_variable_set "@#{key}", property.value
44
+ end
45
+ obj.reload
46
+ end
47
+
36
48
  end
37
49
  end
38
50
 
@@ -60,22 +72,50 @@ module ModFactor
60
72
  def generate_list
61
73
  @generate_list ||= factor_define.keys.select { |key| factor_define[key][:generate] }
62
74
  end
75
+
76
+ def property_define
77
+ @property_define ||= {}
78
+ end
79
+
80
+ def properties model, options = {}
81
+ has_many model, :as=>:owner
82
+ @property_model = model
83
+ yield if block_given?
84
+ end
85
+
86
+ def property name, type, options = {}
87
+ attr_accessor name
88
+ property_define[name] = options
89
+ end
63
90
 
64
91
  end
65
92
 
66
93
  def factor_hash
67
94
  @factor_hash ||= self.class.factor_define.keys.inject({}) do
68
- |out, item| out[item] = nil
95
+ |out, item| out[item] = self.class.factor_define[item][:default]
69
96
  out
70
97
  end
71
98
  end
72
99
 
73
- def changeset
100
+ def factor_changes
74
101
  self.class.factor_define.keys.select do |key|
75
102
  factor_hash[key] != __send__(key)
76
103
  end
77
104
  end
78
105
 
106
+ def property_hash
107
+ @property_hash ||= self.class.factor_define.keys.inject({}) do
108
+ |out, item| out[item] = self.class.factor_define[item][:default]
109
+ out
110
+ end
111
+ end
112
+
113
+ def property_changes
114
+ self.class.property_define.keys.select do |key|
115
+ property_hash[key] != __send__(key)
116
+ end
117
+ end
118
+
79
119
  def calculate options={}
80
120
  self.class.generate_list.each do |key|
81
121
  if (condition = self.class.factor_define[key][:condition]).nil? || self.instance_exec(options, &condition)
@@ -92,7 +132,7 @@ module ModFactor
92
132
  end
93
133
 
94
134
  def changed_for_autosave?
95
- !changeset.empty? || super
135
+ !factor_changes.empty? || !property_changes.empty? || super
96
136
  end
97
137
 
98
138
  end
data/mod_factor.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "mod_factor"
8
- s.version = "0.0.10"
8
+ s.version = "0.0.11"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ryan Wong"]
12
- s.date = "2012-03-23"
12
+ s.date = "2012-03-26"
13
13
  s.description = "mod factor"
14
14
  s.email = "ryan@idolgo.com"
15
15
  s.extra_rdoc_files = [
@@ -14,6 +14,19 @@ describe ModFactor::Owner do
14
14
  end
15
15
  end
16
16
 
17
+ with_model :preference do
18
+ table do |t|
19
+ t.string :key
20
+ t.string :owner_type
21
+ t.string :owner_id
22
+ t.text :value
23
+ t.timestamps
24
+ end
25
+ model do
26
+ belongs_to :owner, :polymorphic => true
27
+ end
28
+ end
29
+
17
30
  with_model :family do
18
31
  table do |t|
19
32
  t.boolean "visible"
@@ -40,6 +53,11 @@ describe ModFactor::Owner do
40
53
  factor :prop_default, :default=>10
41
54
  end
42
55
 
56
+ properties :preferences do
57
+ property :pref_boolean, :boolean, :default=>false
58
+ property :pref_name, :string, :default=>'name'
59
+ end
60
+
43
61
  validates :prop_one, :presence=>true
44
62
  end
45
63
  end
@@ -150,4 +168,17 @@ describe ModFactor::Owner do
150
168
  subject.should be_changed_for_autosave
151
169
  member.should be_changed_for_autosave
152
170
  end
171
+
172
+ it "should write and read property" do
173
+ subject.pref_boolean = true
174
+ subject.pref_boolean.should be_true
175
+ end
176
+
177
+ it "should store property to database" do
178
+ subject.pref_boolean = true
179
+ expect {
180
+ subject.save!
181
+ }.to change {subject.preferences.size}
182
+ end
183
+
153
184
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mod_factor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-23 00:00:00.000000000Z
12
+ date: 2012-03-26 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: i18n
16
- requirement: &81301410 !ruby/object:Gem::Requirement
16
+ requirement: &84919800 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.6.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *81301410
24
+ version_requirements: *84919800
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activerecord
27
- requirement: &81300980 !ruby/object:Gem::Requirement
27
+ requirement: &84919460 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.0.9
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *81300980
35
+ version_requirements: *84919460
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &81300650 !ruby/object:Gem::Requirement
38
+ requirement: &84912910 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *81300650
46
+ version_requirements: *84912910
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: sqlite3
49
- requirement: &81300320 !ruby/object:Gem::Requirement
49
+ requirement: &84912650 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *81300320
57
+ version_requirements: *84912650
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rspec
60
- requirement: &81299990 !ruby/object:Gem::Requirement
60
+ requirement: &84912310 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 2.8.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *81299990
68
+ version_requirements: *84912310
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: sqlite3-ruby
71
- requirement: &81299680 !ruby/object:Gem::Requirement
71
+ requirement: &84912020 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *81299680
79
+ version_requirements: *84912020
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: with_model
82
- requirement: &81299330 !ruby/object:Gem::Requirement
82
+ requirement: &84911740 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 0.1.5
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *81299330
90
+ version_requirements: *84911740
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rdoc
93
- requirement: &81298940 !ruby/object:Gem::Requirement
93
+ requirement: &84911410 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '3.12'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *81298940
101
+ version_requirements: *84911410
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: cucumber
104
- requirement: &81298590 !ruby/object:Gem::Requirement
104
+ requirement: &84911090 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *81298590
112
+ version_requirements: *84911090
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: bundler
115
- requirement: &81298240 !ruby/object:Gem::Requirement
115
+ requirement: &84910770 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 1.0.0
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *81298240
123
+ version_requirements: *84910770
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: jeweler
126
- requirement: &81297910 !ruby/object:Gem::Requirement
126
+ requirement: &84910380 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 1.8.3
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *81297910
134
+ version_requirements: *84910380
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: simplecov
137
- requirement: &81297590 !ruby/object:Gem::Requirement
137
+ requirement: &84909990 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,7 +142,7 @@ dependencies:
142
142
  version: '0'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *81297590
145
+ version_requirements: *84909990
146
146
  description: mod factor
147
147
  email: ryan@idolgo.com
148
148
  executables: []
@@ -183,7 +183,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
183
183
  version: '0'
184
184
  segments:
185
185
  - 0
186
- hash: 105907457
186
+ hash: 623796861
187
187
  required_rubygems_version: !ruby/object:Gem::Requirement
188
188
  none: false
189
189
  requirements: