timr 0.3.0 → 0.4.0

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.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/.ackrc +9 -0
  3. data/.editorconfig +1 -0
  4. data/.env.example +7 -0
  5. data/.github/CONTRIBUTING.md +32 -0
  6. data/.github/ISSUE_TEMPLATE.md +13 -0
  7. data/.gitignore +8 -2
  8. data/.rdoc_options +21 -0
  9. data/.travis.yml +10 -7
  10. data/Gemfile +8 -0
  11. data/README.md +216 -3
  12. data/bin/.gitignore +2 -0
  13. data/bin/README.md +17 -0
  14. data/bin/build.sh +14 -0
  15. data/bin/build_api.sh +14 -0
  16. data/bin/build_coverage.sh +23 -0
  17. data/bin/build_info.sh +27 -0
  18. data/bin/build_man.sh +41 -0
  19. data/bin/clean.sh +14 -0
  20. data/bin/dev_setup.sh +19 -0
  21. data/bin/install.sh +49 -0
  22. data/bin/publish +38 -0
  23. data/bin/release.sh +35 -0
  24. data/bin/test.sh +19 -0
  25. data/bin/timr +20 -40
  26. data/bin/timr_bash_completion.sh +337 -0
  27. data/bin/uninstall.sh +24 -0
  28. data/lib/timr.rb +36 -8
  29. data/lib/timr/command/basic_command.rb +170 -0
  30. data/lib/timr/command/continue_command.rb +86 -0
  31. data/lib/timr/command/help_command.rb +137 -0
  32. data/lib/timr/command/log_command.rb +297 -0
  33. data/lib/timr/command/pause_command.rb +89 -0
  34. data/lib/timr/command/pop_command.rb +176 -0
  35. data/lib/timr/command/push_command.rb +141 -0
  36. data/lib/timr/command/report_command.rb +689 -0
  37. data/lib/timr/command/start_command.rb +172 -0
  38. data/lib/timr/command/status_command.rb +198 -0
  39. data/lib/timr/command/stop_command.rb +127 -0
  40. data/lib/timr/command/task_command.rb +318 -0
  41. data/lib/timr/command/track_command.rb +381 -0
  42. data/lib/timr/command/version_command.rb +18 -0
  43. data/lib/timr/duration.rb +159 -0
  44. data/lib/timr/exception/timr_error.rb +113 -0
  45. data/lib/timr/ext/time.rb +12 -0
  46. data/lib/timr/helper/datetime_helper.rb +128 -0
  47. data/lib/timr/helper/terminal_helper.rb +58 -0
  48. data/lib/timr/helper/translation_helper.rb +45 -0
  49. data/lib/timr/model/basic_model.rb +287 -0
  50. data/lib/timr/model/config.rb +48 -0
  51. data/lib/timr/model/foreign_id_db.rb +84 -0
  52. data/lib/timr/model/stack.rb +161 -0
  53. data/lib/timr/model/task.rb +1039 -0
  54. data/lib/timr/model/track.rb +589 -0
  55. data/lib/timr/progressbar.rb +41 -0
  56. data/lib/timr/simple_opt_parser.rb +230 -0
  57. data/lib/timr/status.rb +70 -0
  58. data/lib/timr/table.rb +88 -0
  59. data/lib/timr/timr.rb +500 -558
  60. data/lib/timr/version.rb +4 -15
  61. data/man/.gitignore +2 -0
  62. data/man/_footer +3 -0
  63. data/man/timr-continue.1 +48 -0
  64. data/man/timr-continue.1.ronn +39 -0
  65. data/man/timr-ftime.7 +77 -0
  66. data/man/timr-ftime.7.ronn +57 -0
  67. data/man/timr-log.1 +109 -0
  68. data/man/timr-log.1.ronn +87 -0
  69. data/man/timr-pause.1 +56 -0
  70. data/man/timr-pause.1.ronn +45 -0
  71. data/man/timr-pop.1 +66 -0
  72. data/man/timr-pop.1.ronn +53 -0
  73. data/man/timr-push.1 +25 -0
  74. data/man/timr-push.1.ronn +20 -0
  75. data/man/timr-report.1 +228 -0
  76. data/man/timr-report.1.ronn +193 -0
  77. data/man/timr-start.1 +100 -0
  78. data/man/timr-start.1.ronn +82 -0
  79. data/man/timr-status.1 +53 -0
  80. data/man/timr-status.1.ronn +42 -0
  81. data/man/timr-stop.1 +75 -0
  82. data/man/timr-stop.1.ronn +60 -0
  83. data/man/timr-task.1 +147 -0
  84. data/man/timr-task.1.ronn +115 -0
  85. data/man/timr-track.1 +109 -0
  86. data/man/timr-track.1.ronn +89 -0
  87. data/man/timr.1 +119 -0
  88. data/man/timr.1.ronn +68 -0
  89. data/timr.gemspec +18 -3
  90. data/timr.sublime-project +20 -1
  91. metadata +142 -23
  92. data/Makefile +0 -12
  93. data/Makefile.common +0 -56
  94. data/lib/timr/stack.rb +0 -81
  95. data/lib/timr/task.rb +0 -258
  96. data/lib/timr/track.rb +0 -167
  97. data/lib/timr/window.rb +0 -259
  98. data/lib/timr/window_help.rb +0 -41
  99. data/lib/timr/window_tasks.rb +0 -30
  100. data/lib/timr/window_test.rb +0 -20
  101. data/lib/timr/window_timeline.rb +0 -33
  102. data/tests/tc_stack.rb +0 -121
  103. data/tests/tc_task.rb +0 -190
  104. data/tests/tc_track.rb +0 -144
  105. data/tests/tc_window.rb +0 -428
  106. 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