tapsoob 0.8.1 → 0.8.3
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/lib/tapsoob/cli/root.rb +2 -0
- data/lib/tapsoob/operation/push.rb +2 -1
- data/lib/tapsoob/schema.rb +4 -0
- data/lib/tapsoob/utils.rb +2 -2
- data/lib/tapsoob/version.rb +1 -1
- data/spec/integration/sqlite_spec.rb +31 -0
- data/tapsoob.gemspec +5 -5
- metadata +10 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5a0fdb4596821c1247ddc3e3c8530389f4bea8f5fb9de06b26ed6a2c2b454e69
|
|
4
|
+
data.tar.gz: 1b915563ac7c12021087409945d1b1ad0f451ce2f55d16ad2783cc45dd8b0e22
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bd6289dc4bc12fc2fefe130e31343eada9f335bc4374acd51a0d83fa755f01cfa4fd394b62f111e61c1594b069594b6e08ccf4383138dc1114eda044ed456ee7
|
|
7
|
+
data.tar.gz: 955346a7e225032bf46429e878332757b0860f480ed07bab065d03634dedcb9fe54236beefe3a5f931ae3f8547aff4db322900b17ea75a8fd6e453b87a174424
|
data/lib/tapsoob/cli/root.rb
CHANGED
|
@@ -47,6 +47,7 @@ module Tapsoob
|
|
|
47
47
|
option :tables, desc: "Shortcut to filter on a list of tables", type: :array, aliases: "-t"
|
|
48
48
|
option :"exclude-tables", desc: "Shortcut to exclude a list of tables", type: :array, aliases: "-e"
|
|
49
49
|
option :purge, desc: "Purge data in tables prior to performing the import", default: false, type: :boolean, aliases: "-p"
|
|
50
|
+
option :"drop-tables", desc: "Drop tables before pushing the schema (implies --schema)", default: false, type: :boolean
|
|
50
51
|
option :"skip-duplicates", desc: "Remove duplicates when loading data", default: false, type: :boolean
|
|
51
52
|
option :"discard-identity", desc: "Remove identity when pushing data (may result in creating duplicates)", default: false, type: :boolean
|
|
52
53
|
option :parallel, desc: "Number of parallel workers for table processing (default: 1)", default: 1, type: :numeric, aliases: "-j"
|
|
@@ -97,6 +98,7 @@ module Tapsoob
|
|
|
97
98
|
|
|
98
99
|
# Push only options
|
|
99
100
|
opts[:purge] = options[:purge] if options.key?(:purge)
|
|
101
|
+
opts[:"drop-tables"] = options[:"drop-tables"] if options.key?(:"drop-tables")
|
|
100
102
|
opts[:"skip-duplicates"] = options[:"skip-duplicates"] if options.key?(:"skip-duplicates")
|
|
101
103
|
opts[:"discard-identity"] = options[:"discard-identity"] if options.key?(:"discard-identity")
|
|
102
104
|
|
|
@@ -71,11 +71,12 @@ module Tapsoob
|
|
|
71
71
|
log.info "Sending schema"
|
|
72
72
|
Tapsoob::ProgressEvent.schema_start(tables.size)
|
|
73
73
|
|
|
74
|
+
schema_opts = { drop: opts[:"drop-tables"] || false }
|
|
74
75
|
progress = opts[:progress] ? Tapsoob::Progress::Bar.new('Schema', tables.size) : nil
|
|
75
76
|
tables.each do |table, count|
|
|
76
77
|
log.debug "Loading '#{table}' schema\n"
|
|
77
78
|
# Reuse existing db connection for better performance
|
|
78
|
-
Tapsoob::Utils.load_schema(dump_path, db, table)
|
|
79
|
+
Tapsoob::Utils.load_schema(dump_path, db, table, schema_opts)
|
|
79
80
|
progress.inc(1) if progress
|
|
80
81
|
end
|
|
81
82
|
progress.finish if progress
|
data/lib/tapsoob/schema.rb
CHANGED
|
@@ -112,12 +112,14 @@ END_MIG
|
|
|
112
112
|
if options[:drop]
|
|
113
113
|
# Start special hack for MySQL
|
|
114
114
|
db.run("SET foreign_key_checks = 0") if [:mysql, :mysql2].include?(db.adapter_scheme)
|
|
115
|
+
db.run("PRAGMA foreign_keys = OFF") if db.adapter_scheme == :sqlite
|
|
115
116
|
|
|
116
117
|
# Run down migration
|
|
117
118
|
klass.apply(db, :down)
|
|
118
119
|
|
|
119
120
|
# End special hack for MySQL
|
|
120
121
|
db.run("SET foreign_key_checks = 1") if [:mysql, :mysql2].include?(db.adapter_scheme)
|
|
122
|
+
db.run("PRAGMA foreign_keys = ON") if db.adapter_scheme == :sqlite
|
|
121
123
|
end
|
|
122
124
|
klass.apply(db, :up)
|
|
123
125
|
else
|
|
@@ -127,12 +129,14 @@ END_MIG
|
|
|
127
129
|
if options[:drop]
|
|
128
130
|
# Start special hack for MySQL
|
|
129
131
|
db.run("SET foreign_key_checks = 0") if [:mysql, :mysql2].include?(db.adapter_scheme)
|
|
132
|
+
db.run("PRAGMA foreign_keys = OFF") if db.adapter_scheme == :sqlite
|
|
130
133
|
|
|
131
134
|
# Run down migration
|
|
132
135
|
klass.apply(db, :down)
|
|
133
136
|
|
|
134
137
|
# End special hack for MySQL
|
|
135
138
|
db.run("SET foreign_key_checks = 1") if [:mysql, :mysql2].include?(db.adapter_scheme)
|
|
139
|
+
db.run("PRAGMA foreign_keys = ON") if db.adapter_scheme == :sqlite
|
|
136
140
|
end
|
|
137
141
|
klass.apply(db, :up)
|
|
138
142
|
end
|
data/lib/tapsoob/utils.rb
CHANGED
|
@@ -174,13 +174,13 @@ Data : #{data}
|
|
|
174
174
|
end
|
|
175
175
|
end
|
|
176
176
|
|
|
177
|
-
def load_schema(dump_path, database_url_or_db, table)
|
|
177
|
+
def load_schema(dump_path, database_url_or_db, table, options = {})
|
|
178
178
|
schema_file = File.join(dump_path, "schemas", "#{table}.rb")
|
|
179
179
|
schema_content = File.read(schema_file)
|
|
180
180
|
|
|
181
181
|
# If we have a connection object, use it directly for better performance
|
|
182
182
|
if database_url_or_db.is_a?(Sequel::Database)
|
|
183
|
-
Tapsoob::Schema.load(database_url_or_db, schema_content)
|
|
183
|
+
Tapsoob::Schema.load(database_url_or_db, schema_content, options)
|
|
184
184
|
else
|
|
185
185
|
schema_bin(:load, database_url_or_db, schema_file)
|
|
186
186
|
end
|
data/lib/tapsoob/version.rb
CHANGED
|
@@ -79,6 +79,37 @@ RSpec.describe 'SQLite round-trip', :integration do
|
|
|
79
79
|
end
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
+
context 'with --drop-tables' do
|
|
83
|
+
let(:drop_dir) { Dir.mktmpdir }
|
|
84
|
+
after { FileUtils.rm_rf(drop_dir) }
|
|
85
|
+
|
|
86
|
+
it 'succeeds when destination tables already exist' do
|
|
87
|
+
pull(src_url, drop_dir)
|
|
88
|
+
push(dst_url, drop_dir)
|
|
89
|
+
|
|
90
|
+
# Second push with --drop-tables: tables exist, should drop and recreate
|
|
91
|
+
expect { push(dst_url, drop_dir, :"drop-tables" => true) }.not_to raise_error
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it 'preserves row counts after drop and re-push' do
|
|
95
|
+
pull(src_url, drop_dir)
|
|
96
|
+
push(dst_url, drop_dir)
|
|
97
|
+
push(dst_url, drop_dir, :"drop-tables" => true)
|
|
98
|
+
|
|
99
|
+
expect_same_counts(src_db, dst_db)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it 'does not duplicate rows on re-push' do
|
|
103
|
+
pull(src_url, drop_dir)
|
|
104
|
+
push(dst_url, drop_dir)
|
|
105
|
+
push(dst_url, drop_dir, :"drop-tables" => true)
|
|
106
|
+
|
|
107
|
+
src_db.tables.each do |table|
|
|
108
|
+
expect(dst_db[table].count).to eq(src_db[table].count)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
82
113
|
context 'with custom chunksize' do
|
|
83
114
|
let(:chunk_dir) { Dir.mktmpdir }
|
|
84
115
|
after { FileUtils.rm_rf(chunk_dir) }
|
data/tapsoob.gemspec
CHANGED
|
@@ -20,18 +20,18 @@ Gem::Specification.new do |s|
|
|
|
20
20
|
s.require_paths = ["lib"]
|
|
21
21
|
|
|
22
22
|
# Dependencies
|
|
23
|
-
s.add_dependency "sequel", "~> 5.
|
|
24
|
-
s.add_dependency "thor", "~> 1.
|
|
23
|
+
s.add_dependency "sequel", "~> 5.105.0"
|
|
24
|
+
s.add_dependency "thor", "~> 1.5.0"
|
|
25
25
|
|
|
26
26
|
if (RUBY_PLATFORM =~ /java/).nil?
|
|
27
27
|
s.add_development_dependency "mysql2", "~> 0.5.7"
|
|
28
|
-
s.add_development_dependency "pg", "~> 1.6.
|
|
29
|
-
s.add_development_dependency "sqlite3", "~> 2.
|
|
28
|
+
s.add_development_dependency "pg", "~> 1.6.3"
|
|
29
|
+
s.add_development_dependency "sqlite3", "~> 2.9.5"
|
|
30
30
|
else
|
|
31
31
|
s.platform = 'java'
|
|
32
32
|
|
|
33
33
|
s.add_dependency "jdbc-mysql", "~> 9.1.0.1"
|
|
34
|
-
s.add_dependency "jdbc-postgres", "~> 42.7.
|
|
34
|
+
s.add_dependency "jdbc-postgres", "~> 42.7.11"
|
|
35
35
|
s.add_dependency "jdbc-sqlite3", "~> 3.46.1.1"
|
|
36
36
|
end
|
|
37
37
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tapsoob
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.8.
|
|
4
|
+
version: 0.8.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Félix Bellanger
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2026-06-
|
|
12
|
+
date: 2026-06-15 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: sequel
|
|
@@ -17,28 +17,28 @@ dependencies:
|
|
|
17
17
|
requirements:
|
|
18
18
|
- - "~>"
|
|
19
19
|
- !ruby/object:Gem::Version
|
|
20
|
-
version: 5.
|
|
20
|
+
version: 5.105.0
|
|
21
21
|
type: :runtime
|
|
22
22
|
prerelease: false
|
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
|
24
24
|
requirements:
|
|
25
25
|
- - "~>"
|
|
26
26
|
- !ruby/object:Gem::Version
|
|
27
|
-
version: 5.
|
|
27
|
+
version: 5.105.0
|
|
28
28
|
- !ruby/object:Gem::Dependency
|
|
29
29
|
name: thor
|
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
|
31
31
|
requirements:
|
|
32
32
|
- - "~>"
|
|
33
33
|
- !ruby/object:Gem::Version
|
|
34
|
-
version: 1.
|
|
34
|
+
version: 1.5.0
|
|
35
35
|
type: :runtime
|
|
36
36
|
prerelease: false
|
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
|
38
38
|
requirements:
|
|
39
39
|
- - "~>"
|
|
40
40
|
- !ruby/object:Gem::Version
|
|
41
|
-
version: 1.
|
|
41
|
+
version: 1.5.0
|
|
42
42
|
- !ruby/object:Gem::Dependency
|
|
43
43
|
name: mysql2
|
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -59,28 +59,28 @@ dependencies:
|
|
|
59
59
|
requirements:
|
|
60
60
|
- - "~>"
|
|
61
61
|
- !ruby/object:Gem::Version
|
|
62
|
-
version: 1.6.
|
|
62
|
+
version: 1.6.3
|
|
63
63
|
type: :development
|
|
64
64
|
prerelease: false
|
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
|
66
66
|
requirements:
|
|
67
67
|
- - "~>"
|
|
68
68
|
- !ruby/object:Gem::Version
|
|
69
|
-
version: 1.6.
|
|
69
|
+
version: 1.6.3
|
|
70
70
|
- !ruby/object:Gem::Dependency
|
|
71
71
|
name: sqlite3
|
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
|
73
73
|
requirements:
|
|
74
74
|
- - "~>"
|
|
75
75
|
- !ruby/object:Gem::Version
|
|
76
|
-
version: 2.
|
|
76
|
+
version: 2.9.5
|
|
77
77
|
type: :development
|
|
78
78
|
prerelease: false
|
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
|
80
80
|
requirements:
|
|
81
81
|
- - "~>"
|
|
82
82
|
- !ruby/object:Gem::Version
|
|
83
|
-
version: 2.
|
|
83
|
+
version: 2.9.5
|
|
84
84
|
description: Simple tool to import/export databases inspired by taps but OOB, meaning
|
|
85
85
|
databases are imported/exported from the filesystem.
|
|
86
86
|
email: felix.bellanger@faveod.com
|