syc-task 0.0.1 → 0.0.2
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.rdoc +71 -6
- data/bin/syctask +220 -4
- data/lib/syctask/task.rb +14 -2
- data/lib/syctask/task_service.rb +37 -6
- data/lib/syctask/version.rb +1 -1
- data/lib/syctask.rb +2 -0
- metadata +53 -30
data/README.rdoc
CHANGED
@@ -1,28 +1,93 @@
|
|
1
1
|
= Simple task organizer
|
2
|
-
With syctask you can organize your tasks
|
2
|
+
With syctask you can organize your tasks.
|
3
3
|
|
4
4
|
==Install
|
5
5
|
The application can be installed with
|
6
6
|
$ gem install syc-task
|
7
7
|
|
8
8
|
== Usage
|
9
|
-
syctask provides basic task organizer functions as create, update, list und complete a task.
|
9
|
+
syctask provides basic task organizer functions as create, update, list und complete a task. Additional functions are to plan tasks you want to accomplish today. If you are not sure in which sequence to conduct the task you can prioritize them with a pair wise comparisson. You can time tasks with start and stop and you can finally extract tasks from a minutes of meetings file. The schedule task will print a graphical timeline of the working day assigning the planned tasks to the timeline. Busy times are marked red. Meetings are listed with associated tasks that are assigned to the meetings.
|
10
10
|
|
11
11
|
===Create tasks with new
|
12
12
|
Create a new task in the default task directory ~/.tasks
|
13
|
-
$ syctask "My first task"
|
13
|
+
$ syctask new "My first task"
|
14
14
|
|
15
15
|
Provide a description
|
16
|
-
$ syctask "My first task" --description "Explanation of my first task"
|
16
|
+
$ syctask new "My first task" --description "Explanation of my first task"
|
17
17
|
|
18
18
|
Schedule a task with a follow-up and due date
|
19
|
-
$ syctask "My first task" --follow-up "2013-02-25" --due "2013-03-11"
|
19
|
+
$ syctask new "My first task" --follow-up "2013-02-25" --due "2013-03-11"
|
20
20
|
|
21
21
|
Set a proirity for a task
|
22
|
-
$ syctask "My first task" --prio 3
|
22
|
+
$ syctask new "My first task" --prio 3
|
23
|
+
|
24
|
+
Prompt for task input
|
25
|
+
$ syctask new
|
26
|
+
will prompt for task titles. When read C-D will end input.
|
23
27
|
|
24
28
|
Except for --description you can also provide short forms for the options.
|
25
29
|
|
30
|
+
===Plan tasks
|
31
|
+
The plan command will print tasks and prompts whether to (a)dd or (s)kip the task. If (q)uit is selected the tasks already added will be add to the today's task
|
32
|
+
list. If (c)omplete is selected the complete task will be printed and the user
|
33
|
+
will be prompted again for adding the task.
|
34
|
+
|
35
|
+
Invoke plan without filter
|
36
|
+
$ syctask plan
|
37
|
+
1 - My first task
|
38
|
+
(a)dd, (c)omplete, (s)kip, (q)uit? a
|
39
|
+
Duration (1 = 15 minutes, return 30 minutes): 3
|
40
|
+
--> 1 task(s) planned
|
41
|
+
|
42
|
+
Invoke plan with a filter
|
43
|
+
$ syctask plan --id "1,3,5,8"
|
44
|
+
1 - My first task
|
45
|
+
(a)dd, (c)omplete, (s)kip, (q)uit?
|
46
|
+
|
47
|
+
===Create schedule
|
48
|
+
The schedule command will print a graphical schedule with assigning the tasks
|
49
|
+
added with plan.
|
50
|
+
|
51
|
+
Create a schedule with working time from 8a.m. to 6p.m. and meetings between
|
52
|
+
9a.m. and 9.30a.m. and 1p.m. and 2.45p.m.
|
53
|
+
$ syctask schedule -w "8:00-18:00" -b "9:00-9:30,13:00-14:45"
|
54
|
+
|
55
|
+
Add titles to the meetings
|
56
|
+
$ syctask schedule -m "Project status,Management meeting"
|
57
|
+
|
58
|
+
The output will be
|
59
|
+
Meetings
|
60
|
+
--------
|
61
|
+
A - Project status
|
62
|
+
B - Management meeting
|
63
|
+
|
64
|
+
A B
|
65
|
+
xxx-///-|---|---|---///////-|---|---|---|
|
66
|
+
8 9 10 11 12 13 14 15 16 17 18
|
67
|
+
1
|
68
|
+
|
69
|
+
Tasks
|
70
|
+
-----
|
71
|
+
0 - 1: My first task
|
72
|
+
|
73
|
+
Adding a task to a meeting
|
74
|
+
$ syctask schedule -a "A:1"
|
75
|
+
|
76
|
+
will print
|
77
|
+
Meetings
|
78
|
+
--------
|
79
|
+
A - Project status
|
80
|
+
1 - My first task
|
81
|
+
B - Management meeting
|
82
|
+
|
83
|
+
A B
|
84
|
+
----///-|---|---|---///////-|---|---|---|
|
85
|
+
8 9 10 11 12 13 14 15 16 17 18
|
86
|
+
|
87
|
+
|
88
|
+
Tasks
|
89
|
+
-----
|
90
|
+
|
26
91
|
===List tasks
|
27
92
|
List tasks that are not marked as done in short form
|
28
93
|
$ syctask list
|
data/bin/syctask
CHANGED
@@ -79,6 +79,47 @@ command :scan do |c|
|
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
82
|
+
desc 'Delete tasks from task list or from task plan'
|
83
|
+
command :delete do |c|
|
84
|
+
c.desc 'Remove tasks from task plan of today, tomorrow or another date'
|
85
|
+
c.arg_name 'DATE'
|
86
|
+
c.flag :plan, :must_match => /today|tomorrow|\d{4}-\d{2}-\d{2}/
|
87
|
+
|
88
|
+
c.desc 'IDs of the tasks to remove'
|
89
|
+
c.arg_name 'ID1,ID2,..,IDn'
|
90
|
+
c.flag [:i, :id], :must_match => /^\d+(?:,\d+)*|\d+/
|
91
|
+
|
92
|
+
c.action do |global_options,options,args|
|
93
|
+
help_now! "You must provide tasks ids to delete" unless options[:id]
|
94
|
+
plan = options[:plan]
|
95
|
+
filter = [:id]
|
96
|
+
options.keep_if {|key, value| filter.find_index(key) and value != nil}
|
97
|
+
if plan
|
98
|
+
case plan
|
99
|
+
when 'today'
|
100
|
+
date = Time.now.strftime("%Y-%m-%d")
|
101
|
+
when 'tomorrow'
|
102
|
+
date = (Time.now + (60*60*24)).strftime("%Y-%m-%d")
|
103
|
+
else
|
104
|
+
if plan.match(/\d{4}-\d{2}-\d{2}/)
|
105
|
+
date = plan
|
106
|
+
elsif nil
|
107
|
+
date = Time.now.strftime("%Y-%m-%d")
|
108
|
+
else
|
109
|
+
help_now! "Arguments may be TODAY, TOMORROW, YYYY-MM-DD or <RETURN>"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
count = @planner.remove_tasks(date, options)
|
113
|
+
STDOUT.puts sprintf("--> removed %d tasks from task plan of %s",
|
114
|
+
count, date).color(:green)
|
115
|
+
else
|
116
|
+
count = @service.delete(global_options[:t], options)
|
117
|
+
STDOUT.puts sprintf("--> removed %d tasks from %s",
|
118
|
+
count, global_options[:t]).color(:green)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
82
123
|
desc 'List tasks'
|
83
124
|
command :list do |c|
|
84
125
|
|
@@ -135,10 +176,182 @@ command :list do |c|
|
|
135
176
|
end
|
136
177
|
end
|
137
178
|
|
138
|
-
desc '
|
179
|
+
desc 'Show planned tasks'
|
180
|
+
arg_name 'DATE'
|
181
|
+
command :showplan do |c|
|
182
|
+
|
183
|
+
c.desc 'Print complete task'
|
184
|
+
c.switch [:c, :complete]
|
185
|
+
|
186
|
+
c.action do |global_options,options,args|
|
187
|
+
case args[0]
|
188
|
+
when 'today'
|
189
|
+
date = Time.now.strftime("%Y-%m-%d")
|
190
|
+
when 'tomorrow'
|
191
|
+
date = (Time.now + (60 * 60 * 24)).strftime("%Y-%m-%d")
|
192
|
+
else
|
193
|
+
if args[0] and args[0].match(/\d{4}-\d{2}-\d{2}/)
|
194
|
+
date = args[0]
|
195
|
+
elsif args[0].nil?
|
196
|
+
date = Time.now.strftime("%Y-%m-%d")
|
197
|
+
end
|
198
|
+
end
|
199
|
+
count = 0
|
200
|
+
@planner.get_tasks(date).each do |task|
|
201
|
+
task.print_pretty(options[:complete])
|
202
|
+
count += 1
|
203
|
+
end
|
204
|
+
STDOUT.puts sprintf("--> planned %d tasks for %s", count, date).
|
205
|
+
color(:green)
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|
209
|
+
|
210
|
+
desc 'Plan or show planned tasks for today, tomorrow or another day'
|
211
|
+
arg_name 'DATE'
|
139
212
|
command :plan do |c|
|
213
|
+
|
214
|
+
c.desc 'Show planned tasks'
|
215
|
+
c.arg_name 'show'
|
216
|
+
c.switch :show
|
217
|
+
|
218
|
+
c.desc 'Show complete tasks'
|
219
|
+
c.arg_name 'complete'
|
220
|
+
c.switch [:c, :complete]
|
221
|
+
|
222
|
+
c.desc 'Filter for ID'
|
223
|
+
c.arg_name 'ID1,ID2,ID3|[<|=|>]ID'
|
224
|
+
c.flag [:i, :id], :must_match => /^\d+(?:,\d+)*|^[<|=|>]\d+/
|
225
|
+
|
226
|
+
c.desc 'REGEXP as filter for title'
|
227
|
+
c.arg_name 'REGEXP'
|
228
|
+
c.flag [:title]
|
229
|
+
|
230
|
+
c.desc 'Filter for priority'
|
231
|
+
c.arg_name '[<|=|>]PRIO'
|
232
|
+
c.flag [:p, :prio], :must_match => /^\d+|^[<|=|>]\d+/
|
233
|
+
|
234
|
+
c.desc 'Filter for follow-up date'
|
235
|
+
c.arg_name '[<|=|>]DATE'
|
236
|
+
c.flag [:f, :follow_up], :must_match => /^(?:[<|=|>])?\d{4}-\d{2}-\d{2}/
|
237
|
+
|
238
|
+
c.desc 'Filter for due date'
|
239
|
+
c.arg_name '[<|=|>]DATE'
|
240
|
+
c.flag [:d, :due_date], :must_match => /^(?:[<|=|>])?\d{4}-\d{2}-\d{2}/
|
241
|
+
|
242
|
+
c.desc 'REGEXP as filter for description'
|
243
|
+
c.arg_name 'REGEXP'
|
244
|
+
c.flag :description
|
245
|
+
|
246
|
+
c.desc 'REGEXP as filter for note'
|
247
|
+
c.arg_name 'REGEXP'
|
248
|
+
c.flag [:n, :note]
|
249
|
+
|
250
|
+
c.desc 'Tags or REGEXP as filter for tags'
|
251
|
+
c.arg_name 'TAG1,TAG2,TAG3|REGEXP'
|
252
|
+
c.flag [:t, :tags], :must_match => /^\w+(?:,\w+)*|\/.*\//
|
253
|
+
|
140
254
|
c.action do |global_options,options,args|
|
141
|
-
|
255
|
+
ARGV.clear
|
256
|
+
show = options[:show]
|
257
|
+
complete = options[:complete]
|
258
|
+
|
259
|
+
filter = [:id, :tags, :description, :prio, :due_date, :follow_up,
|
260
|
+
:note, :title]
|
261
|
+
options.keep_if {|key, value| filter.find_index(key) and value != nil}
|
262
|
+
args[0] = 'today' if args[0].nil?
|
263
|
+
case args[0]
|
264
|
+
when 'today'
|
265
|
+
date = Time.now.strftime("%Y-%m-%d")
|
266
|
+
when 'tomorrow'
|
267
|
+
date = (Time.now + (60 * 60 * 24)).strftime("%Y-%m-%d")
|
268
|
+
else
|
269
|
+
if args[0].match(/\d{4}-\d{2}-\d{2}/)
|
270
|
+
date = args[0]
|
271
|
+
elsif nil
|
272
|
+
date = Time.now.strftime("%Y-%m-%d")
|
273
|
+
else
|
274
|
+
help_now! "Arguments may be 'today', 'tomorrow', YYYY-MM-DD or <RETURN>"
|
275
|
+
end
|
276
|
+
end
|
277
|
+
if show
|
278
|
+
count = 0
|
279
|
+
@planner.get_tasks(date, options).each do |task|
|
280
|
+
task.print_pretty(complete)
|
281
|
+
count += 1
|
282
|
+
end
|
283
|
+
STDOUT.puts sprintf("--> found %d planned task(s) for %s", count, date).
|
284
|
+
color(:green)
|
285
|
+
else
|
286
|
+
count = @planner.plan_tasks(@service.find(global_options[:t], options,
|
287
|
+
false), date)
|
288
|
+
STDOUT.puts sprintf("--> %d task(s) planned", count).color(:green)
|
289
|
+
end
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
desc 'Create schedule for planned tasks'
|
294
|
+
command :schedule do |c|
|
295
|
+
|
296
|
+
c.desc 'Work time'
|
297
|
+
c.arg_name 'HH:MM-HH:MM'
|
298
|
+
c.flag [:w, :work]
|
299
|
+
|
300
|
+
c.desc 'Busy time'
|
301
|
+
c.arg_name 'HH:MM-HH:MM,...'
|
302
|
+
c.flag [:b, :busy]
|
303
|
+
|
304
|
+
c.desc 'Meeting Titles'
|
305
|
+
c.arg_name 'TITLE,...'
|
306
|
+
c.flag [:m, :meeting]
|
307
|
+
|
308
|
+
c.desc 'Assign tasks to a meeting'
|
309
|
+
c.arg_name 'MEETING:TASK#1,...'
|
310
|
+
c.flag [:a, :assign]
|
311
|
+
|
312
|
+
c.desc 'Show schedule'
|
313
|
+
c.switch :show
|
314
|
+
|
315
|
+
c.action do |global_options,options,args|
|
316
|
+
|
317
|
+
scheduler = Syctask::TaskScheduler.new
|
318
|
+
|
319
|
+
if options[:work].nil?
|
320
|
+
help_now! "No work time set" unless scheduler.restore(:work_time)
|
321
|
+
elsif options[:work].scan(Syctask::TaskScheduler::WORK_TIME_PATTERN).nil?
|
322
|
+
help_now! "Work time has to be in yyyy-mm-dd"
|
323
|
+
else
|
324
|
+
scheduler.set_work_time(options[:work])
|
325
|
+
end
|
326
|
+
|
327
|
+
if options[:busy].nil?
|
328
|
+
scheduler.set_busy_times("") unless scheduler.restore(:busy_time)
|
329
|
+
elsif options[:busy].scan(Syctask::TaskScheduler::BUSY_TIME_PATTERN).nil?
|
330
|
+
help_now! "Busy time has to be in yyyy-mm-dd"
|
331
|
+
else
|
332
|
+
scheduler.set_busy_times(options[:busy])
|
333
|
+
end
|
334
|
+
|
335
|
+
if options[:meeting].nil?
|
336
|
+
scheduler.set_meeting_titles("") unless scheduler.restore(:meetings)
|
337
|
+
elsif options[:meeting].split(',').empty?
|
338
|
+
help_now! "Meeting titles have to be in 'Title1,Title2,...'"
|
339
|
+
else
|
340
|
+
scheduler.set_meeting_titles(options[:meeting])
|
341
|
+
end
|
342
|
+
|
343
|
+
scheduler.set_tasks(@planner.get_tasks)
|
344
|
+
|
345
|
+
if options[:assign].nil?
|
346
|
+
scheduler.restore(:assignments)
|
347
|
+
elsif options[:assign].scan(Syctask::TaskScheduler::ASSIGNMENT_PATTERN).nil?
|
348
|
+
help_now! "Task assignments to meetings have to be in 'A:1,2,3;B:1;...'"
|
349
|
+
else
|
350
|
+
scheduler.set_task_assignments(options[:assign])
|
351
|
+
end
|
352
|
+
|
353
|
+
scheduler.show
|
354
|
+
|
142
355
|
end
|
143
356
|
end
|
144
357
|
|
@@ -198,8 +411,10 @@ command :update do |c|
|
|
198
411
|
options.keep_if {|key, value| filter.find_index(key) and value != nil}
|
199
412
|
|
200
413
|
success = @service.update(global_options[:t], args[0], options)
|
201
|
-
STDOUT.puts sprintf("sucessfully updated task with TASK_NUMBER ",
|
202
|
-
|
414
|
+
STDOUT.puts sprintf("sucessfully updated task with TASK_NUMBER ",
|
415
|
+
args[0]).color(:green) if success
|
416
|
+
STDOUT.puts sprintf("could not update task with TASK_NUMBER ",
|
417
|
+
args[0]).color(:red) unless success
|
203
418
|
end
|
204
419
|
end
|
205
420
|
|
@@ -234,6 +449,7 @@ pre do |global,command,options,args|
|
|
234
449
|
# on that command only
|
235
450
|
|
236
451
|
@service = Syctask::TaskService.new
|
452
|
+
@planner = Syctask::TaskPlanner.new
|
237
453
|
|
238
454
|
dir = File.expand_path(global[:t])
|
239
455
|
dir += "/" + global[:p] if global[:p]
|
data/lib/syctask/task.rb
CHANGED
@@ -22,6 +22,8 @@ module Syctask
|
|
22
22
|
attr_reader :title
|
23
23
|
# ID of the task
|
24
24
|
attr_reader :id
|
25
|
+
# Duration specifies the planned time for processing the task
|
26
|
+
attr_accessor :duration
|
25
27
|
# Creation date
|
26
28
|
attr_reader :creation_date
|
27
29
|
# Update date
|
@@ -29,7 +31,7 @@ module Syctask
|
|
29
31
|
# Done date
|
30
32
|
attr_reader :done_date
|
31
33
|
# Directory where the file of the task is located
|
32
|
-
|
34
|
+
attr_accessor :dir
|
33
35
|
|
34
36
|
# Creates a new task. If the options contain a note than the current date
|
35
37
|
# and time is added.
|
@@ -42,6 +44,12 @@ module Syctask
|
|
42
44
|
@id = id
|
43
45
|
end
|
44
46
|
|
47
|
+
# Compares this task with another task regarding id and dir. If both are
|
48
|
+
# equal true is returned otherwise false
|
49
|
+
def ==(other)
|
50
|
+
@id == other.id and @dir == other.dir
|
51
|
+
end
|
52
|
+
|
45
53
|
# Updates the task with new values. Except for note and tags which are
|
46
54
|
# supplemented with the new values and not overridden.
|
47
55
|
def update(options)
|
@@ -165,7 +173,11 @@ module Syctask
|
|
165
173
|
color = :green if self.done?
|
166
174
|
|
167
175
|
puts sprintf("%04d - %s", @id, @title.bright).color(color)
|
168
|
-
|
176
|
+
if @options[:description]
|
177
|
+
description = split_lines(@options[:description].chomp, 70)
|
178
|
+
description = description.chomp.gsub(/\n/, "\n#{' '*7}")
|
179
|
+
puts sprintf("%6s %s", " ", description.chomp).color(color)
|
180
|
+
end
|
169
181
|
puts sprintf("%6s Prio: %s", " ", @options[:prio]).color(color) if @options[:prio]
|
170
182
|
puts sprintf("%6s Follow-up: %s", " ", @options[:follow_up]).color(color) if @options[:follow_up]
|
171
183
|
puts sprintf("%6s Due: %s", " ", @options[:due]).color(color) if @options[:due]
|
data/lib/syctask/task_service.rb
CHANGED
@@ -6,6 +6,7 @@ module Syctask
|
|
6
6
|
# Provides services to operate tasks as create, read, find, update and save
|
7
7
|
# Task objects
|
8
8
|
class TaskService
|
9
|
+
DEFAULT_DIR = File.expand_path("~/.tasks")
|
9
10
|
|
10
11
|
# Creates a new task in the specified directory, with the specified options
|
11
12
|
# and the specified title. If the directory doesn't exist it is created.
|
@@ -30,7 +31,9 @@ module Syctask
|
|
30
31
|
task = nil
|
31
32
|
Dir.glob("#{dir}/*").each do |file|
|
32
33
|
task = YAML.load_file(file) if File.file? file
|
33
|
-
|
34
|
+
if not task.nil? and task.class == Syctask::Task and task.id == id.to_i
|
35
|
+
return task
|
36
|
+
end
|
34
37
|
end
|
35
38
|
nil
|
36
39
|
end
|
@@ -42,12 +45,19 @@ module Syctask
|
|
42
45
|
# follow-up and :due can be <|=|>DATE
|
43
46
|
# tags can be eather a selection TAG1,TAG2,TAG3 or a REGEX /[Ll]ecture/
|
44
47
|
# prio can be <|=|>PRIO
|
48
|
+
# dir is the directory where find looks for tasks
|
49
|
+
# all specifies whether to consider also completed tasks (default) or only
|
50
|
+
# open tasks
|
45
51
|
def find(dir, filter={}, all=true)
|
46
52
|
tasks = []
|
47
53
|
Dir.glob("#{dir}/*").sort.each do |file|
|
48
|
-
|
49
|
-
|
50
|
-
|
54
|
+
begin
|
55
|
+
File.file?(file) ? task = YAML.load_file(file) : next
|
56
|
+
rescue Exception => e
|
57
|
+
next # If the file is no task but read by YAML ignore it
|
58
|
+
end
|
59
|
+
next unless not task.nil? and task.class == Syctask::Task
|
60
|
+
next if not all and task.done?
|
51
61
|
tasks << task if task.matches?(filter)
|
52
62
|
end
|
53
63
|
tasks
|
@@ -77,9 +87,30 @@ module Syctask
|
|
77
87
|
updated
|
78
88
|
end
|
79
89
|
|
80
|
-
#
|
90
|
+
# Deletes tasks in the specified directory that match the provided filter.
|
91
|
+
# If no filter is provide no task is deleted. The count of deleted tasks is
|
92
|
+
# returned
|
93
|
+
def delete(dir, filter)
|
94
|
+
deleted = 0
|
95
|
+
Dir.glob("#{dir}/*").each do |file|
|
96
|
+
begin
|
97
|
+
File.file?(file) ? task = YAML.load_file(file) : next
|
98
|
+
rescue Exception => e
|
99
|
+
next # If the file is no task but read by YAML ignore it
|
100
|
+
end
|
101
|
+
next unless not task.nil? and task.class == Syctask::Task
|
102
|
+
if task.matches?(filter)
|
103
|
+
deleted += File.delete(file)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
deleted
|
107
|
+
end
|
108
|
+
|
109
|
+
# Saves the task to the task directory. If dir is nil the default dir
|
110
|
+
# ~/.tasks will be set.
|
81
111
|
def save(dir, task)
|
82
|
-
|
112
|
+
task.dir = dir.nil? ? DEFAULT_DIR : File.expand_path(dir)
|
113
|
+
File.open("#{task.dir}/#{task.id}.task", 'w') {|f| YAML.dump(task, f)}
|
83
114
|
end
|
84
115
|
|
85
116
|
private
|
data/lib/syctask/version.rb
CHANGED
data/lib/syctask.rb
CHANGED
@@ -2,6 +2,8 @@ require 'syctask/version.rb'
|
|
2
2
|
require 'rainbow'
|
3
3
|
require 'syctask/task.rb'
|
4
4
|
require 'syctask/task_service.rb'
|
5
|
+
require 'syctask/task_scheduler.rb'
|
6
|
+
require 'syctask/task_planner.rb'
|
5
7
|
|
6
8
|
# Add requires for other files you add to your project here, so
|
7
9
|
# you just need to require this one file in your bin file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: syc-task
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
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: 2013-
|
12
|
+
date: 2013-03-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -91,34 +91,57 @@ dependencies:
|
|
91
91
|
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
|
-
description: ! "= Simple task organizer\nWith syctask you can organize your tasks
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
a
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
\
|
120
|
-
|
121
|
-
|
94
|
+
description: ! "= Simple task organizer\nWith syctask you can organize your tasks.\n\n==Install\nThe
|
95
|
+
application can be installed with\n $ gem install syc-task\n\n== Usage\nsyctask
|
96
|
+
provides basic task organizer functions as create, update, list und complete a task.
|
97
|
+
Additional functions are to plan tasks you want to accomplish today. If you are
|
98
|
+
not sure in which sequence to conduct the task you can prioritize them with a pair
|
99
|
+
wise comparisson. You can time tasks with start and stop and you can finally extract
|
100
|
+
tasks from a minutes of meetings file. The schedule task will print a graphical
|
101
|
+
timeline of the working day assigning the planned tasks to the timeline. Busy times
|
102
|
+
are marked red. Meetings are listed with associated tasks that are assigned to the
|
103
|
+
meetings.\n\n===Create tasks with new\nCreate a new task in the default task directory
|
104
|
+
~/.tasks\n $ syctask new \"My first task\"\n\nProvide a description\n $ syctask
|
105
|
+
new \"My first task\" --description \"Explanation of my first task\"\n\nSchedule
|
106
|
+
a task with a follow-up and due date\n $ syctask new \"My first task\" --follow-up
|
107
|
+
\"2013-02-25\" --due \"2013-03-11\"\n\nSet a proirity for a task\n $ syctask
|
108
|
+
new \"My first task\" --prio 3\n\nPrompt for task input\n $ syctask new\nwill
|
109
|
+
prompt for task titles. When read C-D will end input.\n\nExcept for --description
|
110
|
+
you can also provide short forms for the options.\n\n===Plan tasks\nThe plan command
|
111
|
+
will print tasks and prompts whether to (a)dd or (s)kip the task. If (q)uit is selected
|
112
|
+
the tasks already added will be add to the today's task\nlist. If (c)omplete is
|
113
|
+
selected the complete task will be printed and the user\nwill be prompted again
|
114
|
+
for adding the task.\n\nInvoke plan without filter\n $ syctask plan\n 1 -
|
115
|
+
My first task\n (a)dd, (c)omplete, (s)kip, (q)uit? a\n Duration (1 = 15 minutes,
|
116
|
+
return 30 minutes): 3\n --> 1 task(s) planned\n\nInvoke plan with a filter\n
|
117
|
+
\ $ syctask plan --id \"1,3,5,8\"\n 1 - My first task\n (a)dd, (c)omplete,
|
118
|
+
(s)kip, (q)uit?\n\n===Create schedule\nThe schedule command will print a graphical
|
119
|
+
schedule with assigning the tasks\nadded with plan.\n\nCreate a schedule with working
|
120
|
+
time from 8a.m. to 6p.m. and meetings between\n9a.m. and 9.30a.m. and 1p.m. and
|
121
|
+
2.45p.m.\n $ syctask schedule -w \"8:00-18:00\" -b \"9:00-9:30,13:00-14:45\"\n\nAdd
|
122
|
+
titles to the meetings\n $ syctask schedule -m \"Project status,Management meeting\"\n\nThe
|
123
|
+
output will be\n Meetings\n --------\n A - Project status\n B - Management
|
124
|
+
meeting\n\n A B\n xxx-///-|---|---|---///////-|---|---|---|\n
|
125
|
+
\ 8 9 10 11 12 13 14 15 16 17 18\n 1\n\n Tasks\n -----\n 0
|
126
|
+
- 1: My first task\n\nAdding a task to a meeting\n $ syctask schedule -a \"A:1\"\n\nwill
|
127
|
+
print\n Meetings\n --------\n A - Project status\n 1 - My first
|
128
|
+
task\n B - Management meeting\n\n A B\n ----///-|---|---|---///////-|---|---|---|\n
|
129
|
+
\ 8 9 10 11 12 13 14 15 16 17 18\n \n\n Tasks\n -----\n \n===List
|
130
|
+
tasks\nList tasks that are not marked as done in short form\n $ syctask list\n\nList
|
131
|
+
all tasks in long form\n $ syctask list --all --complete\n\nSearch tasks that
|
132
|
+
match a pattern\n $ syctask list --id \"<10\" --follow_up \">2013-02-25\" --title
|
133
|
+
\"My \\w task\"\n\n===Update tasks\nExcept for title and id all values can be updated.
|
134
|
+
Note and tags are not\noverridden rather supplemented with the update value.\n\nUpdate
|
135
|
+
task with ID 1 and provide some informative note\n $ syctask update 1 --note
|
136
|
+
\"Some explanation about the progress on the task\"\n\n===Complete tasks\nComplete
|
137
|
+
the task with ID 1 and provide a final note\n $ syctask done 1 --note \"Finalize
|
138
|
+
my first task\"\n\n==Supported platform\nsyc-task has been tested with 1.9.3\n\n==Notes\nAs
|
139
|
+
with version 0.0.1 only new, update, list and done is implemented.\n\nThe test files
|
140
|
+
live in the folder test and start with test_.\n\nThere is a rake file available
|
141
|
+
to run all tests\n $ rake test\n\n==License\nsyc-task is released under the {MIT
|
142
|
+
License}[http://opensource.org/licenses/MIT]\n\n==Links\n* [http://www.github.com/sugaryourcoffee/syc-task]
|
143
|
+
- Source code on GitHub\n* [http://syc.dyndns.org/drupal/wiki/syc-task] - Development
|
144
|
+
notebook\n* [https://rubygems.org/gems/syc-backup] - RubyGems\n"
|
122
145
|
email: pierre@sugaryourcoffee.de
|
123
146
|
executables:
|
124
147
|
- syctask
|