gwtf 0.6.1 → 0.7.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.
data/lib/gwtf.rb CHANGED
@@ -4,6 +4,7 @@ module Gwtf
4
4
  require 'gwtf/item'
5
5
  require 'gwtf/version'
6
6
  require 'gwtf/notifier/base'
7
+ require 'gwtf/notifier/email'
7
8
  require 'json'
8
9
  require 'yaml'
9
10
  require 'fileutils'
@@ -12,6 +13,12 @@ module Gwtf
12
13
  require 'time'
13
14
  require 'readline'
14
15
 
16
+ @@color = true
17
+
18
+ def self.color=(value)
19
+ @@color = value
20
+ end
21
+
15
22
  def self.each_command
16
23
  commands_dir = File.join(File.dirname(__FILE__), "gwtf", "commands")
17
24
  Dir.entries(commands_dir).grep(/_command.rb$/).sort.each do |command|
@@ -28,12 +35,22 @@ module Gwtf
28
35
  end.compact.sort
29
36
  end
30
37
 
31
- def self.notifier_for_address(address)
38
+ def self.protocol_for_address(address)
32
39
  uri = URI.parse(address)
33
40
 
34
41
  case uri.scheme
35
42
  when nil, "email"
36
- require 'gwtf/notifier/email'
43
+ return "email"
44
+ else
45
+ return uri.scheme
46
+ end
47
+ end
48
+
49
+ def self.notifier_for_address(address)
50
+ protocol = protocol_for_address(address)
51
+
52
+ case protocol_for_address(address)
53
+ when "email"
37
54
  return Notifier::Email
38
55
  when "boxcar"
39
56
  gem 'boxcar_api', '>= 1.2.0'
@@ -42,7 +59,7 @@ module Gwtf
42
59
 
43
60
  return Notifier::Boxcar
44
61
  else
45
- raise "Do not know how to handle addresses of type #{uri.scheme} for #{address}"
62
+ raise "Do not know how to handle addresses of type #{protocol} for #{address}"
46
63
  end
47
64
  end
48
65
 
@@ -58,7 +75,7 @@ module Gwtf
58
75
  end
59
76
 
60
77
  def self.green(msg)
61
- if STDOUT.tty?
78
+ if STDOUT.tty? && @@color
62
79
  "%s" % [ msg ]
63
80
  else
64
81
  msg
@@ -66,7 +83,7 @@ module Gwtf
66
83
  end
67
84
 
68
85
  def self.yellow(msg)
69
- if STDOUT.tty?
86
+ if STDOUT.tty? && @@color
70
87
  "%s" % [ msg ]
71
88
  else
72
89
  msg
@@ -74,7 +91,7 @@ module Gwtf
74
91
  end
75
92
 
76
93
  def self.red(msg)
77
- if STDOUT.tty?
94
+ if STDOUT.tty? && @@color
78
95
  "%s" % [ msg ]
79
96
  else
80
97
  msg
@@ -55,18 +55,7 @@ command [:list, :ls, :l] do |c|
55
55
  end
56
56
 
57
57
  elsif options[:overview]
58
- Gwtf.projects(global_options[:data]).each do |project|
59
- next if project == "reminders"
60
-
61
- items = Gwtf::Items.new(File.join(global_options[:data], project), project)
62
-
63
- if items.item_ids.size > 0
64
- if text = items.list_text(options[:all], true)
65
- puts text
66
- puts
67
- end
68
- end
69
- end
58
+ puts Gwtf::Items.overview_text(global_options[:data], options[:all])
70
59
 
71
60
  else
72
61
  puts
@@ -48,7 +48,6 @@ command [:new, :add, :n, :a, :c] do |c|
48
48
  item.subject = subject
49
49
  item.description = description if description
50
50
  item.due_date = options[:due] if options[:due]
51
- item.save
52
51
 
53
52
  if options[:remind]
54
53
  STDOUT.sync
@@ -58,6 +57,8 @@ command [:new, :add, :n, :a, :c] do |c|
58
57
  item.schedule_reminer(options[:remind], options[:recipient], options[:done], options[:ifopen])
59
58
  end
60
59
 
60
+ item.save
61
+
61
62
  puts item.to_s
62
63
  end
63
64
  end
