tlog 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MWY4Y2M1ZmFlOGRmOTUzMzVjMDY0MmZiZTIyMzAyOTAzYjY3ZGE0OA==
4
+ ZmJmMGNhZmU4MDBlZTg2NmNkOGIzYTNlNWE4MGVjZDBmZjIwZGQxNA==
5
5
  data.tar.gz: !binary |-
6
- NDExZWNlMzcxY2Y1YTkwYmI4MTU4MWQ3ZjJiNGViOTEwNWFjMDYzNg==
6
+ OWJkODdkOGRhZGZlNDBmNTc1NmUxMjY4MzQ3N2UzZDNjMzFlNGQ1Mg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- MzNiMzZiODgzY2QyOTc3NWY3MzU3MmIwY2U0YmUyNmQ4NTQzNGMyYmY0ZDE5
10
- NTA3ODkzMzYxYTVmMTVkMGM2MjllNzQ4OTRiNGZjMzUzODk3YWNhOTNlY2Fj
11
- NGMxNzllMjdlOWJhYzk4Mjk0Y2Q3YzhiNjhhNjQ5MjcyZGFhYjY=
9
+ YzBkNDY2NDVhNGMwNDYyNzFjYWEzYjE2ZWQwM2JhMjAzZjlkMmY4MTY3YmZi
10
+ MjU5OWIxNzNjYmNjZjUyOTlhMTg4NWJhNDAyOTdlMGE1YjczNGZiNGU0MmMy
11
+ YjU1YjgxMmRmY2U5MjY1NTFiMjE1NzQ3MjQ5MzgyMDhkNGFlOWM=
12
12
  data.tar.gz: !binary |-
13
- M2M1ZWVlZjI2YjljZGIzNTFhNjNlYjgyZDNmYTQwZjQ1NDA0NDY5NmMzNGI0
14
- MTdmMzFiZDQ5ZjFjMGMwY2MxNjFmNWU3NGRmZTI2NjEyOTc5OTkzMDdlZjQ4
15
- MTU4ZjIwNzgzNGFiYTk1NzNmMTcyYzI0ODM2M2M4ZjJiMDA2MTU=
13
+ YjkwODIzMWI5N2RhODcxZDg3ZGE5ZGFmMWI5YTVmMjYxZjc2MmViY2JkYTA4
14
+ NjhjOTIwNGI4Y2Y4MGFlNmMyM2ExNjY5MDVhNTQ5MzQxYjM4Y2ZlMzIwYjBj
15
+ MWUzMmJlYjg3ZmY2YmQ0YWIxOWU0OTM4MTA5OGQxOTgwOTI4YzE=
data/README.md CHANGED
@@ -8,68 +8,210 @@ A git-based CLI to help you with time tracking on your projects.
8
8
  $ sudo gem install tlog
9
9
  ```
10
10
 
11
- ## Usage
11
+ # Usage
12
12
  * Navigate to a directory that has a git repo
13
13
 
14
- ### Create a time log
14
+ ## Create a time log
15
+
16
+ #### Create a default time log with no goal
15
17
  ```bash
16
18
  $ tlog create example
17
19
  ```
18
20
 
19
- ### Check out a time log
21
+ #### Create a time log with a time goal
20
22
  ```bash
21
- $ tlog checkout example
23
+ $ tlog create example --goal 4hr
22
24
  ```
23
25
 
24
- ### Create a time log with a time goal
26
+ #### Create a new time log with a state and a points value
25
27
  ```bash
26
- $ tlog create example --goal 4hr
28
+ $ tlog create example --state OPEN --points 10
27
29
  ```
30
+ ## Displaying time logs
28
31
 
29
- ### Start a new task on a time log
32
+ #### Display all time logs
30
33
  ```bash
