validates_zipcode 0.2.4 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 433bed9455e92a8d15ee319afaf7e40f25eb188af84f8a480691a3f5ba030f2d
4
- data.tar.gz: 625157e0787d574631dd74b82d47c550105831dcd542e296b598a40fe9ff533f
3
+ metadata.gz: da88fce714c50ac27abe1f64ce191dd48e274627db7a1499fec7a303a717ea08
4
+ data.tar.gz: 4ffc0f1f1435f9a16a41fe99e2124c2694cd014d46a98751fa1fc0fc203222c9
5
5
  SHA512:
6
- metadata.gz: 427e1f62ff4cffe6a37d35cc5258b4f456442c59acf17779aa4c3e90e9b836bc12dbf095f17f8569eaabfe7d3fecee0311f7a9e87b26d608256dd6976627dc40
7
- data.tar.gz: 16af43886485c7444d8c305f135a8b8112b3bcfd99738543144295d3df5df98b44c31ee87084ddb419ea942f13f511a70517f18e2880ee24623087b12728cadd
6
+ metadata.gz: de68bd2086e4ff55b2da3848ae25f1d051dd066fb1afcdc517c8a191382ec7b1379256724a537ab7b7d4e129b2915896c72d6a73c4c2c31c80b14d9280599102
7
+ data.tar.gz: d1d76356f263fcfda47ff0c6bb33e55df6a1fd2ecdc8c87d7c0d976ccd54362e9c49a9a23722834ebd52dbf87e6ad89fdab4619e3cc96eddaa7c36935331cd2b
@@ -5,9 +5,12 @@ inherit_from:
5
5
  # - enabled.yml
6
6
  # - disabled.yml
7
7
 
8
+ require:
9
+ - rubocop-rails
10
+
8
11
  # Common configuration.
9
12
  AllCops:
10
- TargetRubyVersion: 2.3
13
+ TargetRubyVersion: 2.4
11
14
 
12
15
  TargetRailsVersion: 4.2
13
16
 
@@ -58,7 +61,7 @@ Layout/AccessModifierIndentation:
58
61
  - indent
59
62
 
60
63
  # Align the elements of a hash literal if they span more than one line.
61
- Layout/AlignHash:
64
+ Layout/HashAlignment:
62
65
  # Alignment of entries using hash rocket as separator. Valid values are:
63
66
  #
64
67
  # key - left alignment of keys
@@ -126,7 +129,7 @@ Layout/AlignHash:
126
129
  Style/Alias:
127
130
  Enabled: false
128
131
 
129
- Layout/AlignParameters:
132
+ Layout/ParameterAlignment:
130
133
  # Alignment of parameters in multi-line method calls.
131
134
  #
132
135
  # The `with_first_parameter` style aligns the following lines along the same
@@ -227,20 +230,6 @@ Style/BlockDelimiters:
227
230
  - proc
228
231
  - it
229
232
 
230
- Style/BracesAroundHashParameters:
231
- EnforcedStyle: no_braces
232
- SupportedStyles:
233
- # The `braces` style enforces braces around all method parameters that are
234
- # hashes.
235
- - braces
236
- # The `no_braces` style checks that the last parameter doesn't have braces
237
- # around it.
238
- - no_braces
239
- # The `context_dependent` style checks that the last parameter doesn't have
240
- # braces around it, but requires braces if the second to last parameter is
241
- # also a hash literal.
242
- - context_dependent
243
-
244
233
  # Indentation of `when`.
245
234
  Layout/CaseIndentation:
246
235
  SupportedStyles:
@@ -387,25 +376,18 @@ Layout/EmptyLinesAroundModuleBody:
387
376
  - empty_lines
388
377
  - no_empty_lines
389
378
 
390
- Style/FileName:
379
+ Naming/FileName:
391
380
  # File names listed in AllCops:Include are excluded by default. Add extra
392
381
  # excludes here.
393
382
  Exclude: []
394
383
 
395
384
  Layout/FirstParameterIndentation:
396
- EnforcedStyle: special_for_inner_method_call_in_parentheses
385
+ EnforcedStyle: consistent
397
386
  SupportedStyles:
398
387
  # The first parameter should always be indented one step more than the
399
388
  # preceding line.
400
389
  - consistent
401
- # The first parameter should normally be indented one step more than the
402
- # preceding line, but if it's a parameter for a method call that is itself
403
- # a parameter in a method call, then the inner parameter should be indented
404
- # relative to the inner method.
405
- - special_for_inner_method_call
406
- # Same as special_for_inner_method_call except that the special rule only
407
- # applies if the outer method call encloses its arguments in parentheses.
408
- - special_for_inner_method_call_in_parentheses
390
+ - align_parentheses
409
391
 
410
392
  Style/EmptyMethod:
