On Saturday 05 December 2009 13:40:40 Russell Keith-Magee wrote:

> * I'd rather the AddMessageFailure have a more generic name (like
> MessageFailure). I don't see any need to be task specific in the
> exception class name.

Another thing here we should think about: at the moment, fail_silently 
only silences the error for the messages framework not being 
installed.  But there are a lot of other ways the messages backend 
could potentially fail.  Should we silence those errors too? I would 
suggest not, or there should be a separate keyword argument for that.
But this should be clear in the docs.

> * I don't know why I didn't pick this up earlier, but the emerging
> convention for pluggable backends is for the user to specify the
>  name of the module, and for the module to have a predictable class
>  name. i.e - each storage backend module should have a
>  "StorageEngine" class, and the user specifies the name of the
>  module. There is also an emerging convention to call the pluggable
>  bits 'backends', rather than picking a name like 'storage'. Net
>  result: the user should be configuring
>  MESSAGE_BACKEND="django.contrib.messages.backends.user_messages"
>  rather than
> MESSAGE_STORAGE =
> 'django.contrib.messages.storage.user_messages.LegacyFallbackStorag
> e'

Hmm, it is 'emerging' only in that several established subsystems use 
it (db, session, cache) and the e-mail stuff just added uses this 
convention. There are other established conventions in the code base, 
some of which are more recent IIRC:

 * that used by the file storage classes, file upload handlers and the
   authentication backend where the specific class is referred to.
 * that used by the template loaders, where the specific callable
   is referred to.

I actually much prefer the explicit naming of a class/callable. Here 
are some arguments in favour of this method, some of which are 
stronger than others:

 * you can put multiple backends in one file if you want to, and you 
   are not forced to duplicate imports or get creative with module
   names if you happen to have several backends that really belong
   in the same module.

 * it is much more obvious for someone who does not know the code,
   since it doesn't rely on a convention of a class with a certain
   name. If they see the setting for MESSAGE_STORAGE pointing to 
   a class, they will immediately know where the implementation is,
   whereas if it points to a module and the module contains multiple
   classes, they will have to guess which class is the main one, or
   browse docs/source code.

 * it makes it less verbose and confusing if one backend refers to
   another (as happens with messages), because all the classes
   have different names, rather than having the same name.  We
   currently have:

 from django.contrib.messages.storage.fallback import FallbackStorage
 ...
 class LegacyFallbackStorage(FallbackStorage):
    storage_classes = (UserMessagesStorage,) +
                       FallbackStorage.storage_classes

which would need to be changed to:

 from django.contrib.messages.backends import fallback
 ...
 class StorageEngine(fallback.StorageEngine):
    storage_classes = (UserMessageStorageEngine,) +
                       fallback.StorageEngine.storage_classes

or, using 'as' for the import:

 from django.contrib.messages.backends.fallback import StorageEngine \
     as FallbackStorageEngine
 ...
 class StorageEngine(FallbackStorageEngine):
    storage_classes = (UserMessageStorageEngine,) +
                       FallbackStorageEngine.storage_classes

(the fallback storage module would have similar issues)

The DB subsystem, which uses backends, is big and has multiple 
classes, so it makes sense for it to be referred to by module names.  
But if there is exactly one class which implements a feature, I don't 
see the sense in having a setting that refers to the containing 
module. There might be a future proofing argument here, but for 
smaller features it sounds like YAGNI to me.

For the cache subsystem, the name of the module (without the 'path') 
is used as the protocol part of a URI-style setting, so it also makes 
sense for it to be short and lower case.

As for the e-mail and session subsystems, IMO they are using the less 
preferable convention. Some of the disadvantages mentioned above don't 
exist for the e-mail backends, because they don't use each other like 
the messages ones do.

Regards,

Luke

-- 
"Idiocy: Never underestimate the power of stupid people in large 
groups." (despair.com)

Luke Plant || http://lukeplant.me.uk/

--

You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-develop...@googlegroups.com.
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en.


Reply via email to