rUtilAnts 0.1.1.20091105 → 0.2.0.20101109

Sign up to get free protection for your applications and to get access to all the features.
data/ReleaseInfo CHANGED
@@ -2,7 +2,7 @@
2
2
  # This file has been generated by RubyPackager during a delivery.
3
3
  # More info about RubyPackager: http://rubypackager.sourceforge.net
4
4
  {
5
- :Version => '0.1.1.20091105',
5
+ :Version => '0.2.0.20101109',
6
6
  :Tags => [],
7
7
  :DevStatus => 'Alpha'
8
8
  }
@@ -0,0 +1,205 @@
1
+ #--
2
+ # Copyright (c) 2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
+ # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
+ #++
5
+
6
+ module RUtilAnts
7
+
8
+ # This module defines a method to run a given Ruby's object and parameters in a separate process.
9
+ # This can be useful when $LD_LIBRARY_PATH has to be changed before continuing.
10
+ module ForeignProcess
11
+
12
+ # Class containing info for serialized method calls
13
+ class MethodCallInfo
14
+
15
+ # Log file
16
+ # String
17
+ attr_accessor :LogFile
18
+
19
+ # Lib root dir
20
+ # String
21
+ attr_accessor :LibRootDir
22
+
23
+ # Bug tracker URL
24
+ # String
25
+ attr_accessor :BugTrackerURL
26
+
27
+ # Load path
28
+ # list<String>
29
+ attr_accessor :LoadPath
30
+
31
+ # List of files to require
32
+ # list<String>
33
+ attr_accessor :RequireFiles
34
+
35
+ # Serialized MethodDetails
36
+ # It is stored serialized as to unserialize it we first need to unserialize the RequireFiles
37
+ # String
38
+ attr_accessor :SerializedMethodDetails
39
+
40
+ class MethodDetails
41
+
42
+ # Object to call the function on
43
+ # Object
44
+ attr_accessor :Object
45
+
46
+ # Method to call
47
+ # Symbol
48
+ attr_accessor :Method
49
+
50
+ # Parameters
51
+ # list<Object>
52
+ attr_accessor :Parameters
53
+
54
+ end
55
+
56
+ end
57
+
58
+ # Execute a command in another Ruby session, executing some Shell commands before invocation.
59
+ #
60
+ # Parameters:
61
+ # * *iShellCmd* (_String_): Shell command to invoke before Ruby
62
+ # * *iObject* (_Object_): Object that will have a function to call in the new session
63
+ # * *iMethod* (_Symbol_): Method to call on the object
64
+ # * *Parameters* (<em>list<Object></em>): Remaining parameters
65
+ # Return:
66
+ # * _Exception_: An error, or nil if success
67
+ # * _Object_: The result of the function call (valid only if no error returned)
68
+ def self.execCmdOtherSession(iShellCmd, iObject, iMethod, iParameters)
69
+ rError = nil
70
+ rResult = nil
71
+
72
+ # Protect it from exceptions, to ensure that a valid error message will be returned
73
+ begin
74
+ logDebug "Execute method #{iMethod}(#{iParameters.join(', ')}) in a new process with shell command: #{iShellCmd} ..."
75
+
76
+ # Create an object that we will serialize, containing all needed information for the session
77
+ lInfo = MethodCallInfo.new
78
+ lInfo.LogFile = getLogFile
79
+ lInfo.LibRootDir = getLibRootDir
80
+ lInfo.BugTrackerURL = getBugTrackerURL
81
+ lInfo.RequireFiles = []
82
+ # Do not store ForeignProcess require
83
+ $".each do |iRequireName|
84
+ if (iRequireName.match(/ForeignProcess/) == nil)
85
+ lInfo.RequireFiles << iRequireName
86
+ end
87
+ end
88
+ lInfo.LoadPath = $LOAD_PATH.clone
89
+ lMethodDetails = MethodCallInfo::MethodDetails.new
90
+ lMethodDetails.Parameters = iParameters
91
+ lMethodDetails.Method = iMethod
92
+ lMethodDetails.Object = iObject
93
+ logDebug "Method to be marshalled: #{lMethodDetails.inspect}"
94
+ lInfo.SerializedMethodDetails = Marshal.dump(lMethodDetails)
95
+ lCurrentThread = Thread.current
96
+ # Dump this object in a temporary file
97
+ require 'tmpdir'
98
+ lInfoFileName = "#{Dir.tmpdir}/RubyExec_#{lCurrentThread.object_id}_Info"
99
+ File.open(lInfoFileName, 'w') do |oFile|
100
+ oFile.write(Marshal.dump(lInfo))
101
+ end
102
+ # For security reasons, ensure that only us can read this file. It can contain passwords.
103
+ require 'fileutils'
104
+ FileUtils.chmod(0700, lInfoFileName)
105
+ # Generate the Ruby file that will run everything
106
+ lExecFileName = "#{Dir.tmpdir}/RubyExec_#{lCurrentThread.object_id}_Exec.rb"
107
+ File.open(lExecFileName, 'w') do |oFile|
108
+ oFile << "
109
+ \# This is a generated file that should not stay persistent. You can delete it.
110
+ \# It has been generated by rUtilAnts::ForeignProcess module. Check http://rutilants.sourceforge.net for further details.
111
+ require '#{File.expand_path(__FILE__)}'
112
+ RUtilAnts::ForeignProcess::executeEmbeddedFunction(ARGV[0], ARGV[1])
113
+ "
114
+ end
115
+ # For security reasons, ensure that only us can read and execute this file.
116
+ FileUtils.chmod(0700, lExecFileName)
117
+ # Name the file that will receive the result of the function call
118
+ lResultFileName = "#{Dir.tmpdir}/RubyExec_#{lCurrentThread.object_id}_Result"
119
+
120
+ # Call this Ruby file by first executing the Shell command
121
+ lCmd = "#{iShellCmd}; ruby -w #{lExecFileName} #{lInfoFileName} #{lResultFileName} 2>&1"
122
+ lOutput = `#{lCmd}`
123
+ lErrorCode = $?
124
+ if (lErrorCode == 0)
125
+ # Read the result file
126
+ File.open(lResultFileName, 'r') do |iFile|
127
+ rResult = Marshal.load(iFile.read)
128
+ end
129
+ else
130
+ rError = RuntimeError.new("Error while running command \"#{lCmd}\". Here is the output:\n#{lOutput}.")
131
+ end
132
+
133
+ # Remove files
134
+ File.unlink(lInfoFileName)
135
+ File.unlink(lExecFileName)
136
+ if (File.exists?(lResultFileName))
137
+ File.unlink(lResultFileName)
138
+ end
139
+ rescue Exception
140
+ rError = $!
141
+ end
142
+
143
+ logDebug "Method executed with error #{rError} and result #{rResult}."
144
+
145
+ return rError, rResult
146
+ end
147
+
148
+ # Execute a function along with its parameters stored in a file.
149
+ # This method is used by the file generated by execCmdOtherSession.
150
+ # It should not be called directly.
151
+ #
152
+ # Parameters:
153
+ # * *iInfoFileName* (_String_): The file containing info
154
+ # * *iResultFileName* (_String_): The file used to store the result serialized
155
+ def self.executeEmbeddedFunction(iInfoFileName, iResultFileName)
156
+ begin
157
+ # Read the file
158
+ lInfo = nil
159
+ File.open(iInfoFileName, 'r') do |iFile|
160
+ lInfo = Marshal.load(iFile.read)
161
+ end
162
+ # Set the load path
163
+ lInfo.LoadPath.each do |iDir|
164
+ if (!$LOAD_PATH.include?(iDir))
165
+ $LOAD_PATH << iDir
166
+ end
167
+ end
168
+ # Require all given files
169
+ lInfo.RequireFiles.each do |iRequireName|
170
+ require iRequireName
171
+ end
172
+ # Initialize logging
173
+ RUtilAnts::Logging::initializeLogging(lInfo.LibRootDir, lInfo.BugTrackerURL)
174
+ setLogFile(lInfo.LogFile)
175
+ logDebug "New process spawned with requires: #{lInfo.RequireFiles.join(', ')}."
176
+ # Unserialize the method details
177
+ lMethodDetails = Marshal.load(lInfo.SerializedMethodDetails)
178
+ # Call the method on the object with all its parameters
179
+ logDebug "Calling method #{lMethodDetails.Method}(#{lMethodDetails.Parameters.join(', ')}) ..."
180
+ lResult = lMethodDetails.Object.send(lMethodDetails.Method, *lMethodDetails.Parameters)
181
+ logDebug "Method returned #{lResult}."
182
+ rescue Exception
183
+ lResult = RuntimeError.new("Error occurred while executing foreign call: #{$!}. Backtrace: #{$!.backtrace.join("\n")}")
184
+ end
185
+ begin
186
+ # Store the result in the file for return
187
+ File.open(iResultFileName, 'w') do |oFile|
188
+ oFile.write(Marshal.dump(lResult))
189
+ end
190
+ # For security reasons, ensure that only us can read this file. It can contain passwords.
191
+ require 'fileutils'
192
+ FileUtils.chmod(0700, iResultFileName)
193
+ rescue Exception
194
+ logErr "Error while writing result in to #{iResultFileName}: #{$!}."
195
+ end
196
+ end
197
+
198
+ # Initialize the ForeignProcess methods in the Object namespace
199
+ def self.initializeForeignProcess
200
+ Object.module_eval('include RUtilAnts::ForeignProcess')
201
+ end
202
+
203
+ end
204
+
205
+ end
data/lib/rUtilAnts/GUI.rb CHANGED
@@ -377,7 +377,7 @@ module RUtilAnts
377
377
 
