From fdf8c9fb4ec9d3da4f33c14356359bbbfd6b68ce Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Mon, 19 Nov 2012 20:13:19 -0500 Subject: [PATCH] refactored EventRegistry to play nice with saas. --- .../media-monitor2/media/monitor/events.py | 32 +++++++------------ .../media-monitor2/media/monitor/listeners.py | 6 ++-- .../media/saas/airtimeinstance.py | 6 ++++ 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/python_apps/media-monitor2/media/monitor/events.py b/python_apps/media-monitor2/media/monitor/events.py index fe7bc47f6..4914827c5 100644 --- a/python_apps/media-monitor2/media/monitor/events.py +++ b/python_apps/media-monitor2/media/monitor/events.py @@ -21,28 +21,20 @@ class PathChannel(object): # TODO : Move this to it's file. Also possible unsingleton and use it as a # simple module just like m.m.owners class EventRegistry(object): - """ - This class's main use is to keep track all events with a cookie attribute. - This is done mainly because some events must be 'morphed' into other events - because we later detect that they are move events instead of delete events. - """ - registry = {} - @staticmethod - def register(evt): EventRegistry.registry[evt.cookie] = evt - @staticmethod - def unregister(evt): del EventRegistry.registry[evt.cookie] - @staticmethod - def registered(evt): return evt.cookie in EventRegistry.registry - @staticmethod - def matching(evt): - event = EventRegistry.registry[evt.cookie] + """ This class's main use is to keep track all events with a cookie + attribute. This is done mainly because some events must be 'morphed' + into other events because we later detect that they are move events + instead of delete events. """ + def __init__(self): + self.registry = {} + def register(self,evt): self.registry[evt.cookie] = evt + def unregister(self,evt): del self.registry[evt.cookie] + def registered(self,evt): return evt.cookie in self.registry + def matching(self,evt): + event = self.registry[evt.cookie] # Want to disallow accessing the same event twice - EventRegistry.unregister(event) + self.unregister(event) return event - def __init__(self,*args,**kwargs): - raise Exception("You can instantiate this class. Must only use class \ - methods") - class EventProxy(Loggable): """ diff --git a/python_apps/media-monitor2/media/monitor/listeners.py b/python_apps/media-monitor2/media/monitor/listeners.py index c268319e8..5757b9203 100644 --- a/python_apps/media-monitor2/media/monitor/listeners.py +++ b/python_apps/media-monitor2/media/monitor/listeners.py @@ -73,11 +73,11 @@ class StoreWatchListener(BaseListener, Loggable, pyinotify.ProcessEvent): def process_IN_CLOSE_WRITE(self, event): self.process_create(event) def process_IN_MOVED_TO(self, event): - if EventRegistry.registered(event): + if user().event_registry.registered(event): # We need this trick because we don't how to "expand" dir events # into file events until we know for sure if we deleted or moved morph = MoveDir(event) if event.dir else MoveFile(event) - EventRegistry.matching(event).morph_into(morph) + user().event_registry.matching(event).morph_into(morph) else: self.process_create(event) def process_IN_MOVED_FROM(self, event): # Is either delete dir or delete file @@ -85,7 +85,7 @@ class StoreWatchListener(BaseListener, Loggable, pyinotify.ProcessEvent): # evt can be none whenever event points that a file that would be # ignored by @IncludeOnly if hasattr(event,'cookie') and (evt != None): - EventRegistry.register(evt) + user().event_registry.register(evt) def process_IN_DELETE(self,event): self.process_delete(event) def process_IN_MOVE_SELF(self, event): if '-unknown-path' in event.pathname: diff --git a/python_apps/media-monitor2/media/saas/airtimeinstance.py b/python_apps/media-monitor2/media/saas/airtimeinstance.py index 6293fe61d..67e7f8beb 100644 --- a/python_apps/media-monitor2/media/saas/airtimeinstance.py +++ b/python_apps/media-monitor2/media/saas/airtimeinstance.py @@ -5,6 +5,7 @@ from media.monitor.exceptions import NoConfigFile from media.monitor.pure import LazyProperty from media.monitor.config import MMConfig from media.monitor.owners import Owner +from media.monitor.events import EventRegistry from media.monitor.listeners import FileMediator from api_clients.api_client import AirtimeApiClient @@ -52,6 +53,11 @@ class AirtimeInstance(object): @LazyProperty def owner(self): return Owner() + + @LazyProperty + def event_registry(self): + return EventRegistry() + @LazyProperty def file_mediator(self): return FileMediator()