diff --git a/imagekit/imagecache/strategies.py b/imagekit/imagecache/strategies.py index 7ec7252..e44929a 100644 --- a/imagekit/imagecache/strategies.py +++ b/imagekit/imagecache/strategies.py @@ -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) diff --git a/imagekit/specs/__init__.py b/imagekit/specs/__init__.py index e3a4407..7b5b0df 100644 --- a/imagekit/specs/__init__.py +++ b/imagekit/specs/__init__.py @@ -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