Skip to content

Commit

Permalink
Move dep_util to _modified and mark dep_util as deprecated.
Browse files Browse the repository at this point in the history
  • Loading branch information
jaraco committed Nov 5, 2023
1 parent 5deb5ac commit 9494203
Show file tree
Hide file tree
Showing 11 changed files with 89 additions and 75 deletions.
68 changes: 68 additions & 0 deletions distutils/_modified.py
Original file line number Diff line number Diff line change
@@ -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)
)
2 changes: 1 addition & 1 deletion distutils/bcppcompiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down
2 changes: 1 addition & 1 deletion distutils/ccompiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions distutils/cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion distutils/command/build_ext.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion distutils/command/build_scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
74 changes: 10 additions & 64 deletions distutils/dep_util.py
Original file line number Diff line number Diff line change
@@ -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)
2 changes: 1 addition & 1 deletion distutils/file_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion distutils/unixccompiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion distutils/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit 9494203

Please sign in to comment.