@@ -0,0 +1,63 @@
1
+ desc 'Tool to send various kinds of notification'
2
+
3
+ command [:notify] do |c|
4
+ c.desc 'Email address to send to'
5
+ c.default_value Etc.getlogin
6
+ c.flag [:recipient, :r]
7
+
8
+ c.desc 'Send a reminder about an item'
9
+ c.default_value false
10
+ c.flag [:remind]
11
+
12
+ c.desc 'Send a overview list of all projects with items'
13
+ c.default_value false
14
+ c.switch [:overview]
15
+
16
+ c.desc 'Send a list of any due or overdue items'
17
+ c.default_value false
18
+ c.switch [:due]
19
+
20
+ c.desc 'When notifying about a specific item, close it after notify'
21
+ c.default_value false
22
+ c.switch [:done]
23
+
24
+ c.desc 'Only notify about an open item'
25
+ c.default_value false
26
+ c.switch [:ifopen]
27
+
28
+ c.action do |global_options,options,args|
29
+ if options[:remind]
30
+ raise "Need an item ID to remind" unless options[:remind] =~ /^(.+)$/
31
+
32
+ item = @items.load_item(options[:remind])
33
+
34
+ unless options[:ifopen] && item.closed?
35
+ item.send_reminder(options[:recipient], options[:done])
36
+ end
37
+
38
+ elsif options[:overview]
39
+ overview_text = Gwtf::Items.overview_text(global_options[:data])
40
+
41
+ unless overview_text == ""
42
+ options[:recipient].split(",").each do |r|
43
+ next unless Gwtf.protocol_for_address(r) == "email"
44
+
45
+ Gwtf::Notifier::Email.send_email(overview_text, "Summary of Tasks", r)
46
+ end
47
+ end
48
+
49
+ elsif options[:due]
50
+ Gwtf.color = false
51
+
52
+ due_text = Gwtf::Items.due_text(global_options[:data])
53
+
54
+ unless due_text == ""
55
+ options[:recipient].split(",").each do |r|
56
+ next unless Gwtf.protocol_for_address(r) == "email"
57
+
58
+ Gwtf::Notifier::Email.send_email(due_text, "Due and Overdue Tasks", r)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -33,12 +33,12 @@ command [:remind, :rem] do |c|
33
33
  c.action do |global_options,options,args|
34
34
  raise "Please supply an item ID to remind about" if args.empty?
35
35
 
36
- STDOUT.sync
36
+ STDOUT.sync = true
37
37
 
38
38
  unless options[:send]
39
39
  if args.first =~ /^\d+$/ # got an item id, schedule a reminder
40
40
  unless options[:at]
41
- raise "Please specify a valid at(1) time specification with --at after the item id" unless args.size > 2
41
+ raise "Please specify a valid at(1) time specification with --at after the item id" unless args.size >= 2
42
42
  options[:at] = args[1..-1].join(" ")
43
43
  end
44
44
 
@@ -67,12 +67,11 @@ command [:remind, :rem] do |c|
67
67
  puts reminder.to_s
68
68
  end
69
69
  else
70
+ # This is deprecated use 'gwtf email --remind 10' instead
70
71
  item = @items.load_item(args.first)
71
72
 
72
73
  unless options[:ifopen] && item.closed?
73
- options[:recipient].split(",").each do |recipient|
74
- item.send_reminder(recipient.strip, options[:done], Gwtf.notifier_for_address(recipient.strip))
75
- end
74
+ item.send_reminder(options[:recipient], options[:done])
76
75
  end
77
76
  end
78
77
  end
data/lib/gwtf/item.rb CHANGED
@@ -186,20 +186,24 @@ module Gwtf
186
186
  end
187
187
 
188
188
  def schedule_reminer(timespec, recipient, done=false, ifopen=false)
189
- command_args = ["--send"]
189
+ command_args = ["--remind"]
190
190
  command_args << "--recipient=%s" % [ recipient ]
191
191
  command_args << "--done" if done
192
192
  command_args << "--ifopen" if ifopen
193
193
 
