hstore_radio_buttons 0.0.1 → 0.0.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/README.md CHANGED
@@ -152,9 +152,17 @@ To display the radio button set on the form, you have three options:
152
152
  <%= form_for @person do |f|>
153
153
  <%= f.hstore_radio_button('gender') %>
154
154
  ...
155
- <%= f.hstore_radio_button('favorite barn animal') %>
155
+ <%= f.hstore_radio_button(:favorite_barn_animal) %>
156
156
  <% end %>
157
157
 
158
+ You can use the string or a symbolized form. These are synonymous:
159
+
160
+ <%= f.hstore_radio_button('gender') %>
161
+ <%= f.hstore_radio_button(:gender) %>
162
+ or
163
+ <%= f.hstore_radio_button('Favorite Barn Animal') %>
164
+ <%= f.hstore_radio_button(:favorite_barn_animal) %>
165
+
158
166
  #### Use a helper to display all the radio buttons
159
167
 
160
168
  <%= form_for @person do |f|>
@@ -167,7 +175,10 @@ To display the radio button set on the form, you have three options:
167
175
  <%= f.label(:gender) %>
168
176
  <%= f.radio_button(:gender, 'male') %>
169
177
  <%= f.label(:gender, "Male", :value => 'male') %>
170
- ...etc...
178
+ ...
179
+ <%= f.radio_button(:favorite_barn_animal, 'sheep') %>
180
+ <%= f.label(:favorite_barn_animal, "Sheep", :value => 'sheep') %>
181
+ ...
171
182
  <% end %>
172
183
 
173
184
  If you want to avoid the duplication that the above introduces, you can
@@ -181,6 +192,15 @@ use the _options method that is added to your model:
181
192
  <% end %>
182
193
  <% end %>
183
194
 
195
+ ##### Method names when using Rails helpers
196
+ If you use the Rails helpers, you'll need to use the correct name for
197
+ the attribute. Use the lowercase, underscored version of your button set
198
+ name:
199
+
200
+ <%= f.radio_button(:favorite_barn_animal, 'sheep') %> #works!
201
+ <%= f.radio_button('favorite_barn_animal', 'cow') %> #works!
202
+ <%= f.radio_button('Favorite Barn Animal', 'pig') %> #fail
203
+
184
204
  ### Controlling helper-created output
185
205
 
186
206
  By default the `hstore_radio_button` or `hstore_radio_buttons` helpers
@@ -223,6 +243,18 @@ buttons as 'selected' when the form is loaded later.
223
243
  TODO: It'd be nice to have default values for a set.
224
244
  TODO: Formtastic integration
225
245
 
