mirror of
				https://github.com/avatao-content/baseimage-tutorial-framework
				synced 2025-11-04 06:22:55 +00:00 
			
		
		
		
	Make files observable and refactor event handlers
This commit is contained in:
		@@ -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()
 | 
			
		||||
 
 | 
			
		||||
@@ -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:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user