Edgewall Software

Opened 13 years ago

Closed 13 years ago

Last modified 13 years ago

#7656 closed defect (worksforme)

IEnvironmentSetupParticipant doesn't have default Component attributes

Reported by: sebastian@… Owned by:
Priority: low Milestone:
Component: general Version: 0.11.1
Severity: major Keywords:
Cc: Branch:
Release Notes:
API Changes:
Internal Changes:


As stated here every Component automatically gets the three extra member variables env, config and log. However this seems not to be true for components implementing (only?) IEnvironmentSetupParticipant.

The three member variables are available in the methods environment_needs_upgrade (could not check environment_created or upgrade_environment) but they are defenitely not available in __init__ nor in any other method.

Here's an example code:

from trac.core import *

from trac.env import IEnvironmentSetupParticipant

class ThemeAdminPanelDB(Component):
    """Class that deals with database access, setup and upgrades."""
    def __init__(self):
        # NOT available here
        test = self.env
    # IEnvironmentSetupParticipant methods
    def environment_created(self):
        """Called when a new Trac environment is created."""

    def environment_needs_upgrade(self, db):
        """Called when Trac checks whether the environment needs to be upgraded.
        Returns `True` if upgrade is needed, `False` otherwise."""

        # available here
        test = self.env
        return False

    def upgrade_environment(self, db):
        """Actually perform an environment upgrade, but don't commit as
        that is done by the common upgrade procedure when all plugins are done."""

    # Own methods

    def get_db_version(self, db = None):
        # NOT available here
        test = self.env
        return 0

To call get_db_version I used the following code (as stated here):

comp_mgr = ComponentManager()
db_mgr = ThemeAdminPanelDB(comp_mgr)

version = db_mgr.get_db_version()

So either it's a bug or the documentation isn't correct and should state this exception.

Third possibility: I've just recently learned Python so my Python abilities are very limited. For example: Shouldn't self be the same "instance" in every method of this class? According to this they should be:

comp_mgr = ComponentManager()
my_comp1 = MyComponent(comp_mgr)
my_comp2 = MyComponent(comp_mgr)
assert id(my_comp1) == id(my_comp2)

Attachments (0)

Change History (2)

comment:1 by osimons, 13 years ago

Resolution: worksforme
Status: newclosed

Tried your plugin, and it loads fine at my end meaning your test statements evaluates correctly.

I think this is just a problem stemming from reading the original proposal for the feature that may not quite be in line with how it works in actual implemented code. Instantiating components takes an env as first argument, and the env has a component manager attached. Your test code does not as far as I can see instantiate an env?

This works:

>>> from trac.env import Environment
>>> myenv = Environment('/path/to/my/project')
>>> my_comp1 = ThemeAdminPanelDB(myenv) # your test component
>>> my_comp1.get_db_version()
>>> my_comp2 = ThemeAdminPanelDB(myenv) # 'another'
>>> id(my_comp1) == id(my_comp2)

Use the trac-dev MailingList or get onto the #trac IrcChannel if you have further development-related questions.

comment:2 by sebastian@…, 13 years ago

You were right. I didn't passed an Environment to the constructor because I didn't know I had to. Now it works.

Is this the way it works for all Components or only for IEnvironmentSetupParticipant? In any way: Should the documentation here not be corrected so that your way is documented?

Modify Ticket

Change Properties
Set your email in Preferences
as closed The ticket will remain with no owner.
The resolution will be deleted. Next status will be 'reopened'.
to The owner will be changed from (none) to the specified user.

Add Comment

E-mail address and name can be saved in the Preferences .
Note: See TracTickets for help on using tickets.