Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
REVIEW.md
temp.*
*.temp

# General
*.lock
Expand Down
26 changes: 17 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,13 @@ uv sync --dev

## Usage

### Example Files

The `tests/` directory includes example CSV files for both supported formats:

- `example_timecop.csv` - TimeCop format sample data
- `example_stt.csv` - Simple Time Tracker format sample data

### Configuration

Create a YAML configuration file pointing to your SQLite database:
Expand All @@ -48,23 +55,24 @@ max_conflict_display: 100

### CLI

The package provides a `timetracker` CLI with a single command `timecop`:
The package provides a `timetracker` CLI with commands for both supported formats:

```bash
# Show version
uv run timetracker --version

# Import a CSV file and display entries
uv run timetracker timecop --config config.yml --input timecop_export.csv
# Import a TimeCop CSV file and display entries
uv run timetracker timecop --config tests/timetracker.yml --input tests/example_timecop.csv

# Export the database back to TimeCop CSV
uv run timetracker timecop --config tests/timetracker.yml --output timecop_export.csv

# Export the database back to CSV
uv run timetracker timecop --config config.yml --output timecop_export.csv

# Both import and export in one command
uv run timetracker timecop --config config.yml --input input.csv --output output.csv
# Import a Simple Time Tracker CSV file and display entries
uv run timetracker stt --config tests/timetracker.yml --input tests/example_stt.csv

# Control how many rows to display
uv run timetracker timecop --config config.yml --input input.csv --head 10
# Export the database back to Simple Time Tracker CSV
uv run timetracker stt --config tests/timetracker.yml --output stt_export.csv
```

### Python API
Expand Down
33 changes: 33 additions & 0 deletions patch_serialise.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""Patch script to fix _serialise_lists in database.py.

This script updates the _serialise_lists function to convert empty lists
to empty strings instead of "[]".
"""

from pathlib import Path

# Fix _serialise_lists: empty lists -> "" not "[]"
p = Path("/root/timetracker-utils/timetracker_utils/database.py")
src = p.read_text()
old = """ df[col] = df[col].apply(
lambda x: json.dumps(x) if isinstance(x, list)
else ("" if _is_blank(x) else str(x))
)
return df


def _deserialise_lists"""
new = """ df[col] = df[col].apply(
lambda x: json.dumps(x) if isinstance(x, list) and len(x) > 0
else ("" if _is_blank(x) else str(x))
)
return df


