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 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