[kupfer] plugins: Use pkgutil to list contents of kupfer.plugin package
- From: Ulrik Sverdrup <usverdrup src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [kupfer] plugins: Use pkgutil to list contents of kupfer.plugin package
- Date: Wed, 9 Sep 2009 19:15:24 +0000 (UTC)
commit a7bec6ee8525046099ec0e9b9cf14d844c1440a1
Author: Ulrik Sverdrup <ulrik sverdrup gmail com>
Date: Tue Sep 8 22:19:46 2009 +0200
plugins: Use pkgutil to list contents of kupfer.plugin package
To correctly list contents of a package, we use pkgutil. This way,
kupfer even supports being installed in a zipped file.
kupfer/main.py | 5 ++++-
kupfer/plugins.py | 33 +++++++++++++++++++--------------
2 files changed, 23 insertions(+), 15 deletions(-)
---
diff --git a/kupfer/main.py b/kupfer/main.py
index 914dffc..9e4c88b 100644
--- a/kupfer/main.py
+++ b/kupfer/main.py
@@ -42,7 +42,6 @@ def get_options():
import sys
import getopt
-
def make_help_text():
from kupfer import config, plugins
@@ -70,6 +69,10 @@ def get_options():
))
return help_text
+ # Fix sys.argv that can be None in exceptional cases
+ if sys.argv[0] is None:
+ sys.argv[0] = "kupfer"
+
try:
opts, args = getopt.getopt(sys.argv[1:], "",
[o for o,h in program_options] +
diff --git a/kupfer/plugins.py b/kupfer/plugins.py
index 492ddc9..deac7e6 100644
--- a/kupfer/plugins.py
+++ b/kupfer/plugins.py
@@ -11,22 +11,27 @@ def get_plugin_ids():
"""Enumerate possible plugin ids;
return a sequence of possible plugin ids, not
guaranteed to be plugins"""
- from kupfer import plugin
+ import pkgutil
import os
- plugin_files = set()
- main_plugin_dir = plugin.__path__[0]
- all_plugin_dirs = [main_plugin_dir,]
- all_plugin_dirs.extend(config.get_data_dirs("plugins"))
- for plugin_dir in all_plugin_dirs:
- for dirpath, dirs, files in os.walk(plugin_dir):
- del dirs[:]
- # @files leaks out from "loop" above
- for f in files:
- basename = os.path.splitext(f)[0]
- if basename != "__init__" and not basename.endswith("_support"):
- plugin_files.add(basename)
- return plugin_files
+ from kupfer import plugin
+
+ def is_plugname(plug):
+ return plug != "__init__" and not plug.endswith("_support")
+
+ plugin_ids = set()
+ for importer, modname, ispkg in pkgutil.iter_modules(plugin.__path__):
+ if not ispkg and is_plugname(modname):
+ plugin_ids.add(modname)
+
+ for plugin_dir in config.get_data_dirs("plugins"):
+ name = lambda f: os.path.splitext(f)[0]
+ try:
+ plugin_ids.update(name(f) for f in os.listdir(plugin_dir)
+ if is_plugname(name(f)))
+ except (OSError, IOError), exc:
+ pretty.print_error(exc)
+ return plugin_ids
def get_plugin_info():
"""Generator, yields dictionaries of plugin descriptions
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]