194
- command = "echo gwtf --project='%s' remind %s %s | at %s 2>&1" % [ @project, command_args.join(" "), item_id, timespec]
194
+ command = "echo gwtf --project='%s' email %s %s | at %s 2>&1" % [ @project, command_args.join(" "), item_id, timespec]
195
195
  out = %x[#{command}]
196
196
 
197
+ raise "Failed to add at(1) job: %s" % [ out ] unless $? == 0
198
+
197
199
  puts out
198
200
  out
199
201
  end
200
202
 
201
- def send_reminder(recipient, mark_as_done, klass)
202
- klass.new(self, recipient).notify
203
+ def send_reminder(recipient, mark_as_done)
204
+ recipient.split(",").each do |r|
205
+ Gwtf.notifier_for_address(r.strip).new(self, r.strip).notify
206
+ end
203
207
 
204
208
  if mark_as_done
205
209
  record_work("Closing item as part of scheduled reminder")
data/lib/gwtf/items.rb CHANGED
@@ -20,6 +20,43 @@ module Gwtf
20
20
  end
21
21
  end
22
22
 
23
+ # overview text of open (or all) items in all projects
24
+ def self.overview_text(datadir, all=false)
25
+ overview = StringIO.new
26
+
27
+ Gwtf.projects(datadir).each do |project|
28
+ next if project == "reminders"
29
+
30
+ items = Gwtf::Items.new(File.join(datadir, project), project)
31
+
32
+ if items.item_ids.size > 0
33
+ if text = items.list_text(all, true)
34
+ overview.puts text
35
+ overview.puts
36
+ end
37
+ end
38
+ end
39
+
40
+ overview.string
41
+ end
42
+
43
+ # overview text of all due items in all projects
44
+ def self.due_text(datadir)
45
+ overview = StringIO.new
46
+
47
+ Gwtf.projects(datadir).each do |project|
48
+ next if project == "reminders"
49
+
50
+ items = Gwtf::Items.new(File.join(datadir, project), project)
51
+
52
+ items.each_item do |item|
53
+ overview.puts "%s: %s" % [ project, item.to_s ] if item.due?
54
+ end
55
+ end
56
+
57
+ overview.string
58
+ end
59
+
23
60
  def initialize(data_dir, project)
24
61
  raise "Data directory #{data_dir} does not exist" unless File.directory?(data_dir)
25
62
 
@@ -1,23 +1,27 @@
1
1
  module Gwtf
2
2
  module Notifier
3
3
  class Email<Base
4
- def notify
5
- begin
6
- tmp = Tempfile.new("gwtf")
7
- tmp.write(item.summary)
8
- tmp.rewind
4
+ def self.send_email(body, subject, recipient)
5
+ tmp = Tempfile.new("gwtf")
6
+ tmp.write(body)
7
+ tmp.rewind
8
+
9
+ subject.gsub!("'", "\'")
10
+ recipient.gsub!("'", "\'")
9
11
 
10
- if item.project == "default"
11
- subject = "Reminder for item %s" % [ item.item_id ]
12
- else
13
- subject = "Reminder for item %s in %s project" % [ item.item_id, item.project ]
14
- end
12
+ system("cat #{tmp.path} | mail -s '#{subject}' '#{recipient}'")
13
+ ensure
14
+ tmp.close!
15
+ end
15
16
 
16
- system("cat #{tmp.path} | mail -s '#{subject}' '#{recipient}'")
17
- ensure
18
- tmp.close
19
- tmp.unlink
17
+ def notify
18
+ if item.project == "default"
19
+ subject = "Reminder for item %s" % [ item.item_id ]
20
+ else
21
+ subject = "Reminder for item %s in %s project" % [ item.item_id, item.project ]
20
22
  end
23
+
24
+ Email.send_email(item.summary, subject, recipient)
21
25
  end
22
26
  end
23
27
  end
data/lib/gwtf/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Gwtf
2
- VERSION = '0.6.1'
2
+ VERSION = '0.7.0'
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gwtf
3
3
  version: !ruby/object:Gem::Version
4
- hash: 5
4
+ hash: 3
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 6
9
- - 1
10
- version: 0.6.1
8
+ - 7
9
+ - 0
10
+ version: 0.7.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - R.I.Pienaar
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-04-10 00:00:00 +01:00
18
+ date: 2012-04-11 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -106,6 +106,7 @@ files:
106
106
  - lib/gwtf/commands/show_command.rb
107
107
  - lib/gwtf/commands/open_command.rb
108
108
  - lib/gwtf/commands/shell_command.rb
109
+ - lib/gwtf/commands/notify_command.rb
109
110
  - lib/gwtf/commands/done_command.rb
110
111
  - lib/gwtf/commands/log_command.rb
111
112
  - lib/gwtf/commands/edit_command.rb