do_mysql 0.9.12-x86-mswin32-60 → 0.10.0-x86-mswin32-60
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.markdown +17 -0
- data/Manifest.txt +2 -2
- data/{README.txt → README.markdown} +2 -1
- data/Rakefile +3 -3
- data/ext/do_mysql_ext/do_mysql_ext.c +255 -106
- data/ext/do_mysql_ext/error.h +527 -0
- data/ext/do_mysql_ext/extconf.rb +1 -6
- data/lib/do_mysql.rb +20 -17
- data/lib/do_mysql/encoding.rb +38 -0
- data/lib/do_mysql/transaction.rb +9 -13
- data/lib/do_mysql/version.rb +1 -1
- data/lib/do_mysql_ext.so +0 -0
- data/spec/connection_spec.rb +43 -1
- data/spec/result_spec.rb +7 -0
- data/spec/spec_helper.rb +107 -11
- data/tasks/gem.rake +1 -53
- data/tasks/release.rake +7 -7
- data/tasks/retrieve.rake +1 -1
- data/tasks/spec.rake +1 -0
- data/tasks/ssl.rake +29 -0
- metadata +13 -10
- data/History.txt +0 -9
data/ext/do_mysql_ext/extconf.rb
CHANGED
@@ -1,9 +1,4 @@
|
|
1
|
-
if RUBY_PLATFORM =~ /darwin/
|
2
|
-
ENV["RC_ARCHS"] = `uname -m`.chomp if `uname -sr` =~ /^Darwin/
|
3
|
-
|
4
|
-
# On PowerPC the defaults are fine
|
5
|
-
ENV["RC_ARCHS"] = '' if `uname -m` =~ /^Power Macintosh/
|
6
|
-
end
|
1
|
+
ENV["RC_ARCHS"] = "" if RUBY_PLATFORM =~ /darwin/
|
7
2
|
|
8
3
|
require 'mkmf'
|
9
4
|
|
data/lib/do_mysql.rb
CHANGED
@@ -1,21 +1,30 @@
|
|
1
|
-
require 'rubygems'
|
2
1
|
require 'data_objects'
|
3
2
|
if RUBY_PLATFORM =~ /java/
|
4
3
|
require 'do_jdbc'
|
5
4
|
require 'java'
|
6
|
-
|
7
|
-
|
5
|
+
|
6
|
+
driver = 'com.mysql.jdbc.Driver'
|
7
|
+
begin
|
8
|
+
java.lang.Thread.currentThread.getContextClassLoader().loadClass(driver, true)
|
9
|
+
rescue
|
10
|
+
require 'jdbc/mysql' # the JDBC driver, packaged as a gem
|
11
|
+
end
|
12
|
+
|
13
|
+
# Another way of loading the JDBC Class. This seems to be more reliable
|
14
|
+
# than Class.forName() or
|
15
|
+
# Thread.currentThread.getContextClassLoader().loadClass() within the
|
16
|
+
# data_objects.Connection Java class, which is currently not working as
|
17
|
+
# expected.
|
18
|
+
java_import driver
|
19
|
+
|
8
20
|
end
|
9
21
|
|
10
22
|
require 'do_mysql_ext'
|
11
|
-
require
|
12
|
-
require
|
23
|
+
require 'do_mysql/version'
|
24
|
+
require 'do_mysql/transaction'
|
25
|
+
require 'do_mysql/encoding'
|
13
26
|
|
14
27
|
if RUBY_PLATFORM =~ /java/
|
15
|
-
# Another way of loading the JDBC Class. This seems to be more reliable
|
16
|
-
# than Class.forName() within the data_objects.Connection Java class,
|
17
|
-
# which is currently not working as expected.
|
18
|
-
import 'com.mysql.jdbc.Driver'
|
19
28
|
|
20
29
|
module DataObjects
|
21
30
|
module Mysql
|
@@ -28,15 +37,9 @@ if RUBY_PLATFORM =~ /java/
|
|
28
37
|
@using_socket
|
29
38
|
end
|
30
39
|
|
31
|
-
def
|
32
|
-
|
33
|
-
reader = self.create_command("SHOW VARIABLES LIKE 'character_set_client'").execute_reader
|
34
|
-
reader.next!
|
35
|
-
char_set = reader.values[1]
|
36
|
-
reader.close
|
37
|
-
char_set.downcase
|
40
|
+
def secure?
|
41
|
+
false
|
38
42
|
end
|
39
|
-
|
40
43
|
end
|
41
44
|
end
|
42
45
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module DataObjects
|
2
|
+
module Mysql
|
3
|
+
module Encoding
|
4
|
+
MAP = {
|
5
|
+
"Big5" => "big5",
|
6
|
+
"CP850" => "cp850",
|
7
|
+
"KOI8-R" => "koi8r",
|
8
|
+
"ISO-8859-1" => "latin1",
|
9
|
+
"ISO-8859-2" => "latin2",
|
10
|
+
"US-ASCII" => "ascii",
|
11
|
+
"EUC-JP" => "ujis",
|
12
|
+
"SJIS" => "sjis",
|
13
|
+
"ISO-8859-8" => "hebrew",
|
14
|
+
"TIS-620" => "tis620",
|
15
|
+
"EUC-KR" => "euckr",
|
16
|
+
"KOI8-U" => "koi8u",
|
17
|
+
"GB2312" => "gb2312",
|
18
|
+
"ISO-8859-7" => "greek",
|
19
|
+
"Windows-1250" => "cp1250",
|
20
|
+
"GBK" => "gbk",
|
21
|
+
"ISO-8859-9" => "latin5",
|
22
|
+
"UTF-8" => "utf8",
|
23
|
+
"UTF-16BE" => "ucs2",
|
24
|
+
"IBM866" => "cp866",
|
25
|
+
"macCentEuro" => "macce",
|
26
|
+
"macRoman" => "macroman",
|
27
|
+
"CP852" => "cp852",
|
28
|
+
"ISO-8859-13" => "latin7",
|
29
|
+
"Windows-1251" => "cp1251",
|
30
|
+
"Windows-1256" => "cp1256",
|
31
|
+
"Windows-1257" => "cp1257",
|
32
|
+
"ASCII-8BIT" => "binary",
|
33
|
+
"Windows-31J" => "cp932",
|
34
|
+
"eucJP-ms" => "eucjpms"
|
35
|
+
}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/do_mysql/transaction.rb
CHANGED
@@ -5,27 +5,16 @@ module DataObjects
|
|
5
5
|
|
6
6
|
class Transaction < DataObjects::Transaction
|
7
7
|
|
8
|
-
def
|
9
|
-
cmd = "XA END '#{id}'"
|
10
|
-
connection.create_command(cmd).execute_non_query
|
11
|
-
end
|
12
|
-
|
13
|
-
def begin
|
8
|
+
def begin_prepared
|
14
9
|
cmd = "XA START '#{id}'"
|
15
10
|
connection.create_command(cmd).execute_non_query
|
16
11
|
end
|
17
12
|
|
18
|
-
def
|
13
|
+
def commit_prepared
|
19
14
|
cmd = "XA COMMIT '#{id}'"
|
20
15
|
connection.create_command(cmd).execute_non_query
|
21
16
|
end
|
22
17
|
|
23
|
-
def rollback
|
24
|
-
finalize_transaction
|
25
|
-
cmd = "XA ROLLBACK '#{id}'"
|
26
|
-
connection.create_command(cmd).execute_non_query
|
27
|
-
end
|
28
|
-
|
29
18
|
def rollback_prepared
|
30
19
|
cmd = "XA ROLLBACK '#{id}'"
|
31
20
|
connection.create_command(cmd).execute_non_query
|
@@ -37,6 +26,13 @@ module DataObjects
|
|
37
26
|
connection.create_command(cmd).execute_non_query
|
38
27
|
end
|
39
28
|
|
29
|
+
private
|
30
|
+
|
31
|
+
def finalize_transaction
|
32
|
+
cmd = "XA END '#{id}'"
|
33
|
+
connection.create_command(cmd).execute_non_query
|
34
|
+
end
|
35
|
+
|
40
36
|
end
|
41
37
|
|
42
38
|
end
|
data/lib/do_mysql/version.rb
CHANGED
data/lib/do_mysql_ext.so
CHANGED
Binary file
|
data/spec/connection_spec.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
4
4
|
require 'data_objects/spec/connection_spec'
|
5
|
+
require 'cgi'
|
5
6
|
|
6
7
|
describe DataObjects::Mysql::Connection do
|
7
8
|
|
@@ -12,8 +13,49 @@ describe DataObjects::Mysql::Connection do
|
|
12
13
|
@host = CONFIG.host
|
13
14
|
@port = CONFIG.port
|
14
15
|
@database = CONFIG.database
|
16
|
+
@ssl = CONFIG.ssl
|
15
17
|
end
|
16
18
|
|
17
19
|
it_should_behave_like 'a Connection'
|
18
|
-
|
20
|
+
it_should_behave_like 'a Connection with authentication support'
|
21
|
+
it_should_behave_like 'a Connection with SSL support' unless JRUBY
|
22
|
+
|
23
|
+
if DataObjectsSpecHelpers.test_environment_supports_ssl?
|
24
|
+
|
25
|
+
describe 'connecting with SSL' do
|
26
|
+
|
27
|
+
it 'should raise an error when passed ssl=true' do
|
28
|
+
lambda { DataObjects::Connection.new("#{CONFIG.uri}?ssl=true") }.
|
29
|
+
should raise_error(ArgumentError)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should raise an error when passed a nonexistent client certificate' do
|
33
|
+
lambda { DataObjects::Connection.new("#{CONFIG.uri}?ssl[client_cert]=nonexistent") }.
|
34
|
+
should raise_error(ArgumentError)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should raise an error when passed a nonexistent client key' do
|
38
|
+
lambda { DataObjects::Connection.new("#{CONFIG.uri}?ssl[client_key]=nonexistent") }.
|
39
|
+
should raise_error(ArgumentError)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should raise an error when passed a nonexistent ca certificate' do
|
43
|
+
lambda { DataObjects::Connection.new("#{CONFIG.uri}?ssl[ca_cert]=nonexistent") }.
|
44
|
+
should raise_error(ArgumentError)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should connect with a specified SSL cipher' do
|
48
|
+
DataObjects::Connection.new("#{CONFIG.uri}?#{CONFIG.ssl}&ssl[cipher]=#{SSLHelpers::CONFIG.cipher}").
|
49
|
+
ssl_cipher.should == SSLHelpers::CONFIG.cipher
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should raise an error with an invalid SSL cipher' do
|
53
|
+
lambda { DataObjects::Connection.new("#{CONFIG.uri}?#{CONFIG.ssl}&ssl[cipher]=invalid") }.
|
54
|
+
should raise_error
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
19
61
|
end
|
data/spec/result_spec.rb
CHANGED
@@ -3,7 +3,14 @@
|
|
3
3
|
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
4
4
|
require 'data_objects/spec/result_spec'
|
5
5
|
|
6
|
+
# splitting the descibe into two separate declaration avoids
|
7
|
+
# concurrent execution of the "it_should_behave_like ....."
|
8
|
+
# needed by some databases (sqlite3)
|
9
|
+
|
6
10
|
describe DataObjects::Mysql::Result do
|
7
11
|
it_should_behave_like 'a Result'
|
12
|
+
end
|
13
|
+
|
14
|
+
describe DataObjects::Mysql::Result do
|
8
15
|
it_should_behave_like 'a Result which returns inserted keys'
|
9
16
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -11,21 +11,25 @@ require 'ostruct'
|
|
11
11
|
require 'pathname'
|
12
12
|
require 'fileutils'
|
13
13
|
|
14
|
+
dir = File.dirname(__FILE__)
|
15
|
+
lib_path = File.expand_path("#{dir}/../lib")
|
16
|
+
$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
|
14
17
|
# put data_objects from repository in the load path
|
15
18
|
# DO NOT USE installed gem of data_objects!
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
DATAOBJECTS_SPEC_ROOT = Pathname(__FILE__).dirname.parent.parent + 'data_objects' + 'spec'
|
20
|
-
Pathname.glob((DATAOBJECTS_SPEC_ROOT + 'lib/**/*.rb').to_s).each { |f| require f }
|
19
|
+
do_lib_path = File.expand_path("#{dir}/../../data_objects/lib")
|
20
|
+
$LOAD_PATH.unshift do_lib_path unless $LOAD_PATH.include?(do_lib_path)
|
21
21
|
|
22
22
|
if JRUBY
|
23
|
-
|
23
|
+
jdbc_lib_path = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'do_jdbc', 'lib'))
|
24
|
+
$LOAD_PATH.unshift jdbc_lib_path unless $LOAD_PATH.include?(jdbc_lib_path)
|
24
25
|
require 'do_jdbc'
|
25
26
|
end
|
26
27
|
|
27
|
-
|
28
|
-
|
28
|
+
require 'data_objects'
|
29
|
+
|
30
|
+
DATAOBJECTS_SPEC_ROOT = Pathname(__FILE__).dirname.parent.parent + 'data_objects' + 'spec'
|
31
|
+
Pathname.glob((DATAOBJECTS_SPEC_ROOT + 'lib/**/*.rb').to_s).each { |f| require f }
|
32
|
+
|
29
33
|
require 'do_mysql'
|
30
34
|
|
31
35
|
log_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'log', 'do.log'))
|
@@ -46,6 +50,7 @@ CONFIG.pass = ENV['DO_MYSQL_PASS'] || ''
|
|
46
50
|
CONFIG.host = ENV['DO_MYSQL_HOST'] || 'localhost'
|
47
51
|
CONFIG.port = ENV['DO_MYSQL_PORT'] || '3306'
|
48
52
|
CONFIG.database = ENV['DO_MYSQL_DATABASE'] || '/do_test'
|
53
|
+
CONFIG.ssl = SSLHelpers.query(:ca_cert, :client_cert, :client_key)
|
49
54
|
|
50
55
|
CONFIG.uri = ENV["DO_MYSQL_SPEC_URI"] ||"#{CONFIG.scheme}://#{CONFIG.user}:#{CONFIG.pass}@#{CONFIG.host}:#{CONFIG.port}#{CONFIG.database}"
|
51
56
|
CONFIG.sleep = "SELECT sleep(1)"
|
@@ -96,7 +101,7 @@ module DataObjectsSpecHelpers
|
|
96
101
|
`ad_image` mediumblob NULL,
|
97
102
|
`whitepaper_text` longtext NULL,
|
98
103
|
`cad_drawing` longblob NULL,
|
99
|
-
`flags`
|
104
|
+
`flags` boolean default false,
|
100
105
|
`number_in_stock` smallint default 500,
|
101
106
|
`number_sold` mediumint default 0,
|
102
107
|
`super_number` bigint default 9223372036854775807,
|
@@ -105,7 +110,7 @@ module DataObjectsSpecHelpers
|
|
105
110
|
`cost2` decimal(8,2) default 50.23,
|
106
111
|
`release_date` date default '2008-02-14',
|
107
112
|
`release_datetime` datetime default '2008-02-14 00:31:12',
|
108
|
-
`release_timestamp` timestamp default '2008-02-14 00:31:31',
|
113
|
+
`release_timestamp` timestamp NULL default '2008-02-14 00:31:31',
|
109
114
|
`status` enum('active','out of stock') NOT NULL default 'active',
|
110
115
|
PRIMARY KEY (`id`)
|
111
116
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
@@ -118,15 +123,106 @@ module DataObjectsSpecHelpers
|
|
118
123
|
end
|
119
124
|
|
120
125
|
conn.create_command(<<-EOF).execute_non_query
|
121
|
-
update widgets set flags =
|
126
|
+
update widgets set flags = true where id = 2
|
122
127
|
EOF
|
123
128
|
|
124
129
|
conn.create_command(<<-EOF).execute_non_query
|
125
130
|
update widgets set ad_description = NULL where id = 3
|
126
131
|
EOF
|
127
132
|
|
133
|
+
conn.create_command(<<-EOF).execute_non_query
|
134
|
+
update widgets set flags = NULL where id = 4
|
135
|
+
EOF
|
136
|
+
|
137
|
+
conn.create_command(<<-EOF).execute_non_query
|
138
|
+
update widgets set cost1 = NULL where id = 5
|
139
|
+
EOF
|
140
|
+
|
141
|
+
conn.create_command(<<-EOF).execute_non_query
|
142
|
+
update widgets set cost2 = NULL where id = 6
|
143
|
+
EOF
|
144
|
+
|
145
|
+
conn.create_command(<<-EOF).execute_non_query
|
146
|
+
update widgets set release_date = NULL where id = 7
|
147
|
+
EOF
|
148
|
+
|
149
|
+
conn.create_command(<<-EOF).execute_non_query
|
150
|
+
update widgets set release_datetime = NULL where id = 8
|
151
|
+
EOF
|
152
|
+
|
153
|
+
conn.create_command(<<-EOF).execute_non_query
|
154
|
+
update widgets set release_timestamp = NULL where id = 9
|
155
|
+
EOF
|
156
|
+
|
128
157
|
conn.close
|
129
158
|
|
130
159
|
end
|
131
160
|
|
161
|
+
def self.test_environment_ssl_config
|
162
|
+
ssl_config = SSLHelpers::CONFIG
|
163
|
+
|
164
|
+
message = "\nYou can configure MySQL via my.cnf with the following options in [mysqld]:\n"
|
165
|
+
message << "ssl_ca=#{ssl_config.ca_cert}\n"
|
166
|
+
message << "ssl_cert=#{ssl_config.server_cert}\n"
|
167
|
+
message << "ssl_key=#{ssl_config.server_key}\n"
|
168
|
+
message << "ssl_cipher=#{ssl_config.cipher}\n"
|
169
|
+
|
170
|
+
message << "\nOr you can use the following command line options:\n"
|
171
|
+
message << "--ssl-ca #{ssl_config.ca_cert} "
|
172
|
+
message << "--ssl-cert #{ssl_config.server_cert} "
|
173
|
+
message << "--ssl-key #{ssl_config.server_key} "
|
174
|
+
message << "--ssl-cipher #{ssl_config.cipher} "
|
175
|
+
message
|
176
|
+
end
|
177
|
+
|
178
|
+
def self.test_environment_ssl_config_errors
|
179
|
+
conn = DataObjects::Connection.new(CONFIG.uri)
|
180
|
+
|
181
|
+
ssl_variables = conn.create_command(<<-EOF).execute_reader
|
182
|
+
SHOW VARIABLES LIKE '%ssl%'
|
183
|
+
EOF
|
184
|
+
|
185
|
+
ssl_config = SSLHelpers::CONFIG
|
186
|
+
current_config = { }
|
187
|
+
|
188
|
+
while ssl_variables.next!
|
189
|
+
variable, value = ssl_variables.values
|
190
|
+
current_config[variable.intern] = value
|
191
|
+
end
|
192
|
+
|
193
|
+
errors = []
|
194
|
+
|
195
|
+
if current_config[:have_ssl] == 'NO'
|
196
|
+
errors << "SSL was not compiled"
|
197
|
+
end
|
198
|
+
|
199
|
+
if current_config[:have_ssl] == 'DISABLED'
|
200
|
+
errors << "SSL was not enabled"
|
201
|
+
end
|
202
|
+
|
203
|
+
if current_config[:ssl_ca] != ssl_config.ca_cert
|
204
|
+
errors << "The CA certificate is not configured (it was set to '#{current_config[:ssl_ca]}')"
|
205
|
+
end
|
206
|
+
|
207
|
+
if current_config[:ssl_cert] != ssl_config.server_cert
|
208
|
+
errors << "The server certificate is not configured (it was set to '#{current_config[:ssl_cert]}')"
|
209
|
+
end
|
210
|
+
|
211
|
+
if current_config[:ssl_key] != ssl_config.server_key
|
212
|
+
errors << "The server key is not configured, (it was set to '#{current_config[:ssl_key]}')"
|
213
|
+
end
|
214
|
+
|
215
|
+
if current_config[:ssl_cipher] != ssl_config.cipher
|
216
|
+
errors << "The cipher is not configured, (it was set to '#{current_config[:ssl_cipher]}')"
|
217
|
+
end
|
218
|
+
|
219
|
+
errors
|
220
|
+
ensure
|
221
|
+
conn.close if conn
|
222
|
+
end
|
223
|
+
|
224
|
+
def self.test_environment_supports_ssl?
|
225
|
+
test_environment_ssl_config_errors.empty?
|
226
|
+
end
|
227
|
+
|
132
228
|
end
|
data/tasks/gem.rake
CHANGED
@@ -1,60 +1,8 @@
|
|
1
1
|
require 'rubygems/package_task'
|
2
2
|
|
3
|
-
GEM_SPEC =
|
4
|
-
# basic information
|
5
|
-
s.name = "do_mysql"
|
6
|
-
s.version = DataObjects::Mysql::VERSION
|
7
|
-
|
8
|
-
# description and details
|
9
|
-
s.summary = 'DataObjects MySQL Driver'
|
10
|
-
s.description = "Implements the DataObjects API for MySQL"
|
11
|
-
|
12
|
-
# dependencies
|
13
|
-
s.add_dependency "addressable", "~>2.0.0"
|
14
|
-
s.add_dependency "extlib", "~>0.9.12"
|
15
|
-
s.add_dependency "data_objects", DataObjects::Mysql::VERSION
|
16
|
-
|
17
|
-
if JRUBY
|
18
|
-
s.add_dependency "jdbc-mysql", ">=5.0.4"
|
19
|
-
s.add_dependency "do_jdbc", DataObjects::Mysql::VERSION
|
20
|
-
s.platform = "java"
|
21
|
-
# components, files and paths
|
22
|
-
s.files = FileList["lib/**/*.rb", "spec/**/*.rb", "tasks/**/*.rake",
|
23
|
-
"LICENSE", "Rakefile", "*.{rdoc,txt,yml}", "lib/*.jar"]
|
24
|
-
else
|
25
|
-
s.platform = Gem::Platform::RUBY
|
26
|
-
s.extensions << 'ext/do_mysql_ext/extconf.rb'
|
27
|
-
s.files = FileList["lib/**/*.rb", "spec/**/*.rb", "tasks/**/*.rake", "ext/**/*.{rb,c}",
|
28
|
-
"LICENSE", "Rakefile", "*.{rdoc,txt,yml}"]
|
29
|
-
end
|
30
|
-
|
31
|
-
|
32
|
-
# development dependencies
|
33
|
-
s.add_development_dependency 'rspec', '~>1.2.0'
|
34
|
-
|
35
|
-
s.require_path = 'lib'
|
36
|
-
|
37
|
-
# documentation
|
38
|
-
s.has_rdoc = false
|
39
|
-
|
40
|
-
# project information
|
41
|
-
s.homepage = 'http://github.com/datamapper/do'
|
42
|
-
s.rubyforge_project = 'dorb'
|
43
|
-
|
44
|
-
# author and contributors
|
45
|
-
s.author = 'Dirkjan Bussink'
|
46
|
-
s.email = 'd.bussink@gmail.com'
|
47
|
-
end
|
3
|
+
GEM_SPEC = eval(File.read('do_mysql.gemspec'))
|
48
4
|
|
49
5
|
gem_package = Gem::PackageTask.new(GEM_SPEC) do |pkg|
|
50
6
|
pkg.need_tar = false
|
51
7
|
pkg.need_zip = false
|
52
8
|
end
|
53
|
-
|
54
|
-
file "#{GEM_SPEC.name}.gemspec" => ['Rakefile', 'tasks/gem.rake'] do |t|
|
55
|
-
puts "Generating #{t.name}"
|
56
|
-
File.open(t.name, 'w') { |f| f.puts GEM_SPEC.to_yaml }
|
57
|
-
end
|
58
|
-
|
59
|
-
desc "Generate or update the standalone gemspec file for the project"
|
60
|
-
task :gemspec => ["#{GEM_SPEC.name}.gemspec"]
|