Skip to content

Commit

Permalink
Add support for additional non-burnt Kanji
Browse files Browse the repository at this point in the history
This will let me use WaniKani's data for additional Kanji I learn in
class.
  • Loading branch information
rouge8 committed Oct 30, 2023
1 parent e6e97fa commit c537a43
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 4 deletions.
17 changes: 16 additions & 1 deletion src/wanikani_burnt_kanji_to_anki/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,14 @@ def cli(ctx: click.Context, wanikani_api_key: str) -> None:


@cli.command()
@click.option("--additional-kanji", type=click.File("r"))
@click.argument("output", type=click.File("w"), default="-")
@click.pass_context
def csv(ctx: click.Context, output: io.TextIOWrapper) -> None:
def csv(
ctx: click.Context,
additional_kanji: io.TextIOWrapper | None,
output: io.TextIOWrapper,
) -> None:
"""
Write your burnt Kanji to a CSV suitable for import by Anki
Expand All @@ -41,6 +46,16 @@ def csv(ctx: click.Context, output: io.TextIOWrapper) -> None:
)
writer.writerow(row)

if additional_kanji is not None:
for line in additional_kanji:
kanji = ctx.obj.api.get_kanji(line.strip())
row = (
kanji.characters,
", ".join(kanji.meanings),
", ".join(kanji.readings),
)
writer.writerow(row)


if __name__ == "__main__":
cli()
11 changes: 11 additions & 0 deletions src/wanikani_burnt_kanji_to_anki/wanikani.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,3 +105,14 @@ def burnt_kanji(self) -> Iterable[Kanji]:
{"subject_types": "kanji", "burned": "true", "hidden": "false"},
):
yield _KANJI[assignment["data"]["subject_id"]]

def get_kanji(self, kanji: str) -> Kanji:
"""
Look up an individual Kanji.
Must be called after loading the Kanji data into memory with
:meth:`~.load_kanji`.
"""
return next( # pragma: no branch
k for k in _KANJI.values() if k.characters == kanji
)
26 changes: 23 additions & 3 deletions tests/test_main.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import csv
from functools import partial
import io
from pathlib import Path

from click.testing import CliRunner
from click.testing import Result
Expand All @@ -17,21 +18,40 @@ def cli() -> partial[Result]:
return partial(CliRunner(mix_stderr=False).invoke, cli, catch_exceptions=False)


def test_csv(cli: partial[Result], mocker: MockerFixture) -> None:
@pytest.mark.parametrize("has_additional_kanji", [True, False])
def test_csv(
has_additional_kanji: bool,
cli: partial[Result],
mocker: MockerFixture,
tmp_path: Path,
) -> None:
expected_kanji = KanjiFactory.build_batch(5)

if has_additional_kanji:
additional_kanji = KanjiFactory.create_batch(2)
additional_kanji_file = tmp_path / "more-kanji.txt"
with open(additional_kanji_file, "w") as f:
for kanji in additional_kanji:
print(kanji.characters, file=f)
else:
additional_kanji = []

mocker.patch("wanikani_burnt_kanji_to_anki.wanikani.WaniKaniAPIClient.load_kanji")
mocker.patch(
"wanikani_burnt_kanji_to_anki.wanikani.WaniKaniAPIClient.burnt_kanji",
return_value=expected_kanji,
)

result = cli(["--wanikani-api-key=fake-key", "csv"])
args = ["--wanikani-api-key=fake-key", "csv"]
if has_additional_kanji:
args += ["--additional-kanji", str(additional_kanji_file)]

result = cli(args)

assert result.exit_code == 0

reader = csv.reader(io.StringIO(result.stdout))
assert list(reader) == [
[kanji.characters, ", ".join(kanji.meanings), ", ".join(kanji.readings)]
for kanji in expected_kanji
for kanji in expected_kanji + additional_kanji
]
6 changes: 6 additions & 0 deletions tests/test_wanikani.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,9 @@ def test_burnt_kanji(
)

assert list(api_client.burnt_kanji()) == expected_kanji

def test_get_kanji(self, api_client: WaniKaniAPIClient) -> None:
random_kanji = KanjiFactory.create_batch(5)

for kanji in random_kanji:
assert api_client.get_kanji(kanji.characters) == kanji

0 comments on commit c537a43

Please sign in to comment.