ppl 1.24.0 → 1.25.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f33a5e4b27cd115dbac2ce3532e4fc81e93635e
4
- data.tar.gz: 1eef11f3f8784fa687c211b9343fe45e914c2cb2
3
+ metadata.gz: 3438ed54b9c4ab282ccc9a9389511777516fee7a
4
+ data.tar.gz: 63d86817042ebf3a768294d394bfc3c77ff60a01
5
5
  SHA512:
6
- metadata.gz: 19c1da0a40163b4e3b37f9ae01ef70b590b312b2dc381cdb5ba35f776261f85fda799736c0e5d0694a4f7d67e3a85f232f7ab961b95f8a2e15fd3f1f72e1ffe1
7
- data.tar.gz: 4798e2a97cdb5daf366d821e8b736d187798ef238a00329aae88d66149379cfad1207d98c8bf4f432099e4756617802c61a307458518876340dfbc386ace4973
6
+ metadata.gz: c789b838676b6d9cd50f0bcd6c0060fdd87287ed3f0dd6088c11ba5a9cd995e0306eb488bc40e2f81fe9c3c7ad91a5206f6cc586cae9f93c09d21f783ff1fec6
7
+ data.tar.gz: f48891ad62cc516d9a69a73ccfe84080b086017d8d307683e4934563786d18163f7e2b5c93ee17b2fbefae67c5485598cefbf8846fb001a5756b9f594da22f55
data/completions/bash CHANGED
@@ -211,7 +211,7 @@ __ppl_commands()
211
211
 
212
212
  __ppl_contact_ids()
213
213
  {
214
- ppl nick --no-color | cut -d ':' -f 1
214
+ ppl ls --format "%i"
215
215
  }
216
216
 
217
217
  __ppl_contact_email_addresses()
@@ -41,6 +41,7 @@ class Ppl::Application::Bootstrap
41
41
  email.storage = storage_adapter
42
42
  email.list_format = format_address_book_email_addresses
43
43
  email.show_format = format_contact_email_addresses
44
+ email.custom_format = format_email_address_custom
44
45
  email
45
46
  end
46
47
 
@@ -59,7 +60,8 @@ class Ppl::Application::Bootstrap
59
60
  register :command_ls do
60
61
  ls = Ppl::Command::Ls.new
61
62
  ls.storage = storage_adapter
62
- ls.format = format_address_book_one_line
63
+ ls.default_format = format_address_book_one_line
64
+ ls.custom_format = format_contact_custom
63
65
  ls
64
66
  end
65
67
 
@@ -278,6 +280,18 @@ class Ppl::Application::Bootstrap
278
280
  Ppl::Format::Contact::Birthday.new(colors)
279
281
  end
280
282
 
283
+ register :format_contact_custom do
284
+ custom = Ppl::Format::Custom::Contact.new
285
+ custom.preset_formats = configuration.pretty
286
+ custom
287
+ end
288
+
289
+ register :format_email_address_custom do
290
+ custom = Ppl::Format::Custom::EmailAddress.new
291
+ custom.preset_formats = configuration.pretty
292
+ custom
293
+ end
294
+
281
295
  register :format_contact_email_addresses do
282
296
  colors = configuration.command_colors("email")
283
297
  Ppl::Format::Contact::EmailAddresses.new(colors)
@@ -44,6 +44,10 @@ class Ppl::Application::Configuration
44
44
  result = config[search]
45
45
  end
46
46
 
47
+ def pretty
48
+ user_configuration["pretty"]
49
+ end
50
+
47
51
  private
48
52
 
49
53
  def default_configuration
@@ -7,6 +7,7 @@ class Ppl::Command::Email < Ppl::Application::Command
7
7
  attr_writer :email_service
8
8
  attr_writer :list_format
9
9
  attr_writer :show_format
10
+ attr_writer :custom_format
10
11
 
11
12
  def options(parser, options)
12
13
  parser.banner = "usage: ppl email <contact> [<email-address>]"
@@ -19,6 +20,9 @@ class Ppl::Command::Email < Ppl::Application::Command
19
20
  parser.on("-P", "--not-preferred", "mark address as not preferred") do
20
21
  options[:preferred] = false
21
22
  end
