paf 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: {}
|