cc-4105: major code reformatting effort

This commit is contained in:
Rudi Grinberg 2012-08-13 17:31:54 -04:00
parent 5d33ca7c6f
commit 3af6036d9e
4 changed files with 44 additions and 59 deletions

View File

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from kombu.messaging import Exchange, Queue, Consumer from kombu.messaging import Exchange, Queue, Consumer
from kombu.connection import BrokerConnection from kombu.connection import BrokerConnection
import json import json
import os import os
@ -7,12 +7,12 @@ import copy
import traceback import traceback
from media.monitor.exceptions import BadSongFile from media.monitor.exceptions import BadSongFile
from media.monitor.metadata import Metadata from media.monitor.metadata import Metadata
from media.monitor.log import Loggable from media.monitor.log import Loggable
from media.monitor.syncdb import AirtimeDB from media.monitor.syncdb import AirtimeDB
from media.monitor.exceptions import DirectoryIsNotListed from media.monitor.exceptions import DirectoryIsNotListed
from media.monitor.bootstrap import Bootstrapper from media.monitor.bootstrap import Bootstrapper
from media.monitor.listeners import FileMediator from media.monitor.listeners import FileMediator
from api_clients import api_client as apc from api_clients import api_client as apc
@ -39,7 +39,7 @@ class AirtimeNotifier(Loggable):
self.connection = BrokerConnection(cfg["rabbitmq_host"], self.connection = BrokerConnection(cfg["rabbitmq_host"],
cfg["rabbitmq_user"], cfg["rabbitmq_password"], cfg["rabbitmq_user"], cfg["rabbitmq_password"],
cfg["rabbitmq_vhost"]) cfg["rabbitmq_vhost"])
channel = self.connection.channel() channel = self.connection.channel()
consumer = Consumer(channel, schedule_queue) consumer = Consumer(channel, schedule_queue)
consumer.register_callback(self.handle_message) consumer.register_callback(self.handle_message)
consumer.consume() consumer.consume()
@ -63,12 +63,12 @@ class AirtimeNotifier(Loggable):
class AirtimeMessageReceiver(Loggable): class AirtimeMessageReceiver(Loggable):
def __init__(self, cfg, manager): def __init__(self, cfg, manager):
self.dispatch_table = { self.dispatch_table = {
'md_update' : self.md_update, 'md_update' : self.md_update,
'new_watch' : self.new_watch, 'new_watch' : self.new_watch,
'remove_watch' : self.remove_watch, 'remove_watch' : self.remove_watch,
'rescan_watch' : self.rescan_watch, 'rescan_watch' : self.rescan_watch,
'change_stor' : self.change_storage, 'change_stor' : self.change_storage,
'file_delete' : self.file_delete, 'file_delete' : self.file_delete,
} }
self.cfg = cfg self.cfg = cfg
self.manager = manager self.manager = manager
@ -99,9 +99,9 @@ class AirtimeMessageReceiver(Loggable):
raise ValueError("You must provide either directory_id or \ raise ValueError("You must provide either directory_id or \
directory") directory")
sdb = AirtimeDB(apc.AirtimeApiClient.create_right_config()) sdb = AirtimeDB(apc.AirtimeApiClient.create_right_config())
if directory: directory = os.path.normpath(directory) if directory : directory = os.path.normpath(directory)
if directory_id == None: directory_id = sdb.to_id(directory) if directory_id == None : directory_id = sdb.to_id(directory)
if directory == None: directory = sdb.to_directory(directory_id) if directory == None : directory = sdb.to_directory(directory_id)
try: try:
bs = Bootstrapper( sdb, self.manager.watch_signal() ) bs = Bootstrapper( sdb, self.manager.watch_signal() )
bs.flush_watch( directory=directory, last_ran=self.cfg.last_ran() ) bs.flush_watch( directory=directory, last_ran=self.cfg.last_ran() )
@ -181,6 +181,11 @@ class AirtimeMessageReceiver(Loggable):
try: try:
self.logger.info("Attempting to delete '%s'" % self.logger.info("Attempting to delete '%s'" %
msg['filepath']) msg['filepath'])
# We use FileMediator to ignore any paths with
# msg['filepath'] so that we do not send a duplicate delete
# request that we'd normally get form pyinotify. But right
# now event contractor would take care of this sort of
# thing anyway so this might not be necessary after all
FileMediator.ignore(msg['filepath']) FileMediator.ignore(msg['filepath'])
os.unlink(msg['filepath']) os.unlink(msg['filepath'])
if not os.path.exists(msg['filepath']): if not os.path.exists(msg['filepath']):
@ -189,11 +194,11 @@ class AirtimeMessageReceiver(Loggable):
except Exception as e: except Exception as e:
self.logger.info("Failed to delete '%s'" % msg['filepath']) self.logger.info("Failed to delete '%s'" % msg['filepath'])
self.logger.info("Error: " % str(e)) self.logger.info("Error: " % str(e))
else: else: # validation for filepath existence failed
self.logger.info("Attempting to delete file '%s' that does not \ self.logger.info("Attempting to delete file '%s' that does not \
exist. Full request coming:" % msg['filepath']) exist. Full request coming:" % msg['filepath'])
self.logger.info(msg) self.logger.info(msg)
else: else: # we did not get the special 'delete' tag. no deleting
self.logger.info("No clippy confirmation, ignoring event. \ self.logger.info("No clippy confirmation, ignoring event. \
Out of curiousity we will print some details.") Out of curiousity we will print some details.")
self.logger.info(msg) self.logger.info(msg)

