Terminal Time Tracker
| Attachment | Size |
|---|---|
| 1.98 KB |
Cuando se trabaja en una empresa es un tema recurrente el cálculo de tiempo dedicado a cada proyecto por parte del desarrollador.
Hay diferentes formas de hacerlo. La más simple sería mirando el reloj y haciendo un cálculo apróximado, el problema es que no tienes un registro de lo que has hecho.
Para el tracking de tiempo dedicado a un proyecto hay diferentes herramientas. Yo conocía gnotime que vale para lo que es, pero que no acaba de convencer.
Luego conocí Hamster, que es mucho más amigable, hace gráficas, informes y muchas polladas.
Yo en mi escritorio siempre tengo una terminal abierta, y últimamente me estoy dando cuenta de que las interfaces gráficas quitan mucho tiempo cuando no las necesitas, así que ayer decidí implementarme un time tracker de estos pero para terminal.
¿Cómo? Cojo python + vim, un poquito de sqlobject, se agita y aquí tenemos "Terminal Time Tracker".
En realidad son tres ficheros, aunque le he un instalador y desinstalador y polladas para que sea más simple de usar.
tttdb.py Una tabla para la base de datos.
# License: GPLv3
from sqlobject import *
import os
class Tracker(SQLObject):
project = StringCol()
task = StringCol()
ticket = IntCol()
start = DateTimeCol()
end = DateTimeCol()
def get_hub():
connection_string = 'sqlite://%s/devdata.sqlite' % os.getcwd()
connection = connectionForURI(connection_string)
sqlhub.processConnection = connection
return sqlhub
def create_db():
# You need to create the database before.
sqlhub = get_hub()
Tracker.createTable()
ttt.py Toda la chicha
# Author: Daniel Garcia
# License: GPLv3
import datetime
import time
import sys
import tttdb as db
from tttdb import Tracker
sqlhub = db.get_hub()
def parse_time(time_seconds):
hour = 0
min = 0
sec = time_seconds
while sec >= 60:
min += 1
sec -= 60
while min >= 60:
hour += 1
min -= 60
time_str = '%02d:%02d:%02d' % (hour, min, sec)
return time_str
def track(task, project='', ticket=0):
today = datetime.datetime.now()
tick = time.time()
time_pass = 0
try:
while True:
tick2 = time.time()
time_pass = tick2 - tick
cadena = '\rtracking: %(task)s %(project)s %(ticket)s %(time)s' % \
{'time':parse_time(time_pass),
'task':task,
'project':project,
'ticket':ticket}
sys.stdout.write(cadena)
sys.stdout.flush()
time.sleep(0.5)
except:
print '\n', 'Finalizando'
end = datetime.datetime.now()
db.Tracker(project=project,
task=task,
ticket=ticket,
start=today,
end=end)
def show(trackers):
grouped = {}
total = 0
prev = ''
for i in trackers:
diff = i.end - i.start
total += diff.seconds
time_passed = parse_time(diff.seconds)
key = (i.task, i.project)
if grouped.has_key(key):
grouped[key] += diff.seconds
else:
grouped[key] = diff.seconds
to_show = '%s | %-20s | %-40s | #%-6d | %s'
to_show = to_show % (i.start.ctime(), i.project, i.task, i.ticket, time_passed)
if prev != to_show[0:3]:
prev = to_show[0:3]
print ''
print to_show
print ''
for k,v in grouped.items():
task, project = k
time_passed = parse_time(v)
print 'Tiempo para %-40s %s' % ('"'+task+'":', time_passed)
print '\nTotal: %s' % parse_time(total)
def show_today(delta=0):
today = datetime.datetime.now() - datetime.timedelta(delta)
yesterday = datetime.datetime(today.year, today.month, today.day)
today_trackers = Tracker.select(Tracker.q.start > yesterday)
show(today_trackers)
def show_project(project):
project_trackers = Tracker.select(Tracker.q.project == project)
sum = 0
for i in project_trackers:
sum += (i.end - i.start).seconds
print 'Tiempo para "%s": %s' % (project, parse_time(sum))
def show_all():
all = Tracker.select()
show(all)
def show_week():
show_today(6)
def show_week_grouped():
show_today_grouped(6)
def show_today_grouped(delta=0):
today = datetime.datetime.now() - datetime.timedelta(delta)
yesterday = datetime.datetime(today.year, today.month, today.day)
today_trackers = Tracker.select(Tracker.q.start > yesterday)
show_grouped(today_trackers)
def show_grouped(trackers):
projects = {}
total = 0
for i in trackers:
diff = (i.end - i.start).seconds
total += diff
if projects.has_key(i.project):
projects[i.project] += diff
else:
projects[i.project] = diff
print ''
for k,v in projects.items():
p = '"' + k + '":'
print 'Tiempo para %-20s %s' % (p, parse_time(v))
print '\nTotal: %s' % parse_time(total)
if __name__ == '__main__':
help = '''
%s tarea [proyecto] [ticket]
'''
task, project, ticket = '','',0
args = sys.argv[1:]
if ('-h' in args) or ('--help' in args) or (len(args) == 0):
print help % sys.argv[0]
sys.exit()
if len(args) >= 1:
task = args[0]
if len(args) >= 2:
project = args[1]
if len(args) >= 3:
ticket = int(args[2])
track(task, project, ticket)
show.py Para ver el registro
# Author: Daniel Garcia
# License: GPLv3
import sys
import ttt
if __name__ == '__main__':
help = '''
%s [opcion]
opciones:
-g muestra agrupados por proyecto
-w muestra la ultima semana
-gw muestra la ultima semana agrupado por proyecto
-a muestra todo
si no se especifica opcion muestra las tareas de hoy
'''
args = sys.argv[1:]
if ('-h' in args) or ('--help' in args):
print help % sys.argv[0]
elif '-g' in args:
# show grouped by project
ttt.show_today_grouped()
elif '-w' in args:
ttt.show_week()
elif '-gw' in args:
# show grouped by project
ttt.show_week_grouped()
elif '-a' in args:
ttt.show_all()
else:
ttt.show_today()
El código se puede pillar de mi repositorio personal:
bzr branch http://repo.danigm.net/ttt
O del fichero tar.gz que adjunto aquí.
Para usarlo, tienes que tener instalado sqlobject y se instalaría ejecutando el script install.sh (hace una llamada a un comando con sudo). Esto te crea un directorio en $HOME/.ttt donde mete la base de datos y los scripts en python, y además copia t3 y t3show a /usr/local/bin para que puedas ejecutar los comandos sin modificar tu path.
Se usa de la siguiente manera:
t3 "Escribiendo un post"
Y en la terminal se muestra el tiempo que vas dedicando a esta tarea. Para terminar tan solo hay que pulsar ctrl+c.
Además de una tarea se puede especificar un proyecto y un número para referenciarlo en el sistema de tickets que uses.
sintaxis: t3 tarea [proyecto] [ticket] t3 -h ejemplo: t3 "plugin para jisko" "sweetter" 235879
Y para mostrar el resultado se usa t3show
Wed Sep 24 20:34:01 2008 | ttt | publicando | #0 | 00:00:06 Wed Sep 24 20:34:04 2008 | sweetter | plugin para jisko | #235879 | 00:00:08 Wed Sep 24 20:34:18 2008 | ttt | publicando | #0 | 00:00:05 Tiempo para "plugin para jisko": 00:00:08 Tiempo para "publicando": 00:00:11 Total: 00:00:19
Con las opciones -g -w -gw -a que muestran agrupado por proyecto, la última semana, por proyecto en la última semana y todo respectivamente. Además de mostrar el día actual si no se le pasa ningún parametro y la ayuda con el comando -h.




Recent comments