=====
Rules
=====

Rules are applied to each message as part of a rule chain.  Individual rules
simply return a boolean specifying whether the rule matches or not.  Chain
links determine what happens when a rule matches.


All rules
=========

Rules are maintained in the configuration object as a dictionary mapping rule
names to rule objects.

    >>> from zope.interface.verify import verifyObject
    >>> from mailman.interfaces.rules import IRule
    >>> for rule_name in sorted(config.rules):
    ...     rule = config.rules[rule_name]
    ...     print rule_name, verifyObject(IRule, rule)
    administrivia True
    any True
    approved True
    emergency True
    implicit-dest True
    loop True
    max-recipients True
    max-size True
    moderation True
    news-moderation True
    no-subject True
    non-member True
    suspicious-header True
    truth True

You can get a rule by name.

    >>> rule = config.rules['emergency']
    >>> verifyObject(IRule, rule)
    True


Rule checks
===========

Individual rules can be checked to see if they match, by running the rule's
`check()` method.  This returns a boolean indicating whether the rule was
matched or not.

    >>> mlist = create_list('_xtest@example.com')
    >>> msg = message_from_string("""\
    ... From: aperson@example.com
    ...
    ... An important message.
    ... """)

For example, the emergency rule just checks to see if the emergency flag is
set on the mailing list, and the message has not been pre-approved by the list
administrator.

    >>> print rule.name
    emergency
    >>> mlist.emergency = False
    >>> rule.check(mlist, msg, {})
    False
    >>> mlist.emergency = True
    >>> rule.check(mlist, msg, {})
    True
    >>> rule.check(mlist, msg, dict(moderator_approved=True))
    False
