preferences 0.1.3 → 0.1.4
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/CHANGELOG.rdoc +4 -0
- data/README.rdoc +1 -1
- data/Rakefile +2 -2
- data/app/models/preference.rb +17 -8
- data/lib/preferences.rb +1 -7
- data/lib/preferences/preference_definition.rb +2 -2
- data/test/factory.rb +5 -1
- data/test/test_helper.rb +1 -1
- data/test/unit/preference_test.rb +20 -0
- metadata +3 -4
data/CHANGELOG.rdoc
CHANGED
data/README.rdoc
CHANGED
@@ -181,4 +181,4 @@ To run against a specific version of Rails:
|
|
181
181
|
== Dependencies
|
182
182
|
|
183
183
|
* Rails 2.1 or later
|
184
|
-
* plugins_plus[http://github.com/pluginaweek/
|
184
|
+
* plugins_plus[http://github.com/pluginaweek/plugins_plugins] (optional if app files are copied to your project tree)
|
data/Rakefile
CHANGED
@@ -5,11 +5,11 @@ require 'rake/contrib/sshpublisher'
|
|
5
5
|
|
6
6
|
spec = Gem::Specification.new do |s|
|
7
7
|
s.name = 'preferences'
|
8
|
-
s.version = '0.1.
|
8
|
+
s.version = '0.1.4'
|
9
9
|
s.platform = Gem::Platform::RUBY
|
10
10
|
s.summary = 'Adds support for easily creating custom preferences for models'
|
11
11
|
|
12
|
-
s.files = FileList['{app,lib,test}/**/*']
|
12
|
+
s.files = FileList['{app,lib,test}/**/*'] + %w(CHANGELOG.rdoc init.rb LICENSE Rakefile README.rdoc) - FileList['test/app_root/{log,log/*,script,script/*}']
|
13
13
|
s.require_path = 'lib'
|
14
14
|
s.has_rdoc = true
|
15
15
|
s.test_files = Dir['test/**/*_test.rb']
|
data/app/models/preference.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# Represents a preferred value for a particular preference on a model.
|
2
2
|
#
|
3
|
-
# ==
|
3
|
+
# == Grouped preferences
|
4
4
|
#
|
5
|
-
# In addition to simple named preferences, preferences can also be
|
6
|
-
# a particular
|
7
|
-
# particular Car. In this case, the
|
8
|
-
# the
|
9
|
-
# of context around them.
|
5
|
+
# In addition to simple named preferences, preferences can also be grouped by
|
6
|
+
# a particular value, be it a string or ActiveRecord object. For example, a
|
7
|
+
# User may have a preferred color for a particular Car. In this case, the
|
8
|
+
# +owner+ is the User, the +attribute+ is the color, and the +group+ is the Car.
|
9
|
+
# This allows preferences to have a sort of context around them.
|
10
10
|
class Preference < ActiveRecord::Base
|
11
11
|
belongs_to :owner,
|
12
12
|
:polymorphic => true
|
@@ -20,7 +20,16 @@ class Preference < ActiveRecord::Base
|
|
20
20
|
:if => :group_id?
|
21
21
|
|
22
22
|
class << self
|
23
|
-
# Splits the given group into its corresponding id and type
|
23
|
+
# Splits the given group into its corresponding id and type. For simple
|
24
|
+
# primitives, the id will be nil. For complex types, specifically ActiveRecord
|
25
|
+
# objects, the id is the unique identifier stored in the databse for the
|
26
|
+
# record.
|
27
|
+
#
|
28
|
+
# For example,
|
29
|
+
#
|
30
|
+
# Preference.split_group('google') # => [nil, "google"]
|
31
|
+
# Preference.split_group(1) # => [nil, 1]
|
32
|
+
# Preference.split_group(User.find(1)) # => [1, "User"]
|
24
33
|
def split_group(group = nil)
|
25
34
|
if group.is_a?(ActiveRecord::Base)
|
26
35
|
group_id, group_type = group.id, group.class.base_class.name.to_s
|
@@ -28,7 +37,7 @@ class Preference < ActiveRecord::Base
|
|
28
37
|
group_id, group_type = nil, group
|
29
38
|
end
|
30
39
|
|
31
|
-
|
40
|
+
[group_id, group_type]
|
32
41
|
end
|
33
42
|
end
|
34
43
|
|
data/lib/preferences.rb
CHANGED
@@ -21,12 +21,6 @@ module PluginAWeek #:nodoc:
|
|
21
21
|
# u.attributes = {:prefers_notifications => true}
|
22
22
|
# u.save!
|
23
23
|
module Preferences
|
24
|
-
def self.included(base) #:nodoc:
|
25
|
-
base.class_eval do
|
26
|
-
extend PluginAWeek::Preferences::MacroMethods
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
24
|
module MacroMethods
|
31
25
|
# Defines a new preference for all records in the model. By default, preferences
|
32
26
|
# are assumed to have a boolean data type, so all values will be typecasted
|
@@ -286,5 +280,5 @@ module PluginAWeek #:nodoc:
|
|
286
280
|
end
|
287
281
|
|
288
282
|
ActiveRecord::Base.class_eval do
|
289
|
-
|
283
|
+
extend PluginAWeek::Preferences::MacroMethods
|
290
284
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module PluginAWeek #:nodoc:
|
2
|
-
# Adds support for defining preferences on ActiveRecord models.
|
3
2
|
module Preferences
|
4
3
|
# Represents the definition of a preference for a particular model
|
5
4
|
class PreferenceDefinition
|
@@ -24,7 +23,8 @@ module PluginAWeek #:nodoc:
|
|
24
23
|
@column.default
|
25
24
|
end
|
26
25
|
|
27
|
-
# Typecasts the value based on the type of preference that was defined
|
26
|
+
# Typecasts the value based on the type of preference that was defined.
|
27
|
+
# This uses ActiveRecord's typecast functionality.
|
28
28
|
def type_cast(value)
|
29
29
|
if @type == 'any'
|
30
30
|
value
|
data/test/factory.rb
CHANGED
@@ -13,12 +13,16 @@ module Factory
|
|
13
13
|
def valid_attributes_for(model, attributes = {})
|
14
14
|
name = model.to_s.underscore
|
15
15
|
send("#{name}_attributes", attributes)
|
16
|
+
attributes.stringify_keys!
|
16
17
|
attributes
|
17
18
|
end
|
18
19
|
|
19
20
|
# Build an unsaved record
|
20
21
|
def new_record(model, *args)
|
21
|
-
|
22
|
+
attributes = valid_attributes_for(model, *args)
|
23
|
+
record = model.new(attributes)
|
24
|
+
attributes.each {|attr, value| record.send("#{attr}=", value) if model.accessible_attributes && !model.accessible_attributes.include?(attr) || model.protected_attributes && model.protected_attributes.include?(attr)}
|
25
|
+
record
|
22
26
|
end
|
23
27
|
|
24
28
|
# Build and save/reload a record
|
data/test/test_helper.rb
CHANGED
@@ -80,6 +80,26 @@ class PreferenceTest < Test::Unit::TestCase
|
|
80
80
|
assert !preference.valid?
|
81
81
|
assert_equal 1, Array(preference.errors.on(:group_type)).size
|
82
82
|
end
|
83
|
+
|
84
|
+
def test_should_protect_attributes_from_mass_assignment
|
85
|
+
preference = Preference.new(
|
86
|
+
:id => 1,
|
87
|
+
:attribute => 'notifications',
|
88
|
+
:value => '123',
|
89
|
+
:owner_id => 1,
|
90
|
+
:owner_type => 'User',
|
91
|
+
:group_id => 1,
|
92
|
+
:group_type => 'Car'
|
93
|
+
)
|
94
|
+
|
95
|
+
assert_nil preference.id
|
96
|
+
assert_equal 'notifications', preference.attribute
|
97
|
+
assert_equal '123', preference.value
|
98
|
+
assert_equal 1, preference.owner_id
|
99
|
+
assert_equal 'User', preference.owner_type
|
100
|
+
assert_equal 1, preference.group_id
|
101
|
+
assert_equal 'Car', preference.group_type
|
102
|
+
end
|
83
103
|
end
|
84
104
|
|
85
105
|
class PreferenceAsAClassTest < Test::Unit::TestCase
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: preferences
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Pfeifer
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-10-26 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -39,7 +39,6 @@ files:
|
|
39
39
|
- test/app_root/db/migrate/001_create_users.rb
|
40
40
|
- test/app_root/db/migrate/003_migrate_preferences_to_version_1.rb
|
41
41
|
- test/app_root/db/migrate/002_create_cars.rb
|
42
|
-
- test/app_root/log
|
43
42
|
- test/functional
|
44
43
|
- test/functional/preferences_test.rb
|
45
44
|
- test/test_helper.rb
|
@@ -74,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
73
|
requirements: []
|
75
74
|
|
76
75
|
rubyforge_project: pluginaweek
|
77
|
-
rubygems_version: 1.
|
76
|
+
rubygems_version: 1.2.0
|
78
77
|
signing_key:
|
79
78
|
specification_version: 2
|
80
79
|
summary: Adds support for easily creating custom preferences for models
|