acts-as-optionable 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -110,7 +110,6 @@ This is useful, for instance, for passing a set of options into a liquid templat
110
110
  * Thinking about finding a way to optionally associate the option with an asset table. This would be useful for allowing user defined stylesheet options referencing S3 assets.
111
111
  * Add in a way to return an option value straight away.
112
112
  * Assign multiple settings at a time.
113
-
114
-
113
+ * Add a type or hint storage on options (i.e. this option is for a color)
115
114
 
116
115
  Copyright (c) 2010 Brendon Murphy, released under the MIT license
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.2.0
@@ -16,9 +16,9 @@ module ActiveRecord
16
16
 
17
17
  module IntanceMethods
18
18
  # Store an option persistently and override default option
19
- def set_option(name, value)
20
- option = get_stored_option(name) || options.build(:name => name.to_s)
21
- return if new_option_matches_current?(option)
19
+ def set_option(name, value, kind = nil)
20
+ option = get_stored_option(name) || options.build(:name => name.to_s, :value => value, :kind => kind)
21
+ return if new_option_matches_current?(option, value)
22
22
  option.value = value
23
23
  ret = option.save!
24
24
  options(:reload)
@@ -55,6 +55,7 @@ module ActiveRecord
55
55
  options = {}
56
56
  options_and_defaults.each do |name, option|
57
57
  options[name.to_s] = option.value
58
+ options["#{name.to_s}_kind"] = option.kind
58
59
  end
59
60
  OpenStruct.new(options)
60
61
  end
@@ -77,8 +78,9 @@ module ActiveRecord
77
78
  end
78
79
 
79
80
  # Check if a new value provided is the same as the default option.
80
- def new_option_matches_current?(option)
81
- (!option.new_record? && option.value == value) || (get_default_option(name).value == value rescue nil)
81
+ def new_option_matches_current?(option, new_value)
82
+ default_value = ( get_default_option(option.name).value rescue nil )
83
+ ( option.value == default_value ) || ( option.value == new_value && ! option.new_record? )
82
84
  end
83
85
 
84
86
  # Return the stored options as a hash, with the option names as keys.
@@ -5,7 +5,7 @@ module ActiveRecord
5
5
  module ClassMethods
6
6
  # Setup a default value at the class level.
7
7
  def specify_option(option_name, opts = {})
8
- optionable_specified_options[option_name.to_s] = Option.new_readonly(:name => option_name.to_s, :default => opts[:default])
8
+ optionable_specified_options[option_name.to_s] = Option.new_readonly(:name => option_name.to_s, :default => opts[:default], :kind => opts[:kind])
9
9
  end
10
10
 
11
11
  # Returns a hash of options specified at the class level
@@ -39,7 +39,7 @@ module ActiveRecord
39
39
  @instance_specified_options = {}
40
40
  opts.each do |option_name, attributes|
41
41
  attributes.symbolize_keys!
42
- @instance_specified_options[option_name.to_s] = Option.new_readonly(:name => option_name, :default => attributes[:default])
42
+ @instance_specified_options[option_name.to_s] = Option.new_readonly(:name => option_name, :default => attributes[:default], :kind => attributes[:kind])
43
43
  end
44
44
  end
45
45
  end
@@ -9,7 +9,7 @@ class SpecifiedMixin < Mixin
9
9
  acts_as_optionable
10
10
 
11
11
  specify_option :foo, :default => "FOOFOO"
12
- specify_option :bar, :default => "BARBAR"
12
+ specify_option :bar, :default => "BARBAR", :kind => "example"
13
13
  end
14
14
 
15
15
  class NoSpecifiedMixin < Mixin
@@ -23,16 +23,16 @@ def setup_db
23
23
  ActiveRecord::Base.logger
24
24
  ActiveRecord::Schema.define do
25
25
  create_table :mixins do |t|
26
- t.string :value
26
+ t.string :stuff
27
27
  end
28
28
 
29
29
  create_table :options do |t|
30
30
  t.string :name
31
31
  t.string :value
32
+ t.string :kind
32
33
  t.references :optionable, :polymorphic => true
33
34
  t.timestamps
34
35
  end
35
-
36
36
  end
37
37
  end
38
38
 
@@ -70,6 +70,15 @@ describe "ActsAsOptionable" do
70
70
  @optionable.get_option(:foo).value.should == "FOOFOO"
71
71
  @optionable.get_option(:bar).value.should == "BARBAR"
72
72
  end
73
+
74
+ it "should not have a kind if none was specified" do
75
+ @optionable.get_option(:foo).kind.should be_blank
76
+ end
77
+
78
+ it "should be able to specify the kind of option" do
79
+ @optionable.get_option(:bar).kind.should == "example"
80
+ end
81
+
73
82
 
74
83
  it "should not mix specifications across unrelated classes" do
75
84
  class Foobar < Mixin
@@ -105,6 +114,16 @@ describe "ActsAsOptionable" do
105
114
  @optionable.get_option(:buzz).value.should == "BUZZBUZZ"
106
115
  end
107
116
 
117
+ it "should have the kind if set" do
118
+ @optionable.instance_specified_options = @options_template.merge(:kind_is_set => {:default => "kind_is_set", :kind => "example_kind" })
119
+ @optionable.get_option(:kind_is_set).kind.should == "example_kind"
120
+ end
121
+
122
+ it "should not have the kind if none was provided" do
123
+ @optionable.instance_specified_options = @options_template
124
+ @optionable.get_option(:fizz).kind.should be_blank
125
+ end
126
+
108
127
  it "should return readonly records for the default options" do
109
128
  @optionable.instance_specified_options = @options_template
110
129
  @optionable.get_option(:fizz).should be_readonly
@@ -175,6 +194,26 @@ describe "ActsAsOptionable" do
175
194
  @optionable.set_option(@key, false)
176
195
  @optionable.get_option(@key).value.should be_false
177
196
  end
197
+
198
+ it "should allowing storing the option kind" do
199
+ @optionable.set_option(@key, "red", "color")
200
+ @optionable.get_option(@key).kind.should == "color"
201
+ end
202
+
203
+ it "should not update the option if it already matches current" do
204
+ @optionable.set_option(@key, "red", "color")
205
+ timestamp = @optionable.get_option(@key).updated_at.dup
206
+ sleep 1 # not worth a dependency for 1 time check
207
+ @optionable.set_option(@key, "red", "color")
208
+ @optionable.get_option(@key).updated_at.should == timestamp
209
+ end
210
+
211
+ it "should not set the option if it matches default" do
212
+ @optionable.get_option(:foo).value.should == "FOOFOO"
213
+ lambda {
214
+ @optionable.set_option(:foo, "FOOFOO")
215
+ }.should_not change { Option.count }
216
+ end
178
217
  end
179
218
 
180
219
  describe "getting options" do
@@ -241,6 +280,12 @@ describe "ActsAsOptionable" do
241
280
  option_values.bar.should == "BARBAR"
242
281
  end
243
282
 
283
+ it "should have option_name_kind methods set" do
284
+ option_values = @optionable.options_values_struct
285
+ option_values.foo_kind.should be_blank
286
+ option_values.bar_kind.should == "example"
287
+ end
288
+
244
289
  it "should contain both set and default options" do
245
290
  @optionable.instance_specified_options = @options_template
246
291
  @optionable.set_option("example_option", 99)
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
- - 1
9
- version: 0.1.1
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Brendon Murphy
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-23 00:00:00 -07:00
17
+ date: 2010-04-26 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies: []
20
20