411
393
  EnforcedStyle: expanded
@@ -439,11 +421,9 @@ Style/FormatStringToken:
439
421
  - template
440
422
 
441
423
  Style/FrozenStringLiteralComment:
442
- EnforcedStyle: when_needed
424
+ EnforcedStyle: always
443
425
  SupportedStyles:
444
- # `when_needed` will add the frozen string literal comment to files
445
- # only when the `TargetRubyVersion` is set to 2.3+.
446
- - when_needed
426
+ - always_true
447
427
  # `always` will always add the frozen string literal comment to a file
448
428
  # regardless of the Ruby version or if `freeze` or `<<` are called on a
449
429
  # string literal. If you run code against multiple versions of Ruby, it is
@@ -483,7 +463,7 @@ Layout/IndentationWidth:
483
463
  Width: 2
484
464
 
485
465
  # Checks the indentation of the first key in a hash literal.
486
- Layout/IndentHash:
466
+ Layout/FirstHashElementIndentation:
487
467
  # The value `special_inside_parentheses` means that hash literals with braces
488
468
  # that have their opening brace on the same line as a surrounding opening
489
469
  # round parenthesis, shall have their first key indented relative to the
@@ -532,7 +512,7 @@ Style/MethodDefParentheses:
532
512
  - require_parentheses
533
513
  - require_no_parentheses
534
514
 
535
- Style/MethodName:
515
+ Naming/MethodName:
536
516
  EnforcedStyle: snake_case
537
517
  SupportedStyles:
538
518
  - snake_case
@@ -569,14 +549,14 @@ Style/PercentQLiterals:
569
549
  - lower_case_q # Use %q when possible, %Q when necessary
570
550
  - upper_case_q # Always use %Q
571
551
 
572
- Style/PredicateName:
552
+ Naming/PredicateName:
573
553
  # Predicate name prefices.
574
554
  NamePrefix:
575
555
  - is_
576
556
  - has_
577
557
  - have_
578
558
  # Predicate name prefices that should be removed.
579
- NamePrefixBlacklist:
559
+ ForbiddenPrefixes:
580
560
  - is_
581
561
  - has_
582
562
  - have_
@@ -694,7 +674,7 @@ Style/SymbolProc:
694
674
  IgnoredMethods:
695
675
  - respond_to
696
676
 
697
- Layout/TrailingBlankLines:
677
+ Layout/TrailingEmptyLines:
698
678
  EnforcedStyle: final_newline
699
679
  SupportedStyles:
700
680
  - final_newline
@@ -756,7 +736,7 @@ Style/TrivialAccessors:
756
736
  # Commonly used in DSLs
757
737
  AllowDSLWriters: false
758
738
  IgnoreClassMethods: false
759
- Whitelist:
739
+ AllowedMethods:
760
740
  - to_ary
761
741
  - to_a
762
742
  - to_c
@@ -775,7 +755,7 @@ Style/TrivialAccessors:
775
755
  - to_s
776
756
  - to_sym
777
757
 
778
- Style/VariableName:
758
+ Naming/VariableName:
779
759
  EnforcedStyle: snake_case
780
760
  SupportedStyles:
781
761
  - snake_case
@@ -825,7 +805,7 @@ Metrics/CyclomaticComplexity:
825
805
  Max: 6
826
806
 
827
807
  # Second-wave metric. Disabled now to prevent noise.
828
- Metrics/LineLength:
808
+ Layout/LineLength:
829
809
  Enabled: false
830
810
  Max: 120
831
811
  # To make it possible to copy or click on URIs in the code, we allow lines
@@ -856,7 +836,7 @@ Lint/AssignmentInCondition:
856
836
  AllowSafeAssignment: true
857
837
 
858
838
  # Align ends correctly.
859
- Lint/EndAlignment:
839
+ Layout/EndAlignment:
860
840
  # The value `keyword` means that `end` should be aligned with the matching
861
841
  # keyword (if, while, etc.).
862
842
  # The value `variable` means that in assignments, `end` should be aligned
@@ -869,7 +849,7 @@ Lint/EndAlignment:
869
849
  - start_of_line
870
850
  AutoCorrect: false
871
851
 
872
- Lint/DefEndAlignment:
852
+ Layout/DefEndAlignment:
873
853
  # The value `def` means that `end` should be aligned with the def keyword.
874
854
  # The value `start_of_line` means that `end` should be aligned with method
875
855
  # calls like `private`, `public`, etc, if present in front of the `def`
@@ -7,10 +7,10 @@ cache: bundler
7
7
  bundler_args: --jobs 3 --retry 3
8
8
 
9
9
  before_install:
10
- - "travis_retry gem update --system"
11
- - "travis_retry gem install bundler"
10
+ - 'travis_retry gem update --system'
11
+ - 'travis_retry gem install bundler'
12
12
 
