doing 0.2.2.pre → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a4b26436b15b40cf894c0d3b15dfaf367e299f95
4
- data.tar.gz: d13cf54255ec6db1b5d24c7fec73455cb6e642f5
3
+ metadata.gz: 9113d5736076e7608e42c328d3bc6a9f6edb517e
4
+ data.tar.gz: 793034d75510f42fa2c9f2e3f75d26156fef4d51
5
5
  SHA512:
6
- metadata.gz: 5fdaadd019f03f7a93e1fc211c20ed017502d16eade73f7f6eb616e123f14988422296c17b2a759643efcb7abbcc721a451d47fe1ede0c30e8f719c1cafc94e5
7
- data.tar.gz: 75907e9acf02fadfa7416550cca0bbfe487452a660a8c494c4228b9e87f47b0306e79188718395da56e48e6a6c15c631e7bb34590655ec830ca59115fdf89b7e
6
+ metadata.gz: bd187715ead8168b92c2a70ebe53d68d95271a241524a1011c82c9358cae43ed0766dea0b1fe73c469d112435921342e2fb9811af2835f039d9ab1445519196f
7
+ data.tar.gz: 11c41e6db6c47490ff82b922a262df3292808e6b5736babf3d12a28de96075f91322da61f882c73178a7b9240c82c8056f7f99180bee8c309d1dc852f7427ddc
data/README.md CHANGED
@@ -109,8 +109,9 @@ The config also contains templates for various command outputs. Include placehol
109
109
  - `%hr`: a horizontal rule (`-`) the width of the terminal
110
110
  - `%hr_under`: a horizontal rule (`_`) the width of the terminal
111
111
  - `%[color]`: color can be black, red, green, blue, yellow, magenta, cyan or white
112
- - you can prefix "bg" to affect background colors (%bgyellow)
113
- - prefix "bold" and "boldbg" for strong colors (%boldgreen, %boldbgblue)
112
+ - you can prefix "bg" to affect background colors (%bgyellow)
113
+ - prefix "bold" and "boldbg" for strong colors (%boldgreen, %boldbgblue)
114
+ - `%interval`: when used with the `-t` switch on the `show` command, it will display the time between a timestamp or `@start(date)` tag and the `@done(date)` tag, if it exists. Otherwise, it will remain empty.
114
115
 
115
116
  Date formats are based on Ruby [strftime](http://www.ruby-doc.org/stdlib-2.1.1/libdoc/date/rdoc/Date.html#method-i-strftime) formatting.
116
117
 
@@ -293,6 +294,8 @@ You can filter the `show` command by tags. Simply list them after the section na
293
294
 
294
295
  Use `-c X` to limit the displayed results. Combine it with `-a newest` or `-a oldest` to choose which chronological end it trims from. You can also set the sort order of the output with `-s asc` or `-s desc`.
295
296
 
297
+ The `show` command can also show the time spent on a task if it has a `@done(date)` tag with the `-t` option. This requires that you include a `%interval` token in template -> default in the config. You can also include `@start(date)` tags, which override the timestamp when calculating the intervals.
298
+
296
299
  If you have a use for it, you can use `--csv` on the show or view commands to output the results as a comma-separated CSV to STDOUT. Redirect to a file to save it: `doing show all done --csv > ~/Desktop/done.csv`.
297
300
 
298
301
  #### Views
data/bin/doing CHANGED
@@ -140,7 +140,7 @@ command :done do |c|
140
140
  c.switch [:a,:archive], :negatable => false, :default_value => false
141
141
 
142
142
  c.desc 'Backdate to "date_string" (natural language)'
143
- c.flag [:backdate]
143
+ c.flag [:back]
144
144
 
145
145
  c.desc 'Section'
146
146
  c.default_value wwid.current_section
@@ -287,9 +287,17 @@ command :show do |c|
287
287
  c.flag [:s,:sort], :default_value => 'asc'
288
288
 
289
289
  c.desc 'Output to csv'
290
- c.default_value 'false'
290
+ c.default_value false
291
291
  c.switch [:csv], :default_value => false, :negatable => false
292
292
 
293
+ c.desc 'Show time intervals on @done tasks'
294
+ c.default_value false
295
+ c.switch [:t,:times], :default_value => false
296
+
297
+ c.desc 'Show intervals with totals at the end of output'
298
+ c.default_value false
299
+ c.switch [:totals], :default_value => false, :negatable => true
300
+
293
301
  c.action do |global_options,options,args|
294
302
  tag_filter = false
295
303
  tags = []
@@ -317,7 +325,12 @@ command :show do |c|
317
325
  }
