Revision: 5754
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=5754&view=rev
Author:   jdh2358
Date:     2008-07-12 14:33:54 -0700 (Sat, 12 Jul 2008)

Log Message:
-----------
added support for external backends

Modified Paths:
--------------
    trunk/matplotlib/CHANGELOG
    trunk/matplotlib/lib/matplotlib/__init__.py
    trunk/matplotlib/lib/matplotlib/backends/__init__.py
    trunk/matplotlib/lib/matplotlib/backends/backend_template.py
    trunk/matplotlib/matplotlibrc.template

Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG  2008-07-12 21:15:00 UTC (rev 5753)
+++ trunk/matplotlib/CHANGELOG  2008-07-12 21:33:54 UTC (rev 5754)
@@ -1,3 +1,6 @@
+2008-07-12 Added support for external backends with the
+           "module://my_backend" syntax - JDH
+
 2008-07-11 Fix memory leak related to shared axes.  Grouper should
            store weak references. - MGD
 

Modified: trunk/matplotlib/lib/matplotlib/__init__.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/__init__.py 2008-07-12 21:15:00 UTC (rev 
5753)
+++ trunk/matplotlib/lib/matplotlib/__init__.py 2008-07-12 21:33:54 UTC (rev 
5754)
@@ -801,8 +801,11 @@
         if warn: warnings.warn(_use_error_msg)
         return
     arg = arg.lower()
-    be_parts = arg.split('.')
-    name = validate_backend(be_parts[0])
+    if arg.startswith('module://'):
+        name = arg
+    else:
+        be_parts = arg.split('.')
+        name = validate_backend(be_parts[0])
     rcParams['backend'] = name
     if name == 'cairo' and len(be_parts) > 1:
         rcParams['cairo.format'] = validate_cairo_format(be_parts[1])

Modified: trunk/matplotlib/lib/matplotlib/backends/__init__.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/__init__.py        2008-07-12 
21:15:00 UTC (rev 5753)
+++ trunk/matplotlib/lib/matplotlib/backends/__init__.py        2008-07-12 
21:33:54 UTC (rev 5754)
@@ -1,10 +1,7 @@
 
 import matplotlib
-from matplotlib.rcsetup import interactive_bk
-from matplotlib.rcsetup import non_interactive_bk
-from matplotlib.rcsetup import all_backends
-from matplotlib.rcsetup import validate_backend
 
+
 __all__ = ['backend','show','draw_if_interactive',
            'new_figure_manager', 'backend_version']
 
@@ -14,28 +11,24 @@
     'return new_figure_manager, draw_if_interactive and show for pylab'
     # Import the requested backend into a generic module object
 
-    backend_name = 'backend_'+backend
-    backend_name = backend_name.lower() # until we banish mixed case
-    backend_mod = __import__('matplotlib.backends.'+backend_name,
+    if backend.startswith('module://'):
+        backend_name = backend[9:]
+    else:
+        backend_name = 'backend_'+backend
+        backend_name = backend_name.lower() # until we banish mixed case
+        backend_name = 'matplotlib.backends.%s'%backend_name.lower()
+    backend_mod = __import__(backend_name,
                              globals(),locals(),[backend_name])
 
     # Things we pull in from all backends
     new_figure_manager = backend_mod.new_figure_manager
 
-    if hasattr(backend_mod,'backend_version'):
-        backend_version = getattr(backend_mod,'backend_version')
-    else: backend_version = 'unknown'
 
+    def do_nothing(*args, **kwargs): pass
+    backend_version = getattr(backend_mod,'backend_version', 'unknown')
+    show = getattr(backend_mod, 'show', do_nothing)
+    draw_if_interactive = getattr(backend_mod, 'draw_if_interactive', 
do_nothing)
 
-
-    # Now define the public API according to the kind of backend in use
-    if backend in interactive_bk:
-        show = backend_mod.show
-        draw_if_interactive = backend_mod.draw_if_interactive
-    else:  # non-interactive backends
-        def draw_if_interactive():  pass
-        def show(): pass
-
     # Additional imports which only happen for certain backends.  This section
     # should probably disappear once all backends are uniform.
     if backend.lower() in ['wx','wxagg']:

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_template.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_template.py        
2008-07-12 21:15:00 UTC (rev 5753)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_template.py        
2008-07-12 21:33:54 UTC (rev 5754)
@@ -17,7 +17,7 @@
 with 'xxx'.  Then implement the class methods and functions below, and
 add 'xxx' to the switchyard in matplotlib/backends/__init__.py and
 'xxx' to the backends list in the validate_backend methon in
-matplotlib/__init__.py and you're off.  You can use your backend with
+matplotlib/__init__.py and you're off.  You can use your backend with::
 
   import matplotlib
   matplotlib.use('xxx')
@@ -25,6 +25,17 @@
   plot([1,2,3])
   show()
 
+matplotlib also supports external backends, so you can place you can
+use any module in your PYTHONPATH with the syntax::
+
+  import matplotlib
+  matplotlib.use('module://my_backend')
+
+where my_backend.py is your module name.  Thus syntax is also
+recognized in the rc file and in the -d argument in pylab, eg::
+
+  python simple_plot.py -dmodule://my_backend
+
 The files that are most relevant to backend_writers are
 
   matplotlib/backends/backend_your_backend.py

Modified: trunk/matplotlib/matplotlibrc.template
===================================================================
--- trunk/matplotlib/matplotlibrc.template      2008-07-12 21:15:00 UTC (rev 
5753)
+++ trunk/matplotlib/matplotlibrc.template      2008-07-12 21:33:54 UTC (rev 
5754)
@@ -19,8 +19,12 @@
 # such as 0.75 - a legal html color name, eg red, blue, darkslategray
 
 #### CONFIGURATION BEGINS HERE
+
 # the default backend; one of GTK GTKAgg GTKCairo CocoaAgg FltkAgg
-# QtAgg Qt4Agg  TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG Template
+# QtAgg Qt4Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG Template You
+# can also deploy your own backend outside of matplotlib by referring
+# to the module name (which must be in the PYTHONPATH) as
+# 'module://my_backend'
 backend      : %(backend)s
 numerix      : %(numerix)s  # numpy, Numeric or numarray
 #maskedarray : False       # True to use external maskedarray module


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
Sponsored by: SourceForge.net Community Choice Awards: VOTE NOW!
Studies have shown that voting for your favorite open source project,
along with a healthy diet, reduces your potential for chronic lameness
and boredom. Vote Now at http://www.sourceforge.net/community/cca08
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to