22
33import collections .abc as cabc
44import http .client
5+ import importlib .metadata
56import json
67import os
78import shutil
89import socket
910import ssl
1011import sys
1112import typing as t
13+ from importlib .metadata import PackageNotFoundError
1214from io import BytesIO
1315from pathlib import Path
1416from unittest .mock import Mock
1517from unittest .mock import patch
1618
1719import pytest
18- from watchdog import version as watchdog_version
19- from watchdog .events import EVENT_TYPE_MODIFIED
20- from watchdog .events import EVENT_TYPE_OPENED
21- from watchdog .events import FileModifiedEvent
2220
2321from werkzeug import run_simple
2422from werkzeug ._reloader import _find_stat_paths
3331 from conftest import DevServerClient
3432 from conftest import StartDevServer
3533
34+ try :
35+ watchdog_version : str = importlib .metadata .version ("watchdog" )
36+ except PackageNotFoundError :
37+ watchdog_version = ""
38+
3639
3740@pytest .mark .parametrize (
3841 "kwargs" ,
@@ -103,7 +106,14 @@ def test_ssl_object(dev_server: StartDevServer) -> None:
103106 assert r .json ["wsgi.url_scheme" ] == "https"
104107
105108
106- @pytest .mark .parametrize ("reloader_type" , ["stat" , "watchdog" ])
109+ require_watchdog = pytest .mark .skipif (
110+ not watchdog_version , reason = "watchdog not installed"
111+ )
112+
113+
114+ @pytest .mark .parametrize (
115+ "reloader_type" , ["stat" , pytest .param ("watchdog" , marks = [require_watchdog ])]
116+ )
107117@pytest .mark .skipif (
108118 os .name == "nt" and "CI" in os .environ , reason = "unreliable on Windows during CI"
109119)
@@ -127,8 +137,13 @@ def test_reloader_sys_path(
127137 assert client .request ().status == 200
128138
129139
140+ @require_watchdog
130141@patch .object (WatchdogReloaderLoop , "trigger_reload" )
131142def test_watchdog_reloader_ignores_opened (mock_trigger_reload : Mock ) -> None :
143+ from watchdog .events import EVENT_TYPE_MODIFIED
144+ from watchdog .events import EVENT_TYPE_OPENED
145+ from watchdog .events import FileModifiedEvent
146+
132147 reloader = WatchdogReloaderLoop ()
133148 modified_event = FileModifiedEvent ("" )
134149 modified_event .event_type = EVENT_TYPE_MODIFIED
@@ -143,12 +158,14 @@ def test_watchdog_reloader_ignores_opened(mock_trigger_reload: Mock) -> None:
143158
144159
145160@pytest .mark .skipif (
146- watchdog_version . VERSION_MAJOR < 5 ,
161+ watchdog_version < "5" ,
147162 reason = "'closed no write' event introduced in watchdog 5.0" ,
148163)
149164@patch .object (WatchdogReloaderLoop , "trigger_reload" )
150165def test_watchdog_reloader_ignores_closed_no_write (mock_trigger_reload : Mock ) -> None :
151- from watchdog .events import EVENT_TYPE_CLOSED_NO_WRITE # type: ignore[attr-defined]
166+ from watchdog .events import EVENT_TYPE_CLOSED_NO_WRITE
167+ from watchdog .events import EVENT_TYPE_MODIFIED
168+ from watchdog .events import FileModifiedEvent
152169
153170 reloader = WatchdogReloaderLoop ()
154171 modified_event = FileModifiedEvent ("" )
0 commit comments