ppl 0.0.4 → 0.0.5
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.md +12 -10
- data/bin/ppl +2 -1
- data/lib/ppl/address_book.rb +35 -3
- data/lib/ppl/cli.rb +36 -9
- data/lib/ppl/command/add.rb +40 -0
- data/lib/ppl/command/birthdays.rb +9 -2
- data/lib/ppl/command/help.rb +14 -11
- data/lib/ppl/command/list.rb +13 -5
- data/lib/ppl/command/rm.rb +38 -0
- data/lib/ppl/command/set.rb +49 -0
- data/lib/ppl/command/show.rb +25 -7
- data/lib/ppl/command.rb +43 -14
- data/lib/ppl/contact.rb +5 -0
- data/lib/ppl.rb +9 -0
- data/ppl.gemspec +2 -2
- metadata +5 -4
- data/lib/ppl/command/base.rb +0 -29
- data/lib/ppl/ppl.rb +0 -15
data/README.md
CHANGED
@@ -15,6 +15,12 @@ like "people". You might be interested in ppl if:
|
|
15
15
|
Usage
|
16
16
|
-----
|
17
17
|
|
18
|
+
### Add a contact
|
19
|
+
|
20
|
+
```bash
|
21
|
+
$ ppl add adam "Adam Brown"
|
22
|
+
```
|
23
|
+
|
18
24
|
### List all contacts
|
19
25
|
|
20
26
|
```bash
|
@@ -44,16 +50,17 @@ dave Dave Jones 1980-01-02 100 days
|
|
44
50
|
joe Joe Bloggs 1980-01-03 101 days
|
45
51
|
```
|
46
52
|
|
53
|
+
### Delete a contact
|
54
|
+
|
55
|
+
```bash
|
56
|
+
$ ppl rm workadam
|
57
|
+
```
|
58
|
+
|
47
59
|
Roadmap
|
48
60
|
-------
|
49
61
|
|
50
62
|
Support for the following commands is planned.
|
51
63
|
|
52
|
-
### Add a contact
|
53
|
-
```bash
|
54
|
-
$ ppl add adam --email=adam.brown@example.org --birthday=1980-01-04
|
55
|
-
```
|
56
|
-
|
57
64
|
### Update a contact
|
58
65
|
```bash
|
59
66
|
$ ppl set adam --email=adam.brown@example.com
|
@@ -64,11 +71,6 @@ $ ppl set adam --email=adam.brown@example.com
|
|
64
71
|
$ ppl mv adam workadam
|
65
72
|
```
|
66
73
|
|
67
|
-
### Delete a contact
|
68
|
-
```bash
|
69
|
-
$ ppl rm workadam
|
70
|
-
```
|
71
|
-
|
72
74
|
In a highly optimistic version of the future, I plan to integrate Git.
|
73
75
|
Any commands that modify the address book will also commit their changes.
|
74
76
|
Then this will be posisble:
|
data/bin/ppl
CHANGED
data/lib/ppl/address_book.rb
CHANGED
@@ -12,9 +12,13 @@ class Ppl::Address_Book
|
|
12
12
|
|
13
13
|
def contact(id)
|
14
14
|
filename = File.join @path, id + ".vcard"
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
if !File.exists? filename
|
16
|
+
return nil
|
17
|
+
end
|
18
|
+
|
19
|
+
vcard = IO.read filename
|
20
|
+
vcard = Vpim::Vcard.decode(vcard).first
|
21
|
+
contact = Ppl::Contact.new(id, vcard)
|
18
22
|
end
|
19
23
|
|
20
24
|
def contacts
|
@@ -38,5 +42,33 @@ class Ppl::Address_Book
|
|
38
42
|
self.find_all { |contact| contact.birthday.nil? == false }
|
39
43
|
end
|
40
44
|
|
45
|
+
def create_contact(id, full_name)
|
46
|
+
|
47
|
+
vcard = Vpim::Vcard::Maker.make2 do |maker|
|
48
|
+
maker.add_name do |name|
|
49
|
+
name.given = full_name
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
contact = Ppl::Contact.new(id, vcard)
|
54
|
+
self.save_contact contact
|
55
|
+
contact
|
56
|
+
end
|
57
|
+
|
58
|
+
def delete_contact(id)
|
59
|
+
filename = File.join @path, id + ".vcard"
|
60
|
+
if !File.exists? filename
|
61
|
+
return false
|
62
|
+
end
|
63
|
+
File.delete filename
|
64
|
+
end
|
65
|
+
|
66
|
+
def save_contact(contact)
|
67
|
+
filename = File.join @path, contact.id + ".vcard"
|
68
|
+
File.open(filename, "w") do |file|
|
69
|
+
file.write contact.to_s
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
41
73
|
end
|
42
74
|
|
data/lib/ppl/cli.rb
CHANGED
@@ -1,22 +1,49 @@
|
|
1
1
|
|
2
2
|
require "ppl"
|
3
|
-
require "
|
3
|
+
require "optparse"
|
4
4
|
|
5
5
|
class Ppl::CLI
|
6
6
|
|
7
|
-
def
|
7
|
+
def initialize
|
8
|
+
@address_book = Ppl::Address_Book.new("/home/h2s/doc/contacts")
|
9
|
+
@commands = commands
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
find_command("help").commands = @commands
|
12
|
+
end
|
13
|
+
|
14
|
+
def run(argv)
|
15
|
+
command_name = argv.shift
|
16
|
+
command = find_command command_name
|
17
|
+
|
18
|
+
if command.nil?
|
19
|
+
command = find_command "help"
|
20
|
+
end
|
21
|
+
|
22
|
+
command.run argv
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def commands
|
29
|
+
@commands = []
|
30
|
+
Ppl::Command.constants.each do |name|
|
31
|
+
constant = Ppl::Command.const_get(name)
|
32
|
+
@commands.push constant.new
|
14
33
|
end
|
34
|
+
@commands.sort! { |a,b| a.name <=> b.name }
|
15
35
|
|
16
|
-
|
17
|
-
|
36
|
+
@commands.each do |command|
|
37
|
+
command.address_book = @address_book
|
38
|
+
command.commands = @commands
|
39
|
+
end
|
40
|
+
end
|
18
41
|
|
42
|
+
def find_command(name)
|
43
|
+
matches = @commands.select { |command| command.name == name }
|
44
|
+
matches.first
|
19
45
|
end
|
20
46
|
|
47
|
+
|
21
48
|
end
|
22
49
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
class Ppl::Command::Add < Ppl::Command
|
3
|
+
|
4
|
+
def name
|
5
|
+
"add"
|
6
|
+
end
|
7
|
+
|
8
|
+
def summary
|
9
|
+
"Add a new contact"
|
10
|
+
end
|
11
|
+
|
12
|
+
def banner
|
13
|
+
"Usage: ppl add <contact> <name>"
|
14
|
+
end
|
15
|
+
|
16
|
+
def options(parser)
|
17
|
+
end
|
18
|
+
|
19
|
+
def execute(argv, options)
|
20
|
+
|
21
|
+
contact_id = argv.shift
|
22
|
+
name = argv.shift
|
23
|
+
|
24
|
+
if contact_id.nil? || name.nil?
|
25
|
+
$stderr.puts @option_parser
|
26
|
+
return false
|
27
|
+
end
|
28
|
+
|
29
|
+
contact = @address_book.contact contact_id
|
30
|
+
if !contact.nil?
|
31
|
+
raise "contact '#{contact_id}' already exists"
|
32
|
+
end
|
33
|
+
|
34
|
+
contact = @address_book.create_contact contact_id, name
|
35
|
+
puts contact
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
class Ppl::Command::Birthdays < Ppl::Command
|
2
|
+
class Ppl::Command::Birthdays < Ppl::Command
|
3
3
|
|
4
4
|
def name
|
5
5
|
"birthdays"
|
@@ -9,7 +9,14 @@ class Ppl::Command::Birthdays < Ppl::Command::Base
|
|
9
9
|
"Show a list of upcoming birthdays"
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def banner
|
13
|
+
"Usage: ppl birthdays"
|
14
|
+
end
|
15
|
+
|
16
|
+
def options(parser)
|
17
|
+
end
|
18
|
+
|
19
|
+
def execute(argv, options)
|
13
20
|
today = Date.today
|
14
21
|
|
15
22
|
@address_book.with_birthday.each do |contact|
|
data/lib/ppl/command/help.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
class Ppl::Command::Help < Ppl::Command
|
2
|
+
class Ppl::Command::Help < Ppl::Command
|
3
3
|
|
4
4
|
def name
|
5
5
|
"help"
|
@@ -9,20 +9,23 @@ class Ppl::Command::Help < Ppl::Command::Base
|
|
9
9
|
"Show a list of available commands"
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def banner
|
13
|
+
"Usage: ppl <command> [options]"
|
14
|
+
end
|
15
|
+
|
16
|
+
def options(parser)
|
17
|
+
end
|
13
18
|
|
19
|
+
def execute(argv, options)
|
20
|
+
puts @option_parser
|
14
21
|
puts
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
sprintf("%s", command.summary)
|
21
|
-
)
|
22
|
-
end
|
22
|
+
@commands.each do |command|
|
23
|
+
puts(
|
24
|
+
sprintf(" %-10s", command.name) +
|
25
|
+
sprintf("%s", command.summary)
|
26
|
+
)
|
23
27
|
end
|
24
28
|
puts
|
25
|
-
|
26
29
|
end
|
27
30
|
|
28
31
|
end
|
data/lib/ppl/command/list.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
class Ppl::Command::List < Ppl::Command
|
2
|
+
class Ppl::Command::List < Ppl::Command
|
3
3
|
|
4
4
|
def name
|
5
5
|
"list"
|
@@ -9,14 +9,22 @@ class Ppl::Command::List < Ppl::Command::Base
|
|
9
9
|
"Show a list of all contacts"
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def banner
|
13
|
+
"Usage: ppl list"
|
14
|
+
end
|
15
|
+
|
16
|
+
def options(parser)
|
17
|
+
end
|
18
|
+
|
19
|
+
def execute(argv, options)
|
13
20
|
@address_book.each do |contact|
|
14
21
|
puts(
|
15
|
-
sprintf("%-
|
16
|
-
sprintf("
|
17
|
-
sprintf("%-20s", contact.email)
|
22
|
+
sprintf("%-10s", contact.id + ":") +
|
23
|
+
sprintf("%s ", contact.name) +
|
24
|
+
sprintf("%-20s", "<" + contact.email + ">")
|
18
25
|
)
|
19
26
|
end
|
27
|
+
return true
|
20
28
|
end
|
21
29
|
|
22
30
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
class Ppl::Command::Rm < Ppl::Command
|
3
|
+
|
4
|
+
def name
|
5
|
+
"rm"
|
6
|
+
end
|
7
|
+
|
8
|
+
def summary
|
9
|
+
"Delete a contact"
|
10
|
+
end
|
11
|
+
|
12
|
+
def banner
|
13
|
+
"Usage: ppl rm <contact>"
|
14
|
+
end
|
15
|
+
|
16
|
+
def options(parser)
|
17
|
+
end
|
18
|
+
|
19
|
+
def execute(argv, options)
|
20
|
+
|
21
|
+
contact_id = argv.first
|
22
|
+
|
23
|
+
if contact_id.nil?
|
24
|
+
$stderr.puts @option_parser
|
25
|
+
return false
|
26
|
+
end
|
27
|
+
|
28
|
+
contact = @address_book.contact contact_id
|
29
|
+
if contact.nil?
|
30
|
+
raise "contact '#{contact_id}' not found"
|
31
|
+
end
|
32
|
+
|
33
|
+
@address_book.delete_contact contact_id
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
|
2
|
+
class Ppl::Command::Set < Ppl::Command
|
3
|
+
|
4
|
+
def name
|
5
|
+
"set"
|
6
|
+
end
|
7
|
+
|
8
|
+
def summary
|
9
|
+
"Change the details of a contact"
|
10
|
+
end
|
11
|
+
|
12
|
+
def banner
|
13
|
+
"Usage: ppl set <contact> [options]"
|
14
|
+
end
|
15
|
+
|
16
|
+
def options(parser)
|
17
|
+
parser.on("-e", "--email <email>", "Email address") do |email|
|
18
|
+
@options[:email] = email
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def execute(argv, options)
|
23
|
+
|
24
|
+
contact_id = argv.first
|
25
|
+
|
26
|
+
if contact_id.nil?
|
27
|
+
$stderr.puts @option_parser
|
28
|
+
return false
|
29
|
+
end
|
30
|
+
|
31
|
+
contact = @address_book.contact contact_id
|
32
|
+
if contact.nil?
|
33
|
+
raise "contact '#{contact_id}' not found"
|
34
|
+
end
|
35
|
+
|
36
|
+
contact.vcard.make do |maker|
|
37
|
+
maker.name do |name|
|
38
|
+
name.fullname = 's'
|
39
|
+
end
|
40
|
+
puts maker
|
41
|
+
end
|
42
|
+
|
43
|
+
if !options[:email].nil?
|
44
|
+
#contact.vcard.add_email options[:email]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
data/lib/ppl/command/show.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
|
2
|
-
|
3
|
-
|
4
|
-
class Ppl::Command::Show < Ppl::Command::Base
|
2
|
+
class Ppl::Command::Show < Ppl::Command
|
5
3
|
|
6
4
|
def name
|
7
5
|
"show"
|
@@ -11,14 +9,34 @@ class Ppl::Command::Show < Ppl::Command::Base
|
|
11
9
|
"Show full details of a single contact"
|
12
10
|
end
|
13
11
|
|
14
|
-
def
|
15
|
-
|
12
|
+
def banner
|
13
|
+
"Usage: ppl show <contact>"
|
14
|
+
end
|
15
|
+
|
16
|
+
def options(parser)
|
17
|
+
end
|
18
|
+
|
19
|
+
def execute(argv, options)
|
20
|
+
|
21
|
+
contact_id = argv.first
|
22
|
+
|
23
|
+
if contact_id.nil?
|
24
|
+
$stderr.puts @option_parser
|
25
|
+
return false
|
26
|
+
end
|
27
|
+
|
28
|
+
contact = @address_book.contact contact_id
|
29
|
+
if contact.nil?
|
30
|
+
raise "contact '#{contact_id}' not found"
|
31
|
+
end
|
32
|
+
|
16
33
|
|
17
|
-
puts contact.name
|
34
|
+
puts contact.name
|
18
35
|
contact.emails.each do |email|
|
19
|
-
puts email
|
36
|
+
puts email
|
20
37
|
end
|
21
38
|
|
39
|
+
return true
|
22
40
|
end
|
23
41
|
|
24
42
|
end
|
data/lib/ppl/command.rb
CHANGED
@@ -1,26 +1,55 @@
|
|
1
1
|
|
2
|
-
|
3
|
-
module Command
|
2
|
+
class Ppl::Command
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
attr_accessor :address_book
|
5
|
+
attr_accessor :commands
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@option_parser = OptionParser.new do |parser|
|
9
|
+
parser.banner = self.banner
|
10
|
+
self.options parser
|
9
11
|
end
|
12
|
+
end
|
10
13
|
|
11
|
-
|
14
|
+
def name
|
15
|
+
raise NotImplementedError
|
16
|
+
end
|
12
17
|
|
13
|
-
|
14
|
-
|
15
|
-
|
18
|
+
def summary
|
19
|
+
raise NotImplementedError
|
20
|
+
end
|
16
21
|
|
17
|
-
|
22
|
+
def banner
|
23
|
+
raise NotImplementedError
|
24
|
+
end
|
25
|
+
|
26
|
+
def options(parser)
|
27
|
+
raise NotImplementedError
|
28
|
+
end
|
18
29
|
|
19
|
-
|
20
|
-
|
21
|
-
|
30
|
+
def run(argv)
|
31
|
+
|
32
|
+
@options = {}
|
33
|
+
begin
|
34
|
+
@option_parser.parse! ARGV
|
35
|
+
rescue OptionParser::ParseError
|
36
|
+
$stderr.puts $!
|
37
|
+
$stderr.puts @option_parser
|
38
|
+
return false
|
39
|
+
end
|
40
|
+
|
41
|
+
begin
|
42
|
+
status = self.execute argv, @options
|
43
|
+
rescue RuntimeError
|
44
|
+
$stderr.puts "ppl: " + $!.to_s
|
22
45
|
end
|
23
46
|
|
47
|
+
return status
|
24
48
|
end
|
49
|
+
|
50
|
+
def execute(argv, options)
|
51
|
+
raise NotImplementedError
|
52
|
+
end
|
53
|
+
|
25
54
|
end
|
26
55
|
|
data/lib/ppl/contact.rb
CHANGED
@@ -4,6 +4,7 @@ require "active_support/core_ext/time/calculations.rb"
|
|
4
4
|
class Ppl::Contact
|
5
5
|
|
6
6
|
attr_reader :id
|
7
|
+
attr_reader :vcard
|
7
8
|
|
8
9
|
def initialize(id, vcard)
|
9
10
|
@id = id
|
@@ -34,5 +35,9 @@ class Ppl::Contact
|
|
34
35
|
@vcard.name.fullname
|
35
36
|
end
|
36
37
|
|
38
|
+
def to_s
|
39
|
+
@vcard.to_s
|
40
|
+
end
|
41
|
+
|
37
42
|
end
|
38
43
|
|
data/lib/ppl.rb
CHANGED
@@ -4,4 +4,13 @@ end
|
|
4
4
|
|
5
5
|
require "ppl/address_book"
|
6
6
|
require "ppl/contact"
|
7
|
+
require "ppl/cli"
|
8
|
+
require "ppl/command"
|
9
|
+
require "ppl/command/add"
|
10
|
+
require "ppl/command/birthdays"
|
11
|
+
require "ppl/command/help"
|
12
|
+
require "ppl/command/list"
|
13
|
+
require "ppl/command/rm"
|
14
|
+
require "ppl/command/set"
|
15
|
+
require "ppl/command/show"
|
7
16
|
|
data/ppl.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ppl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-13 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Command-line driven address book
|
15
15
|
email: henry@henrysmith.org
|
@@ -27,13 +27,14 @@ files:
|
|
27
27
|
- lib/ppl/address_book.rb
|
28
28
|
- lib/ppl/cli.rb
|
29
29
|
- lib/ppl/command.rb
|
30
|
-
- lib/ppl/command/
|
30
|
+
- lib/ppl/command/add.rb
|
31
31
|
- lib/ppl/command/birthdays.rb
|
32
32
|
- lib/ppl/command/help.rb
|
33
33
|
- lib/ppl/command/list.rb
|
34
|
+
- lib/ppl/command/rm.rb
|
35
|
+
- lib/ppl/command/set.rb
|
34
36
|
- lib/ppl/command/show.rb
|
35
37
|
- lib/ppl/contact.rb
|
36
|
-
- lib/ppl/ppl.rb
|
37
38
|
- ppl.gemspec
|
38
39
|
homepage: https://github.com/h2s/ppl
|
39
40
|
licenses:
|
data/lib/ppl/command/base.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
|
2
|
-
require "vpim/vcard"
|
3
|
-
require "colored"
|
4
|
-
|
5
|
-
|
6
|
-
class Ppl::Command::Base
|
7
|
-
|
8
|
-
|
9
|
-
attr_reader :arguments
|
10
|
-
attr_reader :options
|
11
|
-
|
12
|
-
|
13
|
-
def initialize(arguments=[], options={})
|
14
|
-
@arguments = arguments
|
15
|
-
@options = options
|
16
|
-
|
17
|
-
@address_book = Ppl::Address_Book.new(@options[:path])
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
def name
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
def summary
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|