wyrm 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +2 -4
- data/Gemfile +3 -0
- data/History.txt +9 -1
- data/README.md +5 -1
- data/lib/wyrm/dump.rb +1 -3
- data/lib/wyrm/hole.rb +57 -72
- data/lib/wyrm/pump.rb +23 -17
- data/lib/wyrm/schema_tools.rb +1 -2
- data/lib/wyrm/version.rb +1 -1
- data/spec/core_extensions_spec.rb +1 -0
- data/spec/hole_mouth_spec.rb +8 -115
- data/spec/schema_tools_spec.rb +1 -1
- data/wyrm.gemspec +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85b0989b28233c55407b8c0277970f7b733235f1
|
4
|
+
data.tar.gz: d12c0b1ccf156bbc808cf302b2c2ad0ded122b52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 301e296b3108284415d4041773ecb45f92907128fc548886c79b63d7db14683d4fdf79ad4515cee5bf6122b6e5a0a66528e716e29a779c56b1e3a72f01158bf2
|
7
|
+
data.tar.gz: 14084646f239d950c8def8056fc7cc9ea54a458dccbd04384ebeee68bf6103f4f881f84ef1aa44fd56cd24839aeb73e31e8bd617091a3a0b88602fff7bfb898d
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.3
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/History.txt
CHANGED
@@ -1,5 +1,13 @@
|
|
1
|
+
== 0.4.0
|
2
|
+
* Update for released ruby-2.3 Queue#close
|
3
|
+
* use &. instead of andand
|
4
|
+
* minor tweaks to Pump#inner_dump and Pump#primary_keys
|
5
|
+
* pry-debundle for development
|
6
|
+
|
7
|
+
== 0.4.0.pre
|
8
|
+
* Use ruby-2.3 Queue#close
|
9
|
+
|
1
10
|
== 0.3.3
|
2
11
|
* minor fix when src/dst directory not found
|
3
|
-
|
4
12
|
== 0.3.2
|
5
13
|
* update for >=sequel-4.10.0 internal syntax (Dataset#clause_sql removed)
|
data/README.md
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
-
# Wyrm [![Gem Version](https://badge.fury.io/rb/wyrm.png)](http://badge.fury.io/rb/wyrm)
|
1
|
+
# Wyrm [![Gem Version](https://badge.fury.io/rb/wyrm.png)](http://badge.fury.io/rb/wyrm)
|
2
|
+
|
3
|
+
<!---
|
4
|
+
[![Build Status](https://travis-ci.org/djellemah/wyrm.png?branch=master)](https://travis-ci.org/djellemah/wyrm)
|
5
|
+
-->
|
2
6
|
|
3
7
|
Transfer a database from one rdbms to another (eg mysql to postgres). Either via
|
4
8
|
a set of files, or direct from one db server to another.
|
data/lib/wyrm/dump.rb
CHANGED
data/lib/wyrm/hole.rb
CHANGED
@@ -14,84 +14,71 @@ module Wyrm
|
|
14
14
|
include PumpMaker
|
15
15
|
include Logger
|
16
16
|
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
-
class Mouth
|
21
|
-
include Logger
|
22
|
-
|
23
|
-
def initialize
|
24
|
-
@flushed = false
|
25
|
-
end
|
26
|
-
|
27
|
-
# This is a bit weird because io_queue will usually == self
|
28
|
-
def encode( obj, io_queue )
|
17
|
+
# stateless module methods
|
18
|
+
module QueueCodec
|
19
|
+
def self.encode( obj, io_queue )
|
29
20
|
io_queue.enq obj
|
30
21
|
end
|
31
22
|
|
32
|
-
|
33
|
-
def decode( io_queue, &block )
|
23
|
+
def self.decode( io_queue, &block )
|
34
24
|
obj = io_queue.deq
|
35
25
|
yield obj if block_given?
|
36
26
|
obj
|
37
27
|
end
|
28
|
+
end
|
38
29
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
30
|
+
# This pretends to be just enough of an IO that we can use a queue to
|
31
|
+
# connect a dump to a restore.
|
32
|
+
#
|
33
|
+
# Named for the mouth of a wormhole. Cos finding a good name for it is hard.
|
34
|
+
class Mouth
|
35
|
+
DEFAULT_QUEUE_SIZE = 5000
|
43
36
|
|
44
|
-
|
45
|
-
|
37
|
+
def initialize( queue_size: DEFAULT_QUEUE_SIZE)
|
38
|
+
raise '>= ruby-2.3.0 needed because we use Queue#close' if RUBY_VERSION < '2.3.0'
|
39
|
+
@queue_size = queue_size
|
46
40
|
end
|
47
41
|
|
48
|
-
|
49
|
-
#
|
50
|
-
def
|
51
|
-
|
52
|
-
|
42
|
+
#############
|
43
|
+
# interface for Hole
|
44
|
+
def reset
|
45
|
+
if @queue
|
46
|
+
@queue.close.clear
|
47
|
+
@queue = nil
|
48
|
+
end
|
53
49
|
end
|
54
50
|
|
51
|
+
# queue could be empty while producer is generating something,
|
55
52
|
# use a SizedQueue so we don't run out of memory during a big transfer
|
56
53
|
def queue
|
57
|
-
@queue ||=
|
58
|
-
if RUBY_VERSION == '2.1.0'
|
59
|
-
raise "Queue broken in 2.1.0 possibly related to https://bugs.ruby-lang.org/issues/9302"
|
60
|
-
else
|
61
|
-
SizedQueue.new 5000
|
62
|
-
end
|
54
|
+
@queue ||= SizedQueue.new @queue_size
|
63
55
|
end
|
64
56
|
|
65
|
-
|
66
|
-
|
67
|
-
end
|
57
|
+
##########
|
58
|
+
# interface for codec
|
59
|
+
def enq( value ); queue.enq value end
|
68
60
|
|
69
|
-
def deq
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end
|
75
|
-
rv
|
61
|
+
def deq
|
62
|
+
queue.deq or raise StopIteration
|
63
|
+
rescue StopIteration
|
64
|
+
raise "nil from deq, but queue not empty" unless queue.empty?
|
65
|
+
raise
|
76
66
|
end
|
77
67
|
|
78
|
-
|
79
|
-
|
80
|
-
queue << :poison if queue.empty? && queue.num_waiting > 0
|
81
|
-
end
|
68
|
+
##############
|
69
|
+
# interface for Pump
|
82
70
|
|
83
|
-
#
|
84
|
-
def
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
poison_queue
|
89
|
-
end
|
71
|
+
# eof after flush has been called and queue is empty.
|
72
|
+
def eof?; queue.closed? && queue.empty? end
|
73
|
+
|
74
|
+
# this gets called by pump after dump is finished
|
75
|
+
def flush; queue.close end
|
90
76
|
end
|
91
77
|
|
92
|
-
def initialize( src_db, dst_db, drop_tables: true, queue_size:
|
78
|
+
def initialize( src_db, dst_db, drop_tables: true, queue_size: Mouth::DEFAULT_QUEUE_SIZE )
|
93
79
|
# called only once per run, so not really a performance issue
|
94
|
-
@
|
80
|
+
@drop_tables = drop_tables
|
81
|
+
@queue_size = queue_size
|
95
82
|
|
96
83
|
@src_db = maybe_deebe src_db
|
97
84
|
@dst_db = maybe_deebe dst_db
|
@@ -99,22 +86,26 @@ module Wyrm
|
|
99
86
|
@src_db.extension :schema_dumper
|
100
87
|
end
|
101
88
|
|
102
|
-
attr_reader :src_db, :dst_db, :options
|
89
|
+
attr_reader :src_db, :dst_db, :options, :queue_size
|
90
|
+
def drop_tables?; @drop_tables end
|
103
91
|
|
104
92
|
def mouth
|
105
|
-
@mouth ||= Mouth.new
|
93
|
+
@mouth ||= Mouth.new queue_size: queue_size
|
94
|
+
end
|
95
|
+
|
96
|
+
def pump_options
|
97
|
+
{io: mouth, codec: QueueCodec, logger: logger}
|
106
98
|
end
|
107
99
|
|
108
100
|
def src_pump
|
109
|
-
@src_pump ||= Pump.new
|
101
|
+
@src_pump ||= Pump.new db: src_db, **pump_options
|
110
102
|
end
|
111
103
|
|
112
104
|
def dst_pump
|
113
|
-
@dst_pump ||= Pump.new
|
105
|
+
@dst_pump ||= Pump.new db: dst_db, **pump_options
|
114
106
|
end
|
115
107
|
|
116
108
|
def transfer_table( table_name )
|
117
|
-
mouth.reset
|
118
109
|
src_pump.table_name = dst_pump.table_name = table_name
|
119
110
|
|
120
111
|
if src_pump.table_dataset.empty?
|
@@ -128,36 +119,30 @@ module Wyrm
|
|
128
119
|
|
129
120
|
send_thread.join
|
130
121
|
recv_thread.join
|
122
|
+
ensure
|
123
|
+
mouth.reset
|
124
|
+
src_pump.table_name = dst_pump.table_name = nil
|
131
125
|
end
|
132
126
|
|
133
127
|
include SchemaTools
|
134
128
|
|
135
129
|
def transfer_schema( &transfer_table_block )
|
136
130
|
create_tables
|
137
|
-
|
138
|
-
# transfer tables here
|
139
|
-
yield self if block_given?
|
140
|
-
|
131
|
+
yield self if block_given? # transfer tables here
|
141
132
|
create_indexes
|
142
133
|
end
|
143
134
|
|
144
135
|
def transfer_tables
|
145
136
|
logger.info "transferring tables"
|
146
|
-
src_db.tables.each
|
147
|
-
transfer_table table_name
|
148
|
-
end
|
137
|
+
src_db.tables.each {|table_name| transfer_table table_name }
|
149
138
|
end
|
150
139
|
|
151
140
|
def call
|
152
|
-
if
|
141
|
+
if drop_tables?
|
153
142
|
logger.info "dropping tables"
|
154
143
|
drop_tables src_db.tables
|
155
144
|
end
|
156
|
-
|
157
|
-
transfer_schema do
|
158
|
-
transfer_tables
|
159
|
-
end
|
145
|
+
transfer_schema { transfer_tables }
|
160
146
|
end
|
161
|
-
|
162
147
|
end
|
163
148
|
end
|
data/lib/wyrm/pump.rb
CHANGED
@@ -26,7 +26,7 @@ class Wyrm::Pump
|
|
26
26
|
attr_accessor :io, :page_size, :dry_run
|
27
27
|
def dry_run?; dry_run; end
|
28
28
|
|
29
|
-
# These
|
29
|
+
# These are affected by cached values
|
30
30
|
attr_reader :db, :table_name
|
31
31
|
|
32
32
|
def invalidate_cached_members
|
@@ -113,7 +113,8 @@ class Wyrm::Pump
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def primary_keys
|
116
|
-
|
116
|
+
# each_with_object([]){...} is only faster for < 3 items in 100000
|
117
|
+
@primary_keys ||= db.schema(table_name).map{|name,column_info| name if column_info[:primary_key]}.compact
|
117
118
|
end
|
118
119
|
|
119
120
|
def table_dataset
|
@@ -124,8 +125,8 @@ class Wyrm::Pump
|
|
124
125
|
def paginated_dump( &encode_block )
|
125
126
|
records_count = 0
|
126
127
|
table_dataset.order(*primary_keys).each_page(page_size) do |page|
|
127
|
-
logger.info
|
128
|
-
logger.debug
|
128
|
+
logger.info "#{__method__} #{table_name} #{records_count}"
|
129
|
+
logger.debug page.sql
|
129
130
|
page.each &encode_block
|
130
131
|
records_count += page_size
|
131
132
|
end
|
@@ -142,11 +143,12 @@ class Wyrm::Pump
|
|
142
143
|
# http://www.numerati.com/2012/06/26/reading-large-result-sets-with-hibernate-and-mysql/
|
143
144
|
def inner_dump( &encode_block )
|
144
145
|
# could possibly overrride Dataset#paginate(page_no, page_size, record_count=nil)
|
145
|
-
|
146
|
+
on_conditions = primary_keys.map{|f| [f,f]}.to_h
|
147
|
+
(0..table_dataset.count).step(page_size).each do |offset|
|
146
148
|
limit_dataset = table_dataset.select( *primary_keys ).limit( page_size, offset ).order( *primary_keys )
|
147
|
-
page = table_dataset.join( limit_dataset,
|
148
|
-
logger.info
|
149
|
-
logger.debug
|
149
|
+
page = table_dataset.join( limit_dataset, on_conditions ).order( *primary_keys ).qualify(table_name)
|
150
|
+
logger.info "#{__method__} #{table_name} #{offset}"
|
151
|
+
logger.debug page.sql
|
150
152
|
page.each &encode_block
|
151
153
|
end
|
152
154
|
end
|
@@ -164,14 +166,14 @@ class Wyrm::Pump
|
|
164
166
|
# bigger than max for the last page
|
165
167
|
(min..max).step(page_size).each do |offset|
|
166
168
|
page = table_dataset.where( id: offset...(offset + page_size) )
|
167
|
-
logger.info
|
168
|
-
logger.debug
|
169
|
+
logger.info "#{__method__} #{table_name} #{offset}"
|
170
|
+
logger.debug page.sql
|
169
171
|
page.each &encode_block
|
170
172
|
end
|
171
173
|
end
|
172
174
|
|
173
175
|
def stream_dump( &encode_block )
|
174
|
-
logger.
|
176
|
+
logger.info "using result set streaming"
|
175
177
|
|
176
178
|
# I want to output progress every page_size records,
|
177
179
|
# without doing a records_count % page_size every iteration.
|
@@ -186,8 +188,8 @@ class Wyrm::Pump
|
|
186
188
|
records_count += 1
|
187
189
|
end
|
188
190
|
ensure
|
189
|
-
logger.info
|
190
|
-
logger.debug
|
191
|
+
logger.info "#{__method__} #{table_name} #{records_count}" if records_count < page_size
|
192
|
+
logger.debug " #{records_count} from #{table_dataset.sql}"
|
191
193
|
end
|
192
194
|
end
|
193
195
|
end
|
@@ -218,10 +220,13 @@ class Wyrm::Pump
|
|
218
220
|
case
|
219
221
|
when table_dataset.respond_to?( :stream )
|
220
222
|
stream_dump &encode_block
|
223
|
+
|
221
224
|
when primary_keys.empty?
|
222
225
|
paginated_dump &encode_block
|
226
|
+
|
223
227
|
when primary_keys.all?{|i| i == :id }
|
224
228
|
min_max_dump &encode_block
|
229
|
+
|
225
230
|
else
|
226
231
|
inner_dump &encode_block
|
227
232
|
end
|
@@ -235,20 +240,21 @@ class Wyrm::Pump
|
|
235
240
|
false
|
236
241
|
end
|
237
242
|
|
243
|
+
# start_row is zero-based
|
244
|
+
#
|
238
245
|
# TODO don't generate the full insert, ie leave out the fields
|
239
246
|
# because we've already checked that the columns and the table
|
240
247
|
# match.
|
241
248
|
# TODO generate column names in insert, they might still work
|
242
249
|
# if columns have been added to the db, but not the dump.
|
243
|
-
# start_row is zero-based
|
244
250
|
def restore( start_row: 0, filename: 'io' )
|
245
251
|
columns = table_dataset.columns
|
246
252
|
row_enum = each_row
|
247
253
|
|
248
254
|
return unless dump_matches_columns?( row_enum, columns )
|
249
255
|
|
250
|
-
logger.info
|
251
|
-
logger.debug
|
256
|
+
logger.info "#{__method__} inserting to #{table_name} from #{start_row}"
|
257
|
+
logger.debug " #{columns.inspect}"
|
252
258
|
rows_restored = 0
|
253
259
|
|
254
260
|
if start_row != 0
|
@@ -283,7 +289,7 @@ class Wyrm::Pump
|
|
283
289
|
end
|
284
290
|
end
|
285
291
|
end
|
286
|
-
logger.info
|
292
|
+
logger.info "#{__method__} #{table_name} done. Inserted #{rows_restored}."
|
287
293
|
rows_restored
|
288
294
|
end
|
289
295
|
|
data/lib/wyrm/schema_tools.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'fastandand'
|
2
1
|
Sequel.extension :migration
|
3
2
|
require 'wyrm/module'
|
4
3
|
|
@@ -8,7 +7,7 @@ require 'wyrm/module'
|
|
8
7
|
module Wyrm::SchemaTools
|
9
8
|
# some includers will need to provide a different implementation for this.
|
10
9
|
def same_db
|
11
|
-
respond_to?( :dst_db ) && respond_to?( :src_db ) && dst_db
|
10
|
+
respond_to?( :dst_db ) && respond_to?( :src_db ) && dst_db&.database_type == src_db&.database_type
|
12
11
|
end
|
13
12
|
|
14
13
|
def schema_migration
|
data/lib/wyrm/version.rb
CHANGED
data/spec/hole_mouth_spec.rb
CHANGED
@@ -1,74 +1,26 @@
|
|
1
1
|
require 'rspec_syntax'
|
2
|
+
require 'pathname'
|
2
3
|
|
3
4
|
require Pathname(__dir__) + '../lib/wyrm/hole.rb'
|
4
5
|
|
5
6
|
describe Wyrm::Hole::Mouth do
|
6
|
-
if RUBY_VERSION == '2.1.0'
|
7
|
-
it 'Queue broken on 2.1.0'
|
8
|
-
else
|
9
7
|
describe '#flush' do
|
10
|
-
it '
|
11
|
-
subject.should_receive(:poison_queue)
|
8
|
+
it 'closes the queue' do
|
12
9
|
subject.flush
|
13
|
-
|
14
|
-
|
15
|
-
it 'sets flag' do
|
16
|
-
subject.instance_variable_get('@flushed').should_not == true
|
17
|
-
subject.flush
|
18
|
-
subject.instance_variable_get('@flushed').should == true
|
19
|
-
end
|
20
|
-
|
21
|
-
describe 'queue empty with waiters' do
|
22
|
-
THREADS = rand(1..7)
|
23
|
-
def waiters
|
24
|
-
@waiters ||= THREADS.times.map do
|
25
|
-
Thread.new do
|
26
|
-
values = []
|
27
|
-
begin
|
28
|
-
until subject.eof?
|
29
|
-
values << subject.deq
|
30
|
-
sleep( rand * 0.05 )
|
31
|
-
end
|
32
|
-
[:eoffed, values]
|
33
|
-
rescue StopIteration
|
34
|
-
[:poisoned, values]
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'poisons queue' do
|
41
|
-
waiters
|
42
|
-
# wait for thread setup to finish
|
43
|
-
sleep 0.1
|
44
|
-
subject.flush
|
45
|
-
thread_values = waiters.map {|waiter| waiter.join(4).andand.value }
|
46
|
-
thread_values.map(&:first).should == THREADS.times.map{:poisoned}
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'eof queue' do
|
50
|
-
50.times{subject.enq 'hello'}
|
51
|
-
waiters
|
52
|
-
subject.flush
|
53
|
-
thread_values = waiters.map {|waiter| waiter.join(4).andand.value }
|
54
|
-
thread_values.map(&:first).should == THREADS.times.map{:eoffed}
|
55
|
-
end
|
10
|
+
subject.queue.should be_closed
|
56
11
|
end
|
57
12
|
end
|
58
13
|
|
59
14
|
describe '#eof?' do
|
60
15
|
describe 'flushed' do
|
61
|
-
|
16
|
+
it 'true when queue empty and closed' do
|
62
17
|
subject.flush
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'true when queue empty' do
|
66
18
|
subject.queue.should be_empty
|
19
|
+
subject.queue.should be_closed
|
67
20
|
subject.should be_eof
|
68
21
|
end
|
69
22
|
|
70
|
-
it 'false when queue empty' do
|
71
|
-
subject.enq( :arg )
|
23
|
+
it 'false when queue open but empty' do
|
72
24
|
subject.should_not be_eof
|
73
25
|
end
|
74
26
|
end
|
@@ -87,12 +39,6 @@ else
|
|
87
39
|
end
|
88
40
|
|
89
41
|
describe '#reset' do
|
90
|
-
it 'resets flushed' do
|
91
|
-
subject.instance_variable_set '@flushed', true
|
92
|
-
subject.reset
|
93
|
-
subject.instance_variable_get('@flushed').should == false
|
94
|
-
end
|
95
|
-
|
96
42
|
it 'clears queue' do
|
97
43
|
rand(1..10).times{subject.enq :some_value}
|
98
44
|
subject.queue.should_not be_empty
|
@@ -117,63 +63,10 @@ else
|
|
117
63
|
th.status.should == false
|
118
64
|
end
|
119
65
|
|
120
|
-
it '
|
121
|
-
subject.queue.should be_empty
|
122
|
-
waiter = Thread.new { subject.deq }
|
123
|
-
sleep(0.01) while subject.queue.num_waiting != 1
|
124
|
-
subject.poison_queue
|
125
|
-
|
126
|
-
# this is so cool. Thread#value will re-raise the exception it caught
|
127
|
-
->{waiter.value}.should raise_error(StopIteration)
|
128
|
-
|
129
|
-
# queue should be empty now
|
66
|
+
it 'raises StopIteration for closed queue' do
|
130
67
|
subject.queue.should be_empty
|
131
|
-
|
132
|
-
|
133
|
-
it 're-queues poison' do
|
134
|
-
subject.queue << :poison
|
135
|
-
subject.should_receive(:poison_queue)
|
68
|
+
subject.flush
|
136
69
|
->{subject.deq}.should raise_error(StopIteration)
|
137
70
|
end
|
138
71
|
end
|
139
|
-
|
140
|
-
describe '#poison_queue' do
|
141
|
-
it 'poisons when queue empty with waiters' do
|
142
|
-
subject.queue.should be_empty
|
143
|
-
|
144
|
-
# there has to be a thread waiting for the poison to be added
|
145
|
-
waiter = Thread.new { subject.queue.deq }
|
146
|
-
sleep(0.01) while subject.queue.num_waiting != 1
|
147
|
-
subject.poison_queue
|
148
|
-
|
149
|
-
waiter.value.should == :poison
|
150
|
-
|
151
|
-
# queue should be empty now
|
152
|
-
subject.queue.should be_empty
|
153
|
-
end
|
154
|
-
|
155
|
-
it 'no poison when queue empty' do
|
156
|
-
subject.queue.should be_empty
|
157
|
-
subject.poison_queue
|
158
|
-
subject.queue.should be_empty
|
159
|
-
end
|
160
|
-
|
161
|
-
it 'no poison for no waiters' do
|
162
|
-
subject.queue << :hello
|
163
|
-
subject.queue << :there
|
164
|
-
subject.poison_queue
|
165
|
-
subject.queue.size.should == 2
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
describe '#logger' do
|
170
|
-
# this is here because the 2.1.0 without SizeQueue branch
|
171
|
-
# has a logger which nothing else uses
|
172
|
-
it 'works' do
|
173
|
-
Wyrm::Hole::Mouth::RUBY_VERSION = '2.1.0'
|
174
|
-
->{subject.queue}.should raise_error(/broken in 2.1.0/)
|
175
|
-
Wyrm::Hole::Mouth.send :remove_const, :RUBY_VERSION
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end #unless RUBY_VERSION == '2.1.0'
|
179
72
|
end
|
data/spec/schema_tools_spec.rb
CHANGED
data/wyrm.gemspec
CHANGED
@@ -20,9 +20,9 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
# need this version because clause_sql was moved to _insert_sql, used by pump
|
22
22
|
spec.add_runtime_dependency 'sequel', '>= 4.10.0'
|
23
|
-
spec.add_runtime_dependency "fastandand"
|
24
23
|
|
25
24
|
spec.add_development_dependency "pry"
|
25
|
+
spec.add_development_dependency "pry-debundle"
|
26
26
|
spec.add_development_dependency "pry-byebug"
|
27
27
|
spec.add_development_dependency "bundler", ">= 1.3"
|
28
28
|
spec.add_development_dependency "rake"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wyrm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Anderson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|
@@ -25,13 +25,13 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 4.10.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: pry
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
|
-
type: :
|
34
|
+
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name: pry
|
42
|
+
name: pry-debundle
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -210,7 +210,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
210
210
|
version: '0'
|
211
211
|
requirements: []
|
212
212
|
rubyforge_project:
|
213
|
-
rubygems_version: 2.
|
213
|
+
rubygems_version: 2.5.1
|
214
214
|
signing_key:
|
215
215
|
specification_version: 4
|
216
216
|
summary: Transfer from one SQL rdbms to another
|