rUtilAnts 0.3.0.20110825 → 1.0.0.20120223
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +7 -1
- data/ChangeLog +16 -0
- data/LICENSE +1 -1
- data/README +2 -5
- data/ReleaseInfo +8 -8
- data/lib/rUtilAnts/Archive.rb +26 -26
- data/lib/rUtilAnts/ForeignProcess.rb +20 -21
- data/lib/rUtilAnts/GUI.rb +38 -38
- data/lib/rUtilAnts/GUI/BugReportDialog.rb +5 -5
- data/lib/rUtilAnts/Logging.rb +124 -254
- data/lib/rUtilAnts/Misc.rb +70 -37
- data/lib/rUtilAnts/MySQLPool.rb +31 -31
- data/lib/rUtilAnts/Platform.rb +33 -16
- data/lib/rUtilAnts/Platforms/i386-cygwin/PlatformInfo.rb +46 -15
- data/lib/rUtilAnts/Platforms/i386-linux/PlatformInfo.rb +46 -15
- data/lib/rUtilAnts/Platforms/i386-mingw32/PlatformInfo.rb +58 -17
- data/lib/rUtilAnts/Platforms/i386-mswin32/PlatformInfo.rb +58 -17
- data/lib/rUtilAnts/Platforms/x86_64-linux/PlatformInfo.rb +46 -15
- data/lib/rUtilAnts/Plugins.rb +54 -139
- data/lib/rUtilAnts/SingletonProxy.rb +33 -0
- data/lib/rUtilAnts/URLAccess.rb +44 -66
- data/lib/rUtilAnts/URLCache.rb +39 -56
- data/lib/rUtilAnts/URLHandlers/DataImage.rb +20 -20
- data/lib/rUtilAnts/URLHandlers/FTP.rb +24 -24
- data/lib/rUtilAnts/URLHandlers/HTTP.rb +21 -21
- data/lib/rUtilAnts/URLHandlers/LocalFile.rb +19 -19
- metadata +10 -10
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2009 -
|
2
|
+
# Copyright (c) 2009 - 2012 Muriel Salvan (muriel@x-aeon.com)
|
3
3
|
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
4
|
#++
|
5
5
|
|
@@ -7,12 +7,12 @@ module RUtilAnts
|
|
7
7
|
|
8
8
|
module Platform
|
9
9
|
|
10
|
-
|
10
|
+
module PlatformInfo
|
11
11
|
|
12
12
|
# Return the ID of the OS
|
13
13
|
# Applications may adapt their behavior based on it.
|
14
14
|
#
|
15
|
-
# Return
|
15
|
+
# Return::
|
16
16
|
# * _Integer_: OS ID
|
17
17
|
def os
|
18
18
|
return OS_WINDOWS
|
@@ -20,7 +20,7 @@ module RUtilAnts
|
|
20
20
|
|
21
21
|
# Return the list of directories where we look for executables
|
22
22
|
#
|
23
|
-
# Return
|
23
|
+
# Return::
|
24
24
|
# * <em>list<String></em>: List of directories
|
25
25
|
def getSystemExePath
|
26
26
|
return ENV['PATH'].split(';')
|
@@ -28,7 +28,7 @@ module RUtilAnts
|
|
28
28
|
|
29
29
|
# Set the list of directories where we look for executables
|
30
30
|
#
|
31
|
-
# Parameters
|
31
|
+
# Parameters::
|
32
32
|
# * *iNewDirsList* (<em>list<String></em>): List of directories
|
33
33
|
def setSystemExePath(iNewDirsList)
|
34
34
|
ENV['PATH'] = iNewDirsList.join(';')
|
@@ -37,7 +37,7 @@ module RUtilAnts
|
|
37
37
|
# Return the list of file extensions that might be discretely happened to executable files.
|
38
38
|
# This is the optional extensions that can be happened when invoked from a terminal.
|
39
39
|
#
|
40
|
-
# Return
|
40
|
+
# Return::
|
41
41
|
# * <em>list<String></em>: List of extensions (including .)
|
42
42
|
def getDiscreteExeExtensions
|
43
43
|
rExtList = []
|
@@ -51,7 +51,7 @@ module RUtilAnts
|
|
51
51
|
|
52
52
|
# Return the list of directories where we look for libraries
|
53
53
|
#
|
54
|
-
# Return
|
54
|
+
# Return::
|
55
55
|
# * <em>list<String></em>: List of directories
|
56
56
|
def getSystemLibsPath
|
57
57
|
return ENV['PATH'].split(';')
|
@@ -59,7 +59,7 @@ module RUtilAnts
|
|
59
59
|
|
60
60
|
# Set the list of directories where we look for libraries
|
61
61
|
#
|
62
|
-
# Parameters
|
62
|
+
# Parameters::
|
63
63
|
# * *iNewDirsList* (<em>list<String></em>): List of directories
|
64
64
|
def setSystemLibsPath(iNewDirsList)
|
65
65
|
ENV['PATH'] = iNewDirsList.join(';')
|
@@ -67,7 +67,7 @@ module RUtilAnts
|
|
67
67
|
|
68
68
|
# This method sends a message (platform dependent) to the user, without the use of wxruby
|
69
69
|
#
|
70
|
-
# Parameters
|
70
|
+
# Parameters::
|
71
71
|
# * *iMsg* (_String_): The message to display
|
72
72
|
def sendMsg(iMsg)
|
73
73
|
# iMsg must not be longer than 255 characters
|
@@ -82,10 +82,10 @@ module RUtilAnts
|
|
82
82
|
# Execute a Shell command.
|
83
83
|
# Do not wait for its termination.
|
84
84
|
#
|
85
|
-
# Parameters
|
85
|
+
# Parameters::
|
86
86
|
# * *iCmd* (_String_): The command to execute
|
87
87
|
# * *iInTerminal* (_Boolean_): Do we execute this command in a separate terminal ?
|
88
|
-
# Return
|
88
|
+
# Return::
|
89
89
|
# * _Exception_: Error, or nil if success
|
90
90
|
def execShellCmdNoWait(iCmd, iInTerminal)
|
91
91
|
rException = nil
|
@@ -107,9 +107,9 @@ module RUtilAnts
|
|
107
107
|
|
108
108
|
# Execute a given URL to be launched in a browser
|
109
109
|
#
|
110
|
-
# Parameters
|
110
|
+
# Parameters::
|
111
111
|
# * *iURL* (_String_): The URL to launch
|
112
|
-
# Return
|
112
|
+
# Return::
|
113
113
|
# * _String_: Error message, or nil if success
|
114
114
|
def launchURL(iURL)
|
115
115
|
rError = nil
|
@@ -127,21 +127,62 @@ module RUtilAnts
|
|
127
127
|
|
128
128
|
# Get file extensions specifics to executable files
|
129
129
|
#
|
130
|
-
# Return
|
130
|
+
# Return::
|
131
131
|
# * <em>list<String></em>: List of extensions (including . character). It can be empty.
|
132
132
|
def getExecutableExtensions
|
133
|
-
|
134
|
-
|
133
|
+
rLstExt = [ '.exe', '.com', '.bat' ]
|
134
|
+
|
135
|
+
# Use PATHEXT environment variable if possible
|
136
|
+
if (ENV['PATHEXT'] != nil)
|
137
|
+
rLstExt.concat(ENV['PATHEXT'].split(';').map { |iExt| iExt.downcase })
|
138
|
+
rLstExt.uniq!
|
139
|
+
end
|
140
|
+
|
141
|
+
return rLstExt
|
135
142
|
end
|
136
143
|
|
137
144
|
# Get prohibited characters from file names
|
138
145
|
#
|
139
|
-
# Return
|
146
|
+
# Return::
|
140
147
|
# * _String_: String of prohibited characters in file names
|
141
148
|
def getProhibitedFileNamesCharacters
|
142
149
|
return '\\/:*?"<>|'
|
143
150
|
end
|
144
151
|
|
152
|
+
# Create a shortcut (ln -s on Cygwin/Unix systems, a .lnk file on Windows systems)
|
153
|
+
#
|
154
|
+
# Parameters::
|
155
|
+
# * *iSrc* (_String_): The source file
|
156
|
+
# * *iDst* (_String_): The destination file
|
157
|
+
def createShortcut(iSrc, iDst)
|
158
|
+
require 'win32/shortcut'
|
159
|
+
Win32::Shortcut.new(getShortcutFileName(iDst)) do |oShortcut|
|
160
|
+
oShortcut.path = File.expand_path(iSrc)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# Get the name of a real file name, pointed by a shortcut.
|
165
|
+
# On Windows systems, it will be the target of the lnk file.
|
166
|
+
#
|
167
|
+
# Parameters::
|
168
|
+
# * *iShortcutName* (_String_): Name of the shortcut (same name used by createShortcut). Don't use OS specific extensions in this name (no .lnk).
|
169
|
+
# Return::
|
170
|
+
# * _String_: The real file name pointed by this shortcut
|
171
|
+
def followShortcut(iShortcutName)
|
172
|
+
require 'win32/shortcut'
|
173
|
+
return Win32::Shortcut.open(getShortcutFileName(iShortcutName)).path
|
174
|
+
end
|
175
|
+
|
176
|
+
# Get the real file name of a shortcut
|
177
|
+
#
|
178
|
+
# Parameters::
|
179
|
+
# * *iDst* (_String_): The destination file that will host the shortcut
|
180
|
+
# Return::
|
181
|
+
# * _String_: The real shortcut file name
|
182
|
+
def getShortcutFileName(iDst)
|
183
|
+
return "#{iDst}.lnk"
|
184
|
+
end
|
185
|
+
|
145
186
|
end
|
146
187
|
|
147
188
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2009 -
|
2
|
+
# Copyright (c) 2009 - 2012 Muriel Salvan (muriel@x-aeon.com)
|
3
3
|
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
4
|
#++
|
5
5
|
|
@@ -7,12 +7,12 @@ module RUtilAnts
|
|
7
7
|
|
8
8
|
module Platform
|
9
9
|
|
10
|
-
|
10
|
+
module PlatformInfo
|
11
11
|
|
12
12
|
# Return the ID of the OS
|
13
13
|
# Applications may adapt their behavior based on it.
|
14
14
|
#
|
15
|
-
# Return
|
15
|
+
# Return::
|
16
16
|
# * _Integer_: OS ID
|
17
17
|
def os
|
18
18
|
return OS_LINUX
|
@@ -20,7 +20,7 @@ module RUtilAnts
|
|
20
20
|
|
21
21
|
# Return the list of directories where we look for executables
|
22
22
|
#
|
23
|
-
# Return
|
23
|
+
# Return::
|
24
24
|
# * <em>list<String></em>: List of directories
|
25
25
|
def getSystemExePath
|
26
26
|
return ENV['PATH'].split(':')
|
@@ -28,7 +28,7 @@ module RUtilAnts
|
|
28
28
|
|
29
29
|
# Set the list of directories where we look for executables
|
30
30
|
#
|
31
|
-
# Parameters
|
31
|
+
# Parameters::
|
32
32
|
# * *iNewDirsList* (<em>list<String></em>): List of directories
|
33
33
|
def setSystemExePath(iNewDirsList)
|
34
34
|
ENV['PATH'] = iNewDirsList.join(':')
|
@@ -37,7 +37,7 @@ module RUtilAnts
|
|
37
37
|
# Return the list of file extensions that might be discretely happened to executable files.
|
38
38
|
# This is the optional extensions that can be happened when invoked from a terminal.
|
39
39
|
#
|
40
|
-
# Return
|
40
|
+
# Return::
|
41
41
|
# * <em>list<String></em>: List of extensions (including .)
|
42
42
|
def getDiscreteExeExtensions
|
43
43
|
return []
|
@@ -45,7 +45,7 @@ module RUtilAnts
|
|
45
45
|
|
46
46
|
# Return the list of directories where we look for libraries
|
47
47
|
#
|
48
|
-
# Return
|
48
|
+
# Return::
|
49
49
|
# * <em>list<String></em>: List of directories
|
50
50
|
def getSystemLibsPath
|
51
51
|
rList = ENV['PATH'].split(':')
|
@@ -59,7 +59,7 @@ module RUtilAnts
|
|
59
59
|
|
60
60
|
# Set the list of directories where we look for libraries
|
61
61
|
#
|
62
|
-
# Parameters
|
62
|
+
# Parameters::
|
63
63
|
# * *iNewDirsList* (<em>list<String></em>): List of directories
|
64
64
|
def setSystemLibsPath(iNewDirsList)
|
65
65
|
ENV['LD_LIBRARY_PATH'] = iNewDirsList.join(':')
|
@@ -67,7 +67,7 @@ module RUtilAnts
|
|
67
67
|
|
68
68
|
# This method sends a message (platform dependent) to the user, without the use of wxruby
|
69
69
|
#
|
70
|
-
# Parameters
|
70
|
+
# Parameters::
|
71
71
|
# * *iMsg* (_String_): The message to display
|
72
72
|
def sendMsg(iMsg)
|
73
73
|
# TODO: Handle case of xmessage not installed
|
@@ -84,10 +84,10 @@ module RUtilAnts
|
|
84
84
|
# Execute a Shell command.
|
85
85
|
# Do not wait for its termination.
|
86
86
|
#
|
87
|
-
# Parameters
|
87
|
+
# Parameters::
|
88
88
|
# * *iCmd* (_String_): The command to execute
|
89
89
|
# * *iInTerminal* (_Boolean_): Do we execute this command in a separate terminal ?
|
90
|
-
# Return
|
90
|
+
# Return::
|
91
91
|
# * _Exception_: Error, or nil if success
|
92
92
|
def execShellCmdNoWait(iCmd, iInTerminal)
|
93
93
|
rException = nil
|
@@ -110,9 +110,9 @@ module RUtilAnts
|
|
110
110
|
|
111
111
|
# Execute a given URL to be launched in a browser
|
112
112
|
#
|
113
|
-
# Parameters
|
113
|
+
# Parameters::
|
114
114
|
# * *iURL* (_String_): The URL to launch
|
115
|
-
# Return
|
115
|
+
# Return::
|
116
116
|
# * _String_: Error message, or nil if success
|
117
117
|
def launchURL(iURL)
|
118
118
|
rError = nil
|
@@ -128,7 +128,7 @@ module RUtilAnts
|
|
128
128
|
|
129
129
|
# Get file extensions specifics to executable files
|
130
130
|
#
|
131
|
-
# Return
|
131
|
+
# Return::
|
132
132
|
# * <em>list<String></em>: List of extensions (including . character). It can be empty.
|
133
133
|
def getExecutableExtensions
|
134
134
|
return []
|
@@ -136,12 +136,43 @@ module RUtilAnts
|
|
136
136
|
|
137
137
|
# Get prohibited characters from file names
|
138
138
|
#
|
139
|
-
# Return
|
139
|
+
# Return::
|
140
140
|
# * _String_: String of prohibited characters in file names
|
141
141
|
def getProhibitedFileNamesCharacters
|
142
142
|
return '/'
|
143
143
|
end
|
144
144
|
|
145
|
+
# Create a shortcut (ln -s on Cygwin/Unix systems, a .lnk file on Windows systems)
|
146
|
+
#
|
147
|
+
# Parameters::
|
148
|
+
# * *iSrc* (_String_): The source file
|
149
|
+
# * *iDst* (_String_): The destination file
|
150
|
+
def createShortcut(iSrc, iDst)
|
151
|
+
require 'fileutils'
|
152
|
+
FileUtils::ln_s(iSrc, iDst)
|
153
|
+
end
|
154
|
+
|
155
|
+
# Get the name of a real file name, pointed by a shortcut.
|
156
|
+
# On Windows systems, it will be the target of the lnk file.
|
157
|
+
#
|
158
|
+
# Parameters::
|
159
|
+
# * *iShortcutName* (_String_): Name of the shortcut (same name used by createShortcut). Don't use OS specific extensions in this name (no .lnk).
|
160
|
+
# Return::
|
161
|
+
# * _String_: The real file name pointed by this shortcut
|
162
|
+
def followShortcut(iShortcutName)
|
163
|
+
return File.readlink(iShortcutName)
|
164
|
+
end
|
165
|
+
|
166
|
+
# Get the real file name of a shortcut
|
167
|
+
#
|
168
|
+
# Parameters::
|
169
|
+
# * *iDst* (_String_): The destination file that will host the shortcut
|
170
|
+
# Return::
|
171
|
+
# * _String_: The real shortcut file name
|
172
|
+
def getShortcutFileName(iDst)
|
173
|
+
return iDst
|
174
|
+
end
|
175
|
+
|
145
176
|
end
|
146
177
|
|
147
178
|
end
|
data/lib/rUtilAnts/Plugins.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2009 -
|
2
|
+
# Copyright (c) 2009 - 2012 Muriel Salvan (muriel@x-aeon.com)
|
3
3
|
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
4
|
#++
|
5
5
|
|
@@ -53,11 +53,10 @@ module RUtilAnts
|
|
53
53
|
class PluginDependenciesUnresolvedError < RuntimeError
|
54
54
|
end
|
55
55
|
|
56
|
-
|
57
|
-
class PluginsManager
|
56
|
+
module PluginsInterface
|
58
57
|
|
59
58
|
# Constructor
|
60
|
-
def
|
59
|
+
def init_plugins
|
61
60
|
# Map of plugins, per category
|
62
61
|
# map< String, map< String, map< Symbol, Object > > >
|
63
62
|
@Plugins = {}
|
@@ -65,14 +64,14 @@ module RUtilAnts
|
|
65
64
|
|
66
65
|
# Register a new plugin
|
67
66
|
#
|
68
|
-
# Parameters
|
67
|
+
# Parameters::
|
69
68
|
# * *iCategoryName* (_String_): Category this plugin belongs to
|
70
69
|
# * *iPluginName* (_String_): Plugin name
|
71
70
|
# * *iFileName* (_String_): File name containing the plugin (can be nil)
|
72
71
|
# * *iDesc* (<em>map<Symbol,Object></em>): Plugin's description (can be nil)
|
73
72
|
# * *iClassName* (_String_): Name of the plugin class
|
74
73
|
# * *iInitCodeBlock* (_Proc_): Code block to call when initializing the real instance (can be nil)
|
75
|
-
def
|
74
|
+
def register_new_plugin(iCategoryName, iPluginName, iFileName, iDesc, iClassName, iInitCodeBlock)
|
76
75
|
# Complete the description with some metadata
|
77
76
|
if (@Plugins[iCategoryName] == nil)
|
78
77
|
@Plugins[iCategoryName] = {}
|
@@ -95,13 +94,13 @@ module RUtilAnts
|
|
95
94
|
|
96
95
|
# Parse plugins from a given directory
|
97
96
|
#
|
98
|
-
# Parameters
|
97
|
+
# Parameters::
|
99
98
|
# * *iCategory* (_Object_): Category those plugins will belong to
|
100
99
|
# * *iDir* (_String_): Directory to parse for plugins
|
101
100
|
# * *iBaseClassNames* (_String_): The base class name of plugins to be instantiated
|
102
101
|
# * *iInitCodeBlock* (_CodeBlock_): Code to be executed first time the plugin will be instantiated (can be ommitted):
|
103
|
-
#
|
104
|
-
def
|
102
|
+
# * *ioPlugin* (_Object_): Plugin instance
|
103
|
+
def parse_plugins_from_dir(iCategory, iDir, iBaseClassNames, &iInitCodeBlock)
|
105
104
|
# Gather descriptions
|
106
105
|
# map< String, map >
|
107
106
|
lDescriptions = {}
|
@@ -115,11 +114,11 @@ module RUtilAnts
|
|
115
114
|
if (lDesc.is_a?(Hash))
|
116
115
|
lDescriptions[lPluginName] = lDesc
|
117
116
|
else
|
118
|
-
|
117
|
+
log_bug "Plugin description #{iFileName} is incorrect. The file should just describe a simple hash map."
|
119
118
|
end
|
120
119
|
end
|
121
120
|
rescue Exception
|
122
|
-
|
121
|
+
log_exc $!, "Error while loading file #{iFileName}. Ignoring this description."
|
123
122
|
end
|
124
123
|
end
|
125
124
|
# Now, parse the plugins themselves
|
@@ -132,7 +131,7 @@ module RUtilAnts
|
|
132
131
|
if (@Plugins[iCategory][lPluginName] == nil)
|
133
132
|
# Check if we have a description
|
134
133
|
lDesc = lDescriptions[lPluginName]
|
135
|
-
|
134
|
+
register_new_plugin(
|
136
135
|
iCategory,
|
137
136
|
lPluginName,
|
138
137
|
iFileName,
|
@@ -141,7 +140,7 @@ module RUtilAnts
|
|
141
140
|
iInitCodeBlock
|
142
141
|
)
|
143
142
|
else
|
144
|
-
|
143
|
+
log_warn "Plugin named #{lPluginName} in category #{iCategory} already exists. Please name it differently. Ignoring it from #{iFileName}."
|
145
144
|
end
|
146
145
|
end
|
147
146
|
end
|
@@ -149,17 +148,17 @@ module RUtilAnts
|
|
149
148
|
# Get the named plugin instance.
|
150
149
|
# Uses RDI if given in parameters or if Main RDI Installer defined to resolve Plugins' dependencies.
|
151
150
|
#
|
152
|
-
# Parameters
|
151
|
+
# Parameters::
|
153
152
|
# * *iCategory* (_Object_): Category those plugins will belong to
|
154
153
|
# * *iPluginName* (_String_): Plugin name
|
155
154
|
# * *iParameters* (<em>map<Symbol,Object></em>): Additional parameters:
|
156
|
-
#
|
157
|
-
#
|
158
|
-
#
|
159
|
-
# Return
|
155
|
+
# * *OnlyIfExtDepsResolved* (_Boolean_): Do we return the plugin only if there is no need to install external dependencies ? [optional = false]
|
156
|
+
# * *RDIInstaller* (<em>RDI::Installer</em>): The RDI installer if available, or nil otherwise [optional = nil]
|
157
|
+
# * *RDIContextModifiers* (<em>map<String,list< [String,Object] >></em>): The map of context modifiers to be filled by the RDI installer if specified, or nil if ignored [optional = nil]
|
158
|
+
# Return::
|
160
159
|
# * _Object_: The corresponding plugin, or nil in case of failure
|
161
160
|
# * _Exception_: The error, or nil in case of success
|
162
|
-
def
|
161
|
+
def get_plugin_instance(iCategory, iPluginName, iParameters = {})
|
163
162
|
rPlugin = nil
|
164
163
|
rError = nil
|
165
164
|
|
@@ -185,14 +184,14 @@ module RUtilAnts
|
|
185
184
|
# If it is not given as parameter, try getting the singleton
|
186
185
|
if ((lRDIInstaller == nil) and
|
187
186
|
(defined?(RDI::Installer) != nil))
|
188
|
-
lRDIInstaller = RDI::Installer.
|
187
|
+
lRDIInstaller = RDI::Installer.get_main_instance
|
189
188
|
end
|
190
189
|
if (lRDIInstaller != nil)
|
191
190
|
if (lOnlyIfExtDepsResolved)
|
192
191
|
# Test that each dependency is accessible
|
193
192
|
lSuccess = true
|
194
193
|
lDesc[:Dependencies].each do |iDepDesc|
|
195
|
-
lSuccess = lRDIInstaller.
|
194
|
+
lSuccess = lRDIInstaller.test_dependency(iDepDesc)
|
196
195
|
if (!lSuccess)
|
197
196
|
# It is useless to continue
|
198
197
|
break
|
@@ -200,7 +199,7 @@ module RUtilAnts
|
|
200
199
|
end
|
201
200
|
else
|
202
201
|
# Load other dependencies
|
203
|
-
lError, lContextModifiers, lIgnored, lUnresolved = lRDIInstaller.
|
202
|
+
lError, lContextModifiers, lIgnored, lUnresolved = lRDIInstaller.ensure_dependencies(lDesc[:Dependencies])
|
204
203
|
if (lRDIContextModifiers != nil)
|
205
204
|
lRDIContextModifiers.merge!(lContextModifiers)
|
206
205
|
end
|
@@ -224,7 +223,7 @@ module RUtilAnts
|
|
224
223
|
# Load other plugins
|
225
224
|
lDesc[:PluginsDependencies].each do |iPluginInfo|
|
226
225
|
iPluginCategory, iPluginName = iPluginInfo
|
227
|
-
lPlugin, lError =
|
226
|
+
lPlugin, lError = get_plugin_instance(iPluginCategory, iPluginName, iParameters)
|
228
227
|
lSuccess = (lError == nil)
|
229
228
|
if (!lSuccess)
|
230
229
|
# Don't try further
|
@@ -267,20 +266,20 @@ module RUtilAnts
|
|
267
266
|
|
268
267
|
# Get the named plugin description
|
269
268
|
#
|
270
|
-
# Parameters
|
269
|
+
# Parameters::
|
271
270
|
# * *iCategory* (_Object_): Category those plugins will belong to
|
272
271
|
# * *iPluginName* (_String_): Plugin name
|
273
|
-
# Return
|
274
|
-
# * <em>map<Symbol,Object></em>: The corresponding description
|
275
|
-
def
|
272
|
+
# Return::
|
273
|
+
# * <em>map<Symbol,Object></em>: The corresponding description
|
274
|
+
def get_plugin_description(iCategory, iPluginName)
|
276
275
|
rDesc = nil
|
277
276
|
|
278
277
|
if (@Plugins[iCategory] == nil)
|
279
|
-
|
278
|
+
raise UnknownCategoryError.new("Unknown plugins category #{iCategory}.")
|
280
279
|
else
|
281
280
|
rDesc = @Plugins[iCategory][iPluginName]
|
282
281
|
if (rDesc == nil)
|
283
|
-
|
282
|
+
raise UnknownPluginError.new("Unknown plugin #{iPluginName} in category #{iCategory}.")
|
284
283
|
end
|
285
284
|
end
|
286
285
|
|
@@ -290,17 +289,17 @@ module RUtilAnts
|
|
290
289
|
# Give access to a plugin.
|
291
290
|
# An exception is thrown if the plugin does not exist.
|
292
291
|
#
|
293
|
-
# Parameters
|
292
|
+
# Parameters::
|
294
293
|
# * *iCategoryName* (_String_): Category of the plugin to access
|
295
294
|
# * *iPluginName* (_String_): Name of the plugin to access
|
296
295
|
# * *iParameters* (<em>map<Symbol,Object></em>): Additional parameters:
|
297
|
-
#
|
298
|
-
#
|
299
|
-
#
|
296
|
+
# * *OnlyIfExtDepsResolved* (_Boolean_): Do we return the plugin only if there is no need to install external dependencies ? [optional = false]
|
297
|
+
# * *RDIInstaller* (<em>RDI::Installer</em>): The RDI installer if available, or nil otherwise [optional = nil]
|
298
|
+
# * *RDIContextModifiers* (<em>map<String,list< [String,Object] >></em>): The map of context modifiers to be filled by the RDI installer if specified, or nil if ignored [optional = nil]
|
300
299
|
# * *CodeBlock*: The code called when the plugin is found:
|
301
|
-
#
|
302
|
-
def
|
303
|
-
lPlugin, lError =
|
300
|
+
# * *ioPlugin* (_Object_): The corresponding plugin
|
301
|
+
def access_plugin(iCategoryName, iPluginName, iParameters = {})
|
302
|
+
lPlugin, lError = get_plugin_instance(iCategoryName, iPluginName, iParameters)
|
304
303
|
if (lPlugin == nil)
|
305
304
|
raise lError
|
306
305
|
else
|
@@ -315,13 +314,13 @@ module RUtilAnts
|
|
315
314
|
|
316
315
|
# Get the list of plugin names of a given category
|
317
316
|
#
|
318
|
-
# Parameters
|
317
|
+
# Parameters::
|
319
318
|
# * *iCategoryName* (_String_): The category for which we want the plugin names list
|
320
319
|
# * *iParameters* (<em>map<Symbol,Object></em>): Additional parameters:
|
321
|
-
#
|
322
|
-
# Return
|
320
|
+
# * *IncludeDisabled* (_Boolean_): Do we include disabled plugins ? [optional = false]
|
321
|
+
# Return::
|
323
322
|
# * <em>list<String></em>: The list of plugin names in this category
|
324
|
-
def
|
323
|
+
def get_plugins_names(iCategoryName, iParameters = {})
|
325
324
|
rPlugins = []
|
326
325
|
|
327
326
|
lIncludeDisabled = iParameters[:IncludeDisabled]
|
@@ -342,13 +341,13 @@ module RUtilAnts
|
|
342
341
|
|
343
342
|
# Get the map of plugins descriptions, indexed with plugin names
|
344
343
|
#
|
345
|
-
# Parameters
|
344
|
+
# Parameters::
|
346
345
|
# * *iCategoryName* (_String_): The category for which we want the plugin names list
|
347
346
|
# * *iParameters* (<em>map<Symbol,Object></em>): Additional parameters:
|
348
|
-
#
|
349
|
-
# Return
|
347
|
+
# * *IncludeDisabled* (_Boolean_): Do we include disabled plugins ? [optional = false]
|
348
|
+
# Return::
|
350
349
|
# * <em>map<String,map<Symbol,Object>></em>: The map of plugin descriptions per plugin name
|
351
|
-
def
|
350
|
+
def get_plugins_descriptions(iCategoryName, iParameters = {})
|
352
351
|
rPlugins = {}
|
353
352
|
|
354
353
|
lIncludeDisabled = iParameters[:IncludeDisabled]
|
@@ -372,107 +371,23 @@ module RUtilAnts
|
|
372
371
|
|
373
372
|
end
|
374
373
|
|
375
|
-
#
|
376
|
-
|
377
|
-
$rUtilAnts_Plugins_Manager = PluginsManager.new
|
378
|
-
Object.module_eval('include RUtilAnts::Plugins')
|
379
|
-
end
|
380
|
-
|
381
|
-
# Register a new plugin
|
382
|
-
#
|
383
|
-
# Parameters:
|
384
|
-
# * *iCategoryName* (_String_): Category this plugin belongs to
|
385
|
-
# * *iPluginName* (_String_): Plugin name
|
386
|
-
# * *iFileName* (_String_): File name containing the plugin (can be nil)
|
387
|
-
# * *iDesc* (<em>map<Symbol,Object></em>): Plugin's description (can be nil)
|
388
|
-
# * *iClassName* (_String_): Name of the plugin class
|
389
|
-
# * *iInitCodeBlock* (_Proc_): Code block to call when initializing the real instance (can be nil)
|
390
|
-
def registerNewPlugin(iCategoryName, iPluginName, iFileName, iDesc, iClassName, iInitCodeBlock)
|
391
|
-
$rUtilAnts_Plugins_Manager.registerNewPlugin(iCategoryName, iPluginName, iFileName, iDesc, iClassName, iInitCodeBlock)
|
392
|
-
end
|
393
|
-
|
394
|
-
# Parse plugins from a given directory
|
395
|
-
#
|
396
|
-
# Parameters:
|
397
|
-
# * *iCategory* (_Object_): Category those plugins will belong to
|
398
|
-
# * *iDir* (_String_): Directory to parse for plugins
|
399
|
-
# * *iBaseClassNames* (_String_): The base class name of plugins to be instantiated
|
400
|
-
def parsePluginsFromDir(iCategory, iDir, iBaseClassNames)
|
401
|
-
$rUtilAnts_Plugins_Manager.parsePluginsFromDir(iCategory, iDir, iBaseClassNames)
|
402
|
-
end
|
403
|
-
|
404
|
-
# Get the named plugin instance
|
405
|
-
#
|
406
|
-
# Parameters:
|
407
|
-
# * *iCategory* (_Object_): Category those plugins will belong to
|
408
|
-
# * *iPluginName* (_String_): Plugin name
|
409
|
-
# * *iParameters* (<em>map<Symbol,Object></em>): Additional parameters:
|
410
|
-
# ** *OnlyIfExtDepsResolved* (_Boolean_): Do we return the plugin only if there is no need to install external dependencies ? [optional = false]
|
411
|
-
# ** *RDIInstaller* (<em>RDI::Installer</em>): The RDI installer if available, or nil otherwise [optional = nil]
|
412
|
-
# ** *RDIContextModifiers* (<em>map<String,list<[String,Object]>></em>): The map of context modifiers to be filled by the RDI installer if specified, or nil if ignored [optional = nil]
|
413
|
-
# Return:
|
414
|
-
# * _Object_: The corresponding plugin, or nil in case of failure
|
415
|
-
# * _Exception_: The error, or nil in case of success
|
416
|
-
def getPluginInstance(iCategory, iPluginName, iParameters = {})
|
417
|
-
return $rUtilAnts_Plugins_Manager.getPluginInstance(iCategory, iPluginName, iParameters)
|
418
|
-
end
|
374
|
+
# Main class storing info about plugins
|
375
|
+
class PluginsManager
|
419
376
|
|
420
|
-
|
421
|
-
#
|
422
|
-
# Parameters:
|
423
|
-
# * *iCategory* (_Object_): Category those plugins will belong to
|
424
|
-
# * *iPluginName* (_String_): Plugin name
|
425
|
-
# Return:
|
426
|
-
# * <em>map<Symbol,Object></em>: The corresponding description, or nil in case of failure
|
427
|
-
def getPluginDescription(iCategory, iPluginName)
|
428
|
-
return $rUtilAnts_Plugins_Manager.getPluginDescription(iCategory, iPluginName)
|
429
|
-
end
|
377
|
+
include PluginsInterface
|
430
378
|
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
# Parameters:
|
435
|
-
# * *iCategoryName* (_String_): Category of the plugin to access
|
436
|
-
# * *iPluginName* (_String_): Name of the plugin to access
|
437
|
-
# * *iParameters* (<em>map<Symbol,Object></em>): Additional parameters:
|
438
|
-
# ** *OnlyIfExtDepsResolved* (_Boolean_): Do we return the plugin only if there is no need to install external dependencies ? [optional = false]
|
439
|
-
# ** *RDIInstaller* (<em>RDI::Installer</em>): The RDI installer if available, or nil otherwise [optional = nil]
|
440
|
-
# ** *RDIContextModifiers* (<em>map<String,list<[String,Object]>></em>): The map of context modifiers to be filled by the RDI installer if specified, or nil if ignored [optional = nil]
|
441
|
-
# * *CodeBlock*: The code called when the plugin is found:
|
442
|
-
# ** *ioPlugin* (_Object_): The corresponding plugin
|
443
|
-
def accessPlugin(iCategoryName, iPluginName, iParameters = {})
|
444
|
-
$rUtilAnts_Plugins_Manager.accessPlugin(iCategoryName, iPluginName, iParameters) do |ioPlugin|
|
445
|
-
yield(ioPlugin)
|
379
|
+
# Constructor
|
380
|
+
def initialize
|
381
|
+
init_plugins
|
446
382
|
end
|
447
|
-
end
|
448
383
|
|
449
|
-
# Clear the registered plugins
|
450
|
-
def clearPlugins
|
451
|
-
$rUtilAnts_Plugins_Manager.clearPlugins
|
452
384
|
end
|
453
385
|
|
454
|
-
#
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
# ** *IncludeDisabled* (_Boolean_): Do we include disabled plugins ? [optional = false]
|
460
|
-
# Return:
|
461
|
-
# * <em>list<String></em>: The list of plugin names in this category
|
462
|
-
def getPluginNames(iCategoryName, iParameters = {})
|
463
|
-
return $rUtilAnts_Plugins_Manager.getPluginNames(iCategoryName, iParameters)
|
464
|
-
end
|
465
|
-
|
466
|
-
# Get the map of plugins descriptions, indexed with plugin names
|
467
|
-
#
|
468
|
-
# Parameters:
|
469
|
-
# * *iCategoryName* (_String_): The category for which we want the plugin names list
|
470
|
-
# * *iParameters* (<em>map<Symbol,Object></em>): Additional parameters:
|
471
|
-
# ** *IncludeDisabled* (_Boolean_): Do we include disabled plugins ? [optional = false]
|
472
|
-
# Return:
|
473
|
-
# * <em>map<String,map<Symbol,Object>></em>: The map of plugin descriptions per plugin name
|
474
|
-
def getPluginsDescriptions(iCategoryName, iParameters = {})
|
475
|
-
return $rUtilAnts_Plugins_Manager.getPluginsDescriptions(iCategoryName, iParameters)
|
386
|
+
# Initialize a plugins singleton
|
387
|
+
def self.install_plugins_on_object
|
388
|
+
require 'rUtilAnts/SingletonProxy'
|
389
|
+
RUtilAnts::make_singleton_proxy(RUtilAnts::Plugins::PluginsInterface, Object)
|
390
|
+
init_plugins
|
476
391
|
end
|
477
392
|
|
478
393
|
end
|