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,172 @@
1
+
2
+ require 'tempfile'
3
+
4
+ module TheFox
5
+ module Timr
6
+ module Command
7
+
8
+ # Start a new [Track](rdoc-ref:TheFox::Timr::Model::Track).
9
+ #
10
+ # Man page: [timr-start(1)](../../../../man/timr-start.1.html)
11
+ class StartCommand < BasicCommand
12
+
13
+ include TheFox::Timr::Model
14
+ include TheFox::Timr::Helper
15
+ include TheFox::Timr::Error
16
+
17
+ # Path to man page.
18
+ MAN_PATH = 'man/timr-start.1'
19
+
20
+ def initialize(argv = Array.new)
21
+ super()
22
+
23
+ @help_opt = false
24
+
25
+ @foreign_id_opt = nil
26
+ @name_opt = nil
27
+ @description_opt = nil
28
+ @estimation_opt = nil
29
+
30
+ @hourly_rate_opt = nil
31
+ @has_flat_rate_opt = nil
32
+
33
+ @date_opt = nil
34
+ @time_opt = nil
35
+ @message_opt = nil
36
+ @edit_opt = false
37
+
38
+ @task_id_opt = nil
39
+ @track_id_opt = nil
40
+ @id_opts = Array.new
41
+
42
+ loop_c = 0 # Limit the loop.
43
+ while loop_c < 1024 && argv.length > 0
44
+ loop_c += 1
45
+ arg = argv.shift
46
+
47
+ case arg
48
+ when '-h', '--help'
49
+ @help_opt = true
50
+
51
+ when '--id'
52
+ @foreign_id_opt = argv.shift.strip
53
+ when '-n', '--name'
54
+ @name_opt = argv.shift
55
+ when '--desc', '--description'
56
+ @description_opt = argv.shift
57
+ when '-e', '--est', '--estimation'
58
+ @estimation_opt = argv.shift
59
+
60
+ when '-r', '--hourly-rate'
61
+ @hourly_rate_opt = argv.shift
62
+ when '--fr', '--flat', '--flat-rate'
63
+ @has_flat_rate_opt = true
64
+
65
+ when '-d', '--date'
66
+ @date_opt = argv.shift
67
+ when '-t', '--time'
68
+ @time_opt = argv.shift
69
+ when '-m', '--message'
70
+ @message_opt = argv.shift
71
+ when '--edit'
72
+ @edit_opt = true
73
+ else
74
+ if arg[0] == '-'
75
+ raise StartCommandError, "Unknown argument '#{arg}'. See 'timr start --help'."
76
+ else
77
+ if @id_opts.length < 2
78
+ @id_opts << arg
79
+ else
80
+ raise StartCommandError, "Unknown argument '#{arg}'. See 'timr start --help'."
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ check_foreign_id(@foreign_id_opt)
87
+
88
+ if @id_opts.length
89
+ @task_id_opt, @track_id_opt = @id_opts
90
+ end
91
+ end
92
+
93
+ # See BasicCommand#run.
94
+ def run
95
+ if @help_opt
96
+ help
97
+ return
98
+ end
99
+
100
+ @timr = Timr.new(@cwd)
101
+
102
+ run_edit
103
+
104
+ options = {
105
+ :foreign_id => @foreign_id_opt,
106
+ :name => @name_opt,
107
+ :description => @description_opt,
108
+ :estimation => @estimation_opt,
109
+
110
+ :hourly_rate => @hourly_rate_opt,
111
+ :has_flat_rate => @has_flat_rate_opt,
112
+
113
+ :date => @date_opt,
114
+ :time => @time_opt,
115
+ :message => @message_opt,
116
+
117
+ :task_id => @task_id_opt,
118
+ :track_id => @track_id_opt,
119
+ }
120
+
121
+ track = @timr.start(options)
122
+ unless track
123
+ raise TrackError, 'Could not start a new Track.'
124
+ end
125
+
126
+ puts track.to_compact_str
127
+ puts @timr.stack
128
+ end
129
+
130
+ private
131
+
132
+ def help
133
+ puts 'usage: timr start [--id <str>]'
134
+ puts ' [-n|--name <name>] [--desc|--description <description>]'
135
+ puts ' [[-d|--date <date>] -t|--time <time>]'
136
+ puts ' [-m|--message <message>] [--edit] [--estimation <time>]'
137
+ puts ' [--hourly-rate <value>] [--flat-rate]'
138
+ puts ' [<task_id> [<track_id>]]'
139
+ puts ' or: timr start [-h|--help]'
140
+ puts
141
+ puts "Note: 'timr push' uses the same options."
142
+ puts
143
+ puts 'Task Options'
144
+ puts ' --id <str> Your ID to identify the Task.'
145
+ puts ' -n, --name <name> The name of the new Task.'
146
+ puts ' --desc, --description <str> Longer description of the new Task.'
147
+ puts ' -e, --est, --estimation <time> Task Estimation. See details below.'
148
+ puts ' -r, --hourly-rate <float> Set the Hourly Rate.'
149
+ puts ' --fr, --flat-rate, --flat Has Task a Flat Rate?'
150
+ puts
151
+ puts 'Track Options'
152
+ puts ' -m, --message <message> Track Message. What have you done?'
153
+ puts ' You can overwrite this on stop command.'
154
+ puts ' --edit Edit Track Message when providing <track_id>.'
155
+ puts ' EDITOR environment variable must be set.'
156
+ puts ' -d, --date <date> Track Start Date. Default: today'
157
+ puts ' -t, --time <time> Track Start Time. Default: now'
158
+ puts
159
+ puts 'Arguments'
160
+ HelpCommand.print_id_help
161
+ puts
162
+ HelpCommand.print_datetime_help
163
+ puts
164
+ HelpCommand.print_estimation_help
165
+ puts
166
+ end
167
+
168
+ end # class StartCommand
169
+
170
+ end # module Command
171
+ end # module Timr
172
+ end # module TheFox
@@ -0,0 +1,198 @@
1
+
2
+ require 'thefox-ext'
3
+
4
+ module TheFox
5
+ module Timr
6
+ module Command
7
+
8
+ # Print [Stack](rdoc-ref:TheFox::Timr::Model::Stack) Status.
9
+ #
10
+ # Man page: [timr-status(1)](../../../../man/timr-status.1.html)
11
+ class StatusCommand < BasicCommand
12
+
13
+ include TheFox::Timr::Error
14
+
15
+ # Path to man page.
16
+ MAN_PATH = 'man/timr-status.1'
17
+
18
+ def initialize(argv = Array.new)
19
+ super()
20
+
21
+ @help_opt = false
22
+
23
+ @verbose_opt = false
24
+ @full_opt = false
25
+ @reverse_opt = false
26
+
27
+ loop_c = 0 # Limit the loop.
28
+ while loop_c < 1024 && argv.length > 0
29
+ loop_c += 1
30
+ arg = argv.shift
31
+
32
+ case arg
33
+ when '-h', '--help'
34
+ @help_opt = true
35
+ when '-v', '--verbose'
36
+ @verbose_opt = true
37
+ when '-f', '--full'
38
+ @full_opt = true
39
+ when '-r', '--reverse'
40
+ @reverse_opt = true
41
+ else
42
+ raise StatusCommandError, "Unknown argument '#{arg}'. See 'timr stop --help'."
43
+ end
44
+ end
45
+ end
46
+
47
+ # See BasicCommand#run.
48
+ def run
49
+ if @help_opt
50
+ help
51
+ return
52
+ end
53
+
54
+ @timr = Timr.new(@cwd)
55
+
56
+ if @full_opt
57
+ print_full_table
58
+ else
59
+ print_small_table
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ def print_small_table
66
+ headings = Array.new
67
+ headings << {:format => '%2s', :label => '##'}
68
+ headings << {:format => '%1s', :label => 'S'}
69
+ headings << {:format => '%-5s', :label => 'START', :padding_left => ' '}
70
+ headings << {:format => '%-5s', :label => 'END'}
71
+ headings << {:format => '%8s', :label => 'DUR', :padding_right => ' '}
72
+ if @verbose_opt
73
+ headings << {:format => '%7s', :label => 'EST', :padding_right => ' '}
74
+ headings << {:format => '%7s', :label => 'ETR', :padding_right => ' '}
75
+ headings << {:format => '%7s', :label => 'ETR%', :padding_right => ' '}
76
+ end
77
+ headings << {:format => '%-6s', :label => 'TASK', :padding_right => ' '}
78
+ headings << {:format => '%s', :label => 'TRACK'}
79
+
80
+ table_options = {
81
+ :headings => headings,
82
+ }
83
+ table = Table.new(table_options)
84
+
85
+ table_has_rows = false
86
+ track_c = 0
87
+ get_tracks.each do |track|
88
+ track_c += 1
89
+ table_has_rows = true
90
+
91
+ task = track.task
92
+
93
+ status = track.status.short_status
94
+ duration = track.duration
95
+ estimation_s = task.estimation_s
96
+ remaining_time_s = task.remaining_time_s
97
+ remaining_time_percent_s = task.remaining_time_percent_s
98
+
99
+ if track.begin_datetime
100
+ begin_datetime_s = track.begin_datetime_s({:format => '%H:%M'})
101
+ end
102
+
103
+ if track.end_datetime
104
+ end_datetime_s = track.end_datetime_s({:format => '%H:%M'})
105
+ end
106
+
107
+ row = Array.new
108
+ row << track_c
109
+ row << status
110
+ row << begin_datetime_s
111
+ row << end_datetime_s
112
+ row << duration.to_human
113
+ if @verbose_opt
114
+ row << estimation_s
115
+ row << remaining_time_s
116
+ row << remaining_time_percent_s
117
+ end
118
+ row << task.short_id
119
+
120
+ if @verbose_opt
121
+ row << '%s %s' % [track.short_id, track.title]
122
+ else
123
+ row << '%s %s' % [track.short_id, track.title(12)]
124
+ end
125
+
126
+ table << row
127
+ end
128
+
129
+ if table_has_rows
130
+ puts table
131
+ else
132
+ print_no_tracks
133
+ end
134
+ end
135
+
136
+ def print_full_table
137
+ tracks = Array.new
138
+ track_c = 0
139
+ get_tracks.each do |track|
140
+ track_c += 1
141
+
142
+ track_s = Array.new
143
+ track_s << '--- #%d ---' % [track_c]
144
+ track_s.concat(track.to_detailed_array)
145
+ tracks << track_s
146
+ end
147
+
148
+ if tracks.count > 0
149
+ puts tracks.map{ |track_s| track_s.join("\n") }.join("\n\n")
150
+ else
151
+ print_no_tracks
152
+ end
153
+ end
154
+
155
+ def print_no_tracks
156
+ puts 'There is no running Track.'
157
+ end
158
+
159
+ def get_tracks
160
+ if @reverse_opt
161
+ @timr.stack.tracks.reverse
162
+ else
163
+ @timr.stack.tracks
164
+ end
165
+ end
166
+
167
+ def help
168
+ puts 'usage: timr status [-h|--help] [-f|--full] [-r|--reverse]'
169
+ puts
170
+ puts 'Options'
171
+ puts ' -v, --verbose Show more columns in table view.'
172
+ puts ' -f, --full Show full status.'
173
+ puts ' -r, --reverse Reverse the list.'
174
+ puts
175
+ puts 'Columns'
176
+ puts ' S Status'
177
+ puts ' START Track Start Date'
178
+ puts ' END Track End Date'
179
+ puts ' DUR Track Duration'
180
+ puts ' EST Task Estimation'
181
+ puts ' ETR Task Estimated Time Remaining'
182
+ puts ' ETR% Task Estimated Time Remaining in percent.'
183
+ puts ' TASK Task ID'
184
+ puts ' TRACK Track ID and Title.'
185
+ puts
186
+ puts 'Status'
187
+ puts ' R Running'
188
+ puts ' S Stopped'
189
+ puts ' U Unknown'
190
+ puts ' - Not started yet.'
191
+ puts
192
+ end
193
+
194
+ end # class StatusCommand
195
+
196
+ end # module Command
197
+ end # module Timr
198
+ end # module TheFox
@@ -0,0 +1,127 @@
1
+
2
+ module TheFox
3
+ module Timr
4
+ module Command
5
+
6
+ # Stop the current running [Track](rdoc-ref:TheFox::Timr::Model::Track).
7
+ #
8
+ # Man page: [timr-stop(1)](../../../../man/timr-stop.1.html)
9
+ class StopCommand < BasicCommand
10
+
11
+ include TheFox::Timr::Helper
12
+ include TheFox::Timr::Error
13
+
14
+ # Path to man page.
15
+ MAN_PATH = 'man/timr-stop.1'
16
+
17
+ def initialize(argv = Array.new)
18
+ super()
19
+
20
+ @help_opt = false
21
+
22
+ @start_date_opt = nil
23
+ @start_time_opt = nil
24
+ @end_date_opt = nil
25
+ @end_time_opt = nil
26
+
27
+ @message_opt = nil
28
+ @edit_opt = false
29
+
30
+ loop_c = 0 # Limit the loop.
31
+ while loop_c < 1024 && argv.length > 0
32
+ loop_c += 1
33
+ arg = argv.shift
34
+
35
+ case arg
36
+ when '-h', '--help'
37
+ @help_opt = true
38
+
39
+ when '--sd', '--start-date'
40
+ @start_date_opt = argv.shift
41
+ when '--st', '--start-time'
42
+ @start_time_opt = argv.shift
43
+
44
+ when '--ed', '--end-date', '-d', '--date'
45
+ @end_date_opt = argv.shift
46
+ when '--et', '--end-time', '-t', '--time'
47
+ @end_time_opt = argv.shift
48
+
49
+ when '-m', '--message'
50
+ @message_opt = argv.shift
51
+ when '--edit'
52
+ @edit_opt = true
53
+ else
54
+ raise StopCommandError, "Unknown argument '#{arg}'. See 'timr stop --help'."
55
+ end
56
+ end
57
+ end
58
+
59
+ # See BasicCommand#run.
60
+ def run
61
+ if @help_opt
62
+ help
63
+ return
64
+ end
65
+
66
+ @timr = Timr.new(@cwd)
67
+
68
+ track = @timr.stack.current_track
69
+ if track
70
+ task = track.task
71
+ if task
72
+ run_edit(task.id, track.id)
73
+ end
74
+ end
75
+
76
+ options = {
77
+ :start_date => @start_date_opt,
78
+ :start_time => @start_time_opt,
79
+
80
+ :end_date => @end_date_opt,
81
+ :end_time => @end_time_opt,
82
+
83
+ :message => @message_opt,
84
+ }
85
+
86
+ track = @timr.stop(options)
87
+ unless track
88
+ puts 'No running Track to stop.'
89
+ return
90
+ end
91
+
92
+ puts track.to_compact_str
93
+ puts @timr.stack
94
+ end
95
+
96
+ private
97
+
98
+ def help
99
+ puts 'usage: timr stop [-m|--message <message>] [--edit]'
100
+ puts ' [[--start-date <date>] --start-time <time>]'
101
+ puts ' [-d|--date <date>] [-t|--time <time>]'
102
+ puts ' or: timr stop [-h|--help]'
103
+ puts
104
+ puts 'Track Options'
105
+ puts ' -m, --message <message> Track Message. What have you done? This will'
106
+ puts ' overwrite the start message. See --edit option.'
107
+ puts ' --edit Edit Track Message.'
108
+ puts ' EDITOR environment variable must be set.'
109
+ puts
110
+ puts ' --sd, --start-date <date> Overwrite the Start date.'
111
+ puts ' --st, --start-time <time> Overwrite the Start time.'
112
+ puts
113
+ puts ' --ed, --end-date <date> Track End Date. Default: today'
114
+ puts ' --et, --end-time <time> Track End Time. Default: now'
115
+ puts
116
+ puts ' -d, --date <date> --end-date alias.'
117
+ puts ' -t, --time <time> --end-time alias.'
118
+ puts
119
+ HelpCommand.print_datetime_help
120
+ puts
121
+ end
122
+
123
+ end # class StopCommand
124
+
125
+ end # module Command
126
+ end # module Timr
127
+ end # module TheFox