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 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
- model = model_sym
13
- @baggies ||= {}
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
- @baggies[model].merge!(baggie => type)
19
- add_accessor(baggie)
17
+ add_accessor(baggie, type)
20
18
  }
21
19
  else
22
- @baggies[model].merge!(b => :string)
23
- add_accessor(b)
20
+ add_accessor(b, :string)
24
21
  end
25
22
  }
26
23
  end
27
24
 
28
- def baggies
29
- @baggies ||= {}
30
- @baggies[model_sym] || {}
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 = model_sym
47
+ model = self.to_s.underscore.to_sym
35
48
  return params unless params[model]
36
49
 
37
- baggies.each {|baggie, type|
38
- if type == :date
39
- res, found, stopped = [], false, false
40
- (1..3).each {|i|
41
- p = params[model].delete("#{baggie}(#{i}i)")
42
- break if p.nil?
43
- found = true
44
- stopped = true if p.empty?
45
- res << p.to_i unless stopped
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
- res = [0] if res == []
50
- res[0] = 0 unless res[0] >= 0
61
+ res = [0] if res == []
62
+ res[0] = 0 unless res[0] >= 0
51
63
 
52
- value = Date.new(*res) rescue value = nil
53
- params[model][baggie] = value
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
- #p "add_accessor #{self.to_s} #{baggie.inspect}"
74
- accessor = free_accessor("#{baggie.to_s}")
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("#{baggie.to_s}=")
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
- self.bag.merge!(:#{baggie} => value)
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 baggies["#{baggie}".to_sym] == :boolean
100
- accessor = free_accessor("#{baggie.to_s}?")
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}
@@ -1,3 +1,3 @@
1
1
  module ActWithBag
2
- VERSION = "0.2.0"
2
+ VERSION = "0.4.0"
3
3
  end
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
@@ -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
@@ -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
@@ -13,4 +13,11 @@ ActiveRecord::Schema.define do
13
13
  end
14
14
  end
15
15
 
16
+ ActiveRecord::Schema.define do
17
+ create_table 'users', :force => true do |t|
18
+ t.string :type
19
+ t.text :bag
20
+ end
21
+ end
22
+
16
23
  require File.dirname(__FILE__) + '/../lib/act_with_bag.rb'
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.2.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: 2011-10-20 00:00:00.000000000Z
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: &70820700 !ruby/object:Gem::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: *70820700
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.11
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: []