Commit 00d53e2f71d97aced0c96d98865cf31f13505170
1 parent
c247ec24
Exists in
master
and in
28 other branches
ActionItem41: moving serialized settings Hash logic to its own module
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1316 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
5 changed files
with
85 additions
and
45 deletions
Show diff stats
app/models/block.rb
... | ... | @@ -7,21 +7,7 @@ class Block < ActiveRecord::Base |
7 | 7 | acts_as_list :scope => :box |
8 | 8 | belongs_to :box |
9 | 9 | |
10 | - serialize :settings, Hash | |
11 | - def settings | |
12 | - self[:settings] ||= Hash.new | |
13 | - end | |
14 | - | |
15 | - def self.settings_item(name) | |
16 | - class_eval <<-CODE | |
17 | - def #{name} | |
18 | - settings[:#{name}] | |
19 | - end | |
20 | - def #{name}=(value) | |
21 | - settings[:#{name}] = value | |
22 | - end | |
23 | - CODE | |
24 | - end | |
10 | + acts_as_having_settings | |
25 | 11 | |
26 | 12 | def self.description |
27 | 13 | _('A dummy block.') | ... | ... |
app/models/recent_documents_block.rb
... | ... | @@ -0,0 +1,38 @@ |
1 | +module ActsAsHavingSettings | |
2 | + | |
3 | + module ClassMethods | |
4 | + def acts_as_having_settings(*args) | |
5 | + options = args.last.is_a?(Hash) ? args.pop : {} | |
6 | + | |
7 | + settings_field = options[:field] || 'settings' | |
8 | + | |
9 | + class_eval <<-CODE | |
10 | + serialize :#{settings_field}, Hash | |
11 | + def self.settings_field | |
12 | + #{settings_field.inspect} | |
13 | + end | |
14 | + def #{settings_field} | |
15 | + self[:#{settings_field}] ||= Hash.new | |
16 | + end | |
17 | + CODE | |
18 | + settings_items(*args) | |
19 | + end | |
20 | + | |
21 | + def settings_items(*names) | |
22 | + names.each do |setting| | |
23 | + class_eval <<-CODE | |
24 | + def #{setting} | |
25 | + send(self.class.settings_field)[:#{setting}] | |
26 | + end | |
27 | + def #{setting}=(value) | |
28 | + send(self.class.settings_field)[:#{setting}] = value | |
29 | + end | |
30 | + CODE | |
31 | + end | |
32 | + end | |
33 | + | |
34 | + end | |
35 | + | |
36 | +end | |
37 | + | |
38 | +ActiveRecord::Base.send(:extend, ActsAsHavingSettings::ClassMethods) | ... | ... |
... | ... | @@ -0,0 +1,45 @@ |
1 | +require File.dirname(__FILE__) + '/../test_helper' | |
2 | + | |
3 | +class ActsAsHavingSettingsTest < Test::Unit::TestCase | |
4 | + | |
5 | + # using Block class as a sample user of the module | |
6 | + | |
7 | + should 'store settings in a hash' do | |
8 | + block = Block.new | |
9 | + | |
10 | + assert_kind_of Hash, block.settings | |
11 | + block.save! | |
12 | + | |
13 | + assert_kind_of Hash, Block.find(block.id).settings | |
14 | + end | |
15 | + | |
16 | + should 'be able to declare settings items' do | |
17 | + block_class = Class.new(Block) | |
18 | + | |
19 | + block = block_class.new | |
20 | + assert !block.respond_to?(:limit) | |
21 | + assert !block.respond_to?(:limit=) | |
22 | + | |
23 | + block_class.settings_items :limit | |
24 | + | |
25 | + assert_respond_to block, :limit | |
26 | + assert_respond_to block, :limit= | |
27 | + | |
28 | + assert_nil block.limit | |
29 | + block.limit = 10 | |
30 | + assert_equal 10, block.limit | |
31 | + | |
32 | + assert_equal({ :limit => 10}, block.settings) | |
33 | + end | |
34 | + | |
35 | + should 'properly save the settings' do | |
36 | + # RecentDocumentsBlock declares an actual setting called limit | |
37 | + profile = create_user('testuser').person | |
38 | + block = RecentDocumentsBlock.new | |
39 | + block.box = profile.boxes.first | |
40 | + block.limit = 15 | |
41 | + block.save! | |
42 | + assert_equal 15, Block.find(block.id).limit | |
43 | + end | |
44 | + | |
45 | +end | ... | ... |
test/unit/block_test.rb
... | ... | @@ -5,16 +5,6 @@ class BlockTest < Test::Unit::TestCase |
5 | 5 | should 'describe itself' do |
6 | 6 | assert_kind_of String, Block.description |
7 | 7 | end |
8 | - | |
9 | - should 'store settings in a hash' do | |
10 | - block = Block.new | |
11 | - | |
12 | - assert_kind_of Hash, block.settings | |
13 | - block.save! | |
14 | - | |
15 | - assert_kind_of Hash, Block.find(block.id).settings | |
16 | - end | |
17 | - | |
18 | 8 | |
19 | 9 | should 'access owner through box' do |
20 | 10 | user = create_user('testinguser').person |
... | ... | @@ -32,25 +22,6 @@ class BlockTest < Test::Unit::TestCase |
32 | 22 | assert_nil Block.new.owner |
33 | 23 | end |
34 | 24 | |
35 | - should 'be able to declare settings items' do | |
36 | - block_class = Class.new(Block) | |
37 | - | |
38 | - block = block_class.new | |
39 | - assert !block.respond_to?(:limit) | |
40 | - assert !block.respond_to?(:limit=) | |
41 | - | |
42 | - block_class.settings_item :limit | |
43 | - | |
44 | - assert_respond_to block, :limit | |
45 | - assert_respond_to block, :limit= | |
46 | - | |
47 | - assert_nil block.limit | |
48 | - block.limit = 10 | |
49 | - assert_equal 10, block.limit | |
50 | - | |
51 | - assert_equal({ :limit => 10}, block.settings) | |
52 | - end | |
53 | - | |
54 | 25 | should 'generate CSS class name' do |
55 | 26 | block = Block.new |
56 | 27 | block.class.expects(:name).returns('SomethingBlock') | ... | ... |