paf 0.3.0 → 0.4.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/README.md +37 -2
- data/lib/paf.rb +1 -1
- data/lib/paf/array_formatter.rb +15 -0
- data/lib/paf/core_ext/array.rb +2 -2
- data/lib/paf/core_ext/string.rb +11 -3
- data/lib/paf/formattable.rb +24 -22
- data/lib/paf/formatter.rb +25 -0
- data/lib/paf/hash_formatter.rb +15 -0
- data/lib/paf/lineable.rb +15 -14
- data/lib/paf/premises.rb +4 -13
- data/lib/paf/premises/common.rb +0 -3
- data/lib/paf/premises/rule000.rb +2 -2
- data/lib/paf/premises/rule001.rb +2 -2
- data/lib/paf/premises/rule010.rb +7 -17
- data/lib/paf/premises/rule011.rb +2 -2
- data/lib/paf/premises/rule101.rb +2 -2
- data/lib/paf/premises/rule110.rb +5 -5
- data/lib/paf/premises/rule111.rb +3 -3
- data/lib/paf/string_formatter.rb +11 -0
- data/lib/paf/thoroughfare_locality.rb +10 -18
- data/lib/paf/version.rb +1 -1
- data/paf.gemspec +1 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b233ff56fedadfea9e1f21508ea7b6fb85f852c1
|
4
|
+
data.tar.gz: 59dbbde56e750c387774368cad006e4d3e4a0a7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c379a989578aa2c9a0398f26dddf50d0cce40d15f0ddc8394e54e24bd7c13c016b30734ff3f2375ff985d63caf707d9b024c8720edade1ac3cccbf7a67b78779
|
7
|
+
data.tar.gz: 7414a214e0a027bffa8c774f595844a208e75db227af5f2338e9e2f80804088f0e50a0ff39c69f2a5e01412582060d39faa36badd96365ebf630abc8a4a18579
|
data/README.md
CHANGED
@@ -23,7 +23,7 @@ Or install it yourself as:
|
|
23
23
|
May be used to format the PAF elements as an array of strings:
|
24
24
|
|
25
25
|
```ruby
|
26
|
-
Paf.
|
26
|
+
Paf.to_a(
|
27
27
|
building_name: '1-2',
|
28
28
|
thoroughfare_name: 'NURSERY',
|
29
29
|
thoroughfare_descriptor: 'LANE',
|
@@ -35,6 +35,25 @@ Paf.format(
|
|
35
35
|
['1-2 NURSERY LANE', 'PENN', 'HIGH WYCOMBE', 'HP10 8LS']
|
36
36
|
```
|
37
37
|
|
38
|
+
Or as a hash of strings:
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
Paf.to_h(
|
42
|
+
building_name: '1-2',
|
43
|
+
thoroughfare_name: 'NURSERY',
|
44
|
+
thoroughfare_descriptor: 'LANE',
|
45
|
+
dependent_locality: 'PENN',
|
46
|
+
post_town: 'HIGH WYCOMBE',
|
47
|
+
postcode: 'HP10 8LS'
|
48
|
+
)
|
49
|
+
|
50
|
+
{
|
51
|
+
lines: ['1-2 NURSERY LANE', 'PENN'],
|
52
|
+
post_town: 'HIGH WYCOMBE',
|
53
|
+
postcode: 'HP10 8LS'
|
54
|
+
}
|
55
|
+
```
|
56
|
+
|
38
57
|
Or as a single string:
|
39
58
|
|
40
59
|
```ruby
|
@@ -61,10 +80,26 @@ paf = Paf.new(
|
|
61
80
|
post_town: 'HIGH WYCOMBE',
|
62
81
|
postcode: 'HP10 8LS'
|
63
82
|
)
|
64
|
-
paf.
|
83
|
+
paf.to_a
|
65
84
|
|
66
85
|
['1-2 NURSERY LANE', 'PENN', 'HIGH WYCOMBE', 'HP10 8LS']
|
67
86
|
|
87
|
+
paf = Paf.new(
|
88
|
+
building_name: '1-2',
|
89
|
+
thoroughfare_name: 'NURSERY',
|
90
|
+
thoroughfare_descriptor: 'LANE',
|
91
|
+
dependent_locality: 'PENN',
|
92
|
+
post_town: 'HIGH WYCOMBE',
|
93
|
+
postcode: 'HP10 8LS'
|
94
|
+
)
|
95
|
+
paf.to_h
|
96
|
+
|
97
|
+
{
|
98
|
+
lines: ['1-2 NURSERY LANE', 'PENN'],
|
99
|
+
post_town: 'HIGH WYCOMBE',
|
100
|
+
postcode: 'HP10 8LS'
|
101
|
+
}
|
102
|
+
|
68
103
|
paf = Paf.new(
|
69
104
|
building_name: '1-2',
|
70
105
|
thoroughfare_name: 'NURSERY',
|
data/lib/paf.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'paf/formatter'
|
2
|
+
|
3
|
+
class Paf
|
4
|
+
# Processing to format a PAF entry as an array
|
5
|
+
class ArrayFormatter < Formatter
|
6
|
+
def format(paf)
|
7
|
+
super(paf)
|
8
|
+
lines.clone.tap do |array|
|
9
|
+
post_attrs.each do |attr|
|
10
|
+
array << send(attr) unless send(attr).vacant?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/paf/core_ext/array.rb
CHANGED
data/lib/paf/core_ext/string.rb
CHANGED
@@ -2,12 +2,20 @@ class Paf
|
|
2
2
|
module CoreExt
|
3
3
|
# Extend the core String class with PAF specific processing
|
4
4
|
module String
|
5
|
-
def
|
5
|
+
def exception?
|
6
6
|
!/^(.|[\d][[:alpha:]]|[\d].*?[\d][[:alpha:]]?)$/.match(self).nil?
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
|
9
|
+
def split_exception?
|
10
|
+
last_word.exception? && /^\d+$/.match(last_word).nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
def last_word
|
14
|
+
split.last
|
15
|
+
end
|
16
|
+
|
17
|
+
def but_last_word
|
18
|
+
self[0...rindex(' ')]
|
11
19
|
end
|
12
20
|
end
|
13
21
|
end
|
data/lib/paf/formattable.rb
CHANGED
@@ -1,47 +1,49 @@
|
|
1
|
-
require 'paf/
|
2
|
-
require 'paf/
|
3
|
-
require 'paf/
|
1
|
+
require 'paf/array_formatter'
|
2
|
+
require 'paf/hash_formatter'
|
3
|
+
require 'paf/string_formatter'
|
4
4
|
|
5
5
|
class Paf
|
6
6
|
# Processing to format a PAF entry
|
7
7
|
module Formattable
|
8
|
+
attr_accessor :formatter, :concatenation_indicator
|
9
|
+
private :concatenation_indicator=
|
10
|
+
|
8
11
|
def self.included(base)
|
12
|
+
base.prepend Initializer
|
9
13
|
base.extend ClassMethods
|
10
|
-
base.class_eval do
|
11
|
-
include Lineable
|
12
|
-
include Premises
|
13
|
-
include ThoroughfareLocality
|
14
|
-
end
|
15
14
|
end
|
16
15
|
private_class_method :included
|
17
16
|
|
17
|
+
# initialize method to be prepended to the including class
|
18
|
+
module Initializer
|
19
|
+
def initialize(*)
|
20
|
+
super if defined? super
|
21
|
+
@formatter ||= Paf::ArrayFormatter.new
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
18
25
|
# Methods to be added to the including class
|
19
26
|
module ClassMethods
|
20
|
-
|
21
|
-
|
22
|
-
|
27
|
+
%i[to_a to_h format].each do |method|
|
28
|
+
define_method method do |args|
|
29
|
+
new(args).send(method)
|
30
|
+
end
|
23
31
|
end
|
24
32
|
|
25
|
-
# Formats a hash of PAF address elements into a string
|
26
33
|
def to_s(*args)
|
27
34
|
return super if args.empty?
|
28
35
|
new(args[0]).to_s
|
29
36
|
end
|
30
37
|
end
|
31
38
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
self.class.post_attrs.each do |attr|
|
36
|
-
array << send(attr) unless send(attr).vacant?
|
39
|
+
{ to_a: :Array, to_h: :Hash, to_s: :String }.each do |key, value|
|
40
|
+
define_method key do
|
41
|
+
Kernel.const_get("Paf::#{value}Formatter").format(self)
|
37
42
|
end
|
38
|
-
array
|
39
43
|
end
|
40
44
|
|
41
|
-
|
42
|
-
|
43
|
-
string = (lines + [post_town]).condense.join(', ')
|
44
|
-
([string] + [postcode]).condense.join('. ')
|
45
|
+
def format
|
46
|
+
formatter.format(self)
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'paf/lineable'
|
2
|
+
|
3
|
+
class Paf
|
4
|
+
# Processing to format a PAF entry
|
5
|
+
class Formatter
|
6
|
+
def self.format(paf)
|
7
|
+
new.format(paf)
|
8
|
+
end
|
9
|
+
|
10
|
+
def format(paf)
|
11
|
+
@paf = paf.clone
|
12
|
+
@paf.extend Lineable
|
13
|
+
end
|
14
|
+
|
15
|
+
def method_missing(method, *args)
|
16
|
+
return @paf.send(method, *args) if @paf.respond_to?(method)
|
17
|
+
return @paf.class.send(method, *args) if @paf.class.respond_to?(method)
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def respond_to_missing?(method_name, include_private = false)
|
22
|
+
@paf.respond_to?(method) || @paf.class.respond_to?(method) || super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'paf/formatter'
|
2
|
+
|
3
|
+
class Paf
|
4
|
+
# Processing to format a PAF entry as a hash
|
5
|
+
class HashFormatter < Formatter
|
6
|
+
def format(paf)
|
7
|
+
super(paf)
|
8
|
+
{}.tap do |hash|
|
9
|
+
([:lines] + post_attrs).each do |attr|
|
10
|
+
hash[attr] = send(attr) unless send(attr).vacant?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/paf/lineable.rb
CHANGED
@@ -1,27 +1,28 @@
|
|
1
|
+
require 'paf/premises'
|
2
|
+
require 'paf/thoroughfare_locality'
|
3
|
+
|
1
4
|
class Paf
|
2
5
|
# Processing to format PAF entry lines
|
3
6
|
module Lineable
|
4
|
-
def self.
|
5
|
-
base.extend
|
7
|
+
def self.extended(base)
|
8
|
+
base.extend Premises
|
9
|
+
base.extend ThoroughfareLocality
|
6
10
|
end
|
7
|
-
private_class_method :included
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
12
|
+
def lines
|
13
|
+
[].tap do |lines|
|
14
|
+
lines_methods.each do |method|
|
15
|
+
value = send(method)
|
16
|
+
(lines << value).flatten! unless value.vacant?
|
17
|
+
end
|
13
18
|
end
|
14
19
|
end
|
15
20
|
|
16
21
|
private
|
17
22
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
value = send(method)
|
22
|
-
(lines << value).flatten! unless value.vacant?
|
23
|
-
end
|
24
|
-
lines
|
23
|
+
def lines_methods
|
24
|
+
self.class.organisation_attrs +
|
25
|
+
%i[po_box premises thoroughfares_and_localities]
|
25
26
|
end
|
26
27
|
end
|
27
28
|
end
|
data/lib/paf/premises.rb
CHANGED
@@ -5,26 +5,17 @@ class Paf
|
|
5
5
|
module Premises
|
6
6
|
include Common
|
7
7
|
|
8
|
-
def self.
|
9
|
-
base.
|
8
|
+
def self.extended(base)
|
9
|
+
base.extend_premises_rule
|
10
10
|
end
|
11
|
-
private_class_method :included
|
12
|
-
|
13
|
-
# initialize method to be prepended to the including class
|
14
|
-
module Initializer
|
15
|
-
def initialize(*)
|
16
|
-
super if defined? super
|
17
|
-
extend_premises_rule
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
11
|
|
23
12
|
def extend_premises_rule
|
24
13
|
require premises_rule_filename
|
25
14
|
extend premises_rule_module
|
26
15
|
end
|
27
16
|
|
17
|
+
private
|
18
|
+
|
28
19
|
def premises_rule_filename
|
29
20
|
"paf/premises/rule#{rule_key}"
|
30
21
|
end
|
data/lib/paf/premises/common.rb
CHANGED
data/lib/paf/premises/rule000.rb
CHANGED
data/lib/paf/premises/rule001.rb
CHANGED
@@ -2,12 +2,12 @@ class Paf
|
|
2
2
|
module Premises
|
3
3
|
# Processing for premises elements of a PAF entry under Rule 2
|
4
4
|
module Rule001
|
5
|
-
private
|
6
|
-
|
7
5
|
def premises
|
8
6
|
[number_and_thoroughfare_or_locality]
|
9
7
|
end
|
10
8
|
|
9
|
+
private
|
10
|
+
|
11
11
|
def premises_includes_first_thoroughfare_or_locality?
|
12
12
|
true
|
13
13
|
end
|
data/lib/paf/premises/rule010.rb
CHANGED
@@ -2,35 +2,25 @@ class Paf
|
|
2
2
|
module Premises
|
3
3
|
# Processing for premises elements of a PAF entry under Rule 3
|
4
4
|
module Rule010
|
5
|
-
private
|
6
|
-
|
7
5
|
def premises
|
8
|
-
return [name_and_thoroughfare_or_locality] if
|
9
|
-
|
10
|
-
if building_name_last_word.paf_split_exception?
|
6
|
+
return [name_and_thoroughfare_or_locality] if building_name.exception?
|
7
|
+
if building_name.split_exception?
|
11
8
|
return [
|
12
|
-
|
9
|
+
building_name.but_last_word,
|
13
10
|
name_last_word_and_thoroughfare_or_locality
|
14
11
|
]
|
15
12
|
end
|
16
13
|
[building_name]
|
17
14
|
end
|
18
15
|
|
19
|
-
|
20
|
-
building_name.paf_exception? ||
|
21
|
-
building_name_last_word.paf_split_exception?
|
22
|
-
end
|
23
|
-
|
24
|
-
def building_name_but_last_word
|
25
|
-
building_name[0...building_name.rindex(' ')]
|
26
|
-
end
|
16
|
+
private
|
27
17
|
|
28
|
-
def
|
29
|
-
building_name.
|
18
|
+
def premises_includes_first_thoroughfare_or_locality?
|
19
|
+
building_name.exception? || building_name.split_exception?
|
30
20
|
end
|
31
21
|
|
32
22
|
def name_last_word_and_thoroughfare_or_locality
|
33
|
-
"#{
|
23
|
+
"#{building_name.last_word} #{first_thoroughfare_or_locality}"
|
34
24
|
end
|
35
25
|
end
|
36
26
|
end
|
data/lib/paf/premises/rule011.rb
CHANGED
@@ -2,12 +2,12 @@ class Paf
|
|
2
2
|
module Premises
|
3
3
|
# Processing for premises elements of a PAF entry under Rule 4
|
4
4
|
module Rule011
|
5
|
-
private
|
6
|
-
|
7
5
|
def premises
|
8
6
|
[building_name, number_and_thoroughfare_or_locality]
|
9
7
|
end
|
10
8
|
|
9
|
+
private
|
10
|
+
|
11
11
|
def premises_includes_first_thoroughfare_or_locality?
|
12
12
|
true
|
13
13
|
end
|
data/lib/paf/premises/rule101.rb
CHANGED
@@ -2,13 +2,13 @@ class Paf
|
|
2
2
|
module Premises
|
3
3
|
# Processing for premises elements of a PAF entry under Rule 5
|
4
4
|
module Rule101
|
5
|
-
private
|
6
|
-
|
7
5
|
def premises
|
8
6
|
return [number_sub_name_and_thoroughfare_or_locality] if concatenate?
|
9
7
|
[sub_building_name, number_and_thoroughfare_or_locality]
|
10
8
|
end
|
11
9
|
|
10
|
+
private
|
11
|
+
|
12
12
|
def premises_includes_first_thoroughfare_or_locality?
|
13
13
|
true
|
14
14
|
end
|
data/lib/paf/premises/rule110.rb
CHANGED
@@ -2,17 +2,17 @@ class Paf
|
|
2
2
|
module Premises
|
3
3
|
# Processing for premises elements of a PAF entry under Rule 6
|
4
4
|
module Rule110
|
5
|
-
private
|
6
|
-
|
7
5
|
def premises
|
8
|
-
return [sub_name_and_name] if sub_building_name.
|
6
|
+
return [sub_name_and_name] if sub_building_name.exception?
|
9
7
|
return [sub_building_name, name_and_thoroughfare_or_locality] if
|
10
|
-
building_name.
|
8
|
+
building_name.exception?
|
11
9
|
[sub_building_name, building_name]
|
12
10
|
end
|
13
11
|
|
12
|
+
private
|
13
|
+
|
14
14
|
def premises_includes_first_thoroughfare_or_locality?
|
15
|
-
!sub_building_name.
|
15
|
+
!sub_building_name.exception? && building_name.exception?
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
data/lib/paf/premises/rule111.rb
CHANGED
@@ -2,14 +2,14 @@ class Paf
|
|
2
2
|
module Premises
|
3
3
|
# Processing for premises elements of a PAF entry under Rule 7
|
4
4
|
module Rule111
|
5
|
-
private
|
6
|
-
|
7
5
|
def premises
|
8
6
|
return [sub_name_and_name, number_and_thoroughfare_or_locality] if
|
9
|
-
sub_building_name.
|
7
|
+
sub_building_name.exception?
|
10
8
|
[sub_building_name, building_name, number_and_thoroughfare_or_locality]
|
11
9
|
end
|
12
10
|
|
11
|
+
private
|
12
|
+
|
13
13
|
def premises_includes_first_thoroughfare_or_locality?
|
14
14
|
true
|
15
15
|
end
|
@@ -1,37 +1,29 @@
|
|
1
1
|
class Paf
|
2
2
|
# Processing for thoroughfare and locality elements of a PAF entry
|
3
3
|
module ThoroughfareLocality
|
4
|
-
def
|
5
|
-
|
4
|
+
def thoroughfare_and_locality_attrs
|
5
|
+
%i[dependent_thoroughfare thoroughfare] + self.class.locality_attrs
|
6
6
|
end
|
7
|
-
private_class_method :included
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
def thoroughfares_and_localities
|
9
|
+
[].tap do |array|
|
10
|
+
thoroughfare_and_locality_attrs.each do |attr|
|
11
|
+
next if used?(attr)
|
12
|
+
value = send(attr)
|
13
|
+
array << value unless value.vacant?
|
14
|
+
end
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
16
18
|
private
|
17
19
|
|
18
|
-
def thoroughfares_and_localities
|
19
|
-
array = []
|
20
|
-
self.class.thoroughfare_and_locality_attrs.each do |attr|
|
21
|
-
next if used?(attr)
|
22
|
-
value = send(attr)
|
23
|
-
array << value unless value.vacant?
|
24
|
-
end
|
25
|
-
array
|
26
|
-
end
|
27
|
-
|
28
20
|
def first_thoroughfare_or_locality
|
29
21
|
send(first_thoroughfare_or_locality_attr) unless
|
30
22
|
first_thoroughfare_or_locality_attr.nil?
|
31
23
|
end
|
32
24
|
|
33
25
|
def first_thoroughfare_or_locality_attr
|
34
|
-
|
26
|
+
thoroughfare_and_locality_attrs.find do |attr|
|
35
27
|
!send(attr).vacant?
|
36
28
|
end
|
37
29
|
end
|
data/lib/paf/version.rb
CHANGED
data/paf.gemspec
CHANGED
@@ -9,6 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.version = Paf::VERSION
|
10
10
|
spec.authors = ['John Bard']
|
11
11
|
spec.email = ['johnbard@globalnet.co.uk']
|
12
|
+
spec.homepage = 'https://github.com/drabjay/paf'
|
12
13
|
|
13
14
|
spec.summary = 'Royal Mail Postcode Address File (PAF) Formatter'
|
14
15
|
spec.description = <<-EOF
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Bard
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -103,11 +103,14 @@ files:
|
|
103
103
|
- bin/console
|
104
104
|
- bin/setup
|
105
105
|
- lib/paf.rb
|
106
|
+
- lib/paf/array_formatter.rb
|
106
107
|
- lib/paf/attribute.rb
|
107
108
|
- lib/paf/core_ext/array.rb
|
108
109
|
- lib/paf/core_ext/object.rb
|
109
110
|
- lib/paf/core_ext/string.rb
|
110
111
|
- lib/paf/formattable.rb
|
112
|
+
- lib/paf/formatter.rb
|
113
|
+
- lib/paf/hash_formatter.rb
|
111
114
|
- lib/paf/lineable.rb
|
112
115
|
- lib/paf/premises.rb
|
113
116
|
- lib/paf/premises/common.rb
|
@@ -118,10 +121,11 @@ files:
|
|
118
121
|
- lib/paf/premises/rule101.rb
|
119
122
|
- lib/paf/premises/rule110.rb
|
120
123
|
- lib/paf/premises/rule111.rb
|
124
|
+
- lib/paf/string_formatter.rb
|
121
125
|
- lib/paf/thoroughfare_locality.rb
|
122
126
|
- lib/paf/version.rb
|
123
127
|
- paf.gemspec
|
124
|
-
homepage:
|
128
|
+
homepage: https://github.com/drabjay/paf
|
125
129
|
licenses:
|
126
130
|
- MIT
|
127
131
|
metadata: {}
|