From 94942032878d431cee55adaab12a8bd83549a833 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sun, 5 Nov 2023 05:59:02 -0500 Subject: [PATCH] Move dep_util to _modified and mark dep_util as deprecated. --- distutils/_modified.py | 68 +++++++++++++++++ distutils/bcppcompiler.py | 2 +- distutils/ccompiler.py | 2 +- distutils/cmd.py | 4 +- distutils/command/build_ext.py | 2 +- distutils/command/build_scripts.py | 2 +- distutils/dep_util.py | 74 +++---------------- distutils/file_util.py | 2 +- .../{test_dep_util.py => test_modified.py} | 4 +- distutils/unixccompiler.py | 2 +- distutils/util.py | 2 +- 11 files changed, 89 insertions(+), 75 deletions(-) create mode 100644 distutils/_modified.py rename distutils/tests/{test_dep_util.py => test_modified.py} (96%) diff --git a/distutils/_modified.py b/distutils/_modified.py new file mode 100644 index 00000000..18a4f2b2 --- /dev/null +++ b/distutils/_modified.py @@ -0,0 +1,68 @@ +"""Timestamp comparison of files and groups of files.""" + +import os.path + +from .errors import DistutilsFileError +from .py39compat import zip_strict +from ._functools import splat + + +def _newer(source, target): + return not os.path.exists(target) or ( + os.path.getmtime(source) > os.path.getmtime(target) + ) + + +def newer(source, target): + """ + Is source modified more recently than target. + + Returns True if 'source' is modified more recently than + 'target' or if 'target' does not exist. + + Raises DistutilsFileError if 'source' does not exist. + """ + if not os.path.exists(source): + raise DistutilsFileError("file '%s' does not exist" % os.path.abspath(source)) + + return _newer(source, target) + + +def newer_pairwise(sources, targets): + """ + Filter filenames where sources are newer than targets. + + Walk two filename iterables in parallel, testing if each source is newer + than its corresponding target. Returns a pair of lists (sources, + targets) where source is newer than target, according to the semantics + of 'newer()'. + """ + newer_pairs = filter(splat(newer), zip_strict(sources, targets)) + return tuple(map(list, zip(*newer_pairs))) + + +def newer_group(sources, target, missing='error'): + """ + Is target out-of-date with respect to any file in sources. + + Return True if 'target' is out-of-date with respect to any file + listed in 'sources'. In other words, if 'target' exists and is newer + than every file in 'sources', return False; otherwise return True. + ``missing`` controls how to handle a missing source file: + + - error (default): allow the ``stat()`` call to fail. + - ignore: silently disregard any missing source files. + - newer: treat missing source files as "target out of date". This + mode is handy in "dry-run" mode: it will pretend to carry out + commands that wouldn't work because inputs are missing, but + that doesn't matter because dry-run won't run the commands. + """ + + def missing_as_newer(source): + return missing == 'newer' and not os.path.exists(source) + + ignored = os.path.exists if missing == 'ignore' else None + return any( + missing_as_newer(source) or _newer(source, target) + for source in filter(ignored, sources) + ) diff --git a/distutils/bcppcompiler.py b/distutils/bcppcompiler.py index ba45ea2b..3c2ba154 100644 --- a/distutils/bcppcompiler.py +++ b/distutils/bcppcompiler.py @@ -24,7 +24,7 @@ ) from .ccompiler import CCompiler, gen_preprocess_options from .file_util import write_file -from .dep_util import newer +from ._modified import newer from ._log import log diff --git a/distutils/ccompiler.py b/distutils/ccompiler.py index 1818fce9..c1c7d547 100644 --- a/distutils/ccompiler.py +++ b/distutils/ccompiler.py @@ -18,7 +18,7 @@ from .spawn import spawn from .file_util import move_file from .dir_util import mkpath -from .dep_util import newer_group +from ._modified import newer_group from .util import split_quoted, execute from ._log import log diff --git a/distutils/cmd.py b/distutils/cmd.py index 3860c3ff..8fdcbc0e 100644 --- a/distutils/cmd.py +++ b/distutils/cmd.py @@ -10,7 +10,7 @@ import logging from .errors import DistutilsOptionError -from . import util, dir_util, file_util, archive_util, dep_util +from . import util, dir_util, file_util, archive_util, _modified from ._log import log @@ -428,7 +428,7 @@ def make_file( # If 'outfile' must be regenerated (either because it doesn't # exist, is out-of-date, or the 'force' flag is true) then # perform the action that presumably regenerates it - if self.force or dep_util.newer_group(infiles, outfile): + if self.force or _modified.newer_group(infiles, outfile): self.execute(func, args, exec_msg, level) # Otherwise, print the "skip" message else: diff --git a/distutils/command/build_ext.py b/distutils/command/build_ext.py index fbeec342..b48f4626 100644 --- a/distutils/command/build_ext.py +++ b/distutils/command/build_ext.py @@ -19,7 +19,7 @@ ) from ..sysconfig import customize_compiler, get_python_version from ..sysconfig import get_config_h_filename -from ..dep_util import newer_group +from .._modified import newer_group from ..extension import Extension from ..util import get_platform from distutils._log import log diff --git a/distutils/command/build_scripts.py b/distutils/command/build_scripts.py index ce222f1e..1a4d67f4 100644 --- a/distutils/command/build_scripts.py +++ b/distutils/command/build_scripts.py @@ -7,7 +7,7 @@ from stat import ST_MODE from distutils import sysconfig from ..core import Command -from ..dep_util import newer +from .._modified import newer from ..util import convert_path from distutils._log import log import tokenize diff --git a/distutils/dep_util.py b/distutils/dep_util.py index 18a4f2b2..09a8a2e1 100644 --- a/distutils/dep_util.py +++ b/distutils/dep_util.py @@ -1,68 +1,14 @@ -"""Timestamp comparison of files and groups of files.""" +import warnings -import os.path +from . import _modified -from .errors import DistutilsFileError -from .py39compat import zip_strict -from ._functools import splat - -def _newer(source, target): - return not os.path.exists(target) or ( - os.path.getmtime(source) > os.path.getmtime(target) - ) - - -def newer(source, target): - """ - Is source modified more recently than target. - - Returns True if 'source' is modified more recently than - 'target' or if 'target' does not exist. - - Raises DistutilsFileError if 'source' does not exist. - """ - if not os.path.exists(source): - raise DistutilsFileError("file '%s' does not exist" % os.path.abspath(source)) - - return _newer(source, target) - - -def newer_pairwise(sources, targets): - """ - Filter filenames where sources are newer than targets. - - Walk two filename iterables in parallel, testing if each source is newer - than its corresponding target. Returns a pair of lists (sources, - targets) where source is newer than target, according to the semantics - of 'newer()'. - """ - newer_pairs = filter(splat(newer), zip_strict(sources, targets)) - return tuple(map(list, zip(*newer_pairs))) - - -def newer_group(sources, target, missing='error'): - """ - Is target out-of-date with respect to any file in sources. - - Return True if 'target' is out-of-date with respect to any file - listed in 'sources'. In other words, if 'target' exists and is newer - than every file in 'sources', return False; otherwise return True. - ``missing`` controls how to handle a missing source file: - - - error (default): allow the ``stat()`` call to fail. - - ignore: silently disregard any missing source files. - - newer: treat missing source files as "target out of date". This - mode is handy in "dry-run" mode: it will pretend to carry out - commands that wouldn't work because inputs are missing, but - that doesn't matter because dry-run won't run the commands. - """ - - def missing_as_newer(source): - return missing == 'newer' and not os.path.exists(source) - - ignored = os.path.exists if missing == 'ignore' else None - return any( - missing_as_newer(source) or _newer(source, target) - for source in filter(ignored, sources) +def __getattr__(name): + if name not in ['newer', 'newer_group', 'newer_pairwise']: + raise AttributeError(name) + warnings.warn( + "dep_util is Deprecated. Use functions from setuptools instead.", + DeprecationWarning, + stacklevel=2, ) + return getattr(_modified, name) diff --git a/distutils/file_util.py b/distutils/file_util.py index 7c699066..3f3e21b5 100644 --- a/distutils/file_util.py +++ b/distutils/file_util.py @@ -108,7 +108,7 @@ def copy_file( # noqa: C901 # changing it (ie. it's not already a hard/soft link to src OR # (not update) and (src newer than dst). - from distutils.dep_util import newer + from distutils._modified import newer from stat import ST_ATIME, ST_MTIME, ST_MODE, S_IMODE if not os.path.isfile(src): diff --git a/distutils/tests/test_dep_util.py b/distutils/tests/test_modified.py similarity index 96% rename from distutils/tests/test_dep_util.py rename to distutils/tests/test_modified.py index 759772d2..eae7a7fa 100644 --- a/distutils/tests/test_dep_util.py +++ b/distutils/tests/test_modified.py @@ -1,7 +1,7 @@ -"""Tests for distutils.dep_util.""" +"""Tests for distutils._modified.""" import os -from distutils.dep_util import newer, newer_pairwise, newer_group +from distutils._modified import newer, newer_pairwise, newer_group from distutils.errors import DistutilsFileError from distutils.tests import support import pytest diff --git a/distutils/unixccompiler.py b/distutils/unixccompiler.py index 6ca2332a..bd8db9ac 100644 --- a/distutils/unixccompiler.py +++ b/distutils/unixccompiler.py @@ -20,7 +20,7 @@ import itertools from . import sysconfig -from .dep_util import newer +from ._modified import newer from .ccompiler import CCompiler, gen_preprocess_options, gen_lib_options from .errors import DistutilsExecError, CompileError, LibError, LinkError from ._log import log diff --git a/distutils/util.py b/distutils/util.py index 7ef47176..7ae914f7 100644 --- a/distutils/util.py +++ b/distutils/util.py @@ -14,7 +14,7 @@ import functools from .errors import DistutilsPlatformError, DistutilsByteCompileError -from .dep_util import newer +from ._modified import newer from .spawn import spawn from ._log import log