wyrm 0.3.3 → 0.4.0
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.
- 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 [](http://badge.fury.io/rb/wyrm)
|
1
|
+
# Wyrm [](http://badge.fury.io/rb/wyrm)
|
2
|
+
|
3
|
+
<!---
|
4
|
+
[](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
|