formeze 1.6.0 → 1.7.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
@@ -63,9 +63,9 @@ your own initialization logic).
63
63
  Detecting errors
64
64
  ----------------
65
65
 
66
- Formeze distinguishes between user errors (which are expected in the normal
67
- running of your application), and key/value errors (which most likely indicate
68
- either developer error, or form tampering).
66
+ Formeze distinguishes between validation errors (which are expected in the
67
+ normal running of your application), and key/value errors (which most likely
68
+ indicate either developer error, or form tampering).
69
69
 
70
70
  For the latter case, the `parse` method that formeze provides will raise a
71
71
  Formeze::KeyError or a Formeze::ValueError exception if the structure of the
@@ -73,7 +73,10 @@ form data does not match the field definitions.
73
73
 
74
74
  After calling `parse` you can check that the form is valid by calling the
75
75
  `#valid?` method. If it isn't you can call the `errors` method which will
76
- return an array of error messages to display to the user.
76
+ return an array of error messages to display to the end user.
77
+
78
+ You can also use `errors_on?` and `errors_on` to check for and select error
79
+ messages specific to a single field.
77
80
 
78
81
 
79
82
  Field options
data/formeze.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'formeze'
3
- s.version = '1.6.0'
3
+ s.version = '1.7.0'
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.authors = ['Tim Craft']
6
6
  s.email = ['mail@timcraft.com']
@@ -8,6 +8,8 @@ Gem::Specification.new do |s|
8
8
  s.description = 'A little library for handling form data/input'
9
9
  s.summary = 'See description'
10
10
  s.files = Dir.glob('{lib,spec}/**/*') + %w(README.md Rakefile.rb formeze.gemspec)
11
+ s.add_development_dependency('rake', ['>= 0.9.3'])
11
12
  s.add_development_dependency('i18n', ['~> 0.6.0'])
13
+ s.add_development_dependency('minitest', ['>= 4.2.0']) if RUBY_VERSION == '1.8.7'
12
14
  s.require_path = 'lib'
13
15
  end
data/lib/formeze.rb CHANGED
@@ -37,7 +37,7 @@ module Formeze
37
37
  end
38
38
 
39
39
  def error(i18n_key, default)
40
- translate(i18n_key, scope: [:formeze, :errors], default: default)
40
+ translate(i18n_key, :scope => [:formeze, :errors], :default => default)
41
41
  end
42
42
 
43
43
  def key
@@ -49,7 +49,7 @@ module Formeze
49
49
  end
50
50
 
51
51
  def label
52
- @options.fetch(:label) { translate(name, scope: [:formeze, :labels], default: Label.new(name)) }
52
+ @options.fetch(:label) { translate(name, :scope => [:formeze, :labels], :default => Label.new(name)) }
53
53
  end
54
54
 
55
55
  def required?
@@ -182,7 +182,7 @@ module Formeze
182
182
 
183
183
  class ValueError < StandardError; end
184
184
 
185
- class UserError < StandardError; end
185
+ class ValidationError < StandardError; end
186
186
 
187
187
  module InstanceMethods
188
188
  def parse(encoded_form_data)
@@ -241,6 +241,13 @@ module Formeze
241
241
  field_errors[field_name]
242
242
  end
243
243
 
244
+ def to_hash
245
+ self.class.fields.inject({}) do |hash, field|
246
+ hash[field.name] = send(field.name)
247
+ hash
248
+ end
249
+ end
250
+
244
251
  private
245
252
 
246
253
  def field_defined?(field)
@@ -258,7 +265,7 @@ module Formeze
258
265
  end
259
266
 
260
267
  def error!(message, field_name = nil)
261
- error = UserError.new(message)
268
+ error = ValidationError.new(message)
262
269
 
263
270
  errors << error
264
271
 
@@ -288,9 +295,9 @@ module Formeze
288
295
  form.extend ClassMethods
289
296
 
290
297
  if on_rails?
291
- form.field(:utf8, key_required: false)
298
+ form.field(:utf8, :key_required => false)
292
299
 
293
- form.field(:authenticity_token, key_required: false)
300
+ form.field(:authenticity_token, :key_required => false)
294
301
  end
295
302
  end
296
303
 
data/spec/formeze_spec.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'minitest/autorun'
2
-
3
- require_relative '../lib/formeze'
2
+ require 'formeze'
4
3
  require 'i18n'
5
4
 
6
5
  class FormWithField < Formeze::Form
@@ -83,6 +82,12 @@ describe 'FormWithField after parsing valid input' do
83
82
  errors.must_be_empty
84
83
  end