378
378
  end
379
379
 
380
- # Initialize the GUI methods in the Kernel namespace
380
+ # Initialize the GUI methods in the Object namespace
381
381
  def self.initializeGUI
382
382
  Object.module_eval('include RUtilAnts::GUI')
383
383
  end
@@ -65,6 +65,22 @@ module RUtilAnts
65
65
  end
66
66
  end
67
67
 
68
+ # Mute or unmute standard output
69
+ #
70
+ # Parameters:
71
+ # * *iMute* (_Boolean_): Do we mute standard output ? [optional = true]
72
+ def muteStdOut(iMute = true)
73
+ @ScreenOutput = (!iMute)
74
+ end
75
+
76
+ # Mute or unmute error output
77
+ #
78
+ # Parameters:
79
+ # * *iMute* (_Boolean_): Do we mute error output ? [optional = true]
80
+ def muteStdErr(iMute = true)
81
+ @ScreenOutputErr = (!iMute)
82
+ end
83
+
68
84
  # Set the log file to use (can be nil to stop logging into a file)
69
85
  #
70
86
  # Parameters:
@@ -73,6 +89,30 @@ module RUtilAnts
73
89
  @LogFile = iFileName
74
90
  end
75
91
 
92
+ # Get the log file used (can be nil)
93
+ #
94
+ # Return:
95
+ # * _String_: Log file name (can be nil)
96
+ def getLogFile
97
+ return @LogFile
98
+ end
99
+
100
+ # Get the library root dir
101
+ #
102
+ # Return:
103
+ # * _String_: The library root dir, as defined when initialized
104
+ def getLibRootDir
105
+ return @LibRootDir
106
+ end
107
+
108
+ # Get the bug tracker URL
109
+ #
110
+ # Return:
111
+ # * _String_: The bug tracker URL, as defined when initialized
112
+ def getBugTrackerURL
113
+ return @BugTrackerURL
114
+ end
115
+
76
116
  # Indicate which GUI to be used to display dialogs.
