StreetAddress 1.0.3 → 1.0.4
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.rdoc +15 -5
- data/lib/street_address.rb +50 -10
- data/test/test_street_address.rb +38 -0
- metadata +24 -42
data/README.rdoc
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
StreetAddress
|
|
2
|
-
by Derrek Long
|
|
3
|
-
https://github.com/derrek/street-address
|
|
4
|
-
|
|
5
1
|
== DESCRIPTION:
|
|
6
2
|
|
|
7
3
|
Parses one line street addresses and returns a normalized address object.
|
|
@@ -30,6 +26,20 @@ Parse United States addresses.
|
|
|
30
26
|
address.to_s(:line1) # 1600 Pennsylvania Ave
|
|
31
27
|
StreetAddress::US.parse("1600 Pennsylvania Ave") # nil not a full address
|
|
32
28
|
|
|
29
|
+
=== Informal/Loose Parsing
|
|
30
|
+
address = StreetAddress::US.parse("1600 Pennsylvania Avenue", :informal => true)
|
|
31
|
+
address.number # 1600
|
|
32
|
+
address.street # Pennsylvania
|
|
33
|
+
address.street_type # Ave
|
|
34
|
+
address.to_s # 1600 Pennsylvania Ave
|
|
35
|
+
|
|
36
|
+
=== Zip+4
|
|
37
|
+
address = StreetAddress::US.parse("5904 Richmond Hwy Ste 340 Alexandria VA 22303-1864")
|
|
38
|
+
address.postal_code_ext # 1846
|
|
39
|
+
|
|
40
|
+
address = StreetAddress::US.parse("5904 Richmond Hwy Ste 340 Alexandria VA 223031864")
|
|
41
|
+
address.postal_code_ext # 1846
|
|
42
|
+
|
|
33
43
|
=== Gemfile:
|
|
34
44
|
To use from your Gemfile:
|
|
35
|
-
gem 'StreetAddress', '1.0.
|
|
45
|
+
gem 'StreetAddress', '1.0.3', :require => "street_address"
|
data/lib/street_address.rb
CHANGED
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
|
|
65
65
|
module StreetAddress
|
|
66
66
|
class US
|
|
67
|
-
VERSION = '1.0.
|
|
67
|
+
VERSION = '1.0.4'
|
|
68
68
|
DIRECTIONAL = {
|
|
69
69
|
"north" => "N",
|
|
70
70
|
"northeast" => "NE",
|
|
@@ -576,13 +576,15 @@ module StreetAddress
|
|
|
576
576
|
:number_regexp,
|
|
577
577
|
:fraction_regexp,
|
|
578
578
|
:state_regexp,
|
|
579
|
+
:city_and_state_regexp,
|
|
579
580
|
:direct_regexp,
|
|
580
581
|
:zip_regexp,
|
|
581
582
|
:corner_regexp,
|
|
582
583
|
:unit_regexp,
|
|
583
584
|
:street_regexp,
|
|
584
585
|
:place_regexp,
|
|
585
|
-
:address_regexp
|
|
586
|
+
:address_regexp,
|
|
587
|
+
:informal_address_regexp
|
|
586
588
|
)
|
|
587
589
|
end
|
|
588
590
|
|
|
@@ -590,6 +592,12 @@ module StreetAddress
|
|
|
590
592
|
self.number_regexp = '\d+-?\d*'
|
|
591
593
|
self.fraction_regexp = '\d+\/\d+'
|
|
592
594
|
self.state_regexp = STATE_CODES.to_a.join("|").gsub(/ /, "\\s")
|
|
595
|
+
self.city_and_state_regexp = '
|
|
596
|
+
(?:
|
|
597
|
+
([^\d,]+?)\W+
|
|
598
|
+
(' + state_regexp + ')
|
|
599
|
+
)'
|
|
600
|
+
|
|
593
601
|
self.direct_regexp = DIRECTIONAL.keys.join("|") +
|
|
594
602
|
"|" +
|
|
595
603
|
DIRECTIONAL.values.sort{ |a,b|
|
|
@@ -598,7 +606,7 @@ module StreetAddress
|
|
|
598
606
|
f = x.gsub(/(\w)/, '\1.')
|
|
599
607
|
[Regexp::quote(f), Regexp::quote(x)]
|
|
600
608
|
}.join("|")
|
|
601
|
-
self.zip_regexp = '(\d{5})(
|
|
609
|
+
self.zip_regexp = '(\d{5})(?:-?(\d{4})?)'
|
|
602
610
|
self.corner_regexp = '(?:\band\b|\bat\b|&|\@)'
|
|
603
611
|
self.unit_regexp = '(?:(su?i?te|p\W*[om]\W*b(?:ox)?|dept|apt|apartment|ro*m|fl|unit|box)\W+|\#\W*)([\w-]+)'
|
|
604
612
|
self.street_regexp =
|
|
@@ -621,10 +629,7 @@ module StreetAddress
|
|
|
621
629
|
)
|
|
622
630
|
)'
|
|
623
631
|
self.place_regexp =
|
|
624
|
-
'(?:
|
|
625
|
-
([^\d,]+?)\W+
|
|
626
|
-
($' + state_regexp + ')\W*
|
|
627
|
-
)?
|
|
632
|
+
'(?:' + city_and_state_regexp + '\W*)?
|
|
628
633
|
(?:' + zip_regexp + ')?'
|
|
629
634
|
|
|
630
635
|
self.address_regexp =
|
|
@@ -636,26 +641,39 @@ module StreetAddress
|
|
|
636
641
|
place_regexp +
|
|
637
642
|
'\W*\Z'
|
|
638
643
|
|
|
644
|
+
self.informal_address_regexp =
|
|
645
|
+
'\A\s*
|
|
646
|
+
(' + number_regexp + ')\W*
|
|
647
|
+
(?:' + fraction_regexp + '\W*)?' +
|
|
648
|
+
street_regexp + '(?:\W+|\Z)
|
|
649
|
+
(?:' + unit_regexp + '(?:\W+|\Z))?' +
|
|
650
|
+
'(?:' + place_regexp + ')?'
|
|
651
|
+
|
|
639
652
|
=begin rdoc
|
|
640
653
|
|
|
641
654
|
parses either an address or intersection and returns an instance of
|
|
642
655
|
StreetAddress::US::Address or nil if the location cannot be parsed
|
|
656
|
+
|
|
657
|
+
pass the arguement, :informal => true, to make parsing more lenient
|
|
643
658
|
|
|
644
659
|
====example
|
|
645
660
|
StreetAddress::US.parse('1600 Pennsylvania Ave Washington, DC 20006')
|
|
646
661
|
or:
|
|
647
662
|
StreetAddress::US.parse('Hollywood & Vine, Los Angeles, CA')
|
|
663
|
+
or
|
|
664
|
+
StreetAddress::US.parse("1600 Pennsylvania Ave", :informal => true)
|
|
648
665
|
|
|
649
666
|
=end
|
|
650
667
|
class << self
|
|
651
|
-
def parse(location)
|
|
668
|
+
def parse(location, args = {})
|
|
652
669
|
if Regexp.new(corner_regexp, Regexp::IGNORECASE).match(location)
|
|
653
|
-
parse_intersection(location)
|
|
670
|
+
parse_intersection(location)
|
|
671
|
+
elsif args[:informal]
|
|
672
|
+
parse_address(location) || parse_informal_address(location)
|
|
654
673
|
else
|
|
655
674
|
parse_address(location);
|
|
656
675
|
end
|
|
657
676
|
end
|
|
658
|
-
|
|
659
677
|
=begin rdoc
|
|
660
678
|
|
|
661
679
|
parses only an intersection and returnsan instance of
|
|
@@ -724,6 +742,28 @@ module StreetAddress
|
|
|
724
742
|
)
|
|
725
743
|
)
|
|
726
744
|
end
|
|
745
|
+
|
|
746
|
+
def parse_informal_address(addr)
|
|
747
|
+
regex = Regexp.new(informal_address_regexp, Regexp::IGNORECASE + Regexp::EXTENDED)
|
|
748
|
+
|
|
749
|
+
return unless match = regex.match(addr)
|
|
750
|
+
|
|
751
|
+
normalize_address(
|
|
752
|
+
StreetAddress::US::Address.new(
|
|
753
|
+
:number => match[1],
|
|
754
|
+
:street => match[5] || match[10] || match[2],
|
|
755
|
+
:street_type => match[6] || match[3],
|
|
756
|
+
:unit => match[14],
|
|
757
|
+
:unit_prefix => match[13],
|
|
758
|
+
:suffix => match[7] || match[12],
|
|
759
|
+
:prefix => match[4],
|
|
760
|
+
:city => match[15],
|
|
761
|
+
:state => match[16],
|
|
762
|
+
:postal_code => match[17],
|
|
763
|
+
:postal_code_ext => match[18]
|
|
764
|
+
)
|
|
765
|
+
)
|
|
766
|
+
end
|
|
727
767
|
|
|
728
768
|
private
|
|
729
769
|
def normalize_address(addr)
|
data/test/test_street_address.rb
CHANGED
|
@@ -17,6 +17,44 @@ class StreetAddressUsTest < Test::Unit::TestCase
|
|
|
17
17
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
+
def test_zip_plus_4_with_dash
|
|
21
|
+
addr = StreetAddress::US.parse("2730 S Veitch St, Arlington, VA 22206-3333")
|
|
22
|
+
assert_equal "3333", addr.postal_code_ext
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_zip_plus_4_without_dash
|
|
26
|
+
addr = StreetAddress::US.parse("2730 S Veitch St, Arlington, VA 222064444")
|
|
27
|
+
assert_equal "4444", addr.postal_code_ext
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_informal_parse_normal_address
|
|
31
|
+
a = StreetAddress::US.parse("2730 S Veitch St, Arlington, VA 222064444", :informal => true)
|
|
32
|
+
assert_equal "2730", a.number
|
|
33
|
+
assert_equal "S", a.prefix
|
|
34
|
+
assert_equal "Veitch", a.street
|
|
35
|
+
assert_equal "St", a.street_type
|
|
36
|
+
assert_equal "Arlington", a.city
|
|
37
|
+
assert_equal "VA", a.state
|
|
38
|
+
assert_equal "22206", a.postal_code
|
|
39
|
+
assert_equal "4444", a.postal_code_ext
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_informal_parse_informal_address
|
|
43
|
+
a = StreetAddress::US.parse("2730 S Veitch St", :informal => true)
|
|
44
|
+
assert_equal "2730", a.number
|
|
45
|
+
assert_equal "S", a.prefix
|
|
46
|
+
assert_equal "Veitch", a.street
|
|
47
|
+
assert_equal "St", a.street_type
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_informal_parse_informal_address_trailing_words
|
|
51
|
+
a = StreetAddress::US.parse("2730 S Veitch St in the south of arlington", :informal => true)
|
|
52
|
+
assert_equal "2730", a.number
|
|
53
|
+
assert_equal "S", a.prefix
|
|
54
|
+
assert_equal "Veitch", a.street
|
|
55
|
+
assert_equal "St", a.street_type
|
|
56
|
+
end
|
|
57
|
+
|
|
20
58
|
def test_parse
|
|
21
59
|
assert_equal StreetAddress::US.parse("&"), nil
|
|
22
60
|
assert_equal StreetAddress::US.parse(" and "), nil
|
metadata
CHANGED
|
@@ -1,76 +1,58 @@
|
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: StreetAddress
|
|
3
|
-
version: !ruby/object:Gem::Version
|
|
4
|
-
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.4
|
|
5
5
|
prerelease:
|
|
6
|
-
segments:
|
|
7
|
-
- 1
|
|
8
|
-
- 0
|
|
9
|
-
- 3
|
|
10
|
-
version: 1.0.3
|
|
11
6
|
platform: ruby
|
|
12
|
-
authors:
|
|
7
|
+
authors:
|
|
13
8
|
- Derrek Long
|
|
14
9
|
- Nicholas Schleuter
|
|
15
10
|
autorequire:
|
|
16
11
|
bindir: bin
|
|
17
12
|
cert_chain: []
|
|
18
|
-
|
|
19
|
-
date: 2011-09-21 00:00:00 -07:00
|
|
20
|
-
default_executable:
|
|
13
|
+
date: 2013-01-17 00:00:00.000000000 Z
|
|
21
14
|
dependencies: []
|
|
15
|
+
description: ! 'StreetAddress::US allows you to send any string to parse and if the
|
|
16
|
+
string is a US address returns an object of the address broken into it''s substituent
|
|
17
|
+
parts.
|
|
18
|
+
|
|
22
19
|
|
|
23
|
-
description: |
|
|
24
|
-
StreetAddress::US allows you to send any string to parse and if the string is a US address returns an object of the address broken into it's substituent parts.
|
|
25
|
-
|
|
26
20
|
A port of Geo::StreetAddress::US by Schuyler D. Erle and Tim Bunce.
|
|
27
21
|
|
|
22
|
+
'
|
|
28
23
|
email: derreklong@gmail.com
|
|
29
24
|
executables: []
|
|
30
|
-
|
|
31
25
|
extensions: []
|
|
32
|
-
|
|
33
26
|
extra_rdoc_files: []
|
|
34
|
-
|
|
35
|
-
files:
|
|
27
|
+
files:
|
|
36
28
|
- README.rdoc
|
|
37
29
|
- Rakefile
|
|
38
30
|
- LICENSE
|
|
39
31
|
- lib/street_address.rb
|
|
40
32
|
- test/test_street_address.rb
|
|
41
|
-
has_rdoc: true
|
|
42
33
|
homepage: https://github.com/derrek/street-address
|
|
43
34
|
licenses: []
|
|
44
|
-
|
|
45
35
|
post_install_message:
|
|
46
36
|
rdoc_options: []
|
|
47
|
-
|
|
48
|
-
require_paths:
|
|
37
|
+
require_paths:
|
|
49
38
|
- lib
|
|
50
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
|
39
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
51
40
|
none: false
|
|
52
|
-
requirements:
|
|
53
|
-
- -
|
|
54
|
-
- !ruby/object:Gem::Version
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
- 0
|
|
58
|
-
version: "0"
|
|
59
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
41
|
+
requirements:
|
|
42
|
+
- - ! '>='
|
|
43
|
+
- !ruby/object:Gem::Version
|
|
44
|
+
version: '0'
|
|
45
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
60
46
|
none: false
|
|
61
|
-
requirements:
|
|
62
|
-
- -
|
|
63
|
-
- !ruby/object:Gem::Version
|
|
64
|
-
|
|
65
|
-
segments:
|
|
66
|
-
- 0
|
|
67
|
-
version: "0"
|
|
47
|
+
requirements:
|
|
48
|
+
- - ! '>='
|
|
49
|
+
- !ruby/object:Gem::Version
|
|
50
|
+
version: '0'
|
|
68
51
|
requirements: []
|
|
69
|
-
|
|
70
52
|
rubyforge_project:
|
|
71
|
-
rubygems_version: 1.
|
|
53
|
+
rubygems_version: 1.8.24
|
|
72
54
|
signing_key:
|
|
73
55
|
specification_version: 3
|
|
74
56
|
summary: Parse Addresses into substituent parts. This gem includes US only.
|
|
75
|
-
test_files:
|
|
57
|
+
test_files:
|
|
76
58
|
- test/test_street_address.rb
|