def _deserialise_lists"""
if old in src:
src = src.replace(old, new, 1)
p.write_text(src)
print("patched _serialise_lists")
else:
print("old text not found")
13 changes: 13 additions & 0 deletions tests/example_stt.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
activity name,time started,time ended,duration,categories,record tags,duration minutes
StellarCartography,2200-01-15T09:00:00.000Z,2200-01-15T11:30:00.000Z,2:30:00,nebula mapping,,150
Hydroponics,2200-01-15T13:00:00.000Z,2200-01-15T14:45:00.000Z,1:45:00,crop harvest,,105
StellarCartography,2200-01-15T21:00:00.000Z,2200-01-15T22:30:00.000Z,1:30:00,,,90
CrewFitness,2200-01-16T06:00:00.000Z,2200-01-16T07:00:00.000Z,1:00:00,strength training,,60
Hydroponics,2200-01-16T10:15:00.000Z,2200-01-16T11:45:00.000Z,1:30:00,nutrient mix,,90
StellarCartography,2200-01-16T20:30:00.000Z,2200-01-16T22:15:00.000Z,1:45:00,course plotting,,105
WarpDrive,2200-01-17T08:00:00.000Z,2200-01-17T12:30:00.000Z,4:30:00,plasma calibration,critical test,270
Hydroponics,2200-01-17T14:00:00.000Z,2200-01-17T15:30:00.000Z,1:30:00,pH adjustment,,90
CrewFitness,2200-01-17T17:00:00.000Z,2200-01-17T18:30:00.000Z,1:30:00,cardiovascular,,90
WarpDrive,2200-01-20T09:30:00.000Z,2200-01-20T13:30:00.000Z,4:00:00,coil winding,,240
StellarCartography,2200-01-20T15:00:00.000Z,2200-01-20T16:45:00.000Z,1:45:00,asteroid tracking,,105
CrewFitness,2200-01-20T19:00:00.000Z,2200-01-20T20:00:00.000Z,1:00:00,yoga session,test,60
26 changes: 13 additions & 13 deletions tests/example.csv → tests/example_timecop.csv
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
Date,Project,Description,Combined Project & Description,Start Time,End Time,Time (hours),Notes
1/15/2200,StellarCartography,nebula mapping,StellarCartography: nebula mapping,2200-01-15T09:00:00.000Z,2200-01-15T11:30:00.000Z,2.5,
1/15/2200,Hydroponics,crop harvest,Hydroponics: crop harvest,2200-01-15T13:00:00.000Z,2200-01-15T14:45:00.000Z,1.75,
1/15/2200,StellarCartography,,StellarCartography: ,2200-01-15T21:00:00.000Z,2200-01-15T22:30:00.000Z,1.5,
1/16/2200,CrewFitness,strength training,CrewFitness: strength training,2200-01-16T06:00:00.000Z,2200-01-16T07:00:00.000Z,1,
1/16/2200,Hydroponics,nutrient mix,Hydroponics: nutrient mix,2200-01-16T10:15:00.000Z,2200-01-16T11:45:00.000Z,1.5,
1/16/2200,StellarCartography,course plotting,StellarCartography: course plotting,2200-01-16T20:30:00.000Z,2200-01-16T22:15:00.000Z,1.75,
1/17/2200,WarpDrive,plasma calibration,WarpDrive: plasma calibration,2200-01-17T08:00:00.000Z,2200-01-17T12:30:00.000Z,4.5,critical test
1/17/2200,Hydroponics,pH adjustment,Hydroponics: pH adjustment,2200-01-17T14:00:00.000Z,2200-01-17T15:30:00.000Z,1.5,
1/17/2200,CrewFitness,cardiovascular,CrewFitness: cardiovascular,2200-01-17T17:00:00.000Z,2200-01-17T18:30:00.000Z,1.5,
1/20/2200,WarpDrive,coil winding,WarpDrive: coil winding,2200-01-20T09:30:00.000Z,2200-01-20T13:30:00.000Z,4,
1/20/2200,StellarCartography,asteroid tracking,StellarCartography: asteroid tracking,2200-01-20T15:00:00.000Z,2200-01-20T16:45:00.000Z,1.75,
1/20/2200,CrewFitness,yoga session,CrewFitness: yoga session,2200-01-20T19:00:00.000Z,2200-01-20T20:00:00.000Z,1,test
Date,Project,Description,Combined Project & Description,Start Time,End Time,Time (hours),Notes
1/15/2200,StellarCartography,nebula mapping,StellarCartography: nebula mapping,2200-01-15T09:00:00.000Z,2200-01-15T11:30:00.000Z,2.5,
1/15/2200,Hydroponics,crop harvest,Hydroponics: crop harvest,2200-01-15T13:00:00.000Z,2200-01-15T14:45:00.000Z,1.75,
1/15/2200,StellarCartography,,StellarCartography: ,2200-01-15T21:00:00.000Z,2200-01-15T22:30:00.000Z,1.5,
1/16/2200,CrewFitness,strength training,CrewFitness: strength training,2200-01-16T06:00:00.000Z,2200-01-16T07:00:00.000Z,1,
1/16/2200,Hydroponics,nutrient mix,Hydroponics: nutrient mix,2200-01-16T10:15:00.000Z,2200-01-16T11:45:00.000Z,1.5,
1/16/2200,StellarCartography,course plotting,StellarCartography: course plotting,2200-01-16T20:30:00.000Z,2200-01-16T22:15:00.000Z,1.75,
1/17/2200,WarpDrive,plasma calibration,WarpDrive: plasma calibration,2200-01-17T08:00:00.000Z,2200-01-17T12:30:00.000Z,4.5,critical test
1/17/2200,Hydroponics,pH adjustment,Hydroponics: pH adjustment,2200-01-17T14:00:00.000Z,2200-01-17T15:30:00.000Z,1.5,
1/17/2200,CrewFitness,cardiovascular,CrewFitness: cardiovascular,2200-01-17T17:00:00.000Z,2200-01-17T18:30:00.000Z,1.5,
1/20/2200,WarpDrive,coil winding,WarpDrive: coil winding,2200-01-20T09:30:00.000Z,2200-01-20T13:30:00.000Z,4,
1/20/2200,StellarCartography,asteroid tracking,StellarCartography: asteroid tracking,2200-01-20T15:00:00.000Z,2200-01-20T16:45:00.000Z,1.75,
1/20/2200,CrewFitness,yoga session,CrewFitness: yoga session,2200-01-20T19:00:00.000Z,2200-01-20T20:00:00.000Z,1,test
Loading
Loading