Make files observable and refactor event handlers

This commit is contained in:
R. Richard
2019-06-27 14:12:01 +02:00
committed by Kristóf Tóth
parent 778f155580
commit ffe512776a
6 changed files with 123 additions and 81 deletions

View File

@ -1,7 +1,8 @@
# pylint: disable=too-few-public-methods
from time import time
from typing import Iterable
from time import time
from os.path import abspath, dirname, isfile
from watchdog.observers import Observer
from watchdog.events import FileSystemMovedEvent, PatternMatchingEventHandler
@ -65,28 +66,44 @@ class InotifyDirDeletedEvent(InotifyEvent):
class InotifyObserver:
def __init__(self, paths, patterns=None, exclude=None, recursive=False):
self._paths = paths
def __init__(self, path, patterns=[], exclude=None, recursive=False):
self._files = []
self._paths = path
self._patterns = patterns
self._exclude = exclude
self._recursive = recursive
self._observer = Observer()
self._reset(paths, patterns, exclude)
self._reset()
def _reset(self, paths, patterns, exclude):
_dispatch_event = self._dispatch_event
def _reset(self):
dispatch_event = self._dispatch_event
class TransformerEventHandler(PatternMatchingEventHandler):
def on_any_event(self, event):
_dispatch_event(event)
self.handler = TransformerEventHandler(patterns, exclude)
self._observer.unschedule_all()
if isinstance(paths, str):
self._observer.schedule(self.handler, paths, self._recursive)
elif isinstance(paths, Iterable):
for path in paths:
self._observer.schedule(self.handler, path, self._recursive)
dispatch_event(event)
if isinstance(self._paths, str):
self._paths = [self._paths]
if isinstance(self._paths, Iterable):
self._extract_files_from_paths()
else:
raise ValueError('Expected one or more strings representing paths.')
raise ValueError('Expected one or more string paths.')
patterns = self._files+self.patterns
self.handler = TransformerEventHandler(patterns if patterns else None, self.exclude)
self._observer.unschedule_all()
for path in self.paths:
self._observer.schedule(self.handler, path, self._recursive)
def _extract_files_from_paths(self):
files, paths = [], []
for path in self._paths:
if isfile(path):
new_file = abspath(path)
files.append(new_file)
paths.append(dirname(new_file))
else:
paths.append(path)
self._files, self._paths = files, paths
@property
def paths(self):
@ -95,7 +112,7 @@ class InotifyObserver:
@paths.setter
def paths(self, paths):
self._paths = paths
self._reset(paths, self._patterns, self._exclude)
self._reset()
@property
def patterns(self):
@ -104,7 +121,7 @@ class InotifyObserver:
@patterns.setter
def patterns(self, patterns):
self._patterns = patterns
self._reset(self._paths, patterns, self._exclude)
self._reset()
@property
def exclude(self):
@ -113,7 +130,7 @@ class InotifyObserver:
@exclude.setter
def exclude(self, exclude):
self._exclude = exclude
self._reset(self._paths, self._patterns, exclude)
self._reset()
def start(self):
self._observer.start()

View File

@ -11,8 +11,8 @@ from tempfile import TemporaryDirectory
import watchdog
import pytest
from inotify import InotifyObserver
from inotify import (
from .inotify import InotifyObserver
from .inotify import (
InotifyFileCreatedEvent, InotifyFileModifiedEvent, InotifyFileMovedEvent,
InotifyFileDeletedEvent, InotifyDirCreatedEvent, InotifyDirModifiedEvent,
InotifyDirMovedEvent, InotifyDirDeletedEvent
@ -113,8 +113,8 @@ def test_create(context):
assert context.check_any()
def test_modify(context):
with open(context.subfile, 'w') as ofile:
ofile.write('text')
with open(context.subfile, 'wb', buffering=0) as ofile:
ofile.write(b'text')
context.check_event(InotifyFileModifiedEvent, context.subfile)
while True:
try: