watchfiles
watchfiles copied to clipboard
0.20.0: pytest is failing in 11 units
Description
I'm packaging your module as an rpm package so I'm using the typical PEP517 based build, install and test cycle used on building packages from non-root account.
-
python3 -sBm build -w --no-isolation
- because I'm calling
build
with--no-isolation
I'm using during all processes only locally installed modules - install .whl file in </install/prefix> using 'installer` module
- run pytest with $PYTHONPATH pointing to sitearch and sitelib inside </install/prefix>
- build is performed in env which is
cut off from access to the public network
(pytest is executed with-m "not network"
)
Here is pytest output:
+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/python-watchgod-0.20.0-2.fc35.x86_64/usr/lib64/python3.8/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/python-watchgod-0.20.0-2.fc35.x86_64/usr/lib/python3.8/site-packages
+ /usr/bin/pytest -ra -m 'not network' --import-mode=importlib
==================================================================================== test session starts ====================================================================================
platform linux -- Python 3.8.18, pytest-7.4.2, pluggy-1.3.0
rootdir: /home/tkloczko/rpmbuild/BUILD/watchfiles-0.20.0
configfile: pytest.ini
plugins: anyio-3.7.1, mock-3.11.1
collected 161 items
tests/test_cli.py ...................F.F. [ 14%]
tests/test_docs.py ................s [ 24%]
tests/test_filters.py .................. [ 36%]
tests/test_force_polling.py .......................... [ 52%]
tests/test_run_process.py F.s.....F......FF....... [ 67%]
tests/test_rust_notify.py .................................... [ 89%]
tests/test_watch.py .....F..FFF.F..s. [100%]
========================================================================================= FAILURES ==========================================================================================
_________________________________________________________________________________ test_build_filter_warning _________________________________________________________________________________
caplog = <_pytest.logging.LogCaptureFixture object at 0x7f4c64ee7730>
def test_build_filter_warning(caplog):
caplog.set_level('INFO', 'watchfiles')
watch_filter, name = build_filter('os.getcwd', 'foo')
assert watch_filter is os.getcwd
assert name == '<built-in function getcwd>'
> assert caplog.text == (
'watchfiles.cli WARNING: "--ignore-paths" argument ignored as filter is not a subclass of DefaultFilter\n'
)
E assert 'WARNING wat...faultFilter\n' == 'watchfiles.c...faultFilter\n'
E - watchfiles.cli WARNING: "--ignore-paths" argument ignored as filter is not a subclass of DefaultFilter
E ? --------
E + WARNING watchfiles.cli:cli.py:218 "--ignore-paths" argument ignored as filter is not a subclass of DefaultFilter
E ? +++++++++ ++++++++++
tests/test_cli.py:265: AssertionError
------------------------------------------------------------------------------------- Captured log call -------------------------------------------------------------------------------------
WARNING watchfiles.cli:cli.py:218 "--ignore-paths" argument ignored as filter is not a subclass of DefaultFilter
_____________________________________________________________________________________ test_args_command _____________________________________________________________________________________
mocker = <pytest_mock.plugin.MockerFixture object at 0x7f4c64eb19d0>, tmp_path = PosixPath('/tmp/pytest-of-tkloczko/pytest-25/test_args_command0')
caplog = <_pytest.logging.LogCaptureFixture object at 0x7f4c64e5bd30>
def test_args_command(mocker, tmp_path, caplog):
caplog.set_level('INFO', 'watchfiles')
mocker.patch('watchfiles.cli.sys.stdin.fileno')
mocker.patch('os.ttyname', return_value='/path/to/tty')
mock_run_process = mocker.patch('watchfiles.cli.run_process')
cli('--args', '--version ', 'foobar.sh', str(tmp_path))
mock_run_process.assert_called_once_with(
tmp_path,
target='foobar.sh',
target_type='command',
watch_filter=IsInstance(DefaultFilter, only_direct_instance=True),
debug=False,
grace_period=0,
sigint_timeout=5,
sigkill_timeout=1,
recursive=True,
ignore_permission_denied=False,
)
> assert 'WARNING: --args is only used when the target is a function\n' in caplog.text
E assert 'WARNING: --args is only used when the target is a function\n' in 'WARNING watchfiles.cli:cli.py:152 --args is only used when the target is a function\nINFO watchfiles.cli:cli.py:... 👀 path="/tmp/pytest-of-tkloczko/pytest-25/test_args_command0" target="foobar.sh" (command) filter=DefaultFilter...\n'
E + where 'WARNING watchfiles.cli:cli.py:152 --args is only used when the target is a function\nINFO watchfiles.cli:cli.py:... 👀 path="/tmp/pytest-of-tkloczko/pytest-25/test_args_command0" target="foobar.sh" (command) filter=DefaultFilter...\n' = <_pytest.logging.LogCaptureFixture object at 0x7f4c64e5bd30>.text
tests/test_cli.py:312: AssertionError
----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------
[19:10:37] --args is only used when the target is a function
[19:10:37] watchfiles v0.0.0 👀 path="/tmp/pytest-of-tkloczko/pytest-25/test_args_command0" target="foobar.sh" (command) filter=DefaultFilter...
------------------------------------------------------------------------------------- Captured log call -------------------------------------------------------------------------------------
WARNING watchfiles.cli:cli.py:152 --args is only used when the target is a function
INFO watchfiles.cli:cli.py:162 watchfiles v0.0.0 👀 path="/tmp/pytest-of-tkloczko/pytest-25/test_args_command0" target="foobar.sh" (command) filter=DefaultFilter...
___________________________________________________________________________________ test_alive_terminates ___________________________________________________________________________________
mocker = <pytest_mock.plugin.MockerFixture object at 0x7f4c64f1a640>, mock_rust_notify = <function mock_rust_notify.<locals>.mock at 0x7f4c64af6ca0>
caplog = <_pytest.logging.LogCaptureFixture object at 0x7f4c64f1a370>
def test_alive_terminates(mocker, mock_rust_notify: 'MockRustType', caplog):
caplog.set_level('DEBUG', 'watchfiles')
mock_spawn_process = mocker.patch('watchfiles.run.spawn_context.Process', return_value=FakeProcess())
mock_popen = mocker.patch('watchfiles.run.subprocess.Popen', return_value=FakePopen())
mock_kill = mocker.patch('watchfiles.run.os.kill')
mock_rust_notify([{(1, '/path/to/foobar.py')}])
assert run_process('/x/y/z', target=os.getcwd, debounce=5, grace_period=0.01, step=1) == 1
assert mock_spawn_process.call_count == 2
assert mock_popen.call_count == 0
assert mock_kill.call_count == 2 # kill in loop + final kill
> assert 'watchfiles.main DEBUG: running "<built-in function getcwd>" as function\n' in caplog.text
E assert 'watchfiles.main DEBUG: running "<built-in function getcwd>" as function\n' in 'DEBUG watchfiles.main:run.py:131 running "<built-in function getcwd>" as function\nDEBUG watchfiles.main:run.py...topped\nDEBUG watchfiles.main:run.py:328 stopping process...\nDEBUG watchfiles.main:run.py:345 process stopped\n'
E + where 'DEBUG watchfiles.main:run.py:131 running "<built-in function getcwd>" as function\nDEBUG watchfiles.main:run.py...topped\nDEBUG watchfiles.main:run.py:328 stopping process...\nDEBUG watchfiles.main:run.py:345 process stopped\n' = <_pytest.logging.LogCaptureFixture object at 0x7f4c64f1a370>.text
tests/test_run_process.py:54: AssertionError
------------------------------------------------------------------------------------- Captured log call -------------------------------------------------------------------------------------
DEBUG watchfiles.main:run.py:131 running "<built-in function getcwd>" as function
DEBUG watchfiles.main:run.py:440 registering handler for SIGTERM on watchfiles process 1609152
DEBUG watchfiles.main:run.py:137 sleeping for 0.01 seconds before watching for changes
DEBUG watchfiles.main:main.py:295 1 change detected: {(<Change.added: 1>, '/path/to/foobar.py')}
DEBUG watchfiles.main:run.py:328 stopping process...
DEBUG watchfiles.main:run.py:345 process stopped
DEBUG watchfiles.main:run.py:328 stopping process...
DEBUG watchfiles.main:run.py:345 process stopped
_______________________________________________________________________________ test_function_string_not_win ________________________________________________________________________________
mocker = <pytest_mock.plugin.MockerFixture object at 0x7f4c64cde550>, mock_rust_notify = <function mock_rust_notify.<locals>.mock at 0x7f4c64af6af0>
caplog = <_pytest.logging.LogCaptureFixture object at 0x7f4c64cfc070>
def test_function_string_not_win(mocker, mock_rust_notify: 'MockRustType', caplog):
caplog.set_level('DEBUG', 'watchfiles')
mock_spawn_process = mocker.patch('watchfiles.run.spawn_context.Process', return_value=FakeProcess())
mocker.patch('watchfiles.run.os.kill')
mock_rust_notify([{(1, '/path/to/foobar.py')}])
assert run_process('/x/y/z', target='os.getcwd', debounce=5, step=1) == 1
assert mock_spawn_process.call_count == 2
# get_tty_path returns None on windows
tty_path = None if sys.platform == 'win32' else IsStr(regex='/dev/.+')
mock_spawn_process.assert_called_with(target=run_function, args=('os.getcwd', tty_path, (), {}), kwargs={})
> assert 'watchfiles.main DEBUG: running "os.getcwd" as function\n' in caplog.text
E assert 'watchfiles.main DEBUG: running "os.getcwd" as function\n' in 'DEBUG watchfiles.main:run.py:131 running "os.getcwd" as function\nDEBUG watchfiles.main:run.py:440 registering ...topped\nDEBUG watchfiles.main:run.py:328 stopping process...\nDEBUG watchfiles.main:run.py:345 process stopped\n'
E + where 'DEBUG watchfiles.main:run.py:131 running "os.getcwd" as function\nDEBUG watchfiles.main:run.py:440 registering ...topped\nDEBUG watchfiles.main:run.py:328 stopping process...\nDEBUG watchfiles.main:run.py:345 process stopped\n' = <_pytest.logging.LogCaptureFixture object at 0x7f4c64cfc070>.text
tests/test_run_process.py:148: AssertionError
------------------------------------------------------------------------------------- Captured log call -------------------------------------------------------------------------------------
DEBUG watchfiles.main:run.py:131 running "os.getcwd" as function
DEBUG watchfiles.main:run.py:440 registering handler for SIGTERM on watchfiles process 1609152
DEBUG watchfiles.main:main.py:295 1 change detected: {(<Change.added: 1>, '/path/to/foobar.py')}
DEBUG watchfiles.main:run.py:328 stopping process...
DEBUG watchfiles.main:run.py:345 process stopped
DEBUG watchfiles.main:run.py:328 stopping process...
DEBUG watchfiles.main:run.py:345 process stopped
_______________________________________________________________________________________ test_command ________________________________________________________________________________________
mocker = <pytest_mock.plugin.MockerFixture object at 0x7f4c64e70730>, mock_rust_notify = <function mock_rust_notify.<locals>.mock at 0x7f4c64cfe790>
caplog = <_pytest.logging.LogCaptureFixture object at 0x7f4c64f21280>
def test_command(mocker, mock_rust_notify: 'MockRustType', caplog):
caplog.set_level('DEBUG', 'watchfiles')
mock_spawn_process = mocker.patch('watchfiles.run.spawn_context.Process', return_value=FakeProcess())
mock_popen = mocker.patch('watchfiles.run.subprocess.Popen', return_value=FakePopen())
mock_kill = mocker.patch('watchfiles.run.os.kill')
mock_rust_notify([{(1, '/path/to/foobar.py')}])
assert run_process('/x/y/z', target='echo foobar', debounce=5, step=1) == 1
assert mock_spawn_process.call_count == 0
assert mock_popen.call_count == 2
mock_popen.assert_called_with(['echo', 'foobar'])
assert mock_kill.call_count == 2 # kill in loop + final kill
> assert 'watchfiles.main DEBUG: running "echo foobar" as command\n' in caplog.text
E assert 'watchfiles.main DEBUG: running "echo foobar" as command\n' in 'DEBUG watchfiles.main:run.py:131 running "echo foobar" as command\nDEBUG watchfiles.main:run.py:440 registering...topped\nDEBUG watchfiles.main:run.py:328 stopping process...\nDEBUG watchfiles.main:run.py:345 process stopped\n'
E + where 'DEBUG watchfiles.main:run.py:131 running "echo foobar" as command\nDEBUG watchfiles.main:run.py:440 registering...topped\nDEBUG watchfiles.main:run.py:328 stopping process...\nDEBUG watchfiles.main:run.py:345 process stopped\n' = <_pytest.logging.LogCaptureFixture object at 0x7f4c64f21280>.text
tests/test_run_process.py:242: AssertionError
------------------------------------------------------------------------------------- Captured log call -------------------------------------------------------------------------------------
DEBUG watchfiles.main:run.py:131 running "echo foobar" as command
DEBUG watchfiles.main:run.py:440 registering handler for SIGTERM on watchfiles process 1609152
DEBUG watchfiles.main:main.py:295 1 change detected: {(<Change.added: 1>, '/path/to/foobar.py')}
DEBUG watchfiles.main:run.py:328 stopping process...
DEBUG watchfiles.main:run.py:345 process stopped
DEBUG watchfiles.main:run.py:328 stopping process...
DEBUG watchfiles.main:run.py:345 process stopped
__________________________________________________________________________________ test_command_with_args ___________________________________________________________________________________
mocker = <pytest_mock.plugin.MockerFixture object at 0x7f4c64fd59a0>, mock_rust_notify = <function mock_rust_notify.<locals>.mock at 0x7f4c64cfed30>
caplog = <_pytest.logging.LogCaptureFixture object at 0x7f4c64fd51f0>
def test_command_with_args(mocker, mock_rust_notify: 'MockRustType', caplog):
caplog.set_level('INFO', 'watchfiles')
mock_spawn_process = mocker.patch('watchfiles.run.spawn_context.Process', return_value=FakeProcess())
mock_popen = mocker.patch('watchfiles.run.subprocess.Popen', return_value=FakePopen())
mock_kill = mocker.patch('watchfiles.run.os.kill')
mock_rust_notify([{(1, '/path/to/foobar.py')}])
assert run_process('/x/y/z', target='echo foobar', args=(1, 2), target_type='command', debounce=5, step=1) == 1
assert mock_spawn_process.call_count == 0
assert mock_popen.call_count == 2
mock_popen.assert_called_with(['echo', 'foobar'])
assert mock_kill.call_count == 2 # kill in loop + final kill
> assert 'watchfiles.main WARNING: ignoring args and kwargs for "command" target\n' in caplog.text
E assert 'watchfiles.main WARNING: ignoring args and kwargs for "command" target\n' in 'WARNING watchfiles.main:run.py:280 ignoring args and kwargs for "command" target\nINFO watchfiles.main:main.py:297 1 change detected\nWARNING watchfiles.main:run.py:280 ignoring args and kwargs for "command" target\n'
E + where 'WARNING watchfiles.main:run.py:280 ignoring args and kwargs for "command" target\nINFO watchfiles.main:main.py:297 1 change detected\nWARNING watchfiles.main:run.py:280 ignoring args and kwargs for "command" target\n' = <_pytest.logging.LogCaptureFixture object at 0x7f4c64fd51f0>.text
tests/test_run_process.py:257: AssertionError
------------------------------------------------------------------------------------- Captured log call -------------------------------------------------------------------------------------
WARNING watchfiles.main:run.py:280 ignoring args and kwargs for "command" target
INFO watchfiles.main:main.py:297 1 change detected
WARNING watchfiles.main:run.py:280 ignoring args and kwargs for "command" target
______________________________________________________________________________ test_watch_dont_raise_interrupt ______________________________________________________________________________
mock_rust_notify = <function mock_rust_notify.<locals>.mock at 0x7f4c64e099d0>, caplog = <_pytest.logging.LogCaptureFixture object at 0x7f4c64e64850>
def test_watch_dont_raise_interrupt(mock_rust_notify: 'MockRustType', caplog):
caplog.set_level('WARNING', 'watchfiles')
mock_rust_notify([{(1, 'foo.txt')}], exit_code='signal')
w = watch('.', raise_interrupt=False)
assert next(w) == {(Change.added, 'foo.txt')}
with pytest.raises(StopIteration):
next(w)
> assert caplog.text == 'watchfiles.main WARNING: KeyboardInterrupt caught, stopping watch\n'
E AssertionError: assert 'WARNING wat...pping watch\n' == 'watchfiles.m...pping watch\n'
E - watchfiles.main WARNING: KeyboardInterrupt caught, stopping watch
E ? --------
E + WARNING watchfiles.main:main.py:132 KeyboardInterrupt caught, stopping watch
E ? +++++++++ +++++++++++
tests/test_watch.py:74: AssertionError
------------------------------------------------------------------------------------- Captured log call -------------------------------------------------------------------------------------
WARNING watchfiles.main:main.py:132 KeyboardInterrupt caught, stopping watch
____________________________________________________________________________________ test_watch_no_yield ____________________________________________________________________________________
mock_rust_notify = <function mock_rust_notify.<locals>.mock at 0x7f4c64e091f0>, caplog = <_pytest.logging.LogCaptureFixture object at 0x7f4c64cdbd90>
def test_watch_no_yield(mock_rust_notify: 'MockRustType', caplog):
mock = mock_rust_notify([{(1, 'spam.pyc')}, {(1, 'spam.py'), (2, 'ham.txt')}])
caplog.set_level('INFO', 'watchfiles')
assert next(watch('.')) == {(Change.added, 'spam.py'), (Change.modified, 'ham.txt')}
assert mock.watch_count == 2
> assert caplog.text == 'watchfiles.main INFO: 2 changes detected\n'
E AssertionError: assert 'INFO wat...es detected\n' == 'watchfiles.m...es detected\n'
E - watchfiles.main INFO: 2 changes detected
E + INFO watchfiles.main:main.py:297 2 changes detected
tests/test_watch.py:113: AssertionError
------------------------------------------------------------------------------------- Captured log call -------------------------------------------------------------------------------------
INFO watchfiles.main:main.py:297 2 changes detected
___________________________________________________________________________________ test_awatch_no_yield ____________________________________________________________________________________
mock_rust_notify = <function mock_rust_notify.<locals>.mock at 0x7f4c64e09430>, caplog = <_pytest.logging.LogCaptureFixture object at 0x7f4c64edb6a0>
async def test_awatch_no_yield(mock_rust_notify: 'MockRustType', caplog):
mock = mock_rust_notify([{(1, 'spam.pyc')}, {(1, 'spam.py')}])
caplog.set_level('DEBUG', 'watchfiles')
changes = None
async for changes in awatch('.'):
pass
assert changes == {(Change.added, 'spam.py')}
assert mock.watch_count == 2
> assert caplog.text == (
"watchfiles.main DEBUG: all changes filtered out, raw_changes={(1, 'spam.pyc')}\n"
"watchfiles.main DEBUG: 1 change detected: {(<Change.added: 1>, 'spam.py')}\n"
)
E assert "DEBUG wat...'spam.py')}\n" == "watchfiles.m...'spam.py')}\n"
E - watchfiles.main DEBUG: all changes filtered out, raw_changes={(1, 'spam.pyc')}
E ? ------
E + DEBUG watchfiles.main:main.py:277 all changes filtered out, raw_changes={(1, 'spam.pyc')}
E ? +++++++++ +++++++++++
E - watchfiles.main DEBUG: 1 change detected: {(<Change.added: 1>, 'spam.py')}
E ? ------
E + DEBUG watchfiles.main:main.py:295 1 change detected: {(<Change.added: 1>, 'spam.py')}
E ? +++++++++ +++++++++++
tests/test_watch.py:126: AssertionError
------------------------------------------------------------------------------------- Captured log call -------------------------------------------------------------------------------------
DEBUG watchfiles.main:main.py:277 all changes filtered out, raw_changes={(1, 'spam.pyc')}
DEBUG watchfiles.main:main.py:295 1 change detected: {(<Change.added: 1>, 'spam.py')}
____________________________________________________________________________________ test_watch_timeout _____________________________________________________________________________________
mock_rust_notify = <function mock_rust_notify.<locals>.mock at 0x7f4c64e4caf0>, caplog = <_pytest.logging.LogCaptureFixture object at 0x7f4c64ffe5e0>
def test_watch_timeout(mock_rust_notify: 'MockRustType', caplog):
mock = mock_rust_notify(['timeout', {(1, 'spam.py')}])
caplog.set_level('DEBUG', 'watchfiles')
change_list = []
for changes in watch('.'):
change_list.append(changes)
assert change_list == [{(Change.added, 'spam.py')}]
assert mock.watch_count == 2
> assert caplog.text == (
"watchfiles.main DEBUG: rust notify timeout, continuing\n" # noqa: Q000
"watchfiles.main DEBUG: 1 change detected: {(<Change.added: 1>, 'spam.py')}\n"
)
E assert "DEBUG wat...'spam.py')}\n" == "watchfiles.m...'spam.py')}\n"
E - watchfiles.main DEBUG: rust notify timeout, continuing
E ? ------
E + DEBUG watchfiles.main:main.py:127 rust notify timeout, continuing
E ? +++++++++ +++++++++++
E - watchfiles.main DEBUG: 1 change detected: {(<Change.added: 1>, 'spam.py')}
E ? ------
E + DEBUG watchfiles.main:main.py:295 1 change detected: {(<Change.added: 1>, 'spam.py')}
E ? +++++++++ +++++++++++
tests/test_watch.py:142: AssertionError
------------------------------------------------------------------------------------- Captured log call -------------------------------------------------------------------------------------
DEBUG watchfiles.main:main.py:127 rust notify timeout, continuing
DEBUG watchfiles.main:main.py:295 1 change detected: {(<Change.added: 1>, 'spam.py')}
____________________________________________________________________________________ test_awatch_timeout ____________________________________________________________________________________
mock_rust_notify = <function mock_rust_notify.<locals>.mock at 0x7f4c64f429d0>, caplog = <_pytest.logging.LogCaptureFixture object at 0x7f4c64ce7400>
async def test_awatch_timeout(mock_rust_notify: 'MockRustType', caplog):
mock = mock_rust_notify(['timeout', {(1, 'spam.py')}])
caplog.set_level('DEBUG', 'watchfiles')
change_list = []
async for changes in awatch('.'):
change_list.append(changes)
assert change_list == [{(Change.added, 'spam.py')}]
assert mock.watch_count == 2
> assert caplog.text == (
"watchfiles.main DEBUG: rust notify timeout, continuing\n" # noqa: Q000
"watchfiles.main DEBUG: 1 change detected: {(<Change.added: 1>, 'spam.py')}\n"
)
E assert "DEBUG wat...'spam.py')}\n" == "watchfiles.m...'spam.py')}\n"
E - watchfiles.main DEBUG: rust notify timeout, continuing
E ? ------
E + DEBUG watchfiles.main:main.py:265 rust notify timeout, continuing
E ? +++++++++ +++++++++++
E - watchfiles.main DEBUG: 1 change detected: {(<Change.added: 1>, 'spam.py')}
E ? ------
E + DEBUG watchfiles.main:main.py:295 1 change detected: {(<Change.added: 1>, 'spam.py')}
E ? +++++++++ +++++++++++
tests/test_watch.py:169: AssertionError
------------------------------------------------------------------------------------- Captured log call -------------------------------------------------------------------------------------
DEBUG watchfiles.main:main.py:265 rust notify timeout, continuing
DEBUG watchfiles.main:main.py:295 1 change detected: {(<Change.added: 1>, 'spam.py')}
===================================================================================== warnings summary ======================================================================================
../../../../../usr/lib/python3.8/site-packages/_pytest/config/__init__.py:1373
/usr/lib/python3.8/site-packages/_pytest/config/__init__.py:1373: PytestConfigWarning: Unknown config option: asyncio_mode
self._warn_or_fail_if_strict(f"Unknown config option: {key}\n")
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
================================================================================== short test summary info ==================================================================================
SKIPPED [1] tests/test_docs.py:105: output varies between versions
SKIPPED [1] tests/test_run_process.py:72: no need to test this except on windows
SKIPPED [1] tests/test_watch.py:192: different on windows
FAILED tests/test_cli.py::test_build_filter_warning - assert 'WARNING wat...faultFilter\n' == 'watchfiles.c...faultFilter\n'
FAILED tests/test_cli.py::test_args_command - assert 'WARNING: --args is only used when the target is a function\n' in 'WARNING watchfiles.cli:cli.py:152 --args is only used when the target is a function\nINFO watchfiles.cli:...
FAILED tests/test_run_process.py::test_alive_terminates - assert 'watchfiles.main DEBUG: running "<built-in function getcwd>" as function\n' in 'DEBUG watchfiles.main:run.py:131 running "<built-in function getcwd>" as function\nDEBUG wa...
FAILED tests/test_run_process.py::test_function_string_not_win - assert 'watchfiles.main DEBUG: running "os.getcwd" as function\n' in 'DEBUG watchfiles.main:run.py:131 running "os.getcwd" as function\nDEBUG watchfiles.main:run.py:440 registeri...
FAILED tests/test_run_process.py::test_command - assert 'watchfiles.main DEBUG: running "echo foobar" as command\n' in 'DEBUG watchfiles.main:run.py:131 running "echo foobar" as command\nDEBUG watchfiles.main:run.py:440 registe...
FAILED tests/test_run_process.py::test_command_with_args - assert 'watchfiles.main WARNING: ignoring args and kwargs for "command" target\n' in 'WARNING watchfiles.main:run.py:280 ignoring args and kwargs for "command" target\nINFO watchf...
FAILED tests/test_watch.py::test_watch_dont_raise_interrupt - AssertionError: assert 'WARNING wat...pping watch\n' == 'watchfiles.m...pping watch\n'
FAILED tests/test_watch.py::test_watch_no_yield - AssertionError: assert 'INFO wat...es detected\n' == 'watchfiles.m...es detected\n'
FAILED tests/test_watch.py::test_awatch_no_yield - assert "DEBUG wat...'spam.py')}\n" == "watchfiles.m...'spam.py')}\n"
FAILED tests/test_watch.py::test_watch_timeout - assert "DEBUG wat...'spam.py')}\n" == "watchfiles.m...'spam.py')}\n"
FAILED tests/test_watch.py::test_awatch_timeout - assert "DEBUG wat...'spam.py')}\n" == "watchfiles.m...'spam.py')}\n"
=================================================================== 11 failed, 147 passed, 3 skipped, 1 warning in 3.85s ====================================================================
Here is list of installed modules in build env
Package Version
---------------------------------------- ----------
alabaster 0.7.13
anyio 3.7.1
async-timeout 4.0.3
Babel 2.12.1
build 1.0.3
charset-normalizer 3.2.0
click 8.1.7
dirty-equals 0.7.0
distro 1.8.0
docutils 0.20.1
dunamai 1.18.0
exceptiongroup 1.1.3
gpg 1.21.0
idna 3.4
imagesize 1.4.1
importlib-metadata 6.8.0
iniconfig 2.0.0
installer 0.7.0
Jinja2 3.1.2
libcomps 0.1.19
Mako 1.2.4.dev0
Markdown 3.4.4
MarkupSafe 2.1.3
maturin 1.2.3
packaging 23.1
pkg 0.0.0
pluggy 1.3.0
poetry-core 1.7.0
poetry-dynamic-versioning 1.0.1
poetry-plugin-tweak-dependencies-version 0.1.0
psutil 5.9.5
Pygments 2.16.1
PyGObject 3.44.1
pyproject_hooks 1.0.0
pytest 7.4.2
pytest-mock 3.11.1
python-dateutil 2.8.2
pytz 2023.3
redis 5.0.0
requests 2.31.0
setuptools 68.2.2
six 1.16.0
smartypants 2.0.1
sniffio 1.3.0
snowballstemmer 2.2.0
Sphinx 7.0.1
sphinx-rtd-theme 1.2.2
sphinxcontrib-applehelp 1.0.4
sphinxcontrib-devhelp 1.0.2
sphinxcontrib-htmlhelp 2.0.3
sphinxcontrib-jquery 4.1
sphinxcontrib-jsmath 1.0.1
sphinxcontrib-qthelp 1.0.3
sphinxcontrib-serializinghtml 1.1.9
toml 0.10.2
tomli 2.0.1
tomlkit 0.12.1
typogrify 2.0.7
urllib3 1.26.16
wheel 0.41.1
zipp 3.16.2
Example Code
N/A
Watchfiles Output
N/A
Operating System & Architecture
$ python3 -c 'import platform; print(platform.platform()); print(platform.version())'
Linux-6.4.8-200.fc38.x86_64-x86_64-with-glibc2.34
#1 SMP PREEMPT_DYNAMIC Thu Aug 3 21:44:06 UTC 2023
Environment
No response
Python & Watchfiles Version
This issue is not about installed watchfiles
Rust & Cargo Version
cargo 1.72.0 rustc 1.72.0 (5680fa18f 2023-08-23) (Fedora 1.72.0-1.fc40)
Looks like just some logging paths differ. PR welcome to use regexes to avoid these failures.
To form PR it is necessary to know the code .. which I don't know.
I just tested 0.21.0 and looks like now fails only one unit
+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/python-watchfiles-0.21.0-2.fc35.x86_64/usr/lib64/python3.8/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/python-watchfiles-0.21.0-2.fc35.x86_64/usr/lib/python3.8/site-packages
+ /usr/bin/pytest -ra -m 'not network' --import-mode=importlib
============================= test session starts ==============================
platform linux -- Python 3.8.18, pytest-7.4.3, pluggy-1.3.0
rootdir: /home/tkloczko/rpmbuild/BUILD/watchfiles-0.21.0
configfile: pyproject.toml
testpaths: tests
plugins: anyio-4.0.0, mock-3.12.0, timeout-2.2.0
timeout: 10.0s
timeout method: signal
timeout func_only: False
collected 161 items
tests/test_cli.py ....................... [ 14%]
tests/test_docs.py ................s [ 24%]
tests/test_filters.py .................. [ 36%]
tests/test_force_polling.py .......................... [ 52%]
tests/test_run_process.py ..s..................... [ 67%]
tests/test_rust_notify.py .................................... [ 89%]
tests/test_watch.py ...............sF [100%]
=================================== FAILURES ===================================
_________________________ test_awatch_interrupt_raise __________________________
self = <tests.test_watch.MockRustNotifyRaise object at 0x7f5f65dd28b0>
args = (1600, 50, 5000, <threading.Event object at 0x7f5f65e29130>)
def watch(self, *args):
if self.i == 1:
> raise KeyboardInterrupt('test error')
E KeyboardInterrupt: test error
tests/test_watch.py:204: KeyboardInterrupt
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/tkloczko/rpmbuild/BUILDROOT/python-watchfiles-0.21.0-2.fc35.x86_64/usr/lib64/python3.8/site-packages/watchfiles/main.py", line 254, in awatch
raw_changes = await anyio.to_thread.run_sync(watcher.watch, debounce, step, timeout, stop_event_)
File "/usr/lib/python3.8/site-packages/anyio/to_thread.py", line 33, in run_sync
return await get_async_backend().run_sync_in_worker_thread(
File "/usr/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 2106, in run_sync_in_worker_thread
return await future
File "/usr/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 833, in run
result = context.run(func, *args)
File "/home/tkloczko/rpmbuild/BUILD/watchfiles-0.21.0/tests/test_watch.py", line 204, in watch
raise KeyboardInterrupt('test error')
KeyboardInterrupt: test error
During handling of the above exception, another exception occurred:
+ Exception Group Traceback (most recent call last):
| File "/usr/lib/python3.8/site-packages/_pytest/runner.py", line 341, in from_call
| result: Optional[TResult] = func()
| File "/usr/lib/python3.8/site-packages/_pytest/runner.py", line 262, in <lambda>
| lambda: ihook(item=item, **kwds), when=when, reraise=reraise
| File "/usr/lib/python3.8/site-packages/pluggy/_hooks.py", line 493, in __call__
| return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
| File "/usr/lib/python3.8/site-packages/pluggy/_manager.py", line 115, in _hookexec
| return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
| File "/usr/lib/python3.8/site-packages/pluggy/_callers.py", line 152, in _multicall
| return outcome.get_result()
| File "/usr/lib/python3.8/site-packages/pluggy/_result.py", line 114, in get_result
| raise exc.with_traceback(exc.__traceback__)
| File "/usr/lib/python3.8/site-packages/pluggy/_callers.py", line 77, in _multicall
| res = hook_impl.function(*args)
| File "/usr/lib/python3.8/site-packages/_pytest/runner.py", line 169, in pytest_runtest_call
| item.runtest()
| File "/usr/lib/python3.8/site-packages/_pytest/python.py", line 1797, in runtest
| self.ihook.pytest_pyfunc_call(pyfuncitem=self)
| File "/usr/lib/python3.8/site-packages/pluggy/_hooks.py", line 493, in __call__
| return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
| File "/usr/lib/python3.8/site-packages/pluggy/_manager.py", line 115, in _hookexec
| return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
| File "/usr/lib/python3.8/site-packages/pluggy/_callers.py", line 113, in _multicall
| raise exception.with_traceback(exception.__traceback__)
| File "/usr/lib/python3.8/site-packages/pluggy/_callers.py", line 77, in _multicall
| res = hook_impl.function(*args)
| File "/usr/lib/python3.8/site-packages/anyio/pytest_plugin.py", line 119, in pytest_pyfunc_call
| runner.run_test(pyfuncitem.obj, testargs)
| File "/usr/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 1936, in run_test
| self.get_loop().run_until_complete(
| File "/usr/lib64/python3.8/asyncio/base_events.py", line 616, in run_until_complete
| return future.result()
| File "/usr/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 1896, in _call_in_runner_task
| return await future
| File "/usr/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 1874, in _run_tests_and_fixtures
| retval = await coro
| File "/home/tkloczko/rpmbuild/BUILD/watchfiles-0.21.0/tests/test_watch.py", line 224, in test_awatch_interrupt_raise
| async for _ in awatch('.', stop_event=stop_event):
| File "/home/tkloczko/rpmbuild/BUILDROOT/python-watchfiles-0.21.0-2.fc35.x86_64/usr/lib64/python3.8/site-packages/watchfiles/main.py", line 259, in awatch
| tg.cancel_scope.cancel()
| File "/usr/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 664, in __aexit__
| raise BaseExceptionGroup(
| exceptiongroup.BaseExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "/home/tkloczko/rpmbuild/BUILDROOT/python-watchfiles-0.21.0-2.fc35.x86_64/usr/lib64/python3.8/site-packages/watchfiles/main.py", line 254, in awatch
| raw_changes = await anyio.to_thread.run_sync(watcher.watch, debounce, step, timeout, stop_event_)
| File "/usr/lib/python3.8/site-packages/anyio/to_thread.py", line 33, in run_sync
| return await get_async_backend().run_sync_in_worker_thread(
| File "/usr/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 2106, in run_sync_in_worker_thread
| return await future
| File "/usr/lib/python3.8/site-packages/anyio/_backends/_asyncio.py", line 833, in run
| result = context.run(func, *args)
| File "/home/tkloczko/rpmbuild/BUILD/watchfiles-0.21.0/tests/test_watch.py", line 204, in watch
| raise KeyboardInterrupt('test error')
| KeyboardInterrupt: test error
+------------------------------------
------------------------------ Captured log call -------------------------------
watchfiles.main INFO: 1 change detected
=========================== short test summary info ============================
SKIPPED [1] tests/test_docs.py:105: output varies between versions
SKIPPED [1] tests/test_run_process.py:72: no need to test this except on windows
SKIPPED [1] tests/test_watch.py:192: different on windows
FAILED tests/test_watch.py::test_awatch_interrupt_raise - exceptiongroup.Base...
=================== 1 failed, 157 passed, 3 skipped in 3.66s ===================
closed as we've released v0.22 and v0.23.