[Mailman-Developers] MemberAdaptor... modifications to API?

Dale Newfield Dale@Newfield.org
Mon, 26 Aug 2002 15:14:44 -0400 (EDT)


On Tue, 20 Aug 2002, Barry A. Warsaw wrote:
> >>>>> "DN" == Dale Newfield <Dale@Newfield.org> writes:
>     DN> I guess what I'm suggesting is that instead of using this
>     DN> accessor like this: mlist.getMemberOption(addr,
>     DN> mm_cfg.OPTINFO['plain']), it be used like this:
>     DN> mlist.getMemberOption(addr, 'plain')

> The problem that I have with this approach is that it's much easier to
> let a typo like mm_cfg.OPTINFO['plian'] slip through than to use a
> symbolic constant.  E.g. tools like Pychecker can verify that the
> constant exists, but can't really do much with the string.

Can we make the symbolic constant *be* the string?  Then we can get
both compile-time checking and a non-obfuscated API.

Basically we'd replace:

# Bitfield for user options.  See DEFAULT_NEW_MEMBER_OPTIONS above to set
# defaults for all new lists.
Digests             = 0 # handled by other mechanism, doesn't need a flag.
DisableDelivery     = 1 # Obsolete; use set/getDeliveryStatus()
DontReceiveOwnPosts = 2 # Non-digesters only
AcknowledgePosts    = 4
DisableMime         = 8 # Digesters only
ConcealSubscription = 16
SuppressPasswordReminder = 32
ReceiveNonmatchingTopics = 64
Moderate = 128
DontReceiveDuplicates = 256

# A mapping between short option tags and their flag
OPTINFO = {'hide'    : ConcealSubscription,
           'nomail'  : DisableDelivery,
           'ack'     : AcknowledgePosts,
           'notmetoo': DontReceiveOwnPosts,
           'digest'  : 0,
           'plain'   : DisableMime,
           'nodupes' : DontReceiveDuplicates
           }

With something like:

# Strings for user options.  See DEFAULT_NEW_MEMBER_OPTIONS above to set
# defaults for all new lists.
Digests                  = 'digest'
DisableDelivery          = 'nomail'
DontReceiveOwnPosts      = 'notmetoo'
AcknowledgePosts         = 'ack'
DisableMime              = 'plain'
ConcealSubscription      = 'hide'
SuppressPasswordReminder = 'noreminder' # made up...
ReceiveNonmatchingTopics = 'newtopics'  # made up...
Moderate                 = 'moderate'   # made up...
DontReceiveDuplicates    = 'nodupes'

# This could probably move inside OldStyleMemberships.py
# Why are more of the above ones not in this?
# A mapping between short option tags and their flag
OPTINFO = {ConcealSubscription   :  16,
           DisableDelivery       :   1,
           AcknowledgePosts      :   4,
           DontReceiveOwnPosts   :   2,
           Digests               :   0,
           DisableMime           :   8,
           DontReceiveDuplicates : 256
           }

Note that DEFAULT_NEW_MEMBER_OPTIONS should probably become a
list of strings, expanded to current value by |'ing together each
OPTINFO[listentry]

If you'd like me to try to make a clean pass of this and submit a patch,
let me know.  It seems that API changes should happen sooner than later so
that any other implementations of this interface also get built to the
same API...

-Dale