23
+ parser.on("--format <format>", "specify a custom output format") do |f|
24
+ options[:format] = f
25
+ end
22
26
  end
23
27
 
24
28
  def execute(input, output)
@@ -48,7 +52,7 @@ class Ppl::Command::Email < Ppl::Application::Command
48
52
 
49
53
  def show_contact_email_addresses(input, output)
50
54
  contact = @storage.require_contact(input.arguments[0])
51
- output.line(@show_format.process(contact))
55
+ output.line(format_contact(contact, input.options))
52
56
  end
53
57
 
54
58
  def remove_email_address_from_contact(input, output)
@@ -69,5 +73,14 @@ class Ppl::Command::Email < Ppl::Application::Command
69
73
  (contact.email_addresses.select { |ea| ea.address == email_address }).empty?
70
74
  end
71
75
 
76
+ def format_contact(contact, options)
77
+ if options[:format].nil?
78
+ @show_format.process(contact)
79
+ else
80
+ @custom_format.format = options[:format]
81
+ contact.email_addresses.map { |e| @custom_format.process(e) }.join("\n")
82
+ end
83
+ end
84
+
72
85
  end
73
86
 
@@ -4,17 +4,47 @@ class Ppl::Command::Ls < Ppl::Application::Command
4
4
  name "ls"
5
5
  description "List all contacts"
6
6
 
7
- attr_writer :format
7
+ attr_writer :default_format
8
+ attr_writer :custom_format
8
9
 
9
10
  def options(parser, options)
10
11
  parser.banner = "usage: ppl ls"
12
+ parser.on("--format <format>", "specify a custom output format") do |format|
13
+ options[:format] = format
14
+ end
15
+ parser.on("--pretty <format>", "specify a custom output format") do |pretty|
16
+ options[:pretty] = pretty
17
+ end
11
18
  end
12
19
 
13
20
  def execute(input, output)
14
21
  address_book = @storage.load_address_book
15
- formatted = @format.process(address_book)
22
+ formatted = format_address_book(address_book, input.options)
16
23
  output.line(formatted)
17
- return true
24
+ true
25
+ end
26
+
27
+ private
28
+
29
+ def format_address_book(address_book, options)
30
+ if custom_formatting? options
31
+ use_custom_format(address_book, options)
32
+ else
33
+ @default_format.process(address_book)
34
+ end
35
+ end
36
+
37
+ def custom_formatting?(options)
38
+ options[:pretty] || options[:format]
39
+ end
40
+
41
+ def use_custom_format(address_book, options)
42
+ if !options[:pretty].nil?
43
+ @custom_format.use_preset options[:pretty]
44
+ elsif !options[:format].nil?
45
+ @custom_format.format = options[:format]
46
+ end
47
+ address_book.contacts.map { |c| @custom_format.process(c) }.join("\n")
18
48
  end
19
49
 
20
50
  end