77
117
  #
78
118
  # Parameters:
@@ -86,14 +126,24 @@ module RUtilAnts
86
126
  # Parameters:
87
127
  # * *iDebugMode* (_Boolean_): Are we in debug mode ?
88
128
  def activateLogDebug(iDebugMode)
89
- @DebugMode = iDebugMode
90
- if (iDebugMode)
91
- logInfo 'Activated log debug'
92
- else
93
- logInfo 'Deactivated log debug'
129
+ if (@DebugMode != iDebugMode)
130
+ @DebugMode = iDebugMode
131
+ if (iDebugMode)
132
+ logInfo 'Activated log debug'
133
+ else
134
+ logInfo 'Deactivated log debug'
135
+ end
94
136
  end
95
137
  end
96
138
 
139
+ # Is debug mode activated ?
140
+ #
141
+ # Return:
142
+ # * _Boolean_: Are we in debug mode ?
143
+ def debugActivated?
144
+ return @DebugMode
145
+ end
146
+
97
147
  # Set the stack of the errors to fill.
98
148
  # If set to nil, errors will be displayed as they appear.
99
149
  # If set to a stack, errors will silently be added to the list.
@@ -147,7 +197,7 @@ Stack:
147
197
  # Display Bug dialog
148
198
  if (showModalWxAvailable?)
149
199
  # We require the file here, as we hope it will not be required often
150
- require 'RUtilAnts/GUI/BugReportDialog'
200
+ require 'rUtilAnts/GUI/BugReportDialog'
151
201
  showModal(GUI::BugReportDialog, nil, lCompleteMsg, @BugTrackerURL) do |iModalResult, iDialog|
152
202
  # Nothing to do
153
203
  end
@@ -175,12 +225,13 @@ Details:
175
225
  # Parameters:
176
226
  # * *iMsg* (_String_): Message to log
177
227
  def logErr(iMsg)
228
+ lMsg = "!!! ERR !!! #{iMsg}"
178
229
  # Log into stderr
179
230
  if (@ScreenOutputErr)
180
- $stderr << "!!! ERR !!! #{iMsg}\n"
231
+ $stderr << "#{lMsg}\n"
181
232
  end
182
233
  if (@LogFile != nil)
183
- logFile(iMsg)
234
+ logFile(lMsg)
184
235
  end
185
236
  # Display dialog only if we are not redirecting messages to a stack
186
237
  if (@ErrorsStack == nil)
