rUtilAnts 0.3.0.20110825 → 1.0.0.20120223
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.
- 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
data/lib/rUtilAnts/Misc.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
|
|
@@ -8,20 +8,20 @@ module RUtilAnts
|
|
8
8
|
module Misc
|
9
9
|
|
10
10
|
# Set these methods into the Object namespace
|
11
|
-
def self.
|
11
|
+
def self.install_misc_on_object
|
12
12
|
Object.module_eval('include RUtilAnts::Misc')
|
13
13
|
end
|
14
14
|
|
15
15
|
# Cache the access to a given code result, based on the caller ID
|
16
|
-
# This can be used to cache variables computation (ex. lVar =
|
16
|
+
# This can be used to cache variables computation (ex. lVar = cached_var{ lengthyFctToComputeVar } )
|
17
17
|
#
|
18
|
-
# Parameters
|
18
|
+
# Parameters::
|
19
19
|
# * *&iCode* (_CodeBlock_): The code called to compute the result
|
20
|
-
#
|
21
|
-
#
|
22
|
-
# Return
|
20
|
+
# * Return::
|
21
|
+
# * _Object_: The computed result
|
22
|
+
# Return::
|
23
23
|
# * _Object_: The result of the code
|
24
|
-
def
|
24
|
+
def cached_var(&iCode)
|
25
25
|
if (defined?(@RUtilAnts_Misc_CachedVars) == nil)
|
26
26
|
@RUtilAnts_Misc_CachedVars = {}
|
27
27
|
end
|
@@ -36,13 +36,13 @@ module RUtilAnts
|
|
36
36
|
|
37
37
|
# Get a valid file name, taking into account platform specifically prohibited characters in file names.
|
38
38
|
#
|
39
|
-
# Parameters
|
39
|
+
# Parameters::
|
40
40
|
# * *iFileName* (_String_): The original file name wanted
|
41
|
-
# Return
|
41
|
+
# Return::
|
42
42
|
# * _String_: The correct file name
|
43
|
-
def
|
44
|
-
if (
|
45
|
-
return iFileName.gsub(/[#{Regexp.escape(
|
43
|
+
def get_valid_file_name(iFileName)
|
44
|
+
if (defined?(getProhibitedFileNamesCharacters) != nil)
|
45
|
+
return iFileName.gsub(/[#{Regexp.escape(getProhibitedFileNamesCharacters)}]/, '_')
|
46
46
|
else
|
47
47
|
return iFileName
|
48
48
|
end
|
@@ -50,24 +50,24 @@ module RUtilAnts
|
|
50
50
|
|
51
51
|
# Extract a Zip archive in a given system dependent lib sub-directory
|
52
52
|
#
|
53
|
-
# Parameters
|
53
|
+
# Parameters::
|
54
54
|
# * *iZipFileName* (_String_): The zip file name to extract content from
|
55
55
|
# * *iDirName* (_String_): The name of the directory to store the zip to
|
56
|
-
# Return
|
56
|
+
# Return::
|
57
57
|
# * _Exception_: Error, or nil in case of success
|
58
|
-
def
|
58
|
+
def extract_zip_file(iZipFileName, iDirName)
|
59
59
|
rError = nil
|
60
60
|
|
61
61
|
# Use RDI if possible to ensure the dependencies on zlib.dll and rubyzip
|
62
62
|
if (defined?(RDI) != nil)
|
63
|
-
lRDIInstaller = RDI::Installer.
|
63
|
+
lRDIInstaller = RDI::Installer.get_main_instance
|
64
64
|
if (lRDIInstaller != nil)
|
65
65
|
# First, test that the DLL exists.
|
66
66
|
# If it does not exist, we can't install it, because ZLib.dll is downloadable only in ZIP format (kind of stupid ;-) )
|
67
67
|
lDLLDep = nil
|
68
|
-
case
|
68
|
+
case os
|
69
69
|
when OS_WINDOWS
|
70
|
-
lDLLDep = RDI::Model::DependencyDescription.new('ZLib DLL').
|
70
|
+
lDLLDep = RDI::Model::DependencyDescription.new('ZLib DLL').add_description( {
|
71
71
|
:Testers => [
|
72
72
|
{
|
73
73
|
:Type => 'DynamicLibraries',
|
@@ -78,21 +78,21 @@ module RUtilAnts
|
|
78
78
|
:Installers => []
|
79
79
|
} )
|
80
80
|
else
|
81
|
-
|
81
|
+
log_bug "Sorry, installing ZLib on your platform #{os} is not yet supported."
|
82
82
|
end
|
83
83
|
if ((lDLLDep != nil) and
|
84
|
-
(!lRDIInstaller.
|
84
|
+
(!lRDIInstaller.test_dependency(lDLLDep)))
|
85
85
|
# Try adding the default local location for libraries
|
86
|
-
lRDIInstaller.
|
86
|
+
lRDIInstaller.ensure_location_in_context('LibraryPath', lRDIInstaller.get_default_install_location('Download', RDI::DEST_LOCAL))
|
87
87
|
# Try again
|
88
|
-
if (!lRDIInstaller.
|
89
|
-
|
88
|
+
if (!lRDIInstaller.test_dependency(lDLLDep))
|
89
|
+
log_err "zlib.dll is not installed in your system.\nUnfortunately RDI can't help because the only way to install it is to download it through a ZIP file.\nPlease install it manually from http://zlib.net (you can do it now and click OK once it is installed)."
|
90
90
|
end
|
91
91
|
end
|
92
92
|
# Then, ensure the gem dependency
|
93
|
-
rError, lCMApplied, lIgnored, lUnresolved = lRDIInstaller.
|
93
|
+
rError, lCMApplied, lIgnored, lUnresolved = lRDIInstaller.ensure_dependencies(
|
94
94
|
[
|
95
|
-
RDI::Model::DependencyDescription.new('RubyZip').
|
95
|
+
RDI::Model::DependencyDescription.new('RubyZip').add_description( {
|
96
96
|
:Testers => [
|
97
97
|
{
|
98
98
|
:Type => 'RubyRequires',
|
@@ -152,10 +152,10 @@ module RUtilAnts
|
|
152
152
|
# Execute a code block after having changed current directory.
|
153
153
|
# Ensure the directory will be changed back at the end of the block, even if exceptions are thrown.
|
154
154
|
#
|
155
|
-
# Parameters
|
155
|
+
# Parameters::
|
156
156
|
# * *iDir* (_String_): The directory to change into
|
157
157
|
# * *CodeBlock*: Code called once the current directory has been changed
|
158
|
-
def
|
158
|
+
def change_dir(iDir)
|
159
159
|
lOldDir = Dir.getwd
|
160
160
|
Dir.chdir(iDir)
|
161
161
|
begin
|
@@ -167,7 +167,7 @@ module RUtilAnts
|
|
167
167
|
Dir.chdir(lOldDir)
|
168
168
|
end
|
169
169
|
|
170
|
-
# Constants used for
|
170
|
+
# Constants used for file_mutex
|
171
171
|
# There was no lock on the mutex
|
172
172
|
FILEMUTEX_NO_LOCK = 0
|
173
173
|
# There was a lock on the mutex, but former process did not exist anymore
|
@@ -178,36 +178,36 @@ module RUtilAnts
|
|
178
178
|
FILEMUTEX_INVALID_LOCK = 3
|
179
179
|
# Execute a code block protected by a file mutex
|
180
180
|
#
|
181
|
-
# Parameters
|
181
|
+
# Parameters::
|
182
182
|
# * *iProcessID* (_String_): Process ID to be used to identify the mutex
|
183
183
|
# * *CodeBlock*: The code called if the mutex is taken
|
184
|
-
# Return
|
184
|
+
# Return::
|
185
185
|
# * _Integer_: Error code
|
186
|
-
def
|
186
|
+
def file_mutex(iProcessID)
|
187
187
|
rResult = FILEMUTEX_NO_LOCK
|
188
188
|
|
189
189
|
# Prevent concurrent execution
|
190
190
|
require 'tmpdir'
|
191
191
|
lLockFile = "#{Dir.tmpdir}/FileMutex_#{iProcessID}.lock"
|
192
192
|
if (File.exists?(lLockFile))
|
193
|
-
|
193
|
+
log_err "Another instance of process #{iProcessID} is already running. Delete file #{lLockFile} if it is not."
|
194
194
|
begin
|
195
195
|
lDetails = nil
|
196
196
|
File.open(lLockFile, 'r') do |iFile|
|
197
197
|
lDetails = eval(iFile.read)
|
198
198
|
end
|
199
|
-
|
199
|
+
log_err "Details of the running instance: #{lDetails.inspect}"
|
200
200
|
# If the process does not exist anymore, remove the lock file
|
201
201
|
# TODO: Adapt this to non Unix systems
|
202
202
|
if (File.exists?("/proc/#{lDetails[:PID]}"))
|
203
203
|
rResult = FILEMUTEX_LOCK_TAKEN
|
204
204
|
else
|
205
|
-
|
205
|
+
log_err "Process #{lDetails[:PID]} does not exist anymore. Removing lock file."
|
206
206
|
File.unlink(lLockFile)
|
207
207
|
rResult = FILEMUTEX_ZOMBIE_LOCK
|
208
208
|
end
|
209
209
|
rescue Exception
|
210
|
-
|
210
|
+
log_err "Invalid lock file #{lLockFile}: #{$!}."
|
211
211
|
rResult = FILEMUTEX_INVALID_LOCK
|
212
212
|
end
|
213
213
|
end
|
@@ -229,7 +229,7 @@ module RUtilAnts
|
|
229
229
|
begin
|
230
230
|
File.unlink(lLockFile)
|
231
231
|
rescue Exception
|
232
|
-
|
232
|
+
log_err "Exception while deleting lock file #{lLockFile}: #{$!}"
|
233
233
|
end
|
234
234
|
raise
|
235
235
|
end
|
@@ -238,6 +238,39 @@ module RUtilAnts
|
|
238
238
|
return rResult
|
239
239
|
end
|
240
240
|
|
241
|
+
# Replace variables of the form %{VariableName} from a string.
|
242
|
+
# Take values from a hash having :VariableName => 'VariableValue'.
|
243
|
+
# Works also recursively if a variable value contains again %{OtherVariableName}.
|
244
|
+
# Does not check if variables really exist (will replace any unknown variable with '').
|
245
|
+
#
|
246
|
+
# Parameters::
|
247
|
+
# * *iStr* (_String_): The string to replace from
|
248
|
+
# * *iVars* (<em>map<Symbol,String></em>): The variables
|
249
|
+
# Return::
|
250
|
+
# * _String_: The string replaced
|
251
|
+
def replace_vars(iStr, iVars)
|
252
|
+
rStr = iStr
|
253
|
+
|
254
|
+
lFinished = false
|
255
|
+
while (!lFinished)
|
256
|
+
lMatch = rStr.match(/^(.*[^%])%\{([^\}]+)\}(.*)$/)
|
257
|
+
if (lMatch == nil)
|
258
|
+
# Try with %{ at the beginning of the string
|
259
|
+
lMatch = rStr.match(/^%\{([^\}]+)\}(.*)$/)
|
260
|
+
if (lMatch == nil)
|
261
|
+
# No more occurrences
|
262
|
+
lFinished = true
|
263
|
+
else
|
264
|
+
rStr = "#{iVars[lMatch[1].to_sym]}#{lMatch[2]}"
|
265
|
+
end
|
266
|
+
else
|
267
|
+
rStr = "#{lMatch[1]}#{iVars[lMatch[2].to_sym]}#{lMatch[3]}"
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
return rStr
|
272
|
+
end
|
273
|
+
|
241
274
|
end
|
242
275
|
|
243
276
|
end
|
data/lib/rUtilAnts/MySQLPool.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2011 Muriel Salvan (
|
2
|
+
# Copyright (c) 2011 - 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
|
|
@@ -17,7 +17,7 @@ module RUtilAnts
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# Set these methods into the Object namespace
|
20
|
-
def self.
|
20
|
+
def self.install_mysql_pool_on_object
|
21
21
|
Object.module_eval('include RUtilAnts::MySQLPool')
|
22
22
|
end
|
23
23
|
|
@@ -26,15 +26,15 @@ module RUtilAnts
|
|
26
26
|
# Reuse existing connections.
|
27
27
|
# If the given password is nil, we force the reuse of an existing connection.
|
28
28
|
#
|
29
|
-
# Parameters
|
29
|
+
# Parameters::
|
30
30
|
# * *iHost* (_String_): The host to connect to
|
31
31
|
# * *iDBName* (_String_): The MySQL database name to connect to
|
32
32
|
# * *iUser* (_String_): The user
|
33
33
|
# * *iPassword* (_String_): The password. If nil, this will only try to reuse an existing connection [optional = nil]
|
34
|
-
# Return
|
34
|
+
# Return::
|
35
35
|
# * _Exception_: An error, or nil in case of success
|
36
36
|
# * _MySQL_: The MySQL connection, or nil in case of failure
|
37
|
-
def
|
37
|
+
def connect_to_mysql(iHost, iDBName, iUser, iPassword = nil)
|
38
38
|
rError = nil
|
39
39
|
rMySQL = nil
|
40
40
|
|
@@ -59,7 +59,7 @@ module RUtilAnts
|
|
59
59
|
# lMySQL.options(Mysql::OPT_WRITE_TIMEOUT, 28800)
|
60
60
|
# lMySQL.real_connect(iHost, iUser, iPassword, iDBName)
|
61
61
|
rescue Exception
|
62
|
-
|
62
|
+
log_err "Error while creating MySQL connection to #{lDBKey.inspect}: #{$!}.\n#{$!.backtrace.join("\n")}"
|
63
63
|
rError = $!
|
64
64
|
lMySQL = nil
|
65
65
|
end
|
@@ -80,11 +80,11 @@ module RUtilAnts
|
|
80
80
|
return rError, rMySQL
|
81
81
|
end
|
82
82
|
|
83
|
-
# Close a MySQL connection created with
|
83
|
+
# Close a MySQL connection created with connect_to_mysql
|
84
84
|
#
|
85
|
-
# Parameters
|
85
|
+
# Parameters::
|
86
86
|
# * *iMySQLConnection* (_MySQL_): The MySQL connection to close
|
87
|
-
def
|
87
|
+
def close_mysql(iMySQLConnection)
|
88
88
|
# Find the connection
|
89
89
|
if (defined?($RUtilAnts_MySQLPool_Pool) == nil)
|
90
90
|
$RUtilAnts_MySQLPool_Pool = {}
|
@@ -100,24 +100,24 @@ module RUtilAnts
|
|
100
100
|
|
101
101
|
# Setup a MySQL connection, and ensure it is closed once the client code ends.
|
102
102
|
#
|
103
|
-
# Parameters
|
103
|
+
# Parameters::
|
104
104
|
# * *iHost* (_String_): The host to connect to
|
105
105
|
# * *iDBName* (_String_): The MySQL database name to connect to
|
106
106
|
# * *iUser* (_String_): The user
|
107
107
|
# * *iPassword* (_String_): The password. If nil, this will only try to reuse an existing connection [optional = nil]
|
108
108
|
# * *CodeBlock*: The code executed with the MySQL connection
|
109
|
-
#
|
110
|
-
# Return
|
109
|
+
# * *iMySQL* (_MySQL_): The MySQL connection
|
110
|
+
# Return::
|
111
111
|
# * _Exception_: An error, or nil in case of success
|
112
|
-
def
|
112
|
+
def setup_mysql_connection(iHost, iDBName, iUser, iPassword = nil)
|
113
113
|
rError = nil
|
114
114
|
|
115
|
-
rError, lMySQL =
|
115
|
+
rError, lMySQL = connect_to_mysql(iHost, iDBName, iUser, iPassword)
|
116
116
|
if (rError == nil)
|
117
117
|
begin
|
118
118
|
yield(lMySQL)
|
119
119
|
ensure
|
120
|
-
|
120
|
+
close_mysql(lMySQL)
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
@@ -127,16 +127,16 @@ module RUtilAnts
|
|
127
127
|
# Get a prepared statement for a given SQL string of a given MySQL connection.
|
128
128
|
# Use the cache of prepared statements.
|
129
129
|
#
|
130
|
-
# Parameters
|
130
|
+
# Parameters::
|
131
131
|
# * *iMySQLConnection* (_MySQL_): The MySQL connection
|
132
132
|
# * *iStrSQL* (_String_): The SQL statement to prepare
|
133
133
|
# * *iAdditionalOptions* (<em>map<Symbol,Object></em>): Additional options [optional = {}]
|
134
|
-
#
|
135
|
-
# Return
|
134
|
+
# * *:leave_open* (_Boolean_): Do we NOT close the opened statement once it is not used anymore ? [optional = false]
|
135
|
+
# Return::
|
136
136
|
# * <em>MySQL::Statement</em>: The MySQL statement
|
137
|
-
def
|
137
|
+
def get_prepared_statement(iMySQLConnection, iStrSQL, iAdditionalOptions = {})
|
138
138
|
# Parse options
|
139
|
-
lLeaveOpen = iAdditionalOptions[:
|
139
|
+
lLeaveOpen = iAdditionalOptions[:leave_open] || false
|
140
140
|
# Find the prepared statements set
|
141
141
|
lPreparedStatements = $RUtilAnts_MySQLPool_Pool[findMySQLConnectionKey(iMySQLConnection)][2]
|
142
142
|
if (lPreparedStatements[iStrSQL] == nil)
|
@@ -157,12 +157,12 @@ module RUtilAnts
|
|
157
157
|
return lPreparedStatements[iStrSQL][0]
|
158
158
|
end
|
159
159
|
|
160
|
-
# Close a previously created prepared statement using
|
160
|
+
# Close a previously created prepared statement using get_prepared_statement.
|
161
161
|
#
|
162
|
-
# Parameters
|
162
|
+
# Parameters::
|
163
163
|
# * *iMySQLConnection* (_MySQL_): The MySQL connection
|
164
164
|
# * *iPreparedStatement* (<em>MySQL::Statement</em>): The MySQL prepared statement
|
165
|
-
def
|
165
|
+
def close_prepared_statement(iMySQLConnection, iPreparedStatement)
|
166
166
|
lPreparedStatements = $RUtilAnts_MySQLPool_Pool[findMySQLConnectionKey(iMySQLConnection)][2]
|
167
167
|
lFound = false
|
168
168
|
lPreparedStatements.each do |iStrSQL, ioPreparedStatementInfo|
|
@@ -186,19 +186,19 @@ module RUtilAnts
|
|
186
186
|
|
187
187
|
# Setup a prepared statement, and ensure it will be closed
|
188
188
|
#
|
189
|
-
# Parameters
|
189
|
+
# Parameters::
|
190
190
|
# * *iMySQLConnection* (_MySQL_): The MySQL connection
|
191
191
|
# * *iStrSQL* (_String_): The SQL statement to prepare
|
192
192
|
# * *iAdditionalOptions* (<em>map<Symbol,Object></em>): Additional options [optional = {}]
|
193
|
-
#
|
193
|
+
# * *:leave_open* (_Boolean_): Do we NOT close the opened statement once it is not used anymore ? [optional = false]
|
194
194
|
# * *CodeBlock*: The code executed once the statement is prepared
|
195
|
-
#
|
196
|
-
def
|
197
|
-
lStatement =
|
195
|
+
# * *iPreparedStatement* (<em>MySQL::Statement</em>): The prepared statement
|
196
|
+
def setup_prepared_statement(iMySQLConnection, iStrSQL, iAdditionalOptions = {})
|
197
|
+
lStatement = get_prepared_statement(iMySQLConnection, iStrSQL, iAdditionalOptions)
|
198
198
|
begin
|
199
199
|
yield(lStatement)
|
200
200
|
ensure
|
201
|
-
|
201
|
+
close_prepared_statement(iMySQLConnection, lStatement)
|
202
202
|
end
|
203
203
|
end
|
204
204
|
|
@@ -206,9 +206,9 @@ module RUtilAnts
|
|
206
206
|
|
207
207
|
# Find the MySQL connection key
|
208
208
|
#
|
209
|
-
# Parameters
|
209
|
+
# Parameters::
|
210
210
|
# * *iMySQLConnection* (_MySQL_): The MySQL connection
|
211
|
-
# Return
|
211
|
+
# Return::
|
212
212
|
# * _String_: Host name, or nil if none
|
213
213
|
# * _String_: DB name
|
214
214
|
# * _String_: User name
|
data/lib/rUtilAnts/Platform.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
|
|
@@ -7,27 +7,44 @@ module RUtilAnts
|
|
7
7
|
|
8
8
|
module Platform
|
9
9
|
|
10
|
+
module PlatformInterface
|
11
|
+
|
12
|
+
# Initialize the module
|
13
|
+
def self.includePlatformSpecificModule
|
14
|
+
# Require the platform info
|
15
|
+
begin
|
16
|
+
require "rUtilAnts/Platforms/#{RUBY_PLATFORM}/PlatformInfo"
|
17
|
+
rescue Exception
|
18
|
+
if (!defined?(log_bug))
|
19
|
+
require 'rUtilAnts/Logging'
|
20
|
+
RUtilAnts::Logging::install_logger_on_object
|
21
|
+
end
|
22
|
+
log_bug "Current platform #{RUBY_PLATFORM} is not supported (#{$!})."
|
23
|
+
raise RuntimeError, "Current platform #{RUBY_PLATFORM} is not supported (#{$!})."
|
24
|
+
end
|
25
|
+
# Include the platform specific module
|
26
|
+
PlatformInterface.module_eval('include RUtilAnts::Platform::PlatformInfo')
|
27
|
+
end
|
28
|
+
|
29
|
+
includePlatformSpecificModule
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
class Manager
|
34
|
+
|
35
|
+
include PlatformInterface
|
36
|
+
|
37
|
+
end
|
38
|
+
|
10
39
|
# OS constants
|
11
40
|
OS_WINDOWS = 0
|
12
41
|
OS_LINUX = 1
|
13
42
|
OS_CYGWIN = 2
|
14
43
|
|
15
44
|
# Initialize the platform info
|
16
|
-
def self.
|
17
|
-
|
18
|
-
|
19
|
-
require "rUtilAnts/Platforms/#{RUBY_PLATFORM}/PlatformInfo"
|
20
|
-
rescue Exception
|
21
|
-
if (!defined?(logBug))
|
22
|
-
require 'rUtilAnts/Logging'
|
23
|
-
RUtilAnts::Logging::initializeLogging(File.expand_path(File.dirname(__FILE__)), '')
|
24
|
-
end
|
25
|
-
logBug "Current platform #{RUBY_PLATFORM} is not supported (#{$!})."
|
26
|
-
raise RuntimeError, "Current platform #{RUBY_PLATFORM} is not supported (#{$!})."
|
27
|
-
end
|
28
|
-
# Create the corresponding object
|
29
|
-
$rUtilAnts_Platform_Info = PlatformInfo.new
|
30
|
-
Object.module_eval('include RUtilAnts::Platform')
|
45
|
+
def self.install_platform_on_object
|
46
|
+
require 'rUtilAnts/SingletonProxy'
|
47
|
+
RUtilAnts::make_singleton_proxy(RUtilAnts::Platform::PlatformInterface, Object)
|
31
48
|
end
|
32
49
|
|
33
50
|
end
|