samg-timetrap 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/README.md +37 -27
  2. data/lib/timetrap.rb +27 -17
  3. data/spec/timetrap_spec.rb +28 -18
  4. metadata +1 -1
data/README.md CHANGED
@@ -50,24 +50,32 @@ The basic usage is as follows::
50
50
  $ t out
51
51
 
52
52
  The first command, ``t switch writing``, switches to the timesheet "writing"
53
- (or creates it if it does not exist). ``t in document timetrap --at "10 minutes
53
+ (or creates it if it does not exist). ``t in document timetrap ``--at`` "10 minutes
54
54
  ago"`` creates a new period in the current timesheet, and annotates it with the
55
- description "document timetrap". The optional --at flag can be passed to start
56
- the entry at a time other than the present. Any Chronic or database parsable
57
- strings are accepted. Note that this command would be in error if the
58
- ``writing`` timesheet was already active. Finally, ``t out`` records the
59
- current time as the end time for the most recent period in the ``writing``
60
- timesheet.
55
+ description "document timetrap". The optional ``--at`` flag can be passed to start
56
+ the entry at a time other than the present. The ``--at`` flag is able to parse
57
+ natural language times (via Chronic: http://chronic.rubyforge.org/) and will
58
+ understand 'friday 13:00', 'mon 2:35', '4pm', etc. (also true of the ``alter``
59
+ command's ``--start`` and ``--end`` flags.) Note that this command would be in
60
+ error if the ``writing`` timesheet was already active. Finally, ``t out``
61
+ records the current time as the end time for the most recent period in the
62
+ ``writing`` timesheet.
61
63
 
62
64
  To display the current timesheet, invoke the ``t display`` command::
63
65
 
64
66
  $ t display
65
- Timesheet writing:
66
- Day Start End Duration Notes
67
- Mar 14, 2009 19:53:30 - 20:06:15 0:12:45 document timetrap
68
- 20:07:02 - 0:00:01 write home about timetrap
69
- 0:12:46
70
- Total 0:12:46
67
+ Timesheet: timetrap
68
+ Day Start End Duration Notes
69
+ Mon Apr 13, 2009 15:46:51 - 17:03:50 1:16:59 improved display functionality
70
+ 17:25:59 - 17:26:02 0:00:03
71
+ 18:38:07 - 18:38:52 0:00:45 working on list
72
+ 22:37:38 - 23:38:43 1:01:05 work on kill
73
+ 2:18:52
74
+ Tue Apr 14, 2009 00:41:16 - 01:40:19 0:59:03 gem packaging
75
+ 10:20:00 - 10:48:10 0:28:10 enhance alter
76
+ 1:27:13
77
+ ---------------------------------------------------------
78
+ Total 3:46:05
71
79
 
72
80
  Each period in the timesheet is listed on a row. If the timesheet is active,
73
81
  the final period in the timesheet will have no end time. After each day, the
@@ -79,9 +87,11 @@ Commands
79
87
  --------
80
88
 
81
89
  **alter**
82
- Inserts a note associated with the currently active period in the timesheet.
90
+ Inserts a note associated with the an entry in the timesheet, or alters the
91
+ start or end times. Defaults to the current time although an ``--id`` flag can
92
+ be passed with the entry's id (see display.)
83
93
 
84
- usage: ``t alter NOTES...``
94
+ usage: ``t alter [--id ID] [--start TIME] [--end TIME] [NOTES]``
85
95
 
86
96
  **backend**
87
97
  Run an interactive database session on the timetrap database. Requires the
@@ -91,9 +101,11 @@ Commands
91
101
 
92
102
  **display**
93
103
  Display a given timesheet. If no timesheet is specified, show the current
94
- timesheet.
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``.
95
107
 
96
- usage: ``t display [TIMESHEET]``
108
+ usage: ``t display [--ids] [TIMESHEET]``
97
109
 
98
110
  **format**
99
111
  Export the current sheet as a comma-separated value format spreadsheet. If
@@ -107,15 +119,15 @@ Commands
107
119
  **in**
108
120
  Start the timer for the current timesheet. Must be called before out. Notes
109
121
  may be specified for this period. This is exactly equivalent to
110
- ``t in; t alter NOTES``
122
+ ``t in; t alter NOTES``. Accepts an optional --at flag.
111
123
 
112
- usage: ``t in [--at TIME] [NOTES...]``
124
+ usage: ``t in [--at TIME] [NOTES]``
113
125
 
114
126
  **kill**
115
- Delete a timesheet. If no timesheet is specified, delete the current
116
- timesheet and switch to the default timesheet.
127
+ Delete a timesheet or an entry. Entry's are referenced using an ``--id``
128
+ flag (see display). Sheets are referenced by name.
117
129
 
118
- usage: ``t kill [TIMESHEET]``
130
+ usage: ``t kill [--id ID] [TIMESHEET]``
119
131
 
120
132
  **list**
121
133
  List the available timesheets.
@@ -126,15 +138,13 @@ Commands
126
138
  Print the current sheet, whether it's active, and if so, how long it has been
127
139
  active and what notes are associated with the current period.
128
140
 
129
- If a specific timesheet is given, display the same information for that
130
- timesheet instead.
131
-
132
141
  usage: ``t now``
133
142
 
134
143
  **out**
135
- Stop the timer for the current timesheet. Must be called after in.
144
+ Stop the timer for the current timesheet. Must be called after in. Accepts an
145
+ optional --at flag.
136
146
 
137
- usage: ``t in [--at TIME]``
147
+ usage: ``t out [--at TIME]``
138
148
 
139
149
  **running**
140
150
  Print all active sheets and any messages associated with them.
data/lib/timetrap.rb CHANGED
@@ -64,18 +64,28 @@ module Timetrap
64
64
  end
65
65
 
66
66
  def kill
67
- sheet = unused_args
68
- unless (sheets = Entry.map{|e| e.sheet }.uniq).include?(sheet)
69
- say "ain't no sheet #{sheet.inspect}", 'sheets:', *sheets
70
- return
71
- end
72
- victims = Entry.filter(:sheet => sheet).count
73
- print "are you sure you want to delete #{victims} entries on sheet #{sheet.inspect}? "
74
- if $stdin.gets =~ /\Aye?s?\Z/i
75
- Timetrap.kill sheet
76
- say "killed #{victims} entries"
67
+ if e = Entry[args['--id']]
68
+ out = "are you sure you want to delete entry #{e.id}? "
69
+ out << "(#{e.note}) " if e.note.to_s =~ /.+/
70
+ print out
71
+ if $stdin.gets =~ /\Aye?s?\Z/i
72
+ e.destroy
73
+ say "it's dead"
74
+ else
75
+ say "will not kill"
76
+ end
77
+ elsif (sheets = Entry.map{|e| e.sheet }.uniq).include?(sheet = unused_args)
78
+ victims = Entry.filter(:sheet => sheet).count
79
+ print "are you sure you want to delete #{victims} entries on sheet #{sheet.inspect}? "
80
+ if $stdin.gets =~ /\Aye?s?\Z/i
81
+ Timetrap.kill_sheet sheet
82
+ say "killed #{victims} entries"
83
+ else
84
+ say "will not kill"
85
+ end
77
86
  else
78
- say "will not kill"
87
+ victim = args['--id'] ? args['--id'].to_s.inspect : sheet.inspect
88
+ say "can't find #{victim} to kill", 'sheets:', *sheets
79
89
  end
80
90
  end
81
91
 
@@ -84,7 +94,7 @@ module Timetrap
84
94
  sheet = (sheet =~ /.+/ ? sheet : Timetrap.current_sheet)
85
95
  say "Timesheet: #{sheet}"
86
96
  id_heading = args['--ids'] ? 'Id' : ' '
87
- say " #{id_heading} Day Start End Duration Notes"
97
+ say "#{id_heading} Day Start End Duration Notes"
88
98
  last_start = nil
89
99
  from_current_day = []
90
100
  (ee = Timetrap.entries(sheet)).each_with_index do |e, i|
@@ -92,7 +102,7 @@ module Timetrap
92
102
 
93
103
  from_current_day << e
94
104
  e_end = e.end || Time.now
95
- say "%9s%18s%11s -%9s%10s %s" % [
105
+ say "%-4s%16s%11s -%9s%10s %s" % [
96
106
  (args['--ids'] ? e.id : ''),
97
107
  format_date_if_new(e.start, last_start),
98
108
  format_time(e.start),
@@ -103,16 +113,16 @@ module Timetrap
103
113
 
104
114
  nxt = Timetrap.entries(sheet).map[i+1]
105
115
  if nxt == nil or !same_day?(e.start, nxt.start)
106
- say "%59s" % format_total(from_current_day)
116
+ say "%52s" % format_total(from_current_day)
107
117
  from_current_day = []
108
118
  else
109
119
  end
110
120
  last_start = e.start
111
121
  end
112
122
  say <<-OUT
113
- ---------------------------------------------------------
123
+ ---------------------------------------------------------
114
124
  OUT
115
- say " Total%43s" % format_total(ee)
125
+ say " Total%43s" % format_total(ee)
116
126
  end
117
127
 
118
128
  def format
@@ -261,7 +271,7 @@ module Timetrap
261
271
  self.current_sheet = sheet
262
272
  end
263
273
 
264
- def kill sheet
274
+ def kill_sheet sheet
265
275
  Entry.filter(:sheet => sheet).destroy
266
276
  end
267
277
 
@@ -86,28 +86,28 @@ describe Timetrap do
86
86
  Time.stub!(:now).and_return Time.at(1223254800 + (60*60*2))
87
87
  @desired_output = <<-OUTPUT
88
88
  Timesheet: SpecSheet
89
- Day Start End Duration Notes
90
- Fri Oct 03, 2008 12:00:00 - 14:00:00 2:00:00 entry 1
91
- 16:00:00 - 18:00:00 2:00:00 entry 2
92
- 4:00:00
93
- Sun Oct 05, 2008 16:00:00 - 18:00:00 2:00:00 entry 3
94
- 18:00:00 - 2:00:00 entry 4
95
- 4:00:00
96
- ---------------------------------------------------------
97
- Total 8:00:00
89
+ Day Start End Duration Notes
90
+ Fri Oct 03, 2008 12:00:00 - 14:00:00 2:00:00 entry 1
91
+ 16:00:00 - 18:00:00 2:00:00 entry 2
92
+ 4:00:00
93
+ Sun Oct 05, 2008 16:00:00 - 18:00:00 2:00:00 entry 3
94
+ 18:00:00 - 2:00:00 entry 4
95
+ 4:00:00
96
+ ---------------------------------------------------------
97
+ Total 8:00:00
98
98
  OUTPUT
99
99
 
100
100
  @desired_output_with_ids = <<-OUTPUT
101
101
  Timesheet: SpecSheet
102
- Id Day Start End Duration Notes
103
- 3 Fri Oct 03, 2008 12:00:00 - 14:00:00 2:00:00 entry 1
104
- 2 16:00:00 - 18:00:00 2:00:00 entry 2
105
- 4:00:00
106
- 4 Sun Oct 05, 2008 16:00:00 - 18:00:00 2:00:00 entry 3
107
- 5 18:00:00 - 2:00:00 entry 4
108
- 4:00:00
109
- ---------------------------------------------------------
110
- Total 8:00:00
102
+ Id Day Start End Duration Notes
103
+ 3 Fri Oct 03, 2008 12:00:00 - 14:00:00 2:00:00 entry 1
104
+ 2 16:00:00 - 18:00:00 2:00:00 entry 2
105
+ 4:00:00
106
+ 4 Sun Oct 05, 2008 16:00:00 - 18:00:00 2:00:00 entry 3
107
+ 5 18:00:00 - 2:00:00 entry 4
108
+ 4:00:00
109
+ ---------------------------------------------------------
110
+ Total 8:00:00
111
111
  OUTPUT
112
112
  end
113
113
 
@@ -183,10 +183,20 @@ Timesheet: SpecSheet
183
183
  end
184
184
 
185
185
  it "should delete a timesheet" do
186
+ create_entry
186
187
  entry = create_entry
187
188
  lambda do
188
189
  $stdin.string = "yes\n"
189
190
  invoke "kill #{entry.sheet}"
191
+ end.should change(Timetrap::Entry, :count).by(-2)
192
+ end
193
+
194
+ it "should delete an entry" do
195
+ create_entry
196
+ entry = create_entry
197
+ lambda do
198
+ $stdin.string = "yes\n"
199
+ invoke "kill --id #{entry.id}"
190
200
  end.should change(Timetrap::Entry, :count).by(-1)
191
201
  end
192
202
  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.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Goldstein