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