@@ -0,0 +1,55 @@
1
+
2
+ class Ppl::Format::Custom::Contact < Ppl::Format::Custom
3
+
4
+ format :n do |anything|
5
+ "\n"
6
+ end
7
+
8
+ format :i do |contact|
9
+ contact.id
10
+ end
11
+
12
+ format :N do |contact|
13
+ contact.name
14
+ end
15
+
16
+ format :a do |contact|
17
+ contact.age(Date.today)
18
+ end
19
+
20
+ format :b do |contact|
21
+ unless contact.birthday.nil?
22
+ contact.birthday.strftime("%Y-%m-%d")
23
+ end
24
+ end
25
+
26
+ format :k do |contact|
27
+ contact.nicknames.first
28
+ end
29
+
30
+ format :e do |contact|
31
+ preferred = contact.email_addresses.find { |e| e.preferred }
32
+ first = contact.email_addresses.first
33
+ if !preferred.nil?
34
+ preferred.address
35
+ elsif !first.nil?
36
+ first.address
37
+ end
38
+ end
39
+
40
+ format :o do |contact|
41
+ contact.organizations.first
42
+ end
43
+
44
+ format :p do |contact|
45
+ preferred = contact.phone_numbers.find { |p| p.preferred }
46
+ first = contact.phone_numbers.first
47
+ if !preferred.nil?
48
+ preferred.number
49
+ elsif !first.nil?
50
+ first.number
51
+ end
52
+ end
53
+
54
+ end
55
+
@@ -0,0 +1,15 @@
1
+
2
+ class Ppl::Format::Custom::EmailAddress < Ppl::Format::Custom
3
+
4
+ format :a do |email_adddress|
5
+ email_adddress.address
6
+ end
7
+
8
+ format :f do |email_adddress|
9
+ if email_adddress.preferred
10
+ "*"
11
+ end
12
+ end
13
+
14
+ end
15
+
@@ -0,0 +1,19 @@
1
+
2
+ class Ppl::Format::Custom::PhoneNumber < Ppl::Format::Custom
3
+
4
+ format :n do |phone_number|
5
+ phone_number.number
6
+ end
7
+
8
+ format :t do |phone_number|
9
+ phone_number.type
10
+ end
11
+
12
+ format :f do |phone_number|
13
+ if phone_number.preferred
14
+ "*"
15
+ end
16
+ end
17
+
18
+ end
19
+
@@ -0,0 +1,61 @@
1
+
2
+ class Ppl::Format::Custom
3
+
4
+ attr_accessor :format
5
+ attr_accessor :preset_formats
6
+
7
+ def self.format(symbol, &block)
8
+ @format_blocks ||= {}
9
+ @format_blocks[symbol] = block
10
+ end
11
+
12
+ def self.process(key, object)
13
+ if @format_blocks[key]
14
+ @format_blocks[key][object]
15
+ else
16
+ key
17
+ end
18
+ end
19
+
20
+ def initialize(format = nil)
21
+ @format = format
22
+ end
23
+
24
+ def process(object)
25
+ @object = object
26
+ string_pieces = @format.scan(/[^%]+|%-?\d*./)
27
+ string_pieces.map(&method(:process_piece)).join
28
+ end
29
+
30
+ def use_preset(format_name)
31
+ @format = @preset_formats[format_name]
32
+ end
33
+
34
+ private
35
+
36
+ def process_piece(string)
37
+ matches = string.scan(/^%(-?\d+)?([a-z])$/i)
38
+ if !matches.empty?
39
+ output = generate_output(matches[0][1].to_sym)
40
+ pad_output(output, matches[0][0].to_i)
41
+ else
42
+ string
43
+ end
44
+ end
45
+
46
+ def generate_output(symbol)
47
+ self.class.process(symbol, @object)
48
+ end
49
+
50
+ def pad_output(output, padding)
51
+ if padding > 0
52
+ output.to_s.rjust(padding, " ")
53
+ elsif padding < 0
54
+ output.to_s.ljust(padding.abs, " ")
55
+ else
56
+ output
57
+ end
58
+ end
59
+
60
+ end
61
+
data/lib/ppl.rb CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Ppl
3
3
 
4
- Version = "1.24.0"
4
+ Version = "1.25.0"
5
5
 
6
6
  module Adapter
7
7
  end
@@ -104,6 +104,10 @@ require "ppl/format/contact/organization"
104
104
  require "ppl/format/contact/phone_number"
105
105
  require "ppl/format/contact/postal_address"
106
106
  require "ppl/format/contact/urls"
107
+ require "ppl/format/custom"
108
+ require "ppl/format/custom/contact"
109
+ require "ppl/format/custom/email_address"
110
+ require "ppl/format/custom/phone_number"
107
111
  require "ppl/format/postal_address"
108
112
  require "ppl/format/postal_address/one_line"
109
113
  require "ppl/format/table"
data/ppl.gemspec CHANGED
@@ -2,8 +2,8 @@
2
2
  Gem::Specification.new do |spec|
3
3
 
4
4
  spec.name = "ppl"
5
- spec.version = "1.24.0"
6
- spec.date = "2013-04-23"
5
+ spec.version = "1.25.0"
6
+ spec.date = "2013-04-24"
7
7
 
8
8
  spec.required_ruby_version = ">= 1.9.3"
9
9
 
@@ -21,12 +21,14 @@ describe Ppl::Command::Email do
21
21
  @output = double(Ppl::Application::Output)
22
22
  @list_format = double(Ppl::Format::AddressBook)
