[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "applytrack-poller" version = "1.68.7" description = "Discovery poller for OSApplyTrack — fetches and scores remote job leads into shared Postgres." requires-python = ">=3.10" license = { text = "Apache-2.0" } authors = [{ name = "Aaron K. Clark" }] dependencies = [ "pyyaml>=6.0", "httpcore>=1.0,<2.0", "httpx>=0.27", "psycopg[binary]>=3.1", "defusedxml>=0.7", "cryptography>=42", ] [project.optional-dependencies] dev = ["ruff>=0.5", "mypy>=1.10", "pytest>=8.0", "types-PyYAML", "bandit>=1.7"] [project.scripts] applytrack = "applytrack.cli:main" [tool.hatch.build.targets.wheel] packages = ["src/applytrack"] [tool.ruff] line-length = 100 target-version = "py310" [tool.ruff.lint] select = ["E", "F", "I", "UP", "B", "SIM"] [tool.mypy] python_version = "3.10" strict = true ignore_missing_imports = true [tool.bandit] # Run as: bandit -c pyproject.toml -r src/applytrack # B608 (string-based SQL): every SQL builder here interpolates ONLY static, in-code # column-name tuples (_FIELD_COLUMNS / _PROFILE_COLUMNS) — never user input — and # binds all values as %(name)s parameters. False positive for this uniform pattern. # B112 (try/except/continue): deliberate per-item isolation in the poll loop — one bad # listing/feed must never abort the whole run (each site is also marked # noqa: BLE001). skips = ["B608", "B112"] [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-q" pythonpath = ["src"]