318
326
  end
319
327
 
320
- puts wwid.list_section({:section => section, :count => options[:c].to_i, :tag_filter => tag_filter, :age => options[:a], :order => options[:s], :csv => options[:csv]})
328
+ options[:t] = true if options[:totals]
329
+
330
+ puts wwid.list_section({:section => section, :count => options[:c].to_i, :tag_filter => tag_filter, :age => options[:a], :order => options[:s], :csv => options[:csv], :times => options[:t]})
331
+
332
+ puts wwid.tag_times if options[:totals]
333
+
321
334
  end
322
335
  end
323
336
 
@@ -345,8 +358,21 @@ end
345
358
 
346
359
  desc 'List entries from today'
347
360
  command :today do |c|
361
+ c.desc 'Show time intervals on @done tasks'
362
+ c.default_value false
363
+ c.switch [:t,:times], :default_value => false
364
+
365
+ c.desc 'Show time totals at the end of output'
366
+ c.default_value false
367
+ c.switch [:totals], :default_value => false, :negatable => true
368
+
348
369
  c.action do |global_options,options,args|
349
- puts wwid.today.strip
370
+
371
+ options[:t] = true if options[:totals]
372
+
373
+ puts wwid.today(options[:t]).strip
374
+
375
+ puts wwid.tag_times if options[:totals]
350
376
  end
351
377
  end
352
378
 
@@ -398,6 +424,14 @@ command :view do |c|
398
424
  c.default_value 'false'
399
425
  c.switch [:csv], :default_value => false, :negatable => false
400
426
 
427
+ c.desc 'Show time intervals on @done tasks'
428
+ c.default_value false
429
+ c.switch [:t,:times], :default_value => false
430
+
431
+ c.desc 'Show intervals with totals at the end of output'
432
+ c.default_value false
433
+ c.switch [:totals], :default_value => false, :negatable => true
434
+
401
435
  c.action do |global_options,options,args|
402
436
  if args.empty?
403
437
  title = wwid.choose_view
@@ -429,7 +463,11 @@ command :view do |c|
429
463
  count = options[:c] ? options[:c] : view.has_key?('count') ? view['count'] : 10
430
464
  section = options[:s] ? section : view.has_key?('section') ? view['section'] : wwid.current_section
431
465
  order = view.has_key?('order') ? view['order'] : "asc"
432
- puts wwid.list_section({:section => section, :count => count, :template => template, :format => format, :order => order, :tag_filter => tag_filter, :csv => options[:csv], :tags_color => tags_color })
466
+ options[:t] = true if options[:totals]
467
+
468
+ puts wwid.list_section({:section => section, :count => count, :template => template, :format => format, :order => order, :tag_filter => tag_filter, :csv => options[:csv], :tags_color => tags_color, :times => options[:t] })
469
+
470
+ puts wwid.tag_times if options[:totals]
433
471
  else
434
472
  raise "View #{title} not found in config"
435
473
  end
data/lib/doing/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Doing
2
- VERSION = '0.2.2.pre'
2
+ VERSION = '0.2.4'
3
3
  end
data/lib/doing/wwid.rb CHANGED
@@ -13,7 +13,7 @@ class WWID
13
13
 
14
14
  def initialize(input=nil)
15
15
  @content = {}
16
-
16
+ @timers = {}
17
17
  @config = read_config
18
18
 
19
19
  @config['doing_file'] ||= "~/what_was_i_doing.md"
@@ -27,7 +27,7 @@ class WWID
27
27
  }
28
28
  @config['templates']['today'] ||= {
29
29
  'date_format' => '%_I:%M%P',
30
- 'template' => '%date: %title%note',
30
+ 'template' => '%date: %title %interval%note',
31
31
  'wrap_width' => 0
32
32
  }
