- Cloze card pipeline: 924 cards from 2,296 AI-vetted Hebrew book sentences - Plurals deck: 375 notes (144 irregular + 231 regular from 86 mishkal patterns) - Ktiv male forms expanded to 20,711 entries for sentence matching - Project reorg: helpers.py (deduped strip_nikkud from 10 files), scripts/ for one-off tools, tests/ with smoke tests, deleted 3 dead files - Lint tooling: pyproject.toml with ruff/vulture/bandit/pytest config, .editorconfig, fixed all 129 ruff errors (B023 closure fix, SIM103, unused vars) - validate_apkg.py: card count range check for optional cloze template - Data caches committed: vetted_sentences, ktiv_male_forms, noun_plurals, noun_slug_map, vocab_sentence_matches, epub_sentence_index Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
80 lines
1.9 KiB
TOML
80 lines
1.9 KiB
TOML
[project]
|
|
name = "hebrew-flash-cards"
|
|
version = "0.13"
|
|
description = "Hebrew vocabulary & verb conjugation flashcards for Anki"
|
|
requires-python = ">=3.11"
|
|
dependencies = [
|
|
"beautifulsoup4>=4.11.0",
|
|
"genanki>=0.8.0",
|
|
"lxml>=4.9.0",
|
|
"numpy>=1.21.0",
|
|
"pandas>=1.3.0",
|
|
"pymupdf>=1.23.0",
|
|
"pypdf>=3.0.0",
|
|
"python-bidi>=0.4.2",
|
|
"requests>=2.26.0",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"bandit",
|
|
"pytest",
|
|
"ruff",
|
|
"vulture",
|
|
]
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
|
|
[tool.ruff]
|
|
target-version = "py311"
|
|
line-length = 120
|
|
exclude = [
|
|
"lib/",
|
|
"bin/",
|
|
"include/",
|
|
"lib64/",
|
|
"archive/",
|
|
"venv/",
|
|
]
|
|
|
|
[tool.ruff.lint]
|
|
select = [
|
|
"E", # pycodestyle errors
|
|
"W", # pycodestyle warnings
|
|
"F", # pyflakes
|
|
"I", # isort
|
|
"UP", # pyupgrade
|
|
"B", # flake8-bugbear
|
|
"SIM", # flake8-simplify
|
|
"PIE", # flake8-pie
|
|
"T20", # flake8-print (flag print statements)
|
|
"RET", # flake8-return
|
|
"C4", # flake8-comprehensions
|
|
"S", # flake8-bandit (security)
|
|
]
|
|
ignore = [
|
|
"T201", # allow print() — this is a CLI tool, not a library
|
|
"S603", # subprocess call with shell=False is fine
|
|
"S607", # partial executable path is fine for CLI tools
|
|
"S105", # PASS = "✓" is not a password
|
|
"S108", # /tmp paths are intentional for temp downloads
|
|
"S311", # random.Random() is for card ordering, not crypto
|
|
"E501", # line too long — handled by formatter
|
|
]
|
|
|
|
[tool.ruff.lint.per-file-ignores]
|
|
"test_*.py" = ["S101"] # allow assert in tests
|
|
|
|
[tool.ruff.format]
|
|
quote-style = "double"
|
|
indent-style = "space"
|
|
|
|
[tool.vulture]
|
|
paths = ["."]
|
|
exclude = ["lib/", "bin/", "include/", "lib64/", "venv/", "archive/"]
|
|
min_confidence = 80
|
|
|
|
[tool.bandit]
|
|
exclude_dirs = ["lib", "bin", "include", "lib64", "venv", "archive"]
|
|
skips = ["B101"] # allow assert
|