[Trac-tickets] [The Trac Project] #2724: A new generic interface for extending Trac - before Trac, before Dispatch and before Render.

The Trac Project noreply at edgewall.com
Mon Feb 6 06:00:27 CST 2006


#2724: A new generic interface for extending Trac - before Trac, before Dispatch
and before Render.
-------------------------------------+--------------------------------------
 Reporter:  simon-code at bvnetwork.no  |       Owner:  jonas
     Type:  enhancement              |      Status:  new  
 Priority:  normal                   |   Milestone:       
Component:  general                  |     Version:  0.9.3
 Severity:  normal                   |    Keywords:       
-------------------------------------+--------------------------------------
 In general I have a number of features in Trac that I extend or override,
 and prefer using own plugins or outside hacks rather than change the Trac
 source as that leaves much easier upgrades - it keeps my changes easily
 contained.

 Some things are difficult to change from the outside as they depend on
 runtime information and cannot eaily be done through plugins only with
 current interfaces. For instance, I would like to be able to add
 information to the HDF object that gets to be part of all pages - and not
 just seeing the HDF object when it passes by one of my modules. A
 workaround is to put this code in {{{get_navigation_items}}} of a custom
 plugin as by then the HDF is initialised with basic values, but not yet
 dispatched through an actual handler. If I add to it, it gets to be part
 of all HDF to the template - allowing me to put runtime information into
 header or footer for instance. However, it is not pretty...

 Problem: I don't know when various modules get initialised and populated
 with relevant data, and dare not reference runtime variables directly as
 {{{a)}}} it can result in runtime errors I never imagined depending on
 module logic and initialisaton order, and {{{b)}}} trapping or overriding
 the various places in Trac code will result in code that is awkward and
 hard to manage over time as Trac changes.

 Proposal: A generic interface for {{{IRequestChangeProvider}}} allowing me
 to run all code at specific times - after "core" but before "main" Trac
 (unclear definitions), when the runtime environment is set up by Trac but
 before it is dispatched to an individual component for handling - and
 again before the request gets sent to rendering. This means three methods
 that the interface supports:
 {{{
 #!python
 def req_change_before_trac(self, req):
     ''' Allows manipulating request and runtime data before main Trac. Add
         or change information that is guaranteed to be available for all
         modules.'''
     pass

 def req_change_after_trac(self, req, env):
     ''' Trac and environment is all finished set up. Can add to or modify
         before it gets dispatched to a specific handler.'''
     pass

 def req_change_before_render(self, req, env):
     ''' Manipulate req object after Trac and modules, but before
     it gets rendered. Can use it to translate text and navigation items,
     and other variables or logic used for output.'''
     pass
 }}}

 Note: I have not implemented it or tested it - it is still just a theory,
 and see it as a general proposal for clean interface changes. It is
 mentally simplified, and would likely not work directly as suggested above
 - and it probably would also require some refactoring of Trac to clean up
 the code. Some of the main Trac code would also be better implemented as
 components through an interface like this.

 A sound reason for NOT doing this is that it is too general. Maybe it
 should be a large number of interfaces for all the specific areas. But
 keeping up with the definition of "all" will always be a challenge...
 Interested to hear from others on this.

-- 
Ticket URL: <http://projects.edgewall.com/trac/ticket/2724>
The Trac Project <http://trac.edgewall.com/>


More information about the Trac-Tickets mailing list