hebrew_flash_cards/pyproject.toml
Sochen 17f7458d19 Sprint 9: cloze cards, plurals deck, project reorg, lint tooling
- 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>
2026-03-07 08:09:39 +00:00

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