data_keeper 0.1.9 → 0.2.1

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
  SHA256:
3
- metadata.gz: 8aefdb5a66266a15337e2f65a59595a3017c744c6532d97d8c4377eb64f82d43
4
- data.tar.gz: 49e39de5ecc7fbdf4355bf25c6d5300b5027c1413450aee696a51683d930065e
3
+ metadata.gz: 1ea02e8856f7dbdcc74cd8c82a57893d792a6a2aeb5c6963258d06b8707e9a2b
4
+ data.tar.gz: a6dbcdc1d8266d8a554ab6b7b1650dad9b810b5f91f8be3da1f157a877e537e9
5
5
  SHA512:
6
- metadata.gz: d91d76636fd6eadab472f6442cca9484b95130209a8ba2adef6197c600ab31e43b054121991f6e96ef7200cc4a4ba4f23215ccdf5bf8d6a599d5495786832b51
7
- data.tar.gz: d13e22eb926add303417d44fe1ac802b69b3839eb8349903fb10059139bd583e0d91f9e4aaa3a0e9f67ad2782d8aec4628290f48e95b92b64c1facfe1ac70a8f
6
+ metadata.gz: cb567b6fd35e1c68f051ee3b06e712dd9ed17e9895362ac7f025940b74cff0973255b51d95cd1effb91a67a7bd92188e50a30a07bc77e1f354008fbeab9f1d39
7
+ data.tar.gz: eab10951b2cf77197c6d360d2676726ea01ddfc9c6696647e96806724d7cdaf370e33f046fbc2620ee1753b7ad697200e28d932ec45bb550bbd19a655f9b5f1b
data/README.md CHANGED
@@ -110,6 +110,29 @@ in your current database. It will give you an error if you try to run this in a
110
110
  Note when using raw sql, your statement is expected to return all columns for the configured table, in the default
111
111
  order (`select *`). This uses pg's COPY from/to for the full table internally.
112
112
 
113
+ ## Docker
114
+
115
+ If you're using pg under docker, you can configure also DataKeeper with the docker pg settings and then this gem
116
+ will use the binaries under that docker container (`psql`, `pg_restore`, etc.).
117
+
118
+ Since then the commands to execute are ran from within the docker instance, the port will be different
119
+ as the one the rails app uses, so you'll need to configure what's the pg access from the docker container, use:
120
+
121
+ ```
122
+ DataKeeper.docker_config = {
123
+ instance_name: "pg_my_app",
124
+ pg_host: "localhost",
125
+ pg_port: "5432",
126
+ pg_user: "myapp",
127
+ pg_password: "myapp"
128
+ }
129
+ ```
130
+
131
+ If the host, or user and password are the same as the ones used from the rails app, you can ignore them.
132
+ If you configure this `docker_config` hash, then data keeper will try to use docker via `docker exec` to
133
+ run the pg commands.
134
+
135
+
113
136
  ## Development
114
137
 
115
138
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -5,13 +5,41 @@ module DataKeeper
5
5
  end
6
6
 
7
7
  def psql_env
8
- env = { 'PGUSER' => database_connection_config['username'] }
9
- env['PGPASSWORD'] = database_connection_config['password'] if database_connection_config['password']
8
+ env = { 'PGUSER' => username }
9
+ env['PGPASSWORD'] = password if password
10
10
  env
11
11
  end
12
12
 
13
+ def dumper_psql_env
14
+ env = { 'PGUSER' => server_username }
15
+ env['PGPASSWORD'] = server_password if server_password
16
+ env
17
+ end
18
+
19
+ def docker_env_params
20
+ psql_env.map do |k, v|
21
+ "-e #{k}=#{v}"
22
+ end.join(" ")
23
+ end
24
+
25
+ def server_username
26
+ database_connection_config['username']
27
+ end
28
+
29
+ def server_password
30
+ database_connection_config['password']
31
+ end
32
+
33
+ def username
34
+ DataKeeper.docker_config[:pg_user] || database_connection_config['username']
35
+ end
36
+
37
+ def password
38
+ DataKeeper.docker_config[:pg_password] || database_connection_config['password']
39
+ end
40
+
13
41
  def host
