ttrack 0.1.4 → 0.2.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.
- data/bin/ttrack +49 -13
- data/lib/ttrack/datastore.rb +9 -8
- data/lib/ttrack.rb +62 -45
- metadata +4 -4
data/bin/ttrack
CHANGED
@@ -1,25 +1,61 @@
|
|
1
1
|
#!/Users/alex/.rvm/rubies/ruby-1.9.2-p290/bin/ruby -w
|
2
2
|
require 'ttrack'
|
3
3
|
|
4
|
-
tt
|
4
|
+
def usage(tt)
|
5
|
+
puts 'Usage: ttrack [%s]' % (tt.commands * '|')
|
6
|
+
end
|
7
|
+
|
8
|
+
databasename = "%s/%s" % [ENV['HOME'], ".timetrackerdb"]
|
9
|
+
tt = TTrack.new databasename
|
5
10
|
case ARGV[0]
|
6
11
|
when 'start' then
|
7
|
-
tt.start
|
12
|
+
if tt.start(ARGV[1], ARGV[2])
|
13
|
+
puts 'Start tracking issue "%s"' % ARGV[1]
|
14
|
+
else
|
15
|
+
usage(tt)
|
16
|
+
end
|
17
|
+
|
8
18
|
when 'stop' then
|
9
|
-
tt.stop
|
19
|
+
unless tt.stop
|
20
|
+
puts 'Not tracking'
|
21
|
+
end
|
22
|
+
|
10
23
|
when 'status' then
|
11
|
-
tt.status
|
24
|
+
status = tt.status(ARGV[1])
|
25
|
+
unless status.nil?
|
26
|
+
puts 'Total time tracked for task "%s": %d seconds' % [status[:task], status[:elapsed]]
|
27
|
+
else
|
28
|
+
puts "Currently not tracking"
|
29
|
+
end
|
30
|
+
|
12
31
|
when 'init' then
|
32
|
+
puts 'Initlializing empty sqlite database: %s' % databasename
|
13
33
|
tt.init
|
34
|
+
|
14
35
|
when 'report' then
|
15
|
-
tt.report
|
16
|
-
|
17
|
-
|
18
|
-
|
36
|
+
report = tt.report(ARGV[1])
|
37
|
+
unless report.nil?
|
38
|
+
report.each do |line|
|
39
|
+
puts line
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
when 'begin' then
|
44
|
+
begin
|
45
|
+
timestamp = ARGV[3] ? "%s %s" % ARGV[2..3] : ARGV[2]
|
46
|
+
tt.set_tstart! ARGV[1], timestamp
|
47
|
+
rescue Exception => e
|
48
|
+
usage(tt)
|
49
|
+
end
|
50
|
+
|
19
51
|
when 'end' then
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
52
|
+
begin
|
53
|
+
timestamp = ARGV[3] ? "%s %s" % ARGV[2..3] : ARGV[2]
|
54
|
+
tt.set_tstop! ARGV[1], timestamp
|
55
|
+
rescue
|
56
|
+
usage(tt)
|
57
|
+
end
|
58
|
+
|
59
|
+
else
|
60
|
+
usage(tt)
|
25
61
|
end
|
data/lib/ttrack/datastore.rb
CHANGED
@@ -3,8 +3,8 @@ require 'sqlite3'
|
|
3
3
|
|
4
4
|
class TTrack::DataStore
|
5
5
|
|
6
|
-
def initialize dbname
|
7
|
-
@dbname =
|
6
|
+
def initialize dbname, timezone="+02:00", version='v0.1.4', verbosity=0
|
7
|
+
@dbname = dbname
|
8
8
|
@timezone = timezone
|
9
9
|
@version = version
|
10
10
|
@verbosity = verbosity
|
@@ -63,7 +63,7 @@ class TTrack::DataStore
|
|
63
63
|
public
|
64
64
|
def getcurrent
|
65
65
|
current = @db.execute "SELECT current FROM system"
|
66
|
-
current[0][0] == "" ?
|
66
|
+
current[0][0] == "" ? false : current[0][0]
|
67
67
|
end
|
68
68
|
|
69
69
|
def getstatus
|
@@ -76,7 +76,7 @@ class TTrack::DataStore
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
def startnew issuename, notes
|
79
|
+
def startnew issuename, notes
|
80
80
|
@db.execute "INSERT INTO timesheet ( name, notes ) VALUES ( '%s', '%s' )" %
|
81
81
|
[issuename, notes]
|
82
82
|
latest = @db.execute "SELECT id FROM timesheet ORDER BY id DESC LIMIT 1"
|
@@ -88,8 +88,9 @@ class TTrack::DataStore
|
|
88
88
|
if current
|
89
89
|
@db.execute "UPDATE timesheet set tstop = datetime('now') WHERE id = %d" % current
|
90
90
|
@db.execute "UPDATE system SET current = '', latest = '%d'" % current
|
91
|
+
true
|
91
92
|
else
|
92
|
-
|
93
|
+
false
|
93
94
|
end
|
94
95
|
end
|
95
96
|
|
@@ -104,7 +105,7 @@ class TTrack::DataStore
|
|
104
105
|
end
|
105
106
|
|
106
107
|
def gettimesheet
|
107
|
-
@db.execute "SELECT id,name,tstart,tstop,notes FROM timesheet"
|
108
|
+
@db.execute "SELECT id,name,tstart,tstop,synced,notes FROM timesheet"
|
108
109
|
end
|
109
110
|
|
110
111
|
def gettimesbyissuename issuename
|
@@ -115,8 +116,8 @@ class TTrack::DataStore
|
|
115
116
|
@db.execute "SELECT tstart,tstop FROM timesheet WHERE name='%s'" % issuename
|
116
117
|
end
|
117
118
|
|
118
|
-
def
|
119
|
-
@db.execute "SELECT id,tstart,tstop,notes FROM timesheet WHERE name='%s'" % issuename
|
119
|
+
def getissuesbyname issuename
|
120
|
+
@db.execute "SELECT id,tstart,tstop,synced, notes FROM timesheet WHERE name='%s'" % issuename
|
120
121
|
end
|
121
122
|
|
122
123
|
def settstart id, tstart
|
data/lib/ttrack.rb
CHANGED
@@ -7,89 +7,106 @@
|
|
7
7
|
class TTrack
|
8
8
|
|
9
9
|
# At each call we need to declare the datastore
|
10
|
-
def initialize
|
11
|
-
@db = DataStore.new
|
10
|
+
def initialize datastore
|
11
|
+
@db = DataStore.new datastore
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
# Start tracking an issue, stop the current one if running
|
15
|
+
# Return boolean to indicate if the action was succesfull or not
|
16
|
+
def start issuename, notes=''
|
17
|
+
unless issuename.nil? or issuename.empty?
|
18
|
+
@db.stoprunning if @db.getcurrent
|
19
19
|
@db.startnew issuename, notes
|
20
|
+
true
|
20
21
|
else
|
21
|
-
|
22
|
+
false
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
26
|
+
# Stop the current running task
|
27
|
+
# Return false if no current running task, true otherwise
|
25
28
|
def stop
|
26
|
-
@db.stoprunning
|
29
|
+
@db.stoprunning ? true : false
|
27
30
|
end
|
28
31
|
|
29
|
-
|
30
|
-
|
32
|
+
# Get current running task status if no issuename given
|
33
|
+
# Otherwise get total duration for named task (i.e. for any matching time entry)
|
34
|
+
def status issuename=nil
|
35
|
+
if issuename.nil?
|
31
36
|
status = @db.getstatus
|
32
37
|
if status
|
33
38
|
delta = Time.now - gettstart(@db.getcurrent)
|
34
|
-
|
35
|
-
else
|
36
|
-
puts "Not tracking"
|
39
|
+
{:task => status[1], :elapsed => delta}
|
37
40
|
end
|
38
41
|
else
|
39
42
|
total = gettotalissueduration(issuename)
|
40
|
-
unless total
|
41
|
-
|
42
|
-
[
|
43
|
-
issuename,
|
44
|
-
total,
|
45
|
-
total / 3600
|
46
|
-
]
|
47
|
-
else
|
48
|
-
puts "No entry for issue '%s'" % issuename
|
43
|
+
unless total.nil?
|
44
|
+
{:task => issuename, :elapsed => total}
|
49
45
|
end
|
50
46
|
end
|
51
47
|
end
|
52
48
|
|
53
|
-
|
54
|
-
|
49
|
+
# Get a report for the given issue name
|
50
|
+
# If no issue is give, get a report for everything
|
51
|
+
def report issuename=nil
|
52
|
+
result = Array.new
|
53
|
+
|
54
|
+
if issuename.nil? or issuename.empty?
|
55
55
|
r = @db.gettimesheet
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
puts pstring % x
|
56
|
+
r.each do |line|
|
57
|
+
result << {
|
58
|
+
:task => line[0],
|
59
|
+
:name => line[1],
|
60
|
+
:tstart => line[2],
|
61
|
+
:tstop => line[3],
|
62
|
+
:synced => line[4],
|
63
|
+
:notes => line[5],
|
64
|
+
:elapsed => getissueduration(line[0])
|
65
|
+
}
|
67
66
|
end
|
68
67
|
else
|
69
|
-
|
68
|
+
r = @db.getissuesbyname issuename
|
69
|
+
r.each do |line|
|
70
|
+
result << {
|
71
|
+
:task => line[0],
|
72
|
+
:tstart => line[1],
|
73
|
+
:tstop => line[2],
|
74
|
+
:synced => line[3],
|
75
|
+
:notes => line[4],
|
76
|
+
:elapsed => getissueduration(line[0])
|
77
|
+
}
|
78
|
+
end
|
70
79
|
end
|
80
|
+
result.empty? ? nil : result
|
71
81
|
end
|
72
82
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
83
|
+
# Overwrite tstart for given issue with given timestamp
|
84
|
+
def set_tstart! issueid, timestamp
|
85
|
+
if validateissueid(issueid)
|
86
|
+
t = validatetimestamp(timestamp)
|
87
|
+
@db.settstart(issueid, t)
|
88
|
+
true
|
89
|
+
else
|
90
|
+
false
|
77
91
|
end
|
78
92
|
end
|
79
93
|
|
80
|
-
|
94
|
+
# Override tstop for given issue
|
95
|
+
def set_tstop! issueid, timestamp
|
81
96
|
if validateissueid issueid
|
82
97
|
t = validatetimestamp timestamp
|
83
98
|
@db.settstop issueid, t
|
84
99
|
end
|
85
100
|
end
|
86
101
|
|
102
|
+
# Cleanup the database
|
87
103
|
def init
|
88
104
|
@db.cleanup
|
89
105
|
end
|
90
106
|
|
91
|
-
|
92
|
-
|
107
|
+
# List of available public methods
|
108
|
+
def commands
|
109
|
+
[:start, :stop, :status, :init, :report, :begin, :end]
|
93
110
|
end
|
94
111
|
|
95
112
|
private
|
@@ -145,7 +162,7 @@ class TTrack
|
|
145
162
|
total = total + (t1 - t0)
|
146
163
|
end
|
147
164
|
end
|
148
|
-
total
|
165
|
+
r[0].nil? ? nil : total
|
149
166
|
end
|
150
167
|
|
151
168
|
def getissueduration issueid
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ttrack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-13 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sqlite3
|
16
|
-
requirement: &
|
16
|
+
requirement: &70131255576880 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: 1.3.6
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70131255576880
|
25
25
|
description: A simple CLI time tracker
|
26
26
|
email: alexander.fortin@gmail.com
|
27
27
|
executables:
|