Wire up source events to specs (and image cache strategies)

Also change signal names to past tense to match convention.
This commit is contained in:
Matthew Tretter 2012-10-13 01:15:42 -04:00
parent 2222451712
commit 7447d147d4
2 changed files with 38 additions and 15 deletions

View file

@ -8,13 +8,13 @@ class Pessimistic(object):
"""
def on_access(self, file):
def on_accessed(self, file):
validate_now(file)
def on_source_delete(self, file):
def on_source_deleted(self, file):
clear_now(file)
def on_source_change(self, file):
def on_source_changed(self, file):
validate_now(file)
@ -25,13 +25,13 @@ class Optimistic(object):
"""
def on_source_create(self, file):
def on_source_created(self, file):
validate_now(file)
def on_source_delete(self, file):
def on_source_deleted(self, file):
clear_now(file)
def on_source_change(self, file):
def on_source_changed(self, file):
validate_now(file)
@ -52,6 +52,6 @@ class StrategyWrapper(object):
self._wrapped = strategy
def invoke_callback(self, name, *args, **kwargs):
func = getattr(self._wrapped, 'on_%s' % name, None)
func = getattr(self._wrapped, name, None)
if func:
func(*args, **kwargs)

View file

@ -4,6 +4,7 @@ import os
import pickle
from .signals import source_created, source_changed, source_deleted
from ..exceptions import UnknownExtensionError, AlreadyRegistered, NotRegistered
from ..files import ImageSpecFile
from ..imagecache.backends import get_default_image_cache_backend
from ..imagecache.strategies import StrategyWrapper
from ..lib import StringIO
@ -23,16 +24,16 @@ class SpecRegistry(object):
"""
signals = {
source_created: 'source_created',
source_changed: 'source_changed',
source_deleted: 'source_deleted',
}
_source_signals = [
source_created,
source_changed,
source_deleted,
]
def __init__(self):
self._specs = {}
self._sources = {}
for signal in self.signals.keys():
for signal in self._source_signals:
signal.connect(self.source_receiver)
def register(self, id, spec):
@ -62,13 +63,21 @@ class SpecRegistry(object):
self._sources[source].add(spec_id)
def source_receiver(self, sender, source_file, signal, **kwargs):
"""
Redirects signals dispatched on sources to the appropriate specs.
"""
source = sender
if source not in self._sources:
return
callback_name = self.signals[signal]
for spec in (self.get_spec(id) for id in self._sources[source]):
spec.image_cache_strategy.invoke_callback(callback_name, source_file)
event_name = {
source_created: 'source_created',
source_changed: 'source_changed',
source_deleted: 'source_deleted',
}
spec._handle_source_event(event_name, source_file)
class BaseImageSpec(object):
@ -176,6 +185,20 @@ class ImageSpec(BaseImageSpec):
self.image_cache_backend = image_cache_backend or self.image_cache_backend or get_default_image_cache_backend()
self.image_cache_strategy = StrategyWrapper(image_cache_strategy or self.image_cache_strategy)
# TODO: Can we come up with a better name for this? "process" may cause confusion with processors' process()
def apply(self, source_file):
"""
Creates a file object that represents the combination of a spec and
source file.
"""
return ImageSpecFile(self, source_file)
# TODO: I don't like this interface. Is there a standard Python one? pubsub?
def _handle_source_event(self, event_name, source_file):
file = self.apply(source_file)
self.image_cache_strategy.invoke_callback('on_%s' % event_name, file)
def generate_file(self, filename, source_file, save=True):
"""
Generates a new image file by processing the source file and returns