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
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
|