@@ -249,6 +300,22 @@ Details:
249
300
  end
250
301
  end
251
302
 
303
+ # Log a warning.
304
+ # Warnings are not errors but still should be highlighted.
305
+ #
306
+ # Parameters:
307
+ # * *iMsg* (_String_): Message to log
308
+ def logWarn(iMsg)
309
+ # Log into stdout
310
+ lMsg = "!!! WARNING !!! - #{iMsg}"
311
+ if (@ScreenOutput)
312
+ $stdout << "#{lMsg}\n"
313
+ end
314
+ if (@LogFile != nil)
315
+ logFile(lMsg)
316
+ end
317
+ end
318
+
252
319
  # Log a debugging info.
253
320
  # This is used when debug is activated
254
321
  #
@@ -292,36 +359,38 @@ Details:
292
359
  # Remove @LibRootDir paths from it.
293
360
  #
294
361
  # Parameters:
295
- # * *iCaller* (<em>list<String></em>): The caller
362
+ # * *iCaller* (<em>list<String></em>): The caller, or nil if no caller
296
363
  # * *iReferenceCaller* (<em>list<String></em>): The reference caller: we will not display lines from iCaller that also belong to iReferenceCaller [optional = nil]
297
364
  # Return:
298
365
  # * <em>list<String></em>): The simple stack
299
366
  def getSimpleCaller(iCaller, iReferenceCaller = nil)
300
367
  rSimpleCaller = []
301
368
 
302
- lCaller = nil
303
- # If there is a reference caller, remove the lines from lCaller that are also in iReferenceCaller
304
- if (iReferenceCaller == nil)
305
- lCaller = iCaller
306
- else
307
- lIdxCaller = iCaller.size - 1
308
- lIdxRef = iReferenceCaller.size - 1
309
- while ((lIdxCaller >= 0) and
310
- (lIdxRef >= 0) and
311
- (iCaller[lIdxCaller] == iReferenceCaller[lIdxRef]))
312
- lIdxCaller -= 1
313
- lIdxRef -= 1
314
- end
315
- # Here we have either one of the indexes that is -1, or the indexes point to different lines between the caller and its reference.
316
- lCaller = iCaller[0..lIdxCaller+1]
317
- end
318
- lCaller.each do |iCallerLine|
319
- lMatch = iCallerLine.match(/^(.*):([[:digit:]]*):in (.*)$/)
320
- if (lMatch == nil)
321
- # Did not get which format. Just add it blindly.
322
- rSimpleCaller << iCallerLine
369
+ if (iCaller != nil)
370
+ lCaller = nil
371
+ # If there is a reference caller, remove the lines from lCaller that are also in iReferenceCaller
372
+ if (iReferenceCaller == nil)
373
+ lCaller = iCaller
323
374
  else
324
- rSimpleCaller << "#{File.expand_path(lMatch[1]).gsub(@LibRootDir, '')}:#{lMatch[2]}:in #{lMatch[3]}"
375
+ lIdxCaller = iCaller.size - 1
376
+ lIdxRef = iReferenceCaller.size - 1
377
+ while ((lIdxCaller >= 0) and
378
+ (lIdxRef >= 0) and
379
+ (iCaller[lIdxCaller] == iReferenceCaller[lIdxRef]))
380
+ lIdxCaller -= 1
381
+ lIdxRef -= 1
382
+ end
383
+ # Here we have either one of the indexes that is -1, or the indexes point to different lines between the caller and its reference.
384
+ lCaller = iCaller[0..lIdxCaller+1]
385
+ end
386
+ lCaller.each do |iCallerLine|
387
+ lMatch = iCallerLine.match(/^(.*):([[:digit:]]*):in (.*)$/)
388
+ if (lMatch == nil)
389
+ # Did not get which format. Just add it blindly.
390
+ rSimpleCaller << iCallerLine
391
+ else
392
+ rSimpleCaller << "#{File.expand_path(lMatch[1]).gsub(@LibRootDir, '')}:#{lMatch[2]}:in #{lMatch[3]}"
393
+ end
325
394
  end
326
395
  end
327
396
 
@@ -340,10 +409,26 @@ Details:
340
409
  # * *iSilentOutputs* (_Boolean_): Do we silent outputs (nothing sent to $stdout or $stderr) ? [optional = false]
341
410
  def self.initializeLogging(iLibRootDir, iBugTrackerURL, iSilentOutputs = false)
342
411
  $rUtilAnts_Logging_Logger = RUtilAnts::Logging::Logger.new(iLibRootDir, iBugTrackerURL, iSilentOutputs)
343
- # Add the module accessible from the Kernel
412
+ # Add the module accessible from the Object namespace
344
413
  Object.module_eval('include RUtilAnts::Logging')