23
23
  @show_format = double(Ppl::Format::Contact)
24
+ @custom_format = double(Ppl::Format::Custom)
24
25
  @storage.stub(:require_contact).and_return(@contact)
25
26
  @storage.stub(:save_contact)
26
27
  @command.storage = @storage
27
28
  @command.email_service = @service
28
29
  @command.list_format = @list_format
29
30
  @command.show_format = @show_format
31
+ @command.custom_format = @custom_format
30
32
  end
31
33
 
32
34
  it "should list all email addresses by default" do
@@ -43,6 +45,17 @@ describe Ppl::Command::Email do
43
45
  @output.should_receive(:line).with("imagine this is a list")
44
46
  @command.execute(@input, @output)
45
47
  end
48
+
49
+ it "should output addresses in a custom format if one is given" do
50
+ @input.arguments << "jdoe"
51
+ @input.options[:format] = "%e"
52
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("jdoe@example.org")
53
+ @storage.should_receive(:require_contact).and_return(@contact)
54
+ @custom_format.should_receive(:format=).with("%e")
55
+ @custom_format.should_receive(:process).and_return("")
56
+ @output.should_receive(:line).with("")
57
+ @command.execute(@input, @output)
58
+ end
46
59
 
47
60
  it "should delegate to the service layer to add a new email address" do
48
61
  @input.arguments = ["jdoe", "jdoe@example.org"]
@@ -7,10 +7,12 @@ describe Ppl::Command::Ls do
7
7
  @output = double(Ppl::Application::Output)
8
8
  @storage = double(Ppl::Adapter::Storage)
9
9
  @format = double(Ppl::Format::AddressBook)
10
+ @custom = double(Ppl::Format::Custom)
10
11
  @address_book = double(Ppl::Entity::AddressBook)
11
12
 
12
- @command.format = @format
13
- @command.storage = @storage
13
+ @command.custom_format = @custom
14
+ @command.default_format = @format
15
+ @command.storage = @storage
14
16
  end
15
17
 
16
18
  describe "#name" do
@@ -20,12 +22,36 @@ describe Ppl::Command::Ls do
20
22
  end
21
23
 
22
24
  describe "#execute" do
23
- it "should show the list of contacts in the address book" do
25
+
26
+ before(:each) do
24
27
  @storage.should_receive(:load_address_book).and_return(@address_book)
28
+ end
29
+
30
+ after(:each) do
31
+ @command.execute(@input, @output)
32
+ end
33
+
34
+ it "should show the list of contacts in the address book" do
25
35
  @format.should_receive(:process).and_return("list of contacts")
26
36
  @output.should_receive(:line).with("list of contacts")
27
- @command.execute(@input, @output)
28
37
  end
38
+
39
+ it "should let the user specify a preset pretty format" do
40
+ @input.options[:pretty] = "test"
41
+ @address_book.should_receive(:contacts).and_return([1])
42
+ @custom.should_receive(:use_preset).with("test")
43
+ @custom.should_receive(:process).and_return("list of contacts")
44
+ @output.should_receive(:line).with("list of contacts")
45
+ end
46
+
47
+ it "should let the user specify a custom format" do
48
+ @input.options[:format] = "%n"
49
+ @address_book.should_receive(:contacts).and_return([1])
50
+ @custom.should_receive(:format=).with("%n")
51
+ @custom.should_receive(:process).and_return("list of contacts")
52
+ @output.should_receive(:line).with("list of contacts")
53
+ end
54
+
29
55
  end
30
56
 
31
57
  end