14
- database_connection_config['host'] || '127.0.0.1'
42
+ DataKeeper.docker_config[:pg_host] || database_connection_config['host'] || '127.0.0.1'
15
43
  end
16
44
 
17
45
  def database
@@ -19,12 +47,22 @@ module DataKeeper
19
47
  end
20
48
 
21
49
  def port
22
- database_connection_config['port']
50
+ DataKeeper.docker_config[:pg_port] || database_connection_config['port'] || '5432'
51
+ end
52
+
53
+ def server_port
54
+ database_connection_config['port'] || '5432'
23
55
  end
24
56
 
25
57
  def connection_args
26
58
  connection_opts = '--host=:host'
27
- connection_opts += ' --port=:port' if database_connection_config['port']
59
+ connection_opts += ' --port=:port' if port
60
+ connection_opts
61
+ end
62
+
63
+ def dumper_connection_args
64
+ connection_opts = '--host=:host'
65
+ connection_opts += ' --port=:port' if server_port
28
66
  connection_opts
29
67
  end
30
68
  end
@@ -24,8 +24,8 @@ module DataKeeper
24
24
  Tempfile.create do |file|
25
25
  cmd = Terrapin::CommandLine.new(
26
26
  'pg_dump',
27
- "#{connection_args} -x -Fc :database > :output_path",
28
- environment: psql_env
27
+ "#{dumper_connection_args} -x -Fc :database > :output_path",
28
+ environment: dumper_psql_env
29
29
  )
30
30
 
