property_sets 0.5.1 → 0.5.2
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/VERSION +1 -1
- data/lib/property_sets/action_view_extension.rb +4 -0
- data/lib/property_sets/active_record_extension.rb +36 -9
- data/lib/property_sets/property_set_model.rb +5 -0
- data/property_sets.gemspec +2 -8
- data/test/schema.rb +10 -0
- data/test/test_property_sets.rb +48 -2
- data/test/test_view_extensions.rb +19 -0
- metadata +6 -9
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.2
|
@@ -28,6 +28,10 @@ module ActionView
|
|
28
28
|
template.radio_button(object_name, property, checked_value, options)
|
29
29
|
end
|
30
30
|
|
31
|
+
def text_field(property, options = {})
|
32
|
+
template.text_field(object_name, property, prepare_id_name(property, options))
|
33
|
+
end
|
34
|
+
|
31
35
|
def hidden_field(property, options = {})
|
32
36
|
template.hidden_field(object_name, property, prepare_id_name(property, options))
|
33
37
|
end
|
@@ -28,6 +28,35 @@ module PropertySets
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
def read_value_cast_for_property_set(type, value)
|
32
|
+
return nil if value.nil?
|
33
|
+
|
34
|
+
case type
|
35
|
+
when :string
|
36
|
+
value
|
37
|
+
when :datetime
|
38
|
+
Time.parse(value).in_time_zone
|
39
|
+
when :float
|
40
|
+
value.to_f
|
41
|
+
when :integer
|
42
|
+
value.to_i
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def write_value_cast_for_property_set(type, value)
|
47
|
+
return nil if value.nil?
|
48
|
+
case type
|
49
|
+
when :datetime
|
50
|
+
if value.is_a?(String)
|
51
|
+
value
|
52
|
+
else
|
53
|
+
value.in_time_zone("UTC").to_s
|
54
|
+
end
|
55
|
+
else
|
56
|
+
value.to_s
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
31
60
|
property_class.keys.each do |key|
|
32
61
|
raise "Invalid property key #{key}" if self.respond_to?(key)
|
33
62
|
|
@@ -38,7 +67,13 @@ module PropertySets
|
|
38
67
|
|
39
68
|
# Returns the value of the property
|
40
69
|
define_method "#{key}" do
|
41
|
-
lookup(key).value
|
70
|
+
read_value_cast_for_property_set(property_class.type(key), lookup(key).value)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Assigns a new value to the property
|
74
|
+
define_method "#{key}=" do |value|
|
75
|
+
instance = lookup(key)
|
76
|
+
instance.value = write_value_cast_for_property_set(property_class.type(key), value)
|
42
77
|
end
|
43
78
|
|
44
79
|
define_method "#{key}_record" do
|
@@ -57,13 +92,6 @@ module PropertySets
|
|
57
92
|
send("#{arg}=", "0")
|
58
93
|
end
|
59
94
|
|
60
|
-
# Assigns a new value to the property
|
61
|
-
define_method "#{key}=" do |value|
|
62
|
-
instance = lookup(key)
|
63
|
-
instance.value = value
|
64
|
-
value
|
65
|
-
end
|
66
|
-
|
67
95
|
# The finder method which returns the property if present, otherwise a new instance with defaults
|
68
96
|
define_method "lookup" do |arg|
|
69
97
|
instance = detect { |property| property.name.to_sym == arg.to_sym }
|
@@ -81,7 +109,6 @@ module PropertySets
|
|
81
109
|
instance = detect { |property| property.name.to_sym == arg.to_sym }
|
82
110
|
instance ||= property_class.new(:value => property_class.default(arg))
|
83
111
|
end
|
84
|
-
|
85
112
|
end
|
86
113
|
end
|
87
114
|
end
|
@@ -42,6 +42,7 @@ module PropertySets
|
|
42
42
|
self.value = value.to_s unless value.nil?
|
43
43
|
end
|
44
44
|
|
45
|
+
|
45
46
|
def owner_class_instance
|
46
47
|
send(self.class.owner_class_sym)
|
47
48
|
end
|
@@ -66,6 +67,10 @@ module PropertySets
|
|
66
67
|
@properties[key] && @properties[key].key?(:default) ? @properties[key][:default] : nil
|
67
68
|
end
|
68
69
|
|
70
|
+
def type(key)
|
71
|
+
@properties[key] && @properties[key].key?(:type) ? @properties[key][:type] : :string
|
72
|
+
end
|
73
|
+
|
69
74
|
def protected?(key)
|
70
75
|
@properties[key] && !!@properties[key][:protected]
|
71
76
|
end
|
data/property_sets.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{property_sets}
|
8
|
-
s.version = "0.5.
|
8
|
+
s.version = "0.5.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Morten Primdahl"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-08-03}
|
13
13
|
s.description = %q{This gem is an ActiveRecord extension which provides a convenient interface for managing per row properties}
|
14
14
|
s.email = %q{morten@zendesk.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -43,12 +43,6 @@ Gem::Specification.new do |s|
|
|
43
43
|
s.require_paths = ["lib"]
|
44
44
|
s.rubygems_version = %q{1.6.2}
|
45
45
|
s.summary = %q{Property sets for ActiveRecord}
|
46
|
-
s.test_files = [
|
47
|
-
"test/helper.rb",
|
48
|
-
"test/schema.rb",
|
49
|
-
"test/test_property_sets.rb",
|
50
|
-
"test/test_view_extensions.rb"
|
51
|
-
]
|
52
46
|
|
53
47
|
if s.respond_to? :specification_version then
|
54
48
|
s.specification_version = 3
|
data/test/schema.rb
CHANGED
@@ -29,6 +29,16 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
29
29
|
|
30
30
|
add_index :account_validations, [ :account_id, :name ], :unique => true
|
31
31
|
|
32
|
+
create_table "account_typed_data", :force => true do |t|
|
33
|
+
t.integer "account_id"
|
34
|
+
t.string "name"
|
35
|
+
t.string "value"
|
36
|
+
t.datetime "created_at"
|
37
|
+
t.datetime "updated_at"
|
38
|
+
end
|
39
|
+
|
40
|
+
add_index :account_typed_data, [ :account_id, :name ], :unique => true
|
41
|
+
|
32
42
|
create_table "accounts", :force => true do |t|
|
33
43
|
t.string "name"
|
34
44
|
t.datetime "created_at"
|
data/test/test_property_sets.rb
CHANGED
@@ -15,7 +15,7 @@ class TestPropertySets < ActiveSupport::TestCase
|
|
15
15
|
end
|
16
16
|
|
17
17
|
should "register the property sets used on a class" do
|
18
|
-
assert_equal [ :settings, :texts, :validations ], Account.property_set_index
|
18
|
+
assert_equal [ :settings, :texts, :validations, :typed_data ], Account.property_set_index
|
19
19
|
end
|
20
20
|
|
21
21
|
should "support protecting attributes" do
|
@@ -102,7 +102,6 @@ class TestPropertySets < ActiveSupport::TestCase
|
|
102
102
|
|
103
103
|
should "coerce everything but nil to string" do
|
104
104
|
@account.settings.foo = 3
|
105
|
-
assert @account.settings.foo == 3
|
106
105
|
@account.save
|
107
106
|
assert @account.settings.foo == "3"
|
108
107
|
@account.settings.foo = nil
|
@@ -208,5 +207,52 @@ class TestPropertySets < ActiveSupport::TestCase
|
|
208
207
|
assert !@account.settings.pro?
|
209
208
|
end
|
210
209
|
end
|
210
|
+
|
211
|
+
context "typed columns" do
|
212
|
+
context "string data" do
|
213
|
+
should "be writable and readable" do
|
214
|
+
@account.typed_data.string_prop = "foo"
|
215
|
+
assert_equal "foo", @account.typed_data.string_prop
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
context "floating point data" do
|
220
|
+
should "be writable and readable" do
|
221
|
+
@account.typed_data.float_prop = 1.97898
|
222
|
+
assert_equal 1.97898, @account.typed_data.float_prop
|
223
|
+
@account.save!
|
224
|
+
assert_equal 1.97898, @account.typed_data.float_prop
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
context "integer data" do
|
229
|
+
should "be writable and readable" do
|
230
|
+
@account.typed_data.int_prop = 25
|
231
|
+
assert_equal 25, @account.typed_data.int_prop
|
232
|
+
@account.save!
|
233
|
+
assert_equal 25, @account.typed_data.int_prop
|
234
|
+
|
235
|
+
assert_equal "25", @account.typed_data.lookup("int_prop").value
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
context "datetime data" do
|
240
|
+
should "be writable and readable" do
|
241
|
+
ts = Time.at(Time.now.to_i)
|
242
|
+
@account.typed_data.datetime_prop = ts
|
243
|
+
assert_equal ts, @account.typed_data.datetime_prop
|
244
|
+
@account.save!
|
245
|
+
assert_equal ts, @account.typed_data.datetime_prop
|
246
|
+
end
|
247
|
+
|
248
|
+
should "store data in UTC" do
|
249
|
+
ts = Time.at(Time.now.to_i)
|
250
|
+
string_rep = ts.in_time_zone("UTC").to_s
|
251
|
+
@account.typed_data.datetime_prop = ts
|
252
|
+
@account.save!
|
253
|
+
assert_equal string_rep, @account.typed_data.lookup("datetime_prop").value
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
211
257
|
end
|
212
258
|
end
|
@@ -71,6 +71,25 @@ class TestViewExtensions < ActiveSupport::TestCase
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
+
context "text_field" do
|
75
|
+
should "call with :value set" do
|
76
|
+
settings = stub(@property => "hello")
|
77
|
+
object = stub()
|
78
|
+
object.stubs(@association).returns(settings)
|
79
|
+
|
80
|
+
options = {
|
81
|
+
:value => "im text", :name => "object_name[#{@association}][#{@property}]",
|
82
|
+
:id => "object_name_#{@association}_#{@property}", :object => object
|
83
|
+
}
|
84
|
+
template = stub()
|
85
|
+
template.expects(:instance_variable_get).with("@object_name").returns(object)
|
86
|
+
template.expects(:text_field).with("object_name", @property, options)
|
87
|
+
|
88
|
+
@proxy.stubs(:template).returns(template)
|
89
|
+
@proxy.text_field(@property, options)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
74
93
|
context "radio_button" do
|
75
94
|
should "call with checked true for a truth value" do
|
76
95
|
settings = stub(@property => "hello")
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: property_sets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 5
|
9
|
-
-
|
10
|
-
version: 0.5.
|
9
|
+
- 2
|
10
|
+
version: 0.5.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Morten Primdahl
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-08-03 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -205,8 +205,5 @@ rubygems_version: 1.6.2
|
|
205
205
|
signing_key:
|
206
206
|
specification_version: 3
|
207
207
|
summary: Property sets for ActiveRecord
|
208
|
-
test_files:
|
209
|
-
|
210
|
-
- test/schema.rb
|
211
|
-
- test/test_property_sets.rb
|
212
|
-
- test/test_view_extensions.rb
|
208
|
+
test_files: []
|
209
|
+
|