samg-timetrap 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -101,9 +101,9 @@ Commands
101
101
 
102
102
  **display**
103
103
  Display a given timesheet. If no timesheet is specified, show the current
104
- timesheet. Accepts an optional ``--ids`` flag which will include the entries'
105
- ids in the output. This is useful when editing an non running entry with
106
- ``alter``.
104
+ timesheet. If ``all`` is passed as timesheet display all timesheets. Accepts
105
+ an optional ``--ids`` flag which will include the entries' ids in the output.
106
+ This is useful when editing an non running entry with ``alter``.
107
107
 
108
108
  usage: ``t display [--ids] [--start DATE] [--end DATE] [TIMESHEET]``
109
109
 
data/bin/t CHANGED
@@ -1,3 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
- require 'timetrap'
2
+ begin
3
+ require 'timetrap'
4
+ rescue LoadError
5
+ if File.symlink? __FILE__
6
+ require File.dirname(File.readlink(__FILE__)) + '/../lib/timetrap'
7
+ else
8
+ require File.dirname(__FILE__) + '/../lib/timetrap'
9
+ end
10
+ end
3
11
  Timetrap::CLI.invoke
data/lib/timetrap/cli.rb CHANGED
@@ -18,8 +18,9 @@ where COMMAND is one of:
18
18
  -e, --end <time:qs> Change the end time to <time>
19
19
  * backend - open an sqlite shell to the database
20
20
  usage: t backend