85
84
  end
85
+
86
+ describe 'to_hash method' do
87
+ it 'should return a hash containing the field name and its value' do
88
+ @form.to_hash.must_equal({:title => 'Untitled'})
89
+ end
90
+ end
86
91
  end
87
92
 
88
93
  describe 'FormWithField after parsing blank input' do
@@ -150,7 +155,7 @@ describe 'FormWithField parse class method' do
150
155
  end
151
156
 
152
157
  class FormWithOptionalField < Formeze::Form
153
- field :title, required: false
158
+ field :title, :required => false
154
159
  end
155
160
 
156
161
  describe 'FormWithOptionalField after parsing blank input' do
@@ -167,7 +172,7 @@ describe 'FormWithOptionalField after parsing blank input' do
167
172
  end
168
173
 
169
174
  class FormWithFieldThatCanHaveMultipleLines < Formeze::Form
170
- field :description, multiline: true
175
+ field :description, :multiline => true
171
176
  end
172
177
 
173
178
  describe 'FormWithFieldThatCanHaveMultipleLines after parsing input containing newlines' do
@@ -184,7 +189,7 @@ describe 'FormWithFieldThatCanHaveMultipleLines after parsing input containing n
184
189
  end
185
190
 
186
191
  class FormWithCharacterLimitedField < Formeze::Form
187
- field :title, char_limit: 16
192
+ field :title, :char_limit => 16
188
193
  end
189
194
 
190
195
  describe 'FormWithCharacterLimitedField after parsing input with too many characters' do
@@ -201,7 +206,7 @@ describe 'FormWithCharacterLimitedField after parsing input with too many charac
201
206
  end
202
207
 
203
208
  class FormWithWordLimitedField < Formeze::Form
204
- field :title, word_limit: 2
209
+ field :title, :word_limit => 2
205
210
  end
206
211
 
207
212
  describe 'FormWithWordLimitedField after parsing input with too many words' do
@@ -218,7 +223,7 @@ describe 'FormWithWordLimitedField after parsing input with too many words' do
218
223
  end
219
224
 
220
225
  class FormWithFieldThatMustMatchPattern < Formeze::Form
221
- field :number, pattern: /\A\d+\z/
226
+ field :number, :pattern => /\A\d+\z/
222
227
  end
223
228
 
224
229
  describe 'FormWithFieldThatMustMatchPattern after parsing input that matches the pattern' do
@@ -248,7 +253,7 @@ describe 'FormWithFieldThatMustMatchPattern after parsing input that does not ma
248
253
  end
249
254
 
250
255
  class FormWithFieldThatCanHaveMultipleValues < Formeze::Form
251
- field :colour, multiple: true
256
+ field :colour, :multiple => true
252
257
  end
253
258
 
254
259
  describe 'FormWithFieldThatCanHaveMultipleValues' do
@@ -305,6 +310,12 @@ describe 'FormWithFieldThatCanHaveMultipleValues after parsing input with multip
305
310
  @form.valid?.must_equal(true)
306
311
  end
307
312
  end
313
+
314
+ describe 'to_hash method' do
315
+ it 'should return a hash containing the field name and its array value' do
316
+ @form.to_hash.must_equal({:colour => %w(black white)})
317
+ end
318
+ end
308
319
  end
309
320
 
310
321
  describe 'FormWithFieldThatCanHaveMultipleValues after parsing input with no values' do
@@ -328,7 +339,7 @@ describe 'FormWithFieldThatCanHaveMultipleValues after parsing input with no val
328
339
  end
329
340
 
330
341
  class FormWithFieldThatCanOnlyHaveSpecifiedValues < Formeze::Form
331
- field :answer, values: %w(yes no)
342
+ field :answer, :values => %w(yes no)
332
343
  end
333
344
 
334
345
  describe 'FormWithFieldThatCanOnlyHaveSpecifiedValues after parsing input with an invalid value' do
@@ -346,7 +357,7 @@ end
346
357
 
347
358
  class FormWithGuardCondition < Formeze::Form
348
359
  field :account_name
349
- field :account_vat_number, defined_if: proc { @business_account }
360
+ field :account_vat_number, :defined_if => proc { @business_account }
350
361
 
351
362
  def initialize(business_account)
352
363
  @business_account = business_account
@@ -392,8 +403,8 @@ end
392
403
 
393
404
  class FormWithHaltingCondition < Formeze::Form
394
405
  field :delivery_address
395
- field :same_address, values: %w(yes no)
396
- field :billing_address, defined_unless: :same_address?
406
+ field :same_address, :values => %w(yes no)
407
+ field :billing_address, :defined_unless => :same_address?
397
408
 
