From 70b0ebcf0c039a83159b92c04d87afb6190527db Mon Sep 17 00:00:00 2001 From: Benjamin Mako Hill Date: Thu, 13 Aug 2026 11:58:12 -0700 Subject: [PATCH] make mediawiki-utilities an optional dependency -p legacy is the only thing that uses mediawiki-utilities, and it exists solely to reproduce numbers from research predating the mwxml and mwtypes split. The package is a 2015 monolith that also contains mw.database and mw.api, so it declares requests and pymysql unconditionally: every wikiq install pulled a MySQL client and six other packages to support one flag, building them from an sdist that has no wheel. Move it to a `legacy` extra. mw.lib.persistence imports nothing from mw.database or mw.api, so nothing about -p legacy changes for people who install the extra, and everyone else stops paying for it. Co-Authored-By: Claude Opus 5 (cherry picked from commit 66dcc6d8cea620a619fc19121b5c27a085b11991) --- pyproject.toml | 12 +++++++++++- src/wikiq/__init__.py | 20 +++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c30bcae..38d69e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,6 @@ readme = "README.md" requires-python = ">=3.9" dependencies = [ "deltas>=0.7.0", - "mediawiki-utilities>=0.4.18", "more-itertools>=10.7.0", "mwparserfromhell>=0.6.0", "mwpersistence>=0.2.4", @@ -18,6 +17,17 @@ dependencies = [ "yamlconf>=0.2.6", ] +# Two features carry dependencies that are awkward enough to install that they +# are kept out of the base install: -p legacy needs mediawiki-utilities, a 2015 +# package that also pulls in a MySQL client, and --diff and -p wikidiff2 need +# pywikidiff2, which compiles a C++ extension. Everything else, including the +# default -p sequence, works with neither. +[project.optional-dependencies] +legacy = ["mediawiki-utilities>=0.4.18"] +# A wikidiff2 extra belongs here too, but pywikidiff2 is not yet published to +# PyPI, so an extra naming it could not resolve. Until it is, wikiq reports the +# git install command when --diff or -p wikidiff2 is used without it. + [project.scripts] wikiq = "wikiq:main" diff --git a/src/wikiq/__init__.py b/src/wikiq/__init__.py index 0cd9dcc..10bc73c 100755 --- a/src/wikiq/__init__.py +++ b/src/wikiq/__init__.py @@ -67,6 +67,22 @@ def require_pywikidiff2(feature: str): return pywikidiff2 +def require_mw_persistence(): + """Import and return mw.lib.persistence, or exit explaining how to get it.""" + try: + from mw.lib import persistence + except ImportError: + raise SystemExit( + "-p legacy requires mediawiki-utilities, which wikiq no longer " + "installs by default.\n" + "Install it with:\n" + " pip install 'mediawiki-dump-tools[legacy]'\n" + "This method exists to reproduce results from older research " + "projects; -p sequence is the current equivalent." + ) + return persistence + + def pyarrow_type_to_spark(pa_type): """Convert a PyArrow type to Spark JSON schema format.""" if pa.types.is_int64(pa_type): @@ -845,7 +861,7 @@ class WikiqParser: wikidiff_matcher, revert_radius=PERSISTENCE_RADIUS ) else: - from mw.lib import persistence + persistence = require_mw_persistence() persist_state = persistence.State() # Pending persistence values waiting for window to fill @@ -1298,6 +1314,8 @@ def main(): require_pywikidiff2("--diff") if persist == PersistMethod.wikidiff2: require_pywikidiff2("-p wikidiff2") + elif persist == PersistMethod.legacy: + require_mw_persistence() if args.namespace_filter is not None: namespaces = args.namespace_filter