31
- $ tlog start example -d "My task description"
34
+ $ tlog display
35
+ Log: bugfix
36
+ State: open
37
+ Points: 10
38
+ Owner: andrew
39
+ Start End Duration Description
40
+ June 06, 12:45PM June 06, 12:46PM 1:00:27 fixing really bad bug
41
+ June 07,
42
+ ----------------------------------------------------------------------------------------------------
43
+ Total 1:00:27
44
+ Time left: 0:59:33
45
+ Log: important
46
+ State: closed
47
+ Points: 0
48
+ Owner: chris
49
+ Start End Duration Description
50
+ ----------------------------------------------------------------------------------------------------
51
+ Total 0:00:00
52
+ Log: feature1
53
+ State: hold
54
+ Points: 5
55
+ Owner: peter
56
+ Start End Duration Description
57
+ June 13, 12:32PM June 13, 12:33PM 0:00:34 making sure new feature works
58
+ June 13, 12:29PM June 13, 12:32PM 0:02:30 working on new feature
59
+ ----------------------------------------------------------------------------------------------------
60
+ Total 0:03:04
61
+ Time left: 3:56:56
62
+ ```
63
+
64
+ #### Display a specific time log
65
+ ```bash
66
+ $ tlog display feature1
67
+ Log: feature1
68
+ State: hold
69
+ Points: 5
70
+ Owner: peter
71
+ Start End Duration Description
72
+ June 13, 12:32PM June 13, 12:33PM 0:00:34 making sure new feature works
73
+ June 13, 12:29PM June 13, 12:32PM 0:02:30 working on new feature
74
+ ----------------------------------------------------------------------------------------------------
75
+ Total 0:03:04
76
+ Time left: 3:56:56
32
77
  ```
33
78
 
34
- ### Stop the current task
79
+ #### Constrain displayed time logs to only ones with specified states
35
80
  ```bash
36
- $ tlog stop example
81
+ $ tlog display -s open,hold
82
+ Log: bugfix
83
+ State: open
84
+ Points: 10
85
+ Owner: andrew
86
+ Start End Duration Description
87
+ June 06, 12:45PM June 06, 12:46PM 1:00:27 fixing really bad bug
88
+ June 07,
89
+ ----------------------------------------------------------------------------------------------------
90
+ Total 1:00:27
91
+ Time left: 0:59:33
92
+ Log: feature1
93
+ State: hold
94
+ Points: 5
95
+ Owner: peter
96
+ Start End Duration Description
97
+ June 13, 12:32PM June 13, 12:33PM 0:00:34 making sure new feature works
98
+ June 13, 12:29PM June 13, 12:32PM 0:02:30 working on new feature
99
+ ----------------------------------------------------------------------------------------------------
100
+ Total 0:03:04
101
+ Time left: 3:56:56
102
+ ```
103
+ #### Constrain displayed time logs to only ones with specified owners
104
+ ```bash
105
+ $ tlog display -o chris,peter
106
+ Log: important
107
+ State: closed
108
+ Points: 0
109
+ Owner: chris
110
+ Start End Duration Description
111
+ ----------------------------------------------------------------------------------------------------
112
+ Total 0:00:00
113
+ Log: feature1
114
+ State: hold
115
+ Points: 5
116
+ Owner: peter
117
+ Start End Duration Description
118
+ June 13, 12:32PM June 13, 12:33PM 0:00:34 making sure new feature works
119
+ June 13, 12:29PM June 13, 12:32PM 0:02:30 working on new feature
120
+ ----------------------------------------------------------------------------------------------------
121
+ Total 0:03:04
122
+ Time left: 3:56:56
123
+ ```
124
+
125
+ #### Contrain displayed time logs to only ones that have points values >= the specified points value
126
+ ```bash
127
+ $ tlog display -p 10
128
+ Log: bugfix
129
+ State: open
130
+ Points: 10
131
+ Owner: andrew
132
+ Start End Duration Description
133
+ June 06, 12:45PM June 06, 12:46PM 1:00:27 fixing really bad bug
134
+ June 07,
135
+ ----------------------------------------------------------------------------------------------------
136
+ Total 1:00:27
137
+ Time left: 0:59:33
37
138
  ```
38
139
 
39
- ### Show active time logs and label the current one, if it exists
140
+ #### Constrain displayed time logs to only ones that have less than the specified amount of time left to finish
141
+ ```bash
142
+ $ tlog display -g 1hr
143
+ Log: bugfix
144
+ State: open
145
+ Points: 10
146
+ Owner: andrew
147
+ Start End Duration Description
148
+ June 06, 12:45PM June 06, 12:46PM 1:00:27 fixing really bad bug
149
+ June 07,
150
+ ----------------------------------------------------------------------------------------------------
151
+ Total 1:00:27
152
+ Time left: 0:59:33
153
+ ```
154
+
155
+ #### Show active time logs and label the checked-out log or the in-progress log
40
156
  ```bash
41
157
  $ tlog active
42
158
  All Time Logs:
43
159
  testing
44
- feature1(current)
160
+ feature1(in-progress)
45
161
  bug fix
46
162
  feature2
47
163
  ```
48
-
49
- ### Display all the current time logs and their tasks, total time logged and time left.
164
+
165
+ ## Using time logs
166
+
167
+ #### Check out a time log
168
+ ```bash
169
+ $ tlog checkout example
170
+ ```
171
+
172
+ #### Start a new task the checked-out time log
50
173
  ```bash