21
- * display - display the current timesheet
22
- usage: t display [--ids] [--start DATE] [--end DATE] [TIMESHEET]
21
+ * display - display the current timesheet or a specific. Pass `all' as
22
+ timesheet to display all sheets.
23
+ usage: t display [--ids] [--start DATE] [--end DATE] [TIMESHEET | all ]
23
24
  -v, --ids Print database ids (for use with alter)
24
25
  -s, --start <date:qs> Include entries that start on this date or later
25
26
  -e, --end <date:qs> Include entries that start on this date or earlier
@@ -121,42 +122,58 @@ where COMMAND is one of:
121
122
  end
122
123
 
123
124
  def display
124
- sheet = sheet_name_from_string(unused_args)
125
- sheet = (sheet =~ /.+/ ? sheet : Timetrap.current_sheet)
126
- say "Timesheet: #{sheet}"
127
- id_heading = args['-v'] ? 'Id' : ' '
128
- say "#{id_heading} Day Start End Duration Notes"
129
- last_start = nil
130
- from_current_day = []
131
- ee = Timetrap::Entry.filter(:sheet => sheet).order(:start)
132
- ee = ee.filter(:start >= Date.parse(args['-s'])) if args['-s']
133
- ee = ee.filter(:start <= Date.parse(args['-e']) + 1) if args['-e']
134
- ee.each_with_index do |e, i|
135
-
136
-
137
- from_current_day << e
138
- e_end = e.end || Time.now
139
- say "%-4s%16s%11s -%9s%10s %s" % [
140
- (args['-v'] ? e.id : ''),
141
- format_date_if_new(e.start, last_start),
142
- format_time(e.start),
143
- format_time(e.end),
144
- format_duration(e.start, e_end),
145
- e.note
146
- ]
147
-
148
- nxt = ee.map[i+1]
149
- if nxt == nil or !same_day?(e.start, nxt.start)
150
- say "%52s" % format_total(from_current_day)
151
- from_current_day = []
152
- else
153
- end
154
- last_start = e.start
125
+ sheets = if (sheet = sheet_name_from_string(unused_args)) == 'all'
126
+ Timetrap::Entry.sheets
127
+ elsif sheet =~ /.+/
128
+ [sheet]
129
+ else
130
+ [Timetrap.current_sheet]
155
131
  end
156
- say <<-OUT
132
+ entries = []
133
+ sheets.each do |sheet|
134
+ say "Timesheet: #{sheet}"
135
+ id_heading = args['-v'] ? 'Id' : ' '
136
+ say "#{id_heading} Day Start End Duration Notes"
137
+ last_start = nil
138
+ from_current_day = []
139
+ ee = Timetrap::Entry.filter(:sheet => sheet).order(:start)
140
+ ee = ee.filter(:start >= Date.parse(args['-s'])) if args['-s']
141
+ ee = ee.filter(:start <= Date.parse(args['-e']) + 1) if args['-e']
142
+ entries += ee.all
143
+ ee.each_with_index do |e, i|
144
+
145
+
146
+ from_current_day << e
147
+ e_end = e.end || Time.now
148
+ say "%-4s%16s%11s -%9s%10s %s" % [
149
+ (args['-v'] ? e.id : ''),
150
+ format_date_if_new(e.start, last_start),
151
+ format_time(e.start),
152
+ format_time(e.end),
153
+ format_duration(e.start, e_end),
154
+ e.note
155
+ ]
156
+
157
+ nxt = ee.map[i+1]
158
+ if nxt == nil or !same_day?(e.start, nxt.start)
159
+ say "%52s" % format_total(from_current_day)
160
+ from_current_day = []
161
+ else
162
+ end
163
+ last_start = e.start
164
+ end
165
+ say <<-OUT
157
166
  ---------------------------------------------------------
158
- OUT
159
- say " Total%43s" % format_total(ee)
167
+ OUT
168
+ say " Total%43s" % format_total(ee)
169
+ say "\n" unless sheet == sheets.last
170
+ end
171
+ if sheets.size > 1
172
+ say <<-OUT
173
+ -------------------------------------------------------------
174
+ OUT
175
+ say "Grand Total%41s" % format_total(entries)
176
+ end
160
177
  end
161
178
 
162
179
  # TODO: Consolidate display and format
@@ -180,7 +197,7 @@ where COMMAND is one of:
180
197
  end
181
198
 
182
199
  def list
183
- sheets = Entry.map{|e|e.sheet}.uniq.sort.map do |sheet|
200
+ sheets = Entry.sheets.map do |sheet|
184
201
  sheet_atts = {:total => 0, :running => 0, :today => 0}
185
202
  DB[:entries].filter(:sheet => sheet).inject(sheet_atts) do |m, e|
186
203
  e_end = e[:end] || Time.now
@@ -35,6 +35,7 @@ module Timetrap
35
35
  end
36
36
 
37
37
  def sheet_name_from_string string
38
+ return "all" if string =~ /^\W*all\W*$/
38
39
  return "" unless string =~ /.+/
39
40
  DB[:entries].filter(:sheet.like("#{string}%")).first[:sheet]
40
41
  rescue
@@ -10,6 +10,10 @@ module Timetrap
10
10
  self[:end]= Chronic.parse(time) || time
11
11
  end
12
12
 
13
+ def self.sheets
14
+ map{|e|e.sheet}.uniq.sort
15
+ end
16
+
13
17
  # do a quick pseudo migration. This should only get executed on the first run
14
18
  set_schema do
15
19
  primary_key :id
@@ -109,6 +109,28 @@ Id Day Start End Duration Notes
109
109
  ---------------------------------------------------------
110
110
  Total 8:00:00
111
111
  OUTPUT
112
+
113
+ @desired_output_for_all = <<-OUTPUT
114
+ Timesheet: SpecSheet
115
+ Day Start End Duration Notes
116
+ Fri Oct 03, 2008 12:00:00 - 14:00:00 2:00:00 entry 1
117
+ 16:00:00 - 18:00:00 2:00:00 entry 2
118
+ 4:00:00
119
+ Sun Oct 05, 2008 16:00:00 - 18:00:00 2:00:00 entry 3
120
+ 18:00:00 - 2:00:00 entry 4
121
+ 4:00:00
122
+ ---------------------------------------------------------
123
+ Total 8:00:00
124
+
125
+ Timesheet: another
126
+ Day Start End Duration Notes
127
+ Sun Oct 05, 2008 18:00:00 - 2:00:00 entry 4
128
+ 2:00:00
129
+ ---------------------------------------------------------
130
+ Total 2:00:00
131
+ -------------------------------------------------------------
132
+ Grand Total 10:00:00
133
+ OUTPUT
112
134
  end
113
135
 
114
136
  it "should display the current timesheet" do
@@ -133,6 +155,12 @@ Id Day Start End Duration Notes
133
155
  invoke 'display S --ids'
134
156
  $stdout.string.should == @desired_output_with_ids
135
157
  end
158
+
159
+ it "should display all timesheets" do
160
+ Timetrap.current_sheet = 'another'
161
+ invoke 'display all'
162
+ $stdout.string.should == @desired_output_for_all
163
+ end
136
164
  end
137
165
 
138
166
  describe "format" do
@@ -419,44 +447,58 @@ current sheet: 0:01:00 (a timesheet that is running)
419
447
  end
420
448
 
421
449
  describe Timetrap::Entry do
422
- before do
423
- @time = Time.now
424
- @entry = Timetrap::Entry.new
425
- end
426
-
427
- describe 'attributes' do
428
- it "should have a note" do
429
- @entry.note = "world takeover"
430
- @entry.note.should == "world takeover"
450
+ describe "with an instance" do
451
+ before do
452
+ @time = Time.now
453
+ @entry = Timetrap::Entry.new
431
454
  end
432
455
 
433
- it "should have a start" do
434
- @entry.start = @time
435
- @entry.start.should == @time
436
- end
456
+ describe 'attributes' do
457
+ it "should have a note" do
458
+ @entry.note = "world takeover"
459
+ @entry.note.should == "world takeover"
460
+ end
437
461
 
438
- it "should have a end" do
439
- @entry.end = @time
440
- @entry.end.should == @time
441
- end
462
+ it "should have a start" do
463
+ @entry.start = @time
464
+ @entry.start.should == @time
465
+ end
442
466
 
443
- it "should have a sheet" do
444
- @entry.sheet= 'name'
445
- @entry.sheet.should == 'name'
467
+ it "should have a end" do
468
+ @entry.end = @time
469
+ @entry.end.should == @time
470
+ end
471
+
472
+ it "should have a sheet" do
473
+ @entry.sheet= 'name'
474
+ @entry.sheet.should == 'name'
475
+ end
446
476
  end
447
- end
448
477
 
449
- describe "parsing natural language times" do
450
- it "should set start time using english" do
451
- @entry.start = "yesterday 10am"
452
- @entry.start.should_not be_nil
453
- @entry.start.should == Chronic.parse("yesterday 10am")
478
+ describe "parsing natural language times" do
479
+ it "should set start time using english" do
480
+ @entry.start = "yesterday 10am"
481
+ @entry.start.should_not be_nil
482
+ @entry.start.should == Chronic.parse("yesterday 10am")
483
+ end
484
+
485
+ it "should set end time using english" do
486
+ @entry.end = "tomorrow 1pm"
487
+ @entry.end.should_not be_nil
488
+ @entry.end.should == Chronic.parse("tomorrow 1pm")
489
+ end
454
490
  end
491
+ end
455
492
 
456
- it "should set end time using english" do
457
- @entry.end = "tomorrow 1pm"
458
- @entry.end.should_not be_nil
459
- @entry.end.should == Chronic.parse("tomorrow 1pm")
493
+ describe '::sheets' do
494
+ it "should output a list of all the available sheets" do
495
+ Timetrap::Entry.create( :sheet => 'another',
496
+ :note => 'entry 4', :start => '2008-10-05 18:00:00'
497
+ )
498
+ Timetrap::Entry.create( :sheet => 'SpecSheet',
499
+ :note => 'entry 2', :start => '2008-10-03 16:00:00', :end => '2008-10-03 18:00:00'
500
+ )
501
+ Timetrap::Entry.sheets.should == %w(another SpecSheet).sort
460
502
  end
461
503
  end
462
504
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: samg-timetrap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Goldstein