rUtilAnts 0.2.2.20101125 → 0.3.0.20110825

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/ChangeLog CHANGED
@@ -1,5 +1,16 @@
1
1
  = rUtilAnts Release History
2
2
 
3
+ == 0.3.0.20110825 (Beta)
4
+
5
+ * Added MySQLPool library: pool MySQL connections and prepared statements for reuse.
6
+ * Migrated TODO list to Trackers.
7
+ * Updated copyright info.
8
+ * Migration to git.
9
+ * Misc: Added cachedVar method: this uses an instance variable to cache a code block result.
10
+ * Misc: Added fileMutex method: this mimicks a mutex on tmpdir, but is not reliable yet. Meant for weak processes.
11
+ * Bug correction: Logging: Do not log debug logs in log file if logdebug is disabled.
12
+ * Bug correction: Archive: Dumping empty directories did not work.
13
+
3
14
  == 0.2.2.20101125 (Beta)
4
15
 
5
16
  * Archive: Implemented a new module that provides archiving strings, objects and files with compression and encryption
data/LICENSE CHANGED
@@ -6,7 +6,7 @@ This list is found in the file named AUTHORS.
6
6
  The AUTHORS and LICENSE files have to be included in any release of software
7
7
  embedding source code of this package, or using it as a derivative software.
8
8
 
9
- Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
9
+ Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
10
10
 
11
11
  Redistribution and use in source and binary forms, with or without
12
12
  modification, are permitted provided that the following conditions are met:
data/ReleaseInfo CHANGED
@@ -1,8 +1,8 @@
1
-
2
- # This file has been generated by RubyPackager during a delivery.
3
- # More info about RubyPackager: http://rubypackager.sourceforge.net
4
- {
5
- :Version => '0.2.2.20101125',
6
- :Tags => [ 'Beta' ],
7
- :DevStatus => 'Beta'
8
- }
1
+
2
+ # This file has been generated by RubyPackager during a delivery.
3
+ # More info about RubyPackager: http://rubypackager.sourceforge.net
4
+ {
5
+ :Version => '0.3.0.20110825',
6
+ :Tags => [ 'Beta' ],
7
+ :DevStatus => 'Beta'
8
+ }
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -274,7 +274,7 @@ module RUtilAnts
274
274
  def dump
275
275
  logMsg "#{@EmptyDirs.size} empty directories:"
276
276
  @EmptyDirs.each_with_index do |iDirName, iIdxDir|
277
- logMsg "* [#{iIdxdir}]: #{iDirName}"
277
+ logMsg "* [#{iIdxDir}]: #{iDirName}"
278
278
  end
279
279
  logMsg "#{@LstFiles.size} files (#{@TotalSize} bytes):"
280
280
  @LstFiles.each_with_index do |iFileInfo, iIdxFile|
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2010 - 2011 Muriel (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
data/lib/rUtilAnts/GUI.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -323,12 +323,13 @@ Details:
323
323
  # * *iMsg* (_String_): Message to log
324
324
  def logDebug(iMsg)
325
325
  # Log into stdout
326
- if ((@DebugMode) and
327
- (@ScreenOutput))
328
- $stdout << "#{iMsg}\n"
329
- end
330
- if (@LogFile != nil)
331
- logFile(iMsg)
326
+ if (@DebugMode)
327
+ if (@ScreenOutput)
328
+ $stdout << "#{iMsg}\n"
329
+ end
330
+ if (@LogFile != nil)
331
+ logFile(iMsg)
332
+ end
332
333
  end
333
334
  end
334
335
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -12,6 +12,28 @@ module RUtilAnts
12
12
  Object.module_eval('include RUtilAnts::Misc')
13
13
  end
14
14
 
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 = cachedVar{ lengthyFctToComputeVar } )
17
+ #
18
+ # Parameters:
19
+ # * *&iCode* (_CodeBlock_): The code called to compute the result
20
+ # ** Return:
21
+ # *** _Object_: The computed result
22
+ # Return:
23
+ # * _Object_: The result of the code
24
+ def cachedVar(&iCode)
25
+ if (defined?(@RUtilAnts_Misc_CachedVars) == nil)
26
+ @RUtilAnts_Misc_CachedVars = {}
27
+ end
28
+ # Compute the hash of this code
29
+ lHash = caller[0].hash
30
+ if (@RUtilAnts_Misc_CachedVars[lHash] == nil)
31
+ @RUtilAnts_Misc_CachedVars[lHash] = iCode.call
32
+ end
33
+
34
+ return @RUtilAnts_Misc_CachedVars[lHash]
35
+ end
36
+
15
37
  # Get a valid file name, taking into account platform specifically prohibited characters in file names.