51
- $ tlog display
52
- Log: example1
53
- Start End Duration Owner Description
54
- May 29, 11:57PM May 29, 11:58PM 0:01:13 chriwend My Description
55
- ----------------------------------------------------------------------------------------------------
56
- Total 0:01:13
57
- Log: example2
58
- Start End Duration Owner Description
59
- May 30, 12:00AM 0:02:26 chriwend Fixing bug
60
- May 30, 12:00AM May 30, 12:00AM 0:00:10 chriwend (no description)
61
- ----------------------------------------------------------------------------------------------------
62
- Total 0:02:36
63
- Time left: 3:57:24
64
- ```
174
+ $ tlog start -d "My task description"
175
+ ```
176
+
177
+ #### Update the state of the checked-out time log
178
+ ```bash
179
+ $ tlog state CLOSED
180
+ ```
181
+
182
+ #### Update the points value of the checked-out time log
183
+ ```bash
184
+ $ tlog points 10
185
+ ```
65
186
 
66
- ### Delete a time log
187
+ #### Update the owner of the checked-out time log
188
+ ```bash
189
+ $ tlog owner cewendel
190
+ ```
191
+
192
+ #### Stop the current task
193
+ ```bash
194
+ $ tlog stop example
195
+ ```
196
+
197
+ #### Delete a time log
67
198
  ```bash
68
199
  $ tlog delete example
69
200
  ```
70
201
 
71
202
  ## Collaboration
72
- More to come on this after I test it...
203
+
204
+ tlog makes for easy time and ticket tracking when working with a team. Assuming you have a remote repo that you and others are pushing to, use the `tlog push` and `tlog pull` commands to keep your time logs up to date.
205
+
206
+ ### Pull in new or updated time logs from upstream
207
+ ```bash
208
+ $ tlog pull
209
+ ```
210
+
211
+ ### Push new or updated time logs upstream
212
+ ```bash
213
+ $ tlog push
214
+ ```
73
215
 
74
216
  ## Contributing
75
217
 
data/TODO CHANGED
@@ -1,4 +1,5 @@
1
1
  - tests
2
2
  - rakefile
3
3
  - time zones....
4
+ - command aliases
4
5
  - display update speicifc states, points values, owners. goal times
@@ -1,61 +1,61 @@
1
1
 
2
2
  class Tlog::Application
3
3
 
4
- def initialize(input, output)
5
- @input = input
6
- @output = output
7
- end
8
-
9
- def run
10
- command_name = ""
11
- outcome = false
12
- begin
13
- command_name = @input.args.shift
14
- command = find(command_name)
15
- prepare_command(command)
16
- outcome = run_command(command)
17
- rescue OptionParser::InvalidOption, OptionParser::MissingArgument
18
- @output.error($!)
19
- @output.error(@optparse.to_s)
20
- rescue Tlog::Error::CommandInvalid
21
- @output.error(command_name + " command invalid: " + $!.message)
22
- @output.error(@optparse.to_s)
23
- rescue Tlog::Error::CommandNotFound, OptionParser::MissingArgument
24
- @output.error($!)
25
- @output.error(@optparse.to_s)
26
- rescue
27
- @output.error($!)
28
- end
29
- return outcome
30
- end
31
-
32
- private
33
-
34
- def find(command_name)
35
- commands = Tlog::Command_Suite.commands
36
- command = nil
37
- commands.each do |cmd|
38
- return cmd if cmd.name == command_name
39
- end
40
- command
41
- end
42
-
43
- def prepare_command(command)
44
- if !command.nil?
45
- @optparse = OptionParser.new do |parser|
46
- command.options(parser, @input.options)
47
- end
48
- @optparse.parse!(@input.args)
49
- end
50
- end
51
-
52
- def run_command(command)
53
- if !command.nil?
54
- command.execute(@input, @output)
55
- true
56
- else
57
- raise Tlog::Error::CommandNotFound, "Command not found, use 'tlog help' for list of commands"
58
- end
59
- end
4
+ def initialize(input, output)
5
+ @input = input
6
+ @output = output
7
+ end
8
+
9
+ def run
10
+ command_name = ""
11
+ outcome = false
12
+ begin
13
+ command_name = @input.args.shift
14
+ command = find(command_name)
15
+ prepare_command(command)
16
+ outcome = run_command(command)
17
+ rescue OptionParser::InvalidOption, OptionParser::MissingArgument
18
+ @output.error($!)
19
+ @output.error(@optparse.to_s)
20
+ rescue Tlog::Error::CommandInvalid
21
+ @output.error(command_name + " command invalid: " + $!.message)
22
+ @output.error(@optparse.to_s)
23
+ rescue Tlog::Error::CommandNotFound, OptionParser::MissingArgument
24
+ @output.error($!)
25
+ @output.error(@optparse.to_s)
26
+ rescue
27
+ @output.error($!)
28
+ end
29
+ return outcome
30
+ end
31
+
32
+ private
33
+
34
+ def find(command_name)
35
+ commands = Tlog::Command_Suite.commands
36
+ command = nil
37
+ commands.each do |cmd|
38
+ return cmd if cmd.name == command_name
39
+ end
40
+ command
41
+ end
42
+
43
+ def prepare_command(command)
44
+ if !command.nil?
45
+ @optparse = OptionParser.new do |parser|
46
+ command.options(parser, @input.options)
47
+ end
48
+ @optparse.parse!(@input.args)
49
+ end
50
+ end
51
+
52
+ def run_command(command)
53
+ if !command.nil?
54
+ command.execute(@input, @output)
55
+ true
56
+ else
57
+ raise Tlog::Error::CommandNotFound, "Command not found, use 'tlog help' for list of commands"
58
+ end
59
+ end
60
60
 
