preferences 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,34 @@
1
+ == master
2
+
3
+ == 0.1.3 / 2008-06-29
4
+
5
+ * Add +prefs+ as an alias for +preferences+
6
+ * Fix +preferences+ not properly selecting preferences when a group is specified
7
+ * Improve test coverage
8
+
9
+ == 0.1.2 / 2008-06-22
10
+
11
+ * Remove log files from gems
12
+
13
+ == 0.1.1 / 2008-06-20
14
+
15
+ * Rename preference_values hash to preferences
16
+ * Rename preferences association to stored_preferences
17
+
18
+ == 0.1.0 / 2008-06-19
19
+
20
+ * Avoid string evaluation for dynamic methods
21
+ * Return hashes for the preference_values, e.g.
22
+
23
+ user.preference_values # => {'color' => 'red', 'number' => 11, 'website' => {'background' => 'white', 'foreground' => 'black'}}
24
+ user.preference_values('website') # => {'background' => 'white', 'foreground' => 'black'}
25
+
26
+ * Add more generic grouping of preferences than with just other records, e.g.
27
+
28
+ user.preferred_color('cars')
29
+
30
+ * Remove support for an options hash when specifying :for associations for preference
31
+
32
+ == 0.0.1 / 2008-05-10
33
+
34
+ * Initial public release
File without changes
@@ -4,21 +4,21 @@
4
4
 
5
5
  == Resources
6
6
 
7
- Wiki
8
-
9
- * http://wiki.pluginaweek.org/Preferences
10
-
11
7
  API
12
8
 
13
9
  * http://api.pluginaweek.org/preferences
14
10
 
11
+ Bugs
12
+
13
+ * http://pluginaweek.lighthouseapp.com/projects/13286-preferences
14
+
15
15
  Development
16
16
 
17
- * http://dev.pluginaweek.org/browser/trunk/preferences
17
+ * http://github.com/pluginaweek/preferences
18
18
 
19
19
  Source
20
20
 
21
- * http://svn.pluginaweek.org/trunk/preferences
21
+ * git://github.com/pluginaweek/preferences.git
22
22
 
23
23
  == Description
24
24
 
@@ -119,6 +119,10 @@ This hash will contain the value for every preference that has been defined for
119
119
  the model, whether that's the default value or one that has been previously
120
120
  stored.
121
121
 
122
+ A short-hand alternative for preferences is also available:
123
+
124
+ user.prefs # => {"language"=>"English", "color"=>nil}
125
+
122
126
  === Grouping preferences
123
127
 
124
128
  In addition to defining generic preferences for the owning record, you can also
@@ -168,7 +172,7 @@ Preferences are stored in a separate table called "preferences".
168
172
  == Testing
169
173
 
170
174
  Before you can run any tests, the following gem must be installed:
171
- * plugin_test_helper[http://wiki.pluginaweek.org/Plugin_test_helper]
175
+ * plugin_test_helper[http://github.com/pluginaweek/plugin_test_helper]
172
176
 
173
177
  To run against a specific version of Rails:
174
178
 
@@ -177,4 +181,4 @@ To run against a specific version of Rails:
177
181
  == Dependencies
178
182
 
179
183
  * Rails 2.1 or later
180
- * plugins_plus[http://wiki.pluginaweek.org/Plugins_plus]
184
+ * plugins_plus[http://github.com/pluginaweek/plugins_plus]
data/Rakefile CHANGED
@@ -3,46 +3,54 @@ require 'rake/rdoctask'
3
3
  require 'rake/gempackagetask'
4
4
  require 'rake/contrib/sshpublisher'
5
5
 
6
- PKG_NAME = 'preferences'
7
- PKG_VERSION = '0.1.2'
8
- PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
9
- RUBY_FORGE_PROJECT = 'pluginaweek'
10
-
11
- desc 'Default: run unit tests.'
6
+ spec = Gem::Specification.new do |s|
7
+ s.name = 'preferences'
8
+ s.version = '0.1.3'
9
+ s.platform = Gem::Platform::RUBY
10
+ s.summary = 'Adds support for easily creating custom preferences for models'
11
+
12
+ s.files = FileList['{app,lib,test}/**/*'].to_a - FileList['test/app_root/log/*'].to_a + %w(CHANGELOG.rdoc init.rb LICENSE Rakefile README.rdoc)
13
+ s.require_path = 'lib'
14
+ s.has_rdoc = true
15
+ s.test_files = Dir['test/**/*_test.rb']
16
+
17
+ s.author = 'Aaron Pfeifer'
18
+ s.email = 'aaron@pluginaweek.org'
19
+ s.homepage = 'http://www.pluginaweek.org'
20
+ s.rubyforge_project = 'pluginaweek'
21
+ end
22
+
23
+ desc 'Default: run all tests.'
12
24
  task :default => :test
13
25
 
14
- desc 'Test the preferences plugin.'
26
+ desc "Test the #{spec.name} plugin."
15
27
  Rake::TestTask.new(:test) do |t|
16
28
  t.libs << 'lib'
17
- t.pattern = 'test/**/*_test.rb'
29
+ t.test_files = spec.test_files
18
30
  t.verbose = true
19
31
  end
20
32
 
21
- desc 'Generate documentation for the preferences plugin.'
33
+ begin
34
+ require 'rcov/rcovtask'
35
+ namespace :test do
36
+ desc "Test the #{spec.name} plugin with Rcov."
37
+ Rcov::RcovTask.new(:rcov) do |t|
38
+ t.libs << 'lib'
39
+ t.test_files = spec.test_files
40
+ t.rcov_opts << '--exclude="^(?!lib/|app/)"'
41
+ t.verbose = true
42
+ end
43
+ end
44
+ rescue LoadError
45
+ end
46
+
47
+ desc "Generate documentation for the #{spec.name} plugin."
22
48
  Rake::RDocTask.new(:rdoc) do |rdoc|
23
49
  rdoc.rdoc_dir = 'rdoc'
24
- rdoc.title = 'Preferences'
50
+ rdoc.title = spec.name
25
51
  rdoc.template = '../rdoc_template.rb'
26
52
  rdoc.options << '--line-numbers' << '--inline-source'
27
- rdoc.rdoc_files.include('README')
28
- rdoc.rdoc_files.include('lib/**/*.rb')
29
- end
30
-
31
- spec = Gem::Specification.new do |s|
32
- s.name = PKG_NAME
33
- s.version = PKG_VERSION
34
- s.platform = Gem::Platform::RUBY
35
- s.summary = 'Adds support for easily creating custom preferences for models'
36
-
37
- s.files = FileList['{app,lib,test}/**/*'].to_a - FileList['test/app_root/log/*'].to_a + %w(CHANGELOG init.rb MIT-LICENSE Rakefile README)
38
- s.require_path = 'lib'
39
- s.autorequire = 'preferences'
40
- s.has_rdoc = true
41
- s.test_files = Dir['test/**/*_test.rb']
42
-
43
- s.author = 'Aaron Pfeifer'
44
- s.email = 'aaron@pluginaweek.org'
45
- s.homepage = 'http://www.pluginaweek.org'
53
+ rdoc.rdoc_files.include('README.rdoc', 'CHANGELOG.rdoc', 'LICENSE', 'lib/**/*.rb', 'app/**/*.rb')
46
54
  end
47
55
 
48
56
  Rake::GemPackageTask.new(spec) do |p|
@@ -51,14 +59,14 @@ Rake::GemPackageTask.new(spec) do |p|
51
59
  p.need_zip = true
52
60
  end
53
61
 
54
- desc 'Publish the beta gem'
62
+ desc 'Publish the beta gem.'
55
63
  task :pgem => [:package] do
56
- Rake::SshFilePublisher.new('aaron@pluginaweek.org', '/home/aaron/gems.pluginaweek.org/public/gems', 'pkg', "#{PKG_FILE_NAME}.gem").upload
64
+ Rake::SshFilePublisher.new('aaron@pluginaweek.org', '/home/aaron/gems.pluginaweek.org/public/gems', 'pkg', "#{spec.name}-#{spec.version}.gem").upload
57
65
  end
58
66
 
59
- desc 'Publish the API documentation'
67
+ desc 'Publish the API documentation.'
60
68
  task :pdoc => [:rdoc] do
61
- Rake::SshDirPublisher.new('aaron@pluginaweek.org', "/home/aaron/api.pluginaweek.org/public/#{PKG_NAME}", 'rdoc').upload
69
+ Rake::SshDirPublisher.new('aaron@pluginaweek.org', "/home/aaron/api.pluginaweek.org/public/#{spec.name}", 'rdoc').upload
62
70
  end
63
71
 
64
72
  desc 'Publish the API docs and gem'
@@ -71,10 +79,10 @@ task :release => [:gem, :package] do
71
79
  ruby_forge = RubyForge.new.configure
72
80
  ruby_forge.login
73
81
 
74
- %w( gem tgz zip ).each do |ext|
75
- file = "pkg/#{PKG_FILE_NAME}.#{ext}"
82
+ %w(gem tgz zip).each do |ext|
83
+ file = "pkg/#{spec.name}-#{spec.version}.#{ext}"
76
84
  puts "Releasing #{File.basename(file)}..."
77
85
 
78
- ruby_forge.add_release(RUBY_FORGE_PROJECT, PKG_NAME, PKG_VERSION, file)
86
+ ruby_forge.add_release(spec.rubyforge_project, spec.name, spec.version, file)
79
87
  end
80
88
  end
data/lib/preferences.rb CHANGED
@@ -140,6 +140,12 @@ module PluginAWeek #:nodoc:
140
140
  end
141
141
 
142
142
  module InstanceMethods
143
+ def self.included(base) #:nodoc:
144
+ base.class_eval do
145
+ alias_method :prefs, :preferences
146
+ end
147
+ end
148
+
143
149
  # Finds all preferences, including defaults, for the current record. If
144
150
  # any custom group preferences have been stored, then this will include
145
151
  # all default preferences within that particular group.
@@ -164,27 +170,28 @@ module PluginAWeek #:nodoc:
164
170
  # user.preferences('cars')
165
171
  # => {"language"=>"English", "color"=>"red"}
166
172
  def preferences(*args)
167
- if args.any?
173
+ if args.empty?
174
+ group = nil
175
+ conditions = {}
176
+ else
168
177
  group = args.first
169
178
  group_id, group_type = Preference.split_group(group)
170
179
  conditions = {:group_id => group_id, :group_type => group_type}
171
- else
172
- conditions = {}
173
180
  end
174
181
 
175
182
  # Find all of the stored preferences
176
183
  stored_preferences = self.stored_preferences.find(:all, :conditions => conditions)
177
184
 
178
185
  # Hashify attribute -> value or group -> attribute -> value
179
- stored_preferences.inject(self.class.default_preferences.dup) do |preferences, preference|
180
- if group = preference.group
181
- preference_group = preferences[group] ||= self.class.default_preferences.dup
186
+ stored_preferences.inject(self.class.default_preferences.dup) do |all_preferences, preference|
187
+ if !group && (preference_group = preference.group)
188
+ preferences = all_preferences[preference_group] ||= self.class.default_preferences.dup
182
189
  else
183
- preference_group = preferences
190
+ preferences = all_preferences
184
191
  end
185
192
 
186
- preference_group[preference.attribute] = preference.value
187
- preferences
193
+ preferences[preference.attribute] = preference.value
194
+ all_preferences
188
195
  end
189
196
  end
190
197
 
data/test/factory.rb CHANGED
@@ -1,26 +1,32 @@
1
1
  module Factory
2
- # Build actions for the class
3
- def self.build(klass, &block)
4
- name = klass.to_s.underscore
5
- define_method("#{name}_attributes", block)
2
+ # Build actions for the model
3
+ def self.build(model, &block)
4
+ name = model.to_s.underscore
6
5
 
7
- module_eval <<-end_eval
8
- def valid_#{name}_attributes(attributes = {})
9
- #{name}_attributes(attributes)
10
- attributes
11
- end
12
-
13
- def new_#{name}(attributes = {})
14
- #{klass}.new(valid_#{name}_attributes(attributes))
15
- end
16
-
17
- def create_#{name}(*args)
18
- record = new_#{name}(*args)
19
- record.save!
20
- record.reload
21
- record
22
- end
23
- end_eval
6
+ define_method("#{name}_attributes", block)
7
+ define_method("valid_#{name}_attributes") {|*args| valid_attributes_for(model, *args)}
8
+ define_method("new_#{name}") {|*args| new_record(model, *args)}
9
+ define_method("create_#{name}") {|*args| create_record(model, *args)}
10
+ end
11
+
12
+ # Get valid attributes for the model
13
+ def valid_attributes_for(model, attributes = {})
14
+ name = model.to_s.underscore
15
+ send("#{name}_attributes", attributes)
16
+ attributes
17
+ end
18
+
19
+ # Build an unsaved record
20
+ def new_record(model, *args)
21
+ model.new(valid_attributes_for(model, *args))
22
+ end
23
+
24
+ # Build and save/reload a record
25
+ def create_record(model, *args)
26
+ record = new_record(model, *args)
27
+ record.save!
28
+ record.reload
29
+ record
24
30
  end
25
31
 
26
32
  build Car do |attributes|
@@ -209,6 +209,18 @@ class UserWithStoredPreferencesTest < Test::Unit::TestCase
209
209
  assert_equal expected, @user.preferences
210
210
  end
211
211
 
212
+ def test_should_use_preferences_for_prefs
213
+ expected = {
214
+ 'hot_salsa' => nil,
215
+ 'dark_chocolate' => true,
216
+ 'color' => nil,
217
+ 'car' => nil,
218
+ 'language' => 'Latin'
219
+ }
220
+
221
+ assert_equal expected, @user.prefs
222
+ end
223
+
212
224
  def test_should_not_remove_preference_if_set_to_default
213
225
  @user.preferred_language = 'English'
214
226
  @user.save!
@@ -260,7 +272,7 @@ class UserWithStoredPreferencesForBasicGroupsTest < Test::Unit::TestCase
260
272
  assert_equal 1, @user.stored_preferences.size
261
273
  end
262
274
 
263
- def test_should_have_preferences_for_group
275
+ def test_should_include_group_in_preferences
264
276
  expected = {
265
277
  'hot_salsa' => nil,
266
278
  'dark_chocolate' => true,
@@ -279,6 +291,30 @@ class UserWithStoredPreferencesForBasicGroupsTest < Test::Unit::TestCase
279
291
  assert_equal expected, @user.preferences
280
292
  end
281
293
 
294
+ def test_should_be_able_to_show_all_preferences_just_for_the_owner
295
+ expected = {
296
+ 'hot_salsa' => nil,
297
+ 'dark_chocolate' => true,
298
+ 'color' => nil,
299
+ 'car' => nil,
300
+ 'language' => 'English'
301
+ }
302
+
303
+ assert_equal expected, @user.preferences(nil)
304
+ end
305
+
306
+ def test_should_be_able_to_show_all_preferences_for_a_single_group
307
+ expected = {
308
+ 'hot_salsa' => nil,
309
+ 'dark_chocolate' => true,
310
+ 'color' => 'red',
311
+ 'car' => nil,
312
+ 'language' => 'English'
313
+ }
314
+
315
+ assert_equal expected, @user.preferences('cars')
316
+ end
317
+
282
318
  def test_should_not_have_preference_without_group
283
319
  assert_nil @user.preferred_color
284
320
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: preferences
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Pfeifer
8
- autorequire: preferences
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-06-22 00:00:00 -04:00
12
+ date: 2008-06-29 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -47,11 +47,11 @@ files:
47
47
  - test/unit
48
48
  - test/unit/preference_test.rb
49
49
  - test/unit/preference_definition_test.rb
50
- - CHANGELOG
50
+ - CHANGELOG.rdoc
51
51
  - init.rb
52
- - MIT-LICENSE
52
+ - LICENSE
53
53
  - Rakefile
54
- - README
54
+ - README.rdoc
55
55
  has_rdoc: true
56
56
  homepage: http://www.pluginaweek.org
57
57
  post_install_message:
@@ -73,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
73
  version:
74
74
  requirements: []
75
75
 
76
- rubyforge_project:
76
+ rubyforge_project: pluginaweek
77
77
  rubygems_version: 1.1.1
78
78
  signing_key:
79
79
  specification_version: 2
data/CHANGELOG DELETED
@@ -1,30 +0,0 @@
1
- *SVN*
2
-
3
- *0.1.2* (June 22nd, 2008)
4
-
5
- * Remove log files from gems
6
-
7
- *0.1.1* (June 20th, 2008)
8
-
9
- * Rename preference_values hash to preferences
10
-
11
- * Rename preferences association to stored_preferences
12
-
13
- *0.1.0* (June 19th, 2008)
14
-
15
- * Avoid string evaluation for dynamic methods
16
-
17
- * Return hashes for the preference_values, e.g.
18
-
19
- user.preference_values # => {'color' => 'red', 'number' => 11, 'website' => {'background' => 'white', 'foreground' => 'black'}}
20
- user.preference_values('website') # => {'background' => 'white', 'foreground' => 'black'}
21
-
22
- * Add more generic grouping of preferences than with just other records, e.g.
23
-
24
- user.preferred_color('cars')
25
-
26
- * Remove support for an options hash when specifying :for associations for preference
27
-
28
- *0.0.1* (May 10th, 2008)
29
-
30
- * Initial public release