13
- script: "bundle exec rake"
13
+ script: 'bundle exec rake'
14
14
 
15
15
  rvm:
16
16
  - 2.4.9
@@ -2,6 +2,15 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## 0.3.0
6
+
7
+ - Adds zipcode formatting feature ~ @aiomaster
8
+ - Drops support for EoL Rails < 4.2 and Ruby < 2.4. ~ @dgilperez
9
+
10
+ ## 0.2.5
11
+
12
+ - Allows for a custom message passed to the validator ~ @andychongyz
13
+
5
14
  ## 0.2.4
6
15
 
7
16
  - Fixes LV postal code format
data/README.md CHANGED
@@ -4,13 +4,14 @@ Adds zipcode / postal code validation support to Rails (ActiveModel), considerin
4
4
 
5
5
  ``ValidatesZipcode`` currently support **233 country codes**. Regex data taken from several sources, being the main source the [CLDR](http://unicode.org/cldr/trac/browser/tags/release-27-d05/common/supplemental/postalCodeData.xml) database (release 27, around 159). Any other country's postal code will validate without errors.
6
6
 
7
- ``ValidatesZipcode`` supports Rails >= 4.2 and Ruby >= 2.0. It could probably work unsupported in Rails 3.2 and Ruby 1.9.3 as well. Truffleruby is also tested, but no reports of working in production apps for now.
7
+ ``ValidatesZipcode`` supports Rails >= 4.2 and Ruby >= 2.4. This gem could work in Rails 3.2 and Ruby 1.9.3 as well, yet unsupported; try v0.2 series if having trouble with later versions. Truffleruby is also tested, but no reports of working in production apps for now.
8
8
 
9
9
  ## Installation
10
10
 
11
11
  Add this line to your application's Gemfile:
12
-
13
- gem 'validates_zipcode'
12
+ ```ruby
13
+ gem 'validates_zipcode'
14
+ ```
14
15
 
15
16
  And then execute:
16
17
 
@@ -22,23 +23,56 @@ Or install it yourself as:
22
23
 
23
24
  ## Usage
24
25
 
25
- validates_zipcode :zipcode
26
+ ### With ActiveModel::Validations
27
+
28
+ ```ruby
29
+ validates_zipcode :zipcode
26
30
 
27
- validates :zipcode, zipcode: true
31
+ validates :zipcode, zipcode: true
32
+ ```
28
33
 
29
34
  ``ValidatesZipcode`` expects the model to have an attribute called ``country_alpha2`` to contain the country code.
30
35
  You can provide your own country_code using ``:country_code`` option, or specify which attribute contains this information
31
36
  using ``:country_code_attribute`` option.
32
37
 
33
- validates :zipcode, zipcode: { country_code: :es }
38
+ ```ruby
39
+ validates :zipcode, zipcode: { country_code: :es }
34
40
 
35
- validates :zipcode, zipcode: { country_code_attribute: :my_country_code_column }
41
+ validates :zipcode, zipcode: { country_code_attribute: :my_country_code_column }
42
+ ```
36
43
 
37
44
  If you need to localize the error message, just add this to your I18n locale file:
38
45
 
39
- errors:
40
- messages:
41
- invalid_zipcode: Your zipcode error message.
46
+ ```yaml
47
+ errors:
48
+ messages:
49
+ invalid_zipcode: Your zipcode error message.
50
+ ```
51
+
52
+ ### Without ActiveModel::Validations
53
+
54
+ ```ruby
55
+ ValidatesZipcode.valid?('93108', 'ES')
56
+ # => true
57
+ ```
58
+
59
+ ### Formatting
60
+
61
+ This gem can also be used for formatting zipcodes according to country specific rules.
62
+
63
+ ```ruby
64
+ ValidatesZipcode.format('Sw1A 2aA', 'UK')
65
+ # => 'SW1A 2AA'
66
+ ```
67
+
68
+ If the zipcode is not valid an exception is raised.
69
+
70
+ ```ruby
71
+ ValidatesZipcode.format('Sw1A 2aA', 'FR')
72
+ # => raises ValidatesZipcode::InvalidZipcodeError
73
+ ```
74
+
75
+ At the moment not every country is supported. See [lib/validates_zipcode/formatter.rb](lib/validates_zipcode/formatter.rb) to find all available countries.
42
76
 
43
77
  ## Contributing
44
78
 
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  # This file was generated by Appraisal
2
3
 
3
- source "https://rubygems.org"
4
+ source 'https://rubygems.org'
4
5
 
5
- gem "activemodel", "~> 4.2.0"
6
+ gem 'activemodel', '~> 4.2.0'
6
7
 
7
- gemspec path: "../"
8
+ gemspec path: '../'
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- validates_zipcode (0.2.4)
5
- activemodel (>= 3.2.0)
4
+ validates_zipcode (0.3.0)
5
+ activemodel (>= 4.2.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -19,13 +19,20 @@ GEM
19
19
  bundler
20
20
  rake
21
21
  thor (>= 0.14.0)
22
+ ast (2.4.0)
22
23
  builder (3.2.3)
23
24
  concurrent-ruby (1.1.4)
24
25
  diff-lcs (1.3)
25
26
  i18n (0.9.5)
26
27
  concurrent-ruby (~> 1.0)
27
28
  minitest (5.11.3)
28
- rake (12.2.1)
29
+ parallel (1.19.1)
30
+ parser (2.7.1.2)
31
+ ast (~> 2.4.0)
32
+ rack (2.2.2)
33
+ rainbow (3.0.0)
34
+ rake (13.0.1)
35
+ rexml (3.2.4)
29
36
  rspec (3.8.0)
30
37
  rspec-core (~> 3.8.0)
31
38
  rspec-expectations (~> 3.8.0)
@@ -39,10 +46,26 @@ GEM
39
46
  diff-lcs (>= 1.2.0, < 2.0)
40
47
  rspec-support (~> 3.8.0)
41
48
  rspec-support (3.8.0)
49
+ rubocop (0.84.0)
50
+ parallel (~> 1.10)
51
+ parser (>= 2.7.0.1)
52
+ rainbow (>= 2.2.2, < 4.0)
53
+ rexml
54
+ rubocop-ast (>= 0.0.3)
55
+ ruby-progressbar (~> 1.7)
56
+ unicode-display_width (>= 1.4.0, < 2.0)
57
+ rubocop-ast (0.0.3)
58
+ parser (>= 2.7.0.1)
59
+ rubocop-rails (2.5.2)
60
+ activesupport
61
+ rack (>= 1.1)
62
+ rubocop (>= 0.72.0)
63
+ ruby-progressbar (1.10.1)
42
64
  thor (0.20.3)
43
65
  thread_safe (0.3.6)
44
66
  tzinfo (1.2.5)
45
67
  thread_safe (~> 0.1)
68
+ unicode-display_width (1.7.0)
46
69
 
47
70
  PLATFORMS
48
71
  ruby
@@ -51,9 +74,11 @@ DEPENDENCIES
51
74
  activemodel (~> 4.2.0)
52
75
  appraisal
53
76
  bundler
54
- rake (~> 12.2.1)
77
+ rake (>= 12.3.3)
55
78
  rspec
79
+ rubocop
80
+ rubocop-rails
56
81
  validates_zipcode!
57
82
 
58
83
  BUNDLED WITH
59
- 2.0.1
84
+ 2.1.4
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  # This file was generated by Appraisal
2
3
 
3
- source "https://rubygems.org"
4
+ source 'https://rubygems.org'
4
5
 
5
- gem "activemodel", "~> 5.2.0"
6
+ gem 'activemodel', '~> 5.2.0'
6
7
 
7
- gemspec path: "../"
8
+ gemspec path: '../'
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- validates_zipcode (0.2.4)
5
- activemodel (>= 3.2.0)
4
+ validates_zipcode (0.3.0)
5
+ activemodel (>= 4.2.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -18,12 +18,19 @@ GEM
18
18
  bundler
19
19
  rake
20
20
  thor (>= 0.14.0)
21
+ ast (2.4.0)
21
22
  concurrent-ruby (1.1.4)
22
23
  diff-lcs (1.3)
23
24
  i18n (1.5.3)
24
25
  concurrent-ruby (~> 1.0)
25
26
  minitest (5.11.3)
26
- rake (12.2.1)
27
+ parallel (1.19.1)
28
+ parser (2.7.1.2)
29
+ ast (~> 2.4.0)
30
+ rack (2.2.2)
31
+ rainbow (3.0.0)
32
+ rake (13.0.1)
33
+ rexml (3.2.4)
27
34
  rspec (3.8.0)
28
35
  rspec-core (~> 3.8.0)
29
36
  rspec-expectations (~> 3.8.0)
@@ -37,10 +44,26 @@ GEM
37
44
  diff-lcs (>= 1.2.0, < 2.0)
38
45
  rspec-support (~> 3.8.0)
39
46
  rspec-support (3.8.0)
47
+ rubocop (0.84.0)
48
+ parallel (~> 1.10)
49
+ parser (>= 2.7.0.1)
50
+ rainbow (>= 2.2.2, < 4.0)
51
+ rexml
52
+ rubocop-ast (>= 0.0.3)
53
+ ruby-progressbar (~> 1.7)
54
+ unicode-display_width (>= 1.4.0, < 2.0)
55
+ rubocop-ast (0.0.3)
56
+ parser (>= 2.7.0.1)
57
+ rubocop-rails (2.5.2)
58
+ activesupport
59
+ rack (>= 1.1)
60
+ rubocop (>= 0.72.0)
61
+ ruby-progressbar (1.10.1)
40
62
  thor (0.20.3)
41
63
  thread_safe (0.3.6)
42
64
  tzinfo (1.2.5)
43
65
  thread_safe (~> 0.1)
66
+ unicode-display_width (1.7.0)
44
67
 
45
68
  PLATFORMS
46
69
  ruby
@@ -49,9 +72,11 @@ DEPENDENCIES
49
72
  activemodel (~> 5.2.0)
50
73
  appraisal
51
74
  bundler
52
- rake (~> 12.2.1)
75
+ rake (>= 12.3.3)
53
76
  rspec
77
+ rubocop
78
+ rubocop-rails
54
79
  validates_zipcode!
55
80
 
56
81
  BUNDLED WITH
57
- 2.0.1
82
+ 2.1.4
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  # This file was generated by Appraisal
2
3
 
3
- source "https://rubygems.org"
4
+ source 'https://rubygems.org'
4
5
 
5
- gem "activemodel", "~> 5.2.0"
6
+ gem 'activemodel', '~> 5.2.0'
6
7
 
7
- gemspec path: "../"
8
+ gemspec path: '../'
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- validates_zipcode (0.2.4)
5
- activemodel (>= 3.2.0)
4
+ validates_zipcode (0.3.0)
5
+ activemodel (>= 4.2.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -18,12 +18,19 @@ GEM
18
18
  bundler
19
19
  rake
20
20
  thor (>= 0.14.0)
21
+ ast (2.4.0)
21
22
  concurrent-ruby (1.1.5)
22
23
  diff-lcs (1.3)
23
24
  i18n (1.6.0)
24
25
  concurrent-ruby (~> 1.0)
25
26
  minitest (5.11.3)
26
- rake (12.2.1)
27
+ parallel (1.19.1)
28
+ parser (2.7.1.2)
29
+ ast (~> 2.4.0)
30
+ rack (2.2.2)
31
+ rainbow (3.0.0)
32
+ rake (13.0.1)
33
+ rexml (3.2.4)
27
34
  rspec (3.8.0)
28
35
  rspec-core (~> 3.8.0)
29
36
  rspec-expectations (~> 3.8.0)
@@ -37,10 +44,26 @@ GEM
37
44
  diff-lcs (>= 1.2.0, < 2.0)
38
45
  rspec-support (~> 3.8.0)
39
46
  rspec-support (3.8.0)
47
+ rubocop (0.84.0)
48
+ parallel (~> 1.10)
49
+ parser (>= 2.7.0.1)
50
+ rainbow (>= 2.2.2, < 4.0)
51
+ rexml
52
+ rubocop-ast (>= 0.0.3)
53
+ ruby-progressbar (~> 1.7)
54
+ unicode-display_width (>= 1.4.0, < 2.0)
55
+ rubocop-ast (0.0.3)
56
+ parser (>= 2.7.0.1)
57
+ rubocop-rails (2.5.2)
58
+ activesupport
59
+ rack (>= 1.1)
60
+ rubocop (>= 0.72.0)
61
+ ruby-progressbar (1.10.1)
40
62
  thor (0.20.3)
41
63
  thread_safe (0.3.6)
42
64
  tzinfo (1.2.5)
43
65
  thread_safe (~> 0.1)
66
+ unicode-display_width (1.7.0)
44
67
 
45
68
  PLATFORMS
46
69
  ruby
@@ -49,9 +72,11 @@ DEPENDENCIES
49
72
  activemodel (~> 5.2.0)
50
73
  appraisal
51
74
  bundler
52
- rake (~> 12.2.1)
75
+ rake (>= 12.3.3)
53
76
  rspec
77
+ rubocop
78
+ rubocop-rails
54
79
  validates_zipcode!
55
80
 
56
81
  BUNDLED WITH
57
- 2.0.2
82
+ 2.1.4
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  # This file was generated by Appraisal
2
3
 
3
- source "https://rubygems.org"
4
+ source 'https://rubygems.org'
4
5
 
5
- gem "activemodel", github: "rails/rails"
6
+ gem 'activemodel', github: 'rails/rails'
6
7
 
7
- gemspec path: "../"
8
+ gemspec path: '../'
@@ -14,8 +14,8 @@ GIT
14
14
  PATH
15
15
  remote: ..
16
16
  specs:
17
- validates_zipcode (0.2.2)
18
- activemodel (>= 3.2.0)
17
+ validates_zipcode (0.3.0)
18
+ activemodel (>= 4.2.0)
19
19
 
20
20
  GEM
21
21
  remote: https://rubygems.org/
@@ -24,12 +24,19 @@ GEM
24
24
  bundler
25
25
  rake
26
26
  thor (>= 0.14.0)
27
+ ast (2.4.0)
27
28
  concurrent-ruby (1.1.5)
28
29
  diff-lcs (1.3)
29
30
  i18n (1.6.0)
30
31
  concurrent-ruby (~> 1.0)
31
32
  minitest (5.11.3)
32
- rake (12.2.1)
33
+ parallel (1.19.1)
34
+ parser (2.7.1.2)
35
+ ast (~> 2.4.0)
36
+ rack (2.2.2)
37
+ rainbow (3.0.0)
38
+ rake (13.0.1)
39
+ rexml (3.2.4)
33
40
  rspec (3.8.0)
34
41
  rspec-core (~> 3.8.0)
35
42
  rspec-expectations (~> 3.8.0)
@@ -43,10 +50,26 @@ GEM
43
50
  diff-lcs (>= 1.2.0, < 2.0)
44
51
  rspec-support (~> 3.8.0)
45
52
  rspec-support (3.8.0)
53
+ rubocop (0.84.0)
54
+ parallel (~> 1.10)
55
+ parser (>= 2.7.0.1)
56
+ rainbow (>= 2.2.2, < 4.0)
57
+ rexml
58
+ rubocop-ast (>= 0.0.3)
59
+ ruby-progressbar (~> 1.7)
60
+ unicode-display_width (>= 1.4.0, < 2.0)
61
+ rubocop-ast (0.0.3)
62
+ parser (>= 2.7.0.1)
63
+ rubocop-rails (2.5.2)
64
+ activesupport
65
+ rack (>= 1.1)
66
+ rubocop (>= 0.72.0)
67
+ ruby-progressbar (1.10.1)
46
68
  thor (0.20.3)
47
69
  thread_safe (0.3.6)
48
70
  tzinfo (1.2.5)
49
71
  thread_safe (~> 0.1)
72
+ unicode-display_width (1.7.0)
50
73
  zeitwerk (2.1.6)
51
74
 
52
75
  PLATFORMS
@@ -56,9 +79,11 @@ DEPENDENCIES
56
79
  activemodel!
57
80
  appraisal
58
81
  bundler
59
- rake (~> 12.2.1)
82
+ rake (>= 12.3.3)
60
83
  rspec
84
+ rubocop
85
+ rubocop-rails
61
86
  validates_zipcode!
62
87
 
63
88
  BUNDLED WITH
64
- 2.0.1
89
+ 2.1.4
@@ -1,13 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
  require 'validates_zipcode/railtie' if defined?(Rails)
3
3
  require 'validates_zipcode/cldr_regex_collection'
4
+ require 'validates_zipcode/invalid_zipcode_error'
4
5
  require 'validates_zipcode/validator'
5
6
  require 'validates_zipcode/helper_methods'
6
7
  require 'validates_zipcode/version'
7
8
  require 'validates_zipcode/zipcode'
9
+ require 'validates_zipcode/formatter'
8
10
 
9
11
  module ValidatesZipcode
10
- def self.valid?(zipcode, country_alpha2, options = {})
11
- ValidatesZipcode::Zipcode.new(options.merge(zipcode: zipcode, country_alpha2: country_alpha2)).valid?
12
+ def self.valid?(*args)
13
+ build_zipcode(*args).valid?
14
+ end
15
+
16
+ def self.format(*args)
17
+ build_zipcode(*args).format
18
+ end
19
+
20
+ def self.build_zipcode(zipcode, country_alpha2, options = {})
21
+ ValidatesZipcode::Zipcode.new(options.merge(zipcode: zipcode, country_alpha2: country_alpha2))
12
22
  end
13
23
  end
@@ -0,0 +1,38 @@
1
+ module ValidatesZipcode
2
+ class Formatter
3
+
4
+ ZIPCODES_TRANSFORMATIONS = {
5
+ AT: ->(z) { z.scan(/\d/).join },
6
+ CZ: ->(z) { z.scan(/\d/).insert(3, ' ').join },
7
+ DE: ->(z) { z.scan(/\d/).join.rjust(5, "0") },
8
+ GB: ->(z) { z.upcase.scan(/[A-Z0-9]/).insert(-4, ' ').join },
9
+ NL: ->(z) { z.upcase.scan(/[A-Z0-9]/).insert(4, ' ').join },
10
+ PL: ->(z) { z.scan(/\d/).insert(2, '-').join },
11
+ SK: :CZ,
12
+ UK: :GB,
13
+ US: ->(z) {
14
+ digits = z.scan(/\d/)
15
+ digits.insert(5, '-') if digits.count > 5
16
+ digits.join
17
+ }
18
+ }
19
+
20
+ def initialize(args = {})
21
+ @zipcode = args.fetch(:zipcode).to_s
22
+ @country_alpha2 = args.fetch(:country_alpha2).to_s.upcase.to_sym
23
+ end
24
+
25
+ def format
26
+ transformation = ZIPCODES_TRANSFORMATIONS[@country_alpha2]
27
+ case transformation
28
+ when Proc
29
+ transformation.call(@zipcode)
30
+ when Symbol
31
+ ZIPCODES_TRANSFORMATIONS[transformation].call(@zipcode)
32
+ else
33
+ @zipcode.strip
34
+ end
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ module ValidatesZipcode
3
+ class InvalidZipcodeError < RuntimeError
4
+ end
5
+ end
@@ -21,7 +21,7 @@ module ValidatesZipcode
21
21
  @country_code = options.fetch(:country_code, nil)
22
22
  @country_code_attribute = options.fetch(:country_code_attribute, :country_alpha2)
23
23
  @excluded_country_codes = options.fetch(:excluded_country_codes, [])
24
-
24
+ @message = options.fetch(:message, nil)
25
25
  super
26
26
  end
27
27
 
@@ -32,9 +32,8 @@ module ValidatesZipcode
32
32
  excluded_country_codes: @excluded_country_codes }
33
33
 
34
34
  unless ValidatesZipcode::Zipcode.new(options).valid?
35
- record.errors.add(attribute, :invalid_zipcode, message: I18n.t('errors.messages.invalid_zipcode',
36
- value: value,
37
- default: 'Zipcode is invalid'))
35
+ message = @message || I18n.t('errors.messages.invalid_zipcode', value: value, default: 'Zipcode is invalid')
36
+ record.errors.add(attribute, :invalid_zipcode, message: message)
38
37
  end
39
38
  end
40
39
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module ValidatesZipcode
3
- VERSION = '0.2.4'
3
+ VERSION = '0.3.0'
4
4
  end
@@ -16,6 +16,11 @@ module ValidatesZipcode
16
16
  end
17
17
  alias_method :validate, :valid?
18
18
 
19
+ def format
20
+ raise InvalidZipcodeError, "invalid zipcode #{@zipcode} for country #{@country_alpha2.to_s.upcase}" unless valid?
21
+ Formatter.new(zipcode: @zipcode, country_alpha2: @country_alpha2).format
22
+ end
23
+
19
24
  private
20
25
 
21
26
  def regexp
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ describe ValidatesZipcode::Formatter, '#format' do
5
+ context 'Czech' do
6
+ it { check_format('CZ', '12000' => '120 00') }
7
+ it { check_format(:cz, '721 00' => '721 00') }
8
+ end
9
+
10
+ context 'Germany' do
11
+ it { check_format('DE', 1309 => '01309') }
12
+ end
13
+
14
+ context 'Netherlands' do
15
+ it { check_format('NL', '1000ap' => '1000 AP') }
16
+ it { check_format('nl', '9104-BR' => '9104 BR') }
17
+ it { check_format(:nl, '6832_AM' => '6832 AM') }
18
+ end
19
+
20
+ context 'UK' do
21
+ it { check_format('UK', 'CB224RG' => 'CB22 4RG') }
22
+ it { check_format('UK', 'Sw1A 2aA' => 'SW1A 2AA') }
23
+ it { check_format('GB', 'id11qd' => 'ID1 1QD') }
24
+ end
25
+
26
+ context 'US' do
27
+ it { check_format('US', '221 62 – 10 10' => '22162-1010') }
28
+ it { check_format('US', '22162' => '22162') }
29
+ it { check_format('US', '22162 1010' => '22162-1010') }
30
+ end
31
+
32
+ def check_format(country, formatting)
33
+ from_zip, to_zip = formatting.first
34
+ expect(::ValidatesZipcode::Formatter.new(zipcode: from_zip, country_alpha2: country).format).to eq(to_zip)
35
+ end
36
+ end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
  require 'spec_helper'
3
3
 
4
+ # NOTE: Spain has the full case specs.
5
+ # Do not apply all checks to all countries for suite speed.
4
6
  describe ValidatesZipcode, '#validate_each' do
5
7
  context 'Argentina' do
6
8
  it 'does not add errors with a valid zipcode' do
@@ -265,6 +267,8 @@ describe ValidatesZipcode, '#validate_each' do
265
267
  ['1234', '12345-12345', 'D0D0D0', 'invalid_zip'].each do |zipcode|
266
268
  record = build_record(zipcode, 'ES')
267
269
  zipcode_should_be_invalid(record, zipcode)
270
+ record.errors.clear
271
+ zipcode_should_be_invalid_with_custom_message(record, zipcode)
268
272
  end
269
273
  end
270
274
  end
@@ -409,6 +413,16 @@ describe ValidatesZipcode, '.valid?' do
409
413
  end
410
414
  end
411
415
 
416
+ describe ValidatesZipcode, '.format' do
417
+ it "formats valid zipcodes" do
418
+ expect(ValidatesZipcode.format('Ka9 2dj', 'UK')).to eq('KA9 2DJ')
419
+ end
420
+
421
+ it "raises for invalid zipcodes" do
422
+ expect { ValidatesZipcode.format('KA9 1tr', 'DE') }.to raise_error(ValidatesZipcode::InvalidZipcodeError)
423
+ end
424
+ end
425
+
412
426
  def zipcode_should_be_valid(record, options = {})
413
427
  ValidatesZipcode::Validator.new(options.merge(attributes: :zipcode)).validate(record)
414
428
 
@@ -422,6 +436,14 @@ def zipcode_should_be_invalid(record, _zipcode, options = {})
422
436
  expect(record.errors.messages[:zipcode]).to include 'Zipcode is invalid'
423
437
  end
424
438
 
439
+ def zipcode_should_be_invalid_with_custom_message(record, _zipcode, options = {})
440
+ custom_message = 'is really wrong'
441
+ ValidatesZipcode::Validator.new(options.merge(attributes: :zipcode, message: custom_message)).validate(record)
442
+
443
+ expect(record.errors.size).to eq 1
444
+ expect(record.errors.messages[:zipcode]).to include custom_message
445
+ end
446
+
425
447
  def build_record(zipcode, country_alpha2)
426
448
  ValidationDummyClass.new.tap do |object|
427
449
  object.country_alpha2 = country_alpha2
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path('../lib', __FILE__)
3
+ lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'validates_zipcode/version'
6
6
 
@@ -17,14 +17,16 @@ Gem::Specification.new do |s|
17
17
  s.files = `git ls-files -z`.split("\x0")
18
18
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
19
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
20
- s.require_paths = ['lib']
20
+ s.require_paths = %w[lib]
21
21
 
22
- s.required_ruby_version = '>= 1.9.3'
22
+ s.required_ruby_version = '>= 2.4'
23
23
 
24
- s.add_dependency 'activemodel', '>= 3.2.0'
24
+ s.add_dependency 'activemodel', '>= 4.2.0'
25
25
 
26
26
  s.add_development_dependency 'appraisal'
27
27
  s.add_development_dependency 'bundler'
28
- s.add_development_dependency 'rake', '~> 12.2.1'
28
+ s.add_development_dependency 'rake', '>= 12.3.3'
29
29
  s.add_development_dependency 'rspec'
30
+ s.add_development_dependency 'rubocop'
31
+ s.add_development_dependency 'rubocop-rails'
30
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validates_zipcode
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Gil
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-26 00:00:00.000000000 Z
11
+ date: 2020-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.2.0
19
+ version: 4.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 3.2.0
26
+ version: 4.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: appraisal
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 12.2.1
61
+ version: 12.3.3
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 12.2.1
68
+ version: 12.3.3
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,34 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-rails
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  description: Adds zipcode validation methods to ActiveModel considering different
84
112
  country zipcode formats.
85
113
  email:
@@ -110,11 +138,14 @@ files:
110
138
  - gemfiles/rails_edge.gemfile.lock
111
139
  - lib/validates_zipcode.rb
112
140
  - lib/validates_zipcode/cldr_regex_collection.rb
141
+ - lib/validates_zipcode/formatter.rb
113
142
  - lib/validates_zipcode/helper_methods.rb
143
+ - lib/validates_zipcode/invalid_zipcode_error.rb
114
144
  - lib/validates_zipcode/railtie.rb
115
145
  - lib/validates_zipcode/validator.rb
116
146
  - lib/validates_zipcode/version.rb
117
147
  - lib/validates_zipcode/zipcode.rb
148
+ - spec/format_zipcode_spec.rb
118
149
  - spec/spec_helper.rb
119
150
  - spec/validates_zipcode_spec.rb
120
151
  - validates_zipcode.gemspec
@@ -130,7 +161,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
161
  requirements:
131
162
  - - ">="
132
163
  - !ruby/object:Gem::Version
133
- version: 1.9.3
164
+ version: '2.4'
134
165
  required_rubygems_version: !ruby/object:Gem::Requirement
135
166
  requirements:
136
167
  - - ">="
@@ -142,5 +173,6 @@ signing_key:
142
173
  specification_version: 4
143
174
  summary: Localizable zipcode validation for Rails.
144
175
  test_files:
176
+ - spec/format_zipcode_spec.rb
145
177
  - spec/spec_helper.rb
146
178
  - spec/validates_zipcode_spec.rb