postgresql-backup 0.0.7 → 0.0.8

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: 0a2a632cc3b5edbcfe9efbcccda2d26dad60d9c71442fafa13f6956bb4070799
4
- data.tar.gz: 9c00fd45add770d9cf55d163cdf5067341943fc4e69ad62cea4b5feac2981f5d
3
+ metadata.gz: 9d8de117460200af5ebacdfaa61c91cb8f46de9b7d91123d8d0f606e31fce16d
4
+ data.tar.gz: a8484224c080047669ca383459f69d5269f393198ded85b7a96c06048ae9ecd6
5
5
  SHA512:
6
- metadata.gz: 2093299a3a8736fb8ed84af7011d0e8aac5731f86e4adc7fd61102fdb19e514dea2e9b150c207122e52a707ca284c71c4f8c98430926d46ea2e6d53e07af7aa3
7
- data.tar.gz: 2ee8cf68d198f4947f599e4d9dda49a4ffbb3397133bb46f91fc1a83f9ebc25bb2ef1f7076a91b9a92d48bf2720ce7425dc6f9658e9d2407bb931db9696b8c48
6
+ metadata.gz: 8ac205a5ff92a7ed2298d9c7c07af0130f8b41cb4b809d0e07788b9ae3d7b7e8f53c24690e3d2ccae2d7448287ba369ff9c21bebbe245c7dc800d3153a3b7150
7
+ data.tar.gz: e8d7921301d7a67ef563c5996686289bf6581d47d44a08dd99120d9a0023c4c682b88f72426dfc9ada53d1507668537ab142743b14723bc3d1b04933365f537d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ### v0.0.8 - 2023-07-07
2
+
3
+ - Add support to hooks (methods to run before/after dump and restore)
4
+
1
5
  ### v0.0.7 - 2022-04-19
2
6
 
3
7
  - Add support for ruby 3 and fog-aws 3.13.0
data/README.md CHANGED
@@ -26,7 +26,13 @@ Go to the terminal and update your gems using bundler:
26
26
  bundle install
27
27
  ```
28
28
 
29
- Right now, your project already has two new rake tasks: `backup` and `restore`.
29
+ In the Rakefile of your project, add `require 'postgresql_backup'` anywhere **before** this line:
30
+
31
+ ```
32
+ Rails.application.load_tasks
33
+ ```
34
+
35
+ Right now, your project already has two new rake tasks: `postgresql_backup:dump` and `postgresql_backup:restore`.
30
36
 
31
37
  ## Configuration
32
38
 
@@ -39,6 +45,8 @@ Create a file inside the `config/initializers` folder. The name is not important
39
45
  Here is an example with all available options you can change:
40
46
 
41
47
  ```ruby
48
+ require 'postgresql_backup'
49
+
42
50
  PostgresqlBackup.configure do |config|
43
51
  # This gem works with two possible repositories:
44
52
  #
@@ -84,6 +92,20 @@ PostgresqlBackup.configure do |config|
84
92
  # path where they are going to be stored. The remote path is the
85
93
  # place to do that. The default value is `_backups/database/`
86
94
  config.remote_path = ''
95
+
96
+ # There are cases where we need to run a command before or after the database
97
+ # is restored or a backup is created. To accomplish this, you can set the
98
+ # `hooks` attribute to a class or an instance of a class that
99
+ # responds to the method you need.
100
+ #
101
+ # Available hook methods are:
102
+ #
103
+ # * before_restore
104
+ # * after_restore
105
+ # * before_dump
106
+ # * after_dump
107
+ #
108
+ config.hooks = nil
87
109
  end
88
110
  ```
89
111
 
@@ -150,6 +172,85 @@ Everything will work just fine, but you may come across some strange warnings, l
150
172
 
151
173
  To prevent this, every time the rake restores a backup file it tries to replace the environment being copied into the ar_internal_metadata table with the current Rails environment. Thus, `environment production` will become `environment development`.
152
174
 
175
+ ## Database restore hooks
176
+
177
+ Sometimes we need to run things every time a database restore is about to happen, or maybe after the restore is completed. You may even need to run code before or after a backup is created.
178
+
179
+ For example, if you use Elasticsearch you may need to reindex it after restoring a database.
180
+
181
+ To accomplish this, you can use the `hooks` configurations:
182
+
183
+ Examples:
184
+
185
+ ```ruby
186
+ class DatabaseBackupHooks
187
+ def before_restore
188
+ puts 'Backup is going to be restored...'
189
+ end
190
+
191
+ def after_restore
192
+ puts 'Backup restored!'
193
+ end
194
+
195
+ def before_dump
196
+ puts 'Database backup is about to be created...'
197
+ end
198
+
199
+ def after_dump
200
+ puts 'Dump created!'
201
+ end
202
+ end
203
+ ```
204
+
205
+ Then, you can set the `hooks` in the initializer:
206
+
207
+ ```ruby
208
+ PostgresqlBackup.configure do |config|
209
+ config.hooks = DatabaseBackupHooks.new
210
+ end
211
+ ```
212
+
213
+ It also works with classes with class methods:
214
+
215
+ ```ruby
216
+ class DatabaseBackupHooks
217
+ def self.before_restore
218
+ puts 'Backup is going to be restored...'
219
+ end
220
+
221
+ def self.after_restore
222
+ puts 'Backup restored!'
223
+ end
224
+
225
+ def self.before_dump
226
+ puts 'Database backup is about to be created...'
227
+ end
228
+
229
+ def self.after_dump
230
+ puts 'Dump created!'
231
+ end
232
+ end
233
+
234
+ ```
235
+
236
+ ```ruby
237
+ PostgresqlBackup.configure do |config|
238
+ config.hooks = DatabaseBackupHooks # Note that here we no longer instantiate the class
239
+ end
240
+ ```
241
+
242
+ You can even create a class on the fly:
243
+
244
+ ```ruby
245
+ PostgresqlBackup.configure do |config|
246
+ config.hooks = Class.new do
247
+ def self.after_restore
248
+ puts "after restore hook"
249
+ end
250
+ end
251
+ end
252
+ ```
253
+
153
254
  ## I want to contribute
154
255
 
155
256
  Feel free to open a pull request with the changes you want to make. Remember to update `CHANGELOG.md` with the change you are proposing, because once the PR is merged, it is important to show which changes are being made to the gem.
@@ -164,4 +265,4 @@ To run the tests, we use rspec:
164
265
 
165
266
  ```
