ppl 1.25.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/features/email.feature +10 -0
- data/features/ls.feature +15 -0
- data/features/post.feature +24 -0
- data/features/step_definitions/ppl_steps.rb +17 -0
- data/lib/ppl/adapter/vcard/greencard.rb +49 -19
- data/lib/ppl/application/bootstrap.rb +13 -3
- data/lib/ppl/application/shell.rb +2 -0
- data/lib/ppl/command/post.rb +60 -16
- data/lib/ppl/entity/contact.rb +10 -4
- data/lib/ppl/entity/postal_address.rb +6 -0
- data/lib/ppl/error/postal_address_not_found.rb +4 -0
- data/lib/ppl/format/address_book/postal_addresses.rb +5 -18
- data/lib/ppl/format/contact/full.rb +5 -6
- data/lib/ppl/format/contact/postal_addresses.rb +26 -0
- data/lib/ppl/format/custom/contact.rb +8 -12
- data/lib/ppl/format/postal_address/multi_line.rb +16 -0
- data/lib/ppl/format/postal_address/one_line.rb +21 -9
- data/lib/ppl/service/postal_address.rb +65 -0
- data/lib/ppl.rb +5 -1
- data/ppl.gemspec +4 -4
- data/spec/ppl/adapter/vcard/greencard_spec.rb +151 -98
- data/spec/ppl/application/bootstrap_spec.rb +14 -2
- data/spec/ppl/application/shell_spec.rb +8 -0
- data/spec/ppl/command/post_spec.rb +83 -61
- data/spec/ppl/entity/contact_spec.rb +40 -10
- data/spec/ppl/entity/postal_address_spec.rb +6 -0
- data/spec/ppl/format/address_book/postal_addresses_spec.rb +6 -14
- data/spec/ppl/format/contact/full_spec.rb +1 -1
- data/spec/ppl/format/contact/postal_addresses_spec.rb +36 -0
- data/spec/ppl/format/postal_address/multi_line_spec.rb +57 -0
- data/spec/ppl/format/postal_address/one_line_spec.rb +32 -18
- data/spec/ppl/service/postal_address_spec.rb +152 -0
- metadata +13 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae020954e5c508fd1ea28a2bfb193fbb6393252d
|
4
|
+
data.tar.gz: 9d5b69c1e111f93bf92451dfcb4bc448de214393
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1fae903da342d62e76058b006313c3bad706a4faa509fb3792177bc5eb0e2803c2993f11d491f820503dceea8b1b1bd6905e4183aaeaef8f8d5809bdc03427fe
|
7
|
+
data.tar.gz: ad1fd41a18934622b4d78f6f59c79b13513f0242c2f50ae33fb68bc7d50909233fd19ab5fa037594b03270831cfe16b172c7429a9501c9594d28df5f9f7c7bd5
|
data/features/email.feature
CHANGED
@@ -8,6 +8,16 @@ Feature: ppl email
|
|
8
8
|
And bob should have 1 email address
|
9
9
|
And the 1st email address should be "* bob@example.org"
|
10
10
|
|
11
|
+
Scenario: Custom output with %a
|
12
|
+
Given I am in the same address book as before
|
13
|
+
Then running "ppl email bob --format '%a'" should output 1 line
|
14
|
+
And the 1st line should be "bob@example.org"
|
15
|
+
|
16
|
+
Scenario: Custom output with %f
|
17
|
+
Given I am in the same address book as before
|
18
|
+
Then running "ppl email bob --format '%f'" should output 1 line
|
19
|
+
And the 1st line should be "*"
|
20
|
+
|
11
21
|
Scenario: Add an email address to a contact
|
12
22
|
Given I am in an address book with a blank contact called bob
|
13
23
|
And I run "ppl email bob bob@example.org"
|
data/features/ls.feature
CHANGED
@@ -8,3 +8,18 @@ Feature: ppl ls
|
|
8
8
|
Then running "ppl ls" should output 1 line
|
9
9
|
And the 1st line should be "bob: Robert Testing <bob@example.org>"
|
10
10
|
|
11
|
+
Scenario: Custom output with %i
|
12
|
+
Given I am in the same address book as before
|
13
|
+
Then running "ppl ls --format '%i'" should output 1 line
|
14
|
+
And the 1st line should be "bob"
|
15
|
+
|
16
|
+
Scenario: Custom output with %N
|
17
|
+
Given I am in the same address book as before
|
18
|
+
Then running "ppl ls --format '%N'" should output 1 line
|
19
|
+
And the 1st line should be "Robert Testing"
|
20
|
+
|
21
|
+
Scenario: Custom output with %e
|
22
|
+
Given I am in the same address book as before
|
23
|
+
Then running "ppl ls --format '%e'" should output 1 line
|
24
|
+
And the 1st line should be "bob@example.org"
|
25
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
Feature: ppl post
|
3
|
+
|
4
|
+
Scenario: Add a home postal address to a contact
|
5
|
+
Given I am in an address book with a blank contact called bob
|
6
|
+
And I run "ppl post bob home --street '1234 Testing Avenue' --postal-code 'AB1 2CD'"
|
7
|
+
Then it should succeed
|
8
|
+
And bob should have 1 postal address
|
9
|
+
And the 1st postal address should be "home 1234 Testing Avenue, AB1 2CD"
|
10
|
+
|
11
|
+
Scenario: Add a work postal address to a contact
|
12
|
+
Given I am in the same address book as before
|
13
|
+
And I run "ppl post bob work --street '987 Working Road' --postal-code 'EF3 4GH'"
|
14
|
+
Then it should succeed
|
15
|
+
And bob should have 2 postal addresses
|
16
|
+
And the 2nd postal address should be " work 987 Working Road, EF3 4GH"
|
17
|
+
|
18
|
+
Scenario: Mark an existing postal address as preferred
|
19
|
+
Given I am in the same address book as before
|
20
|
+
And I run "ppl post bob work --preferred"
|
21
|
+
Then it should succeed
|
22
|
+
And bob should have 2 postal addresses
|
23
|
+
And "work" should be the preferred postal address
|
24
|
+
|
@@ -46,6 +46,11 @@ Then /^(bob) should have (\d+) phone numbers?$/ do |name, number|
|
|
46
46
|
@phone_numbers.length.should eq number.to_i
|
47
47
|
end
|
48
48
|
|
49
|
+
Then /^(bob) should have (\d+) postal addresse?s?$/ do |name, number|
|
50
|
+
@postal_addresses = ppl("post #{name}").split("\n")
|
51
|
+
@postal_addresses.length.should eq number.to_i
|
52
|
+
end
|
53
|
+
|
49
54
|
Then /^(bob) should have (\d+) URLs?$/ do |name, number|
|
50
55
|
@urls = ppl("url #{name}").split("\n")
|
51
56
|
@urls.length.should eq number.to_i
|
@@ -84,6 +89,10 @@ Then(/^the (\d+).. phone number should be "([^"]+)"$/) do |nth, phone_number|
|
|
84
89
|
@phone_numbers[nth.to_i - 1].should eq phone_number
|
85
90
|
end
|
86
91
|
|
92
|
+
Then(/^the (\d+).. postal address should be "([^"]+)"$/) do |nth, address|
|
93
|
+
@postal_addresses[nth.to_i - 1].should eq address
|
94
|
+
end
|
95
|
+
|
87
96
|
Then(/^the (\d+).. URL should be "([^"]+)"$/) do |nth, url|
|
88
97
|
@urls[nth.to_i - 1].should eq url
|
89
98
|
end
|
@@ -106,6 +115,14 @@ And /^"([^"]+)" should be the preferred phone number$/ do |phone_number|
|
|
106
115
|
end
|
107
116
|
end
|
108
117
|
|
118
|
+
And /^"([^"]+)" should be the preferred postal address$/ do |postal_address|
|
119
|
+
@postal_addresses.each do |line|
|
120
|
+
if line.include? "*"
|
121
|
+
line.should include "* #{postal_address}"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
109
126
|
And /^there should be no favourite email address$/ do
|
110
127
|
@email_addresses.each do |line|
|
111
128
|
line.should_not include "*"
|
@@ -1,5 +1,6 @@
|
|
1
1
|
|
2
2
|
require "greencard/vcard"
|
3
|
+
require "digest/sha1"
|
3
4
|
|
4
5
|
class Ppl::Adapter::Vcard::GreenCard
|
5
6
|
|
@@ -10,6 +11,7 @@ class Ppl::Adapter::Vcard::GreenCard
|
|
10
11
|
:country => :country,
|
11
12
|
:region => :region,
|
12
13
|
:locality => :locality,
|
14
|
+
:preferred => :preferred,
|
13
15
|
}
|
14
16
|
|
15
17
|
def encode(contact)
|
@@ -20,7 +22,7 @@ class Ppl::Adapter::Vcard::GreenCard
|
|
20
22
|
encode_phone_numbers(contact, maker)
|
21
23
|
encode_nicknames(contact, maker)
|
22
24
|
encode_organizations(contact, maker)
|
23
|
-
|
25
|
+
encode_postal_addresses(contact, maker)
|
24
26
|
encode_urls(contact, maker)
|
25
27
|
end
|
26
28
|
vcard.to_s
|
@@ -32,7 +34,7 @@ class Ppl::Adapter::Vcard::GreenCard
|
|
32
34
|
decode_birthday(vcard, contact)
|
33
35
|
decode_email_addresses(vcard, contact)
|
34
36
|
decode_phone_numbers(vcard, contact)
|
35
|
-
|
37
|
+
decode_postal_addresses(vcard, contact)
|
36
38
|
decode_nicknames(vcard, contact)
|
37
39
|
decode_organizations(vcard, contact)
|
38
40
|
decode_name(vcard, contact)
|
@@ -79,15 +81,20 @@ class Ppl::Adapter::Vcard::GreenCard
|
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
82
|
-
def
|
83
|
-
|
84
|
-
vcard_maker.add_addr do |
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
84
|
+
def encode_postal_addresses(contact, vcard_maker)
|
85
|
+
contact.postal_addresses.each do |postal_address|
|
86
|
+
vcard_maker.add_addr do |vcard_address|
|
87
|
+
encode_postal_address(postal_address, vcard_address)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def encode_postal_address(ppl_address, vcard_address)
|
93
|
+
vcard_address.location = ppl_address.id
|
94
|
+
@@postal_address_property_map.each_pair do |vpim_name, ppl_name|
|
95
|
+
value = ppl_address.send(ppl_name)
|
96
|
+
if !value.nil?
|
97
|
+
vcard_address.send("#{vpim_name.to_s}=", value)
|
91
98
|
end
|
92
99
|
end
|
93
100
|
end
|
@@ -126,15 +133,38 @@ class Ppl::Adapter::Vcard::GreenCard
|
|
126
133
|
end
|
127
134
|
end
|
128
135
|
|
129
|
-
def
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
136
|
+
def decode_postal_addresses(vcard, contact)
|
137
|
+
vcard.addresses.each do |vcard_address|
|
138
|
+
postal_address = decode_postal_address(vcard_address)
|
139
|
+
contact.postal_addresses << postal_address
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def decode_postal_address(vcard_address)
|
144
|
+
postal_address = Ppl::Entity::PostalAddress.new
|
145
|
+
postal_address.id = determine_postal_address_id(vcard_address)
|
146
|
+
@@postal_address_property_map.each_pair do |vpim_name, ppl_name|
|
147
|
+
value = vcard_address.send(vpim_name)
|
148
|
+
method = "#{ppl_name.to_s}="
|
149
|
+
postal_address.send(method, value)
|
150
|
+
end
|
151
|
+
postal_address
|
152
|
+
end
|
153
|
+
|
154
|
+
def determine_postal_address_id(vcard_address)
|
155
|
+
id = (vcard_address.location | vcard_address.nonstandard).join
|
156
|
+
if id == ""
|
157
|
+
id = Digest::SHA1.hexdigest([
|
158
|
+
vcard_address.country,
|
159
|
+
vcard_address.delivery,
|
160
|
+
vcard_address.locality,
|
161
|
+
vcard_address.pobox,
|
162
|
+
vcard_address.postalcode,
|
163
|
+
vcard_address.region,
|
164
|
+
vcard_address.street,
|
165
|
+
].join)[0..6]
|
137
166
|
end
|
167
|
+
id
|
138
168
|
end
|
139
169
|
|
140
170
|
def decode_phone_numbers(vcard, contact)
|
@@ -114,8 +114,10 @@ class Ppl::Application::Bootstrap
|
|
114
114
|
register :command_post do
|
115
115
|
post = Ppl::Command::Post.new
|
116
116
|
post.storage = storage_adapter
|
117
|
-
post.
|
118
|
-
post.
|
117
|
+
post.address_book_format = format_address_book_postal_addresses
|
118
|
+
post.contact_format = format_contact_postal_addresses
|
119
|
+
post.postal_address_format = format_postal_address_multi_line
|
120
|
+
post.address_service = postal_address_service
|
119
121
|
post
|
120
122
|
end
|
121
123
|
|
@@ -318,7 +320,7 @@ class Ppl::Application::Bootstrap
|
|
318
320
|
end
|
319
321
|
|
320
322
|
register :format_contact_postal_addresses do
|
321
|
-
Ppl::Format::Contact::
|
323
|
+
Ppl::Format::Contact::PostalAddresses.new
|
322
324
|
end
|
323
325
|
|
324
326
|
register :format_contact_urls do
|
@@ -326,6 +328,10 @@ class Ppl::Application::Bootstrap
|
|
326
328
|
Ppl::Format::Contact::Urls.new(colors)
|
327
329
|
end
|
328
330
|
|
331
|
+
register :format_postal_address_multi_line do
|
332
|
+
Ppl::Format::PostalAddress::MultiLine.new
|
333
|
+
end
|
334
|
+
|
329
335
|
register :input do
|
330
336
|
Ppl::Application::Input.new(ARGV.dup)
|
331
337
|
end
|
@@ -377,5 +383,9 @@ class Ppl::Application::Bootstrap
|
|
377
383
|
phone_service
|
378
384
|
end
|
379
385
|
|
386
|
+
register :postal_address_service do
|
387
|
+
Ppl::Service::PostalAddress.new
|
388
|
+
end
|
389
|
+
|
380
390
|
end
|
381
391
|
|
@@ -15,6 +15,8 @@ class Ppl::Application::Shell
|
|
15
15
|
output.error("ppl: No completion function available for '#{$!}'")
|
16
16
|
rescue Ppl::Error::ContactNotFound
|
17
17
|
output.error("ppl: Contact '#{$!}' not found")
|
18
|
+
rescue Ppl::Error::PostalAddressNotFound
|
19
|
+
output.error("ppl: Postal address '#{$!}' not found")
|
18
20
|
rescue OptionParser::InvalidOption, OptionParser::MissingArgument, Ppl::Error::IncorrectUsage
|
19
21
|
output.error($!)
|
20
22
|
output.error(@optparse.to_s)
|
data/lib/ppl/command/post.rb
CHANGED
@@ -4,8 +4,10 @@ class Ppl::Command::Post < Ppl::Application::Command
|
|
4
4
|
name "post"
|
5
5
|
description "List, show or change postal addresses"
|
6
6
|
|
7
|
-
attr_writer :
|
8
|
-
attr_writer :
|
7
|
+
attr_writer :address_service
|
8
|
+
attr_writer :contact_format
|
9
|
+
attr_writer :address_book_format
|
10
|
+
attr_writer :postal_address_format
|
9
11
|
|
10
12
|
def options(parser, options)
|
11
13
|
parser.banner = "usage: ppl post <contact> [address]"
|
@@ -29,6 +31,20 @@ class Ppl::Command::Post < Ppl::Application::Command
|
|
29
31
|
options[:country] = country
|
30
32
|
end
|
31
33
|
|
34
|
+
parser.on("-d", "--delete") do
|
35
|
+
options[:delete] = true
|
36
|
+
end
|
37
|
+
parser.on("-m", "--move <new-id>") do |new_id|
|
38
|
+
options[:new_id] = new_id
|
39
|
+
end
|
40
|
+
|
41
|
+
parser.on("-p", "--preferred", "mark address as preferred") do
|
42
|
+
options[:preferred] = true
|
43
|
+
end
|
44
|
+
parser.on("-P", "--not-preferred", "mark address as not preferred") do
|
45
|
+
options[:preferred] = false
|
46
|
+
end
|
47
|
+
|
32
48
|
end
|
33
49
|
|
34
50
|
def execute(input, output)
|
@@ -40,24 +56,35 @@ class Ppl::Command::Post < Ppl::Application::Command
|
|
40
56
|
private
|
41
57
|
|
42
58
|
def determine_action(input)
|
43
|
-
if input.arguments
|
44
|
-
:
|
59
|
+
if input.arguments.length < 1
|
60
|
+
:list_address_book_postal_addresses
|
61
|
+
elsif input.arguments.length < 2
|
62
|
+
:show_contact_postal_addresses
|
63
|
+
elsif input.options[:delete]
|
64
|
+
:delete_postal_address
|
45
65
|
elsif input.options.empty?
|
46
66
|
:show_postal_address
|
67
|
+
elsif existing_address?(input)
|
68
|
+
:update_postal_address
|
47
69
|
else
|
48
|
-
:
|
70
|
+
:create_postal_address
|
49
71
|
end
|
50
72
|
end
|
51
73
|
|
52
|
-
def
|
74
|
+
def existing_address?(input)
|
75
|
+
@contact = @storage.require_contact(input.arguments[0])
|
76
|
+
!@contact.postal_addresses.find { |p| p.id == input.arguments[1] }.nil?
|
77
|
+
end
|
78
|
+
|
79
|
+
def list_address_book_postal_addresses(input, output)
|
53
80
|
address_book = @storage.load_address_book
|
54
|
-
address_list = @
|
81
|
+
address_list = @address_book_format.process(address_book)
|
55
82
|
output.line(address_list)
|
56
83
|
end
|
57
84
|
|
58
|
-
def
|
85
|
+
def show_contact_postal_addresses(input, output)
|
59
86
|
contact = @storage.require_contact(input.arguments[0])
|
60
|
-
address = @
|
87
|
+
address = @contact_format.process(contact)
|
61
88
|
if address != ""
|
62
89
|
output.line(address)
|
63
90
|
true
|
@@ -66,17 +93,34 @@ class Ppl::Command::Post < Ppl::Application::Command
|
|
66
93
|
end
|
67
94
|
end
|
68
95
|
|
69
|
-
def
|
96
|
+
def show_postal_address(input, output)
|
70
97
|
contact = @storage.require_contact(input.arguments[0])
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
contact.set_postal_address do |address|
|
75
|
-
address.send("#{property.to_s}=", input.options[property])
|
76
|
-
end
|
98
|
+
address = contact.postal_addresses.find { |pa| pa.id == input.arguments[1] }
|
99
|
+
if address.nil?
|
100
|
+
raise Ppl::Error::PostalAddressNotFound, input.arguments[1]
|
77
101
|
end
|
102
|
+
display = @postal_address_format.process(address)
|
103
|
+
output.line(display)
|
104
|
+
true
|
105
|
+
end
|
78
106
|
|
107
|
+
def delete_postal_address(input, output)
|
108
|
+
contact = @storage.require_contact(input.arguments[0])
|
109
|
+
@address_service.remove(contact, input.arguments[1])
|
79
110
|
@storage.save_contact(contact)
|
111
|
+
true
|
112
|
+
end
|
113
|
+
|
114
|
+
def update_postal_address(input, output)
|
115
|
+
@address_service.update(@contact, input.arguments[1], input.options)
|
116
|
+
@storage.save_contact(@contact)
|
117
|
+
true
|
118
|
+
end
|
119
|
+
|
120
|
+
def create_postal_address(input, output)
|
121
|
+
@address_service.add(@contact, input.arguments[1], input.options)
|
122
|
+
@storage.save_contact(@contact)
|
123
|
+
true
|
80
124
|
end
|
81
125
|
|
82
126
|
end
|
data/lib/ppl/entity/contact.rb
CHANGED
@@ -9,6 +9,7 @@ class Ppl::Entity::Contact
|
|
9
9
|
attr_accessor :phone_numbers
|
10
10
|
attr_accessor :organizations
|
11
11
|
attr_accessor :postal_address
|
12
|
+
attr_accessor :postal_addresses
|
12
13
|
attr_accessor :urls
|
13
14
|
|
14
15
|
def initialize
|
@@ -16,6 +17,7 @@ class Ppl::Entity::Contact
|
|
16
17
|
@nicknames = []
|
17
18
|
@organizations = []
|
18
19
|
@phone_numbers = []
|
20
|
+
@postal_addresses = []
|
19
21
|
@urls = []
|
20
22
|
end
|
21
23
|
|
@@ -26,10 +28,6 @@ class Ppl::Entity::Contact
|
|
26
28
|
yield @postal_address
|
27
29
|
end
|
28
30
|
|
29
|
-
def has_email_address?(email_address)
|
30
|
-
@email_addresses.include? email_address
|
31
|
-
end
|
32
|
-
|
33
31
|
def age(on_date)
|
34
32
|
if @birthday.nil?
|
35
33
|
nil
|
@@ -39,5 +37,13 @@ class Ppl::Entity::Contact
|
|
39
37
|
end
|
40
38
|
end
|
41
39
|
|
40
|
+
def preferred_email_address
|
41
|
+
@email_addresses.find { |e| e.preferred }
|
42
|
+
end
|
43
|
+
|
44
|
+
def preferred_phone_number
|
45
|
+
@phone_numbers.find { |p| p.preferred }
|
46
|
+
end
|
47
|
+
|
42
48
|
end
|
43
49
|
|
@@ -1,6 +1,8 @@
|
|
1
1
|
|
2
2
|
class Ppl::Entity::PostalAddress
|
3
3
|
|
4
|
+
attr_accessor :id
|
5
|
+
attr_accessor :preferred
|
4
6
|
attr_accessor :country
|
5
7
|
attr_accessor :locality
|
6
8
|
attr_accessor :street
|
@@ -8,5 +10,9 @@ class Ppl::Entity::PostalAddress
|
|
8
10
|
attr_accessor :postal_code
|
9
11
|
attr_accessor :region
|
10
12
|
|
13
|
+
def initialize
|
14
|
+
@preferred = false
|
15
|
+
end
|
16
|
+
|
11
17
|
end
|
12
18
|
|
@@ -4,7 +4,7 @@ class Ppl::Format::AddressBook::PostalAddresses < Ppl::Format::AddressBook
|
|
4
4
|
attr_writer :table
|
5
5
|
|
6
6
|
def initialize(colors={})
|
7
|
-
@table = Ppl::Format::Table.new([:id, :
|
7
|
+
@table = Ppl::Format::Table.new([:id, :address_ids], colors)
|
8
8
|
end
|
9
9
|
|
10
10
|
def process(address_book)
|
@@ -12,30 +12,17 @@ class Ppl::Format::AddressBook::PostalAddresses < Ppl::Format::AddressBook
|
|
12
12
|
@table.to_s
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
15
|
private
|
17
16
|
|
18
17
|
def add_row(contact)
|
19
|
-
postal_address = nil
|
20
|
-
if !contact.postal_address.nil?
|
21
|
-
postal_address = format_postal_address(contact.postal_address)
|
22
|
-
end
|
23
18
|
@table.add_row({
|
24
|
-
:id
|
25
|
-
:
|
19
|
+
:id => sprintf("%s:", contact.id),
|
20
|
+
:address_ids => format_address_ids(contact.postal_addresses),
|
26
21
|
})
|
27
22
|
end
|
28
23
|
|
29
|
-
def
|
30
|
-
|
31
|
-
postal_address.street,
|
32
|
-
postal_address.locality,
|
33
|
-
postal_address.region,
|
34
|
-
postal_address.country,
|
35
|
-
postal_address.postal_code,
|
36
|
-
postal_address.po_box,
|
37
|
-
].select { |property| property != "" && !property.nil? }
|
38
|
-
pieces.join(", ")
|
24
|
+
def format_address_ids(postal_addresses)
|
25
|
+
postal_addresses.map { |pa| pa.id }.join(", ")
|
39
26
|
end
|
40
27
|
|
41
28
|
end
|
@@ -8,7 +8,7 @@ class Ppl::Format::Contact::Full < Ppl::Format::Contact
|
|
8
8
|
def initialize
|
9
9
|
@email_address_format = Ppl::Format::Contact::EmailAddresses.new
|
10
10
|
@phone_number_format = Ppl::Format::Contact::PhoneNumber.new
|
11
|
-
@postal_address_format = Ppl::Format::
|
11
|
+
@postal_address_format = Ppl::Format::Contact::PostalAddresses.new
|
12
12
|
end
|
13
13
|
|
14
14
|
def process(contact)
|
@@ -90,11 +90,10 @@ class Ppl::Format::Contact::Full < Ppl::Format::Contact
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def format_postal_addresses(contact)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
)
|
93
|
+
unless contact.postal_addresses.empty?
|
94
|
+
@lines << ""
|
95
|
+
@lines << "Postal Addresses"
|
96
|
+
@lines << @postal_address_format.process(contact)
|
98
97
|
end
|
99
98
|
end
|
100
99
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
class Ppl::Format::Contact::PostalAddresses < Ppl::Format::Contact
|
3
|
+
|
4
|
+
attr_writer :table
|
5
|
+
attr_writer :postal_address_format
|
6
|
+
|
7
|
+
def initialize(colors={})
|
8
|
+
@table = Ppl::Format::Table.new([:star, :address_id, :address_text], colors)
|
9
|
+
@postal_address_format = Ppl::Format::PostalAddress::OneLine.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def process(contact)
|
13
|
+
contact.postal_addresses.each do |postal_address|
|
14
|
+
format_postal_address(postal_address)
|
15
|
+
end
|
16
|
+
@table.to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def format_postal_address(postal_address)
|
22
|
+
@postal_address_format.process(postal_address, @table)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
@@ -28,12 +28,10 @@ class Ppl::Format::Custom::Contact < Ppl::Format::Custom
|
|
28
28
|
end
|
29
29
|
|
30
30
|
format :e do |contact|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
elsif !first.nil?
|
36
|
-
first.address
|
31
|
+
if !contact.preferred_email_address.nil?
|
32
|
+
contact.preferred_email_address.address
|
33
|
+
elsif !contact.email_addresses.first.nil?
|
34
|
+
contact.email_addresses.first.address
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
@@ -42,12 +40,10 @@ class Ppl::Format::Custom::Contact < Ppl::Format::Custom
|
|
42
40
|
end
|
43
41
|
|
44
42
|
format :p do |contact|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
elsif !first.nil?
|
50
|
-
first.number
|
43
|
+
if !contact.preferred_phone_number.nil?
|
44
|
+
contact.preferred_phone_number.number
|
45
|
+
elsif !contact.phone_numbers.first.nil?
|
46
|
+
contact.phone_numbers.first.number
|
51
47
|
end
|
52
48
|
end
|
53
49
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
class Ppl::Format::PostalAddress::MultiLine < Ppl::Format::AddressBook
|
3
|
+
|
4
|
+
def process(postal_address)
|
5
|
+
lines = []
|
6
|
+
lines << postal_address.street
|
7
|
+
lines << postal_address.locality
|
8
|
+
lines << postal_address.region
|
9
|
+
lines << postal_address.country
|
10
|
+
lines << postal_address.po_box
|
11
|
+
lines << postal_address.postal_code
|
12
|
+
lines.compact.reject(&:empty?).join "\n"
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
@@ -1,17 +1,29 @@
|
|
1
1
|
|
2
2
|
class Ppl::Format::PostalAddress::OneLine < Ppl::Format::AddressBook
|
3
3
|
|
4
|
-
def process(postal_address)
|
5
|
-
|
4
|
+
def process(postal_address, table)
|
5
|
+
table.add_row({
|
6
|
+
:star => format_star(postal_address),
|
7
|
+
:address_id => postal_address.id,
|
8
|
+
:address_text => format_address_text(postal_address),
|
9
|
+
})
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
6
13
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
pieces.push(postal_address.country) unless postal_address.country.nil?
|
11
|
-
pieces.push(postal_address.postal_code) unless postal_address.postal_code.nil?
|
12
|
-
pieces.push(postal_address.po_box) unless postal_address.po_box.nil?
|
14
|
+
def format_star(postal_address)
|
15
|
+
postal_address.preferred ? "*" : " "
|
16
|
+
end
|
13
17
|
|
14
|
-
|
18
|
+
def format_address_text(postal_address)
|
19
|
+
[
|
20
|
+
postal_address.street,
|
21
|
+
postal_address.locality,
|
22
|
+
postal_address.region,
|
23
|
+
postal_address.country,
|
24
|
+
postal_address.postal_code,
|
25
|
+
postal_address.po_box,
|
26
|
+
].compact.reject(&:empty?).join(", ")
|
15
27
|
end
|
16
28
|
|
17
29
|
end
|