tapsoob 0.8.1 → 0.8.2
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/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: 1b462af6073abaf47bcb13d46504696b4dfa6f7dc7dca762e050b9664b6a6da9
|
|
4
|
+
data.tar.gz: e2e46b8b2d1f08cfe67a82c8c1ab542e39e801793142ad1a93ae6aaf63175790
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3f26a3c56a9a824fbd855924fc59fd6abdf4b8ff0f8c44747ecfbc26316f77dca7d603e39fce09cda03f3c4eabeed6522da1c7a8e8f6baa3c95e277531120f35
|
|
7
|
+
data.tar.gz: 0f22b48db14b094b3a93375ac9004f1f520537ce45918a7069a6e7141dfb437c4b0382c8376e1c52216d4407d83d15875adb1a11d6b9970bd333cf859167f179
|
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/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.2
|
|
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
|