33
33
  @config['templates']['last'] ||= {
@@ -380,6 +380,7 @@ class WWID
380
380
  opt[:today] ||= false
381
381
  opt[:tag_filter] ||= false
382
382
  opt[:tags_color] ||= false
383
+ opt[:times] ||= false
383
384
 
384
385
  if opt[:section].nil?
385
386
  opt[:section] = @content[choose_section]
@@ -481,6 +482,13 @@ class WWID
481
482
  end
482
483
 
483
484
  output.sub!(/%date/,item['date'].strftime(opt[:format]))
485
+
486
+ if item['title'] =~ /@done\((\d{4}-\d\d-\d\d \d\d:\d\d.*?)\)/ && opt[:times]
487
+ interval = get_interval(item)
488
+ end
489
+ interval ||= ""
490
+ output.sub!(/%interval/,interval)
491
+
484
492
  output.sub!(/%shortdate/) {
485
493
  if item['date'] > Date.today.to_time
486
494
  item['date'].strftime('%_I:%M%P')
@@ -580,9 +588,9 @@ class WWID
580
588
  list_section({:section => @current_section, :wrap_width => cfg['wrap_width'], :count => 0, :format => cfg['date_format'], :template => cfg['template'], :order => order})
581
589
  end
582
590
 
583
- def today
591
+ def today(times=false)
584
592
  cfg = @config['templates']['today']
585
- list_section({:section => @current_section, :wrap_width => cfg['wrap_width'], :count => 0, :format => cfg['date_format'], :template => cfg['template'], :order => "asc", :today => true})
593
+ list_section({:section => @current_section, :wrap_width => cfg['wrap_width'], :count => 0, :format => cfg['date_format'], :template => cfg['template'], :order => "asc", :today => true, :times => times})
586
594
  end
587
595
 
588
596
  def recent(count=10,section=nil)
@@ -597,8 +605,68 @@ class WWID
597
605
  list_section({:section => @current_section, :wrap_width => cfg['wrap_width'], :count => 1, :format => cfg['date_format'], :template => cfg['template']})
598
606
  end
599
607
 
608
+ def tag_times
609
+ output = []
610
+ return "" if @timers.length == 0
611
+ max = @timers.keys.sort_by {|k| k.length }.reverse[0].length + 1
612
+
613
+ total = @timers.delete("All")
614
+
615
+ @timers.sort_by{|k,v| v }.reverse.each {|k,v|
616
+ spacer = ""
617
+ (max - k.length).times do
618
+ spacer += " "
619
+ end
620
+ output.push("#{k}:#{spacer}#{"%02d:%02d:%02d" % fmt_time(v)}")
621
+ }
622
+ output.empty? ? "" : "\n--- Tag Totals ---\n" + output.join("\n") + "\n\nTotal tracked: #{"%02d:%02d:%02d" % fmt_time(total)}\n"
623
+ end
624
+
625
+ private
626
+
627
+ def get_interval(item)
628
+ done = nil
629
+ start = nil
630
+
631
+ if item['title'] =~ /@done\((\d{4}-\d\d-\d\d \d\d:\d\d.*?)\)/
632
+ done = Time.parse($1)
633
+ else
634
+ return nil
635
+ end
636
+
637
+ if item['title'] =~ /@start\((\d{4}-\d\d-\d\d \d\d:\d\d.*?)\)/
638
+ start = Time.parse($1)
639
+ else
640
+ start = item['date']
641
+ end
642
+
643
+ seconds = (done - start).to_i
644
+
645
+ item['title'].scan(/(?mi)@(\S+?)(\(.*\))?(?=\s|$)/).each {|m|
646
+ k = m[0] == "done" ? "All" : m[0]
647
+ if @timers.has_key?(k)
648
+ @timers[k] += seconds
649
+ else
650
+ @timers[k] = seconds
651
+ end
652
+ }
653
+
654
+ "%02d:%02d:%02d" % fmt_time(seconds)
655
+ end
656
+
657
+ def fmt_time(seconds)
658
+ minutes = (seconds / 60).to_i
659
+ hours = (minutes / 60).to_i
660
+ days = (hours / 24).to_i
661
+ hours = (hours % 60).to_i
662
+ minutes = (minutes % 60).to_i
663
+ [days, hours, minutes]
664
+ end
600
665
  end
601
666
 
667
+
668
+
669
+
602
670
  # infile = "~/Dropbox/nvALT2.2/?? What was I doing.md"
603
671
 
604
672
  # wwid = WWID.new(infile)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: doing
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2.pre
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
@@ -130,9 +130,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
130
  version: '0'
131
131
  required_rubygems_version: !ruby/object:Gem::Requirement
132
132
  requirements:
133
- - - '>'
133
+ - - '>='
134
134
  - !ruby/object:Gem::Version
135
- version: 1.3.1
135
+ version: '0'
136
136
  requirements: []
137
137
  rubyforge_project:
138
138
  rubygems_version: 2.2.2