plugin-loader 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- metadata +5 -11
- data/lib/plugin/format.rb +0 -68
- data/lib/plugin/format/command.rb +0 -35
- data/lib/plugin/format/data.rb +0 -32
- data/lib/plugin/format/dbus.rb +0 -67
- data/lib/plugin/format/ruby.rb +0 -48
- data/lib/plugin/format/script.rb +0 -35
- data/lib/plugin/loader.rb +0 -158
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plugin-loader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 3
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- David Green
|
@@ -70,14 +70,8 @@ extensions: []
|
|
70
70
|
|
71
71
|
extra_rdoc_files: []
|
72
72
|
|
73
|
-
files:
|
74
|
-
|
75
|
-
- lib/plugin/format/script.rb
|
76
|
-
- lib/plugin/format/ruby.rb
|
77
|
-
- lib/plugin/format/data.rb
|
78
|
-
- lib/plugin/format/command.rb
|
79
|
-
- lib/plugin/format.rb
|
80
|
-
- lib/plugin/loader.rb
|
73
|
+
files: []
|
74
|
+
|
81
75
|
has_rdoc: true
|
82
76
|
homepage: https://launchpad.net/libplugin-loader-ruby
|
83
77
|
licenses: []
|
data/lib/plugin/format.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
# format.rb
|
2
|
-
#
|
3
|
-
# Defines a class allowing new plugin formats to be added.
|
4
|
-
#
|
5
|
-
# Copyright 2010 David Green <david4dev@gmail.com>
|
6
|
-
#
|
7
|
-
# This program is free software; you can redistribute it and/or modify
|
8
|
-
# it under the terms of the GNU General Public License as published by
|
9
|
-
# the Free Software Foundation; either version 3 of the License, or
|
10
|
-
# (at your option) any later version.
|
11
|
-
#
|
12
|
-
# This program is distributed in the hope that it will be useful,
|
13
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
-
# GNU General Public License for more details.
|
16
|
-
#
|
17
|
-
# You should have received a copy of the GNU General Public License
|
18
|
-
# along with this program; if not, write to the Free Software
|
19
|
-
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
20
|
-
# MA 02110-1301, USA.
|
21
|
-
|
22
|
-
|
23
|
-
module Plugin
|
24
|
-
|
25
|
-
#An instance of this class represents a plugin format.
|
26
|
-
class Format
|
27
|
-
@@formats = {}
|
28
|
-
#To create a new annonymous plugin format:
|
29
|
-
# Plugin::Format.new do |exec, args, opts|
|
30
|
-
# ...
|
31
|
-
# return return_data
|
32
|
-
# end
|
33
|
-
#Argument 'exec' provides the data in the '$' key of the plugin metadata file.
|
34
|
-
#Argument 'args' is an array of arguments passed to this format by a Plugin::Loader instance when its run method is called.
|
35
|
-
#Argument 'opts' is a hash of options from Plugin::Loader that may be required by a plugin format. At present opts conatins the following keys:
|
36
|
-
# :plugin_dir
|
37
|
-
# :data_dir
|
38
|
-
# :script_dir
|
39
|
-
#These are the same as the options given when the Plugin::Loader was initialized.
|
40
|
-
#
|
41
|
-
#Plugin::Format.add should be used to create a new plugin format because the format is given a name.
|
42
|
-
def initialize &b
|
43
|
-
@block = b
|
44
|
-
end
|
45
|
-
#Creates a lambda function from the exec value and opts hash.
|
46
|
-
#When the lambda function is called, its arguments become 'args' and
|
47
|
-
#the block given at initialize is executed.
|
48
|
-
def new exec, opts={}
|
49
|
-
lambda do |*args|
|
50
|
-
@block.call exec, args, opts
|
51
|
-
end
|
52
|
-
end
|
53
|
-
#Creates a named plugin format using the same rules as Plugin::Format.new:
|
54
|
-
# Plugin::Format.add "name" do |exec, args, opts|
|
55
|
-
# ...
|
56
|
-
# return return_data
|
57
|
-
# end
|
58
|
-
def self.add name, &b
|
59
|
-
@@formats[name] = self.new &b
|
60
|
-
end
|
61
|
-
#Returns the format called 'name':
|
62
|
-
# Plugin::Format['name']
|
63
|
-
def self.[] name
|
64
|
-
@@formats[name]
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# command.rb
|
2
|
-
#
|
3
|
-
# Copyright 2010 David Green <david4dev@gmail.com>
|
4
|
-
#
|
5
|
-
# This program is free software; you can redistribute it and/or modify
|
6
|
-
# it under the terms of the GNU General Public License as published by
|
7
|
-
# the Free Software Foundation; either version 3 of the License, or
|
8
|
-
# (at your option) any later version.
|
9
|
-
#
|
10
|
-
# This program is distributed in the hope that it will be useful,
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
# GNU General Public License for more details.
|
14
|
-
#
|
15
|
-
# You should have received a copy of the GNU General Public License
|
16
|
-
# along with this program; if not, write to the Free Software
|
17
|
-
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
18
|
-
# MA 02110-1301, USA.
|
19
|
-
#
|
20
|
-
#The command format takes '$' to be a command, executes it, and
|
21
|
-
#returns an array of lines of standard output.
|
22
|
-
# {
|
23
|
-
# "format" => "command",
|
24
|
-
# "$" => "COMMAND"
|
25
|
-
# }
|
26
|
-
require 'plugin/format'
|
27
|
-
|
28
|
-
#Depends: libescape-ruby
|
29
|
-
require 'escape'
|
30
|
-
|
31
|
-
Plugin::Format.add 'command' do |exec, args, opts|
|
32
|
-
IO.popen Escape.shell_command([exec.to_s, *args]).to_s do |handle|
|
33
|
-
return handle.read.split("\n")
|
34
|
-
end
|
35
|
-
end
|
data/lib/plugin/format/data.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
# data.rb
|
2
|
-
#
|
3
|
-
# Copyright 2010 David Green <david4dev@gmail.com>
|
4
|
-
#
|
5
|
-
# This program is free software; you can redistribute it and/or modify
|
6
|
-
# it under the terms of the GNU General Public License as published by
|
7
|
-
# the Free Software Foundation; either version 3 of the License, or
|
8
|
-
# (at your option) any later version.
|
9
|
-
#
|
10
|
-
# This program is distributed in the hope that it will be useful,
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
# GNU General Public License for more details.
|
14
|
-
#
|
15
|
-
# You should have received a copy of the GNU General Public License
|
16
|
-
# along with this program; if not, write to the Free Software
|
17
|
-
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
18
|
-
# MA 02110-1301, USA.
|
19
|
-
#
|
20
|
-
#data is a very simple plugin format that just returns the data structure
|
21
|
-
#referred to by the '$' key in the plugin metadata file:
|
22
|
-
# {
|
23
|
-
# "format" : "data",
|
24
|
-
# "$" : ...
|
25
|
-
# }
|
26
|
-
#The data can be any type supported by JSON, including number, string, array,
|
27
|
-
#hash(object) and boolean.
|
28
|
-
require 'plugin/format'
|
29
|
-
|
30
|
-
Plugin::Format.add 'data' do |exec, args, opts|
|
31
|
-
exec
|
32
|
-
end
|
data/lib/plugin/format/dbus.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
# dbus.rb
|
2
|
-
#
|
3
|
-
# Defines a plugin format that works by connecting to a dbus service.
|
4
|
-
#
|
5
|
-
# Copyright 2010 David Green <david4dev@gmail.com>
|
6
|
-
#
|
7
|
-
# This program is free software; you can redistribute it and/or modify
|
8
|
-
# it under the terms of the GNU General Public License as published by
|
9
|
-
# the Free Software Foundation; either version 3 of the License, or
|
10
|
-
# (at your option) any later version.
|
11
|
-
#
|
12
|
-
# This program is distributed in the hope that it will be useful,
|
13
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
-
# GNU General Public License for more details.
|
16
|
-
#
|
17
|
-
# You should have received a copy of the GNU General Public License
|
18
|
-
# along with this program; if not, write to the Free Software
|
19
|
-
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
20
|
-
# MA 02110-1301, USA.
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#A plugin in dbus format has a general metadata file format of:
|
24
|
-
# {
|
25
|
-
# 'format' : 'dbus',
|
26
|
-
# '$' : [service, object, interface, method]
|
27
|
-
# }
|
28
|
-
#For example:
|
29
|
-
# {
|
30
|
-
# "format" : "dbus",
|
31
|
-
# "$" : [
|
32
|
-
# "org.gnome.Rhythmbox",
|
33
|
-
# "/org/gnome/Rhythmbox/Player",
|
34
|
-
# "org.gnome.Rhythmbox.Player",
|
35
|
-
# "getPlayingUri"
|
36
|
-
# ]
|
37
|
-
# }
|
38
|
-
#describes a plugin that gets the current playing song in Rhythmbox.
|
39
|
-
#
|
40
|
-
#The dbus format uses the dbus session bus.
|
41
|
-
#It only works with dbus services that can be introspected (which is almost all of them).
|
42
|
-
require 'plugin/format'
|
43
|
-
|
44
|
-
#Depends: libdbus-ruby
|
45
|
-
require 'dbus'
|
46
|
-
|
47
|
-
module Plugin
|
48
|
-
|
49
|
-
Format.add 'dbus' do |exec, args, opts|
|
50
|
-
service = exec[0]
|
51
|
-
object = exec[1]
|
52
|
-
iface = exec[2]
|
53
|
-
method = exec[3]
|
54
|
-
|
55
|
-
obj = DBus::SessionBus.
|
56
|
-
instance.
|
57
|
-
service(service).
|
58
|
-
object(object)
|
59
|
-
|
60
|
-
obj.introspect
|
61
|
-
|
62
|
-
obj[iface].
|
63
|
-
method(method).
|
64
|
-
call(*args)
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
data/lib/plugin/format/ruby.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
# ruby.rb
|
2
|
-
#
|
3
|
-
# Copyright 2010 David Green <david4dev@gmail.com>
|
4
|
-
#
|
5
|
-
# This program is free software; you can redistribute it and/or modify
|
6
|
-
# it under the terms of the GNU General Public License as published by
|
7
|
-
# the Free Software Foundation; either version 3 of the License, or
|
8
|
-
# (at your option) any later version.
|
9
|
-
#
|
10
|
-
# This program is distributed in the hope that it will be useful,
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
# GNU General Public License for more details.
|
14
|
-
#
|
15
|
-
# You should have received a copy of the GNU General Public License
|
16
|
-
# along with this program; if not, write to the Free Software
|
17
|
-
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
18
|
-
# MA 02110-1301, USA.
|
19
|
-
#
|
20
|
-
#The ruby format allows plugins to be written in ruby.
|
21
|
-
#The '$' key refers to the ruby file that should be loaded.
|
22
|
-
#The metadata file has the following format:
|
23
|
-
# {
|
24
|
-
# "format" : "ruby",
|
25
|
-
# "$" : "ruby_lib"
|
26
|
-
# }
|
27
|
-
#The ruby file should look something like:
|
28
|
-
# Plugin.new do |*args|
|
29
|
-
# #some code
|
30
|
-
# end
|
31
|
-
require 'plugin/format'
|
32
|
-
|
33
|
-
module Plugin
|
34
|
-
|
35
|
-
_ruby_plugin = lambda do |*args|
|
36
|
-
args
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.new &b
|
40
|
-
_ruby_plugin = b
|
41
|
-
end
|
42
|
-
|
43
|
-
Format.add 'ruby' do |exec, args, opts|
|
44
|
-
load exec
|
45
|
-
_ruby_plugin.call *args
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
data/lib/plugin/format/script.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
# script.rb
|
2
|
-
#
|
3
|
-
# Copyright 2010 David Green <david4dev@gmail.com>
|
4
|
-
#
|
5
|
-
# This program is free software; you can redistribute it and/or modify
|
6
|
-
# it under the terms of the GNU General Public License as published by
|
7
|
-
# the Free Software Foundation; either version 3 of the License, or
|
8
|
-
# (at your option) any later version.
|
9
|
-
#
|
10
|
-
# This program is distributed in the hope that it will be useful,
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
# GNU General Public License for more details.
|
14
|
-
#
|
15
|
-
# You should have received a copy of the GNU General Public License
|
16
|
-
# along with this program; if not, write to the Free Software
|
17
|
-
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
18
|
-
# MA 02110-1301, USA.
|
19
|
-
#
|
20
|
-
#The script format takes '$' to be an executable in the @script_dir folder.
|
21
|
-
#The script is executed and an array of lines of standard output is returned.
|
22
|
-
# {
|
23
|
-
# "format" => "command",
|
24
|
-
# "$" => "COMMAND"
|
25
|
-
# }
|
26
|
-
require 'plugin/format'
|
27
|
-
|
28
|
-
#Depends: libescape-ruby
|
29
|
-
require 'escape'
|
30
|
-
|
31
|
-
Plugin::Format.add 'script' do |exec, args, opts|
|
32
|
-
IO.popen Escape.shell_command(["#{opts[:dir] || '/usr/bin'}/#{exec}", *args]).to_s do |handle|
|
33
|
-
return handle.read.split("\n")
|
34
|
-
end
|
35
|
-
end
|
data/lib/plugin/loader.rb
DELETED
@@ -1,158 +0,0 @@
|
|
1
|
-
# loader.rb
|
2
|
-
#
|
3
|
-
# Provides a class for loading plugins into a program.
|
4
|
-
#
|
5
|
-
# Copyright 2010 David Green <david4dev@gmail.com>
|
6
|
-
#
|
7
|
-
# This program is free software; you can redistribute it and/or modify
|
8
|
-
# it under the terms of the GNU General Public License as published by
|
9
|
-
# the Free Software Foundation; either version 3 of the License, or
|
10
|
-
# (at your option) any later version.
|
11
|
-
#
|
12
|
-
# This program is distributed in the hope that it will be useful,
|
13
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
-
# GNU General Public License for more details.
|
16
|
-
#
|
17
|
-
# You should have received a copy of the GNU General Public License
|
18
|
-
# along with this program; if not, write to the Free Software
|
19
|
-
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
20
|
-
# MA 02110-1301, USA.
|
21
|
-
require 'plugin/format'
|
22
|
-
|
23
|
-
#Depends: libjson-ruby
|
24
|
-
require 'json'
|
25
|
-
|
26
|
-
module Plugin
|
27
|
-
|
28
|
-
#Using an instance of this class, you can control what plugins are
|
29
|
-
#loaded into your program.
|
30
|
-
class Loader
|
31
|
-
#OPTIONS:
|
32
|
-
#
|
33
|
-
# :allowed_formats => [...] #optional; default is an array of all available plugin formats
|
34
|
-
#- Defines an array of names (strings) of formats that plugins for this instance can be written in.
|
35
|
-
#
|
36
|
-
# :data_dir => '/usr/share/appname' #required
|
37
|
-
#- Defines the directory in which the data for this instance is stored in the file system.
|
38
|
-
#
|
39
|
-
# :plugin_dir => '' #optional; default is "#{@data_dir}/plugins"
|
40
|
-
#- Defines the directory in which the plugin metadata files are stored
|
41
|
-
#
|
42
|
-
# :script_dir => '' #optional; default is "#{@data_dir}/scripts"
|
43
|
-
#- Defines the directory in which excecutables (potentially used by plugins) are stored.
|
44
|
-
def initialize opts={}
|
45
|
-
@available_formats = $:.map do |path|
|
46
|
-
Dir.glob("#{path}/plugin/format/*.rb").map! do |rbfile|
|
47
|
-
File.basename(rbfile).sub!(/\.rb$/, '')
|
48
|
-
end
|
49
|
-
end
|
50
|
-
@available_formats.flatten!
|
51
|
-
@allowed_formats = opts[:allowed_formats] ? (opts[:allowed_formats] & available_formats) : available_formats
|
52
|
-
@allowed_formats.each do |fmt|
|
53
|
-
require "plugin/format/#{fmt}"
|
54
|
-
end
|
55
|
-
@data_dir = opts[:data_dir]
|
56
|
-
@plugin_dir = opts[:plugin_dir] || "#{@data_dir}/plugins"
|
57
|
-
@script_dir = opts[:script_dir] || "#{@data_dir}/scripts"
|
58
|
-
@plugins = {}
|
59
|
-
@etc = {}
|
60
|
-
end
|
61
|
-
#Loads a plugin called 'name' of type 'type'.
|
62
|
-
#It does this by reading the metadata file: "#{@plugin_dir}/name.type".
|
63
|
-
#Plugin types should be considered namespaces for one or more plugins.
|
64
|
-
#Plugin names are the unique identification of a plugin within a particular type.
|
65
|
-
#Plugins are similar to functions - they are excecuted with arguments a value (which can be a complex data structure such as hash or array if needed).
|
66
|
-
#load does not excecute a plugin but it once loaded
|
67
|
-
#a plugin can be excecuted with the run method.
|
68
|
-
#
|
69
|
-
#The metadata files are in a JSON format:
|
70
|
-
# {
|
71
|
-
# "format" => "FORMAT_NAME",
|
72
|
-
# "$" => ...
|
73
|
-
# }
|
74
|
-
#The 'format' key is a string that defines the name of the format of the plugin. If load loads a plugin without the 'format' key, an exception is raised.
|
75
|
-
#If the format is not available or is not allowed (see: initailize), an exception is raised.
|
76
|
-
#See Plugin::Format for more details on plugin formats.
|
77
|
-
#The '$' key can be any data structure (most commonly a string) and is used by the format declaration to excecute a plugin. See the individual format declarations in plugin/format/*.rb for details of individual formats. If the '$' key is missing, an exception is raised.
|
78
|
-
#
|
79
|
-
#load returns any extra data keys in the JSON file as a hash.
|
80
|
-
def load name, type
|
81
|
-
File.open "#{@plugin_dir}/#{name}.#{type}" do |f|
|
82
|
-
data = JSON.parse(f.read)
|
83
|
-
unless data.has_key? '$'
|
84
|
-
raise "#{type} plugin '#{name}' has an invalid metadata file. It is missing the required '$' key!"
|
85
|
-
end
|
86
|
-
unless data.has_key? 'format'
|
87
|
-
raise "#{type} plugin '#{name}' has an invalid metadata file. It is missing the required 'format' key!"
|
88
|
-
end
|
89
|
-
unless @plugins.has_key? type
|
90
|
-
@plugins[type] = {}
|
91
|
-
end
|
92
|
-
unless @etc.has_key? type
|
93
|
-
@etc[type] = {}
|
94
|
-
end
|
95
|
-
fmt = data.delete 'format'
|
96
|
-
format = Format[fmt]
|
97
|
-
if format.nil?
|
98
|
-
raise "Plugin format #{fmt} does not exist or is disabled!"
|
99
|
-
end
|
100
|
-
@plugins[type][name] = format.new data.delete('$'),
|
101
|
-
:script_dir => @script_dir,
|
102
|
-
:data_dir => @data_dir,
|
103
|
-
:plugin_dir => @plugin_dir
|
104
|
-
@etc[type][name] = data
|
105
|
-
end
|
106
|
-
end
|
107
|
-
#Returns a hash of any extra keys in the plugin metadata file of
|
108
|
-
#the plugin with type 'type' and name 'name'. The plugin needs
|
109
|
-
#to be loaded for this to work.
|
110
|
-
def etc name, type
|
111
|
-
@etc[type][name]
|
112
|
-
end
|
113
|
-
#Unloads a plugin of name 'name' and type 'type'.
|
114
|
-
def unload name, type
|
115
|
-
@etc[type].delete name
|
116
|
-
@plugins[type].delete name
|
117
|
-
end
|
118
|
-
#Loads all plugins of type 'type'.
|
119
|
-
def load_type type
|
120
|
-
Dir.glob("#{@plugin_dir}/*.#{type}").each do |file|
|
121
|
-
self.load file
|
122
|
-
end
|
123
|
-
end
|
124
|
-
#Unloads all plugins of type 'type'.
|
125
|
-
def unload_type type
|
126
|
-
@etc.delete type
|
127
|
-
@plugins.delete type
|
128
|
-
end
|
129
|
-
#Loads all plugins.
|
130
|
-
def load_all
|
131
|
-
Dir.glob("#{@plugin_dir}/*").each do |file|
|
132
|
-
self.load file
|
133
|
-
end
|
134
|
-
end
|
135
|
-
#Unloads all plugins.
|
136
|
-
def unload_all
|
137
|
-
@etc.clear
|
138
|
-
@plugins.clear
|
139
|
-
end
|
140
|
-
#Excecutes the plugin of type 'type' called 'name', passing in any other arguments.
|
141
|
-
#The return value of the plugin is returned.
|
142
|
-
def run name, type, *args
|
143
|
-
@plugins[type][name].call *args
|
144
|
-
end
|
145
|
-
#Returns a list of the loaded types
|
146
|
-
def types
|
147
|
-
@plugins.keys
|
148
|
-
end
|
149
|
-
#Returns a list of the plugins of type 'type'
|
150
|
-
def plugins type
|
151
|
-
unless @plugins.has_key? type
|
152
|
-
return []
|
153
|
-
end
|
154
|
-
@plugins[type].keys
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
end
|