Changelog#
7.0.0-dev#
202x-xx-xx • full history
Breaking Changes
[core] Changed pattern matching mechanism from using
path.match()topath.full_match(). Users must update patterns to glob-like syntax: e.g., *.py to **/*.py. (#1101)
Other Changes
[core]
ObservedWatchequality now includesfollow_symlink, so scheduling a path a second time with a differentfollow_symlinkvalue no longer collapses onto the first watch and silently drops the request. (#1262)[core]
dispatch_events()no longer re-adds a watch thatunschedule()removed, which leaked one_handlersentry per watch that had an event in flight. (#1261)[docs]
FileSystemEventno longer claims to be immutable; its fields stay writable and the hash is derived from them, so mutating an event held in a dict or set strands it there. (#1240)[docs] Note that
FileClosedEvent,FileClosedNoWriteEventandFileOpenedEvent, and theiron_closed(),on_closed_no_write()andon_opened()handlers, are emitted only byInotifyObserveron Linux. (#1235)[windows] Event file names are decoded as UTF-16LE, so a name starting with U+FEFF or U+FFFE no longer reports the wrong path. (#1228)
[windows] Changing only the case of a name no longer emits a deletion event on top of the move event. (#752)
[bsd] Do not let a
PermissionErrorraised while registering a kevent kill the emitter thread. (#1115)[core] Add context manager support to
Observerclass. The observer can now be used with awithstatement for automatic start/stop management. (#1090)[freebsd] Supports
inotifyon FreeBSD 15+. (#1147)[core] Adjust
Observer.schedule()pathtype annotation to reflect thepathlib.Pathsupport. (#1096)[core] Add support for the
follow_symlinkkeyword argument toObservedWatch. (#1086)[fsevents] Add support for the
follow_symlinkkeyword argument. (#1086)[inotify] Reduce number of created inotify instance. (#1099)
[inotify] Add support for the
follow_symlinkkeyword argument. (#1086)[utils] Fixed
repr(EmptyDirectorySnapshot), before that it was throwing anAttributeError: 'EmptyDirectorySnapshot' object has no attribute '_stat_info'.[utils] Implemented
len(DirectorySnapshotDiff)to return the total number of changes.[core] Fixed
generate_sub_moved_events()corrupting paths when the directory name appears multiple times in the path. (#1158)Thanks to our beloved contributors: @BoboTiG, @tybug, @Corentin-pro, @kirkhansen, @JoachimCoenen, @blitztide, @Skeletor-Pirate
[core] Call
task_done()for the stop sentinel indispatch_events()to preventjoin()from hanging. (#1159)[docs] Document that
BaseThreadalways runs as a daemon thread, instead of inheritingdaemonfrom the creating thread as the inheritedthreading.Threaddocumentation states. (#1117)[core] Add
win_arm64to the list of platform-specific wheels published to PyPI. (#1137)[watchmedo] The
AutoRestartTrickstop signal is now actually delivered on Windows. The subprocess is started in its own process group and signalled withCTRL_BREAK_EVENT, so it can run cleanup handlers and its descendants are no longer orphaned on every restart. (#1221)
6.0.0#
2024-11-01 • full history
Pin test dependencies.
[docs] Add typing info to quick start. (#1082)
[inotify] Use of
select.poll()instead of deprecatedselect.select(), if available. (#1078)[inotify] Fix reading inotify file descriptor after closing it. (#1081)
[utils] The
stop_signalkeyword-argument type of theAutoRestartTrickclass can now be either asignal.Signalsor anint.[utils] Added the
__repr__()method to theTrickclass.[utils] Removed the unused
echo_class()function from theechomodule.[utils] Removed the unused
echo_instancemethod()function from theechomodule.[utils] Removed the unused
echo_module()function from theechomodule.[utils] Removed the unused
is_class_private_name()function from theechomodule.[utils] Removed the unused
is_classmethod()function from theechomodule.[utils] Removed the unused
ic_method(met()function from theechomodule.[utils] Removed the unused
method_name()function from theechomodule.[utils] Removed the unused
name()function from theechomodule.[watchmedo] Fixed Mypy issues.
[watchmedo] Added the
__repr__()method to theHelpFormatterclass.[watchmedo] Removed the
--traceCLI argument from thewatchmedo logcommand, useless since events are logged by default at theLoggerTrickclass level.[windows] Fixed Mypy issues.
Thanks to our beloved contributors: @BoboTiG, @g-pichler, @ethan-vanderheijden, @nhairs
5.0.3#
2024-09-27 • full history
[inotify] Improve cleaning up
Inotifythreads, and addeventlettest cases (#1070)Thanks to our beloved contributors: @BoboTiG, @ethan-vanderheijden
5.0.2#
2024-09-03 • full history
5.0.1#
2024-09-02 • full history
[kqueue] Fix
TypeError: kqueue.control() only accepts positional parameters(#1062)Thanks to our beloved contributors: @apoirier, @BoboTiG
5.0.0#
2024-08-26 • full history
Breaking Changes
Drop support for Python 3.8 (#1055)
[core] Enforced usage of proper keyword-arguments (#1057)
[core] Renamed the
BaseObserverSubclassCallableclass toObserverType(#1055)[inotify] Renamed the
inotify_event_structclass toInotifyEventStruct(#1055)[inotify] Renamed the
UnsupportedLibcexception toUnsupportedLibcError(#1057)[inotify] Removed the
InotifyConstants.IN_CLOSEconstant (#1046)[watchmedo] Renamed the
LogLevelExceptionexception toLogLevelError(#1057)[watchmedo] Renamed the
WatchdogShutdownexception toWatchdogShutdownError(#1057)[windows] Renamed the
FILE_NOTIFY_INFORMATIONclass toFileNotifyInformation(#1055)[windows] Removed the unused
WATCHDOG_TRAVERSE_MOVED_DIR_DELAYconstant (#1057)
Other Changes
[core] Enable
disallow_untyped_callsMypy rule (#1055)[core] Enable
disallow_untyped_defsMypy rule (#1060)[core] Improve typing references for events (#1040)
[inotify] Add support for
IN_CLOSE_NOWRITEevents. AFileClosedNoWriteEventevent will be fired, and itson_closed_no_write()dispatcher has been introduced (#1046)Thanks to our beloved contributors: @BoboTiG
4.0.2#
2024-08-11 • full history
Add support for Python 3.13 (#1052)
[core] Run
ruff, apply several fixes (#1033)[core] Remove execution rights from
events.py[documentation] Update
PatternMatchingEventHandlerdocstrings (#1048)[documentation] Simplify the quickstart example (#1047)
[fsevents] Add missing
event_filterkeyword-argument toFSEventsObserver.schedule()(#1049)[utils] Fix a possible race condition in
AutoRestartTrick(#1002)[watchmedo] Remove execution rights from
watchmedo.pyThanks to our beloved contributors: @BoboTiG, @nbelakovski, @ivg
4.0.1#
2024-05-23 • full history
[inotify] Fix missing
event_filterfor the full emitter (#1032)Thanks to our beloved contributors: @mraspaud, @BoboTiG
4.0.0#
2024-02-06 • full history
Drop support for Python 3.7.
Add support for Python 3.12.
[snapshot] Add typing to
dirsnapshot(#1012)[snapshot] Added
DirectorySnapshotDiff.ContextManager(#1011)[events]
FileSystemEvent, and subclasses, are nowdataclass``es, and their ``repr()has changed[windows]
WinAPINativeEventis now adataclass, and itsrepr()has changed[events] Log
FileOpenedEvent, andFileClosedEvent, events inLoggingEventHandler[tests] Improve
FileSystemEventcoverage[watchmedo] Log all events in
LoggerTrick[windows] The
observers.read_directory_changes.WATCHDOG_TRAVERSE_MOVED_DIR_DELAYhack was removed. The constant will be kept to prevent breaking other software.Thanks to our beloved contributors: @BoboTiG, @msabramo
3.0.0#
2023-03-20 • full history
Drop support for Python 3.6.
watchdogis now PEP 561 compatible, and tested withmypyFix missing
>inFileSystemEvent.__repr__()(#980)[ci] Lots of improvements
[inotify] Return from
InotifyEmitter.queue_events()if not launched when thread is inactive (#963)[tests] Stability improvements
[utils] Remove handling of
threading.Event.isSetspelling (#962)[watchmedo] Fixed tricks YAML generation (#965)
Thanks to our beloved contributors: @kurtmckee, @altendky, @agroszer, @BoboTiG
2.3.1#
2023-02-28 • full history
Run
blackon the entire source codeBundle the
requirements-tests.txtfile in the source distribution (#939)[watchmedo] Exclude
FileOpenedEventevents fromAutoRestartTrick, andShellCommandTrick, to restore watchdog < 2.3.0 behavior. A better solution should be found in the future. (#949)[watchmedo] Log
FileOpenedEvent, andFileClosedEvent, events inLoggerTrickThanks to our beloved contributors: @BoboTiG
2.3.0#
2023-02-23 • full history
[inotify] Add support for
IN_OPENevents: aFileOpenedEventevent will be fired (#941)[watchmedo] Add optional event debouncing for
auto-restart, only restarting once if many events happen in quick succession (--debounce-interval) (#940)[watchmedo] Exit gracefully on
KeyboardInterruptexception (Ctrl+C) (#945)[watchmedo] Add option to not auto-restart the command after it exits (
--no-restart-on-command-exit) (#946)Thanks to our beloved contributors: @BoboTiG, @dstaple, @taleinat, @cernekj
2.2.1#
2023-01-01 • full history
Enable
mypyto discover type hints as specified in PEP 561 (#933)[ci] Set the expected Python version when building release files
[ci] Update actions versions in use
[watchmedo] [regression] Fix usage of missing
signal.SIGHUPattribute on non-Unix OSes (#935)Thanks to our beloved contributors: @BoboTiG, @simon04, @piotrpdev
2.2.0#
2022-12-05 • full history
[build] Wheels are now available for Python 3.11 (#932)
[documentation] HTML documentation builds are now tested for errors (#902)
[documentation] Fix typos here, and there (#910)
[fsevents2] The
fsevents2observer is now deprecated (#909)[tests] The error message returned by musl libc for error code
-1is now allowed (#923)[utils] Remove unnecessary code in
dirsnapshot.py(#930)[watchmedo] Handle shutdown events from
SIGHUP(#912)Thanks to our beloved contributors: @kurtmckee, @babymastodon, @QuantumEnergyE, @timgates42, @BoboTiG
2.1.9#
2022-06-10 • full history
[fsevents] Fix flakey test to assert that there are no errors when stopping the emitter.
[inotify] Suppress occasional
OSError: [Errno 9] Bad file descriptorat shutdown. (#805)[watchmedo] Make
auto-restartrestart the sub-process if it terminates. (#896)[watchmedo] Avoid zombie sub-processes when running
shell-commandwithout--wait. (#405)Thanks to our beloved contributors: @samschott, @taleinat, @altendky, @BoboTiG
2.1.8#
2022-05-15 • full history
Fix adding failed emitters on observer schedule. (#872)
[inotify] Fix hang when unscheduling watch on a path in an unmounted filesystem. (#869)
[watchmedo] Fix broken parsing of
--kill-afterargument for theauto-restartcommand. (#870)[watchmedo] Fix broken parsing of boolean arguments. (#887)
[watchmedo] Fix broken parsing of commands from
auto-restart, andshell-command. (#888)[watchmedo] Support setting verbosity level via
-q/--quietand-v/--verbosearguments. (#889)Thanks to our beloved contributors: @taleinat, @kianmeng, @palfrey, @IlayRosenberg, @BoboTiG
2.1.7#
2022-03-25 • full history
Eliminate timeout in waiting on event queue. (#861)
[inotify] Fix
notequality implementation forInotifyEvent. (#848)[watchmedo] Fix calling commands from within a Python script. (#879)
[watchmedo]
PyYAMLis loaded only when strictly necessary. Simple usages ofwatchmedoare possible without the module being installed. (#847)Thanks to our beloved contributors: @sattlerc, @JanzenLiu, @BoboTiG
2.1.6#
2021-10-01 • full history
[bsd] Fixed returned paths in
kqueue.pyand restored the overall results of the test suite. (#842)[bsd] Updated FreeBSD CI support .(#841)
[watchmedo] Removed the
arghdependency in favor of the builtinargparsemodule. (#836)[watchmedo] Removed unexistant
WindowsApiAsyncObserverreferences and--debug-force-winapi-asyncarguments.[watchmedo] Improved the help output.
Thanks to our beloved contributors: @knobix, @AndreaRe9, @BoboTiG
2.1.5#
2021-08-23 • full history
2.1.4#
2021-08-19 • full history
[watchmedo] Fix usage of
os.setsid()andos.killpg()Unix-only functions. (#809)[mac] Fix missing
FileModifiedEventon permission or ownership changes of a file. (#815)[mac] Convert absolute watch path in
FSEeventsEmitterwithos.path.realpath(). (#822)Fix a possible
AttributeErrorinSkipRepeatsQueue._put(). (#818)Allow overriding or adding custom event handlers to event dispatch map. (#814)
Fix tests on big endian platforms. (#828)
Thanks to our beloved contributors: @replabrobin, @BoboTiG, @SamSchott, @AndreiB97, @NiklasRosenstein, @ikokollari, @mgorny
2.1.3#
2021-06-26 • full history
Publish macOS
arm64anduniversal2wheels. (#740)Thanks to our beloved contributors: @kainjow, @BoboTiG
2.1.2#
2021-05-19 • full history
2.1.1#
2021-05-10 • full history
[mac] Fix callback exceptions when the watcher is deleted but still receiving events (#786)
Thanks to our beloved contributors: @rom1win, @BoboTiG, @CCP-Aporia
2.1.0#
2021-05-04 • full history
2.0.3#
2021-04-22 • full history
2.0.2#
2021-02-22 • full history
[mac] Add missing exception objects (#766)
Thanks to our beloved contributors: @CCP-Aporia, @BoboTiG
2.0.1#
2021-02-17 • full history
2.0.0#
2021-02-11 • full history
Avoid deprecated
PyEval_InitThreadson Python 3.7+ (#746)[inotify] Add support for
IN_CLOSE_WRITEevents. AFileCloseEventevent will be fired. Note thatIN_CLOSE_NOWRITEevents are not handled to prevent much noise. (#184, #245, #280, #313, #690)[inotify] Allow to stop the emitter multiple times (#760)
[mac] Support coalesced filesystem events (#734)
[mac] Drop support for macOS 10.12 and earlier (#750)
[mac] Fix an issue when renaming an item changes only the casing (#750)
Thanks to our beloved contributors: @bstaletic, @lukassup, @ysard, @SamSchott, @CCP-Aporia, @BoboTiG
1.0.2#
2020-12-18 • full history
Wheels are published for GNU/Linux, macOS and Windows (#739)
[mac] Fix missing
event_idattribute infsevents(#721)[mac] Return byte paths if a byte path was given in
fsevents(#726)[mac] Add compatibility with old macOS versions (#733)
Uniformize event for deletion of watched dir (#727)
Thanks to our beloved contributors: @SamSchott, @CCP-Aporia, @di, @BoboTiG
1.0.1#
2020-12-10 • Fix version with good metadatas.
1.0.0#
2020-12-10 • full history
Versioning is now following the semver
Drop support for Python 2.7, 3.4 and 3.5
[mac] Regression fixes for native
fsevents(#717)[windows]
winapi.BUFFER_SIZEnow defaults to64000(instead of2048) (#700)[windows] Introduced
winapi.PATH_BUFFER_SIZE(defaults to2048) to keep the old behavior with path-realted functions (#700)Use
pathlibfrom the standard library, instead of pathtools (#556)Allow file paths on Unix that don’t follow the file system encoding (#703)
Removed the long-time deprecated
events.LoggingFileSystemEventHandlerclass, useLoggingEventHandlerinsteadThanks to our beloved contributors: @SamSchott, @bstaletic, @BoboTiG, @CCP-Aporia
0.10.4#
2020-11-21 • full history
Add
loggerparameter for theLoggingEventHandler(#676)Replace mutable default arguments with
if Noneimplementation (#677)Expand tests to Python 2.7 and 3.5-3.10 for GNU/Linux, macOS and Windows
[mac] Performance improvements for the
fseventsmodule (#680)[mac] Prevent compilation of
watchdog_fsevents.con non-macOS machines (#687)[watchmedo] Handle shutdown events from
SIGTERMandSIGINTmore reliably (#693)Thanks to our beloved contributors: @Sraw, @CCP-Aporia, @BoboTiG, @maybe-sybr
0.10.3#
2020-06-25 • full history
0.10.2#
2020-02-08 • full history
Fixed the
build_extcommand on macOS Catalina (#628)Fixed the installation of macOS requirements on non-macOS OSes (#635)
Refactored
dispatch()method ofFileSystemEventHandler,PatternMatchingEventHandlerandRegexMatchingEventHandler[bsd] Improved tests support on non Windows/Linux platforms (#633, #639)
[bsd] Added FreeBSD CI support (#532)
Thanks to our beloved contributors: @BoboTiG, @evilham, @danilobellini
0.10.1#
2020-01-30 • full history
Fixed Python 2.7 to 3.6 installation when the OS locale is set to POSIX (#615)
Moved requirements to
setup.cfg(#617)[mac] Removed old C code for Python 2.5 in the fsevents C implementation
[snapshot] Added
EmptyDirectorySnapshot(#613)Thanks to our beloved contributors: @Ajordat, @tehkirill, @BoboTiG
0.10.0#
2020-01-26 • full history
Breaking Changes
Dropped support for Python 2.6, 3.2 and 3.3
Emitters that failed to start are now removed
[snapshot] Removed the deprecated
walker_callbackargument, usestatinstead[watchmedo] The utility is no more installed by default but via the extra
watchdog[watchmedo]
Other Changes
Fixed several Python 3 warnings
Identify synthesized events with
is_syntheticattribute (#369)Use
os.scandir()to improve memory usage (#503)[bsd] Fixed flavors of FreeBSD detection (#529)
[bsd] Skip unprocessable socket files (#509)
[inotify] Fixed events containing non-ASCII characters (#516)
[inotify] Fixed the way
OSErrorare re-raised (#377)[inotify] Fixed wrong source path after renaming a top level folder (#515)
[inotify] Removed delay from non-move events (#477)
[mac] Fixed a bug when calling
FSEventsEmitter.stop()twice (#466)[mac] Support for unscheduling deleted watch (#541)
[mac] Fixed missing field initializers and unused parameters in
watchdog_fsevents.c[snapshot] Don’t walk directories without read permissions (#408)
[snapshot] Fixed a race condition crash when a directory is swapped for a file (#513)
[snasphot] Fixed an
AttributeErrorabout forgottenpath_for_inodeattr (#436)[snasphot] Added the
ignore_device=Falseparameter to the ctor (597)[watchmedo] Fixed the path separator used (#478)
[watchmedo] Fixed the use of
yaml.load()foryaml.safe_load()(#453)[watchmedo] Handle all available signals (#549)
[watchmedo] Added the
--debug-force-pollingargument (#404)[windows] Fixed issues when the observed directory is deleted (#570 and #601)
[windows]
WindowsApiEmittermade easier to subclass (#344)[windows] Use separate ctypes DLL instances
[windows] Generate sub created events only if
recursive=True(#454)Thanks to our beloved contributors: @BoboTiG, @LKleinNux, @rrzaripov, @wildmichael, @TauPan, @segevfiner, @petrblahos, @QuantumEnergyE, @jeffwidman, @kapsh, @nickoala, @petrblahos, @julianolf, @tonybaloney, @mbakiev, @pR0Ps, javaguirre, @skurfer, @exarkun, @joshuaskelly, @danilobellini, @Ajordat
0.9.0#
2018-08-28 • full history
Deleting the observed directory now emits a
DirDeletedEventevent[bsd] Improved the platform detection (#378)
[inotify] Fixed a crash when the root directory being watched by was deleted (#374)
[inotify] Handle systems providing uClibc
[linux] Fixed a possible
DirDeletedEventduplication when deleting a directory[mac] Fixed unicode path handling
fsevents2.py(#298)[watchmedo] Added the
--debug-force-pollingargument (#336)[windows] Fixed the
FILE_LIST_DIRECTORYconstant (#376)Thanks to our beloved contributors: @vulpeszerda, @hpk42, @tamland, @senden9, @gorakhargosh, @nolsto, @mafrosis, @DonyorM, @anthrotype, @danilobellini, @pierregr, @ShinNoNoir, @adrpar, @gforcada, @pR0Ps, @yegorich, @dhke
0.8.3#
2015-02-11 • full history
Fixed the use of the root logger (#274)
[inotify] Refactored libc loading and improved error handling in
inotify_c.py[inotify] Fixed a possible unbound local error in
inotify_c.pyThanks to our beloved contributors: @mmorearty, @tamland, @tony, @gorakhargosh
0.8.2#
2014-10-29 • full history
Event emitters are no longer started on schedule if
Observeris not already running[mac] Fixed unused arguments to pass clang compilation (#265)
[snapshot] Fixed a possible race condition crash on directory deletion (#281)
[windows] Fixed an error when watching the same folder again (#270)
Thanks to our beloved contributors: @tamland, @apetrone, @Falldog, @theospears
0.8.1#
2014-07-28 • full history
0.8.0#
2014-07-02 • full history
Fixed
arghdeprecation warnings (#242)[snapshot] Methods returning internal stats info were replaced by
mtime(),inode()andpath()methods[snapshot] Deprecated the
walker_callbackargument[watchmedo] Fixed
auto-restartto terminate all children processes (#225)[watchmedo] Added the
--no-parallelargument (#227)[windows] Fixed the value of
INVALID_HANDLE_VALUE(#123)[windows] Fixed octal usages to work with Python 3 as well (#223)
Thanks to our beloved contributors: @tamland, @Ormod, @berdario, @cro, @BernieSumption, @pypingou, @gotcha, @tommorris, @frewsxcv