act_with_bag 0.2.0 → 0.4.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.
- data/README +3 -0
- data/lib/act_with_bag.rb +55 -44
- data/lib/act_with_bag/version.rb +1 -1
- data/test/bag_test.rb +7 -0
- data/test/clean_test.rb +31 -0
- data/test/delete_test.rb +26 -0
- data/test/sti_test.rb +66 -0
- data/test/test_helper.rb +7 -0
- metadata +14 -8
data/README
CHANGED
@@ -22,6 +22,9 @@ If baggies of type :date are being used then
|
|
22
22
|
params must be corrected before an update_attributes.
|
23
23
|
Warning: :date fields are not well integrated; avoid them.
|
24
24
|
|
25
|
+
Obsolete fields are deleted before_save by:
|
26
|
+
delete_from_bag :field
|
27
|
+
|
25
28
|
|
26
29
|
Example
|
27
30
|
=======
|
data/lib/act_with_bag.rb
CHANGED
@@ -9,58 +9,66 @@ class << ActiveRecord::Base
|
|
9
9
|
#bag changes disabled as it must be handled by Bag himself
|
10
10
|
end
|
11
11
|
}
|
12
|
-
|
13
|
-
@
|
14
|
-
@baggies[model] ||= {}
|
12
|
+
|
13
|
+
@baggies_date ||= {}
|
15
14
|
baglets.each {|b|
|
16
15
|
if b.is_a?(Hash)
|
17
16
|
b.each {|baggie, type|
|
18
|
-
|
19
|
-
add_accessor(baggie)
|
17
|
+
add_accessor(baggie, type)
|
20
18
|
}
|
21
19
|
else
|
22
|
-
|
23
|
-
add_accessor(b)
|
20
|
+
add_accessor(b, :string)
|
24
21
|
end
|
25
22
|
}
|
26
23
|
end
|
27
24
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
25
|
+
def delete_from_bag(*baglets)
|
26
|
+
#p "delete_from_bag baglets #{baglets.inspect}"
|
27
|
+
|
28
|
+
self.class_eval %{
|
29
|
+
before_save :baggies_delete
|
30
|
+
def baggies_delete
|
31
|
+
#{baglets}.each {|b|
|
32
|
+
if b.is_a?(Hash)
|
33
|
+
b.each {|baggie, type|
|
34
|
+
self.bag.delete(baggie.to_sym)
|
35
|
+
}
|
36
|
+
else
|
37
|
+
self.bag.delete(b.to_sym)
|
38
|
+
end
|
39
|
+
}
|
40
|
+
|
41
|
+
end
|
42
|
+
}
|
43
|
+
|
31
44
|
end
|
32
45
|
|
33
46
|
def merge(bag, params)
|
34
|
-
model =
|
47
|
+
model = self.to_s.underscore.to_sym
|
35
48
|
return params unless params[model]
|
36
49
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
(
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
next unless found
|
50
|
+
(@baggies_date || {}).each {|baggie, type|
|
51
|
+
res, found, stopped = [], false, false
|
52
|
+
(1..3).each {|i|
|
53
|
+
p = params[model].delete("#{baggie}(#{i}i)")
|
54
|
+
break if p.nil?
|
55
|
+
found = true
|
56
|
+
stopped = true if p.empty?
|
57
|
+
res << p.to_i unless stopped
|
58
|
+
}
|
59
|
+
next unless found
|
48
60
|
## weird Timestamp, Hash and YAML problem
|
49
|
-
|
50
|
-
|
61
|
+
res = [0] if res == []
|
62
|
+
res[0] = 0 unless res[0] >= 0
|
51
63
|
|
52
|
-
|
53
|
-
|
54
|
-
end
|
64
|
+
value = Date.new(*res) rescue value = nil
|
65
|
+
params[model][baggie] = value
|
55
66
|
}
|
56
67
|
params
|
57
68
|
end
|
58
69
|
|
59
|
-
private
|
60
|
-
def model_sym
|
61
|
-
self.to_s.underscore.to_sym
|
62
|
-
end
|
63
70
|
|
71
|
+
protected
|
64
72
|
def free_accessor(str)
|
65
73
|
accessor = str.to_sym
|
66
74
|
return accessor unless self.method_defined?(accessor)
|
@@ -69,35 +77,38 @@ class << ActiveRecord::Base
|
|
69
77
|
nil
|
70
78
|
end
|
71
79
|
|
72
|
-
def add_accessor(baggie)
|
73
|
-
|
74
|
-
|
80
|
+
def add_accessor(baggie, type)
|
81
|
+
baggie_s = baggie.to_s
|
82
|
+
type_sym = type.to_sym
|
83
|
+
#p "add_accessor #{self.to_s} #{baggie.inspect} #{type_sym.inspect}"
|
84
|
+
|
85
|
+
accessor = free_accessor("#{baggie_s}")
|
75
86
|
if accessor
|
76
87
|
self.class_eval %{
|
77
88
|
def #{accessor}
|
78
89
|
res = bag && bag[:#{baggie}]
|
79
|
-
if #{self.to_s}.baggies[:#{baggie}] == :boolean
|
80
|
-
return res if res.class == FalseClass
|
81
|
-
return res if res.class == TrueClass
|
82
|
-
return res.to_i != 0
|
83
|
-
end
|
84
|
-
res
|
85
90
|
end
|
86
91
|
}
|
87
92
|
end
|
88
93
|
|
89
|
-
accessor = free_accessor("#{
|
94
|
+
accessor = free_accessor("#{baggie_s}=")
|
90
95
|
if accessor
|
96
|
+
@baggies_date[baggie] = type if type == :date
|
91
97
|
self.class_eval %{
|
92
98
|
def #{accessor}(value)
|
93
99
|
@attributes['bag'] = {} unless bag.is_a?(Hash)
|
94
|
-
|
100
|
+
unless value.nil?
|
101
|
+
self.bag[:#{baggie}] = value
|
102
|
+
else
|
103
|
+
self.bag.delete(:#{baggie})
|
104
|
+
nil
|
105
|
+
end
|
95
106
|
end
|
96
107
|
}
|
97
108
|
end
|
98
109
|
|
99
|
-
return unless
|
100
|
-
accessor = free_accessor("#{
|
110
|
+
return unless type_sym == :boolean
|
111
|
+
accessor = free_accessor("#{baggie_s}?")
|
101
112
|
if accessor
|
102
113
|
self.class_eval %{
|
103
114
|
def #{accessor}
|
data/lib/act_with_bag/version.rb
CHANGED
data/test/bag_test.rb
CHANGED
@@ -62,4 +62,11 @@ class BagTest < ActiveSupport::TestCase
|
|
62
62
|
assert_equal value, @order.field
|
63
63
|
end
|
64
64
|
|
65
|
+
test "merge for :at :date" do
|
66
|
+
model = :order
|
67
|
+
params = {model => {'at(1i)' => '1', 'at(2i)' => '2','at(3i)' => '3'}}
|
68
|
+
res = Order.merge({}, params)
|
69
|
+
assert_equal Date.new(1, 2, 3), res[model][:at]
|
70
|
+
end
|
71
|
+
|
65
72
|
end
|
data/test/clean_test.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
|
4
|
+
class Order < ActiveRecord::Base
|
5
|
+
add_to_bag :name
|
6
|
+
add_to_bag :name2
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
class CleanTest < ActiveSupport::TestCase
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@order = Order.new
|
14
|
+
end
|
15
|
+
|
16
|
+
test "assigning nil removes field from bag" do
|
17
|
+
value = 'abc'
|
18
|
+
assert_equal false, @order.bag.has_key?(:name)
|
19
|
+
@order.name = value
|
20
|
+
assert_equal true, @order.bag.has_key?(:name)
|
21
|
+
@order.name = nil
|
22
|
+
assert_equal false, @order.bag.has_key?(:name)
|
23
|
+
end
|
24
|
+
|
25
|
+
test "assigning nil to not yet initialized field" do
|
26
|
+
assert_equal false, @order.bag.has_key?(:name2)
|
27
|
+
@order.name2 = nil
|
28
|
+
assert_equal false, @order.bag.has_key?(:name2)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/test/delete_test.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
|
4
|
+
class Order < ActiveRecord::Base
|
5
|
+
add_to_bag :aa, :bb, :cc
|
6
|
+
delete_from_bag :bb
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
class DeleteTest < ActiveSupport::TestCase
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@order = Order.new
|
14
|
+
end
|
15
|
+
|
16
|
+
test "delete a field" do
|
17
|
+
@order.aa = 'aa'
|
18
|
+
@order.bb = 'bb'
|
19
|
+
@order.cc = 'cc'
|
20
|
+
@order.save
|
21
|
+
assert_equal 'aa', @order.aa
|
22
|
+
assert_nil @order.bb
|
23
|
+
assert_equal 'cc', @order.cc
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/test/sti_test.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
|
4
|
+
class User < ActiveRecord::Base
|
5
|
+
add_to_bag :name
|
6
|
+
end
|
7
|
+
|
8
|
+
class Administrator < User
|
9
|
+
add_to_bag :key
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
class StiTest < ActiveSupport::TestCase
|
14
|
+
|
15
|
+
def setup
|
16
|
+
@user = User.new
|
17
|
+
@admin = Administrator.new
|
18
|
+
end
|
19
|
+
|
20
|
+
test "kind of" do
|
21
|
+
assert_kind_of User, @user
|
22
|
+
assert_kind_of Administrator, @admin
|
23
|
+
end
|
24
|
+
|
25
|
+
test "STI field type" do
|
26
|
+
assert_nil @user.type
|
27
|
+
assert_equal 'Administrator', @admin.type
|
28
|
+
end
|
29
|
+
|
30
|
+
test "have bag" do
|
31
|
+
assert @user.respond_to?(:bag)
|
32
|
+
assert @admin.respond_to?(:bag)
|
33
|
+
end
|
34
|
+
|
35
|
+
test "has setters and getters" do
|
36
|
+
assert @user.respond_to?(:name)
|
37
|
+
assert @admin.respond_to?(:name)
|
38
|
+
assert @admin.respond_to?(:key)
|
39
|
+
|
40
|
+
assert @user.respond_to?('name=')
|
41
|
+
assert @admin.respond_to?('name=')
|
42
|
+
assert @admin.respond_to?('key=')
|
43
|
+
|
44
|
+
assert_equal false, @user.respond_to?(:key)
|
45
|
+
assert_equal false, @user.respond_to?('key=')
|
46
|
+
end
|
47
|
+
|
48
|
+
test "access to name & key" do
|
49
|
+
name = 'name'
|
50
|
+
key = 'key'
|
51
|
+
@admin.name = name
|
52
|
+
@admin.key = key
|
53
|
+
assert_equal name, @admin.name
|
54
|
+
assert_equal key, @admin.key
|
55
|
+
assert_not_equal 'def', @admin.name
|
56
|
+
assert_not_equal 'def', @admin.key
|
57
|
+
end
|
58
|
+
|
59
|
+
test "merge" do
|
60
|
+
model = :administrator
|
61
|
+
params = {model => {'at(1i)' => '1', 'at(2i)' => '2','at(3i)' => '3'}}
|
62
|
+
res = Administrator.merge({}, params)
|
63
|
+
assert_nil res[model][:at]
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: act_with_bag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
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:
|
12
|
+
date: 2012-07-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sqlite3
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,12 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
description: Add a bag to a Rails model
|
26
31
|
email:
|
27
32
|
- dittmar.krall@matique.de
|
@@ -37,6 +42,9 @@ files:
|
|
37
42
|
- lib/act_with_bag.rb
|
38
43
|
- lib/act_with_bag/version.rb
|
39
44
|
- test/bag_test.rb
|
45
|
+
- test/clean_test.rb
|
46
|
+
- test/delete_test.rb
|
47
|
+
- test/sti_test.rb
|
40
48
|
- test/test_helper.rb
|
41
49
|
homepage: http://www.matique.de
|
42
50
|
licenses: []
|
@@ -58,10 +66,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
58
66
|
version: '0'
|
59
67
|
requirements: []
|
60
68
|
rubyforge_project: act_with_bag
|
61
|
-
rubygems_version: 1.8.
|
69
|
+
rubygems_version: 1.8.24
|
62
70
|
signing_key:
|
63
71
|
specification_version: 3
|
64
72
|
summary: act_with_bag (baggies) gem
|
65
|
-
test_files:
|
66
|
-
- test/bag_test.rb
|
67
|
-
- test/test_helper.rb
|
73
|
+
test_files: []
|