syc-task 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|