formeze 1.1.3 → 1.2.0

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
@@ -122,6 +122,34 @@ field :colour, multiple: true, values: Colour.keys
122
122
  Unlike all the other examples so far, reading the attribute that corresponds
123
123
  to this field will return an array of strings instead of a single string.
124
124
 
125
+ Sometimes you'll only want the field to be defined if some condition is true.
126
+ The condition may depend on the state of other form fields, or some external
127
+ state accessible from the form object. You can do this by specifying either
128
+ the `defined_if` or `defined_unless` options with a proc. Here's an example
129
+ of using the defined_if option:
130
+
131
+ ```ruby
132
+ field :business_name, defined_if: proc { @account.business? }
133
+ ```
134
+
135
+ In this example the `business_name` field will only be defined and validated
136
+ for business accounts. The proc is evaluated in the context of the form object,
137
+ so has full access to instance variables and methods defined on the object.
138
+ Here's an example of using the defined_unless option:
139
+
140
+ ```ruby
141
+ field :same_address, values: %w(true), key_required: false
142
+
143
+ field :billing_address_line_one, defined_unless: proc { same_address? }
144
+
145
+ def same_address?
146
+ same_address == 'true'
147
+ end
148
+ ```
149
+
150
+ In this example, the `billing_address_line_one` field will only be defined
151
+ and validated if the `same_address` checkbox is checked.
152
+
125
153
 
126
154
  Rails usage
127
155
  -----------
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'formeze'
3
- s.version = '1.1.3'
3
+ s.version = '1.2.0'
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.authors = ['Tim Craft']
6
6
  s.email = ['mail@timcraft.com']
@@ -85,21 +85,21 @@ module Formeze
85
85
  def values
86
86
  @options.fetch(:values)
87
87
  end
88
- end
89
88
 
90
- class GuardCondition
91
- attr_reader :block
89
+ def defined_if?
90
+ @options.has_key?(:defined_if)
91
+ end
92
92
 
93
- def initialize(block)
94
- @block = block
93
+ def defined_if
94
+ @options.fetch(:defined_if)
95
95
  end
96
- end
97
96
 
98
- class HaltingCondition
99
- attr_reader :block
97
+ def defined_unless?
98
+ @options.has_key?(:defined_unless)
99
+ end
100
100
 
101
- def initialize(block)
102
- @block = block
101
+ def defined_unless
102
+ @options.fetch(:defined_unless)
103
103
  end
104
104
  end
105
105
 
@@ -159,14 +159,6 @@ module Formeze
159
159
  end
160
160
  end
161
161
 
162
- def guard(&block)
163
- fields << GuardCondition.new(block)
164
- end
165
-
166
- def halts(&block)
167
- fields << HaltingCondition.new(block)
168
- end
169
-
170
162
  def checks
171
163
  @checks ||= []
172
164
  end
@@ -195,11 +187,7 @@ module Formeze
195
187
  form_data = CGI.parse(encoded_form_data)
196
188
 
197
189
  self.class.fields.each do |field|
198
- if field.is_a?(GuardCondition)
199
- instance_eval(&field.block) ? next : break
200
- elsif field.is_a?(HaltingCondition)
201
- instance_eval(&field.block) ? break : next
202
- end
190
+ next unless field_defined?(field)
203
191
 
204
192
  unless form_data.has_key?(field.key)
205
193
  next if field.multiple? || !field.key_required?
@@ -229,6 +217,16 @@ module Formeze
229
217
  end
230
218
  end
231
219
 
220
+ def field_defined?(field)
221
+ if field.defined_if?
222
+ instance_eval(&field.defined_if)
223
+ elsif field.defined_unless?
224
+ !instance_eval(&field.defined_unless)
225
+ else
226
+ true
227
+ end
228
+ end
229
+
232
230
  def errors
233
231
  @errors ||= []
234
232
  end
@@ -313,24 +313,21 @@ class FormWithGuardCondition
313
313
  Formeze.setup(self)
314
314
 
315
315
  field :account_name
316
-
317
- guard { @business_account }
318
-
319
- field :account_vat_number
316
+ field :account_vat_number, defined_if: proc { @business_account }
320
317
 
321
318
  def initialize(business_account)
322
319
  @business_account = business_account
323
320
  end
324
321
  end
325
322
 
326
- describe 'FormWithGuardCondition' do
323
+ describe 'FormWithGuardCondition with business_account set to false' do
327
324
  before do
328
325
  @form = FormWithGuardCondition.new(false)
329
326
  end
330
327
 
331
328
  describe 'parse method' do
332
- it 'should raise an exception when there is an unexpected key' do
333
- proc { @form.parse('account_name=Something&foo=bar') }.must_raise(Formeze::KeyError)
329
+ it 'should raise an exception when the account_vat_number is present' do
330
+ proc { @form.parse('account_name=Something&account_vat_number=123456789') }.must_raise(Formeze::KeyError)
334
331
  end
335
332
  end
336
333
  end
@@ -364,12 +361,8 @@ class FormWithHaltingCondition
364
361
  Formeze.setup(self)
365
362
 
366
363
  field :delivery_address
367
-
368
364
  field :same_address, values: %w(yes no)
369
-
370
- halts { same_address? }
371
-
372
- field :billing_address
365
+ field :billing_address, defined_unless: :same_address?
373
366
 
374
367
  def same_address?
375
368
  same_address == 'yes'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: formeze
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-10 00:00:00.000000000Z
12
+ date: 2012-05-14 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A little library for handling form data/input
15
15
  email:
@@ -43,7 +43,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
43
43
  version: '0'
44
44
  requirements: []
45
45
  rubyforge_project:
46
- rubygems_version: 1.8.10
46
+ rubygems_version: 1.8.16
47
47
  signing_key:
48
48
  specification_version: 3
49
49
  summary: See description