31
31
  cmd.run(
@@ -61,8 +61,8 @@ module DataKeeper
61
61
  Tempfile.create do |table_file|
62
62
  cmd = Terrapin::CommandLine.new(
63
63
  'psql',
64
- "#{connection_args} -d :database -c :command > #{table_file.path}",
65
- environment: psql_env
64
+ "#{dumper_connection_args} -d :database -c :command > #{table_file.path}",
65
+ environment: dumper_psql_env
66
66
  )
67
67
 
68
68
  cmd.run(
@@ -89,8 +89,8 @@ module DataKeeper
89
89
  table_args = @definition.full_tables_to_export.map { |table| "-t #{table}" }.join(' ')
90
90
  cmd = Terrapin::CommandLine.new(
91
91
  'pg_dump',
92
- "#{connection_args} -x -Fc :database #{table_args} > :output_path",
93
- environment: psql_env
92
+ "#{dumper_connection_args} -x -Fc :database #{table_args} > :output_path",
93
+ environment: dumper_psql_env
94
94
  )
95
95
 
96
96
  cmd.run(
@@ -116,8 +116,8 @@ module DataKeeper
116
116
 
117
117
  cmd = Terrapin::CommandLine.new(
118
118
  'pg_dump',
119
- "#{connection_args} -x --schema-only -Fc :database > :output_path",
120
- environment: psql_env
119
+ "#{dumper_connection_args} -x --schema-only -Fc :database > :output_path",
120
+ environment: dumper_psql_env
121
121
  )
122
122
 
123
123
  cmd.run(
@@ -144,8 +144,8 @@ module DataKeeper
144
144
  sequences_args = all_sequences_to_export.map { |table| "-t #{table}" }.join(' ')
145
145
  cmd = Terrapin::CommandLine.new(
146
146
  'pg_dump',
147
- "#{connection_args} -x -Fc :database #{sequences_args} > :output_path",
148
- environment: psql_env
147
+ "#{dumper_connection_args} -x -Fc :database #{sequences_args} > :output_path",
148
+ environment: dumper_psql_env
149
149
  )
150
150
 
151
151
  cmd.run(database: database, host: host, port: port, output_path: sequences_dump_file.path)
@@ -167,8 +167,8 @@ module DataKeeper
167
167
  def all_sequences_to_export
168
168
  cmd = Terrapin::CommandLine.new(
169
169
  'psql',
170
- "#{connection_args} -d :database -c :sql -A -R ',' -t",
171
- environment: psql_env
170
+ "#{dumper_connection_args} -d :database -c :sql -A -R ',' -t",
171
+ environment: dumper_psql_env
172
172
  )
173
173
 
174
174
  sequences = cmd.run(
@@ -7,9 +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
+ @psql_version = build_terrapin_command('psql', '--version').run
11
+ .match(/[0-9]{1,}\.[0-9]{1,}/)
12
+ .to_s.to_f
13
13
  end
14
14
 
15
15
  def load!
@@ -35,12 +35,23 @@ module DataKeeper
35
35
  end
36
36
  end
37
37
 
38
+ def build_terrapin_command(binary, args, docker_args = args)
39
+ if DataKeeper.docker_config.any?
40
+ Terrapin::CommandLine.new(
41
+ 'docker',
42
+ "exec #{docker_env_params} -i #{DataKeeper.docker_config[:instance_name]} #{binary} #{docker_args}"
43
+ )
44
+ else
45
+ Terrapin::CommandLine.new(
46
+ binary,
47
+ args,
48
+ environment: psql_env
49
+ )
50
+ end
51
+ end
52
+
38
53
  def set_ar_internal_metadata!
39
- cmd = Terrapin::CommandLine.new(
40
- 'psql',
41
- "#{connection_args} -d :database -c :sql",
42
- environment: psql_env
43
- )
54
+ cmd = build_terrapin_command("psql", "#{connection_args} -d :database -c :sql")
44
55
 
45
56
  cmd.run(
46
57
  database: database,
@@ -58,12 +69,10 @@ module DataKeeper
58
69
  end
59
70
 
60
71
  def load_full_database!
61
- ensure_schema_compatibility!
62
-
63
- pg_restore = Terrapin::CommandLine.new(
64
- 'pg_restore',
72
+ pg_restore = build_terrapin_command(
73
+ "pg_restore",
65
74
  "#{connection_args} -j 4 --no-owner --dbname #{database} #{@file.path}#{log_redirect}",
66
- environment: psql_env
75
+ "#{connection_args} --no-owner --dbname #{database} < #{@file.path}#{log_redirect}"
67
76
  )
68
77
 
69
78
  pg_restore.run(
@@ -79,10 +88,10 @@ module DataKeeper
79
88
  ensure_schema_compatibility!
80
89
 
81
90
  inflate(@file.path) do |schema_path, tables_path, sql_files, sequences_path|
82
- pg_restore = Terrapin::CommandLine.new(
83
- 'pg_restore',
91
+ pg_restore = build_terrapin_command(
92
+ "pg_restore",
84
93
  "#{connection_args} -j 4 --no-owner -s --dbname :database #{schema_path}#{log_redirect}",
85
- environment: psql_env
94
+ "#{connection_args} --no-owner -s --dbname :database < #{schema_path}#{log_redirect}"
86
95
  )
87
96
 
88
97
  pg_restore.run(
@@ -91,10 +100,10 @@ module DataKeeper
91
100
  port: port
92
101
  )
93
102
 
94
- pg_restore = Terrapin::CommandLine.new(
95
- 'pg_restore',
103
+ pg_restore = build_terrapin_command(
104
+ "pg_restore",
96
105
  "#{connection_args} --data-only -j 4 --no-owner --disable-triggers --dbname :database #{tables_path}#{log_redirect}",
97
- environment: psql_env
106
+ "#{connection_args} --data-only --no-owner --disable-triggers --dbname :database < #{tables_path}#{log_redirect}"
98
107
  )
99
108
 
100
109
  pg_restore.run(
@@ -104,11 +113,7 @@ module DataKeeper
104
113
  )
105
114
 
106
115
  sql_files.each do |table, csv_path|
107
- cmd = Terrapin::CommandLine.new(
108
- 'psql',
109
- "#{connection_args} -d :database -c :command < :csv_path",
110
- environment: psql_env
111
- )
116
+ cmd = build_terrapin_command("psql", "#{connection_args} -d :database -c :command < :csv_path")
112
117
 
113
118
  cmd.run(
114
119
  database: database,
@@ -119,10 +124,10 @@ module DataKeeper
119
124
  )
120
125
  end
121
126
 
122
- pg_restore = Terrapin::CommandLine.new(
123
- 'pg_restore',
127
+ pg_restore = build_terrapin_command(
128
+ "pg_restore",
124
129
  "#{connection_args} --data-only -j 4 --no-owner --disable-triggers --dbname :database #{sequences_path}#{log_redirect}",
125
- environment: psql_env
130
+ "#{connection_args} --data-only --no-owner --disable-triggers --dbname :database < #{sequences_path}#{log_redirect}"
126
131
  )
127
132
 
128
133
  pg_restore.run(
@@ -136,11 +141,7 @@ module DataKeeper
136
141
  end
137
142
 
138
143
  def ensure_schema_compatibility!
139
- cmd = Terrapin::CommandLine.new(
140
- 'psql',
141
- "#{connection_args} -d :database -c :command",
142
- environment: psql_env
143
- )
144
+ cmd = build_terrapin_command("psql", "#{connection_args} -d :database -c :command")
144
145
 
145
146
  if @psql_version >= 11.0
146
147
  cmd.run(database: database, host: host, port: port, command: "drop schema if exists public")
@@ -207,9 +208,9 @@ module DataKeeper
207
208
 
208
209
  yield(
209
210
  inflated_files.schema_path,
210
- inflated_files.tables_path,
211
- inflated_files.sql_dumps,
212
- inflated_files.sequences_path
211
+ inflated_files.tables_path,
212
+ inflated_files.sql_dumps,
213
+ inflated_files.sequences_path
213
214
  )
214
215
  end
215
216
  end
@@ -1,3 +1,3 @@
1
1
  module DataKeeper
2
- VERSION = "0.1.9"
2
+ VERSION = "0.2.1"
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
+ @docker_config = {}
20
21
  @database_config = -> { Rails.configuration.database_configuration[Rails.env] }
21
22
 
22
23
  def self.define_dump(name, type = :partial, &block)
@@ -69,6 +70,10 @@ module DataKeeper
69
70
  @storage = value
70
71
  end
71
72
 
73
+ def self.docker_config=(value)
74
+ @docker_config = value
75
+ end
76
+
72
77
  def self.database_config=(value)
73
78
  @database_config = value
74
79
  end
@@ -77,6 +82,10 @@ module DataKeeper
77
82
  @database_config
78
83
  end
79
84
 
85
+ def self.docker_config
86
+ @docker_config
87
+ end
88
+
80
89
  def self.clear_dumps!
81
90
  @dump_definition_builders = {}
82
91
  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.9
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roger Campos
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-02-28 00:00:00.000000000 Z
11
+ date: 2022-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -100,7 +100,7 @@ licenses:
100
100
  - MIT
101
101
  metadata:
102
102
  homepage_uri: https://github.com/rogercampos/data_keeper
103
- post_install_message:
103
+ post_install_message:
104
104
  rdoc_options: []
105
105
  require_paths:
106
106
  - lib
@@ -116,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
116
  version: '0'
117
117
  requirements: []
118
118
  rubygems_version: 3.1.6
119
- signing_key:
119
+ signing_key:
120
120
  specification_version: 4
121
121
  summary: Easy management of database dumps for dev env
122
122
  test_files: []