[kupfer] plugins: Use pkgutil to list contents of kupfer.plugin package



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]