From b89ad2e6e9103aa74e9586ad3b68b61fd2ffb21c Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Thu, 5 Sep 2024 10:59:16 +0100 Subject: [PATCH 1/3] Support Path objects in write_if_different and import_file --- extension_helpers/_utils.py | 28 +++++++++++++---------- extension_helpers/tests/test_utils.py | 32 +++++++++++++++++---------- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/extension_helpers/_utils.py b/extension_helpers/_utils.py index f618baa..b2f48ac 100644 --- a/extension_helpers/_utils.py +++ b/extension_helpers/_utils.py @@ -4,6 +4,7 @@ import sys from importlib import machinery as import_machinery from importlib.util import module_from_spec, spec_from_file_location +from pathlib import Path __all__ = ["write_if_different", "import_file"] @@ -77,7 +78,7 @@ def walk_skip_hidden(top, onerror=None, followlinks=False): yield root, dirs, files -def write_if_different(filename, data): +def write_if_different(filepath, data): """ Write ``data`` to ``filename``, if the content of the file is different. @@ -86,26 +87,28 @@ def write_if_different(filename, data): Parameters ---------- - filename : str + filepath : str or `pathlib.Path` The file name to be written to. data : bytes The data to be written to ``filename``. """ + filepath = Path(filepath) + assert isinstance(data, bytes) - if os.path.exists(filename): - with open(filename, "rb") as fd: + if filepath.exists(): + with open(filepath, "rb") as fd: original_data = fd.read() else: original_data = None if original_data != data: - with open(filename, "wb") as fd: + with open(filepath, "wb") as fd: fd.write(data) -def import_file(filename, name=None): +def import_file(filepath, name=None): """ Imports a module from a single file without importing the package that the file is in. @@ -123,15 +126,16 @@ def import_file(filename, name=None): # be unique, and it doesn't really matter because the name isn't # used directly here anyway. + filepath = Path(filepath) + if name is None: - basename = os.path.splitext(filename)[0] - name = "_".join(os.path.abspath(basename).split(os.sep)[1:]) + name = "_".join(filepath.resolve().with_suffix("").parts[1:]) - if not os.path.exists(filename): - raise ImportError(f"Could not import file {filename}") + if not filepath.exists(): + raise ImportError(f"Could not import file {filepath}") - loader = import_machinery.SourceFileLoader(name, filename) - spec = spec_from_file_location(name, filename) + loader = import_machinery.SourceFileLoader(name, str(filepath)) + spec = spec_from_file_location(name, str(filepath)) mod = module_from_spec(spec) loader.exec_module(mod) diff --git a/extension_helpers/tests/test_utils.py b/extension_helpers/tests/test_utils.py index 983edc0..6d9aa2e 100644 --- a/extension_helpers/tests/test_utils.py +++ b/extension_helpers/tests/test_utils.py @@ -1,26 +1,34 @@ import os import time +import pytest + from .._utils import import_file, write_if_different -def test_import_file(tmp_path): - filename = str(tmp_path / "spam.py") - with open(filename, "w") as f: +@pytest.mark.parametrize("path_type", ("str", "path")) +def test_import_file(tmp_path, path_type): + filepath = tmp_path / "spam.py" + if path_type == "str": + filepath = str(filepath) + with open(filepath, "w") as f: f.write("magic = 12345") - module = import_file(filename) + module = import_file(filepath) assert module.magic == 12345 -def test_write_if_different(tmp_path): - filename = str(tmp_path / "test.txt") - write_if_different(filename, b"abc") - time1 = os.path.getmtime(filename) +@pytest.mark.parametrize("path_type", ("str", "path")) +def test_write_if_different(tmp_path, path_type): + filepath = tmp_path / "test.txt" + if path_type == "str": + filepath = str(filepath) + write_if_different(filepath, b"abc") + time1 = os.path.getmtime(filepath) time.sleep(0.01) - write_if_different(filename, b"abc") - time2 = os.path.getmtime(filename) + write_if_different(filepath, b"abc") + time2 = os.path.getmtime(filepath) assert time2 == time1 time.sleep(0.01) - write_if_different(filename, b"abcd") - time3 = os.path.getmtime(filename) + write_if_different(filepath, b"abcd") + time3 = os.path.getmtime(filepath) assert time3 > time1 From 6ddc98470b0b2ad8dc8c10d62402db8446582e3e Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Thu, 5 Sep 2024 11:03:57 +0100 Subject: [PATCH 2/3] Simplify reading/writing of bytes --- extension_helpers/_utils.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/extension_helpers/_utils.py b/extension_helpers/_utils.py index b2f48ac..c4505ed 100644 --- a/extension_helpers/_utils.py +++ b/extension_helpers/_utils.py @@ -98,14 +98,12 @@ def write_if_different(filepath, data): assert isinstance(data, bytes) if filepath.exists(): - with open(filepath, "rb") as fd: - original_data = fd.read() + original_data = filepath.read_bytes() else: original_data = None if original_data != data: - with open(filepath, "wb") as fd: - fd.write(data) + filepath.write_bytes(data) def import_file(filepath, name=None): From c5c51ff2ce4af4ed7408cb3e98caba8dbffc5491 Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Thu, 5 Sep 2024 15:02:03 +0100 Subject: [PATCH 3/3] Preserve filename argument name --- extension_helpers/_utils.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/extension_helpers/_utils.py b/extension_helpers/_utils.py index c4505ed..42d1632 100644 --- a/extension_helpers/_utils.py +++ b/extension_helpers/_utils.py @@ -78,7 +78,7 @@ def walk_skip_hidden(top, onerror=None, followlinks=False): yield root, dirs, files -def write_if_different(filepath, data): +def write_if_different(filename, data): """ Write ``data`` to ``filename``, if the content of the file is different. @@ -87,13 +87,13 @@ def write_if_different(filepath, data): Parameters ---------- - filepath : str or `pathlib.Path` + filename : str or `pathlib.Path` The file name to be written to. data : bytes The data to be written to ``filename``. """ - filepath = Path(filepath) + filepath = Path(filename) assert isinstance(data, bytes) @@ -106,7 +106,7 @@ def write_if_different(filepath, data): filepath.write_bytes(data) -def import_file(filepath, name=None): +def import_file(filename, name=None): """ Imports a module from a single file without importing the package that the file is in. @@ -124,7 +124,7 @@ def import_file(filepath, name=None): # be unique, and it doesn't really matter because the name isn't # used directly here anyway. - filepath = Path(filepath) + filepath = Path(filename) if name is None: name = "_".join(filepath.resolve().with_suffix("").parts[1:])