tableless_model 0.0.4 → 0.0.5
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/Gemfile.lock +6 -0
- data/README.rdoc +1 -1
- data/lib/activerecord/base/class_methods.rb +4 -38
- data/lib/tableless_model/version.rb +1 -1
- data/spec/tableless_model_spec.rb +46 -3
- data/spec/test_helper.rb +2 -1
- data/tableless_model.gemspec +1 -0
- metadata +15 -2
data/Gemfile.lock
CHANGED
@@ -8,7 +8,12 @@ GEM
|
|
8
8
|
remote: http://rubygems.org/
|
9
9
|
specs:
|
10
10
|
ansi (1.2.2)
|
11
|
+
ffi (1.0.4)
|
12
|
+
rake (>= 0.8.7)
|
11
13
|
minitest (2.0.2)
|
14
|
+
rake (0.8.7)
|
15
|
+
sqlite3 (0.1.1)
|
16
|
+
ffi (>= 0.6.3)
|
12
17
|
validatable (1.6.7)
|
13
18
|
|
14
19
|
PLATFORMS
|
@@ -17,5 +22,6 @@ PLATFORMS
|
|
17
22
|
DEPENDENCIES
|
18
23
|
ansi
|
19
24
|
minitest
|
25
|
+
sqlite3
|
20
26
|
tableless_model!
|
21
27
|
validatable
|
data/README.rdoc
CHANGED
@@ -27,20 +27,15 @@ module Base
|
|
27
27
|
|
28
28
|
# if only the column name is given, the tableless model's class is expected to have that name, classified, as class name
|
29
29
|
class_type = column.class == Hash ? column.collect{|k,v| v}.last : column.to_s.classify.constantize
|
30
|
-
|
31
|
-
|
30
|
+
|
32
31
|
# injecting in the parent object a getter and a setter for the
|
33
32
|
# attribute that will store an instance of a tableless model
|
34
33
|
class_eval do
|
35
|
-
|
36
|
-
# Making sure the serialized column contains a new instance of the tableless model
|
37
|
-
# if it hasn't been set yet
|
38
|
-
default_value_for column_name, class_type.new
|
39
|
-
|
34
|
+
|
40
35
|
# Telling AR that the column has to store an instance of the given tableless model in
|
41
36
|
# YAML serialized format
|
42
37
|
serialize column_name, ActiveRecord::TablelessModel
|
43
|
-
|
38
|
+
|
44
39
|
# Adding getter for the serialized column,
|
45
40
|
# making sure it always returns an instance of the specified tableless
|
46
41
|
# model and not just a normal hash or the value of the attribute in the database,
|
@@ -48,7 +43,7 @@ module Base
|
|
48
43
|
define_method column_name.to_s do
|
49
44
|
class_type.new(read_attribute(column_name.to_sym) || {})
|
50
45
|
end
|
51
|
-
|
46
|
+
|
52
47
|
# Adding setter for the serialized column,
|
53
48
|
# making sure it always stores in it an instance of
|
54
49
|
# the specified tableless model (as the argument may also be a regular hash)
|
@@ -57,35 +52,6 @@ module Base
|
|
57
52
|
end
|
58
53
|
end
|
59
54
|
end
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
#
|
64
|
-
#
|
65
|
-
# Overriding the setter for the serialized column in the AR model,
|
66
|
-
# to make sure that, if it is still nil, the column always
|
67
|
-
# returns at least a new instance of the specified tableless model
|
68
|
-
# having the default values, if any, declared in the tableless model itself
|
69
|
-
#
|
70
|
-
def default_value_for(property, default_value)
|
71
|
-
unless method_defined? "after_initialize_with_default_value_for_#{property.to_s}"
|
72
|
-
|
73
|
-
unless method_defined? "after_initialize"
|
74
|
-
define_method "after_initialize" do |*args|
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
define_method "after_initialize_with_default_value_for_#{property.to_s}" do |*args|
|
79
|
-
send("after_initialize_without_default_value_for_#{property.to_s}", *args)
|
80
|
-
return unless new_record?
|
81
|
-
return unless self.respond_to?(property.to_sym)
|
82
|
-
|
83
|
-
self.send("#{property.to_s}=".to_sym, self.send(property.to_sym) || default_value)
|
84
|
-
end
|
85
|
-
|
86
|
-
alias_method_chain "after_initialize", "default_value_for_#{property.to_s}"
|
87
|
-
end
|
88
|
-
end
|
89
55
|
|
90
56
|
end
|
91
57
|
end
|
@@ -148,13 +148,56 @@ describe "An ActiveRecord::Base model" do
|
|
148
148
|
attribute :bbb, :default => "bbb"
|
149
149
|
end
|
150
150
|
|
151
|
-
|
152
|
-
|
151
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
152
|
+
ActiveRecord::Base.connection.execute(" create table test_models (options varchar(50)) ")
|
153
|
+
|
154
|
+
class TestModel < ActiveRecord::Base
|
155
|
+
has_tableless :options => ModelOptions
|
153
156
|
end
|
154
157
|
end
|
155
158
|
|
156
159
|
it "responds to default_value_for, has_tableless" do
|
157
|
-
|
160
|
+
TestModel.must_respond_to(:has_tableless)
|
161
|
+
end
|
162
|
+
|
163
|
+
describe "new instance" do
|
164
|
+
before do
|
165
|
+
@instance = TestModel.new
|
166
|
+
end
|
167
|
+
|
168
|
+
it "has a getter and a setter for :options" do
|
169
|
+
%w(options options=).each{|m| @instance.must_respond_to m }
|
170
|
+
@instance.options.must_be_kind_of ModelOptions
|
171
|
+
@instance.options.wont_be_nil
|
172
|
+
@instance.options.aaa.must_equal "111"
|
173
|
+
@instance.options.bbb.must_equal "bbb"
|
174
|
+
proc { @instance.options = "test" }.must_raise NoMethodError, "should not accept other values than a hash or ModelOptions instance"
|
175
|
+
end
|
176
|
+
|
177
|
+
describe "setter" do
|
178
|
+
before do
|
179
|
+
@return_value = @instance.send("options=", { :aaa => "CCC", :bbb => "DDD" })
|
180
|
+
end
|
181
|
+
|
182
|
+
it "correctly sets the serialized column" do
|
183
|
+
@return_value.must_be_kind_of ModelOptions
|
184
|
+
%w(aaa bbb).each{|m| @return_value.must_respond_to m}
|
185
|
+
@instance.options.aaa.must_equal "CCC"
|
186
|
+
@instance.options.bbb.must_equal "DDD"
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should save the serialized column correctly" do
|
190
|
+
@instance.save!
|
191
|
+
@instance = TestModel.first
|
192
|
+
|
193
|
+
@instance.options.aaa.must_equal "CCC"
|
194
|
+
@instance.options.bbb.must_equal "DDD"
|
195
|
+
|
196
|
+
# Ensuring the serialize macro is used
|
197
|
+
@instance.options.must_be_kind_of ModelOptions
|
198
|
+
|
199
|
+
end
|
200
|
+
end
|
158
201
|
end
|
159
202
|
|
160
203
|
end
|
data/spec/test_helper.rb
CHANGED
data/tableless_model.gemspec
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 5
|
9
|
+
version: 0.0.5
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Vito Botta
|
@@ -56,6 +56,19 @@ dependencies:
|
|
56
56
|
version: "0"
|
57
57
|
type: :development
|
58
58
|
version_requirements: *id003
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: sqlite3
|
61
|
+
prerelease: false
|
62
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
version: "0"
|
70
|
+
type: :development
|
71
|
+
version_requirements: *id004
|
59
72
|
description: A serialisable and validatable table-less model with support for associations, useful to store settings, options, etc in a serialized form in a parent object
|
60
73
|
email:
|
61
74
|
- vito@botta.name
|