~sambuddhabasu1/mailman/fix_mailman_run_error

« back to all changes in this revision

Viewing changes to Mailman/initialize.py

  • Committer: Barry Warsaw
  • Date: 2007-07-24 22:45:25 UTC
  • mto: This revision was merged to the branch mainline in revision 6537.
  • Revision ID: barry@python.org-20070724224525-se7lcjwlrebbuhcw
Add setuptools plug-in entry point for defining different database backends.
Now someone could distribute a setuptools package that provided say, a MySQL
database implementation and very easily override the stock database.  How
awesome is setuptools?

Removed MANAGERS_INIT_FUNCTION since setuptools gives us a much more standard
way of defining this plug-in entry point.  Remove other old crud from
Defaults.py.

Restructure our own 'stock' database backend to be a plugin so it's totally on
par with any other package.  The only special case is that if more than one
such entry point is defined, we filter out the 'stock' one (i.e. ours) under
the assumption that the user is overriding it.  If we still have more than one
plug-in, it's an error.

Restructure the initialization subsystem to use the plug-in, doing all the
proper assertions and what not.  The IDatabase interface defines what the
database back-end plugin must provide.  I've no doubt this will eventually
need a bit more fleshing out, but it gives all this stuff a principled hook
point instead of something ad-hoc.

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
 
27
27
import os
28
28
import sys
 
29
import pkg_resources
 
30
 
 
31
from zope.interface.verify import verifyObject
29
32
 
30
33
import Mailman.configuration
31
 
import Mailman.database
32
34
import Mailman.ext
33
35
import Mailman.loginit
34
36
 
 
37
from Mailman.interfaces import IDatabase, IListManager, IUserManager
 
38
 
35
39
DOT = '.'
36
40
 
37
41
 
55
59
    Mailman.loginit.initialize(propagate_logs)
56
60
    # Set up site extensions directory
57
61
    Mailman.ext.__path__.append(Mailman.configuration.config.EXT_DIR)
58
 
    # Initialize the IListManager, IMemberManager, and IMessageManager
59
 
    modparts = Mailman.configuration.config.MANAGERS_INIT_FUNCTION.split(DOT)
60
 
    funcname = modparts.pop()
61
 
    modname  = DOT.join(modparts)
62
 
    __import__(modname)
63
 
    initfunc = getattr(sys.modules[modname], funcname)
64
 
    initfunc()
65
62
 
66
63
 
67
64
def initialize_2():
68
 
    Mailman.database.initialize()
 
65
    # Find all declared entry points in the mailman.database group.  There
 
66
    # must be exactly one or two such entry points defined.  If there are two,
 
67
    # then we remove the one called 'stock' since that's the one that we
 
68
    # distribute and it's obviously being overridden.  If we're still left
 
69
    # with more than one after we filter out the stock one, it is an error.
 
70
    entrypoints = list(pkg_resources.iter_entry_points('mailman.database'))
 
71
    if len(entrypoints) == 0:
 
72
        raise RuntimeError('No database entry points found')
 
73
    elif len(entrypoints) == 1:
 
74
        # Okay, this is the one to use.
 
75
        entrypoint = entrypoints[0]
 
76
    elif len(database) == 2:
 
77
        # Find the one /not/ named 'stock'.
 
78
        entrypoints = [ep for ep in entrypoints if ep.name <> 'stock']
 
79
        if len(entrypoints) == 0:
 
80
            raise RuntimeError('No database entry points found')
 
81
        elif len(entrypoints) == 2:
 
82
            raise RuntimeError('Too many database entry points defined')
 
83
        else:
 
84
            assert len(entrypoints) == 1, 'Insanity'
 
85
            entrypoint = entrypoint[0]
 
86
    else:
 
87
        raise RuntimeError('Too many database entry points defined')
 
88
    # Instantiate the database entry point, ensure that it's of the right
 
89
    # type, and initialize it.  Then stash the object on our configuration
 
90
    # object.
 
91
    ep_object = entrypoint.load()
 
92
    db = ep_object()
 
93
    verifyObject(IDatabase, db)
 
94
    db.initialize()
 
95
    Mailman.configuration.config.db = db
 
96
    verifyObject(IListManager, db.list_manager)
 
97
    Mailman.configuration.config.list_manager = db.list_manager
 
98
    verifyObject(IUserManager, db.user_manager)
 
99
    Mailman.configuration.config.user_manager = db.user_manager
69
100
 
70
101
 
71
102
def initialize(config=None, propagate_logs=False):