samg-timetrap 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -57,7 +57,7 @@ ago"`` creates a new period in the current timesheet, and annotates it with the
57
57
  description "document timetrap". The optional ``--at`` flag can be passed to start
58
58
  the entry at a time other than the present. The ``--at`` flag is able to parse
59
59
  natural language times (via Chronic: http://chronic.rubyforge.org/) and will
60
- understand 'friday 13:00', 'mon 2:35', '4pm', etc. (also true of the ``alter``
60
+ understand 'friday 13:00', 'mon 2:35', '4pm', etc. (also true of the ``edit``
61
61
  command's ``--start`` and ``--end`` flags.) Note that this command would be in
62
62
  error if the ``writing`` timesheet was already active. Finally, ``t out``
63
63
  records the current time as the end time for the most recent period in the
@@ -74,7 +74,7 @@ To display the current timesheet, invoke the ``t display`` command::
74
74
  22:37:38 - 23:38:43 1:01:05 work on kill
75
75
  2:18:52
76
76
  Tue Apr 14, 2009 00:41:16 - 01:40:19 0:59:03 gem packaging
77
- 10:20:00 - 10:48:10 0:28:10 enhance alter
77
+ 10:20:00 - 10:48:10 0:28:10 enhance edit
78
78
  1:27:13
79
79
  ---------------------------------------------------------
80
80
  Total 3:46:05
@@ -87,13 +87,9 @@ last row, the total time tracked in the timesheet is shown.
87
87
 
88
88
  Commands
89
89
  --------
90
-
91
- **alter**
92
- Inserts a note associated with the an entry in the timesheet, or alters the
93
- start or end times. Defaults to the current time although an ``--id`` flag can
94
- be passed with the entry's id (see display.)
95
-
96
- usage: ``t alter [--id ID] [--start TIME] [--end TIME] [NOTES]``
90
+ **archives**
91
+ Archives the selected entries (by moving them to a sheet called _<SHEET>)
92
+ usage: ``t archive [--start DATE] [--end DATE] [SHEET]``
97
93
 
98
94
  **backend**
99
95
  Run an interactive database session on the timetrap database. Requires the
@@ -105,7 +101,7 @@ Commands
105
101
  Display a given timesheet. If no timesheet is specified, show the current
106
102
  timesheet. If ``all`` is passed as SHEET display all timesheets. Accepts
107
103
  an optional ``--ids`` flag which will include the entries' ids in the output.
108
- This is useful when editing an non running entry with ``alter``.
104
+ This is useful when editing an non running entry with ``edit``.
109
105
 
110
106
  Display is designed to support a variety of export formats that can be
111
107
  specified by passing the ``--format`` flag. This currently defaults to
@@ -113,13 +109,20 @@ Commands
113
109
 
114
110
  usage: ``t display [--ids] [--start DATE] [--end DATE] [--format FMT] [SHEET | all]``
115
111
 
112
+ **edit**
113
+ Inserts a note associated with the an entry in the timesheet, or edits the
114
+ start or end times. Defaults to the current time although an ``--id`` flag can
115
+ be passed with the entry's id (see display.)
116
+
117
+ usage: ``t edit [--id ID] [--start TIME] [--end TIME] [NOTES]``
118
+
116
119
  **format**
117
120
  Alias for display
118
121
 
119
122
  **in**
120
123
  Start the timer for the current timesheet. Must be called before out. Notes
121
124
  may be specified for this period. This is exactly equivalent to
122
- ``t in; t alter NOTES``. Accepts an optional --at flag.
125
+ ``t in; t edit NOTES``. Accepts an optional --at flag.
123
126
 
124
127
  usage: ``t in [--at TIME] [NOTES]``
125
128
 
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 1
3
- :major: 1
4
2
  :minor: 0
3
+ :patch: 3
4
+ :major: 1
data/lib/timetrap/cli.rb CHANGED
@@ -11,21 +11,26 @@ Timetrap - Simple Time Tracking
11
11
  Usage: #{File.basename $0} COMMAND [OPTIONS] [ARGS...]
12
12
 
13
13
  where COMMAND is one of:
14
- * alter - alter an entry's note, start, or end time. Defaults to the active entry
15
- usage: t alter [--id ID] [--start TIME] [--end TIME] [NOTES]
16
- -i, --id <id:i> Alter entry with id <id> instead of the running entry
17
- -s, --start <time:qs> Change the start time to <time>
18
- -e, --end <time:qs> Change the end time to <time>
14
+ * archive - move entries to a hidden sheet (by default named '_<SHEET>') so
15
+ they're out of the way.
16
+ usage: t archive [--start DATE] [--end DATE] [SHEET]
17
+ -s, --start <date:qs> Include entries that start on this date or later
18
+ -e, --end <date:qs> Include entries that start on this date or earlier
19
19
  * backend - open an sqlite shell to the database
20
20
  usage: t backend
21
21
  * display - display the current timesheet or a specific. Pass `all' as
22
22
  SHEET to display all sheets.
23
23
  usage: t display [--ids] [--start DATE] [--end DATE] [--format FMT] [SHEET | all]
24
- -v, --ids Print database ids (for use with alter)
24
+ -v, --ids Print database ids (for use with edit)
25
25
  -s, --start <date:qs> Include entries that start on this date or later
26
26
  -e, --end <date:qs> Include entries that start on this date or earlier
27
27
  -f, --format <format> The output format. Currently supports ical and
28
28
  text (default).
29
+ * edit - alter an entry's note, start, or end time. Defaults to the active entry
30
+ usage: t edit [--id ID] [--start TIME] [--end TIME] [NOTES]
31
+ -i, --id <id:i> Alter entry with id <id> instead of the running entry
32
+ -s, --start <time:qs> Change the start time to <time>
33
+ -e, --end <time:qs> Change the end time to <time>
29
34
  * format - alias for display
30
35
  * in - start the timer for the current timesheet
31
36
  usage: t in [--at TIME] [NOTES]
@@ -75,7 +80,20 @@ where COMMAND is one of:
75
80
  else; say "Ambigous command: #{command}"; end
76
81
  end
77
82
 
78
- def alter
83
+ def archive
84
+ ee = selected_entries
85
+ out = "Archive #{ee.count} entries? "
86
+ print out
87
+ if $stdin.gets =~ /\Aye?s?\Z/i
88
+ ee.all.each do |e|
89
+ e.update :sheet => "_#{e.sheet}"
90
+ end
91
+ else
92
+ say "archive aborted!"
93
+ end
94
+ end
95
+
96
+ def edit
79
97
  entry = args['-i'] ? Entry[args['-i']] : Timetrap.active_entry
80
98
  say "can't find entry" && return unless entry
81
99
  entry.update :start => args['-s'] if args['-s'] =~ /.+/
@@ -132,16 +150,7 @@ where COMMAND is one of:
132
150
  say "Invalid format specified `#{args['-f']}'"
133
151
  return
134
152
  end
135
- ee = if (sheet = sheet_name_from_string(unused_args)) == 'all'
136
- Timetrap::Entry
137
- elsif sheet =~ /.+/
138
- Timetrap::Entry.filter(:sheet => sheet)
139
- else
140
- Timetrap::Entry.filter(:sheet => Timetrap.current_sheet)
141
- end
142
- ee = ee.filter(:start >= Date.parse(args['-s'])) if args['-s']
143
- ee = ee.filter(:start <= Date.parse(args['-e']) + 1) if args['-e']
144
- say Timetrap.format(fmt_klass, ee.order(:start).all)
153
+ say Timetrap.format(fmt_klass, selected_entries.order(:start).all)
145
154
  end
146
155
 
147
156
  # TODO: Consolidate display and format
@@ -152,16 +161,7 @@ where COMMAND is one of:
152
161
  say "Invalid format specified `#{args['-f']}'"
153
162
  return
154
163
  end
155
- ee = if (sheet = sheet_name_from_string(unused_args)) == 'all'
156
- Timetrap::Entry
157
- elsif sheet =~ /.+/
158
- Timetrap::Entry.filter(:sheet => sheet)
159
- else
160
- Timetrap::Entry.filter(:sheet => Timetrap.current_sheet)
161
- end
162
- ee = ee.filter(:start >= Date.parse(args['-s'])) if args['-s']
163
- ee = ee.filter(:start <= Date.parse(args['-e']) + 1) if args['-e']
164
- say Timetrap.format(fmt_klass, ee.all)
164
+ say Timetrap.format(fmt_klass, selected_entries.order(:start).all)
165
165
  end
166
166
 
167
167
  def switch
@@ -14,6 +14,7 @@ module Timetrap
14
14
 
15
15
  def initialize entries
16
16
  entries.each do |e|
17
+ next unless e.end
17
18
  calendar.event do
18
19
  dtstart DateTime.parse(e.start.to_s)
19
20
  dtend DateTime.parse(e.end.to_s)
@@ -1,5 +1,19 @@
1
1
  module Timetrap
2
2
  module Helpers
3
+
4
+ def selected_entries
5
+ ee = if (sheet = sheet_name_from_string(unused_args)) == 'all'
6
+ Timetrap::Entry.filter('sheet not like ? escape "!"', '!_%')
7
+ elsif sheet =~ /.+/
8
+ Timetrap::Entry.filter('sheet = ?', sheet)
9
+ else
10
+ Timetrap::Entry.filter('sheet = ?', Timetrap.current_sheet)
11
+ end
12
+ ee = ee.filter(:start >= Date.parse(args['-s'])) if args['-s']
13
+ ee = ee.filter(:start <= Date.parse(args['-e']) + 1) if args['-e']
14
+ ee
15
+ end
16
+
3
17
  def format_time time
4
18
  return '' unless time.respond_to?(:strftime)
5
19
  time.strftime('%H:%M:%S')
@@ -25,35 +25,51 @@ describe Timetrap do
25
25
  Timetrap::CLI.invoke
26
26
  end
27
27
 
28
- describe 'alter' do
28
+ describe 'archive' do
29
+ before do
30
+ 3.times do |i|
31
+ create_entry
32
+ end
33
+ end
34
+
35
+ it "should put the entries in a hidden sheet" do
36
+ $stdin.string = "yes\n"
37
+ invoke 'archive'
38
+ Timetrap::Entry.each do |e|
39
+ e.sheet.should == '_default'
40
+ end
41
+ end
42
+ end
43
+
44
+ describe 'edit' do
29
45
  before do
30
46
  Timetrap.start "running entry", nil
31
47
  end
32
48
 
33
- it "should alter the description of the active period" do
49
+ it "should edit the description of the active period" do
34
50
  Timetrap.active_entry.note.should == 'running entry'
35
- invoke 'alter new description'
51
+ invoke 'edit new description'
36
52
  Timetrap.active_entry.note.should == 'new description'
37
53
  end
38
54
 
39
- it "should alter the start time of the active period" do
40
- invoke 'alter --start "yesterday 10am"'
55
+ it "should edit the start time of the active period" do
56
+ invoke 'edit --start "yesterday 10am"'
41
57
  Timetrap.active_entry.start.should == Chronic.parse("yesterday 10am")
42
58
  Timetrap.active_entry.note.should == 'running entry'
43
59
  end
44
60
 
45
- it "should alter the end time of the active period" do
61
+ it "should edit the end time of the active period" do
46
62
  entry = Timetrap.active_entry
47
- invoke 'alter --end "yesterday 10am"'
63
+ invoke 'edit --end "yesterday 10am"'
48
64
  entry.refresh.end.should == Chronic.parse("yesterday 10am")
49
65
  entry.refresh.note.should == 'running entry'
50
66
  end
51
67
 
52
- it "should alter a non running entry based on id" do
68
+ it "should edit a non running entry based on id" do
53
69
  not_running = Timetrap.active_entry
54
70
  Timetrap.stop
55
71
  Timetrap.start "another entry", nil
56
- invoke "alter --id #{not_running.id} a new description"
72
+ invoke "edit --id #{not_running.id} a new description"
57
73
  not_running.refresh.note.should == 'a new description'
58
74
  end
59
75
  end
@@ -161,6 +177,14 @@ Grand Total 10:00:00
161
177
  invoke 'display all'
162
178
  $stdout.string.should == @desired_output_for_all
163
179
  end
180
+
181
+ it "should not display archived for all timesheets" do
182
+ $stdin.string = "yes\n"
183
+ invoke 'archive SpecSheet'
184
+ $stdout.string = ''
185
+ invoke 'display all'
186
+ $stdout.string.should_not =~ /_SpecSheet/
187
+ end
164
188
  end
165
189
 
166
190
  describe "format" do
@@ -170,6 +194,12 @@ Grand Total 10:00:00
170
194
  create_entry(:start => '2008-10-05 12:00:00', :end => '2008-10-05 14:00:00')
171
195
  end
172
196
 
197
+ it "should not export running items" do
198
+ invoke 'in'
199
+ invoke 'format --format ical'
200
+ $stdout.string.scan(/BEGIN:VEVENT/).should have(2).item
201
+ end
202
+
173
203
  it "should filter events by the passed dates" do
174
204
  invoke 'format --format ical --start 2008-10-03 --end 2008-10-03'
175
205
  $stdout.string.scan(/BEGIN:VEVENT/).should have(1).item
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: 1.0.1
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Goldstein
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-30 00:00:00 -07:00
12
+ date: 2009-07-10 00:00:00 -07:00
13
13
  default_executable: t
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency