1
0

Compare commits

...

10 Commits

4 changed files with 79 additions and 11 deletions

View File

@ -187,13 +187,17 @@ class EventContent:
comment: str
def import_activity_sample_csv(
def import_activity_samples(
vault: ObsidianVault,
rows: Rows,
raw_samples: list[ActivitySample],
content_mapper,
group_category: str | None = None,
default_estimated_duration: datetime.timedelta | None = None,
) -> int:
samples = heuristically_realize_samples(list(iterate_samples_from_rows(rows)))
samples = heuristically_realize_samples(
raw_samples,
default_estimated_duration=default_estimated_duration,
)
if group_category is not None:
samples = merge_adjacent_samples(list(samples), group_category)
@ -208,7 +212,6 @@ def import_activity_sample_csv(
samples_per_date.setdefault(date, [])
samples_per_date[date].append(sample)
del date, sample
del rows
def map_to_event(sample: RealizedActivitySample) -> Event:
content = content_mapper(sample)
@ -233,6 +236,16 @@ def import_activity_sample_csv(
return num_updated
def import_activity_sample_csv(
vault: ObsidianVault,
rows: Rows,
content_mapper,
group_category: str | None = None,
) -> int:
raw_samples = list(iterate_samples_from_rows(rows))
return import_activity_samples(vault, raw_samples, content_mapper, group_category)
def map_watched_series_content(sample: RealizedActivitySample) -> EventContent:
subject = sample.single_label_with_category('series.name')
comment = '{} Episode {}: *{}*'.format(
@ -257,8 +270,42 @@ def map_games_played_content(sample: RealizedActivitySample) -> EventContent:
)
def import_wanikani_events(vault: ObsidianVault, rows: Rows):
keys = ['unlocked_at', 'started_at', 'passed_at', 'burned_at']
raw_samples = []
for row in rows:
for k in keys:
if k in row:
raw_samples.append(
ActivitySample(
[Label('application.name', 'WaniKani')],
None,
row[k],
),
)
del k
del row
def mapper(sample: RealizedActivitySample) -> EventContent:
subject = sample.single_label_with_category('application.name')
return EventContent(
verb='Practiced',
subject=subject,
comment='',
)
return import_activity_samples(
vault,
raw_samples,
mapper,
group_category='application.name',
default_estimated_duration=datetime.timedelta(minutes=5),
)
PATH_WATCHED = Path('output/show_episodes_watched.csv')
PATH_PLAYED = Path('output/games_played.csv')
PATH_WANIKANI = Path('output/wanikani_lessons.csv')
PATH_WORKOUT = Path('/home/jmaa/Notes/workout.csv')
PATH_STEP_COUNTS = Path(
'/home/jmaa/Notes/Rawbackupdata/Steps/exportStepCount_2025-03-15_22-58-20',
@ -267,6 +314,11 @@ PATH_STEPMANIA = Path('output/stepmania.csv')
IMPORTERS = [
{
'path': PATH_WANIKANI,
'standard_variant': True,
'import_rows': import_wanikani_events,
},
{'path': PATH_WORKOUT, 'standard_variant': True, 'import_rows': import_workout_csv},
{'path': PATH_STEP_COUNTS, 'import_rows': import_step_counts_csv},
{

View File

@ -47,6 +47,7 @@ class RealizedActivitySample(ActivitySample):
def heuristically_realize_samples(
samples: list[ActivitySample],
default_estimated_duration: datetime.timedelta | None = DEFAULT_ESTIMATED_DURATION,
) -> Iterator[RealizedActivitySample]:
"""Secret sauce.
@ -54,6 +55,9 @@ def heuristically_realize_samples(
* No samples overlap.
"""
if default_estimated_duration is None:
default_estimated_duration = DEFAULT_ESTIMATED_DURATION
samples.sort(key=lambda x: x.end_at)
previous_sample_end = None
@ -72,7 +76,7 @@ def heuristically_realize_samples(
start_at = sample.start_at
if start_at is None:
estimated_duration: datetime.timedelta = DEFAULT_ESTIMATED_DURATION
estimated_duration: datetime.timedelta = default_estimated_duration
start_at = max(previous_sample_end, end_at - estimated_duration)
del estimated_duration

View File

@ -69,12 +69,6 @@ def parse_name(text: str):
return match
assert parse_name('"Soundscape"')
assert parse_name('"Soundscape (サウンドスケープ)"').group(2) is not None
assert parse_name('1: "Soundscape"')
assert parse_name('2: "Soundscape (サウンドスケープ)"').group(2) is not None
def parse_songs(
tr_elements,
song_position: str,

18
tests/test_myanimelist.py Normal file
View File

@ -0,0 +1,18 @@
import pytest
from personal_data.fetchers.myanimelist import parse_name
@pytest.mark.parametrize(
'input_str, expected_group1, expected_group2',
[
('"Soundscape"', 'Soundscape', None),
('"Soundscape (サウンドスケープ)"', 'Soundscape', 'サウンドスケープ'),
('1: "Soundscape"', 'Soundscape', None),
('2: "Soundscape (サウンドスケープ)"', 'Soundscape', 'サウンドスケープ'),
],
)
def test_parse_name(input_str, expected_group1, expected_group2):
m = parse_name(input_str)
assert m.group(1) == expected_group1
assert m.group(2) == expected_group2