Compare commits
10 Commits
6ef5cfff2d
...
28e3fd8658
Author | SHA1 | Date | |
---|---|---|---|
28e3fd8658 | |||
949888697d | |||
c702027a76 | |||
d8e8704a4a | |||
f492de825e | |||
87671dbd06 | |||
94d07d8ba5 | |||
2636127045 | |||
b690ffc51c | |||
e5b29f5a01 |
|
@ -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},
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
18
tests/test_myanimelist.py
Normal 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
|
Loading…
Reference in New Issue
Block a user