398
409
  def same_address?
399
410
  same_address == 'yes'
@@ -446,7 +457,7 @@ describe 'FormWithCustomValidation after parsing invalid input' do
446
457
  end
447
458
 
448
459
  class FormWithOptionalKey < Formeze::Form
449
- field :accept_terms, values: %w(true), key_required: false
460
+ field :accept_terms, :values => %w(true), :key_required => false
450
461
  end
451
462
 
452
463
  describe 'FormWithOptionalKey after parsing input without the key' do
@@ -463,7 +474,7 @@ describe 'FormWithOptionalKey after parsing input without the key' do
463
474
  end
464
475
 
465
476
  class FormWithOptionalFieldThatCanOnlyHaveSpecifiedValues < Formeze::Form
466
- field :size, required: false, values: %w(S M L XL)
477
+ field :size, :required => false, :values => %w(S M L XL)
467
478
  end
468
479
 
469
480
  describe 'FormWithOptionalFieldThatCanOnlyHaveSpecifiedValues after parsing blank input' do
@@ -514,7 +525,7 @@ describe 'I18n integration' do
514
525
  end
515
526
 
516
527
  it 'should be possible to override the default error messages' do
517
- I18n.backend.store_translations :en, {formeze: {errors: {required: 'cannot be blank'}}}
528
+ I18n.backend.store_translations :en, {:formeze => {:errors => {:required => 'cannot be blank'}}}
518
529
 
519
530
  form = FormWithField.new
520
531
  form.parse('title=')
@@ -522,7 +533,7 @@ describe 'I18n integration' do
522
533
  end
523
534
 
524
535
  it 'should be possible to set labels globally' do
525
- I18n.backend.store_translations :en, {formeze: {labels: {title: 'TITLE'}}}
536
+ I18n.backend.store_translations :en, {:formeze => {:labels => {:title => 'TITLE'}}}
526
537
 
527
538
  form = FormWithField.new
528
539
  form.parse('title=')
@@ -531,8 +542,8 @@ describe 'I18n integration' do
531
542
  end
532
543
 
533
544
  class FormWithScrubbedFields < Formeze::Form
534
- field :postcode, scrub: [:strip, :squeeze, :upcase], pattern: /\A[A-Z0-9]{2,4} [A-Z0-9]{3}\z/
535
- field :bio, scrub: [:strip, :squeeze_lines], multiline: true
545
+ field :postcode, :scrub => [:strip, :squeeze, :upcase], :pattern => /\A[A-Z0-9]{2,4} [A-Z0-9]{3}\z/
546
+ field :bio, :scrub => [:strip, :squeeze_lines], :multiline => true
536
547
  end
537
548
 
538
549
  describe 'FormWithScrubbedFields' do
@@ -541,7 +552,7 @@ describe 'FormWithScrubbedFields' do
541
552
  form = FormWithScrubbedFields.new
542
553
  form.parse('postcode=++sw1a+++1aa&bio=My+name+is+Cookie+Monster.%0A%0A%0A%0AI+LOVE+COOKIES!!!!%0A%0A%0A%0A')
543
554
  form.postcode.must_equal('SW1A 1AA')
544
- form.bio.count(?\n).must_equal(2)
555
+ form.bio.count("\n").must_equal(2)
545
556
  form.valid?.must_equal(true)
546
557
  end
547
558
  end
@@ -560,8 +571,19 @@ class FormClassWithExplicitSetupCall
560
571
  end
561
572
 
562
573
  describe 'FormClassWithExplicitSetupCall' do
574
+ before do
575
+ @form_class = FormClassWithExplicitSetupCall
576
+ end
577
+
563
578
  it 'includes the formeze class methods and instance methods' do
564
- FormClassWithExplicitSetupCall.singleton_class.must_include(Formeze::ClassMethods)
565
- FormClassWithExplicitSetupCall.must_include(Formeze::InstanceMethods)
579
+ singleton_class = if @form.respond_to?(:singleton_class)
580
+ @form_class.singleton_class
581
+ else
582
+ (class << @form_class; self; end)
583
+ end
584
+
585
+ singleton_class.must_include(Formeze::ClassMethods)
586
+
587
+ @form_class.must_include(Formeze::InstanceMethods)
566
588
  end
567
589
  end
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.6.0
4
+ version: 1.7.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-25 00:00:00.000000000 Z
12
+ date: 2012-11-13 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.9.3
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.9.3
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: i18n
16
32
  requirement: !ruby/object:Gem::Requirement