1212
1313import glob
1414import os
15+ import pathlib
16+ import re
1517import sys
1618import tempfile
1719
1820import nox
1921
22+
23+ def _pinned_python_version ():
24+ """Return the (major, minor) Python version pinned in ../.tool-versions, or None."""
25+ tool_versions = pathlib .Path (__file__ ).parent .parent / ".tool-versions"
26+ try :
27+ for line in tool_versions .read_text ().splitlines ():
28+ m = re .match (r"^python\s+(\d+)\.(\d+)" , line )
29+ if m :
30+ return (int (m .group (1 )), int (m .group (2 )))
31+ except OSError :
32+ pass
33+ return None
34+
35+
36+ _PINNED_PYTHON = _pinned_python_version ()
37+
2038# much faster than pip
2139nox .options .default_venv_backend = "uv"
2240
@@ -293,9 +311,6 @@ def test_otel_not_installed(session):
293311@nox .session ()
294312def pylint (session ):
295313 # pylint needs everything so we don't trigger missing import errors
296- # Skip on Python < 3.10 because some deps (like temporalio 1.19+) require 3.10+
297- if sys .version_info < (3 , 10 ):
298- session .skip ("pylint requires Python >= 3.10 for full dependency support" )
299314 session .install (".[all]" )
300315 session .install ("-r" , "requirements-dev.txt" )
301316 session .install (* VENDOR_PACKAGES )
@@ -311,6 +326,10 @@ def pylint(session):
311326 files = result .strip ().splitlines ()
312327 if not files :
313328 return
329+ # scripts/ may use APIs only available in the latest pinned Python version
330+ # (e.g. datetime.UTC requires 3.11+); skip them on older versions.
331+ if _PINNED_PYTHON and sys .version_info [:2 ] < _PINNED_PYTHON :
332+ files = [f for f in files if not f .startswith ("scripts/" )]
314333 session .run ("pylint" , "--errors-only" , * files )
315334
316335
0 commit comments