61
61
  end
@@ -1,53 +1,53 @@
1
1
 
2
2
  class Tlog::Command::Active < Tlog::Command
3
3
 
4
- def name
5
- "active"
6
- end
7
-
8
- def description
9
- "prints out all active time logs, the time log in-progress if there is one. Or the currently checked-out time log"
10
- end
11
-
12
- def execute(input, output)
13
- print_time_entry(output)
14
- end
15
-
16
- def options(parser, options)
17
- parser.banner = "usage: tlog active"
18
- end
19
-
20
- private
21
-
22
- def print_time_entry(output)
23
- storage.in_branch do |wd|
24
- all_logs = @storage.all_log_dirs
25
- active_logs = []
26
- all_logs.each do |log|
27
- log_name = log.basename.to_s
28
- active_log = Tlog::Entity::Active_Log.new(log_name)
29
- active_log.current = true if storage.current_log_name == log_name
30
- active_log.checked_out = true if storage.checkout_value == log_name
31
- active_logs.push(active_log)
32
- end
33
- output.line_yellow("All Time Logs:")
34
- print_logs(active_logs, output)
35
- end
36
- end
37
-
38
- def print_logs(active_logs, output)
39
- active_logs.each do |active_log|
40
- out_line = active_log.name
41
- if active_log.current
42
- out_line << " (in-progress)"
43
- output.line_red(out_line);
44
- elsif active_log.checked_out
45
- out_line << " (checked_out)"
46
- output.line_blue(out_line)
47
- else
48
- output.line(out_line)
49
- end
50
- end
51
- end
4
+ def name
5
+ "active"
6
+ end
7
+
8
+ def description
9
+ "prints out all active time logs, the time log in-progress if there is one. Or the currently checked-out time log"
10
+ end
11
+
12
+ def execute(input, output)
13
+ print_time_entry(output)
14
+ end
15
+
16
+ def options(parser, options)
17
+ parser.banner = "usage: tlog active"
18
+ end
19
+
20
+ private
21
+
22
+ def print_time_entry(output)
23
+ storage.in_branch do |wd|
24
+ all_logs = @storage.all_log_dirs
25
+ active_logs = []
26
+ all_logs.each do |log|
27
+ log_name = log.basename.to_s
28
+ active_log = Tlog::Entity::Active_Log.new(log_name)
29
+ active_log.current = true if storage.current_log_name == log_name
30
+ active_log.checked_out = true if storage.checkout_value == log_name
31
+ active_logs.push(active_log)
32
+ end
33
+ output.line_yellow("All Time Logs:")
34
+ print_logs(active_logs, output)
35
+ end
36
+ end
37
+
38
+ def print_logs(active_logs, output)
39
+ active_logs.each do |active_log|
40
+ out_line = active_log.name
41
+ if active_log.current
42
+ out_line << " (in-progress)"
43
+ output.line_red(out_line);
44
+ elsif active_log.checked_out
45
+ out_line << " (checked_out)"
46
+ output.line_blue(out_line)
47
+ else
48
+ output.line(out_line)
49
+ end
50
+ end
51
+ end
52
52
 
53
53
  end
@@ -1,36 +1,36 @@
1
1
 
2
2
  class Tlog::Command::Checkout < Tlog::Command
3
3
 
