data_keeper 0.1.3 → 0.1.7

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
  SHA256:
3
- metadata.gz: 1dc4571443a29e3b6e5ef297eaf58bcc904245f2fa03e9afdbcb8004156163a3
4
- data.tar.gz: 8eeb45101080f53b64365b28a3d5b03201ff22bf57399682dfeeac439df59496
3
+ metadata.gz: c525131692e6a1de920301cbc4b55360fc7dd089ccfc1b1db1068ef328b78e0c
4
+ data.tar.gz: ee646b314fc7203cadab9c366559c060c91ae9a45cea906f4ee4f4409c5bcd76
5
5
  SHA512:
6
- metadata.gz: 6736489028cef881ae0c24617d87f54ac67d727121350e6a6c6bccbd1a13cc5c0eff21809b4a7705e34740a72270bebd7a65a6042dd253d98ee5cc4bc4455c8b
7
- data.tar.gz: 30b58fe74b9b2c4beda31b7fb345bf2be6907c3f60e448cf7634e1458cf7ed6cff48662798b91dae4bd443b68ae680b01813595b0a95632a4a51f9e17e9f4b3b
6
+ metadata.gz: 2b7ae402b492cd31c8d82b0481f0c8088ef09f28d9fb09b37f86040e14c4ce6f1d2b4d2b75dca6f5bf78d18306844ed26657bcfcadfda0c0001523e8fac88534
7
+ data.tar.gz: 38c8bb4d0fcdb05cd43f93f7a0d70f69f33067e2e40dea1c0e8ddc4e6b4910cc7f635e5291059801a5cecade692ca4e714deb841b152b9fe792785c9435408ca
data/.gitignore CHANGED
@@ -6,5 +6,6 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /lib/tmp
9
10
 
10
11
  Gemfile.lock
data/Gemfile CHANGED
@@ -5,3 +5,4 @@ gemspec
5
5
 
6
6
  gem "rake", "~> 12.0"
7
7
  gem "minitest", "~> 5.0"
8
+ gem 'pg'
@@ -1,7 +1,7 @@
1
1
  module DataKeeper
2
2
  module DatabaseConfig
3
3
  def database_connection_config
4
- Rails.configuration.database_configuration[Rails.env]
4
+ @database_connection_config ||= DataKeeper.database_config.call
5
5
  end
6
6
 
7
7
  def psql_env
@@ -33,6 +33,7 @@ module DataKeeper
33
33
  @tables = []
34
34
  @raw_sqls = {}
35
35
  @definition_block = definition_block
36
+ @on_after_load_block = nil
36
37
  end
37
38
 
38
39
  def evaluate!
@@ -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
@@ -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 load_full_database!
27
- pg_restore = Terrapin::CommandLine.new(
28
- 'pg_restore',
29
- "#{connection_args} -j 4 --no-owner --dbname #{database} #{@file.path} 2>/dev/null",
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
- pg_restore.run(
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 = Terrapin::CommandLine.new(
40
- 'psql',
41
- "#{connection_args} -d :database -c :sql",
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
- cmd.run(
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
- inflate(@file.path) do |schema_path, tables_path, sql_files|
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} 2>/dev/null",
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} 2>/dev/null",
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
- Rake::Task['db:environment:set'].invoke
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") do
121
- sql_dumps.size == @dump.sqls.keys.size
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
@@ -1,3 +1,3 @@
1
1
  module DataKeeper
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.7"
3
3
  end
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.3
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-08-06 00:00:00.000000000 Z
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.0.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