@@ -0,0 +1,102 @@
1
+
2
+ describe Ppl::Format::Custom::Contact do
3
+
4
+ before(:each) do
5
+ @format = Ppl::Format::Custom::Contact.new
6
+ @contact = Ppl::Entity::Contact.new
7
+ end
8
+
9
+ describe "%n" do
10
+ it "should be replaced with a newlines" do
11
+ @format.format = "%n"
12
+ @format.process(@contact).should eq "\n"
13
+ end
14
+ end
15
+
16
+ describe "%i" do
17
+ it "should output the contact's ID" do
18
+ @contact.id = "test"
19
+ @format.format = "%i"
20
+ @format.process(@contact).should eq "test"
21
+ end
22
+ end
23
+
24
+ describe "%N" do
25
+ it "should output the contact's name" do
26
+ @contact.name = "John Doe"
27
+ @format.format = "%N"
28
+ @format.process(@contact).should eq "John Doe"
29
+ end
30
+ end
31
+
32
+ describe "%k" do
33
+ it "should output the contact's nickname" do
34
+ @contact.nicknames << "Johnny"
35
+ @format.format = "%k"
36
+ @format.process(@contact).should eq "Johnny"
37
+ end
38
+ end
39
+
40
+ describe "%a" do
41
+ it "should output the contact's age" do
42
+ @contact.birthday = Date.parse("2000-01-01")
43
+ Date.stub(:today).and_return(Date.parse("2010-01-02"))
44
+ @format.format = "%a"
45
+ @format.process(@contact).should eq "10"
46
+ end
47
+ end
48
+
49
+ describe "%b" do
50
+ it "should output the contact's birthday" do
51
+ @contact.birthday = Date.parse("1985-06-07")
52
+ @format.format = "%b"
53
+ @format.process(@contact).should eq "1985-06-07"
54
+ end
55
+ it "should cause no errors if there's no birthday" do
56
+ @contact.birthday = nil
57
+ @format.format = "%b"
58
+ @format.process(@contact).should eq ""
59
+ end
60
+ end
61
+
62
+ describe "%e" do
63
+ before(:each) do
64
+ @format.format = "%e"
65
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("a@example.org")
66
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("b@example.org")
67
+ end
68
+ it "should output the first email address" do
69
+ @format.process(@contact).should eq "a@example.org"
70
+ end
71
+ it "should output the preferred email address" do
72
+ @contact.email_addresses[1].preferred = true
73
+ @format.process(@contact).should eq "b@example.org"
74
+ end
75
+ end
76
+
77
+ describe "%p" do
78
+ before(:each) do
79
+ @format.format = "%p"
80
+ @contact.phone_numbers << Ppl::Entity::PhoneNumber.new("0123456789")
81
+ @contact.phone_numbers << Ppl::Entity::PhoneNumber.new("1098765432")
82
+ end
83
+ it "should output the first phone number" do
84
+ @format.process(@contact).should eq "0123456789"
85
+ end
86
+ it "should output the preferred phone number" do
87
+ @contact.phone_numbers[1].preferred = true
88
+ @format.process(@contact).should eq "1098765432"
89
+ end
90
+ end
91
+
92
+ describe "%o" do
93
+ it "should output the contact's organization" do
94
+ @contact.organizations << "WTF Inc"
95
+ @format.format = "%o"
96
+ @format.process(@contact).should eq "WTF Inc"
97
+ end
98
+ end
99
+
100
+ end
101
+
102
+
@@ -0,0 +1,33 @@
1
+
2
+ describe Ppl::Format::Custom::EmailAddress do
3
+
4
+ before(:each) do
5
+ @format = Ppl::Format::Custom::EmailAddress.new
6
+ @address = Ppl::Entity::EmailAddress.new
7
+ end
8
+
9
+ describe "%a" do
10
+ it "should output the address" do
11
+ @address.address = "test@example.org"
12
+ @format.format = "<%a>"
13
+ @format.process(@address).should eq "<test@example.org>"
14
+ end
15
+ end
16
+
17
+ describe "%f" do
18
+ before(:each) do
19
+ @format.format = "%f"
20
+ end
21
+ it "should output a star if the address is preferred" do
22
+ @address.preferred = true
23
+ @format.process(@address).should eq "*"
24
+ end
25
+ it "should output nothing if the address is not preferred" do
26
+ @address.preferred = false
27
+ @format.process(@address).should eq ""
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+
@@ -0,0 +1,41 @@
1
+
2
+ describe Ppl::Format::Custom::PhoneNumber do
3
+
4
+ before(:each) do
5
+ @format = Ppl::Format::Custom::PhoneNumber.new
6
+ @number = Ppl::Entity::PhoneNumber.new
7
+ end
8
+
9
+ describe "%n" do
10
+ it "should output the number itself" do
11
+ @number.number = "1234567890"
12
+ @format.format = "tel: %n"
13
+ @format.process(@number).should eq "tel: 1234567890"
14
+ end
15
+ end
16
+
17
+ describe "%t" do
18
+ it "should output the type of the number" do
19
+ @number.type = "cell"
20
+ @format.format = "(%t)"
21
+ @format.process(@number).should eq "(cell)"
22
+ end
23
+ end
24
+
25
+ describe "%f" do
26
+ before(:each) do
27
+ @format.format = "%f"
28
+ end
29
+ it "should output a star if the number is preferred" do
30
+ @number.preferred = true
31
+ @format.process(@number).should eq "*"
32
+ end
33
+ it "should output nothing if the number is not preferred" do
34
+ @number.preferred = false
35
+ @format.process(@number).should eq ""
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+
@@ -0,0 +1,50 @@
1
+
2
+ describe "Ppl::Format::Custom" do
3
+
4
+ describe "::format" do
5
+ it "should accept a symbol and a block" do
6
+ Ppl::Format::Custom::format :N do |h| h[:name] end
7
+ end
8
+ end
9
+
10
+ describe "::process" do
11
+ it "should use the block passed to ::format to process the object" do
12
+ Ppl::Format::Custom::process(:N, {:name => "jdoe"}).should eq "jdoe"
13
+ end
14
+ end
15
+
16
+ describe "#initialize" do
17
+ it "should accept a format string" do
18
+ Ppl::Format::Custom.new("%N").format.should eq "%N"
19
+ end
20
+ end
21
+
22
+ describe "#process" do
23
+ it "should convert the given object into a string based on the format" do
24
+ custom = Ppl::Format::Custom.new("%N %N %N")
25
+ object = { :name => "jdoe" }
26
+ custom.process(object).should eq "jdoe jdoe jdoe"
27
+ end
28
+ it "should pad with leading spaces if a positive width is given" do
29
+ custom = Ppl::Format::Custom.new("%10N")
30
+ object = { :name => "jdoe" }
31
+ custom.process(object).should eq " jdoe"
32
+ end
33
+ it "should pad with trailing spaces if a negative width is given" do
34
+ custom = Ppl::Format::Custom.new("%-10N")
35
+ object = { :name => "jdoe" }
36
+ custom.process(object).should eq "jdoe "
37
+ end
38
+ end
39
+
40
+ describe "#use_preset" do
41
+ it "should set the format string to the preset with the given name" do
42
+ custom = Ppl::Format::Custom.new
43
+ custom.preset_formats = { "example" => "%N (%N)" }
44
+ custom.use_preset "example"
45
+ custom.process({:name => "a"}).should eq "a (a)"
46
+ end
47
+ end
48
+
49
+ end
50
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ppl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.24.0
4
+ version: 1.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henry Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-23 00:00:00.000000000 Z
11
+ date: 2013-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colored
@@ -255,6 +255,10 @@ files:
255
255
  - lib/ppl/format/contact/phone_number.rb
256
256
  - lib/ppl/format/contact/postal_address.rb
257
257
  - lib/ppl/format/contact/urls.rb
258
+ - lib/ppl/format/custom.rb
259
+ - lib/ppl/format/custom/contact.rb
260
+ - lib/ppl/format/custom/email_address.rb
261
+ - lib/ppl/format/custom/phone_number.rb
258
262
  - lib/ppl/format/postal_address.rb
259
263
  - lib/ppl/format/postal_address/one_line.rb
260
264
  - lib/ppl/format/table.rb
@@ -330,6 +334,10 @@ files:
330
334
  - spec/ppl/format/contact/postal_address_spec.rb
331
335
  - spec/ppl/format/contact/urls_spec.rb
332
336
  - spec/ppl/format/contact_spec.rb
337
+ - spec/ppl/format/custom/contact_spec.rb
338
+ - spec/ppl/format/custom/email_address_spec.rb
339
+ - spec/ppl/format/custom/phone_number_spec.rb
340
+ - spec/ppl/format/custom_spec.rb
333
341
  - spec/ppl/format/postal_address/one_line_spec.rb
334
342
  - spec/ppl/format/postal_address_spec.rb
335
343
  - spec/ppl/format/table_spec.rb