--- purple-plugin-pack-2.7.0/plugin_pack.py.old 2010-03-29 03:25:57.000000000 +0000
+++ purple-plugin-pack-2.7.0/plugin_pack.py 2018-11-12 01:03:25.360000000 +0000
@@ -32,582 +32,561 @@
Commands:
"""
-import ConfigParser
+from __future__ import print_function
import getopt
import glob
import os.path
-import string
import sys
-webpage = 'http://plugins.guifications.org/'
-
-def printerr(msg):
- print >> sys.stderr, msg
+try:
+ import configparser
+except ImportError:
+ import ConfigParser as configparser
+
+WEBPAGE = 'https://bitbucket.org/rekkanoryo/purple-plugin-pack'
+
+def printerr(*msg):
+ print(msg, file=sys.stderr)
+ #print(msg)
class Plugin:
- name = ''
- directory = ''
- type = ''
- depends = []
- provides = ''
- summary = ''
- description = ''
- authors = []
- introduced = ''
- notes = ''
-
- def __init__(self, directory, name, parser):
- self.name = name
-
- self.directory = directory
-
- self.type = parser.get(name, 'type')
- self.depends = parser.get(name, 'depends').split()
- self.provides = parser.get(name, 'provides')
- self.summary = parser.get(name, 'summary')
- self.description = parser.get(name, 'description')
- self.authors = parser.get(name, 'authors').split(',')
- self.introduced = parser.get(name, 'introduced')
-
- if parser.has_option(name, 'notes'):
- self.notes = parser.get(name, 'notes')
-
- if self.type != 'default' and self.type != 'incomplete' and self.type != 'abusive':
- printerr('\'%s\' has an unknown type of \'%s\'!' % (self.name, self.type))
-
- def __str__(self):
- output = 'name: %s\n' % self.name
- output += 'authors: %s\n' % string.join(self.authors, ', ')
- output += 'type: %s\n' % self.type
- output += 'depends: %s\n' % string.join(self.depends, ' ')
- output += 'provides: %s\n' % self.provides
- output += 'directory: %s\n' % self.directory
- output += 'summary: %s\n' % self.summary
- output += 'description: %s\n' % self.description
+ name = ''
+ directory = ''
+ type = ''
+ depends = []
+ provides = ''
+ summary = ''
+ description = ''
+ authors = []
+ introduced = ''
+ notes = ''
+
+ def __init__(self, directory, name, parser):
+ self.name = name
+
+ self.directory = directory
+
+ self.type = parser.get(name, 'type')
+ self.depends = parser.get(name, 'depends').split()
+ self.provides = parser.get(name, 'provides')
+ self.summary = parser.get(name, 'summary')
+ self.description = parser.get(name, 'description')
+ self.authors = parser.get(name, 'authors').split(',')
+ self.introduced = parser.get(name, 'introduced')
+
+ if parser.has_option(name, 'notes'):
+ self.notes = parser.get(name, 'notes')
+
+ if self.type != 'default' and self.type != 'incomplete' and self.type != 'abusive':
+ printerr('\'%s\' has an unknown type of \'%s\'!' % (self.name, self.type))
+
+ def __str__(self):
+ output = 'name: {}\n'.format(self.name)
+ output += 'authors: {}\n'.format(', '.join(self.authors))
+ output += 'type: {}\n'.format(self.type)
+ output += 'depends: {}\n'.format(' '.join(self.depends))
+ output += 'provides: {}\n'.format(self.provides)
+ output += 'directory: {}\n'.format(self.directory)
+ output += 'summary: {}\n'.format(self.summary)
+ output += 'description: {}\n'.format(self.description)
- if self.notes:
- output += 'notes: %s\n' % self.notes
+ if self.notes:
+ output += 'notes: {}\n'.format(self.notes)
- return output
+ return output
class PluginPack:
- commands = {}
- plugins = {}
+ commands = {}
+ plugins = {}
- def load_plugins(self, types, depends):
- if len(types) == 0:
- types = None
-
- if len(depends) == 0:
- depends = None
-
- for file in glob.glob('*/plugins.cfg'):
- parser = ConfigParser.ConfigParser()
-
- try:
- parser.read(file)
- except ConfigParser.ParsingError, msg:
- printerr('Failed to parse \'%s\':\n%s' % (file, msg))
- continue
-
- for plugin in parser.sections():
- p = Plugin(os.path.dirname(file), plugin, parser)
-
- # this is kind of hacky, but if we have types, we check to see
- # if the type is in list of types to load.
- if types and not p.type in types:
- continue
-
- # now we check if the give plugins depends match the search
- # depends
- if depends:
- if len(set(depends).intersection(set(p.depends))) == 0:
- continue
-
- self.plugins[p.provides] = p
-
- def list_type(self, type):
- list = []
-
- for name in self.plugins.keys():
- plugin = self.plugins[name]
- if plugin.type == type:
- list.append(plugin)
-
- list.sort()
-
- return list
-
- def list_dep(self, dep):
- list = []
-
- for name in self.plugins.keys():
- plugin = self.plugins[name]
-
- if dep in plugin.depends:
- list.append(plugin)
-
- list.sort()
-
- return list
-
- def print_names(self, list):
- names = []
-
- for plugin in list:
- names.append(plugin.name)
-
- print string.join(names, ',')
-
- def default_plugins(self):
- return self.list_type('default')
-
- def abusive_plugins(self):
- return self.list_type('abusive')
-
- def incomplete_plugins(self):
- return self.list_type('incomplete')
-
- def purple_plugins(self):
- return self.list_dep('purple')
-
- def finch_plugins(self):
- return self.list_dep('finch')
-
- def pidgin_plugins(self):
- return self.list_dep('pidgin')
-
- def unique_dirs(self):
- dirs = {}
- for name in self.plugins.keys():
- dirs[self.plugins[name].directory] = 1
-
- dirs = dirs.keys()
- dirs.sort()
-
- return dirs
-
- def help(self, args):
- """Displays information about other commands"""
- try:
- cmd = self.commands[args[0]]
- print cmd.__doc__
- except KeyError:
- print 'command \'%s\' was not found' % args[0]
- except IndexError:
- print '%s' % (self.help.__doc__)
- print
- print 'help usage:'
- print ' help <command>'
- print
- print 'Available commands:'
-
- cmds = self.commands.keys()
- cmds.remove('help')
- cmds.sort()
- print ' %s' % (string.join(cmds, ' '))
- commands['help'] = help
-
- def dist_dirs(self, args):
- """Displays a list of all plugin directories to included in the distribution"""
- print string.join(self.unique_dirs(), ' ')
- commands['dist_dirs'] = dist_dirs
-
- def build_dirs(self, args):
- """Displays a list of the plugins that can be built"""
- if len(args) != 2:
- printerr('build_dirs expects 2 arguments:')
- printerr('\ta comma separated list of dependencies')
- printerr('\ta comma separated list of plugins to build')
- sys.exit(1)
-
- # store the external depedencies
- externals = args[0].split(',')
-
- deps = {}
-
- # run through the provided dependencies, setting their dependencies to
- # nothing since we know we already have them
- for d in externals:
- deps[d] = []
-
- # now run through the plugins adding their deps to the dictionary
- for name in self.plugins.keys():
- plugin = self.plugins[name]
-
- deps[plugin.provides] = plugin.depends
-
- # run through the requested plugins and store their plugin instance in check
- check = []
- for provides in args[1].split(','):
- try:
- if provides == 'all':
- defaults = []
- for p in self.default_plugins():
- defaults.append(p.provides)
-
- check += defaults
-
- continue
-
- plugin = self.plugins[provides]
- check.append(plugin.provides)
- except KeyError:
- continue
-
- # convert our list of plugins to check into a set to remove dupes
- #check = set(check)
-
- # create our list of plugins to build
- build = []
-
- # now define a function to check our deps
- def has_deps(provides):
- # don't add anything to build more than once
- if provides in build:
- return True
-
- try:
- dep_list = deps[provides]
- except KeyError:
- return False
-
- # now check the dependencies
- for dep in dep_list:
- if '|' in dep:
- count = 0
- for d in dep.split('|'):
- if has_deps(d):
- count += 1
-
- if count == 0:
- return False
- else:
- if not has_deps(dep):
- return False
-
- # make sure the provides isn't an external
- if not provides in externals:
- build.append(provides)
-
- # everything checks out!
- return True
-
- # check all the plugins we were told to for their dependencies
- for c in check:
- has_deps(c)
-
- # now create a list of all directories to build
- output = []
-
- for provides in build:
- plugin = self.plugins[provides]
-
- output.append(plugin.directory)
-
- output.sort()
-
- print "%s" % (string.join(output, ','))
- commands['build_dirs'] = build_dirs
-
- def list_plugins(self, args):
- """Displays a list similiar to 'dpkg -l' about the plugin pack"""
-
- data = {}
-
- # create an array for the widths, we initialize it to the lengths of
- # the title strings. We ignore summary, since that one shouldn't
- # matter.
- widths = [4, 8, 0]
-
- for p in self.plugins.keys():
- plugin = self.plugins[p]
-
- if plugin.type == 'abusive':
- type = 'a'
- elif plugin.type == 'incomplete':
- type = 'i'
- else:
- type = 'd'
-
- if 'finch' in plugin.depends:
- ui = 'f'
- elif 'pidgin' in plugin.depends:
- ui = 'p'
- elif 'purple' in plugin.depends:
- ui = 'r'
- else:
- ui = 'u'
-
- widths[0] = max(widths[0], len(plugin.name))
- widths[1] = max(widths[1], len(plugin.provides))
- widths[2] = max(widths[2], len(plugin.summary))
-
- data[plugin.provides] = [type, ui, plugin.name, plugin.provides, plugin.summary]
-
- print 'Type=Default/Incomplete/Abusive'
- print '| UI=Finch/Pidgin/puRple/Unknown'
- print '|/ Name%s Provides%s Summary' % (' ' * (widths[0] - 4), ' ' * (widths[1] - 8))
- print '++-%s-%s-%s' % ('=' * (widths[0]), '=' * (widths[1]), '=' * (widths[2]))
-
- # create the format var
- fmt = '%%s%%s %%-%ds %%-%ds %%s' % (widths[0], widths[1]) #, widths[2])
-
- # now loop through the list again, with everything formatted
- list = data.keys()
- list.sort()
-
- for p in list:
- d = data[p]
- print fmt % (d[0], d[1], d[2], d[3], d[4])
- commands['list'] = list_plugins
-
- def config_file(self, args):
- """Outputs the contents for the file to be m4_include()'d from configure"""
- uniqdirs = self.unique_dirs()
-
- # add our --with-plugins option
- print 'AC_ARG_WITH(plugins,'
- print ' AC_HELP_STRING([--with-plugins], [what plugins to build]),'
- print ' ,with_plugins=all)'
- print 'if test -z $with_plugins ; then'
- print '\twith_plugins=all'
- print 'fi'
-
- # determine and add our output files
- print 'PP_DIST_DIRS="%s"' % (string.join(uniqdirs, ' '))
- print 'AC_SUBST(PP_DIST_DIRS)'
- print
- print 'AC_CONFIG_FILES(['
- for dir in uniqdirs:
- print '\t%s/Makefile' % (dir)
- print '])'
- print
-
- # setup a second call to determine the plugins to be built
- print 'PP_BUILD=`$PYTHON $srcdir/plugin_pack.py build_dirs $DEPENDENCIES $with_plugins`'
- print
- print 'PP_BUILD_DIRS=`echo $PP_BUILD | sed \'s/,/\ /g\'`'
- print 'AC_SUBST(PP_BUILD_DIRS)'
- print
- print 'PP_PURPLE_BUILD="$PYTHON $srcdir/plugin_pack.py -p show_names $PP_BUILD"'
- print 'PP_PIDGIN_BUILD="$PYTHON $srcdir/plugin_pack.py -P show_names $PP_BUILD"'
- print 'PP_FINCH_BUILD="$PYTHON $srcdir/plugin_pack.py -f show_names $PP_BUILD"'
- commands['config_file'] = config_file
-
- def dependency_graph(self, args):
- """Outputs a graphviz script showing plugin dependencies"""
- def node_label(plugin):
- node = plugin.provides.replace('-', '_')
- label = plugin.name
-
- return node, label
-
- def print_plugins(list):
- for plugin in list:
- node, label = node_label(plugin)
-
- print '\t%s[label="%s"];' % (node, label)
-
- print 'digraph {'
- print '\tlabel="Dependency Graph";'
- print '\tlabelloc="t";'
- print '\tsplines=TRUE;'
- print '\toverlap=FALSE;'
- print
- print '\tnode[fontname="sans", fontsize="8", style="filled"];'
- print
-
- # run through the default plugins
- print '\t/* default plugins */'
- print '\tnode[fillcolor="palegreen",shape="tab"];'
- print_plugins(self.default_plugins())
- print
-
- # run through the incomplete plugins
- print '\t/* incomplete plugins */'
- print '\tnode[fillcolor="lightyellow1",shape="note"];'
- print_plugins(self.incomplete_plugins())
- print
-
- # run through the abusive plugins
- print '\t/* abusive plugins */'
- print '\tnode[fillcolor="lightpink",shape="octagon"];'
- print_plugins(self.abusive_plugins())
- print
-
- # run through again, this time showing the relations
- print '\t/* dependencies'
- print '\t * exteranl ones that don\'t have nodes get colored to the following'
- print '\t */'
- print '\tnode[fillcolor="powderblue", shape="egg"];'
-
- for name in self.plugins.keys():
- plugin = self.plugins[name]
-
- node, label = node_label(plugin)
-
- for dep in plugin.depends:
- dep = dep.replace('-', '_')
- print '\t%s -> %s;' % (node, dep)
-
- print '}'
- commands['dependency_graph'] = dependency_graph
-
- def debian_description(self, args):
- """Outputs the description for the Debian packages"""
- print 'Description: %d useful plugins for Pidgin, Finch, and Purple' % len(self.plugins)
- print ' The Plugin Pack is a collection of many simple-yet-useful plugins for Pidgin,'
- print ' Finch, and Purple. You will find a summary of each plugin below. For more'
- print ' about an individual plugin, please see %s' % webpage
- print ' .'
- print ' Note: not all %d of these plugins are currently usable' % len(self.plugins)
-
- list = self.plugins.keys()
- list.sort()
- for key in list:
- plugin = self.plugins[key]
- print ' .'
- print ' %s: %s' % (plugin.name, plugin.summary)
-
- print ' .'
- print ' .'
- print ' Homepage: %s' % webpage
- commands['debian_description'] = debian_description
-
- def show_names(self, args):
- """Displays the names of the given comma separated list of provides"""
-
- if len(args) == 0 or len(args[0]) == 0:
- printerr('show_names expects a comma separated list of provides')
- sys.exit(1)
-
- provides = args[0].split(',')
- if len(provides) == 0:
- print "none"
-
- line = " "
-
- for provide in provides:
- if not provide in self.plugins:
- continue
-
- name = self.plugins[provide].name
-
- if len(line) + len(name) + 2 > 75:
- print line.rstrip(',')
- line = ' '
-
- line += ' %s,' % name
-
- if len(line) > 1:
- print line.rstrip(',')
- commands['show_names'] = show_names
-
- def info(self, args):
- """Displays all information about the given plugins"""
- for p in args:
- try:
- print self.plugins[p].__str__().strip()
- except KeyError:
- print 'Failed to find a plugin that provides \'%s\'' % (p)
-
- print
- commands['info'] = info
-
- def stats(self, args):
- """Displays stats about the plugin pack"""
- counts = {}
-
- counts['total'] = len(self.plugins)
- counts['default'] = len(self.default_plugins())
- counts['incomplete'] = len(self.incomplete_plugins())
- counts['abusive'] = len(self.abusive_plugins())
- counts['purple'] = len(self.purple_plugins())
- counts['finch'] = len(self.finch_plugins())
- counts['pidgin'] = len(self.pidgin_plugins())
-
- def value(val):
- return "%3d (%6.2f%%)" % (val, (float(val) / float(counts['total'])) * 100.0)
-
- print "Purple Plugin Pack Stats"
- print ""
- print "%d plugins in total" % (counts['total'])
- print
- print "Status:"
- print " complete: %s" % (value(counts['default']))
- print " incomplete: %s" % (value(counts['incomplete']))
- print " abusive: %s" % (value(counts['abusive']))
- print ""
- print "Type:"
- print " purple: %s" % (value(counts['purple']))
- print " finch: %s" % (value(counts['finch']))
- print " pidgin: %s" % (value(counts['pidgin']))
- commands['stats'] = stats
+ def load_plugins(self, types, depends):
+ if len(types) == 0:
+ types = None
+
+ if len(depends) == 0:
+ depends = None
+
+ for file in glob.glob('*/plugins.cfg'):
+ parser = configparser.ConfigParser()
+
+ try:
+ parser.read(file)
+ except configparser.ParsingError as msg:
+ printerr('Failed to parse \'%s\':\n%s' % (file, msg))
+ continue
+
+ for plugin in parser.sections():
+ p = Plugin(os.path.dirname(file), plugin, parser)
+
+ # this is kind of hacky, but if we have types, we check to see
+ # if the type is in list of types to load.
+ if types and not p.type in types:
+ continue
+
+ # now we check if the give plugins depends match the search
+ # depends
+ if depends:
+ if len(set(depends).intersection(set(p.depends))) == 0:
+ continue
+
+ self.plugins[p.provides] = p
+
+ def list_type(self, type):
+ list = []
+
+ for name in self.plugins.keys():
+ plugin = self.plugins[name]
+ if plugin.type == type:
+ list.append(plugin)
+
+ return list
+
+ def list_dep(self, dep):
+ list = []
+
+ for name in self.plugins.keys():
+ plugin = self.plugins[name]
+
+ if dep in plugin.depends:
+ list.append(plugin)
+
+ return list
+
+ def print_names(self, list):
+ names = []
+
+ for plugin in list:
+ names.append(plugin.name)
+
+ print(','.join(names))
+
+ def default_plugins(self):
+ return self.list_type('default')
+
+ def abusive_plugins(self):
+ return self.list_type('abusive')
+
+ def incomplete_plugins(self):
+ return self.list_type('incomplete')
+
+ def purple_plugins(self):
+ return self.list_dep('purple')
+
+ def finch_plugins(self):
+ return self.list_dep('finch')
+
+ def pidgin_plugins(self):
+ return self.list_dep('pidgin')
+
+ def unique_dirs(self):
+ dirs = {}
+ for name in self.plugins.keys():
+ dirs[self.plugins[name].directory] = 1
+
+ dirs = sorted(dirs.keys())
+
+ return dirs
+
+ def help(self, args):
+ """Displays information about other commands"""
+ try:
+ cmd = self.commands[args[0]]
+ print(cmd.__doc__)
+ except KeyError:
+ print('command \'{}\' was not found'.format(args[0]))
+ except IndexError:
+ print('{}'.format(self.help.__doc__))
+ print('\nhelp usage:\n help <command>\n\nAvailable commands:')
+
+ cmds = self.commands.keys()
+ cmds.remove('help')
+ cmds.sort()
+ print(' {}'.format(' '.join(cmds)))
+ commands['help'] = help
+
+ def dist_dirs(self, args):
+ """Displays a list of all plugin directories to included in the distribution"""
+ print(' '.join(self.unique_dirs()))
+ commands['dist_dirs'] = dist_dirs
+
+ def build_dirs(self, args):
+ """Displays a list of the plugins that can be built"""
+ if len(args) != 2:
+ printerr('build_dirs expects 2 arguments:')
+ printerr('\ta comma separated list of dependencies')
+ printerr('\ta comma separated list of plugins to build')
+ sys.exit(1)
+
+ # store the external depedencies
+ externals = args[0].split(',')
+
+ deps = {}
+
+ # run through the provided dependencies, setting their dependencies to
+ # nothing since we know we already have them
+ for d in externals:
+ deps[d] = []
+
+ # now run through the plugins adding their deps to the dictionary
+ for name in self.plugins.keys():
+ plugin = self.plugins[name]
+
+ deps[plugin.provides] = plugin.depends
+
+ # run through the requested plugins and store their plugin instance in check
+ check = []
+ for provides in args[1].split(','):
+ try:
+ if provides == 'all':
+ defaults = []
+ for p in self.default_plugins():
+ defaults.append(p.provides)
+
+ check += defaults
+
+ continue
+
+ plugin = self.plugins[provides]
+ check.append(plugin.provides)
+ except KeyError:
+ continue
+
+ # convert our list of plugins to check into a set to remove dupes
+ #check = set(check)
+
+ # create our list of plugins to build
+ build = []
+
+ # now define a function to check our deps
+ def has_deps(provides):
+ # don't add anything to build more than once
+ if provides in build:
+ return True
+
+ try:
+ dep_list = deps[provides]
+ except KeyError:
+ return False
+
+ # now check the dependencies
+ for dep in dep_list:
+ if '|' in dep:
+ count = 0
+ for d in dep.split('|'):
+ if has_deps(d):
+ count += 1
+
+ if count == 0:
+ return False
+ else:
+ if not has_deps(dep):
+ return False
+
+ # make sure the provides isn't an external
+ if not provides in externals:
+ build.append(provides)
+
+ # everything checks out!
+ return True
+
+ # check all the plugins we were told to for their dependencies
+ for c in check:
+ has_deps(c)
+
+ # now create a list of all directories to build
+ output = []
+
+ for provides in build:
+ plugin = self.plugins[provides]
+
+ output.append(plugin.directory)
+
+ output.sort()
+
+ print("{}".format(','.join(output)))
+ commands['build_dirs'] = build_dirs
+
+ def list_plugins(self, args):
+ """Displays a list similiar to 'dpkg -l' about the plugin pack"""
+
+ data = {}
+
+ # create an array for the widths, we initialize it to the lengths of
+ # the title strings. We ignore summary, since that one shouldn't
+ # matter.
+ widths = [4, 8, 0]
+
+ for p in self.plugins.keys():
+ plugin = self.plugins[p]
+
+ if plugin.type == 'abusive':
+ type = 'a'
+ elif plugin.type == 'incomplete':
+ type = 'i'
+ else:
+ type = 'd'
+
+ if 'finch' in plugin.depends:
+ ui = 'f'
+ elif 'pidgin' in plugin.depends:
+ ui = 'p'
+ elif 'purple' in plugin.depends:
+ ui = 'r'
+ else:
+ ui = 'u'
+
+ widths[0] = max(widths[0], len(plugin.name))
+ widths[1] = max(widths[1], len(plugin.provides))
+ widths[2] = max(widths[2], len(plugin.summary))
+
+ data[plugin.provides] = [type, ui, plugin.name, plugin.provides, plugin.summary]
+
+ print('Type=Default/Incomplete/Abusive')
+ print('| UI=Finch/Pidgin/puRple/Unknown')
+ print('|/ Name{} Provides{} Summary'.format(' ' * (widths[0] - 4), ' ' * (widths[1] - 8)))
+ print('++-{}-{}-{}'.format('=' * (widths[0]), '=' * (widths[1]), '=' * (widths[2])))
+
+ # create the format var
+ fmt = '{}{} {:<' + str(widths[0]) + '} {:<' + str(widths[1]) + '} {}'
+
+ # now loop through the list again, with everything formatted
+ list = data.keys()
+
+ for p in list:
+ d = data[p]
+ print(fmt.format(d[0], d[1], d[2], d[3], d[4]))
+ commands['list'] = list_plugins
+
+ def config_file(self, args):
+ """Outputs the contents for the file to be m4_include()'d from configure"""
+ uniqdirs = self.unique_dirs()
+ dirs = ''
+
+ for d in uniqdirs:
+ dirs = dirs + ' ' + d
+
+ # add our --with-plugins option
+ print('{}\n{}\n{}\n{}\n{}\n{}'.format('AC_ARG_WITH(plugins,',
+ ' AC_HELP_STRING([--with-plugins], [what plugins to build]),',
+ ' ,with_plugins=all)', 'if test -z $with_plugins ; then',
+ '\twith_plugins=all', 'fi'))
+
+ # determine and add our output files
+ print('{}\n{}\n\n{}'.format(
+ 'PP_DIST_DIRS="{}"'.format(dirs),
+ 'AC_SUBST(PP_DIST_DIRS)', 'AC_CONFIG_FILES(['))
+ for dir in uniqdirs:
+ print('\t{}/Makefile'.format(dir))
+ print('])\n')
+
+ # setup a second call to determine the plugins to be built
+ print('{}\n\n{}\n{}\n\n{}\n{}\n{}'.format(
+ 'PP_BUILD=`$PYTHON $srcdir/plugin_pack.py build_dirs $DEPENDENCIES $with_plugins`',
+ 'PP_BUILD_DIRS=`echo $PP_BUILD | sed \'s/,/\ /g\'`',
+ 'AC_SUBST(PP_BUILD_DIRS)',
+ 'PP_PURPLE_BUILD="$PYTHON $srcdir/plugin_pack.py -p show_names $PP_BUILD"',
+ 'PP_PIDGIN_BUILD="$PYTHON $srcdir/plugin_pack.py -P show_names $PP_BUILD"',
+ 'PP_FINCH_BUILD="$PYTHON $srcdir/plugin_pack.py -f show_names $PP_BUILD"'))
+ commands['config_file'] = config_file
+
+ def dependency_graph(self, args):
+ """Outputs a graphviz script showing plugin dependencies"""
+ def node_label(plugin):
+ node = plugin.provides.replace('-', '_')
+ label = plugin.name
+
+ return node, label
+
+ def print_plugins(list):
+ for plugin in list:
+ node, label = node_label(plugin)
+
+ print('\t{}[label="{}"];'.format(node, label))
+
+ print('{}\n{}\n{}\n{}\n{}\n\n{}\n'.format('digraph {',
+ '\tlabel="Dependency Graph";', '\tlabelloc="t";', '\tsplines=TRUE;',
+ '\toverlap=FALSE;',
+ '\tnode[fontname="sans", fontsize="8", style="filled"];'))
+
+ # run through the default plugins
+ print('{}\n{}'.format('\t/* default plugins */',
+ '\tnode[fillcolor="palegreen",shape="tab"];'))
+ print_plugins(self.default_plugins())
+ print('')
+
+ # run through the incomplete plugins
+ print('{}\n{}'.format('\t/* incomplete plugins */',
+ '\tnode[fillcolor="lightyellow1",shape="note"];'))
+ print_plugins(self.incomplete_plugins())
+ print('')
+
+ # run through the abusive plugins
+ print('{}\n{}'.format('\t/* abusive plugins */',
+ '\tnode[fillcolor="lightpink",shape="octagon"];'))
+ print_plugins(self.abusive_plugins())
+ print('')
+
+ # run through again, this time showing the relations
+ print('{}\n{}\n{}\n{}'.format('\t/* dependencies',
+ '\t * external ones that don\'t have nodes get colored to the following',
+ '\t */', '\tnode[fillcolor="powderblue", shape="egg"];'))
+
+ for name in self.plugins.keys():
+ plugin = self.plugins[name]
+
+ node, label = node_label(plugin)
+
+ for dep in plugin.depends:
+ dep = dep.replace('-', '_')
+ print('\t() -> {};'.format(node, dep))
+
+ print('}')
+ commands['dependency_graph'] = dependency_graph
+
+ def debian_description(self, args):
+ """Outputs the description for the Debian packages"""
+ print('Description: %d useful plugins for Pidgin, Finch, and Purple'.format(len(self.plugins)))
+ print(' The Plugin Pack is a collection of many simple-yet-useful plugins for Pidgin,')
+ print(' Finch, and Purple. You will find a summary of each plugin below. For more')
+ print(' about an individual plugin, please see {}\n .'.format(WEBPAGE))
+ print(' Note: not all {} of these plugins are currently usable'.format(len(self.plugins)))
+
+ list = self.plugins.keys()
+ list.sort()
+ for key in list:
+ plugin = self.plugins[key]
+ print(' .')
+ print(' {}: {}'.format(plugin.name, plugin.summary))
+
+ print(' .\n .\n Homepage: {}'.format(WEBPAGE))
+ commands['debian_description'] = debian_description
+
+ def show_names(self, args):
+ """Displays the names of the given comma separated list of provides"""
+
+ if len(args) == 0 or len(args[0]) == 0:
+ printerr('show_names expects a comma separated list of provides')
+ sys.exit(1)
+
+ provides = args[0].split(',')
+ if len(provides) == 0:
+ print("none")
+
+ line = " "
+
+ for provide in provides:
+ if not provide in self.plugins:
+ continue
+
+ name = self.plugins[provide].name
+
+ if len(line) + len(name) + 2 > 75:
+ print(line.rstrip(','))
+ line = ' '
+
+ line += ' {},'.format(name)
+
+ if len(line) > 1:
+ print(line.rstrip(','))
+ commands['show_names'] = show_names
+
+ def info(self, args):
+ """Displays all information about the given plugins"""
+ for p in args:
+ try:
+ print(self.plugins[p].__str__().strip() + '\n')
+ except KeyError:
+ print('Failed to find a plugin that provides \'{}\'\n'.format(p))
+ commands['info'] = info
+
+ def stats(self, args):
+ """Displays stats about the plugin pack"""
+ counts = {}
+
+ counts['total'] = len(self.plugins)
+ counts['default'] = len(self.default_plugins())
+ counts['incomplete'] = len(self.incomplete_plugins())
+ counts['abusive'] = len(self.abusive_plugins())
+ counts['purple'] = len(self.purple_plugins())
+ counts['finch'] = len(self.finch_plugins())
+ counts['pidgin'] = len(self.pidgin_plugins())
+
+ def value(val):
+ return "%3d ({:6}%f)".format(val, (float(val) / float(counts['total'])) * 100.0)
+
+ print('{}\n\n{}\n\n{}\n{}\n{}\n{}\n\n{}\n{}\n{}\n{}'.format(
+ "Purple Plugin Pack Stats", "{} plugins in total".format(counts['total']),
+ "Status:", " complete: {}".format(value(counts['default'])),
+ " incomplete: {}".format(value(counts['incomplete'])),
+ " abusive: {}".format(value(counts['abusive'])), "Type:",
+ " purple: {}".format(value(counts['purple'])),
+ " finch: {}".format(value(counts['finch'])),
+ " pidgin: {}".format(value(counts['pidgin']))))
+ commands['stats'] = stats
def show_usage(pp, exitcode):
- print __doc__
+ print(__doc__)
- cmds = pp.commands.keys()
- cmds.sort()
-
- for cmd in cmds:
- print " %-20s %s" % (cmd, pp.commands[cmd].__doc__)
+ cmds = pp.commands.keys()
+ cmds.sort()
+
+ for cmd in cmds:
+ print(" {:<-20} {}".format(cmd, pp.commands[cmd].__doc__))
- print ""
+ print("")
- sys.exit(exitcode)
+ sys.exit(exitcode)
def main():
- # create our main instance
- pp = PluginPack()
+ # create our main instance
+ pp = PluginPack()
- types = []
- depends = []
+ types = []
+ depends = []
- try:
- shortopts = 'adfiPp'
+ try:
+ shortopts = 'adfiPp'
- opts, args = getopt.getopt(sys.argv[1:], shortopts)
- except getopt.error, msg:
- print msg
- show_usage(pp, 1)
-
- for o, a in opts:
- if o == '-a':
- types.append('abusive')
- elif o == '-d':
- types.append('default')
- elif o == '-i':
- types.append('incomplete')
- elif o == '-f':
- depends.append('finch')
- elif o == '-P':
- depends.append('pidgin')
- elif o == '-p':
- depends.append('purple')
-
- # load the plugins that have been requested, if both lists are empty, all
- # plugins are loaded
- pp.load_plugins(types, depends)
-
- if(len(args) == 0):
- show_usage(pp, 1)
-
- cmd = args[0]
- args = args[1:]
-
- try:
- pp.commands[cmd](pp, args)
- except KeyError:
- printerr('\'%s\' command not found' % (cmd))
+ opts, args = getopt.getopt(sys.argv[1:], shortopts)
+ except getopt.error as msg:
+ print(msg)
+ show_usage(pp, 1)
+
+ for o, a in opts:
+ if o == '-a':
+ types.append('abusive')
+ elif o == '-d':
+ types.append('default')
+ elif o == '-i':
+ types.append('incomplete')
+ elif o == '-f':
+ depends.append('finch')
+ elif o == '-P':
+ depends.append('pidgin')
+ elif o == '-p':
+ depends.append('purple')
+
+ # load the plugins that have been requested, if both lists are empty, all
+ # plugins are loaded
+ pp.load_plugins(types, depends)
+
+ if(len(args) == 0):
+ show_usage(pp, 1)
+
+ cmd = args[0]
+ args = args[1:]
+
+ try:
+ pp.commands[cmd](pp, args)
+ except KeyError:
+ printerr('\'{}\' command not found'.format(cmd))
if __name__ == '__main__':
- # this is a work around when we're called for a directory that isn't the
- # directory that this file is in. This happens during distcheck, as well
- # as a few other cases that most people won't use ;)
- if os.path.dirname(__file__) != '':
- os.chdir(os.path.dirname(__file__))
+ # this is a work around when we're called for a directory that isn't the
+ # directory that this file is in. This happens during distcheck, as well
+ # as a few other cases that most people won't use ;)
+ if os.path.dirname(__file__) != '':
+ os.chdir(os.path.dirname(__file__))
- main()
+ main()