16
38
  #
17
39
  # Parameters:
@@ -145,6 +167,77 @@ module RUtilAnts
145
167
  Dir.chdir(lOldDir)
146
168
  end
147
169
 
170
+ # Constants used for fileMutex
171
+ # There was no lock on the mutex
172
+ FILEMUTEX_NO_LOCK = 0
173
+ # There was a lock on the mutex, but former process did not exist anymore
174
+ FILEMUTEX_ZOMBIE_LOCK = 1
175
+ # The lock is taken by a running process
176
+ FILEMUTEX_LOCK_TAKEN = 2
177
+ # The lock file is invalid
178
+ FILEMUTEX_INVALID_LOCK = 3
179
+ # Execute a code block protected by a file mutex
180
+ #
181
+ # Parameters:
182
+ # * *iProcessID* (_String_): Process ID to be used to identify the mutex
183
+ # * *CodeBlock*: The code called if the mutex is taken
184
+ # Return:
185
+ # * _Integer_: Error code
186
+ def fileMutex(iProcessID)
187
+ rResult = FILEMUTEX_NO_LOCK
188
+
189
+ # Prevent concurrent execution
190
+ require 'tmpdir'
191
+ lLockFile = "#{Dir.tmpdir}/FileMutex_#{iProcessID}.lock"
192
+ if (File.exists?(lLockFile))
193
+ logErr "Another instance of process #{iProcessID} is already running. Delete file #{lLockFile} if it is not."
194
+ begin
195
+ lDetails = nil
196
+ File.open(lLockFile, 'r') do |iFile|
197
+ lDetails = eval(iFile.read)
198
+ end
199
+ logErr "Details of the running instance: #{lDetails.inspect}"
200
+ # If the process does not exist anymore, remove the lock file
201
+ # TODO: Adapt this to non Unix systems
202
+ if (File.exists?("/proc/#{lDetails[:PID]}"))
203
+ rResult = FILEMUTEX_LOCK_TAKEN
204
+ else
205
+ logErr "Process #{lDetails[:PID]} does not exist anymore. Removing lock file."
206
+ File.unlink(lLockFile)
207
+ rResult = FILEMUTEX_ZOMBIE_LOCK
208
+ end
209
+ rescue Exception
210
+ logErr "Invalid lock file #{lLockFile}: #{$!}."
211
+ rResult = FILEMUTEX_INVALID_LOCK
212
+ end
213
+ end
214
+ if ((rResult == FILEMUTEX_NO_LOCK) or
215
+ (rResult == FILEMUTEX_ZOMBIE_LOCK))
216
+ # Create the lock for our process
217
+ File.open(lLockFile, 'w') do |oFile|
218
+ oFile << "
219
+ {
220
+ :ExecutionTime => '#{DateTime.now.strftime('%Y-%m-%d %H:%M:%S')}',
221
+ :PID => '#{Process.pid}'
222
+ }
223
+ "
224
+ end
225
+ begin
226
+ yield
227
+ File.unlink(lLockFile)
228
+ rescue Exception
229
+ begin
230
+ File.unlink(lLockFile)
231
+ rescue Exception
232
+ logErr "Exception while deleting lock file #{lLockFile}: #{$!}"
233
+ end
234
+ raise
235
+ end
236
+ end
237
+
238
+ return rResult
239
+ end
240
+
148
241
  end
149
242
 
150
243
  end