345
414
  end
346
415
 
416
+ # Mute or unmute standard output
417
+ #
418
+ # Parameters:
419
+ # * *iMute* (_Boolean_): Do we mute standard output ? [optional = true]
420
+ def muteStdOut(iMute = true)
421
+ $rUtilAnts_Logging_Logger.muteStdOut(iMute)
422
+ end
423
+
424
+ # Mute or unmute error output
425
+ #
426
+ # Parameters:
427
+ # * *iMute* (_Boolean_): Do we mute error output ? [optional = true]
428
+ def muteStdErr(iMute = true)
429
+ $rUtilAnts_Logging_Logger.muteStdErr(iMute)
430
+ end
431
+
347
432
  # Set the log file to use (can be nil to stop logging into a file)
348
433
  #
349
434
  # Parameters:
@@ -352,6 +437,30 @@ Details:
352
437
  $rUtilAnts_Logging_Logger.setLogFile(iFileName)
353
438
  end
354
439
 
440
+ # Get the log file used (can be nil)
441
+ #
442
+ # Return:
443
+ # * _String_: Log file name (can be nil)
444
+ def getLogFile
445
+ return $rUtilAnts_Logging_Logger.getLogFile
446
+ end
447
+
448
+ # Get the library root dir
449
+ #
450
+ # Return:
451
+ # * _String_: The library root dir, as defined when initialized
452
+ def getLibRootDir
453
+ return $rUtilAnts_Logging_Logger.getLibRootDir
454
+ end
455
+
456
+ # Get the bug tracker URL
457
+ #
458
+ # Return:
459
+ # * _String_: The bug tracker URL, as defined when initialized
460
+ def getBugTrackerURL
461
+ return $rUtilAnts_Logging_Logger.getBugTrackerURL
462
+ end
463
+
355
464
  # Indicate which GUI to be used to display dialogs.
356
465
  #
357
466
  # Parameters:
@@ -368,6 +477,14 @@ Details:
368
477
  $rUtilAnts_Logging_Logger.activateLogDebug(iDebugMode)
369
478
  end
370
479
 
480
+ # Is debug mode activated ?
481
+ #
482
+ # Return:
483
+ # * _Boolean_: Are we in debug mode ?
484
+ def debugActivated?
485
+ return $rUtilAnts_Logging_Logger.debugActivated?
486
+ end
487
+
371
488
  # Set the stack of the errors to fill.
372
489
  # If set to nil, errors will be displayed as they appear.
373
490
  # If set to a stack, errors will silently be added to the list.
@@ -434,6 +551,15 @@ Details:
434
551
  $rUtilAnts_Logging_Logger.logInfo(iMsg)
435
552
  end
436
553
 
554
+ # Log a warning.
555
+ # Warnings are not errors but still should be highlighted.
556
+ #
557
+ # Parameters:
558
+ # * *iMsg* (_String_): Message to log
559
+ def logWarn(iMsg)
560
+ $rUtilAnts_Logging_Logger.logWarn(iMsg)
561
+ end
562
+
437
563
  # Log a debugging info.
438
564
  # This is used when debug is activated
439
565
  #
@@ -7,7 +7,7 @@ module RUtilAnts
7
7
 
8
8
  module Misc
9
9
 
10
- # Set these methods into the Kernel namespace
10
+ # Set these methods into the Object namespace
11
11
  def self.initializeMisc
12
12
  Object.module_eval('include RUtilAnts::Misc')
13
13
  end
@@ -127,6 +127,24 @@ module RUtilAnts
127
127
  return rError
128
128
  end
129
129
 
130
+ # Execute a code block after having changed current directory.
131
+ # Ensure the directory will be changed back at the end of the block, even if exceptions are thrown.
132
+ #
133
+ # Parameters:
134
+ # * *iDir* (_String_): The directory to change into
135
+ # * *CodeBlock*: Code called once the current directory has been changed
136
+ def changeDir(iDir)
137
+ lOldDir = Dir.getwd
138
+ Dir.chdir(iDir)
139
+ begin
140
+ yield
141
+ rescue Exception
142
+ Dir.chdir(lOldDir)
143
+ raise
144
+ end
145
+ Dir.chdir(lOldDir)
146
+ end
147
+
130
148
  end
131
149
 
132
150
  end
@@ -15,10 +15,14 @@ module RUtilAnts
15
15
  def self.initializePlatform
16
16
  # Require the platform info
17
17
  begin
18
- require "RUtilAnts/Platforms/#{RUBY_PLATFORM}/PlatformInfo"
18
+ require "rUtilAnts/Platforms/#{RUBY_PLATFORM}/PlatformInfo"
19
19
  rescue Exception
