Source: yarsync
Version: 0.2.1-3
Severity: normal
User: debian-pyt...@lists.debian.org
Usertags: python3.13

This package failed build from source when test-built against a version of
python3-defaults that includes 3.13 as a supported version.

To reproduce this issue, build against python3-defaults (python3-all-dev etc.)
from Debian experimental.

What's new in Python 3.13:
https://docs.python.org/3.13/whatsnew/3.13.html

Log snippet:

I: pybuild base:311: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build; 
python3.13 -m pytest --ignore=tests/test_clone.py --ignore=tests/test_status.py
============================= test session starts ==============================
platform linux -- Python 3.13.0rc2, pytest-8.3.3, pluggy-1.5.0
rootdir: /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build
configfile: pytest.ini
plugins: typeguard-4.3.0, cov-5.0.0, mock-3.14.0
collected 31 items

tests/test_commit.py F.....                                              [ 19%]
tests/test_env_vars.py .                                                 [ 22%]
tests/test_init.py FF.                                                   [ 32%]
tests/test_log.py ....                                                   [ 45%]
tests/test_pull_push.py ......                                           [ 64%]
tests/test_remote.py .                                                   [ 67%]
tests/test_sync.py ..                                                    [ 74%]
tests/test_ys_helpers.py ........                                        [100%]

=================================== FAILURES ===================================
_________________________________ test_commit __________________________________

mocker = <pytest_mock.plugin.MockerFixture object at 0xffffaccd63c0>

    def test_commit(mocker):
        """Test commit creation and logging."""
        os.chdir(TEST_DIR_EMPTY)
    
        # important that it goes before patches, need normal initialization
        commit_msg = "initial commit"
        args = ["yarsync", "commit", "-m", commit_msg]
        # we initialize ys here, but don't create a commit.
        ys = YARsync(args)
    
        # time.localtime uses time.time
        time_3 = time.localtime(3)
        def loctime(sec=None):
            return time_3
        mocker.patch("time.localtime", loctime)
        # hope this will work in another time zone.
        mocker.patch("time.tzname", "MSK")
        # time.time is called a slight instant after time.localtime
        # their order is not important though.
        commit_time = 2
        mocker.patch("time.time", lambda: commit_time)
        rename = mocker.patch("os.rename")
        mkdir = mocker.patch("os.mkdir")
        mocker.patch("socket.gethostname", lambda: "host")
        mocker.patch("getpass.getuser", lambda: "user")
    
        m = mocker.mock_open()
        # adapted from https://stackoverflow.com/a/38618056/952234
        def my_open(filename, mode="r"):
            if mode != "r":
                return m.return_value
    
            if filename == ys.REPOFILE:
                content = "myhost"
            else:
                raise FileNotFoundError(filename)
            file_object = mocker.mock_open(read_data=content).return_value
            file_object.__iter__.return_value = content.splitlines(True)
            return file_object
    
        mocker.patch("builtins.open", new=my_open)
    
        popen = mocker.patch("subprocess.Popen")
        subprocess_mock = mocker.Mock()
        attrs = {'communicate.return_value': ('output', 'error')}
        subprocess_mock.configure_mock(**attrs)
        subprocess_mock.configure_mock(**{"returncode": 0})
        popen.return_value = subprocess_mock
    
        commit_name = str(int(commit_time))
        commit_dir = os.path.join(ys.COMMITDIR, commit_name)
        commit_dir_tmp = commit_dir + "_tmp"
        commit_log_path = os.path.join(ys.LOGDIR, commit_name + ".txt")
        commit_time_str = time.strftime(ys.DATEFMT, time.localtime())
    
        # call _commit
        res = ys()
        filter_ = ys._get_filter(include_commits=False)
        call = mocker.call
    
        assert res == 0
        assert mkdir.mock_calls == [
            call(ys.COMMITDIR),
            call(ys.LOGDIR),
        ]
        assert rename.mock_calls == [
            call(commit_dir_tmp, commit_dir),
        ]
        assert popen.mock_calls == [
            call(["rsync", "-a", "--link-dest=../../..", "--exclude=/.ys"]
                 + filter_ +
                 [ys.root_dir + '/', os.path.join(ys.COMMITDIR, "2_tmp")],
                 stdout=-3),
            call().communicate(),
        ]
    
        # this seems patched, but the date on Python 3.6 is still different
        assert time.tzname == "MSK"
        # if sys.version_info.minor <= 6:
        #     # will be UTC
        #     time_str = time.strftime(ys.DATEFMT, time_3)
        # else:
        #     time_str = "Thu, 01 Jan 1970 03:00:03 MSK"
        time_str = time.strftime(ys.DATEFMT, time.localtime(3))
    
