README
This commit is contained in:
parent
2db419c780
commit
3bc9848355
24
README.md
24
README.md
|
@ -1,3 +1,25 @@
|
||||||
# Git-based Time Tracker
|
# Git-based Time Tracker
|
||||||
|
|
||||||
TODO.
|
Quick and dirty time tracker on git histories.
|
||||||
|
|
||||||
|
Uses the simple heuristics that each commit takes precisely one hour of work.
|
||||||
|
It will automatically trim commits below one hour if another commit occurred
|
||||||
|
less than an hour ago.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
```
|
||||||
|
python -m git_time_tracker
|
||||||
|
```
|
||||||
|
|
||||||
|
# Obligatory
|
||||||
|
|
||||||
|
This tool reports:
|
||||||
|
|
||||||
|
```
|
||||||
|
Jmaa/git-time-tracker.git 3 hours
|
||||||
|
```
|
||||||
|
|
||||||
|
And the ([Hamster](https://github.com/projecthamster/hamster)) manual time tracker reports:
|
||||||
|
|
||||||
|
![](docs/obligatory-hamster.png)
|
||||||
|
|
|
@ -60,9 +60,8 @@ ZERO_DURATION = datetime.timedelta(seconds = 0)
|
||||||
HOUR = datetime.timedelta(hours = 1)
|
HOUR = datetime.timedelta(hours = 1)
|
||||||
|
|
||||||
def generate_report(samples: list[WorkSample]) -> Iterator[str]:
|
def generate_report(samples: list[WorkSample]) -> Iterator[str]:
|
||||||
#SAMPLE_FILTER = {}
|
SAMPLE_FILTER = {}
|
||||||
SAMPLE_FILTER = {'author:jonjmaa@gmail.com', 'author:jon.michael.aanes@secata.com'}
|
LABEL_FILTER = {}
|
||||||
LABEL_FILTER = {'project'}
|
|
||||||
|
|
||||||
# Time spent per label
|
# Time spent per label
|
||||||
time_per_label: dict[str, datetime.timedelta] = {}
|
time_per_label: dict[str, datetime.timedelta] = {}
|
||||||
|
@ -95,18 +94,18 @@ def generate_report(samples: list[WorkSample]) -> Iterator[str]:
|
||||||
|
|
||||||
label_type, label = label_and_type.split(':', 1)
|
label_type, label = label_and_type.split(':', 1)
|
||||||
|
|
||||||
if label_type not in LABEL_FILTER:
|
if len(LABEL_FILTER) > 0 and label_type not in LABEL_FILTER:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
label_type = '' # TODO
|
label_type = '' # TODO
|
||||||
|
|
||||||
yield f' {label_type:8} {label:40} {total_time / HOUR:-4.0f} hours\n'
|
yield f' {label_type:8} {label:40} {total_time / HOUR:-4.2f} hours\n'
|
||||||
del label, total_time
|
del label, total_time
|
||||||
|
|
||||||
yield '-' * 66
|
yield '-' * 66
|
||||||
yield '\n'
|
yield '\n'
|
||||||
|
|
||||||
yield ' {label_type:8} {label:40} {hours:-4.0f} hours\n'.format(label_type='', label='TOTAL', hours = time_per_label[HIDDEN_LABEL_TOTAL] / HOUR)
|
yield ' {label_type:8} {label:40} {hours:-4.0f} hours\n'.format(label_type='', label='TOTAL', hours = time_per_label.get(HIDDEN_LABEL_TOTAL, ZERO_DURATION) / HOUR)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
logging.basicConfig()
|
logging.basicConfig()
|
||||||
|
@ -127,4 +126,3 @@ def main():
|
||||||
|
|
||||||
for t in generate_report(shared_time_stamps):
|
for t in generate_report(shared_time_stamps):
|
||||||
sys.stdout.write(t)
|
sys.stdout.write(t)
|
||||||
|
|
||||||
|
|
1
requirements.txt
Normal file
1
requirements.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
GitPython
|
1
requirements_test.txt
Normal file
1
requirements_test.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
pytest
|
4
test/test_main.py
Normal file
4
test/test_main.py
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import git_time_tracker
|
||||||
|
|
||||||
|
def test_report_empty():
|
||||||
|
assert list(git_time_tracker.generate_report([]))
|
Reference in New Issue
Block a user