20
- logBug "Current platform #{RUBY_PLATFORM} is not supported."
21
- raise RuntimeError, "Current platform #{RUBY_PLATFORM} is not supported."
20
+ if (!defined?(logBug))
21
+ require 'rUtilAnts/Logging'
22
+ RUtilAnts::Logging::initializeLogging(File.expand_path(File.dirname(__FILE__)), '')
23
+ end
24
+ logBug "Current platform #{RUBY_PLATFORM} is not supported (#{$!})."
25
+ raise RuntimeError, "Current platform #{RUBY_PLATFORM} is not supported (#{$!})."
22
26
  end
23
27
  # Create the corresponding object
24
28
  $rUtilAnts_Platform_Info = PlatformInfo.new
@@ -40,7 +40,13 @@ module RUtilAnts
40
40
  # Return:
41
41
  # * <em>list<String></em>: List of extensions (including .)
42
42
  def getDiscreteExeExtensions
43
- return [ '.exe', '.com', '.bat' ]
43
+ rExtList = []
44
+
45
+ ENV['PATHEXT'].split(';').each do |iExt|
46
+ rExtList << iExt.downcase
47
+ end
48
+
49
+ return rExtList
44
50
  end
45
51
 
46
52
  # Return the list of directories where we look for libraries
@@ -64,11 +70,12 @@ module RUtilAnts
64
70
  # Parameters:
65
71
  # * *iMsg* (_String_): The message to display
66
72
  def sendMsg(iMsg)
67
- # !!! iMsg must not be longer than 256 characters
68
- if (iMsg.size > 256)
69
- system("msg \"#{ENV['USERNAME']}\" /W #{iMsg[0..255]}")
73
+ # iMsg must not be longer than 255 characters
74
+ # \n must be escaped.
75
+ if (iMsg.size > 255)
76
+ system("msg \"#{ENV['USERNAME']}\" /W \"#{iMsg[0..254]}\"")
70
77
  else
71
- system("msg \"#{ENV['USERNAME']}\" /W #{iMsg}")
78
+ system("msg \"#{ENV['USERNAME']}\" /W \"#{iMsg}\"")
72
79
  end
73
80
  end
74
81
 
@@ -0,0 +1,149 @@
1
+ #--
2
+ # Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
+ # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
+ #++
5
+
6
+ module RUtilAnts
7
+
8
+ module Platform
9
+
10
+ class PlatformInfo
11
+
12
+ # Return the ID of the OS
13
+ # Applications may adapt their behavior based on it.
14
+ #
15
+ # Return:
16
+ # * _Integer_: OS ID
17
+ def os
18
+ return OS_LINUX
19
+ end
20
+
21
+ # Return the list of directories where we look for executables
22
+ #
23
+ # Return:
24
+ # * <em>list<String></em>: List of directories
25
+ def getSystemExePath
26
+ return ENV['PATH'].split(':')
27
+ end
28
+
29
+ # Set the list of directories where we look for executables
30
+ #
31
+ # Parameters:
32
+ # * *iNewDirsList* (<em>list<String></em>): List of directories
33
+ def setSystemExePath(iNewDirsList)
34
+ ENV['PATH'] = iNewDirsList.join(':')
35
+ end
36
+
37
+ # Return the list of file extensions that might be discretely happened to executable files.
38
+ # This is the optional extensions that can be happened when invoked from a terminal.
39
+ #
40
+ # Return:
41
+ # * <em>list<String></em>: List of extensions (including .)
42
+ def getDiscreteExeExtensions
43
+ return []
44
+ end
45
+
46
+ # Return the list of directories where we look for libraries
47
+ #
48
+ # Return:
49
+ # * <em>list<String></em>: List of directories
50
+ def getSystemLibsPath
51
+ rList = ENV['PATH'].split(':')
52
+
53
+ if (ENV['LD_LIBRARY_PATH'] != nil)
54
+ rList += ENV['LD_LIBRARY_PATH'].split(':')
55
+ end
56
+
57
+ return rList
58
+ end
59
+
60
+ # Set the list of directories where we look for libraries
61
+ #
62
+ # Parameters:
63
+ # * *iNewDirsList* (<em>list<String></em>): List of directories
64
+ def setSystemLibsPath(iNewDirsList)
65
+ ENV['LD_LIBRARY_PATH'] = iNewDirsList.join(':')
66
+ end
67
+
68
+ # This method sends a message (platform dependent) to the user, without the use of wxruby
69
+ #
70
+ # Parameters:
71
+ # * *iMsg* (_String_): The message to display
72
+ def sendMsg(iMsg)
73
+ # TODO: Handle case of xmessage not installed
74
+ # Create a temporary file with the content to display
75
+ require 'tmpdir'
76
+ lTmpFileName = "#{Dir.tmpdir}/RUA_MSG"
77
+ File.open(lTmpFileName, 'w') do |oFile|
78
+ oFile.write(iMsg)
79
+ end
80
+ system("xmessage -file #{lTmpFileName}")
81
+ File.unlink(lTmpFileName)
82
+ end
83
+
84
+ # Execute a Shell command.
85
+ # Do not wait for its termination.
86
+ #
87
+ # Parameters:
88
+ # * *iCmd* (_String_): The command to execute
89
+ # * *iInTerminal* (_Boolean_): Do we execute this command in a separate terminal ?
90
+ # Return:
91
+ # * _Exception_: Error, or nil if success
92
+ def execShellCmdNoWait(iCmd, iInTerminal)
93
+ rException = nil
94
+
95
+ if (iInTerminal)
96
+ # TODO: Handle case of xterm not installed
97
+ if (!system("xterm -e \"#{iCmd}\""))
98
+ rException = RuntimeError.new
99
+ end
100
+ else
101
+ begin
102
+ IO.popen(iCmd)
103
+ rescue Exception
104
+ rException = $!
105
+ end
106
+ end
107
+
108
+ return rException
109
+ end
110
+
111
+ # Execute a given URL to be launched in a browser
112
+ #
113
+ # Parameters:
114
+ # * *iURL* (_String_): The URL to launch
115
+ # Return:
116
+ # * _String_: Error message, or nil if success
117
+ def launchURL(iURL)
118
+ rError = nil
119
+
120
+ begin
121
+ IO.popen("xdg-open '#{iURL}'")
122
+ rescue Exception
123
+ rError = $!.to_s
124
+ end
125
+
126
+ return rError
127
+ end
128
+
129
+ # Get file extensions specifics to executable files
130
+ #
131
+ # Return:
132
+ # * <em>list<String></em>: List of extensions (including . character). It can be empty.
133
+ def getExecutableExtensions
134
+ return []
135
+ end
136
+
137
+ # Get prohibited characters from file names
138
+ #
139
+ # Return:
140
+ # * _String_: String of prohibited characters in file names
141
+ def getProhibitedFileNamesCharacters
142
+ return '/'
143
+ end
144
+
145
+ end
146
+
147
+ end
148
+
149
+ end
@@ -27,10 +27,10 @@ module RUtilAnts
27
27
  # map< String, [ list<Regexp>, String ] >