166
267
  rspec
167
- ```
268
+ ```
data/lib/configuration.rb CHANGED
@@ -1,25 +1,39 @@
1
+ require_relative 'hooks'
2
+
1
3
  class Configuration
2
- attr_accessor :repository, :backup_folder, :bucket, :region, :file_suffix,
3
- :remote_path, :aws_access_key_id, :aws_secret_access_key
4
+ attr_accessor :aws_access_key_id,
5
+ :aws_secret_access_key,
6
+ :backup_folder,
7
+ :bucket,
8
+ :file_suffix,
9
+ :region,
10
+ :remote_path,
11
+ :repository
12
+
13
+ attr_reader :hooks
4
14
 
5
15
  def initialize(
6
- repository: 'file system',
7
- backup_folder: 'db/backups',
8
- file_suffix: '',
9
16
  aws_access_key_id: '',
10
17
  aws_secret_access_key: '',
18
+ backup_folder: 'db/backups',
11
19
  bucket: '',
20
+ file_suffix: '',
12
21
  region: '',
13
- remote_path: '_backups/database/'
22
+ remote_path: '_backups/database/',
23
+ repository: 'file system'
14
24
  )
15
- @repository = repository
16
- @backup_folder = backup_folder
17
- @file_suffix = file_suffix
18
25
  @aws_access_key_id = aws_access_key_id
19
26
  @aws_secret_access_key = aws_secret_access_key
27
+ @backup_folder = backup_folder
20
28
  @bucket = bucket
29
+ @file_suffix = file_suffix
21
30
  @region = region
22
31
  @remote_path = remote_path
32
+ @repository = repository
33
+ end
34
+
35
+ def hooks=(hooks)
36
+ @hooks = Hooks.new(hooks)
23
37
  end
24
38
 
25
39
  def s3?
data/lib/hooks.rb ADDED
@@ -0,0 +1,29 @@
1
+ class Hooks
2
+ def initialize(hooks)
3
+ @hooks = hooks
4
+ end
5
+
6
+ def before_restore
7
+ return unless @hooks.respond_to?(:before_restore)
8
+
9
+ @hooks.before_restore
10
+ end
11
+
12
+ def after_restore
13
+ return unless @hooks.respond_to?(:after_restore)
14
+
15
+ @hooks.after_restore
16
+ end
17
+
18
+ def before_dump
19
+ return unless @hooks.respond_to?(:before_dump)
20
+
21
+ @hooks.before_dump
22
+ end
23
+
24
+ def after_dump
25
+ return unless @hooks.respond_to?(:after_dump)
26
+
27
+ @hooks.after_dump
28
+ end
29
+ end
@@ -12,11 +12,15 @@ module Tools
12
12
  #
13
13
  # Return the full path of the backup file created in the disk.
14
14
  def dump(debug: false)
15
+ hooks.before_dump
16
+
15
17
  file_path = File.join(backup_folder, "#{file_name}#{file_suffix}.sql")
16
18
 
17
19
  cmd = "PGPASSWORD='#{password}' pg_dump -F p -v -O -U '#{user}' -h '#{host}' -d '#{database}' -f '#{file_path}' -p '#{port}' "
18
20
  debug ? system(cmd) : system(cmd, err: File::NULL)
19
21
 
22
+ hooks.after_dump
23
+
20
24
  file_path
21
25
  end
22
26
 
@@ -35,11 +39,15 @@ module Tools
35
39
  # If you need to make the command more verbose, pass
36
40
  # `debug: true` in the arguments of the function.
37
41
  def restore(file_name, debug: false)
42
+ hooks.before_restore
43
+
38
44
  file_path = File.join(backup_folder, file_name)
39
45
  output_redirection = debug ? '': ' > /dev/null'
40
46
  cmd = "PGPASSWORD='#{password}' psql -U '#{user}' -h '#{host}' -d '#{database}' -f '#{file_path}' -p '#{port}' #{output_redirection}"
41
47
  system(cmd)
42
48
 
49
+ hooks.after_restore
50
+
43
51
  file_path
44
52
  end
45
53
 
@@ -92,5 +100,9 @@ module Tools
92
100
  end
93
101
  end
94
102
  end
103
+
104
+ def hooks
105
+ @hooks ||= configuration.hooks
106
+ end
95
107
  end
96
108
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postgresql-backup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artur Caliendo Prado
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-19 00:00:00.000000000 Z
11
+ date: 2023-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bump
@@ -120,6 +120,7 @@ files:
120
120
  - README.md
121
121
  - lib/Rakefile
122
122
  - lib/configuration.rb
123
+ - lib/hooks.rb
123
124
  - lib/postgresql_backup.rb
124
125
  - lib/railtie.rb
125
126
  - lib/tasks/backup.rake
@@ -146,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
147
  - !ruby/object:Gem::Version
147
148
  version: '0'
148
149
  requirements: []
149
- rubygems_version: 3.0.3
150
+ rubygems_version: 3.2.3
150
151
  signing_key:
151
152
  specification_version: 4
152
153
  summary: Automate PostgreSQL's backup and restore