data_keeper 0.1.3 → 0.1.7
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/.gitignore +1 -0
- data/Gemfile +1 -0
- data/lib/data_keeper/database_config.rb +1 -1
- data/lib/data_keeper/definition.rb +1 -0
- data/lib/data_keeper/dumper.rb +40 -0
- data/lib/data_keeper/loader.rb +76 -26
- data/lib/data_keeper/version.rb +1 -1
- data/lib/data_keeper.rb +9 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c525131692e6a1de920301cbc4b55360fc7dd089ccfc1b1db1068ef328b78e0c
|
4
|
+
data.tar.gz: ee646b314fc7203cadab9c366559c060c91ae9a45cea906f4ee4f4409c5bcd76
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b7ae402b492cd31c8d82b0481f0c8088ef09f28d9fb09b37f86040e14c4ce6f1d2b4d2b75dca6f5bf78d18306844ed26657bcfcadfda0c0001523e8fac88534
|
7
|
+
data.tar.gz: 38c8bb4d0fcdb05cd43f93f7a0d70f69f33067e2e40dea1c0e8ddc4e6b4910cc7f635e5291059801a5cecade692ca4e714deb841b152b9fe792785c9435408ca
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/lib/data_keeper/dumper.rb
CHANGED
@@ -48,6 +48,7 @@ module DataKeeper
|
|
48
48
|
dump_schema(tar)
|
49
49
|
dump_partial_tables(tar)
|
50
50
|
dump_sqls(tar)
|
51
|
+
dump_sequences(tar)
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
@@ -136,8 +137,47 @@ module DataKeeper
|
|
136
137
|
end
|
137
138
|
end
|
138
139
|
|
140
|
+
def dump_sequences(tar)
|
141
|
+
Tempfile.create do |sequences_dump_file|
|
142
|
+
sequences_dump_file.binmode
|
143
|
+
|
144
|
+
sequences_args = all_sequences_to_export.map { |table| "-t #{table}" }.join(' ')
|
145
|
+
cmd = Terrapin::CommandLine.new(
|
146
|
+
'pg_dump',
|
147
|
+
"#{connection_args} -x -Fc :database #{sequences_args} > :output_path",
|
148
|
+
environment: psql_env
|
149
|
+
)
|
150
|
+
|
151
|
+
cmd.run(database: database, host: host, port: port, output_path: sequences_dump_file.path)
|
152
|
+
|
153
|
+
tar.add_file_simple("sequences.dump", 0644, File.size(sequences_dump_file.path)) do |io|
|
154
|
+
sequences_dump_file.reopen(sequences_dump_file)
|
155
|
+
|
156
|
+
while !sequences_dump_file.eof?
|
157
|
+
io.write(sequences_dump_file.read(2048))
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
139
163
|
def filename
|
140
164
|
"#{@dump_name}-#{Time.now.strftime("%Y%m%d-%H%M")}"
|
141
165
|
end
|
166
|
+
|
167
|
+
def all_sequences_to_export
|
168
|
+
cmd = Terrapin::CommandLine.new(
|
169
|
+
'psql',
|
170
|
+
"#{connection_args} -d :database -c :sql -A -R ',' -t",
|
171
|
+
environment: psql_env
|
172
|
+
)
|
173
|
+
|
174
|
+
sequences = cmd.run(
|
175
|
+
database: database,
|
176
|
+
host: host,
|
177
|
+
port: port,
|
178
|
+
sql: "SELECT sequencename from pg_sequences;"
|
179
|
+
)
|
180
|
+
sequences.split(',').map{|x| x.strip}
|
181
|
+
end
|
142
182
|
end
|
143
183
|
end
|
data/lib/data_keeper/loader.rb
CHANGED
@@ -7,6 +7,9 @@ module DataKeeper
|
|
7
7
|
def initialize(dump, file)
|
8
8
|
@dump = dump
|
9
9
|
@file = file
|
10
|
+
@psql_version = Terrapin::CommandLine.new('psql', '--version').run
|
11
|
+
.match(/[0-9]{1,}\.[0-9]{1,}/)
|
12
|
+
.to_s.to_f
|
10
13
|
end
|
11
14
|
|
12
15
|
def load!
|
@@ -17,51 +20,68 @@ module DataKeeper
|
|
17
20
|
end
|
18
21
|
|
19
22
|
if @dump.on_after_load_block
|
23
|
+
ActiveRecord::Base.establish_connection
|
20
24
|
@dump.on_after_load_block.call
|
21
25
|
end
|
22
26
|
end
|
23
27
|
|
24
28
|
private
|
25
29
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
+
def log_redirect
|
31
|
+
if Terrapin::CommandLine.logger
|
32
|
+
""
|
33
|
+
else
|
34
|
+
" 2>/dev/null"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def set_ar_internal_metadata!
|
39
|
+
cmd = Terrapin::CommandLine.new(
|
40
|
+
'psql',
|
41
|
+
"#{connection_args} -d :database -c :sql",
|
30
42
|
environment: psql_env
|
31
43
|
)
|
32
44
|
|
33
|
-
|
45
|
+
cmd.run(
|
34
46
|
database: database,
|
35
47
|
host: host,
|
36
|
-
port: port
|
48
|
+
port: port,
|
49
|
+
sql: "DELETE from ar_internal_metadata"
|
37
50
|
)
|
38
51
|
|
39
|
-
cmd
|
40
|
-
|
41
|
-
|
52
|
+
cmd.run(
|
53
|
+
database: database,
|
54
|
+
host: host,
|
55
|
+
port: port,
|
56
|
+
sql: "INSERT into ar_internal_metadata (key, value, created_at, updated_at) VALUES ('environment', 'development', '2020-04-03 12:25:54.094209', '2020-04-03 12:25:54.094209')"
|
57
|
+
)
|
58
|
+
end
|
59
|
+
|
60
|
+
def load_full_database!
|
61
|
+
ensure_schema_compatibility!
|
62
|
+
|
63
|
+
pg_restore = Terrapin::CommandLine.new(
|
64
|
+
'pg_restore',
|
65
|
+
"#{connection_args} -j 4 --no-owner --dbname #{database} #{@file.path}#{log_redirect}",
|
42
66
|
environment: psql_env
|
43
67
|
)
|
44
68
|
|
45
|
-
|
69
|
+
pg_restore.run(
|
46
70
|
database: database,
|
47
71
|
host: host,
|
48
|
-
port: port
|
49
|
-
sql: "UPDATE ar_internal_metadata SET value = 'development'"
|
72
|
+
port: port
|
50
73
|
)
|
74
|
+
|
75
|
+
set_ar_internal_metadata!
|
51
76
|
end
|
52
77
|
|
53
78
|
def load_partial_database!
|
54
|
-
|
55
|
-
cmd = Terrapin::CommandLine.new(
|
56
|
-
'psql',
|
57
|
-
"#{connection_args} -d :database -c :command",
|
58
|
-
environment: psql_env
|
59
|
-
)
|
60
|
-
cmd.run(database: database, host: host, port: port, command: "drop schema if exists public")
|
79
|
+
ensure_schema_compatibility!
|
61
80
|
|
81
|
+
inflate(@file.path) do |schema_path, tables_path, sql_files, sequences_path|
|
62
82
|
pg_restore = Terrapin::CommandLine.new(
|
63
83
|
'pg_restore',
|
64
|
-
"#{connection_args} -j 4 --no-owner --dbname :database #{schema_path}
|
84
|
+
"#{connection_args} -j 4 --no-owner -s --dbname :database #{schema_path}#{log_redirect}",
|
65
85
|
environment: psql_env
|
66
86
|
)
|
67
87
|
|
@@ -73,7 +93,7 @@ module DataKeeper
|
|
73
93
|
|
74
94
|
pg_restore = Terrapin::CommandLine.new(
|
75
95
|
'pg_restore',
|
76
|
-
"#{connection_args} --data-only -j 4 --no-owner --disable-triggers --dbname :database #{tables_path}
|
96
|
+
"#{connection_args} --data-only -j 4 --no-owner --disable-triggers --dbname :database #{tables_path}#{log_redirect}",
|
77
97
|
environment: psql_env
|
78
98
|
)
|
79
99
|
|
@@ -99,7 +119,33 @@ module DataKeeper
|
|
99
119
|
)
|
100
120
|
end
|
101
121
|
|
102
|
-
|
122
|
+
pg_restore = Terrapin::CommandLine.new(
|
123
|
+
'pg_restore',
|
124
|
+
"#{connection_args} --data-only -j 4 --no-owner --disable-triggers --dbname :database #{sequences_path}#{log_redirect}",
|
125
|
+
environment: psql_env
|
126
|
+
)
|
127
|
+
|
128
|
+
pg_restore.run(
|
129
|
+
database: database,
|
130
|
+
host: host,
|
131
|
+
port: port
|
132
|
+
)
|
133
|
+
|
134
|
+
set_ar_internal_metadata!
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def ensure_schema_compatibility!
|
139
|
+
cmd = Terrapin::CommandLine.new(
|
140
|
+
'psql',
|
141
|
+
"#{connection_args} -d :database -c :command",
|
142
|
+
environment: psql_env
|
143
|
+
)
|
144
|
+
|
145
|
+
if @psql_version >= 11.0
|
146
|
+
cmd.run(database: database, host: host, port: port, command: "drop schema if exists public")
|
147
|
+
else
|
148
|
+
cmd.run(database: database, host: host, port: port, command: "create schema if not exists public")
|
103
149
|
end
|
104
150
|
end
|
105
151
|
|
@@ -117,9 +163,8 @@ module DataKeeper
|
|
117
163
|
|
118
164
|
validate("Schema file is missing") { !!schema_path } &&
|
119
165
|
validate("Tables file is missing") { !!tables_path } &&
|
120
|
-
validate("Not all sql custom dumps are present")
|
121
|
-
|
122
|
-
end
|
166
|
+
validate("Not all sql custom dumps are present") { sql_dumps.size == @dump.sqls.keys.size } &&
|
167
|
+
validate("Sequences file is missing") { !!sequences_path }
|
123
168
|
end
|
124
169
|
|
125
170
|
def schema_path
|
@@ -130,6 +175,10 @@ module DataKeeper
|
|
130
175
|
@tables_path ||= @paths.find { |x| File.basename(x) == "tables.dump" }
|
131
176
|
end
|
132
177
|
|
178
|
+
def sequences_path
|
179
|
+
@sequences_path ||= @paths.find { |x| File.basename(x) == "sequences.dump" }
|
180
|
+
end
|
181
|
+
|
133
182
|
def sql_dumps
|
134
183
|
@sql_dumps ||= @dump.sqls.map do |name, (table, _proc)|
|
135
184
|
path = @paths.find { |x| File.basename(x) == "#{name}.csv" }
|
@@ -159,7 +208,8 @@ module DataKeeper
|
|
159
208
|
yield(
|
160
209
|
inflated_files.schema_path,
|
161
210
|
inflated_files.tables_path,
|
162
|
-
inflated_files.sql_dumps
|
211
|
+
inflated_files.sql_dumps,
|
212
|
+
inflated_files.sequences_path
|
163
213
|
)
|
164
214
|
end
|
165
215
|
end
|
data/lib/data_keeper/version.rb
CHANGED
data/lib/data_keeper.rb
CHANGED
@@ -17,6 +17,7 @@ module DataKeeper
|
|
17
17
|
|
18
18
|
@dump_definition_builders = {}
|
19
19
|
@storage = nil
|
20
|
+
@database_config = -> { Rails.configuration.database_configuration[Rails.env] }
|
20
21
|
|
21
22
|
def self.define_dump(name, type = :partial, &block)
|
22
23
|
@dump_definition_builders[name.to_sym] = DefinitionBuilder.new(type, block)
|
@@ -59,6 +60,14 @@ module DataKeeper
|
|
59
60
|
@storage = value
|
60
61
|
end
|
61
62
|
|
63
|
+
def self.database_config=(value)
|
64
|
+
@database_config = value
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.database_config
|
68
|
+
@database_config
|
69
|
+
end
|
70
|
+
|
62
71
|
def self.clear_dumps!
|
63
72
|
@dump_definition_builders = {}
|
64
73
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: data_keeper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roger Campos
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -115,7 +115,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
115
|
- !ruby/object:Gem::Version
|
116
116
|
version: '0'
|
117
117
|
requirements: []
|
118
|
-
rubygems_version: 3.
|
118
|
+
rubygems_version: 3.1.6
|
119
119
|
signing_key:
|
120
120
|
specification_version: 4
|
121
121
|
summary: Easy management of database dumps for dev env
|