@@ -0,0 +1,237 @@
1
+ #--
2
+ # Copyright (c) 2011 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 MySQLPool
9
+
10
+ class MissingExistingConnectionError < RuntimeError
11
+ end
12
+
13
+ class MissingConnectionFromPoolError < RuntimeError
14
+ end
15
+
16
+ class MissingPreparedStatementFromPoolError < RuntimeError
17
+ end
18
+
19
+ # Set these methods into the Object namespace
20
+ def self.initializeMySQLPool
21
+ Object.module_eval('include RUtilAnts::MySQLPool')
22
+ end
23
+
24
+ # Create a MySQL connection to a MySQL database.
25
+ # Keep connections in a pool with counters.
26
+ # Reuse existing connections.
27
+ # If the given password is nil, we force the reuse of an existing connection.
28
+ #
29
+ # Parameters:
30
+ # * *iHost* (_String_): The host to connect to
31
+ # * *iDBName* (_String_): The MySQL database name to connect to
32
+ # * *iUser* (_String_): The user
33
+ # * *iPassword* (_String_): The password. If nil, this will only try to reuse an existing connection [optional = nil]
34
+ # Return:
35
+ # * _Exception_: An error, or nil in case of success
36
+ # * _MySQL_: The MySQL connection, or nil in case of failure
37
+ def connectToMySQL(iHost, iDBName, iUser, iPassword = nil)
38
+ rError = nil
39
+ rMySQL = nil
40
+
41
+ if (defined?($RUtilAnts_MySQLPool_Pool) == nil)
42
+ # The pool: connection, counters and prepared statements per host/dbname/user
43
+ # map< [ HostName, DBName, UserName ], [ MySQLConnection, Counter, map< SQLString, [ MySQLPreparedStatement, Counter ] > ] >
44
+ $RUtilAnts_MySQLPool_Pool = {}
45
+ end
46
+ lDBKey = [ iHost, iDBName, iUser ]
47
+ if ($RUtilAnts_MySQLPool_Pool[lDBKey] == nil)
48
+ if (iPassword == nil)
49
+ # This is a problem: we want an existing connection, but none exists.
50
+ rError = MissingExistingConnectionError.new("An existing connection should already exist for #{lDBKey.inspect}")
51
+ else
52
+ # Create the connection
53
+ require 'mysql'
54
+ begin
55
+ lMySQL = Mysql.new(iHost, iUser, iPassword, iDBName)
56
+ # lMySQL = Mysql.init
57
+ # lMySQL.options(Mysql::OPT_CONNECT_TIMEOUT, 28800)
58
+ # lMySQL.options(Mysql::OPT_READ_TIMEOUT, 28800)
59
+ # lMySQL.options(Mysql::OPT_WRITE_TIMEOUT, 28800)
60
+ # lMySQL.real_connect(iHost, iUser, iPassword, iDBName)
61
+ rescue Exception
62
+ logErr "Error while creating MySQL connection to #{lDBKey.inspect}: #{$!}.\n#{$!.backtrace.join("\n")}"
63
+ rError = $!
64
+ lMySQL = nil
65
+ end
66
+ if (rError == nil)
67
+ $RUtilAnts_MySQLPool_Pool[lDBKey] = [ lMySQL, 0, {} ]
68
+ else
69
+ $RUtilAnts_MySQLPool_Pool[lDBKey] = nil
70
+ end
71
+ end
72
+ end
73
+ if ((rError == nil) and
74
+ ($RUtilAnts_MySQLPool_Pool[lDBKey] != nil))
75
+ # Increase the count of clients to this connection
76
+ $RUtilAnts_MySQLPool_Pool[lDBKey][1] += 1
77
+ rMySQL = $RUtilAnts_MySQLPool_Pool[lDBKey][0]
78
+ end
79
+
80
+ return rError, rMySQL
81
+ end
82
+
83
+ # Close a MySQL connection created with connectToMySQL
84
+ #
85
+ # Parameters:
86
+ # * *iMySQLConnection* (_MySQL_): The MySQL connection to close
87
+ def closeMySQL(iMySQLConnection)
88
+ # Find the connection
89
+ if (defined?($RUtilAnts_MySQLPool_Pool) == nil)
90
+ $RUtilAnts_MySQLPool_Pool = {}
91
+ end
92
+ lDBKey = findMySQLConnectionKey(iMySQLConnection)
93
+ $RUtilAnts_MySQLPool_Pool[lDBKey][1] -= 1
94
+ if ($RUtilAnts_MySQLPool_Pool[lDBKey][1] == 0)
95
+ # Close for real
96
+ $RUtilAnts_MySQLPool_Pool[lDBKey][0].close
97
+ $RUtilAnts_MySQLPool_Pool[lDBKey] = nil
98
+ end
99
+ end
100
+
101
+ # Setup a MySQL connection, and ensure it is closed once the client code ends.
102
+ #
103
+ # Parameters:
104
+ # * *iHost* (_String_): The host to connect to
105
+ # * *iDBName* (_String_): The MySQL database name to connect to
106
+ # * *iUser* (_String_): The user
107
+ # * *iPassword* (_String_): The password. If nil, this will only try to reuse an existing connection [optional = nil]
108
+ # * *CodeBlock*: The code executed with the MySQL connection
109
+ # ** *iMySQL* (_MySQL_): The MySQL connection
110
+ # Return:
111
+ # * _Exception_: An error, or nil in case of success
112
+ def setupMySQLConnection(iHost, iDBName, iUser, iPassword = nil)
113
+ rError = nil
114
+
115
+ rError, lMySQL = connectToMySQL(iHost, iDBName, iUser, iPassword)
116
+ if (rError == nil)
117
+ begin
118
+ yield(lMySQL)
119
+ ensure
120
+ closeMySQL(lMySQL)
121
+ end
122
+ end
123
+
124
+ return rError
125
+ end
126
+
127
+ # Get a prepared statement for a given SQL string of a given MySQL connection.
128
+ # Use the cache of prepared statements.
129
+ #
130
+ # Parameters:
131
+ # * *iMySQLConnection* (_MySQL_): The MySQL connection
132
+ # * *iStrSQL* (_String_): The SQL statement to prepare
133
+ # * *iAdditionalOptions* (<em>map<Symbol,Object></em>): Additional options [optional = {}]
134
+ # ** *:LeaveOpen* (_Boolean_): Do we NOT close the opened statement once it is not used anymore ? [optional = false]
135
+ # Return:
136
+ # * <em>MySQL::Statement</em>: The MySQL statement
137
+ def getPreparedStatement(iMySQLConnection, iStrSQL, iAdditionalOptions = {})
138
+ # Parse options
139
+ lLeaveOpen = iAdditionalOptions[:LeaveOpen] || false
140
+ # Find the prepared statements set
141
+ lPreparedStatements = $RUtilAnts_MySQLPool_Pool[findMySQLConnectionKey(iMySQLConnection)][2]
142
+ if (lPreparedStatements[iStrSQL] == nil)
143
+ # Create a new one
144
+ lPreparedStatements[iStrSQL] = [
145
+ iMySQLConnection.prepare(iStrSQL),
146
+ 0
147
+ ]
148
+ end
149
+ if (lLeaveOpen)
150
+ # We set its counter to -1
151
+ lPreparedStatements[iStrSQL][1] = -1
152
+ elsif (lPreparedStatements[iStrSQL][1] != -1)
153
+ # We increment its usage counter
154
+ lPreparedStatements[iStrSQL][1] += 1
155
+ end
156
+
157
+ return lPreparedStatements[iStrSQL][0]
158
+ end
159
+
160
+ # Close a previously created prepared statement using getPreparedStatement.
161
+ #
162
+ # Parameters:
163
+ # * *iMySQLConnection* (_MySQL_): The MySQL connection
164
+ # * *iPreparedStatement* (<em>MySQL::Statement</em>): The MySQL prepared statement
165
+ def closePreparedStatement(iMySQLConnection, iPreparedStatement)
166
+ lPreparedStatements = $RUtilAnts_MySQLPool_Pool[findMySQLConnectionKey(iMySQLConnection)][2]
167
+ lFound = false
168
+ lPreparedStatements.each do |iStrSQL, ioPreparedStatementInfo|
169
+ if (ioPreparedStatementInfo[0] == iPreparedStatement)
170
+ # Found it
171
+ if (ioPreparedStatementInfo[1] != -1)
172
+ ioPreparedStatementInfo[1] -= 1
173
+ if (ioPreparedStatementInfo[1] == 0)
174
+ # Close it for real
175
+ ioPreparedStatementInfo[1].close
176
+ lPreparedStatements[iStrSQL] = nil
177
+ end
178
+ end
179
+ lFound = true
180
+ end
181
+ end
182
+ if (!lFound)
183
+ raise MissingPreparedStatementFromPoolError.new("Prepared statement #{iPreparedStatement.inspect} can't be found among the pool of MySQL connection #{iMySQLConnection.inspect}")
184
+ end
185
+ end
186
+
187
+ # Setup a prepared statement, and ensure it will be closed
188
+ #
189
+ # Parameters:
190
+ # * *iMySQLConnection* (_MySQL_): The MySQL connection
191
+ # * *iStrSQL* (_String_): The SQL statement to prepare
192
+ # * *iAdditionalOptions* (<em>map<Symbol,Object></em>): Additional options [optional = {}]
193
+ # ** *:LeaveOpen* (_Boolean_): Do we NOT close the opened statement once it is not used anymore ? [optional = false]
194
+ # * *CodeBlock*: The code executed once the statement is prepared
195
+ # ** *iPreparedStatement* (<em>MySQL::Statement</em>): The prepared statement
196
+ def setupPreparedStatement(iMySQLConnection, iStrSQL, iAdditionalOptions = {})
197
+ lStatement = getPreparedStatement(iMySQLConnection, iStrSQL, iAdditionalOptions)
198
+ begin
199
+ yield(lStatement)
200
+ ensure
201
+ closePreparedStatement(iMySQLConnection, lStatement)
202
+ end
203
+ end
204
+
205
+ private
206
+
207
+ # Find the MySQL connection key
208
+ #
209
+ # Parameters:
210
+ # * *iMySQLConnection* (_MySQL_): The MySQL connection
211
+ # Return:
212
+ # * _String_: Host name, or nil if none
213
+ # * _String_: DB name
214
+ # * _String_: User name
215
+ def findMySQLConnectionKey(iMySQLConnection)
216
+ rHostName = nil
217
+ rDBName = nil
218
+ rUserName = nil
219
+
220
+ $RUtilAnts_MySQLPool_Pool.each do |iDBKey, ioConnectionInfo|
221
+ iMySQL = ioConnectionInfo[0]
222
+ if (iMySQLConnection == iMySQL)
223
+ # Found it
224
+ rHostName, rDBName, rUserName = iDBKey
225
+ break
226
+ end
227
+ end
228
+ if (rHostName == nil)
229
+ raise MissingConnectionFromPoolError.new("Unable to find connection #{iMySQLConnection.inspect} among the MySQL connections pool.")
230
+ end
231
+
232
+ return rHostName, rDBName, rUserName
233
+ end
234
+
235
+ end
236
+
237
+ end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
@@ -62,6 +62,7 @@ module RUtilAnts
62
62
  # Return:
63
63
  # * _String_: The file name
64
64
  def getCorrespondingFileBaseName
65
+ # TODO: Handle the case where there is no base name (ie. www.google.com instead of www.google.com/index.html)
65
66
  # Check that extension has no characters following the URL (#, ? and ;)
66
67
  return getValidFileName(File.basename(@URLPath.gsub(/^([^#\?;]*).*$/,'\1')))
67
68
  end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2009-2010 Muriel Salvan (murielsalvan@users.sourceforge.net)
2
+ # Copyright (c) 2009 - 2011 Muriel Salvan (murielsalvan@users.sourceforge.net)
3
3
  # Licensed under the terms specified in LICENSE file. No warranty is provided.
4
4
  #++
5
5
 
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rUtilAnts
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 40221573
5
+ prerelease:
5
6
  segments:
6
7
  - 0
7
- - 2
8
- - 2
9
- - 20101125
10
- version: 0.2.2.20101125
8
+ - 3
9
+ - 0
10
+ - 20110825
11
+ version: 0.3.0.20110825
11
12
  platform: ruby
12
13
  authors:
13
14
  - Muriel Salvan
@@ -15,8 +16,7 @@ autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2010-11-25 00:00:00 +01:00
19
- default_executable:
19
+ date: 2011-08-25 00:00:00 Z
20
20
  dependencies: []
21
21
 
22
22
  description: rUtilAnts is used by several projects. It includes common standard code.
@@ -38,6 +38,7 @@ files:
38
38
  - lib/rUtilAnts/GUI.rb
39
39
  - lib/rUtilAnts/Logging.rb
40
40
  - lib/rUtilAnts/Misc.rb
41
+ - lib/rUtilAnts/MySQLPool.rb
41
42
  - lib/rUtilAnts/Platform.rb
42
43
  - lib/rUtilAnts/Platforms/i386-cygwin/PlatformInfo.rb
43
44
  - lib/rUtilAnts/Platforms/i386-linux/PlatformInfo.rb
@@ -54,8 +55,6 @@ files:
54
55
  - LICENSE
55
56
  - README
56
57
  - ReleaseInfo
57
- - TODO
58
- has_rdoc: true
59
58
  homepage: http://rutilants.sourceforge.net/
60
59
  licenses: []
61
60
 
@@ -69,6 +68,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
69
68
  requirements:
70
69
  - - ">="
71
70
  - !ruby/object:Gem::Version
71
+ hash: 3
72
72
  segments:
73
73
  - 0
74
74
  version: "0"
@@ -77,13 +77,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - ">="
79
79
  - !ruby/object:Gem::Version
80
+ hash: 3
80
81
  segments:
81
82
  - 0
82
83
  version: "0"
83
84
  requirements: []
84
85
 
85
86
  rubyforge_project: rutilants
86
- rubygems_version: 1.3.7
87
+ rubygems_version: 1.8.7
87
88
  signing_key:
88
89
  specification_version: 3
89
90
  summary: A collection of various utility libraries.
data/TODO DELETED
@@ -1,10 +0,0 @@
1
- * Documentation
2
- ** Write a complete User Guide.
3
- ** Write a complete Developer Guide.
4
- ** Create FAQ
5
-
6
- * Testing
7
- ** Create a Regression
8
-
9
- * Development
10
- ** Implement Send bug reports in BugReportDialog