postal_address 0.0.5 → 0.1.1
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 +12 -4
- data/data/address_formats.yml +3 -0
- data/lib/postal_address.rb +33 -13
- data/lib/postal_address/address.rb +41 -0
- data/lib/postal_address/formatters/html.rb +32 -0
- data/lib/postal_address/formatters/text.rb +25 -0
- data/lib/postal_address/version.rb +1 -1
- data/postal_address.gemspec +2 -1
- data/spec/postal_address_spec.rb +34 -34
- data/spec/spec_helper.rb +2 -0
- data/spec/virtus_integration_spec.rb +2 -2
- metadata +32 -18
- data/lib/postal_address/class_methods.rb +0 -40
- data/lib/postal_address/instance_methods.rb +0 -58
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d917f51e33a1a55dcb4b1223df2626b3df0b5ec5
|
|
4
|
+
data.tar.gz: 19521b23dd055ac878ed78e1e719c3bc927ca911
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7fb11ea6efacab7cd36459679d643a52ed350ff34f3d3da9dde0cd432cfee89278c9592eed0127aab2d23a2d6c0a3c257080929a60cb5f98ea92e6fdc1235bee
|
|
7
|
+
data.tar.gz: 835d1c41d90324bd5b167f1bda981561b3f87048dc73aa6d8482251390c5c74a235a0f85a0bcac3b897d18a907c380fb8022bf599dd0a3eaf0a329ae2dd30baa
|
data/README.md
CHANGED
|
@@ -29,14 +29,14 @@ Or install it yourself as:
|
|
|
29
29
|
country_code: 'us'
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Postal::Address.new(address).to_s
|
|
33
33
|
|
|
34
34
|
Tobias Füncke
|
|
35
35
|
101 Broadway
|
|
36
36
|
New York City NY 10002
|
|
37
37
|
United States of America
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
Postal::Address.new(address).to_html
|
|
40
40
|
|
|
41
41
|
<p itemscope itemtype="http://schema.org/PostalAddress">
|
|
42
42
|
<span itemprop="name">Tobias Füncke</span>
|
|
@@ -53,9 +53,9 @@ Or install it yourself as:
|
|
|
53
53
|
|
|
54
54
|
Set a home country (country names are not display for those addresses)
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
Postal.home_country = 'us'
|
|
57
57
|
|
|
58
|
-
p =
|
|
58
|
+
p = Postal::Address.new(address)
|
|
59
59
|
p.to_html(tag: 'section', itemprop: 'address')
|
|
60
60
|
|
|
61
61
|
<section itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
|
|
@@ -67,6 +67,14 @@ Set a home country (country names are not display for those addresses)
|
|
|
67
67
|
<span itemprop="addressRegion">NY</span>
|
|
68
68
|
<span itemprop="postalCode">10002</span>
|
|
69
69
|
</section>
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
Standalone AddressFormatter usage:
|
|
73
|
+
|
|
74
|
+
Postal::AddressFormatter::Text.new(address).render
|
|
75
|
+
|
|
76
|
+
Postal::AddressFormatter::HTML.new(address).render(tag: 'section', itemprop: 'address')
|
|
77
|
+
|
|
70
78
|
|
|
71
79
|
## Contributing
|
|
72
80
|
|
data/data/address_formats.yml
CHANGED
data/lib/postal_address.rb
CHANGED
|
@@ -1,17 +1,37 @@
|
|
|
1
|
+
require "yaml"
|
|
1
2
|
require "postal_address/version"
|
|
2
|
-
require "postal_address/
|
|
3
|
-
require "postal_address/
|
|
3
|
+
require "postal_address/address"
|
|
4
|
+
require "postal_address/formatters/text"
|
|
5
|
+
require "postal_address/formatters/html"
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
module Postal
|
|
8
|
+
class << self
|
|
9
|
+
attr_reader :home_country
|
|
10
|
+
|
|
11
|
+
def home_country=(code)
|
|
12
|
+
@home_country = sanitize(code)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def home_country?(code)
|
|
16
|
+
home_country == code
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def sanitize(code)
|
|
20
|
+
code && code.to_s.downcase
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def address_formats
|
|
24
|
+
@address_formats ||= load_yaml('address_formats')
|
|
25
|
+
end
|
|
8
26
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
27
|
+
def country_names
|
|
28
|
+
@country_names ||= load_yaml('country_names')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def load_yaml(filename)
|
|
34
|
+
YAML.load_file(File.expand_path("../data/#{filename}.yml", File.dirname(__FILE__)))
|
|
35
|
+
end
|
|
36
|
+
end
|
|
17
37
|
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Postal
|
|
2
|
+
class Address
|
|
3
|
+
Fields = [:recipient, :street, :zip, :state, :city, :country, :country_code]
|
|
4
|
+
|
|
5
|
+
attr_accessor *Fields
|
|
6
|
+
|
|
7
|
+
def initialize(attrs={})
|
|
8
|
+
attrs.each do |attr, value|
|
|
9
|
+
self.public_send("#{attr}=", value) if self.respond_to?("#{attr}=")
|
|
10
|
+
end if attrs
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def country_code=(code)
|
|
14
|
+
@country_code = Postal.sanitize(code)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def country
|
|
18
|
+
@country ||= Postal.country_names[country_code]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def to_h
|
|
22
|
+
attributes
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def to_s
|
|
26
|
+
AddressFormatter::Text.new(attributes).render
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def to_html(params={})
|
|
30
|
+
AddressFormatter::HTML.new(attributes).render(params)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def attributes
|
|
36
|
+
Fields.each_with_object({}) do |key, hash|
|
|
37
|
+
hash[key] = public_send(key)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Postal
|
|
2
|
+
module AddressFormatter
|
|
3
|
+
class HTML < Text
|
|
4
|
+
Schema = 'http://schema.org/PostalAddress'
|
|
5
|
+
ItemProp = {
|
|
6
|
+
recipient: 'name',
|
|
7
|
+
street: 'streetAddress',
|
|
8
|
+
zip: 'postalCode',
|
|
9
|
+
state: 'addressRegion',
|
|
10
|
+
city: 'addressLocality',
|
|
11
|
+
country: 'addressCountry'
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
def render(params={})
|
|
15
|
+
content_tag((params.delete(:tag) || :p), super.gsub("\n", "<br>"), params.merge(itemscope: nil, itemtype: Schema))
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def address_data
|
|
21
|
+
super.each_with_object({}) do |(key, value), hash|
|
|
22
|
+
hash[key] = content_tag(:span, value, itemprop: ItemProp[key])
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def content_tag(tag, content='', attributes={})
|
|
27
|
+
attrs = attributes.map {|k,v| k.to_s + (v ? "=\"#{v}\"" : '') }.unshift('').join(' ')
|
|
28
|
+
"<#{tag}#{attrs}>#{content}</#{tag}>"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Postal
|
|
2
|
+
module AddressFormatter
|
|
3
|
+
class Text
|
|
4
|
+
# expects any hash with the fields names of address
|
|
5
|
+
def initialize(address)
|
|
6
|
+
@address = address
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def render(params={})
|
|
10
|
+
(address_format % address_data).strip
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def address_data
|
|
16
|
+
@address[:country] = nil if Postal.home_country?(@address[:country_code])
|
|
17
|
+
@address
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def address_format
|
|
21
|
+
Postal.address_formats[@address[:country_code]] || Postal.address_formats[@address[:state] ? 'us' : 'de']
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
data/postal_address.gemspec
CHANGED
|
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
|
20
20
|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
|
22
22
|
spec.add_development_dependency "rake"
|
|
23
|
-
spec.add_development_dependency "minitest"
|
|
23
|
+
spec.add_development_dependency "minitest", '~> 4.7.0'
|
|
24
|
+
spec.add_development_dependency "turn"
|
|
24
25
|
spec.add_development_dependency "virtus"
|
|
25
26
|
end
|
data/spec/postal_address_spec.rb
CHANGED
|
@@ -3,32 +3,32 @@ require 'spec_helper'
|
|
|
3
3
|
|
|
4
4
|
describe PostalAddress do
|
|
5
5
|
it "should load the formats" do
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
Postal.address_formats.wont_be :empty?
|
|
7
|
+
Postal.address_formats.must_be_kind_of Hash
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
it "should load the country_name" do
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
Postal.country_names.wont_be :empty?
|
|
12
|
+
Postal.country_names.must_be_kind_of Hash
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
it "should read/write home country" do
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
Postal.home_country = 'de'
|
|
17
|
+
Postal.home_country.must_equal 'de'
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
it "should read/write home country and convert to string and lower case" do
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
Postal.home_country = :DE
|
|
22
|
+
Postal.home_country.must_equal 'de'
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
describe "Instance" do
|
|
26
26
|
before {
|
|
27
|
-
|
|
27
|
+
Postal.home_country = nil
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
let(:address) do
|
|
31
|
-
|
|
31
|
+
Postal::Address.new({
|
|
32
32
|
recipient: 'Tobias Füncke',
|
|
33
33
|
street: '101 Broadway',
|
|
34
34
|
city: 'New York City',
|
|
@@ -61,12 +61,12 @@ describe PostalAddress do
|
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
it "should not print the country if in home country" do
|
|
64
|
-
|
|
64
|
+
Postal.home_country = 'us'
|
|
65
65
|
address.to_s.must_equal "Tobias Füncke\n101 Broadway\nNew York City NY 10002"
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
it "should print the country if not in home country" do
|
|
69
|
-
|
|
69
|
+
Postal.home_country = 'de'
|
|
70
70
|
address.to_s.must_equal "Tobias Füncke\n101 Broadway\nNew York City NY 10002\nUnited States of America"
|
|
71
71
|
end
|
|
72
72
|
|
|
@@ -81,29 +81,29 @@ describe PostalAddress do
|
|
|
81
81
|
address.to_s.must_equal "Tobias Füncke\n101 Broadway\n10002 New York City"
|
|
82
82
|
end
|
|
83
83
|
|
|
84
|
-
it "should respond to state aliases" do
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
it "should respond to city aliases" do
|
|
93
|
-
[:locality].each do |alias_name|
|
|
94
|
-
#address.must_respond_to alias_name
|
|
95
|
-
address.must_respond_to :"#{alias_name}="
|
|
96
|
-
#address.send(alias_name).must_equal address.city
|
|
97
|
-
end
|
|
98
|
-
end
|
|
84
|
+
# it "should respond to state aliases" do
|
|
85
|
+
# [:region, :province, :territory, :administrative_area_level_1].each do |alias_name|
|
|
86
|
+
# #address.must_respond_to alias_name
|
|
87
|
+
# address.must_respond_to :"#{alias_name}="
|
|
88
|
+
# #address.send(alias_name).must_equal address.state
|
|
89
|
+
# end
|
|
90
|
+
# end
|
|
99
91
|
|
|
100
|
-
it "should respond to
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
end
|
|
92
|
+
# it "should respond to city aliases" do
|
|
93
|
+
# [:locality].each do |alias_name|
|
|
94
|
+
# #address.must_respond_to alias_name
|
|
95
|
+
# address.must_respond_to :"#{alias_name}="
|
|
96
|
+
# #address.send(alias_name).must_equal address.city
|
|
97
|
+
# end
|
|
98
|
+
# end
|
|
99
|
+
#
|
|
100
|
+
# it "should respond to zip aliases" do
|
|
101
|
+
# [:zip_code, :postal_code, :postcode].each do |alias_name|
|
|
102
|
+
# #address.must_respond_to alias_name
|
|
103
|
+
# address.must_respond_to :"#{alias_name}="
|
|
104
|
+
# #address.send(alias_name).must_equal address.zip
|
|
105
|
+
# end
|
|
106
|
+
# end
|
|
107
107
|
|
|
108
108
|
it "should return html" do
|
|
109
109
|
address.to_html.must_equal "<p itemscope itemtype=\"http://schema.org/PostalAddress\"><span itemprop=\"name\">Tobias Füncke</span><br><span itemprop=\"streetAddress\">101 Broadway</span><br><span itemprop=\"addressLocality\">New York City</span> <span itemprop=\"addressRegion\">NY</span> <span itemprop=\"postalCode\">10002</span><br><span itemprop=\"addressCountry\">United States of America</span></p>"
|
data/spec/spec_helper.rb
CHANGED
|
@@ -14,7 +14,7 @@ class Address
|
|
|
14
14
|
attribute :geolocation, Array
|
|
15
15
|
|
|
16
16
|
def postal_address
|
|
17
|
-
|
|
17
|
+
Postal::Address.new(self.attributes).to_s
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
|
|
@@ -33,7 +33,7 @@ describe Address do
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
it "should work" do
|
|
36
|
-
|
|
36
|
+
Postal.home_country = 'us'
|
|
37
37
|
address.postal_address.must_equal "Tobias Füncke\n101 Broadway\nNew York City NY 10002"
|
|
38
38
|
end
|
|
39
39
|
end
|
metadata
CHANGED
|
@@ -1,69 +1,83 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: postal_address
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kevin Melchert
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2014-01-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - ~>
|
|
17
|
+
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
19
|
version: '1.3'
|
|
20
20
|
type: :development
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- - ~>
|
|
24
|
+
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '1.3'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rake
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- -
|
|
31
|
+
- - ">="
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
33
|
version: '0'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- -
|
|
38
|
+
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: minitest
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- -
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: 4.7.0
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: 4.7.0
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: turn
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
46
60
|
- !ruby/object:Gem::Version
|
|
47
61
|
version: '0'
|
|
48
62
|
type: :development
|
|
49
63
|
prerelease: false
|
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
65
|
requirements:
|
|
52
|
-
- -
|
|
66
|
+
- - ">="
|
|
53
67
|
- !ruby/object:Gem::Version
|
|
54
68
|
version: '0'
|
|
55
69
|
- !ruby/object:Gem::Dependency
|
|
56
70
|
name: virtus
|
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
|
58
72
|
requirements:
|
|
59
|
-
- -
|
|
73
|
+
- - ">="
|
|
60
74
|
- !ruby/object:Gem::Version
|
|
61
75
|
version: '0'
|
|
62
76
|
type: :development
|
|
63
77
|
prerelease: false
|
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
79
|
requirements:
|
|
66
|
-
- -
|
|
80
|
+
- - ">="
|
|
67
81
|
- !ruby/object:Gem::Version
|
|
68
82
|
version: '0'
|
|
69
83
|
description: International postal address formatting
|
|
@@ -73,8 +87,8 @@ executables: []
|
|
|
73
87
|
extensions: []
|
|
74
88
|
extra_rdoc_files: []
|
|
75
89
|
files:
|
|
76
|
-
- .gitignore
|
|
77
|
-
- .travis.yml
|
|
90
|
+
- ".gitignore"
|
|
91
|
+
- ".travis.yml"
|
|
78
92
|
- Gemfile
|
|
79
93
|
- LICENSE.txt
|
|
80
94
|
- README.md
|
|
@@ -82,8 +96,9 @@ files:
|
|
|
82
96
|
- data/address_formats.yml
|
|
83
97
|
- data/country_names.yml
|
|
84
98
|
- lib/postal_address.rb
|
|
85
|
-
- lib/postal_address/
|
|
86
|
-
- lib/postal_address/
|
|
99
|
+
- lib/postal_address/address.rb
|
|
100
|
+
- lib/postal_address/formatters/html.rb
|
|
101
|
+
- lib/postal_address/formatters/text.rb
|
|
87
102
|
- lib/postal_address/version.rb
|
|
88
103
|
- postal_address.gemspec
|
|
89
104
|
- spec/postal_address_spec.rb
|
|
@@ -99,17 +114,17 @@ require_paths:
|
|
|
99
114
|
- lib
|
|
100
115
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
116
|
requirements:
|
|
102
|
-
- -
|
|
117
|
+
- - ">="
|
|
103
118
|
- !ruby/object:Gem::Version
|
|
104
119
|
version: '0'
|
|
105
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
121
|
requirements:
|
|
107
|
-
- -
|
|
122
|
+
- - ">="
|
|
108
123
|
- !ruby/object:Gem::Version
|
|
109
124
|
version: '0'
|
|
110
125
|
requirements: []
|
|
111
126
|
rubyforge_project:
|
|
112
|
-
rubygems_version: 2.0
|
|
127
|
+
rubygems_version: 2.2.0
|
|
113
128
|
signing_key:
|
|
114
129
|
specification_version: 4
|
|
115
130
|
summary: International postal address formatting
|
|
@@ -117,4 +132,3 @@ test_files:
|
|
|
117
132
|
- spec/postal_address_spec.rb
|
|
118
133
|
- spec/spec_helper.rb
|
|
119
134
|
- spec/virtus_integration_spec.rb
|
|
120
|
-
has_rdoc:
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
require "yaml"
|
|
2
|
-
|
|
3
|
-
class PostalAddress
|
|
4
|
-
module ClassMethods
|
|
5
|
-
attr_reader :home_country
|
|
6
|
-
|
|
7
|
-
def home_country=(code)
|
|
8
|
-
@home_country = code && code.to_s.downcase
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def formats
|
|
12
|
-
@formats ||= load_yaml('address_formats')
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def country_names
|
|
16
|
-
@country_names ||= load_yaml('country_names')
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def attributes
|
|
20
|
-
@attributes ||= {}
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
private
|
|
24
|
-
|
|
25
|
-
def attribute(name, params={})
|
|
26
|
-
attributes[name] = params
|
|
27
|
-
attr_reader name unless params[:reader] === false
|
|
28
|
-
attr_writer name unless params[:writer] === false
|
|
29
|
-
alias_attribute_writer(name, Array(params[:alias])) if params[:alias]
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def alias_attribute_writer(original, aliases)
|
|
33
|
-
aliases.each { |name| alias_method :"#{name}=", :"#{original}=" }
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def load_yaml(filename)
|
|
37
|
-
YAML.load_file(File.join(File.dirname(__FILE__), "..", "..", "data", "#{filename}.yml"))
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
class PostalAddress
|
|
2
|
-
module InstanceMethods
|
|
3
|
-
def initialize(params={})
|
|
4
|
-
params.each do |attr, value|
|
|
5
|
-
self.public_send("#{attr}=", value) if self.respond_to?("#{attr}=")
|
|
6
|
-
end if params
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def to_h
|
|
10
|
-
attributes
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def to_s
|
|
14
|
-
format(attributes)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def to_html(params={})
|
|
18
|
-
address = format(attributes(:html)).gsub("\n", "<br>")
|
|
19
|
-
content_tag((params.delete(:tag) || :p), address, params.merge(itemscope: nil, itemtype: 'http://schema.org/PostalAddress'))
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def country_code=(code)
|
|
23
|
-
@country_code = code && code.to_s.downcase
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def country
|
|
27
|
-
@country = self.class.country_names[country_code] unless in_home_country?
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def in_home_country?
|
|
31
|
-
self.class.home_country == country_code
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
private
|
|
35
|
-
|
|
36
|
-
def format(hash)
|
|
37
|
-
(address_format % hash).strip
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def address_format
|
|
41
|
-
self.class.formats[country_code] || self.class.formats[state ? 'us' : 'de']
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def attributes(html=false)
|
|
45
|
-
self.class.attributes.inject({}) do |hash, (key, attribute)|
|
|
46
|
-
value = public_send(key)
|
|
47
|
-
value = value && content_tag(:span, value, itemprop: attribute[:itemprop]) if html
|
|
48
|
-
hash[key] = value
|
|
49
|
-
hash
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def content_tag(tag, content='', attributes={})
|
|
54
|
-
attrs = attributes.map {|k,v| k.to_s + (v ? "=\"#{v}\"" : '') }.unshift('').join(' ')
|
|
55
|
-
"<#{tag}#{attrs}>#{content}</#{tag}>"
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|