diff --git a/git_time_tracker/__init__.py b/git_time_tracker/__init__.py index 509b850..829ad70 100644 --- a/git_time_tracker/__init__.py +++ b/git_time_tracker/__init__.py @@ -32,13 +32,12 @@ import sys from collections.abc import Iterator from pathlib import Path -from .data import WorkSample, HIDDEN_LABEL_PREFIX, HIDDEN_LABEL_TOTAL +from .data import HIDDEN_LABEL_PREFIX, HIDDEN_LABEL_TOTAL, WorkSample from .source import git_repo logger = logging.getLogger(__name__) - DEFAULT_EST_TIME = datetime.timedelta(hours=1) ZERO_DURATION = datetime.timedelta(seconds=0) @@ -50,8 +49,8 @@ def fmt_year_ranges_internal(years: list[int]) -> Iterator[str]: years = sorted(years) for idx, year in enumerate(years): at_end = idx == len(years) - 1 - range_before = idx > 0 and years[idx-1] == year - 1 - range_after = not at_end and years[idx+1] == year + 1 + range_before = idx > 0 and years[idx - 1] == year - 1 + range_after = not at_end and years[idx + 1] == year + 1 if not range_before or not range_after: yield str(year) @@ -62,15 +61,20 @@ def fmt_year_ranges_internal(years: list[int]) -> Iterator[str]: elif not range_after: yield ',' + def fmt_year_ranges(years: list[int]) -> str: return ''.join(list(fmt_year_ranges_internal(years))) + def fmt_line(label_type: str, label: str, total_time: datetime.timedelta) -> str: hours = int(total_time / HOUR) - minutes = int((total_time - hours*HOUR)/MINUTE) + minutes = int((total_time - hours * HOUR) / MINUTE) return f' {label_type:10} {label:40} {hours:-4d}h {minutes:-2d}m' -def generate_report(samples: list[WorkSample], sample_filter = frozenset()) -> Iterator[str]: + +def generate_report( + samples: list[WorkSample], sample_filter=frozenset(), +) -> Iterator[str]: LABEL_FILTER = {} # Time spent per label @@ -89,7 +93,7 @@ def generate_report(samples: list[WorkSample], sample_filter = frozenset()) -> I for label in sample.labels: time_per_label.setdefault(label, ZERO_DURATION) time_per_label[label] += est_time - years_per_label.setdefault(label,set()).add(sample.registered_at.year) + years_per_label.setdefault(label, set()).add(sample.registered_at.year) prev_time = sample.registered_at del sample, est_time @@ -111,7 +115,7 @@ def generate_report(samples: list[WorkSample], sample_filter = frozenset()) -> I yield fmt_line(label_type, label, total_time) yield ' (' - yield fmt_year_ranges(years_per_label.get(label_and_type,[])) + yield fmt_year_ranges(years_per_label.get(label_and_type, [])) yield ')' yield '\n' del label, total_time @@ -123,11 +127,19 @@ def generate_report(samples: list[WorkSample], sample_filter = frozenset()) -> I yield '\n' - def parse_arguments(): parser = argparse.ArgumentParser() - parser.add_argument('--git-repo', action='extend', nargs='+', type=Path, dest='repositories') - parser.add_argument('--filter', action='extend', nargs='+', type=str, dest='sample_filter', default=[]) + parser.add_argument( + '--git-repo', action='extend', nargs='+', type=Path, dest='repositories', + ) + parser.add_argument( + '--filter', + action='extend', + nargs='+', + type=str, + dest='sample_filter', + default=[], + ) return parser.parse_args() @@ -139,7 +151,9 @@ def main(): shared_time_stamps: set[WorkSample] = set() for repo_path in args.repositories: logger.warning('Visit %s', repo_path) - shared_time_stamps |= set(git_repo.iterate_samples_from_git_repository(repo_path)) + shared_time_stamps |= set( + git_repo.iterate_samples_from_git_repository(repo_path), + ) shared_time_stamps = sorted(shared_time_stamps) diff --git a/git_time_tracker/data.py b/git_time_tracker/data.py index e27c5a4..ca91455 100644 --- a/git_time_tracker/data.py +++ b/git_time_tracker/data.py @@ -1,14 +1,11 @@ -import argparse import dataclasses import datetime -import logging -import sys -from collections.abc import Iterator, Sequence -from pathlib import Path +from collections.abc import Sequence HIDDEN_LABEL_PREFIX = '__' HIDDEN_LABEL_TOTAL = HIDDEN_LABEL_PREFIX + 'TOTAL' + @dataclasses.dataclass(frozen=True, order=True) class WorkSample: registered_at: datetime.datetime diff --git a/git_time_tracker/source/git_repo.py b/git_time_tracker/source/git_repo.py index 7a10223..dbe22f0 100644 --- a/git_time_tracker/source/git_repo.py +++ b/git_time_tracker/source/git_repo.py @@ -1,16 +1,15 @@ -import git -import argparse -import dataclasses import datetime import logging -import sys -from collections.abc import Iterator, Sequence +from collections.abc import Iterator from pathlib import Path -from ..data import WorkSample, HIDDEN_LABEL_PREFIX, HIDDEN_LABEL_TOTAL +import git + +from ..data import HIDDEN_LABEL_TOTAL, WorkSample logger = logging.getLogger(__name__) + def determine_default_branch(repo: git.Repo): try: repo.commit('main') @@ -18,12 +17,14 @@ def determine_default_branch(repo: git.Repo): except: return 'master' + def determine_project_name(repo: git.Repo) -> str: remotes = repo.remotes if len(remotes) > 0: return remotes.origin.url.removeprefix('git@gitfub.space:') return Path(repo.working_tree_dir).name + def get_samples_from_project(repo: git.Repo) -> Iterator[WorkSample]: project_name = determine_project_name(repo) assert project_name is not None @@ -52,5 +53,3 @@ def iterate_samples_from_git_repository(repo_path: Path) -> Iterator[WorkSample] yield from get_samples_from_project(git.Repo(repo_path)) except git.exc.InvalidGitRepositoryError: logger.warning('Ignoring non-repo %s', repo_path) - - diff --git a/test/test_util.py b/test/test_util.py index c2086a7..688eef8 100644 --- a/test/test_util.py +++ b/test/test_util.py @@ -1,13 +1,17 @@ import git_time_tracker + def test_year_ranges_1(): - assert git_time_tracker.fmt_year_ranges([1,2,3]) == '1-3' + assert git_time_tracker.fmt_year_ranges([1, 2, 3]) == '1-3' + def test_year_ranges_2(): - assert git_time_tracker.fmt_year_ranges([1,3]) == '1,3' + assert git_time_tracker.fmt_year_ranges([1, 3]) == '1,3' + def test_year_ranges_3(): - assert git_time_tracker.fmt_year_ranges([1,2,4]) == '1-2,4' + assert git_time_tracker.fmt_year_ranges([1, 2, 4]) == '1-2,4' + def test_year_ranges_4(): - assert git_time_tracker.fmt_year_ranges([1,2,4,5]) == '1-2,4-5' + assert git_time_tracker.fmt_year_ranges([1, 2, 4, 5]) == '1-2,4-5'