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 CHANGED
@@ -1,28 +1,93 @@
1
1
  = Simple task organizer
2
- With syctask you can organize your tasks (inspired by David Bryant Copland's book <b>Build Awesome Command-Line Applications in Ruby</b>.
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. Addtional 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.
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 'Plan tasks for today'
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
- puts "plan command not implemented yet"
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 ", args[0]).color(:green) if success
202
- STDOUT.puts sprintf("could not update task with TASK_NUMBER ", args[0]).color(:red) unless success
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
- attr_reader :dir
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
- puts sprintf("%6s %s", " ", @options[:description]).color(color) if @options[:description]
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]
@@ -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
- return task if task and task.id == id.to_i
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
- File.file?(file) ? task = YAML.load_file(file) : next
49
- next if task and not all and task.done?
50
- next if not task
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
- # Saves the task to the task directory
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
- File.open("#{dir}/#{task.id}.task", 'w') {|f| YAML.dump(task, f)}
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
@@ -1,5 +1,5 @@
1
1
  # Syctask provides functions for managing tasks in a task list
2
2
  module Syctask
3
3
  #Holds the version number of syctask
4
- VERSION = '0.0.1'
4
+ VERSION = '0.0.2'
5
5
  end
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.1
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-02-25 00:00:00.000000000 Z
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
- (inspired by David Bryant Copland's book <b>Build Awesome Command-Line Applications
96
- in Ruby</b>.\n\n==Install\nThe application can be installed with\n $ gem install
97
- syc-task\n\n== Usage\nsyctask provides basic task organizer functions as create,
98
- update, list und complete a task. Addtional functions are to plan tasks you want
99
- to accomplish today. If you are not sure in which sequence to conduct the task you
100
- can prioritize them with a pair wise comparisson. You can time tasks with start
101
- and stop and you can finally extract tasks from a minutes of meetings file.\n\n===Create
102
- tasks with new\nCreate a new task in the default task directory ~/.tasks\n $
103
- syctask \"My first task\"\n\nProvide a description\n $ syctask \"My first task\"
104
- --description \"Explanation of my first task\"\n\nSchedule a task with a follow-up
105
- and due date\n $ syctask \"My first task\" --follow-up \"2013-02-25\" --due \"2013-03-11\"\n\nSet
106
- a proirity for a task\n $ syctask \"My first task\" --prio 3\n\nExcept for --description
107
- you can also provide short forms for the options.\n\n===List tasks\nList tasks that
108
- are not marked as done in short form\n $ syctask list\n\nList all tasks in long
109
- form\n $ syctask list --all --complete\n\nSearch tasks that match a pattern\n
110
- \ $ syctask list --id \"<10\" --follow_up \">2013-02-25\" --title \"My \\w task\"\n\n===Update
111
- tasks\nExcept for title and id all values can be updated. Note and tags are not\noverridden
112
- rather supplemented with the update value.\n\nUpdate task with ID 1 and provide
113
- some informative note\n $ syctask update 1 --note \"Some explanation about the
114
- progress on the task\"\n\n===Complete tasks\nComplete the task with ID 1 and provide
115
- a final note\n $ syctask done 1 --note \"Finalize my first task\"\n\n==Supported
116
- platform\nsyc-task has been tested with 1.9.3\n\n==Notes\nAs with version 0.0.1
117
- only new, update, list and done is implemented.\n\nThe test files live in the folder
118
- test and start with test_.\n\nThere is a rake file available to run all tests\n
119
- \ $ rake test\n\n==License\nsyc-task is released under the {MIT License}[http://opensource.org/licenses/MIT]\n\n==Links\n*
120
- [http://www.github.com/sugaryourcoffee/syc-task] - Source code on GitHub\n* [http://syc.dyndns.org/drupal/wiki/syc-task]
121
- - Development notebook\n* [https://rubygems.org/gems/syc-backup] - RubyGems\n"
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