ppl 1.25.0 → 2.0.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/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
@@ -0,0 +1,65 @@
|
|
1
|
+
|
2
|
+
class Ppl::Service::PostalAddress
|
3
|
+
|
4
|
+
def add(contact, address_id, options)
|
5
|
+
address = Ppl::Entity::PostalAddress.new
|
6
|
+
address.id = address_id
|
7
|
+
update_postal_address(contact, address, options)
|
8
|
+
contact.postal_addresses << address
|
9
|
+
end
|
10
|
+
|
11
|
+
def update(contact, address_id, options)
|
12
|
+
address = contact.postal_addresses.find { |p| p.id == address_id }
|
13
|
+
update_postal_address(contact, address, options)
|
14
|
+
if options[:new_id]
|
15
|
+
move(contact, address_id, options[:new_id])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def remove(contact, address_id)
|
20
|
+
require_address(contact, address_id)
|
21
|
+
contact.postal_addresses.reject! { |pa| pa.id == address_id }
|
22
|
+
end
|
23
|
+
|
24
|
+
def move(contact, address_id, new_address_id)
|
25
|
+
address = require_address(contact, address_id)
|
26
|
+
id_okay = contact.postal_addresses.select { |pa| pa.id == new_address_id }.empty?
|
27
|
+
if id_okay
|
28
|
+
address.id = new_address_id
|
29
|
+
else
|
30
|
+
raise "Address '#{new_address_id}' is already in use"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def require_address(contact, address_id)
|
37
|
+
address = contact.postal_addresses.find { |p| p.id == address_id }
|
38
|
+
if address.nil?
|
39
|
+
raise Ppl::Error::PostalAddressNotFound, address_id
|
40
|
+
end
|
41
|
+
address
|
42
|
+
end
|
43
|
+
|
44
|
+
def update_postal_address(contact, address, options)
|
45
|
+
[
|
46
|
+
:country,
|
47
|
+
:locality,
|
48
|
+
:po_box,
|
49
|
+
:postal_code,
|
50
|
+
:region,
|
51
|
+
:street,
|
52
|
+
].each do |property|
|
53
|
+
unless options[property].nil?
|
54
|
+
address.send("#{property.to_s}=", options[property])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
if options[:preferred] == true
|
58
|
+
contact.postal_addresses.each { |pa| pa.preferred = (pa.id == address.id) }
|
59
|
+
elsif options[:preferred] == false
|
60
|
+
address.preferred = false
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
data/lib/ppl.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
module Ppl
|
3
3
|
|
4
|
-
Version = "
|
4
|
+
Version = "2.0.0"
|
5
5
|
|
6
6
|
module Adapter
|
7
7
|
end
|
@@ -80,6 +80,7 @@ require "ppl/entity/postal_address"
|
|
80
80
|
require "ppl/error/completion_not_found"
|
81
81
|
require "ppl/error/contact_not_found"
|
82
82
|
require "ppl/error/incorrect_usage"
|
83
|
+
require "ppl/error/postal_address_not_found"
|
83
84
|
|
84
85
|
require "ppl/format/address_book"
|
85
86
|
require "ppl/format/address_book/ages"
|
@@ -103,17 +104,20 @@ require "ppl/format/contact/nicknames"
|
|
103
104
|
require "ppl/format/contact/organization"
|
104
105
|
require "ppl/format/contact/phone_number"
|
105
106
|
require "ppl/format/contact/postal_address"
|
107
|
+
require "ppl/format/contact/postal_addresses"
|
106
108
|
require "ppl/format/contact/urls"
|
107
109
|
require "ppl/format/custom"
|
108
110
|
require "ppl/format/custom/contact"
|
109
111
|
require "ppl/format/custom/email_address"
|
110
112
|
require "ppl/format/custom/phone_number"
|
111
113
|
require "ppl/format/postal_address"
|
114
|
+
require "ppl/format/postal_address/multi_line"
|
112
115
|
require "ppl/format/postal_address/one_line"
|
113
116
|
require "ppl/format/table"
|
114
117
|
|
115
118
|
require "ppl/service/email_address"
|
116
119
|
require "ppl/service/phone_number"
|
120
|
+
require "ppl/service/postal_address"
|
117
121
|
|
118
122
|
class String
|
119
123
|
alias_method :each, :each_line
|
data/ppl.gemspec
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
Gem::Specification.new do |spec|
|
3
3
|
|
4
4
|
spec.name = "ppl"
|
5
|
-
spec.version = "
|
6
|
-
spec.date = "2013-
|
5
|
+
spec.version = "2.0.0"
|
6
|
+
spec.date = "2013-05-09"
|
7
7
|
|
8
8
|
spec.required_ruby_version = ">= 1.9.3"
|
9
9
|
|
10
|
-
spec.summary = "
|
11
|
-
spec.description = "
|
10
|
+
spec.summary = "The command line address book"
|
11
|
+
spec.description = "ppl is a command-line address book using vCard & git for storage and synchronisation"
|
12
12
|
spec.license = "GPL-2"
|
13
13
|
|
14
14
|
spec.add_dependency("colored", "1.2")
|
@@ -51,40 +51,53 @@ describe Ppl::Adapter::Vcard::GreenCard, "#encode" do
|
|
51
51
|
@adapter.encode(@contact).should include("ORG:Example Ltd")
|
52
52
|
end
|
53
53
|
|
54
|
-
|
55
|
-
@contact.postal_address = Ppl::Entity::PostalAddress.new
|
56
|
-
@contact.postal_address.street = "1 Testing Road"
|
57
|
-
@adapter.encode(@contact).should include("ADR:;;1 Testing Road;;;;")
|
58
|
-
end
|
54
|
+
describe "postal address encoding" do
|
59
55
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
56
|
+
before(:each) do
|
57
|
+
@address = Ppl::Entity::PostalAddress.new
|
58
|
+
@contact.postal_addresses << @address
|
59
|
+
end
|
65
60
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
end
|
61
|
+
it "should encode the address id" do
|
62
|
+
@contact.postal_addresses[0].id = "home"
|
63
|
+
@adapter.encode(@contact).should include("ADR;TYPE=home:;;;;;;")
|
64
|
+
end
|
71
65
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
end
|
66
|
+
it "should encode the preferred status of the address" do
|
67
|
+
@contact.postal_addresses[0].preferred = true
|
68
|
+
@adapter.encode(@contact).should include("ADR;TYPE=pref:;;;;;;")
|
69
|
+
end
|
77
70
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
71
|
+
it "should encode the contact's street address" do
|
72
|
+
@contact.postal_addresses[0].street = "1 Testing Road"
|
73
|
+
@adapter.encode(@contact).should include("ADR:;;1 Testing Road;;;;")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should encode the contact's postal code" do
|
77
|
+
@contact.postal_addresses[0].postal_code = "L7 8AA"
|
78
|
+
@adapter.encode(@contact).should include("ADR:;;;;;L7 8AA;")
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should encode the contact's po box" do
|
82
|
+
@contact.postal_addresses[0].po_box = "123456"
|
83
|
+
@adapter.encode(@contact).should include("ADR:123456;;;;;;")
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should encode the contact's locality" do
|
87
|
+
@contact.postal_addresses[0].locality = "Liverpool"
|
88
|
+
@adapter.encode(@contact).should include("ADR:;;;Liverpool;;;")
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should encode the contact's country" do
|
92
|
+
@contact.postal_addresses[0].country = "UK"
|
93
|
+
@adapter.encode(@contact).should include("ADR:;;;;;;UK")
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should encode the contact's region" do
|
97
|
+
@contact.postal_addresses[0].region = "South West"
|
98
|
+
@adapter.encode(@contact).should include("ADR:;;;;South West;;")
|
99
|
+
end
|
83
100
|
|
84
|
-
it "should encode the contact's region" do
|
85
|
-
@contact.postal_address = Ppl::Entity::PostalAddress.new
|
86
|
-
@contact.postal_address.region = "South West"
|
87
|
-
@adapter.encode(@contact).should include("ADR:;;;;South West;;")
|
88
101
|
end
|
89
102
|
|
90
103
|
it "should encode the contact's URL" do
|
@@ -229,76 +242,116 @@ describe Ppl::Adapter::Vcard::GreenCard, "#decode" do
|
|
229
242
|
contact.organizations.first.should eq "Example Ltd"
|
230
243
|
end
|
231
244
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
245
|
+
describe "postal address decoding" do
|
246
|
+
|
247
|
+
it "should decode the postal address' ID" do
|
248
|
+
vcard = [
|
249
|
+
"BEGIN:VCARD",
|
250
|
+
"N:,test",
|
251
|
+
"VERSION:3.0",
|
252
|
+
"ADR;TYPE=home:;;1 Testing Road;;;;",
|
253
|
+
"END:VCARD",
|
254
|
+
].join("\n")
|
255
|
+
contact = @adapter.decode(vcard)
|
256
|
+
contact.postal_addresses[0].id.should eq "home"
|
257
|
+
end
|
258
|
+
|
259
|
+
it "should decode the postal address' ID even if it's a nonstandard type" do
|
260
|
+
vcard = [
|
261
|
+
"BEGIN:VCARD",
|
262
|
+
"N:,test",
|
263
|
+
"VERSION:3.0",
|
264
|
+
"ADR;TYPE=nasa:;;1 Testing Road;;;;",
|
265
|
+
"END:VCARD",
|
266
|
+
].join("\n")
|
267
|
+
contact = @adapter.decode(vcard)
|
268
|
+
contact.postal_addresses[0].id.should eq "nasa"
|
269
|
+
end
|
270
|
+
|
271
|
+
it "should assign the postal address a fallback ID if necessary" do
|
272
|
+
vcard = [
|
273
|
+
"BEGIN:VCARD",
|
274
|
+
"N:,test",
|
275
|
+
"VERSION:3.0",
|
276
|
+
"ADR:;;1 Testing Road;;;;",
|
277
|
+
"END:VCARD",
|
278
|
+
].join("\n")
|
279
|
+
contact = @adapter.decode(vcard)
|
280
|
+
contact.postal_addresses[0].id.should eq "910c67f"
|
281
|
+
end
|
282
|
+
|
283
|
+
it "should decode the contact's street address" do
|
284
|
+
vcard = [
|
285
|
+
"BEGIN:VCARD",
|
286
|
+
"N:,test",
|
287
|
+
"VERSION:3.0",
|
288
|
+
"ADR:;;1 Testing Road;;;;",
|
289
|
+
"END:VCARD",
|
290
|
+
].join("\n")
|
291
|
+
contact = @adapter.decode(vcard)
|
292
|
+
contact.postal_addresses[0].street.should eq "1 Testing Road"
|
293
|
+
end
|
294
|
+
|
295
|
+
it "should decode the contact's postal code" do
|
296
|
+
vcard = [
|
297
|
+
"BEGIN:VCARD",
|
298
|
+
"N:,test",
|
299
|
+
"VERSION:3.0",
|
300
|
+
"ADR:;;;;;L7 8AA;",
|
301
|
+
"END:VCARD",
|
302
|
+
].join("\n")
|
303
|
+
contact = @adapter.decode(vcard)
|
304
|
+
contact.postal_addresses[0].postal_code.should eq "L7 8AA"
|
305
|
+
end
|
306
|
+
|
307
|
+
it "should decode the contact's po box" do
|
308
|
+
vcard = [
|
309
|
+
"BEGIN:VCARD",
|
310
|
+
"N:,test",
|
311
|
+
"VERSION:3.0",
|
312
|
+
"ADR:123456;;;;;;",
|
313
|
+
"END:VCARD",
|
314
|
+
].join("\n")
|
315
|
+
contact = @adapter.decode(vcard)
|
316
|
+
contact.postal_addresses[0].po_box.should eq "123456"
|
317
|
+
end
|
318
|
+
|
319
|
+
it "should decode the contact's locality" do
|
320
|
+
vcard = [
|
321
|
+
"BEGIN:VCARD",
|
322
|
+
"N:,test",
|
323
|
+
"VERSION:3.0",
|
324
|
+
"ADR:;;;Liverpool;;;",
|
325
|
+
"END:VCARD",
|
326
|
+
].join("\n")
|
327
|
+
contact = @adapter.decode(vcard)
|
328
|
+
contact.postal_addresses[0].locality.should eq "Liverpool"
|
329
|
+
end
|
330
|
+
|
331
|
+
it "should decode the contact's region" do
|
332
|
+
vcard = [
|
333
|
+
"BEGIN:VCARD",
|
334
|
+
"N:,test",
|
335
|
+
"VERSION:3.0",
|
336
|
+
"ADR:;;;;South West;;",
|
337
|
+
"END:VCARD",
|
338
|
+
].join("\n")
|
339
|
+
contact = @adapter.decode(vcard)
|
340
|
+
contact.postal_addresses[0].region.should eq "South West"
|
341
|
+
end
|
342
|
+
|
343
|
+
it "should decode the contact's country" do
|
344
|
+
vcard = [
|
345
|
+
"BEGIN:VCARD",
|
346
|
+
"N:,test",
|
347
|
+
"VERSION:3.0",
|
348
|
+
"ADR:;;;;;;UK",
|
349
|
+
"END:VCARD",
|
350
|
+
].join("\n")
|
351
|
+
contact = @adapter.decode(vcard)
|
352
|
+
contact.postal_addresses[0].country.should eq "UK"
|
353
|
+
end
|
243
354
|
|
244
|
-
it "should decode the contact's postal code" do
|
245
|
-
vcard = [
|
246
|
-
"BEGIN:VCARD",
|
247
|
-
"N:,test",
|
248
|
-
"VERSION:3.0",
|
249
|
-
"ADR:;;;;;L7 8AA;",
|
250
|
-
"END:VCARD",
|
251
|
-
].join("\n")
|
252
|
-
contact = @adapter.decode(vcard)
|
253
|
-
contact.postal_address.postal_code.should eq "L7 8AA"
|
254
|
-
end
|
255
|
-
|
256
|
-
it "should decode the contact's po box" do
|
257
|
-
vcard = [
|
258
|
-
"BEGIN:VCARD",
|
259
|
-
"N:,test",
|
260
|
-
"VERSION:3.0",
|
261
|
-
"ADR:123456;;;;;;",
|
262
|
-
"END:VCARD",
|
263
|
-
].join("\n")
|
264
|
-
contact = @adapter.decode(vcard)
|
265
|
-
contact.postal_address.po_box.should eq "123456"
|
266
|
-
end
|
267
|
-
|
268
|
-
it "should decode the contact's locality" do
|
269
|
-
vcard = [
|
270
|
-
"BEGIN:VCARD",
|
271
|
-
"N:,test",
|
272
|
-
"VERSION:3.0",
|
273
|
-
"ADR:;;;Liverpool;;;",
|
274
|
-
"END:VCARD",
|
275
|
-
].join("\n")
|
276
|
-
contact = @adapter.decode(vcard)
|
277
|
-
contact.postal_address.locality.should eq "Liverpool"
|
278
|
-
end
|
279
|
-
|
280
|
-
it "should decode the contact's region" do
|
281
|
-
vcard = [
|
282
|
-
"BEGIN:VCARD",
|
283
|
-
"N:,test",
|
284
|
-
"VERSION:3.0",
|
285
|
-
"ADR:;;;;South West;;",
|
286
|
-
"END:VCARD",
|
287
|
-
].join("\n")
|
288
|
-
contact = @adapter.decode(vcard)
|
289
|
-
contact.postal_address.region.should eq "South West"
|
290
|
-
end
|
291
|
-
|
292
|
-
it "should decode the contact's country" do
|
293
|
-
vcard = [
|
294
|
-
"BEGIN:VCARD",
|
295
|
-
"N:,test",
|
296
|
-
"VERSION:3.0",
|
297
|
-
"ADR:;;;;;;UK",
|
298
|
-
"END:VCARD",
|
299
|
-
].join("\n")
|
300
|
-
contact = @adapter.decode(vcard)
|
301
|
-
contact.postal_address.country.should eq "UK"
|
302
355
|
end
|
303
356
|
|
304
357
|
it "should decode the contact's URL" do
|
@@ -389,8 +389,8 @@ describe Ppl::Application::Bootstrap do
|
|
389
389
|
end
|
390
390
|
|
391
391
|
describe "#format_contact_postal_addresses" do
|
392
|
-
it "should return a Ppl::Format::Contact::
|
393
|
-
@bootstrap.format_contact_postal_addresses.should be_a(Ppl::Format::Contact::
|
392
|
+
it "should return a Ppl::Format::Contact::PostalAddresses" do
|
393
|
+
@bootstrap.format_contact_postal_addresses.should be_a(Ppl::Format::Contact::PostalAddresses)
|
394
394
|
end
|
395
395
|
end
|
396
396
|
|
@@ -407,6 +407,12 @@ describe Ppl::Application::Bootstrap do
|
|
407
407
|
end
|
408
408
|
end
|
409
409
|
|
410
|
+
describe "#format_postal_address_multi_line" do
|
411
|
+
it "should return a Ppl::Format::PostalAddress::MultiLine" do
|
412
|
+
@bootstrap.format_postal_address_multi_line.should be_a(Ppl::Format::PostalAddress::MultiLine)
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
410
416
|
describe "#command_suite" do
|
411
417
|
|
412
418
|
before(:each) do
|
@@ -553,5 +559,11 @@ describe Ppl::Application::Bootstrap do
|
|
553
559
|
end
|
554
560
|
end
|
555
561
|
|
562
|
+
describe "#postal_address_service" do
|
563
|
+
it "should return a Ppl::Service::PostalAddress" do
|
564
|
+
@bootstrap.postal_address_service.should be_a(Ppl::Service::PostalAddress)
|
565
|
+
end
|
566
|
+
end
|
567
|
+
|
556
568
|
end
|
557
569
|
|
@@ -99,6 +99,14 @@ describe Ppl::Application::Shell do
|
|
99
99
|
@shell.run(@input, @output)
|
100
100
|
end
|
101
101
|
|
102
|
+
it "should handle PostalAddressNotFound errors nicely" do
|
103
|
+
@command.stub(:options)
|
104
|
+
@command.should_receive(:execute) { raise Ppl::Error::PostalAddressNotFound, "example" }
|
105
|
+
@router.should_receive(:route).and_return(@command)
|
106
|
+
@output.should_receive(:error).with("ppl: Postal address 'example' not found")
|
107
|
+
@shell.run(@input, @output)
|
108
|
+
end
|
109
|
+
|
102
110
|
end
|
103
111
|
|
104
112
|
end
|
@@ -7,14 +7,22 @@ describe Ppl::Command::Post do
|
|
7
7
|
@contact = Ppl::Entity::Contact.new
|
8
8
|
@command = Ppl::Command::Post.new
|
9
9
|
@storage = double(Ppl::Adapter::Storage)
|
10
|
+
@service = double(Ppl::Service::PostalAddress)
|
10
11
|
|
11
|
-
@
|
12
|
-
@
|
12
|
+
@address_book_format = double(Ppl::Format::AddressBook)
|
13
|
+
@contact_format = double(Ppl::Format::Contact)
|
14
|
+
@postal_address_format = double(Ppl::Format::PostalAddress)
|
13
15
|
|
16
|
+
@command.address_service = @service
|
14
17
|
@command.storage = @storage
|
15
|
-
@command.
|
16
|
-
@command.
|
18
|
+
@command.contact_format = @contact_format
|
19
|
+
@command.address_book_format = @address_book_format
|
20
|
+
@command.postal_address_format = @postal_address_format
|
17
21
|
@contact.id = "jim"
|
22
|
+
|
23
|
+
@address = Ppl::Entity::PostalAddress.new
|
24
|
+
@address.id = "home"
|
25
|
+
@contact.postal_addresses << @address
|
18
26
|
end
|
19
27
|
|
20
28
|
describe "#name" do
|
@@ -25,84 +33,98 @@ describe Ppl::Command::Post do
|
|
25
33
|
|
26
34
|
describe "#execute" do
|
27
35
|
|
28
|
-
|
29
|
-
@storage.should_receive(:load_address_book).and_return(@address_book)
|
30
|
-
@list_format.should_receive(:process).and_return("all the postal addresses")
|
31
|
-
@output.should_receive(:line).with("all the postal addresses")
|
32
|
-
@input.arguments = []
|
33
|
-
@command.execute(@input, @output)
|
34
|
-
end
|
36
|
+
context "show address book" do
|
35
37
|
|
36
|
-
|
37
|
-
@storage.should_receive(:require_contact).and_return(@contact)
|
38
|
-
@show_format.should_receive(:process).and_return("1 Test Road")
|
39
|
-
@output.should_receive(:line).with("1 Test Road")
|
40
|
-
@input.arguments = ["jim"]
|
41
|
-
@command.execute(@input, @output).should eq true
|
42
|
-
end
|
38
|
+
before { @input.arguments = [] }
|
43
39
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
40
|
+
it "displays postal address information for the whole address book" do
|
41
|
+
@storage.should_receive(:load_address_book).and_return(@address_book)
|
42
|
+
@address_book_format.should_receive(:process).and_return("all the postal addresses")
|
43
|
+
@output.should_receive(:line).with("all the postal addresses")
|
44
|
+
@input.arguments = []
|
45
|
+
@command.execute(@input, @output)
|
46
|
+
end
|
49
47
|
end
|
50
48
|
|
51
|
-
|
49
|
+
context "show contact" do
|
52
50
|
|
53
|
-
|
54
|
-
|
55
|
-
before(:each) do
|
56
|
-
@input.arguments = ["jim"]
|
57
|
-
@storage.should_receive(:require_contact).and_return(@contact)
|
58
|
-
end
|
51
|
+
before { @input.arguments = ["jim"] }
|
59
52
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
53
|
+
it "shows all of a contact's postal addresses" do
|
54
|
+
@storage.should_receive(:require_contact).and_return(@contact)
|
55
|
+
@contact_format.should_receive(:process).and_return("1 Test Road")
|
56
|
+
@output.should_receive(:line).with("1 Test Road")
|
57
|
+
@command.execute(@input, @output).should eq true
|
64
58
|
end
|
65
|
-
@command.execute(@input, @output)
|
66
|
-
end
|
67
59
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
60
|
+
it "outputs nothing if the contact has no addresses" do
|
61
|
+
@storage.should_receive(:require_contact).and_return(@contact)
|
62
|
+
@contact_format.should_receive(:process).and_return("")
|
63
|
+
@command.execute(@input, @output).should eq false
|
72
64
|
end
|
73
|
-
|
65
|
+
|
74
66
|
end
|
75
67
|
|
76
|
-
|
77
|
-
|
78
|
-
@
|
79
|
-
|
68
|
+
context "show postal address" do
|
69
|
+
|
70
|
+
before { @input.arguments = ["jim", "home"] }
|
71
|
+
|
72
|
+
it "shows a single postal address" do
|
73
|
+
@storage.should_receive(:require_contact).and_return(@contact)
|
74
|
+
@postal_address_format.should_receive(:process).with(@address).and_return("1 Test Road")
|
75
|
+
@output.should_receive(:line).with("1 Test Road")
|
76
|
+
@command.execute(@input, @output).should eq true
|
77
|
+
end
|
78
|
+
|
79
|
+
it "raises an error if there's no such address" do
|
80
|
+
@input.arguments[1] = "other"
|
81
|
+
@storage.should_receive(:require_contact).and_return(@contact)
|
82
|
+
expect{@command.execute(@input, @output).should eq true}.to raise_error(Ppl::Error::PostalAddressNotFound)
|
80
83
|
end
|
81
|
-
|
84
|
+
|
82
85
|
end
|
83
86
|
|
84
|
-
|
85
|
-
|
86
|
-
@
|
87
|
-
|
87
|
+
context "delete postal address" do
|
88
|
+
|
89
|
+
before { @input.arguments = ["jim", "home"] }
|
90
|
+
before { @input.options = { :delete => true }}
|
91
|
+
|
92
|
+
it "deletes the postal address" do
|
93
|
+
@storage.should_receive(:require_contact).and_return(@contact)
|
94
|
+
@service.should_receive(:remove).with(@contact, "home")
|
95
|
+
@storage.should_receive(:save_contact)
|
96
|
+
@command.execute(@input, @output).should eq true
|
88
97
|
end
|
89
|
-
|
98
|
+
|
90
99
|
end
|
91
100
|
|
92
|
-
|
93
|
-
|
94
|
-
@
|
95
|
-
|
101
|
+
context "update postal address" do
|
102
|
+
|
103
|
+
before { @input.arguments = ["jim", "home"] }
|
104
|
+
before { @input.options = { :country => "New Country" }}
|
105
|
+
|
106
|
+
it "updates the postal address" do
|
107
|
+
@storage.should_receive(:require_contact).and_return(@contact)
|
108
|
+
@service.should_receive(:update).with(@contact, "home", {:country => "New Country"})
|
109
|
+
@storage.should_receive(:save_contact)
|
110
|
+
@command.execute(@input, @output).should eq true
|
96
111
|
end
|
97
|
-
|
112
|
+
|
98
113
|
end
|
99
114
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
115
|
+
|
116
|
+
context "add postal address" do
|
117
|
+
|
118
|
+
before { @input.arguments = ["jim", "newaddress"] }
|
119
|
+
before { @input.options = { :street => "123 Swim St" }}
|
120
|
+
|
121
|
+
it "adds the postal address" do
|
122
|
+
@storage.should_receive(:require_contact).and_return(@contact)
|
123
|
+
@service.should_receive(:add).with(@contact, "newaddress", {:street => "123 Swim St"})
|
124
|
+
@storage.should_receive(:save_contact)
|
125
|
+
@command.execute(@input, @output).should eq true
|
104
126
|
end
|
105
|
-
|
127
|
+
|
106
128
|
end
|
107
129
|
|
108
130
|
end
|