28
28
  # map< PluginName, [ List of matching regexps, Plugin class name ] >
29
29
  @Plugins = {}
30
- Dir.glob("#{File.dirname(__FILE__)}/URLHandlers/*.rb").each do |iFileName|
30
+ Dir.glob(File.expand_path("#{File.dirname(__FILE__)}/URLHandlers/*.rb")).each do |iFileName|
31
31
  begin
32
32
  lPluginName = File.basename(iFileName)[0..-4]
33
- require "RUtilAnts/URLHandlers/#{lPluginName}"
33
+ require "rUtilAnts/URLHandlers/#{lPluginName}"
34
34
  @Plugins[lPluginName] = [
35
35
  eval("RUtilAnts::URLCache::URLHandlers::#{lPluginName}::getMatchingRegexps"),
36
36
  "RUtilAnts::URLCache::URLHandlers::#{lPluginName}"
@@ -55,8 +55,10 @@ module RUtilAnts
55
55
  # * _CodeBlock_: The code returning the object corresponding to the content:
56
56
  # ** *iContent* (_String_): File content, or file name if :LocalFileAccess was true
57
57
  # ** *iFileBaseName* (_String_): The base name the file could have. Useful to get file name extensions.
58
- # ** Returns:
58
+ # ** Return:
59
59
  # ** _Exception_: The error encountered, or nil in case of success
60
+ # Return:
61
+ # * _Exception_: The error encountered, or nil in case of success
60
62
  def accessFile(iURL, iParameters = {})
61
63
  rError = nil
62
64
 
@@ -200,13 +202,15 @@ module RUtilAnts
200
202
  # * *iParameters* (<em>map<Symbol,Object></em>): Additional parameters:
201
203
  # ** *:FollowRedirections* (_Boolean_): Do we follow redirections ? [optional = true]
202
204
  # ** *:NbrRedirectionsAllowed* (_Integer_): Number of redirections allowed [optional = 10]
203
- # ** *:LocalFileAccess* (_Boolean_): Do we need a local file to read the content from ? If not, the content itslef will be given the code block. [optional = false]
205
+ # ** *:LocalFileAccess* (_Boolean_): Do we need a local file to read the content from ? If not, the content itself will be given the code block. [optional = false]
204
206
  # ** *:URLHandler* (_Object_): The URL handler, if it has already been instantiated, or nil otherwise [optional = nil]
205
207
  # * _CodeBlock_: The code returning the object corresponding to the content:
206
208
  # ** *iContent* (_String_): File content, or file name if :LocalFileAccess was true
207
209
  # ** *iFileBaseName* (_String_): The base name the file could have. Useful to get file name extensions.
208
- # ** Returns:
210
+ # ** Return:
209
211
  # ** _Exception_: The error encountered, or nil in case of success
212
+ # Return:
213
+ # * _Exception_: The error encountered, or nil in case of success
210
214
  def accessFile(iURL, iParameters = {})
211
215
  return $rUtilAnts_URLAccess_Manager.accessFile(iURL, iParameters) do |iContent, iBaseName|
212
216
  yield(iContent, iBaseName)
@@ -85,7 +85,8 @@ module RUtilAnts
85
85
  begin
86
86
  require 'net/http'
87
87
  Net::HTTP.start(@URLServer) do |iHTTPConnection|
88
- lResponse = iHTTPConnection.get("/#{@URLPath}")
88
+ # Some websites filter out the default user agent (commons.mediawiki.org for example). Set another one.
89
+ lResponse = iHTTPConnection.request_get("/#{@URLPath}", {'User-Agent' => 'RUtilAnts'})
89
90
  if ((iFollowRedirections) and
90
91
  (lResponse.is_a?(Net::HTTPRedirection)))
91
92
  # We access the file through a new URL
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rUtilAnts
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1.20091105
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ - 0
9
+ - 20101109
10
+ version: 0.2.0.20101109
5
11
  platform: ruby
6
12
  authors:
7
13
  - Muriel Salvan
@@ -9,7 +15,7 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2009-11-05 00:00:00 +01:00
18
+ date: 2010-11-09 00:00:00 +01:00
13
19
  default_executable:
14
20
  dependencies: []
15
21
 
@@ -22,20 +28,6 @@ extensions: []
22
28
  extra_rdoc_files: []
23
29
 
24
30
  files:
25
- - ReleaseInfo
26
- - README
27
- - LICENSE
28
- - AUTHORS
29
- - Credits
30
- - TODO
31
- - ChangeLog
32
- - lib/rUtilAnts/Plugins.rb
33
- - lib/rUtilAnts/GUI.rb
34
- - lib/rUtilAnts/Platform.rb
35
- - lib/rUtilAnts/URLAccess.rb
36
- - lib/rUtilAnts/Logging.rb
37
- - lib/rUtilAnts/URLCache.rb
38
- - lib/rUtilAnts/Misc.rb
39
31
  - lib/rUtilAnts/URLHandlers/HTTP.rb
40
32
  - lib/rUtilAnts/URLHandlers/FTP.rb
41
33
  - lib/rUtilAnts/URLHandlers/LocalFile.rb
@@ -44,6 +36,22 @@ files:
44
36
  - lib/rUtilAnts/GUI/BugReportDialog.rb
45
37
  - lib/rUtilAnts/Platforms/i386-linux/PlatformInfo.rb
46
38
  - lib/rUtilAnts/Platforms/i386-mswin32/PlatformInfo.rb
39
+ - lib/rUtilAnts/Platforms/x86_64-linux/PlatformInfo.rb
40
+ - lib/rUtilAnts/Plugins.rb
41
+ - lib/rUtilAnts/GUI.rb
42
+ - lib/rUtilAnts/Platform.rb
43
+ - lib/rUtilAnts/URLAccess.rb
44
+ - lib/rUtilAnts/Logging.rb
45
+ - lib/rUtilAnts/URLCache.rb
46
+ - lib/rUtilAnts/Misc.rb
47
+ - lib/rUtilAnts/ForeignProcess.rb
48
+ - ReleaseInfo
49
+ - README
50
+ - LICENSE
51
+ - AUTHORS
52
+ - Credits
53
+ - TODO
54
+ - ChangeLog
47
55
  has_rdoc: true
48
56
  homepage: http://rutilants.sourceforge.net/
49
57
  licenses: []
@@ -57,18 +65,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
57
65
  requirements:
58
66
  - - ">="
59
67
  - !ruby/object:Gem::Version
68
+ segments:
69
+ - 0
60
70
  version: "0"
61
- version:
62
71
  required_rubygems_version: !ruby/object:Gem::Requirement
63
72
  requirements:
64
73
  - - ">="
65
74
  - !ruby/object:Gem::Version
75
+ segments:
76
+ - 0
66
77
  version: "0"
67
- version:
68
78
  requirements: []
69
79
 
70
80
  rubyforge_project: rutilants
71
- rubygems_version: 1.3.2
81
+ rubygems_version: 1.3.6
72
82
  signing_key:
73
83
  specification_version: 3
74
84
  summary: A collection of various utility libraries.