diff --git a/deluge/scripts/create_plugin.py b/deluge/scripts/create_plugin.py new file mode 100644 index 000000000..95e2e1969 --- /dev/null +++ b/deluge/scripts/create_plugin.py @@ -0,0 +1,333 @@ +""" +creates an empty plugin and links it from ~/.config/deluge/plugins + +usage : python create_plugin.py --name
--path --add-dev-link
+
+creates an empty plugin.
+
+"""
+
+from optparse import OptionParser
+import os
+parser = OptionParser()
+parser.add_option("-n", "--name", dest="name",help="plugin name")
+parser.add_option("-p", "--basepath", dest="path",help="base path")
+parser.add_option("-a", "--author-name", dest="author_name",help="author name,for the GPL header")
+parser.add_option("-e", "--author-email", dest="author_email",help="author email,for the GPL header")
+
+
+(options, args) = parser.parse_args()
+
+
+def create_plugin():
+ if not options.name:
+ print "--name is mandatory , use -h for more info"
+ return
+ if not options.path:
+ print "--basepath is mandatory , use -h for more info"
+ return
+ if not options.author_email:
+ print "--author-email is mandatory , use -h for more info"
+ return
+ if not options.author_email:
+ print "--author-name is mandatory , use -h for more info"
+ return
+
+ if not os.path.exists(options.path):
+ print "basepath does not exist"
+ return
+
+ name = options.name.replace(" ", "_")
+ safe_name = name.lower()
+ plugin_base = os.path.join(options.path, name)
+ src = os.path.join(plugin_base, safe_name)
+
+ if os.path.exists(plugin_base):
+ print "the directory %s already exists, delete it first" % plugin_base
+ return
+
+ def write_file(path, filename, template):
+ args = {"author_name":options.author_name,
+ "author_email":options.author_email ,
+ "name":name,
+ "safe_name":safe_name,
+ "filename":filename,
+ "plugin_base":plugin_base,
+ }
+
+ filename = os.path.join(path, filename)
+ f = open(filename,"w")
+ if filename.endswith(".py"):
+ f.write(GPL % args)
+ f.write(template % args)
+ f.close()
+
+ print "creating folders.."
+ os.mkdir(plugin_base)
+ os.mkdir(src)
+ os.mkdir(os.path.join(src,"data"))
+ os.mkdir(os.path.join(src,"template"))
+
+ print "creating files.."
+ write_file(plugin_base,"setup.py", SETUP)
+ write_file(src,"__init__.py", INIT)
+ write_file(src,"gtkui.py", GTKUI)
+ write_file(src,"webui.py", WEBUI)
+ write_file(src,"core.py", CORE)
+ write_file(os.path.join(src,"data"),"config.glade", GLADE)
+
+ #add an input parameter for this?
+ print "building dev-link.."
+ write_file(plugin_base,"create_dev_link.sh", CREATE_DEV_LINK)
+ dev_link_path = os.path.realpath(os.path.join(plugin_base, "create_dev_link.sh"))
+ os.system("chmod +x %s" % dev_link_path) #lazy..
+ os.system(dev_link_path)
+
+
+CORE = """
+import deluge
+from deluge.log import LOG as log
+from deluge.plugins.corepluginbase import CorePluginBase
+from deluge import component
+from deluge.plugins.coreclient import client
+#client: see http://dev.deluge-torrent.org/wiki/Development/UiClient#Remoteapi
+
+DEFAULT_PREFS = {
+ "test":"NiNiNi"
+}
+
+class Core(CorePluginBase):
+
+ def enable(self):
+ self.config = deluge.configmanager.ConfigManager("%(name)s.conf", DEFAULT_PREFS)
+
+ def disable(self):
+ pass
+
+ def export_set_config(self, config):
+ "sets the config dictionary"
+ for key in config.keys():
+ self.config[key] = config[key]
+ self.config.save()
+
+ def export_get_config(self):
+ "returns the config dictionary"
+ return self.config.get_config()
+"""
+
+INIT = """
+from deluge.log import LOG as log
+
+from deluge.plugins.init import PluginBase
+
+class CorePlugin(PluginBase):
+ def __init__(self, plugin_api, plugin_name):
+ # Load the Core portion of the plugin
+ try:
+ from core import Core
+ self.plugin = Core(plugin_api, plugin_name)
+ except Exception, e:
+ log.debug("Did not load a Core plugin: %%s", e)
+
+class WebUIPlugin(PluginBase):
+ def __init__(self, plugin_api, plugin_name):
+ try:
+ from webui import WebUI
+ self.plugin = WebUI(plugin_api, plugin_name)
+ except Exception, e:
+ log.debug("Did not load a WebUI plugin: %%s", e)
+
+class GtkUIPlugin(PluginBase):
+ def __init__(self, plugin_api, plugin_name):
+ # Load the GtkUI portion of the plugin
+ try:
+ from gtkui import GtkUI
+ self.plugin = GtkUI(plugin_api, plugin_name)
+ except Exception, e:
+ log.debug("Did not load a GtkUI plugin: %%s", e)
+"""
+
+
+SETUP = """
+from setuptools import setup
+
+__author__ = "%(author_name)s <%(author_email)s>"
+
+setup(
+ name="%(name)s",
+ version="0.1",
+ description=__doc__,
+ author=__author__,
+ packages=["%(safe_name)s"],
+ package_data = {"%(safe_name)s": ["template/*","data/*"]},
+ entry_points=\"\"\"
+ [deluge.plugin.core]
+ %(name)s = %(safe_name)s:CorePlugin
+ [deluge.plugin.webui]
+ %(name)s = %(safe_name)s:WebUIPlugin
+ [deluge.plugin.gtkui]
+ %(name)s = %(safe_name)s:GtkUIPlugin
+ \"\"\"
+)
+"""
+
+GTKUI = """
+from deluge.log import LOG as log
+from deluge.ui.client import aclient
+import gtk
+
+class GtkUI(object):
+ def __init__(self, plugin_api, plugin_name):
+ log.debug("Calling %(name)s UI init")
+ self.plugin = plugin_api
+
+ def enable(self):
+ self.glade = gtk.glade.XML(self.get_resource("config.glade"))
+
+ self.plugin.add_preferences_page("%(name)s", self.glade.get_widget("prefs_box"))
+ self.plugin.register_hook("on_apply_prefs", self.on_apply_prefs)
+ self.plugin.register_hook("on_show_prefs", self.on_show_prefs)
+
+ def disable(self):
+ self.plugin.remove_preferences_page("%(name)s")
+ self.plugin.deregister_hook("on_apply_prefs", self.on_apply_prefs)
+ self.plugin.deregister_hook("on_show_prefs", self.on_show_prefs)
+
+ def on_apply_prefs(self):
+ log.debug("applying prefs for %(name)s")
+ config = {
+ "test":self.glade.get_widget("txt_test").get_text()
+ }
+ aclient.%(safe_name)s_set_config(None, config)
+
+ def on_show_prefs(self):
+ aclient.%(safe_name)s_get_config(self.cb_get_config)
+
+ def cb_get_config(self, config):
+ "callback for on show_prefs"
+ self.glade.get_widget("txt_test").set_text(config["test"])
+
+ def get_resource(self, filename):
+ import pkg_resources, os
+ return pkg_resources.resource_filename("%(safe_name)s", os.path.join("data", filename))
+"""
+
+GLADE = """
+
+
+