>       assert m.mock_calls == [
            # call(ys.REPOFILE),
            # call().__enter__(),
            # call().read(),
            # call().__exit__(None, None, None),
            # call(commit_log_path, "w"),
            call().__enter__(),
            call().write(commit_msg + "\n\n"
                         "When: {}\n".format(time_str) +
                         "Where: user@myhost"),
            call().write('\n'),
            call().__exit__(None, None, None),
        ]
E       assert [call().__ent...all().close()] == [call().__ent..., None, None)]
E         
E         Left contains one more item: call().close()
E         Use -v to get more diff

/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build/tests/test_commit.py:97: 
AssertionError
----------------------------- Captured stdout call -----------------------------
mkdir 
/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build/tests/test_dir_empty/.ys/commits
rsync -a --link-dest=../../.. --exclude=/.ys '--filter=merge 
/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build/tests/test_dir_empty/.ys/rsync-filter'
 --exclude=/.ys/* 
/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build/tests/test_dir_empty/ 
/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build/tests/test_dir_empty/.ys/commits/2_tmp
mkdir 
/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build/tests/test_dir_empty/.ys/logs
commit 2 created

initial commit

When: Thu, 01 Jan 1970 00:00:03 UTC
Where: user@myhost
_______________________________ test_init_mixed ________________________________

mocker = <pytest_mock.plugin.MockerFixture object at 0xffffac911ae0>

    def test_init_mixed(mocker):
        ## Mock existing directory and non-existent files ##
        args = "yarsync init".split()
        ys0 = YARsync(args)
        conffile = ys0.CONFIGFILE
        repofile = ys0.REPOFILE.format("my_repo")
    
        def _os_path_exists(filepath):
            if filepath == YSDIR:
                return True
            elif filepath == conffile:
                return True
            elif filepath.startswith(YSDIR):
                print(filepath)
                return False
            else:
                return False  # won't get access to real 
os.path.exists(filepath)
    
        m = mocker.mock_open()
        mocker.patch("builtins.open", m)
        # the user inputs "my_host"
        mocker.patch("builtins.input", lambda _: "my_repo")
        mocker.patch("os.path.exists", _os_path_exists)
        # otherwise listdir will complain that .ys doesn't exist
        mocker.patch("os.listdir", lambda _: [])
    
        # call _init
        res = ys0()
        assert res == 0
    
        call = mocker.call
>       assert m.mock_calls == [
            # call(conffile, "w"), call().__enter__(),
            # call().write(CONFIG_EXAMPLE), call().write(''),
            # call().__exit__(None, None, None),
            call(repofile, "x"), call().__enter__(),
            call().__exit__(None, None, None)
        ]
E       AssertionError: assert [call('.ys/re...all().close()] == 
[call('.ys/re..., None, None)]
E         
E         Left contains one more item: call().close()
E         Use -v to get more diff

/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build/tests/test_init.py:44: 
AssertionError
----------------------------- Captured stdout call -----------------------------
Initialize configuration
.ys already exists, skip
.ys/config.ini already exists, skip
# create configuration file .ys/repo_my_repo.txt

Initialized yarsync configuration in 
/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build/tests/test_dir_empty/.ys 
____________________________ test_init_non_existent ____________________________

mocker = <pytest_mock.plugin.MockerFixture object at 0xffffaccbde10>

    def test_init_non_existent(mocker):
        def _os_path_exists(filepath):
            return False
    
        m = mocker.mock_open()
        mocker.patch("builtins.open", m)
        mocker.patch("os.path.exists", _os_path_exists)
        mkdir = mocker.patch("os.mkdir")
        mocker.patch("os.listdir", lambda _: [])
    
        args = "yarsync init myhost".split()
        ys = YARsync(args)
        conffile = ys.CONFIGFILE
        repofile = ys.REPOFILE.format("myhost")
    
        res = ys()
        assert res == 0
        call = mocker.call
        assert mkdir.mock_calls == [call(YSDIR)]
        # assert mkdir.mock_calls == [call(YSDIR, ys.DIRMODE)]
>       assert m.mock_calls == [
            # mkdir is recorded separately
            call(conffile, "w"), call().__enter__(),
            call().write(CONFIG_EXAMPLE), call().write(''),
            call().__exit__(None, None, None),
            call(repofile, "x"), call().__enter__(),
            call().__exit__(None, None, None)
        ]
E       AssertionError: assert [call('.ys/co...all().close()] == 
[call('.ys/co...t', 'x'), ...]
E         
E         At index 5 diff: call().close() != call('.ys/repo_myhost.txt', 'x')
E         Left contains 2 more items, first extra item: call().__exit__(None, 
None, None)
E         Use -v to get more diff

/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build/tests/test_init.py:87: 
AssertionError
----------------------------- Captured stdout call -----------------------------
Initialize configuration for 'myhost'
mkdir .ys
# create configuration file .ys/config.ini
# create configuration file .ys/repo_myhost.txt

Initialized yarsync configuration in 
/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build/tests/test_dir_empty/.ys 
=========================== short test summary info ============================
FAILED tests/test_commit.py::test_commit - assert [call().__ent...all().close...
FAILED tests/test_init.py::test_init_mixed - AssertionError: assert [call('.y...
FAILED tests/test_init.py::test_init_non_existent - AssertionError: assert [c...
========================= 3 failed, 28 passed in 1.67s =========================
E: pybuild pybuild:389: test: plugin pyproject failed with: exit code=1: cd 
/<<PKGBUILDDIR>>/.pybuild/cpython3_3.13_yarsync/build; python3.13 -m pytest 
--ignore=tests/test_clone.py --ignore=tests/test_status.py
I: pybuild base:311: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.12_yarsync/build; 
python3.12 -m pytest --ignore=tests/test_clone.py --ignore=tests/test_status.py
============================= test session starts ==============================
platform linux -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0
rootdir: /<<PKGBUILDDIR>>/.pybuild/cpython3_3.12_yarsync/build
configfile: pytest.ini
plugins: typeguard-4.3.0, cov-5.0.0, mock-3.14.0
collected 31 items

tests/test_commit.py ......                                              [ 19%]
tests/test_env_vars.py .                                                 [ 22%]
tests/test_init.py ...                                                   [ 32%]
tests/test_log.py ....                                                   [ 45%]
tests/test_pull_push.py ......                                           [ 64%]
tests/test_remote.py .                                                   [ 67%]
tests/test_sync.py ..                                                    [ 74%]
tests/test_ys_helpers.py ........                                        [100%]

============================== 31 passed in 1.66s ==============================
dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p "3.13 
3.12" returned exit code 13
make: *** [debian/rules:7: binary] Error 25
dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2
--------------------------------------------------------------------------------
Build finished at 2024-09-19T17:00:49Z

Finished
--------

This bug has been filed at "normal" severity, as we haven't started the
transition to add 3.13 as a supported version, yet. This will be raised to RC
as soon as that happens, hopefully well before trixie.

Thanks,

Stefano

Reply via email to