timr 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ackrc +9 -0
- data/.editorconfig +1 -0
- data/.env.example +7 -0
- data/.github/CONTRIBUTING.md +32 -0
- data/.github/ISSUE_TEMPLATE.md +13 -0
- data/.gitignore +8 -2
- data/.rdoc_options +21 -0
- data/.travis.yml +10 -7
- data/Gemfile +8 -0
- data/README.md +216 -3
- data/bin/.gitignore +2 -0
- data/bin/README.md +17 -0
- data/bin/build.sh +14 -0
- data/bin/build_api.sh +14 -0
- data/bin/build_coverage.sh +23 -0
- data/bin/build_info.sh +27 -0
- data/bin/build_man.sh +41 -0
- data/bin/clean.sh +14 -0
- data/bin/dev_setup.sh +19 -0
- data/bin/install.sh +49 -0
- data/bin/publish +38 -0
- data/bin/release.sh +35 -0
- data/bin/test.sh +19 -0
- data/bin/timr +20 -40
- data/bin/timr_bash_completion.sh +337 -0
- data/bin/uninstall.sh +24 -0
- data/lib/timr.rb +36 -8
- data/lib/timr/command/basic_command.rb +170 -0
- data/lib/timr/command/continue_command.rb +86 -0
- data/lib/timr/command/help_command.rb +137 -0
- data/lib/timr/command/log_command.rb +297 -0
- data/lib/timr/command/pause_command.rb +89 -0
- data/lib/timr/command/pop_command.rb +176 -0
- data/lib/timr/command/push_command.rb +141 -0
- data/lib/timr/command/report_command.rb +689 -0
- data/lib/timr/command/start_command.rb +172 -0
- data/lib/timr/command/status_command.rb +198 -0
- data/lib/timr/command/stop_command.rb +127 -0
- data/lib/timr/command/task_command.rb +318 -0
- data/lib/timr/command/track_command.rb +381 -0
- data/lib/timr/command/version_command.rb +18 -0
- data/lib/timr/duration.rb +159 -0
- data/lib/timr/exception/timr_error.rb +113 -0
- data/lib/timr/ext/time.rb +12 -0
- data/lib/timr/helper/datetime_helper.rb +128 -0
- data/lib/timr/helper/terminal_helper.rb +58 -0
- data/lib/timr/helper/translation_helper.rb +45 -0
- data/lib/timr/model/basic_model.rb +287 -0
- data/lib/timr/model/config.rb +48 -0
- data/lib/timr/model/foreign_id_db.rb +84 -0
- data/lib/timr/model/stack.rb +161 -0
- data/lib/timr/model/task.rb +1039 -0
- data/lib/timr/model/track.rb +589 -0
- data/lib/timr/progressbar.rb +41 -0
- data/lib/timr/simple_opt_parser.rb +230 -0
- data/lib/timr/status.rb +70 -0
- data/lib/timr/table.rb +88 -0
- data/lib/timr/timr.rb +500 -558
- data/lib/timr/version.rb +4 -15
- data/man/.gitignore +2 -0
- data/man/_footer +3 -0
- data/man/timr-continue.1 +48 -0
- data/man/timr-continue.1.ronn +39 -0
- data/man/timr-ftime.7 +77 -0
- data/man/timr-ftime.7.ronn +57 -0
- data/man/timr-log.1 +109 -0
- data/man/timr-log.1.ronn +87 -0
- data/man/timr-pause.1 +56 -0
- data/man/timr-pause.1.ronn +45 -0
- data/man/timr-pop.1 +66 -0
- data/man/timr-pop.1.ronn +53 -0
- data/man/timr-push.1 +25 -0
- data/man/timr-push.1.ronn +20 -0
- data/man/timr-report.1 +228 -0
- data/man/timr-report.1.ronn +193 -0
- data/man/timr-start.1 +100 -0
- data/man/timr-start.1.ronn +82 -0
- data/man/timr-status.1 +53 -0
- data/man/timr-status.1.ronn +42 -0
- data/man/timr-stop.1 +75 -0
- data/man/timr-stop.1.ronn +60 -0
- data/man/timr-task.1 +147 -0
- data/man/timr-task.1.ronn +115 -0
- data/man/timr-track.1 +109 -0
- data/man/timr-track.1.ronn +89 -0
- data/man/timr.1 +119 -0
- data/man/timr.1.ronn +68 -0
- data/timr.gemspec +18 -3
- data/timr.sublime-project +20 -1
- metadata +142 -23
- data/Makefile +0 -12
- data/Makefile.common +0 -56
- data/lib/timr/stack.rb +0 -81
- data/lib/timr/task.rb +0 -258
- data/lib/timr/track.rb +0 -167
- data/lib/timr/window.rb +0 -259
- data/lib/timr/window_help.rb +0 -41
- data/lib/timr/window_tasks.rb +0 -30
- data/lib/timr/window_test.rb +0 -20
- data/lib/timr/window_timeline.rb +0 -33
- data/tests/tc_stack.rb +0 -121
- data/tests/tc_task.rb +0 -190
- data/tests/tc_track.rb +0 -144
- data/tests/tc_window.rb +0 -428
- data/tests/ts_all.rb +0 -6
@@ -0,0 +1,297 @@
|
|
1
|
+
|
2
|
+
require 'date'
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
module TheFox
|
6
|
+
module Timr
|
7
|
+
module Command
|
8
|
+
|
9
|
+
# By default this Command prints all todays [Tracks](rdoc-ref:TheFox::Timr::Model::Track).
|
10
|
+
#
|
11
|
+
# Man page: [timr-log(1)](../../../../man/timr-log.1.html)
|
12
|
+
class LogCommand < BasicCommand
|
13
|
+
|
14
|
+
include TheFox::Timr::Helper
|
15
|
+
include TheFox::Timr::Error
|
16
|
+
|
17
|
+
# Path to man page.
|
18
|
+
MAN_PATH = 'man/timr-log.1'
|
19
|
+
|
20
|
+
def initialize(argv = Array.new)
|
21
|
+
super()
|
22
|
+
|
23
|
+
@help_opt = false
|
24
|
+
|
25
|
+
@from_opt = nil
|
26
|
+
@to_opt = nil
|
27
|
+
|
28
|
+
@start_date = nil
|
29
|
+
@end_date = nil
|
30
|
+
|
31
|
+
@start_time = nil
|
32
|
+
@end_time = nil
|
33
|
+
|
34
|
+
loop_c = 0 # Limit the loop.
|
35
|
+
while loop_c < 1024 && argv.length > 0
|
36
|
+
loop_c += 1
|
37
|
+
arg = argv.shift
|
38
|
+
|
39
|
+
case arg
|
40
|
+
when '-h', '--help'
|
41
|
+
@help_opt = true
|
42
|
+
|
43
|
+
when '-s', '--from'
|
44
|
+
@from_opt = Time.parse(argv.shift)
|
45
|
+
when '-e', '--to'
|
46
|
+
@to_opt = Time.parse(argv.shift)
|
47
|
+
|
48
|
+
when '-d', '--day'
|
49
|
+
@from_opt, @to_opt = DateTimeHelper.parse_day_argv(argv)
|
50
|
+
when '-m', '--month'
|
51
|
+
@from_opt, @to_opt = DateTimeHelper.parse_month_argv(argv)
|
52
|
+
when '-y', '--year'
|
53
|
+
@from_opt, @to_opt = DateTimeHelper.parse_year_argv(argv)
|
54
|
+
|
55
|
+
when '-a', '--all'
|
56
|
+
@from_opt = Time.parse('1970-01-01 00:00:00')
|
57
|
+
@to_opt = Time.parse('2099-12-31 23:59:59')
|
58
|
+
|
59
|
+
when '--sd', '--start-date'
|
60
|
+
@start_date = Time.parse(argv.shift)
|
61
|
+
when '--ed', '--end-date'
|
62
|
+
@end_date = Time.parse(argv.shift)
|
63
|
+
when '--st', '--start-time'
|
64
|
+
@start_time = Time.parse(argv.shift)
|
65
|
+
when '--et', '--end-time'
|
66
|
+
@end_time = Time.parse(argv.shift)
|
67
|
+
|
68
|
+
else
|
69
|
+
raise LogCommandError, "Unknown argument '#{arg}'. See 'timr log --help'."
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
@daytime_filter = false
|
74
|
+
if @start_date && @end_date && @start_time && @end_time
|
75
|
+
@from_opt = Time.parse("#{@start_date.strftime('%F')} #{@start_time.strftime('%T')}")
|
76
|
+
@to_opt = Time.parse("#{@end_date.strftime('%F')} #{@end_time.strftime('%T')}")
|
77
|
+
|
78
|
+
@daytime_filter = true
|
79
|
+
end
|
80
|
+
|
81
|
+
today = Date.today
|
82
|
+
unless @from_opt
|
83
|
+
@from_opt = Time.new(today.year, today.month, today.day, 0, 0, 0)
|
84
|
+
end
|
85
|
+
unless @to_opt
|
86
|
+
@to_opt = Time.new(today.year, today.month, today.day, 23, 59, 59)
|
87
|
+
end
|
88
|
+
|
89
|
+
@filter_options = {:from => @from_opt, :to => @to_opt}
|
90
|
+
end
|
91
|
+
|
92
|
+
# See BasicCommand#run.
|
93
|
+
def run
|
94
|
+
if @help_opt
|
95
|
+
help
|
96
|
+
return
|
97
|
+
end
|
98
|
+
|
99
|
+
@timr = Timr.new(@cwd)
|
100
|
+
|
101
|
+
print_small_table
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def print_small_table
|
107
|
+
puts 'Selected datetime range:'
|
108
|
+
if @daytime_filter
|
109
|
+
puts "On every day from #{@start_date.strftime('%F')}"
|
110
|
+
puts " to #{@end_date.strftime('%F')}"
|
111
|
+
puts " between #{@start_time.strftime('%T %z')}"
|
112
|
+
puts " and #{@end_time.strftime('%T %z')}"
|
113
|
+
else
|
114
|
+
puts " From #{@from_opt.strftime('%F %T %z')}"
|
115
|
+
puts " To #{@to_opt.strftime('%F %T %z')}"
|
116
|
+
end
|
117
|
+
puts
|
118
|
+
|
119
|
+
table_options = {
|
120
|
+
:headings => [
|
121
|
+
{:format => '%3s', :label => '###'},
|
122
|
+
{:format => '%-14s', :label => 'START', :padding_left => ' ', :padding_right => ' '},
|
123
|
+
{:format => '%-14s', :label => 'END', :padding_left => ' ', :padding_right => ' '},
|
124
|
+
{:format => '%7s', :label => 'DUR', :padding_left => ' ', :padding_right => ' '},
|
125
|
+
{:format => '%-6s', :label => 'TASK', :padding_right => ' '},
|
126
|
+
{:format => '%s', :label => 'TRACK'},
|
127
|
+
],
|
128
|
+
}
|
129
|
+
table = Table.new(table_options)
|
130
|
+
|
131
|
+
totals = {
|
132
|
+
:duration => Duration.new,
|
133
|
+
:task_c => 0,
|
134
|
+
|
135
|
+
:begin_datetime => nil,
|
136
|
+
:end_datetime => nil,
|
137
|
+
}
|
138
|
+
|
139
|
+
tmp_begin_options = {:format => '%y-%m-%d %H:%M'}
|
140
|
+
tmp_end_options = {:format => '%H:%M %y-%m-%d'}
|
141
|
+
|
142
|
+
glob_begin_options = {
|
143
|
+
:format => tmp_begin_options[:format],
|
144
|
+
:from => @from_opt,
|
145
|
+
}
|
146
|
+
glob_end_options = {
|
147
|
+
:format => tmp_end_options[:format],
|
148
|
+
:to => @to_opt,
|
149
|
+
}
|
150
|
+
|
151
|
+
table_has_rows = false
|
152
|
+
@timr.tracks(@filter_options).each do |track_id, track|
|
153
|
+
table_has_rows = true
|
154
|
+
|
155
|
+
task = track.task
|
156
|
+
|
157
|
+
if @daytime_filter
|
158
|
+
track.days.each do |track_day|
|
159
|
+
from = Time.parse("#{track_day.strftime('%F')} #{@start_time.strftime('%T')}")
|
160
|
+
to = Time.parse("#{track_day.strftime('%F')} #{@end_time.strftime('%T')}")
|
161
|
+
|
162
|
+
# Skip out-of-scope Tracks.
|
163
|
+
if track.end_datetime < from || track.begin_datetime > to
|
164
|
+
next
|
165
|
+
end
|
166
|
+
|
167
|
+
totals[:task_c] += 1
|
168
|
+
|
169
|
+
bdt = track.begin_datetime(@filter_options)
|
170
|
+
edt = track.end_datetime(@filter_options)
|
171
|
+
if bdt && (!totals[:begin_datetime] || bdt < totals[:begin_datetime])
|
172
|
+
totals[:begin_datetime] = bdt
|
173
|
+
end
|
174
|
+
if edt && (!totals[:end_datetime] || edt > totals[:end_datetime])
|
175
|
+
totals[:end_datetime] = edt
|
176
|
+
end
|
177
|
+
|
178
|
+
tmp_begin_options[:from] = from
|
179
|
+
tmp_end_options[:to] = to
|
180
|
+
begin_datetime_s = track.begin_datetime_s(tmp_begin_options)
|
181
|
+
end_datetime_s = track.end_datetime_s(tmp_end_options)
|
182
|
+
|
183
|
+
duration = track.duration({:from => from, :to => to})
|
184
|
+
if duration
|
185
|
+
totals[:duration] += duration
|
186
|
+
end
|
187
|
+
|
188
|
+
table << [
|
189
|
+
track_c,
|
190
|
+
begin_datetime_s,
|
191
|
+
end_datetime_s,
|
192
|
+
duration ? duration.to_human : '---',
|
193
|
+
task.short_id,
|
194
|
+
'%s %s' % [track.short_id, track.title(15)],
|
195
|
+
]
|
196
|
+
end
|
197
|
+
else
|
198
|
+
totals[:task_c] += 1
|
199
|
+
|
200
|
+
bdt = track.begin_datetime(@filter_options)
|
201
|
+
edt = track.end_datetime(@filter_options)
|
202
|
+
|
203
|
+
if bdt && (!totals[:begin_datetime] || bdt < totals[:begin_datetime])
|
204
|
+
totals[:begin_datetime] = bdt
|
205
|
+
end
|
206
|
+
if edt && (!totals[:end_datetime] || edt > totals[:end_datetime])
|
207
|
+
totals[:end_datetime] = edt
|
208
|
+
end
|
209
|
+
|
210
|
+
begin_datetime_s = track.begin_datetime_s(glob_begin_options)
|
211
|
+
end_datetime_s = track.end_datetime_s(glob_end_options)
|
212
|
+
|
213
|
+
duration = track.duration(@filter_options)
|
214
|
+
if duration
|
215
|
+
totals[:duration] += duration
|
216
|
+
end
|
217
|
+
|
218
|
+
table << [
|
219
|
+
totals[:task_c],
|
220
|
+
begin_datetime_s,
|
221
|
+
end_datetime_s,
|
222
|
+
duration ? duration.to_human : '---',
|
223
|
+
task.short_id,
|
224
|
+
'%s %s' % [track.short_id, track.title(15)],
|
225
|
+
]
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
table << []
|
230
|
+
|
231
|
+
totals[:begin_datetime_s] = totals[:begin_datetime] ? totals[:begin_datetime].localtime.strftime(glob_begin_options[:format]) : '---'
|
232
|
+
|
233
|
+
totals[:end_datetime_s] = totals[:end_datetime] ? totals[:end_datetime].localtime.strftime(glob_end_options[:format]) : '---'
|
234
|
+
|
235
|
+
# Add totals to the bottom.
|
236
|
+
table << [
|
237
|
+
nil, # track_c
|
238
|
+
totals[:begin_datetime_s],
|
239
|
+
totals[:end_datetime_s],
|
240
|
+
totals[:duration] ? totals[:duration].to_human : '---', # duration
|
241
|
+
'TOTAL', # task
|
242
|
+
nil, # track
|
243
|
+
]
|
244
|
+
|
245
|
+
if table_has_rows
|
246
|
+
puts table
|
247
|
+
else
|
248
|
+
puts 'No tracks found.'
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
def help
|
253
|
+
puts 'usage: timr log [-s|--from <date_time>] [-e|--to <date_time>]'
|
254
|
+
puts ' or: timr log --sd <date> --ed <date> --st <time> --et <time>'
|
255
|
+
puts ' or: timr log -d|--day <date>'
|
256
|
+
puts ' or: timr log -m|--month <YYYY-MM>'
|
257
|
+
puts ' or: timr log -y|--year <YYYY>'
|
258
|
+
puts ' or: timr log -a|--all'
|
259
|
+
puts ' or: timr log [-h|--help]'
|
260
|
+
puts
|
261
|
+
puts 'Total Filter'
|
262
|
+
puts " -s, --from '<date_time>' From Date/Time. Must be in quotes."
|
263
|
+
puts ' Default: today 00:00:00'
|
264
|
+
puts " -e, --to '<date_time>' To Date/Time. Must be in quotes."
|
265
|
+
puts ' Default: today 23:59:59'
|
266
|
+
puts ' -d, --day <date> A single day from 00:00 to 23:59.'
|
267
|
+
puts ' -m, --month <[YYYY-]MM> A single month from 01 to 31.'
|
268
|
+
puts ' -y, --year [<YYYY>] A single year from 01-01 to 12-31.'
|
269
|
+
puts ' -a, --all Show all Tracks.'
|
270
|
+
puts
|
271
|
+
puts 'Day Time Filter'
|
272
|
+
puts ' --sd, --start-date <date> Start Date'
|
273
|
+
puts ' --ed, --end-date <date> End Date'
|
274
|
+
puts ' --st, --start-time <time> Start Time'
|
275
|
+
puts ' --et, --end-time <time> End Time'
|
276
|
+
puts
|
277
|
+
puts 'If you would like to filter everything between 09:00 and 17:00 on every day'
|
278
|
+
puts 'in the range from Mon 2017-03-06 to Fri 2017-03-10:'
|
279
|
+
puts
|
280
|
+
puts ' timr log --sd 2017-03-06 --ed 2017-03-10 --st 09:00 --et 17:00'
|
281
|
+
puts
|
282
|
+
puts 'Columns'
|
283
|
+
puts ' START Track Start Date'
|
284
|
+
puts ' END Track End Date'
|
285
|
+
puts ' DUR Track Duration'
|
286
|
+
puts ' TASK Task ID'
|
287
|
+
puts ' TRACK Track ID and Title.'
|
288
|
+
puts
|
289
|
+
HelpCommand.print_datetime_help
|
290
|
+
puts
|
291
|
+
end
|
292
|
+
|
293
|
+
end # class LogCommand
|
294
|
+
|
295
|
+
end # module Command
|
296
|
+
end # module Timr
|
297
|
+
end # module TheFox
|
@@ -0,0 +1,89 @@
|
|
1
|
+
|
2
|
+
module TheFox
|
3
|
+
module Timr
|
4
|
+
module Command
|
5
|
+
|
6
|
+
# Pause the current running [Track](rdoc-ref:TheFox::Timr::Model::Track).
|
7
|
+
#
|
8
|
+
# Man page: [timr-pause(1)](../../../../man/timr-pause.1.html)
|
9
|
+
class PauseCommand < BasicCommand
|
10
|
+
|
11
|
+
include TheFox::Timr::Helper
|
12
|
+
include TheFox::Timr::Error
|
13
|
+
|
14
|
+
# Path to man page.
|
15
|
+
MAN_PATH = 'man/timr-pause.1'
|
16
|
+
|
17
|
+
def initialize(argv = Array.new)
|
18
|
+
super()
|
19
|
+
|
20
|
+
@help_opt = false
|
21
|
+
|
22
|
+
@end_date_opt = nil
|
23
|
+
@end_time_opt = nil
|
24
|
+
|
25
|
+
loop_c = 0 # Limit the loop.
|
26
|
+
while loop_c < 1024 && argv.length > 0
|
27
|
+
loop_c += 1
|
28
|
+
arg = argv.shift
|
29
|
+
|
30
|
+
case arg
|
31
|
+
when '-h', '--help'
|
32
|
+
@help_opt = true
|
33
|
+
when '--ed', '--end-date', '-d', '--date'
|
34
|
+
@end_date_opt = argv.shift
|
35
|
+
when '--et', '--end-time', '-t', '--time'
|
36
|
+
@end_time_opt = argv.shift
|
37
|
+
else
|
38
|
+
raise PauseCommandError, "Unknown argument '#{arg}'. See 'timr pause --help'."
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# See BasicCommand.
|
44
|
+
def run
|
45
|
+
if @help_opt
|
46
|
+
help
|
47
|
+
return
|
48
|
+
end
|
49
|
+
|
50
|
+
@timr = Timr.new(@cwd)
|
51
|
+
|
52
|
+
options = {
|
53
|
+
:end_date => @end_date_opt,
|
54
|
+
:end_time => @end_time_opt,
|
55
|
+
}
|
56
|
+
|
57
|
+
track = @timr.pause(options)
|
58
|
+
unless track
|
59
|
+
puts 'No running Track to pause.'
|
60
|
+
return
|
61
|
+
end
|
62
|
+
|
63
|
+
puts '--- PAUSED ---'
|
64
|
+
puts track.to_compact_str
|
65
|
+
puts @timr.stack
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def help
|
71
|
+
puts 'usage: timr pause [-d|--date <date>] [-t|--time <time>]'
|
72
|
+
puts ' or: timr pause [-h|--help]'
|
73
|
+
puts
|
74
|
+
puts 'Track Options'
|
75
|
+
puts ' --ed, --end-date <date> Track End Date'
|
76
|
+
puts ' --et, --end-time <time> Track End Time'
|
77
|
+
puts
|
78
|
+
puts ' -d, --date <date> --end-date alias.'
|
79
|
+
puts ' -t, --time <time> --end-time alias.'
|
80
|
+
puts
|
81
|
+
HelpCommand.print_datetime_help
|
82
|
+
puts
|
83
|
+
end
|
84
|
+
|
85
|
+
end # class PauseCommand
|
86
|
+
|
87
|
+
end # module Command
|
88
|
+
end # module Timr
|
89
|
+
end # module TheFox
|
@@ -0,0 +1,176 @@
|
|
1
|
+
|
2
|
+
module TheFox
|
3
|
+
module Timr
|
4
|
+
module Command
|
5
|
+
|
6
|
+
# This command pops the Top [Track](rdoc-ref:TheFox::Timr::Model::Track), makes a duplication
|
7
|
+
# of the next Track on the [Stack](rdoc-ref:TheFox::Timr::Model::Stack), pops the next,
|
8
|
+
# and pushes the duplication Track back on the Stack. There are at least 3 Tracks involved.
|
9
|
+
#
|
10
|
+
# Man page: [timr-pop(1)](../../../../man/timr-pop.1.html)
|
11
|
+
#
|
12
|
+
# ### Example
|
13
|
+
#
|
14
|
+
# Example Stack before pop:
|
15
|
+
#
|
16
|
+
# ```
|
17
|
+
# Track 1234 stopped
|
18
|
+
# Track 2345 stopped
|
19
|
+
# Track 3456 running
|
20
|
+
# ```
|
21
|
+
#
|
22
|
+
# Pop Execution
|
23
|
+
#
|
24
|
+
# 1. Make duplication of Track `3456` -> new Track `4567`.
|
25
|
+
# Because Track `3456` is the latest Track on the Stack. Sometimes call *Top Track*.
|
26
|
+
# 2. Pop Track `3456` from Stack.
|
27
|
+
# 3. Push new Track `4567` to Stack.
|
28
|
+
#
|
29
|
+
# Example Stack after pop:
|
30
|
+
#
|
31
|
+
# ```
|
32
|
+
# Track 1234 stopped
|
33
|
+
# Track 2345 stopped
|
34
|
+
# Track 4567 running
|
35
|
+
# ```
|
36
|
+
class PopCommand < BasicCommand
|
37
|
+
|
38
|
+
include TheFox::Timr::Helper
|
39
|
+
include TheFox::Timr::Error
|
40
|
+
|
41
|
+
# Path to man page.
|
42
|
+
MAN_PATH = 'man/timr-pop.1'
|
43
|
+
|
44
|
+
def initialize(argv = Array.new)
|
45
|
+
super()
|
46
|
+
|
47
|
+
@help_opt = false
|
48
|
+
|
49
|
+
@start_date_opt = nil
|
50
|
+
@start_time_opt = nil
|
51
|
+
@end_date_opt = nil
|
52
|
+
@end_time_opt = nil
|
53
|
+
|
54
|
+
@date_opt = nil
|
55
|
+
@time_opt = nil
|
56
|
+
|
57
|
+
loop_c = 0 # Limit the loop.
|
58
|
+
while loop_c < 1024 && argv.length > 0
|
59
|
+
loop_c += 1
|
60
|
+
arg = argv.shift
|
61
|
+
|
62
|
+
case arg
|
63
|
+
when '-h', '--help'
|
64
|
+
@help_opt = true
|
65
|
+
|
66
|
+
when '--sd', '--start-date'
|
67
|
+
@start_date_opt = argv.shift
|
68
|
+
when '--st', '--start-time'
|
69
|
+
@start_time_opt = argv.shift
|
70
|
+
when '--ed', '--end-date'
|
71
|
+
@end_date_opt = argv.shift
|
72
|
+
when '--et', '--end-time'
|
73
|
+
@end_time_opt = argv.shift
|
74
|
+
|
75
|
+
when '-d', '--date'
|
76
|
+
@date_opt = argv.shift
|
77
|
+
when '-t', '--time'
|
78
|
+
@time_opt = argv.shift
|
79
|
+
|
80
|
+
else
|
81
|
+
raise PopCommandError, "Unknown argument '#{arg}'. See 'timr pop --help'."
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
if @date_opt
|
86
|
+
@start_date_opt = @date_opt
|
87
|
+
@end_date_opt = @date_opt
|
88
|
+
end
|
89
|
+
if @time_opt
|
90
|
+
@start_time_opt = @time_opt
|
91
|
+
@end_time_opt = @time_opt
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# See BasicCommand#run.
|
96
|
+
def run
|
97
|
+
if @help_opt
|
98
|
+
help
|
99
|
+
return
|
100
|
+
end
|
101
|
+
|
102
|
+
@timr = Timr.new(@cwd)
|
103
|
+
|
104
|
+
# Stop
|
105
|
+
options = {
|
106
|
+
:date => @end_date_opt,
|
107
|
+
:time => @end_time_opt,
|
108
|
+
}
|
109
|
+
|
110
|
+
track = @timr.stop(options)
|
111
|
+
unless track
|
112
|
+
puts 'No running Track to pop/stop.'
|
113
|
+
return
|
114
|
+
end
|
115
|
+
|
116
|
+
task = track.task
|
117
|
+
unless task
|
118
|
+
raise TrackError, "Track #{track.id} has no Task."
|
119
|
+
end
|
120
|
+
|
121
|
+
puts '--- POPED ---'
|
122
|
+
puts track.to_compact_str
|
123
|
+
puts
|
124
|
+
|
125
|
+
# Continue
|
126
|
+
options = {
|
127
|
+
:date => @start_date_opt,
|
128
|
+
:time => @start_time_opt,
|
129
|
+
}
|
130
|
+
|
131
|
+
track = @timr.continue(options)
|
132
|
+
unless track
|
133
|
+
puts 'No running Track left on Stack to continue.'
|
134
|
+
return
|
135
|
+
end
|
136
|
+
|
137
|
+
task = track.task
|
138
|
+
unless task
|
139
|
+
raise TrackError, "Track #{track.id} has no Task."
|
140
|
+
end
|
141
|
+
|
142
|
+
puts '--- CONTINUED ---'
|
143
|
+
puts track.to_compact_str
|
144
|
+
puts
|
145
|
+
puts @timr.stack
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
|
150
|
+
def help
|
151
|
+
puts 'usage: timr pop [--sd|--start-date <date>] [--st|--start-time <time>]'
|
152
|
+
puts ' [--ed|--end-date <date>] [--et|--end-time <time>]'
|
153
|
+
puts ' or: timr pop [-d|--date <date>] [-t|--time <time>]'
|
154
|
+
puts ' or: timr pop [-h|--help]'
|
155
|
+
puts
|
156
|
+
puts 'Track Options'
|
157
|
+
puts ' --sd, --start-date <date> Start Date for the next underlying Track.'
|
158
|
+
puts ' --st, --start-time <time> Start Time for the next underlying Track.'
|
159
|
+
puts
|
160
|
+
puts ' --ed, --end-date <date> End Date for the current running Track.'
|
161
|
+
puts ' --et, --end-time <time> End Time for the current running Track.'
|
162
|
+
puts
|
163
|
+
puts " -d, --date <date> Alias for"
|
164
|
+
puts " '--end-date <date> --start-date <date>'."
|
165
|
+
puts " -t, --time <time> Alias for"
|
166
|
+
puts " '--end-time <time> --start-time <time>'."
|
167
|
+
puts
|
168
|
+
HelpCommand.print_datetime_help
|
169
|
+
puts
|
170
|
+
end
|
171
|
+
|
172
|
+
end # class PopCommand
|
173
|
+
|
174
|
+
end # module Command
|
175
|
+
end # module Timr
|
176
|
+
end # module TheFox
|