act_with_bag 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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: []