View File

@ -95,11 +95,11 @@ class BaseEvent(Loggable):
# nothing to see here, please move along # nothing to see here, please move along
def morph_into(self, evt): def morph_into(self, evt):
self.logger.info("Morphing %s into %s" % ( str(self), str(evt) ) ) self.logger.info("Morphing %s into %s" % ( str(self), str(evt) ) )
self._raw_event = evt self._raw_event = evt
self.path = evt.path self.path = evt.path
self.add_safe_pack_hook(evt._pack_hook) self.__class__ = evt.__class__
self.__class__ = evt.__class__
evt._morph_target = True evt._morph_target = True
self.add_safe_pack_hook(evt._pack_hook)
return self return self
class FakePyinotify(object): class FakePyinotify(object):
@ -186,7 +186,7 @@ class DeleteDirWatch(BaseEvent):
super(DeleteDirWatch, self).__init__(*args, **kwargs) super(DeleteDirWatch, self).__init__(*args, **kwargs)
def pack(self): def pack(self):
req_dict = {} req_dict = {}
req_dict['mode'] = u'delete_dir' req_dict['mode'] = u'delete_dir'
req_dict['MDATA_KEY_FILEPATH'] = unicode( self.path + "/" ) req_dict['MDATA_KEY_FILEPATH'] = unicode( self.path + "/" )
return [req_dict] return [req_dict]

View File

@ -36,13 +36,12 @@ from media.monitor.log import Loggable, get_logger
# OrganizeListener('watch_signal') <= wrong # OrganizeListener('watch_signal') <= wrong
# OrganizeListener(signal='watch_signal') <= right # OrganizeListener(signal='watch_signal') <= right
# TODO : remove this FileMediator stuff it's not used anywhere and it's too
# complicated
class FileMediator(object): class FileMediator(object):
"""
FileMediator is used an intermediate mechanism that filters out certain
events.
"""
ignored_set = set([]) # for paths only ignored_set = set([]) # for paths only
# TODO : unify ignored and skipped.
# for "special" conditions. could be generalized but too lazy now.
skip_checks = set([])
logger = get_logger() logger = get_logger()
@staticmethod @staticmethod
@ -51,31 +50,10 @@ class FileMediator(object):
def ignore(path): FileMediator.ignored_set.add(path) def ignore(path): FileMediator.ignored_set.add(path)
@staticmethod @staticmethod
def unignore(path): FileMediator.ignored_set.remove(path) def unignore(path): FileMediator.ignored_set.remove(path)
@staticmethod
def skip_next(*what_to_skip,**kwargs):
# Poor man's default arguments
if 'key' not in kwargs: kwargs['key'] = 'maskname'
for skip in what_to_skip:
# standard nasty hack, too long to explain completely in comments
# but the gist of it is:
# 1. python's scoping rules are sometimes strange.
# 2. workaround is very similar to what you do in javascript when
# you write stuff like (function (x,y) { console.log(x+y); })(2,4)
# to be avoid clobbering peoples' namespace.
skip_check = (lambda skip:
lambda v: getattr(v,kwargs['key']) == skip)(skip)
FileMediator.skip_checks.add( skip_check )
def mediate_ignored(fn): def mediate_ignored(fn):
def wrapped(self, event, *args,**kwargs): def wrapped(self, event, *args,**kwargs):
event.pathname = unicode(event.pathname, "utf-8") event.pathname = unicode(event.pathname, "utf-8")
skip_events = [s_check for s_check in FileMediator.skip_checks
if s_check(event)]
for s_check in skip_events:
FileMediator.skip_checks.remove( s_check )
# Only process skip_checks one at a time
FileMediator.logger.info("Skip checked: '%s'" % str(event))
return
if FileMediator.is_ignored(event.pathname): if FileMediator.is_ignored(event.pathname):
FileMediator.logger.info("Ignoring: '%s' (once)" % event.pathname) FileMediator.logger.info("Ignoring: '%s' (once)" % event.pathname)
FileMediator.unignore(event.pathname) FileMediator.unignore(event.pathname)

View File

@ -2,20 +2,22 @@
import sys import sys
import os import os
from media.monitor.manager import Manager from media.monitor.manager import Manager
from media.monitor.bootstrap import Bootstrapper from media.monitor.bootstrap import Bootstrapper
from media.monitor.log import get_logger, setup_logging from media.monitor.log import get_logger, setup_logging
from media.monitor.config import MMConfig from media.monitor.config import MMConfig
from media.monitor.toucher import ToucherThread from media.monitor.toucher import ToucherThread
from media.monitor.syncdb import AirtimeDB from media.monitor.syncdb import AirtimeDB
from media.monitor.exceptions import FailedToObtainLocale, FailedToSetLocale, \ from media.monitor.exceptions import FailedToObtainLocale, \
NoConfigFile FailedToSetLocale, \
from media.monitor.airtime import AirtimeNotifier, AirtimeMessageReceiver NoConfigFile
from media.monitor.watchersyncer import WatchSyncer from media.monitor.airtime import AirtimeNotifier, \
from media.monitor.eventdrainer import EventDrainer AirtimeMessageReceiver
from media.monitor.watchersyncer import WatchSyncer
from media.monitor.eventdrainer import EventDrainer
from media.update.replaygainupdater import ReplayGainUpdater from media.update.replaygainupdater import ReplayGainUpdater
import media.monitor.pure as mmp
import media.monitor.pure as mmp
from api_clients import api_client as apc from api_clients import api_client as apc