4
- def name
5
- "checkout"
6
- end
7
-
8
- def description
9
- "checkouts a time log in order to start tasks on"
10
- end
11
-
12
- def execute(input, output)
13
- raise Tlog::Error::CommandInvalid, "Must specify log name" unless input.args[0]
14
- checkout(input.args[0])
15
- output.line("Checked-out log '#{input.args[0]}'");
16
- end
17
-
18
- def options(parser, options)
19
- parser.banner = "usage: tlog checkout <log_name>"
20
- end
21
-
22
- private
23
-
24
- def checkout(log_name)
25
- storage.in_branch do |wd|
26
- log = storage.require_log(log_name)
27
- raise Tlog::Error::TimeLogNotFound, "Time log '#{log_name}' does not exist" unless log
28
- checked_out_log = storage.checkout_value
29
- if checked_out_log == log.name
30
- raise Tlog::Error::CommandInvalid, "Time log '#{log_name}' is currently checked out "
31
- end
32
- storage.checkout_log(log)
33
- end
34
- end
4
+ def name
5
+ "checkout"
6
+ end
7
+
8
+ def description
9
+ "checkouts a time log in order to start tasks on"
10
+ end
11
+
12
+ def execute(input, output)
13
+ raise Tlog::Error::CommandInvalid, "Must specify log name" unless input.args[0]
14
+ checkout(input.args[0])
15
+ output.line("Checked-out log '#{input.args[0]}'");
16
+ end
17
+
18
+ def options(parser, options)
19
+ parser.banner = "usage: tlog checkout <log_name>"
20
+ end
21
+
22
+ private
23
+
24
+ def checkout(log_name)
25
+ storage.in_branch do |wd|
26
+ log = storage.require_log(log_name)
27
+ raise Tlog::Error::TimeLogNotFound, "Time log '#{log_name}' does not exist" unless log
28
+ checked_out_log = storage.checkout_value
29
+ if checked_out_log == log.name
30
+ raise Tlog::Error::CommandInvalid, "Time log '#{log_name}' is currently checked out "
31
+ end
32
+ storage.checkout_log(log)
33
+ end
34
+ end
35
35
 
36
36
  end
@@ -1,44 +1,44 @@
1
1
 
2
2
  class Tlog::Command::Create < Tlog::Command
3
3
 
4
- def name
5
- "create"
6
- end
7
-
8
- def description
9
- "creates a new time log either with no goal or with a goal"
10
- end
11
-
12
- def execute(input, output)
13
- raise Tlog::Error::CommandInvalid, "Must specify log name" unless input.args[0]
14
-
15
- log = Tlog::Entity::Log.new
16
- log.name = input.args[0];
17
- create_log(log, input.options)
18
- output.line("Created log '#{log.name}'")
19
- end
20
-
21
- def options(parser, options)
22
- parser.banner = "usage: tlog create <log_name>"
23
-
24
- parser.on("-g", "--goal <goal_length>") do |goal|
25
- options[:goal] = goal
26
- end
27
-
28
- parser.on("-s", "--state <initial_state>") do |state|
29
- options[:state] = state
30
- end
31
-
32
- parser.on("-p", "--points <initial_points_value>") do |points|
33
- options[:points] = points
34
- end
35
- end
36
-
37
- private
38
-
39
- def create_log(log, options)
40
- storage.in_branch do |wd|
41
- raise Tlog::Error::CommandInvalid, "Time log '#{log.name}' already exists" unless storage.create_log(log, options)
42
- end
43
- end
4
+ def name
5
+ "create"
6
+ end
7
+
8
+ def description
9
+ "creates a new time log either with no goal or with a goal"
10
+ end
11
+
12
+ def execute(input, output)
13
+ raise Tlog::Error::CommandInvalid, "Must specify log name" unless input.args[0]
14
+
15
+ log = Tlog::Entity::Log.new
16
+ log.name = input.args[0];
17
+ create_log(log, input.options)
18
+ output.line("Created log '#{log.name}'")
19
+ end
20
+
21
+ def options(parser, options)
22
+ parser.banner = "usage: tlog create <log_name>"
23
+
24
+ parser.on("-g", "--goal <goal_length>") do |goal|
25
+ options[:goal] = goal
26
+ end
27
+
28
+ parser.on("-s", "--state <initial_state>") do |state|
29
+ options[:state] = state
30
+ end
31
+
32
+ parser.on("-p", "--points <initial_points_value>") do |points|
33
+ options[:points] = points
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def create_log(log, options)
40
+ storage.in_branch do |wd|
41
+ raise Tlog::Error::CommandInvalid, "Time log '#{log.name}' already exists" unless storage.create_log(log, options)
42
+ end
43
+ end
44
44
  end