mirror of
https://github.com/domainaware/parsedmarc.git
synced 2026-08-15 03:43:27 +00:00
CI installs the [build] extra fresh on every run, and ruff was the one lint tool left unpinned. ruff 0.16.0 (released this week) began flagging this codebase's str.format() house style, so every PR started failing lint on lines it never touched. Pin to 0.15.21 — the version the codebase is clean under — with the same bump-deliberately comment pyright carries. Upgrading to 0.16 and converting to f-strings can be its own PR. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
175 lines
6.1 KiB
TOML
175 lines
6.1 KiB
TOML
[build-system]
|
|
requires = [
|
|
"hatchling>=1.27.0",
|
|
]
|
|
requires_python = ">=3.10,<3.15"
|
|
build-backend = "hatchling.build"
|
|
|
|
[project]
|
|
name = "parsedmarc"
|
|
dynamic = [
|
|
"version",
|
|
]
|
|
description = "A Python package and CLI for parsing aggregate, failure, and SMTP TLS DMARC reports"
|
|
readme = "README.md"
|
|
license = "Apache-2.0"
|
|
authors = [
|
|
{ name = "Sean Whalen", email = "whalenster@gmail.com" },
|
|
]
|
|
keywords = [
|
|
"DMARC",
|
|
"parser",
|
|
"reporting",
|
|
]
|
|
classifiers = [
|
|
"Development Status :: 5 - Production/Stable",
|
|
"Intended Audience :: Developers",
|
|
"Intended Audience :: Information Technology",
|
|
"License :: OSI Approved :: Apache Software License",
|
|
"Operating System :: OS Independent",
|
|
"Programming Language :: Python :: 3",
|
|
"Programming Language :: Python :: 3 :: Only",
|
|
"Programming Language :: Python :: 3.10",
|
|
"Programming Language :: Python :: 3.11",
|
|
"Programming Language :: Python :: 3.12",
|
|
"Programming Language :: Python :: 3.13",
|
|
"Programming Language :: Python :: 3.14",
|
|
]
|
|
requires-python = ">=3.10"
|
|
dependencies = [
|
|
"azure-identity>=1.8.0",
|
|
"azure-monitor-ingestion>=1.0.0",
|
|
"boto3>=1.16.63",
|
|
"dateparser>=1.1.1",
|
|
"dnspython>=2.0.0",
|
|
"elasticsearch>=8.18,<9",
|
|
"expiringdict>=1.1.4",
|
|
# The runtime HTTP library (utils.py fetches, webhook and Splunk HEC
|
|
# clients, Graph error handling in cli.py). The floor matches
|
|
# microsoft-kiota-http's own requirement.
|
|
"httpx>=0.25",
|
|
"kafka-python>=2.3.2",
|
|
"lxml>=4.4.0",
|
|
"mailsuite[gmail,msgraph]>=2.2.2",
|
|
"maxminddb>=2.0.0",
|
|
# Imported directly in cli.py for Graph error handling; otherwise
|
|
# only a transitive dep of mailsuite[msgraph] -> msgraph-sdk.
|
|
"microsoft-kiota-abstractions>=1.8.0",
|
|
"opensearch-py>=2.4.2,<=4.0.0",
|
|
"publicsuffixlist>=0.10.0",
|
|
"pygelf>=0.4.2",
|
|
"tqdm>=4.31.1",
|
|
"xmltodict>=0.12.0",
|
|
"PyYAML>=6.0.3"
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
postgresql = [
|
|
# Optional output backend. psycopg ships prebuilt binary wheels via the
|
|
# [binary] extra, but those wheels don't exist for every platform/arch,
|
|
# so PostgreSQL support is opt-in rather than a mandatory dependency.
|
|
"psycopg[binary]>=3.1.0",
|
|
]
|
|
build = [
|
|
# Used only by maintainer tooling under parsedmarc/resources/maps/ —
|
|
# `collect_domain_info.py --use-search-fallback` falls back to a
|
|
# DuckDuckGo search when the homepage fetch returns a bot-block / parked
|
|
# / empty page. Optional import; the script runs without it as long as
|
|
# the fallback flag isn't passed.
|
|
"ddgs>=9.0.0",
|
|
"hatch>=1.14.0",
|
|
"myst-parser[linkify]",
|
|
"nose",
|
|
# Pinned exactly: pyright's checks evolve between releases, so an
|
|
# unpinned version could break CI without any code change. Bump
|
|
# deliberately (and fix any new findings) rather than implicitly.
|
|
"pyright==1.1.410",
|
|
"pytest",
|
|
"pytest-cov",
|
|
# Used only by the out-of-wheel maintainer script
|
|
# parsedmarc/resources/maps/collect_domain_info.py, which deliberately
|
|
# stays on requests because its permissive-TLS fallback is built on
|
|
# urllib3's HTTPAdapter machinery.
|
|
"requests>=2.22.0",
|
|
# Pinned exactly for the same reason as pyright: ruff's default rule
|
|
# set evolves between releases (0.16.0 began flagging this codebase's
|
|
# str.format() style), so an unpinned version breaks CI without any
|
|
# code change. Bump deliberately and fix any new findings in the same
|
|
# PR as the bump.
|
|
"ruff==0.15.21",
|
|
"sphinx",
|
|
"sphinx_rtd_theme",
|
|
]
|
|
|
|
[project.scripts]
|
|
parsedmarc = "parsedmarc.cli:_main"
|
|
|
|
[project.urls]
|
|
Homepage = "https://domainaware.github.io/parsedmarc"
|
|
|
|
[tool.hatch.version]
|
|
path = "parsedmarc/constants.py"
|
|
|
|
[tool.hatch.build.targets.sdist]
|
|
include = [
|
|
"/parsedmarc",
|
|
]
|
|
|
|
[tool.hatch.build]
|
|
exclude = [
|
|
"base_reverse_dns.csv",
|
|
"unknown_base_reverse_dns.csv",
|
|
"README.md",
|
|
"AGENTS.md",
|
|
"CLAUDE.md",
|
|
"*.bak",
|
|
# Maintenance tooling: any Python file under parsedmarc/resources/maps/
|
|
# whose name doesn't start with `_` (i.e. everything except __init__.py,
|
|
# which must keep shipping for `importlib.resources.files()` lookups).
|
|
"parsedmarc/resources/maps/[!_]*.py",
|
|
]
|
|
|
|
[tool.ruff.lint]
|
|
# Enforce modern type-hint syntax on top of ruff's default rules. With
|
|
# requires-python >=3.10, PEP 585 builtins (list[int]) and PEP 604 unions
|
|
# (X | Y, X | None) are available, so keep the deprecated typing.List /
|
|
# Union / Optional spellings out of the codebase.
|
|
extend-select = [
|
|
"UP006", # non-pep585-annotation: List -> list, Dict -> dict
|
|
"UP007", # non-pep604-annotation-union: Union[X, Y] -> X | Y
|
|
"UP035", # deprecated-import: typing.List etc. / typing -> collections.abc
|
|
"UP045", # non-pep604-annotation-optional: Optional[X] -> X | None
|
|
]
|
|
|
|
[tool.pyright]
|
|
# The whole codebase passes pyright with zero errors and warnings; CI
|
|
# enforces this (see .github/workflows/python-tests.yml). Run locally with
|
|
# `pyright` from the repo root. Requires the [postgresql] extra to be
|
|
# installed so the optional psycopg import in parsedmarc/postgres.py
|
|
# resolves.
|
|
include = ["parsedmarc", "tests", "docs"]
|
|
typeCheckingMode = "standard"
|
|
|
|
[tool.pytest.ini_options]
|
|
# Default to the per-module test layout under tests/. New tests should go
|
|
# into tests/test_<module>.py to match the file they exercise; do not
|
|
# reintroduce a monolithic tests.py.
|
|
testpaths = ["tests"]
|
|
|
|
[tool.coverage.run]
|
|
# Coverage measures shipped code only. Master's reported ≈66.9% on
|
|
# Codecov was an artefact of the old monolithic tests.py having no
|
|
# [tool.coverage.run] block, which let coverage's default behaviour
|
|
# measure every file imported during the run — including the test file
|
|
# itself at ~99% "covered". That inflated the headline by ~8 percentage
|
|
# points without any actual testing signal. Restricting to the parsedmarc
|
|
# package gives a meaningful number that tracks how much of the shipped
|
|
# library the test suite actually exercises.
|
|
source = ["parsedmarc"]
|
|
# Maintainer-only batch scripts under parsedmarc/resources/maps/ ship
|
|
# out of the wheel (see the [tool.hatch.build] exclude block above) —
|
|
# omit them so the headline number reflects only installed library code.
|
|
omit = [
|
|
"*/parsedmarc/resources/maps/*.py",
|
|
]
|