addressing 0.2.0 → 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 +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +8 -0
- data/lib/addressing/address_format.rb +21 -0
- data/lib/addressing/field_override.rb +33 -0
- data/lib/addressing/model.rb +14 -8
- data/lib/addressing/version.rb +1 -1
- data/lib/addressing.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b46d807aa97c2e089222447115d7862105246f37f850e65f824f8599af5d714d
|
4
|
+
data.tar.gz: b2f82f834eb10ead8e14e9b63083093b94a27bdec7a157a7102ee6c01eb15e6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb86d0f70a24db611837a597b3f8846a545f9c16d0df2099d6baab0235cc27ff0730b97f55b138b1d946715e3a9a671b6af23544ba59851d6f10b1cde428d9e5
|
7
|
+
data.tar.gz: 4b4c5ce9982c8faaf53a6eab5117b8250d17fc3e11ffb34e24e3765ad931b5ad1fbd4031633a132c23c7c4d489131ff5364af22a0d695acad02e349b23414d25
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
All notable changes to `addressing` will be documented in this file.
|
4
4
|
|
5
|
+
## 0.3.0 (04-04-2022)
|
6
|
+
|
7
|
+
- Allow field validation to be overridden
|
8
|
+
- Only verify address when one of the field changes
|
9
|
+
- Allow used address fields to be configured
|
10
|
+
|
5
11
|
## 0.2.0 (25-02-2022)
|
6
12
|
|
7
13
|
- Add ActiveRecord validations
|
data/README.md
CHANGED
@@ -182,6 +182,14 @@ class User < ApplicationRecord
|
|
182
182
|
end
|
183
183
|
```
|
184
184
|
|
185
|
+
For performance, the address is only verified if at least one of the fields changes. Set your own condition with:
|
186
|
+
|
187
|
+
```rb
|
188
|
+
class User < ApplicationRecord
|
189
|
+
validates_address if: -> { something_changed? }, ...
|
190
|
+
end
|
191
|
+
```
|
192
|
+
|
185
193
|
## Changelog
|
186
194
|
|
187
195
|
Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.
|
@@ -141,4 +141,25 @@ module Addressing
|
|
141
141
|
fields & used_fields
|
142
142
|
end
|
143
143
|
end
|
144
|
+
|
145
|
+
class AddressFormatHelper
|
146
|
+
class << self
|
147
|
+
# Gets the required fields.
|
148
|
+
#
|
149
|
+
# Applies field overrides to the required fields
|
150
|
+
# specified by the address format.
|
151
|
+
def required_fields(address_format, field_overrides)
|
152
|
+
required_fields = address_format.required_fields
|
153
|
+
required_fields = required_fields - field_overrides.optional_fields
|
154
|
+
required_fields = required_fields - field_overrides.hidden_fields
|
155
|
+
|
156
|
+
if field_overrides.required_fields
|
157
|
+
required_fields = required_fields + field_overrides.required_fields
|
158
|
+
required_fields = required_fields.uniq
|
159
|
+
end
|
160
|
+
|
161
|
+
required_fields
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
144
165
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Addressing
|
4
|
+
class FieldOverride < Enum
|
5
|
+
HIDDEN = "hidden"
|
6
|
+
OPTIONAL = "optional"
|
7
|
+
REQUIRED = "required"
|
8
|
+
end
|
9
|
+
|
10
|
+
class FieldOverrides
|
11
|
+
attr_reader :hidden_fields, :optional_fields, :required_fields
|
12
|
+
|
13
|
+
def initialize(definition)
|
14
|
+
AddressField.assert_all_exist(definition.keys)
|
15
|
+
FieldOverride.assert_all_exist(definition.values)
|
16
|
+
|
17
|
+
@hidden_fields = []
|
18
|
+
@optional_fields = []
|
19
|
+
@required_fields = []
|
20
|
+
|
21
|
+
definition.each do |field, override|
|
22
|
+
case override
|
23
|
+
when FieldOverride::HIDDEN
|
24
|
+
@hidden_fields << field
|
25
|
+
when FieldOverride::OPTIONAL
|
26
|
+
@optional_fields << field
|
27
|
+
when FieldOverride::REQUIRED
|
28
|
+
@required_fields << field
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/addressing/model.rb
CHANGED
@@ -2,16 +2,20 @@
|
|
2
2
|
|
3
3
|
module Addressing
|
4
4
|
module Model
|
5
|
-
def validates_address_format(
|
5
|
+
def validates_address_format(
|
6
|
+
fields: [:country_code, :administrative_area, :locality, :dependent_locality, :postal_code, :sorting_code, :address_line1, :address_line2, :organization, :given_name, :additional_name, :family_name, :locale], field_overrides: nil, **options)
|
7
|
+
fields = Array(fields)
|
8
|
+
field_overrides ||= FieldOverrides.new({})
|
9
|
+
|
10
|
+
options[:if] ||= -> { fields.any? { |f| changes.key?(f.to_s) } } unless options[:unless]
|
11
|
+
|
6
12
|
class_eval do
|
7
13
|
validate :verify_address_format, **options
|
8
14
|
|
9
15
|
define_method :verify_address_format do
|
10
|
-
|
11
|
-
|
12
|
-
end
|
16
|
+
values = fields.each_with_object({}) { |f, v| v[f] = send(f) }
|
17
|
+
address = Address.new(**values)
|
13
18
|
|
14
|
-
address = Address.new(**fields)
|
15
19
|
return unless address.country_code.present?
|
16
20
|
|
17
21
|
address_format = AddressFormat.get(address.country_code)
|
@@ -23,14 +27,16 @@ module Addressing
|
|
23
27
|
address_format.used_fields
|
24
28
|
|
25
29
|
# Validate the presence of required fields.
|
26
|
-
address_format.
|
30
|
+
AddressFormatHelper::required_fields(address_format, field_overrides).each do |required_field|
|
27
31
|
next unless address.send(required_field).blank?
|
28
32
|
|
29
33
|
errors.add(required_field, "should not be blank")
|
30
34
|
end
|
31
35
|
|
36
|
+
used_fields = address_format.used_fields - field_overrides.hidden_fields
|
37
|
+
|
32
38
|
# Validate the absence of unused fields.
|
33
|
-
unused_fields = AddressField.all.values -
|
39
|
+
unused_fields = AddressField.all.values - used_fields
|
34
40
|
unused_fields.each do |unused_field|
|
35
41
|
next if address.send(unused_field).blank?
|
36
42
|
|
@@ -41,7 +47,7 @@ module Addressing
|
|
41
47
|
subdivisions = verify_subdivisions(address, address_format)
|
42
48
|
|
43
49
|
# Validate postal code.
|
44
|
-
verify_postal_code(address.postal_code, subdivisions, address_format) if
|
50
|
+
verify_postal_code(address.postal_code, subdivisions, address_format) if used_fields.include?(AddressField::POSTAL_CODE)
|
45
51
|
end
|
46
52
|
|
47
53
|
define_method :verify_subdivisions do |address, address_format|
|
data/lib/addressing/version.rb
CHANGED
data/lib/addressing.rb
CHANGED
@@ -12,6 +12,7 @@ require "addressing/administrative_area_type"
|
|
12
12
|
require "addressing/country"
|
13
13
|
require "addressing/default_formatter"
|
14
14
|
require "addressing/dependent_locality_type"
|
15
|
+
require "addressing/field_override"
|
15
16
|
require "addressing/lazy_subdivisions"
|
16
17
|
require "addressing/locale"
|
17
18
|
require "addressing/locality_type"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: addressing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robin van der Vleuten
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email: robinvdvleuten@gmail.com
|
@@ -689,6 +689,7 @@ files:
|
|
689
689
|
- lib/addressing/default_formatter.rb
|
690
690
|
- lib/addressing/dependent_locality_type.rb
|
691
691
|
- lib/addressing/enum.rb
|
692
|
+
- lib/addressing/field_override.rb
|
692
693
|
- lib/addressing/lazy_subdivisions.rb
|
693
694
|
- lib/addressing/locale.rb
|
694
695
|
- lib/addressing/locality_type.rb
|