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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c62a5cbc1df1fd2ae5e73af5674a321ae2c04113
4
- data.tar.gz: 8e421d58a2cfdb36ab433fccbc5820464318e84b
3
+ metadata.gz: 85b0989b28233c55407b8c0277970f7b733235f1
4
+ data.tar.gz: d12c0b1ccf156bbc808cf302b2c2ad0ded122b52
5
5
  SHA512:
6
- metadata.gz: affd20c4d8423cb9ee3c20d96bf43bfa2de7fc009f2a4fc431828bf2fb08e05fb53b756754887ab6de6acae5cce92955fc59702be131b59f1434e93b409fa73e
7
- data.tar.gz: e69e16c69c53ba23d2bacce42b5c000b3271076aef00ffa4f5ca32d708cb9f6fd46894412f369bbf6fb321d84a5d1fc02d1262d3f3f70dc6f2720fb8079f1202
6
+ metadata.gz: 301e296b3108284415d4041773ecb45f92907128fc548886c79b63d7db14683d4fdf79ad4515cee5bf6122b6e5a0a66528e716e29a779c56b1e3a72f01158bf2
7
+ data.tar.gz: 14084646f239d950c8def8056fc7cc9ea54a458dccbd04384ebeee68bf6103f4f881f84ef1aa44fd56cd24839aeb73e31e8bd617091a3a0b88602fff7bfb898d
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.1
1
+ ruby-2.3
data/.travis.yml CHANGED
@@ -1,6 +1,4 @@
1
1
  language: ruby
2
- rvm:
3
- - 2.0.0
4
- - 2.1.7
5
- - 2.2.3
2
+ rvm: []
3
+ # - 2.3 not supported as of 16-Mar-2016. srsly, 3 months after release
6
4
  script: bundle exec rspec spec
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
+ raise "You need >= ruby-2.3 (or maybe a Queue with close would work)" unless RUBY_VERSION >= '2.3.0'
2
+
3
+ # TODO this is for older versions of bundler
1
4
  def from_gemrc
2
5
  # auto-load from ~/.gemrc
3
6
  home_gemrc = Pathname('~/.gemrc').expand_path
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) [![Build Status](https://travis-ci.org/djellemah/wyrm.png?branch=master)](https://travis-ci.org/djellemah/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
@@ -27,9 +27,7 @@ class Wyrm::Dump
27
27
 
28
28
  attr_reader :src_db, :container, :pump
29
29
 
30
- def same_db
31
- false
32
- end
30
+ def same_db; false end
33
31
 
34
32
  def numbering
35
33
  @numbering ||= '000'
data/lib/wyrm/hole.rb CHANGED
@@ -14,84 +14,71 @@ module Wyrm
14
14
  include PumpMaker
15
15
  include Logger
16
16
 
17
- # This is the codec. Named for the mouth of a wormhole. Cos finding a good name for this is hard.
18
- #
19
- # Connects the two pumps together. Implements Codec, Quacks like IO.
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
- # This is a bit weird because io_queue will usually == self
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
- def reset
40
- # do this first, so any (hopefully not) remaining waiters don't
41
- # go into the blocking deq again.
42
- @flushed = false
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
- # clear any poisons, and release any (hopefully not) remaining waiters
45
- queue.clear
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
- # queue could be empty while producer is generating something,
49
- # so only eof after flush has been called.
50
- def eof?
51
- # queue is not empty if it's been poisoned.
52
- @flushed && queue.empty?
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
- def enq( value )
66
- queue.enq value
67
- end
57
+ ##########
58
+ # interface for codec
59
+ def enq( value ); queue.enq value end
68
60
 
69
- def deq( *args )
70
- rv = queue.deq( *args )
71
- if rv == :poison
72
- poison_queue
73
- raise StopIteration
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
- def poison_queue
79
- # poison the queue. waiters will have to re-queue this.
80
- queue << :poison if queue.empty? && queue.num_waiting > 0
81
- end
68
+ ##############
69
+ # interface for Pump
82
70
 
83
- # this gets called after dump is finished, by pump
84
- def flush
85
- # do this first, so any non-poisoned waiters will eof
86
- # synchronisation is not really important because
87
- @flushed = true
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: 5000 )
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
- @options = method(__method__).kwargs_as_hash( binding )
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( {db: src_db, io: mouth, codec: mouth, logger: logger}.merge( options[:pump] ||{} ) )
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( {db: dst_db, io: mouth, codec: mouth, logger: logger}.merge( options[:pump] ||{} ) )
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 do |table_name|
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 options[:drop_tables]
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 affect cached values
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
- @primary_keys ||= db.schema(table_name).select{|df| df.last[:primary_key]}.map{|df| df.first}
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{ "#{__method__} #{table_name} #{records_count}" }
128
- logger.debug{ page.sql }
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
- 0.step(table_dataset.count, page_size).each do |offset|
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, Hash[ primary_keys.map{|f| [f,f]} ] ).order( *primary_keys ).qualify(table_name)
148
- logger.info{ "#{__method__} #{table_name} #{offset}" }
149
- logger.debug{ page.sql }
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{ "#{__method__} #{table_name} #{offset}" }
168
- logger.debug{ page.sql }
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.debug{ "using result set streaming" }
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{ "#{__method__} #{table_name} #{records_count}" if records_count < page_size }
190
- logger.debug{ " from #{table_dataset.sql}" }
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{ "#{__method__} inserting to #{table_name} from #{start_row}" }
251
- logger.debug{ " #{columns.inspect}" }
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{ "#{__method__} #{table_name} done. Inserted #{rows_restored}." }
292
+ logger.info "#{__method__} #{table_name} done. Inserted #{rows_restored}."
287
293
  rows_restored
288
294
  end
289
295
 
@@ -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.andand.database_type == src_db.andand.database_type
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
@@ -1,3 +1,3 @@
1
1
  module Wyrm
2
- VERSION = "0.3.3"
2
+ VERSION = '0.4.0'
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require 'rspec_syntax'
2
+ require 'pathname'
2
3
 
3
4
  require Pathname(__dir__) + '../lib/wyrm/core_extensions.rb'
4
5
 
@@ -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 'calls poison_queue' do
11
- subject.should_receive(:poison_queue)
8
+ it 'closes the queue' do
12
9
  subject.flush
13
- end
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
- before :each do
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 'raise StopIteration on poison' do
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
- end
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
@@ -22,7 +22,7 @@ describe SchemaTools do
22
22
  lgr
23
23
  end
24
24
  def initialize( src_db, dst_db )
25
- @src_db = src_db.andand.extension :schema_dumper
25
+ @src_db = src_db&.extension :schema_dumper
26
26
  @dst_db = dst_db
27
27
  end
28
28
  attr_reader :src_db, :dst_db
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.3.3
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: 2015-09-02 00:00:00.000000000 Z
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: fastandand
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: :runtime
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.4.8
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