Make message ids into "rocks", was Re: [Zope3-dev] Re: SVN: Zope3/trunk/src/zope/ Internationalized apidoc modules description.

Dmitry Vasiliev lists at hlabs.spb.ru
Fri Sep 3 07:09:41 EDT 2004


Philipp von Weitershausen wrote:
> Jim Fulton wrote:
> 
>>  > Since this problem occurred only as you internationalized API doc,
>>
>>> we should be able to quickly determine the place where we should call 
>>> the removeSecurityProxy() call.
>>
>> A better aproach is to add necessary security declarations for message 
>> ids.
>>
>> It would be nice if we could make message ids into "rocks" so they didn't
>> have to be proxied.  We would have to make them immutable though, and
>> be careful about the data they contained.
> 
> 
> I would like them to be rocks, too. Their semantics right now are a bit 
> problematic for this, though. Consider a message id:
> 
>   >>> from zope.i18nmessageid import MessageIDFactory
>   >>> _ = MessageIDFactory('zope')
>   >>> msg = _(u"foo-label", u"Foo")
>   >>> msg
>   u'foo-label'
>   >>> msg.default
>   u'Foo'
>   >>> msg.mapping
>   {}
> 
> Since the attributes are writable, message ids are mutable:
> 
>   >>> msg.default = u"Foo bar"
>   >>> msg.mapping = {'foo':'bar'}
> 
> or
> 
>   >>> msg.mapping.update({'foo':'bar'})
> 
> I would suggest to
> 
> 1.) make the 'default' attribute a read-only attribute. 'default' and 
> message-id are to be seen as one set of information, always tied together.

The 'domain' attribute should be a read-only attribute too.

> 2.) use a different syntax for updating the mapping:
> 
>   >>> msg = msg % {'foo':'bar'}
> 
> Note how the __mod__ (method responsible for the % operator) returns a 
> new message id object.
> 
> This is an analogy to
> 
>   >>> "Insert %(text)s" % {'text': 'here'}
>   Insert here

Maybe the 'mapping' attribute should be a read-only attribute which 
returns the mapping copy? And the MessageID constructor should accept 
optional 'mapping' argument and save copy of the passed mapping in 
private attribute, like this:

class MessageID(unicode):

     def __new__(cls, ustr, domain=None, default=None, mapping={}):
         self = super(MessageID, cls).__new__(cls, ustr)
         self.__mapping = mapping.copy()
         ...

> If this idea is generally welcomed, I could write up a proposal and 
> provide an implementation, with or without backward compatability.

+1

-- 
Dmitry Vasiliev (dima at hlabs.spb.ru)
     http://hlabs.spb.ru


More information about the Zope3-dev mailing list