246
+ ### Thanks, etc.
247
+
248
+ Many code ideas were 'borrowed' from [Vestal
249
+ Versions](https://github.com/laserlemon/vestal_versions/) and [LRD]
250
+ (https://github.com/LRDesign). Testing and design ideas were also
251
+ contributed by [Davin Lagerroos](https://github.com/davinlagerroos).
252
+
253
+ ### Versions
254
+
255
+ 0.0.2 - Fixes to inconsistency in how you call buttons by name.
256
+ 0.0.1 - Initial
257
+
226
258
  ## Contributing
227
259
 
228
260
  1. Fork it
@@ -6,6 +6,8 @@ require 'hstore_radio_buttons/version'
6
6
  require 'hstore_radio_buttons/configuration'
7
7
  require 'hstore_radio_buttons/button_options'
8
8
  require 'hstore_radio_buttons/button_set'
9
+ require 'hstore_radio_buttons/method_namer'
10
+ require 'hstore_radio_buttons/formatter'
9
11
  require 'hstore_radio_buttons/helpers/form_helper'
10
12
 
11
13
  module HstoreRadioButtons
@@ -2,7 +2,7 @@ module HstoreRadioButtons
2
2
  class ButtonOptions
3
3
  attr_accessor :name, :options
4
4
  def initialize(name, options)
5
- self.name = name.gsub(/ /,"_").downcase
5
+ self.name = name
6
6
  self.options = *options
7
7
  end
8
8
  end
@@ -1,32 +1,49 @@
1
1
  module HstoreRadioButtons
2
2
  class ButtonSet
3
3
  def initialize(button_definition, model)
4
- setter_method = "#{button_definition.name}=".to_sym
5
- getter_method = button_definition.name.to_sym
6
- options_method = "#{button_definition.name}_options".to_sym
4
+ namer = HstoreRadioButtons::MethodNamer.new(button_definition.name)
7
5
 
8
- model.send(:define_method, getter_method) {
6
+ create_instance_methods(button_definition, model, namer)
7
+ create_getters_on_class(model, namer)
8
+ end
9
+
10
+ private
11
+
12
+ def create_instance_methods(button_definition, model, namer)
13
+ create_getter(button_definition, model, namer)
14
+ create_setter(button_definition, model, namer)
15
+ create_options(button_definition, model, namer)
16
+ end
17
+
18
+ def create_getter(button_definition, model, namer)
19
+ model.send(:define_method, namer.getter) {
9
20
  hstore_data_proxy[button_definition.name]
10
21
  }
22
+ end
11
23
 
12
- model.send(:define_method, setter_method) {|value|
13
- if self.send(options_method).include?(value)
24
+ def create_setter(button_definition, model, namer)
25
+ model.send(:define_method, namer.setter) {|value|
26
+ if self.send(namer.options).include?(value)
14
27
  hstore_data_proxy[button_definition.name] = value
15
28
  else
16
29
  hstore_data_proxy[button_definition.name] = nil
17
30
  end
18
31
  }
32
+ end
19
33
 
20
- model.send(:define_method, options_method) {
34
+ def create_options(button_definition, model, namer)
35
+ model.send(:define_method, namer.options) {
21
36
  button_definition.options
22
37
  }
38
+ end
23
39
 
24
- if !model.instance_variable_defined?(:@hstore_button_names)
25
- model.instance_variable_set(:@hstore_button_names, Set.new)
40
+ def create_getters_on_class(model, namer)
41
+ if !model.instance_variable_defined?(:@hstore_button_getters)
42
+ model.instance_variable_set(:@hstore_button_getters, Set.new)
26
43
  end
27
- all_buttons_on_model = model.send(:instance_variable_get, :@hstore_button_names)
44
+ all_buttons_on_model = model.send(:instance_variable_get, :@hstore_button_getters)
28
45
 
29
- model.send(:instance_variable_set, :@hstore_button_names, all_buttons_on_model << button_definition.name.to_sym)
46
+ model.send(:instance_variable_set, :@hstore_button_getters, all_buttons_on_model << namer.getter)
30
47
  end
31
48
  end
32
49
  end
@@ -0,0 +1,19 @@
1
+ module HstoreRadioButtons
2
+ class Formatter
3
+ def initialize(raw_button_name)
4
+ self.raw_button_name = raw_button_name
5
+ end
6
+
7
+ def to_method
8
+ raw_button_name.to_s.gsub(/ /,"_").downcase
9
+ end
10
+
11
+ def to_title
12
+ raw_button_name.to_s.gsub(/_/," ").titleize
13
+ end
14
+
15
+ private
16
+
17
+ attr_accessor :raw_button_name
18
+ end
19
+ end
@@ -14,17 +14,19 @@ module HstoreRadioButtons::FormBuilder
14
14
 
15
15
  def hstore_radio_button(method, options = {})
16
16
  options[:separator] = (options[:separator] ? options[:separator] : "<br />")
17
- radio_options = object.public_send("#{method}_options".to_sym)
18
- button_set = "#{method.to_s.titleize}#{options[:separator]}"
19
- radio_options.each do |radio_option|
20
- button_set += @template.hstore_radio_button(@object_name, method, radio_option, objectify_options(options))
17
+ methods = HstoreRadioButtons::MethodNamer.new(method)
18
+
19
+ button_set = "#{HstoreRadioButtons::Formatter.new(method).to_title}#{options[:separator]}"
20
+
21
+ object.public_send(methods.options).each do |radio_option|
22
+ button_set += @template.hstore_radio_button(@object_name, methods.getter, radio_option, objectify_options(options))
21
23
  end
22
24
  content_tag(:div, button_set.html_safe).html_safe
23
25
  end
24
26
 
25
27
  def hstore_radio_buttons(options = {})
26
28
  all_buttons = ""
27
- object.class.instance_variable_get(:@hstore_button_names).each do |method|
29
+ object.class.instance_variable_get(:@hstore_button_getters).each do |method|
28
30
  all_buttons += hstore_radio_button(method, options)
29
31
  end
30
32
  all_buttons.html_safe
@@ -0,0 +1,24 @@
1
+ module HstoreRadioButtons
2
+ class MethodNamer
3
+ def initialize(button_name)
4
+ self.button_name = HstoreRadioButtons::Formatter.new(button_name).to_method
5
+ end
6
+
7
+ def setter
8
+ "#{button_name}=".to_sym
9
+ end
10
+
11
+ def getter
12
+ button_name.to_sym
13
+ end
14
+
15
+ def options
16
+ "#{button_name}_options".to_sym
17
+ end
18
+
19
+ private
20
+
21
+ attr_accessor :button_name
22
+
23
+ end
24
+ end
@@ -1,3 +1,3 @@
1
1
  module HstoreRadioButtons
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -1,18 +1,6 @@
1
1
  require_relative '../../test_helper.rb'
2
2
 
3
3
  describe HstoreRadioButtons::ButtonOptions do
4
- describe "#name" do
5
- it "replaces spaces in a name with underscores" do
6
- it = HstoreRadioButtons::ButtonOptions.new('test name', nil)
7
- it.name.must_equal 'test_name'
8
- end
9
-
10
- it "downcases the name" do
11
- it = HstoreRadioButtons::ButtonOptions.new('Test', nil)
12
- it.name.must_equal 'test'
13
- end
14
- end
15
-
16
4
  describe "#options" do
17
5
  it "turns a single option into an array" do
18
6
  it = HstoreRadioButtons::ButtonOptions.new('test', 1)
@@ -3,56 +3,41 @@ require_relative '../../test_helper.rb'
3
3
  describe HstoreRadioButtons::ButtonSet do
4
4
  describe '#initialize' do
5
5
  before :each do
6
- @test_yaml_file_location = './test/support/config/hstore_radio_button_sets.yml'
7
6
  @it = Person.new
8
- config = YAML.load(File.open(@test_yaml_file_location))
9
- @raw_button_definitions = config[@it.class.to_s.downcase]
10
- @button_definitions = []
11
-
12
- @raw_button_definitions.each do |button_definition|
13
- button_options = HstoreRadioButtons::ButtonOptions.new(button_definition[0],button_definition[1])
14
- @button_definitions << button_options
15
- HstoreRadioButtons::ButtonSet.new(button_options,@it.class)
16
- end
7
+ @button_definition = OpenStruct.new({name: 'test name', options: [1,2,3]})
8
+ HstoreRadioButtons::ButtonSet.new(@button_definition,@it.class)
9
+ @method_names = HstoreRadioButtons::MethodNamer.new(@button_definition.name)
17
10
  end
18
11
 
19
12
  it 'adds getters and setters for the button sets defined in the config file' do
20
- @button_definitions.each do |button_definition|
21
- @it.must_respond_to button_definition.name.to_sym
22
- @it.must_respond_to "#{button_definition.name}=".to_sym
23
- end
13
+ @it.must_respond_to @method_names.getter
14
+ @it.must_respond_to @method_names.setter
24
15
  end
25
16
 
26
17
  it "adds a method that returns the button set's options" do
27
- @button_definitions.each do |button_definition|
28
- @it.must_respond_to "#{button_definition.name}_options".to_sym
29
- @it.send("#{button_definition.name}_options".to_sym).must_equal button_definition.options
30
- end
18
+ @it.must_respond_to @method_names.options
19
+ @it.send(@method_names.options).must_equal @button_definition.options
31
20
  end
32
21
 
33
22
  it "defines the setter so that a value not in the set's option is not passed to the hstore" do
34
23
  bad_value = "hackery_nonsense"
35
- @button_definitions.each do |button_definition|
36
- @it.send("#{button_definition.name}=".to_sym, bad_value)
37
- @it.send(button_definition.name.to_sym).must_be_nil
38
- end
24
+ @it.send(@method_names.setter, bad_value)
25
+ @it.send(@method_names.getter).must_be_nil
39
26
  end
40
27
 
41
28
  it 'persists data sent to setters' do
42
- @button_definitions.each do |button_definition|
43
- random_value = button_definition.options.sample
44
- @it.send("#{button_definition.name}=".to_sym, random_value)
45
- @it.send(button_definition.name.to_sym).must_equal random_value
46
- end
29
+ random_value = @button_definition.options.sample
30
+ @it.send(@method_names.setter, random_value)
31
+ @it.send(@method_names.getter).must_equal random_value
47
32
  end
48
33
 
49
34
  it 'allows the use of ActiveModel validation methods' do
50
- @it.class.validates_presence_of(@button_definitions.sample.name)
35
+ @it.class.validates_presence_of(@method_names.getter)
51
36
  @it.valid?.must_equal false
52
37
  end
53
38
 
54
39
  it 'creates a class instance variable that returns the names of all hstore button names' do
55
- @it.class.instance_variable_get(:@hstore_button_names).must_equal @button_definitions.map {|d| d.name.to_sym}.to_set
40
+ @it.class.instance_variable_get(:@hstore_button_getters).must_include :test_name
56
41
  end
57
42
  end
58
43
  end
@@ -18,6 +18,12 @@ class FormBuilderTest < ActionView::TestCase
18
18
  assert it.respond_to?(:hstore_radio_button)
19
19
  end
20
20
 
21
+ test "#hstore_radio_button responds to both symbolized and string forms of button-set names" do
22
+ it = ActionView::Helpers::FormBuilder.new(:person, @person_instance, view, {}, proc {})
23
+ assert_equal it.hstore_radio_button(:gender), it.hstore_radio_button('gender')
24
+ assert_equal it.hstore_radio_button(:favorite_barn_animal), it.hstore_radio_button('Favorite Barn Animal')
25
+ end
26
+
21
27
  test "FormBuilder#hstore_radio_button wraps the whole thing in a div" do
22
28
  view.stubs(:hstore_radio_button).with(any_parameters).returns("")
23
29
  it = ActionView::Helpers::FormBuilder.new(:person, @person_instance, view, {}, proc {})
@@ -53,7 +59,7 @@ class FormBuilderTest < ActionView::TestCase
53
59
  test "#hstore_radio_buttons builds a button set for each button defined in the class" do
54
60
  it = ActionView::Helpers::FormBuilder.new(:person, @person_instance, view, {}, proc {})
55
61
 
56
- all_buttons = Person.instance_variable_get(:@hstore_button_names)
62
+ all_buttons = Person.instance_variable_get(:@hstore_button_getters)
57
63
  expected = ""
58
64
  all_buttons.each do |b|
59
65
  expected += it.hstore_radio_button(b)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hstore_radio_buttons
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-25 00:00:00.000000000 Z
12
+ date: 2013-06-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
- requirement: &70257637365360 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70257637365360
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '3.0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: activesupport
27
- requirement: &70257637364800 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '3.0'
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70257637364800
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '3.0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: actionpack
38
- requirement: &70257637364220 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ~>
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: '3.0'
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *70257637364220
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: activerecord-postgres-hstore
49
- requirement: &70257637363740 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '0'
55
70
  type: :runtime
56
71
  prerelease: false
57
- version_requirements: *70257637363740
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: bundler
60
- requirement: &70257637363060 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ~>
@@ -65,10 +85,15 @@ dependencies:
65
85
  version: '1.3'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70257637363060
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '1.3'
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: rake
71
- requirement: &70257637362480 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
@@ -76,10 +101,15 @@ dependencies:
76
101
  version: '0'
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *70257637362480
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
80
110
  - !ruby/object:Gem::Dependency
81
111
  name: sqlite3
82
- requirement: &70257637361800 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
83
113
  none: false
84
114
  requirements:
85
115
  - - ! '>='
@@ -87,10 +117,15 @@ dependencies:
87
117
  version: '0'
88
118
  type: :development
89
119
  prerelease: false
90
- version_requirements: *70257637361800
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
91
126
  - !ruby/object:Gem::Dependency
92
127
  name: mocha
93
- requirement: &70257637361240 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
94
129
  none: false
95
130
  requirements:
96
131
  - - ! '>='
@@ -98,7 +133,12 @@ dependencies:
98
133
  version: '0'
99
134
  type: :development
100
135
  prerelease: false
101
- version_requirements: *70257637361240
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
102
142
  description: Works with postgres's hstore data type and Rails to let you display/store
103
143
  a collection of radio buttons in an hstore field
104
144
  email:
@@ -120,8 +160,10 @@ files:
120
160
  - lib/hstore_radio_buttons/button_options.rb
121
161
  - lib/hstore_radio_buttons/button_set.rb
122
162
  - lib/hstore_radio_buttons/configuration.rb
163
+ - lib/hstore_radio_buttons/formatter.rb
123
164
  - lib/hstore_radio_buttons/helpers/form_helper.rb
124
165
  - lib/hstore_radio_buttons/hstore_radio_data.rb
166
+ - lib/hstore_radio_buttons/method_namer.rb
125
167
  - lib/hstore_radio_buttons/version.rb
126
168
  - test/lib/hstore_radio_buttons/button_options_test.rb
127
169
  - test/lib/hstore_radio_buttons/button_set_test.rb
@@ -155,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
197
  version: '0'
156
198
  requirements: []
157
199
  rubyforge_project:
158
- rubygems_version: 1.8.16
200
+ rubygems_version: 1.8.25
159
201
  signing_key:
160
202
  specification_version: 3
161
203
  summary: Define a set of radio buttons for a model and then save the perisisted data