|Version 11 (modified by muness, 8 years ago) (diff)|
Since Trac 0.9 it has been possible to write plugins for Trac to extend Trac functionality. Even better, you can deploy plugins as Python eggs that really makes plugin development fun.
This tutorial shows how to make an egg, successfully load an egg in Trac and in advanced topics how to serve templates and static content from an egg.
First you need setuptools. For instructions and files see EasyInstall page.
You also need Trac 0.9. Download it from the TracDownload page.
To develop a plugin you need to create few directories to keep things together.
So let's create following directories:
./helloworld-plugin/ ./helloworld-plugin/helloworld/ ./helloworld-plugin/TracHelloworld.egg-info/
The first step is to generate the main module for this plugin. We will construct a simple plugin that will display "Hello world!" on the screen when accessed through /helloworld URL. The plugin also provides a "Hello" button that is, by default, rendered on the far right in the main navigation bar.
So create helloworld.py in ./helloworld-plugin/helloworld/:
# Helloworld plugin from trac.core import * from trac.web.chrome import INavigationContributor from trac.web.main import IRequestHandler from trac.util import escape class UserbaseModule(Component): implements(INavigationContributor, IRequestHandler) # INavigationContributor methods def get_active_navigation_item(self, req): return 'helloworld' def get_navigation_items(self, req): yield 'mainnav', 'helloworld', '<a href="%s">Hello</a>' \ % escape(self.env.href.helloworld()) # IRequestHandler methods def match_request(self, req): return req.path_info == '/helloworld' def process_request(self, req): req.send_response(200) req.send_header('Content-Type', 'text/plain') req.end_headers() req.write('Hello world!')
Make it a module
To make the plugin a module, you simply create that magic __init__.py in ./helloworld-plugin/helloworld/:
# Helloworld module from helloworld import *
Make it an egg
Now it's time to make it an egg. For that we need a chicken called setup.py in ./helloworld-plugin/:
from setuptools import setup PACKAGE = 'TracHelloworld' VERSION = '0.1' setup(name=PACKAGE, version=VERSION, packages=['helloworld'])
To make the egg loadable in Trac we need to create one more file. In ./helloworld-plugin/TracHelloworld.egg-info/ create the file trac_plugin.txt:
Now try to build the plugin. Run the command python setup.py bdist_egg in the directory where you created it. If everthing went OK you should have a .egg file in ./dist directory.
Copy this .egg file to /[your trac env]/plugins directory. If you're using mod_python you have to restart Apache.
Now you should see Hello link at far right in main navigation bar when accessing your site. Click it.
Now you have successfully created your first egg. You can continue by reading EggCookingTutorial/AdvancedEggCooking to learn how to use Trac templates.