pg_export 1.0.0.rc4 → 1.0.0.rc8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +42 -6
  3. data/CHANGELOG.md +10 -5
  4. data/README.md +63 -32
  5. data/bin/pg_export +15 -134
  6. data/lib/pg_export/{lib/pg_export/adapters/bash_adapter.rb → adapters/shell_adapter.rb} +1 -1
  7. data/lib/pg_export/commands_factory.rb +158 -0
  8. data/lib/pg_export/configuration.rb +74 -31
  9. data/lib/pg_export/configuration_parser.rb +126 -0
  10. data/lib/pg_export/entities/dump.rb +57 -0
  11. data/lib/pg_export/{lib/pg_export/factories → factories}/cipher_factory.rb +8 -4
  12. data/lib/pg_export/{lib/pg_export/factories → factories}/dump_factory.rb +1 -2
  13. data/lib/pg_export/{lib/pg_export/factories → factories}/ftp_gateway_factory.rb +8 -5
  14. data/lib/pg_export/{lib/pg_export/repositories/gateway_dump_file_repository.rb → factories/gateway_dump_file_factory.rb} +4 -5
  15. data/lib/pg_export/{lib/pg_export/factories → factories}/ssh_gateway_factory.rb +8 -5
  16. data/lib/pg_export/{lib/pg_export/gateways → gateways}/ftp.rb +1 -3
  17. data/lib/pg_export/{lib/pg_export/gateways → gateways}/ssh.rb +2 -6
  18. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/build_dump.rb +1 -1
  19. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/close_connection.rb +1 -1
  20. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/decrypt_dump.rb +0 -0
  21. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/download_dump.rb +0 -0
  22. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/encrypt_dump.rb +0 -0
  23. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/fetch_dumps.rb +0 -0
  24. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/open_connection.rb +0 -0
  25. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/remove_old_dumps.rb +1 -1
  26. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/restore.rb +1 -1
  27. data/lib/pg_export/listeners/interactive/select_database.rb +12 -0
  28. data/lib/pg_export/listeners/interactive/select_dump.rb +12 -0
  29. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/upload_dump.rb +1 -1
  30. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive_listener.rb +4 -3
  31. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/build_dump.rb +0 -0
  32. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/close_connection.rb +0 -0
  33. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/decrypt_dump.rb +0 -0
  34. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/download_dump.rb +0 -0
  35. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/encrypt_dump.rb +0 -0
  36. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/fetch_dumps.rb +0 -0
  37. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/open_connection.rb +0 -0
  38. data/lib/pg_export/listeners/plain/prepare_params.rb +15 -0
  39. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/remove_old_dumps.rb +0 -0
  40. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/restore.rb +0 -0
  41. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/upload_dump.rb +0 -0
  42. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain_listener.rb +11 -5
  43. data/lib/pg_export/operations/decrypt_dump.rb +30 -0
  44. data/lib/pg_export/operations/encrypt_dump.rb +27 -0
  45. data/lib/pg_export/operations/open_connection.rb +28 -0
  46. data/lib/pg_export/operations/remove_old_dumps.rb +34 -0
  47. data/lib/pg_export/{lib/pg_export/repositories → repositories}/gateway_dump_repository.rb +4 -9
  48. data/lib/pg_export/transactions/evaluator.rb +59 -0
  49. data/lib/pg_export/transactions/export_dump.rb +62 -0
  50. data/lib/pg_export/transactions/import_dump_interactively.rb +78 -0
  51. data/lib/pg_export/{lib/pg_export/ui → ui}/interactive/input.rb +0 -0
  52. data/lib/pg_export/{lib/pg_export/ui → ui}/plain/input.rb +0 -0
  53. data/lib/pg_export/{lib/pg_export/value_objects → value_objects}/dump_file.rb +2 -2
  54. data/lib/pg_export/value_objects/result.rb +49 -0
  55. data/lib/pg_export/version.rb +1 -1
  56. data/lib/pg_export.rb +14 -11
  57. data/pg_export.gemspec +2 -9
  58. metadata +57 -129
  59. data/lib/pg_export/container.rb +0 -23
  60. data/lib/pg_export/import.rb +0 -7
  61. data/lib/pg_export/lib/pg_export/entities/dump.rb +0 -45
  62. data/lib/pg_export/lib/pg_export/operations/decrypt_dump.rb +0 -20
  63. data/lib/pg_export/lib/pg_export/operations/encrypt_dump.rb +0 -18
  64. data/lib/pg_export/lib/pg_export/operations/open_connection.rb +0 -19
  65. data/lib/pg_export/lib/pg_export/operations/remove_old_dumps.rb +0 -26
  66. data/lib/pg_export/lib/pg_export/transactions/export_dump.rb +0 -56
  67. data/lib/pg_export/lib/pg_export/transactions/import_dump_interactively.rb +0 -67
  68. data/lib/pg_export/lib/pg_export/types.rb +0 -14
  69. data/lib/pg_export/system/boot/config.rb +0 -27
  70. data/lib/pg_export/system/boot/ftp.rb +0 -11
  71. data/lib/pg_export/system/boot/interactive.rb +0 -26
  72. data/lib/pg_export/system/boot/operations.rb +0 -17
  73. data/lib/pg_export/system/boot/plain.rb +0 -27
  74. data/lib/pg_export/system/boot/ssh.rb +0 -11
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_export
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc4
4
+ version: 1.0.0.rc8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Krzysztof Maicher
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-21 00:00:00.000000000 Z
11
+ date: 2022-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bcrypt_pbkdf
@@ -24,76 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: dry-initializer
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '3.0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '3.0'
41
- - !ruby/object:Gem::Dependency
42
- name: dry-struct
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '1.0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '1.0'
55
- - !ruby/object:Gem::Dependency
56
- name: dry-system
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '0.18'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '0.18'
69
- - !ruby/object:Gem::Dependency
70
- name: dry-transaction
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '0.13'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '0.13'
83
- - !ruby/object:Gem::Dependency
84
- name: dry-types
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '1.0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '1.0'
97
27
  - !ruby/object:Gem::Dependency
98
28
  name: ed25519
99
29
  requirement: !ruby/object:Gem::Requirement
@@ -238,16 +168,16 @@ dependencies:
238
168
  name: rubocop
239
169
  requirement: !ruby/object:Gem::Requirement
240
170
  requirements:
241
- - - "~>"
171
+ - - '='
242
172
  - !ruby/object:Gem::Version
243
- version: 0.59.2
173
+ version: '0.81'
244
174
  type: :development
245
175
  prerelease: false
246
176
  version_requirements: !ruby/object:Gem::Requirement
247
177
  requirements:
248
- - - "~>"
178
+ - - '='
249
179
  - !ruby/object:Gem::Version
250
- version: 0.59.2
180
+ version: '0.81'
251
181
  description: CLI for exporting/importing PostgreSQL dumps via FTP/SSH. Can
252
182
  be used for backups or synchronizing databases between production and development
253
183
  environments.
@@ -273,64 +203,62 @@ files:
273
203
  - bin/pg_export
274
204
  - bin/setup
275
205
  - lib/pg_export.rb
206
+ - lib/pg_export/adapters/shell_adapter.rb
207
+ - lib/pg_export/commands_factory.rb
276
208
  - lib/pg_export/configuration.rb
277
- - lib/pg_export/container.rb
278
- - lib/pg_export/import.rb
279
- - lib/pg_export/lib/pg_export/adapters/bash_adapter.rb
280
- - lib/pg_export/lib/pg_export/entities/dump.rb
281
- - lib/pg_export/lib/pg_export/factories/cipher_factory.rb
282
- - lib/pg_export/lib/pg_export/factories/dump_factory.rb
283
- - lib/pg_export/lib/pg_export/factories/ftp_gateway_factory.rb
284
- - lib/pg_export/lib/pg_export/factories/ssh_gateway_factory.rb
285
- - lib/pg_export/lib/pg_export/gateways/ftp.rb
286
- - lib/pg_export/lib/pg_export/gateways/ssh.rb
287
- - lib/pg_export/lib/pg_export/listeners/interactive/build_dump.rb
288
- - lib/pg_export/lib/pg_export/listeners/interactive/close_connection.rb
289
- - lib/pg_export/lib/pg_export/listeners/interactive/decrypt_dump.rb
290
- - lib/pg_export/lib/pg_export/listeners/interactive/download_dump.rb
291
- - lib/pg_export/lib/pg_export/listeners/interactive/encrypt_dump.rb
292
- - lib/pg_export/lib/pg_export/listeners/interactive/fetch_dumps.rb
293
- - lib/pg_export/lib/pg_export/listeners/interactive/open_connection.rb
294
- - lib/pg_export/lib/pg_export/listeners/interactive/remove_old_dumps.rb
295
- - lib/pg_export/lib/pg_export/listeners/interactive/restore.rb
296
- - lib/pg_export/lib/pg_export/listeners/interactive/upload_dump.rb
297
- - lib/pg_export/lib/pg_export/listeners/interactive_listener.rb
298
- - lib/pg_export/lib/pg_export/listeners/plain/build_dump.rb
299
- - lib/pg_export/lib/pg_export/listeners/plain/close_connection.rb
300
- - lib/pg_export/lib/pg_export/listeners/plain/decrypt_dump.rb
301
- - lib/pg_export/lib/pg_export/listeners/plain/download_dump.rb
302
- - lib/pg_export/lib/pg_export/listeners/plain/encrypt_dump.rb
303
- - lib/pg_export/lib/pg_export/listeners/plain/fetch_dumps.rb
304
- - lib/pg_export/lib/pg_export/listeners/plain/open_connection.rb
305
- - lib/pg_export/lib/pg_export/listeners/plain/remove_old_dumps.rb
306
- - lib/pg_export/lib/pg_export/listeners/plain/restore.rb
307
- - lib/pg_export/lib/pg_export/listeners/plain/upload_dump.rb
308
- - lib/pg_export/lib/pg_export/listeners/plain_listener.rb
309
- - lib/pg_export/lib/pg_export/operations/decrypt_dump.rb
310
- - lib/pg_export/lib/pg_export/operations/encrypt_dump.rb
311
- - lib/pg_export/lib/pg_export/operations/open_connection.rb
312
- - lib/pg_export/lib/pg_export/operations/remove_old_dumps.rb
313
- - lib/pg_export/lib/pg_export/repositories/gateway_dump_file_repository.rb
314
- - lib/pg_export/lib/pg_export/repositories/gateway_dump_repository.rb
315
- - lib/pg_export/lib/pg_export/transactions/export_dump.rb
316
- - lib/pg_export/lib/pg_export/transactions/import_dump_interactively.rb
317
- - lib/pg_export/lib/pg_export/types.rb
318
- - lib/pg_export/lib/pg_export/ui/interactive/input.rb
319
- - lib/pg_export/lib/pg_export/ui/plain/input.rb
320
- - lib/pg_export/lib/pg_export/value_objects/dump_file.rb
321
- - lib/pg_export/system/boot/config.rb
322
- - lib/pg_export/system/boot/ftp.rb
323
- - lib/pg_export/system/boot/interactive.rb
324
- - lib/pg_export/system/boot/operations.rb
325
- - lib/pg_export/system/boot/plain.rb
326
- - lib/pg_export/system/boot/ssh.rb
209
+ - lib/pg_export/configuration_parser.rb
210
+ - lib/pg_export/entities/dump.rb
211
+ - lib/pg_export/factories/cipher_factory.rb
212
+ - lib/pg_export/factories/dump_factory.rb
213
+ - lib/pg_export/factories/ftp_gateway_factory.rb
214
+ - lib/pg_export/factories/gateway_dump_file_factory.rb
215
+ - lib/pg_export/factories/ssh_gateway_factory.rb
216
+ - lib/pg_export/gateways/ftp.rb
217
+ - lib/pg_export/gateways/ssh.rb
218
+ - lib/pg_export/listeners/interactive/build_dump.rb
219
+ - lib/pg_export/listeners/interactive/close_connection.rb
220
+ - lib/pg_export/listeners/interactive/decrypt_dump.rb
221
+ - lib/pg_export/listeners/interactive/download_dump.rb
222
+ - lib/pg_export/listeners/interactive/encrypt_dump.rb
223
+ - lib/pg_export/listeners/interactive/fetch_dumps.rb
224
+ - lib/pg_export/listeners/interactive/open_connection.rb
225
+ - lib/pg_export/listeners/interactive/remove_old_dumps.rb
226
+ - lib/pg_export/listeners/interactive/restore.rb
227
+ - lib/pg_export/listeners/interactive/select_database.rb
228
+ - lib/pg_export/listeners/interactive/select_dump.rb
229
+ - lib/pg_export/listeners/interactive/upload_dump.rb
230
+ - lib/pg_export/listeners/interactive_listener.rb
231
+ - lib/pg_export/listeners/plain/build_dump.rb
232
+ - lib/pg_export/listeners/plain/close_connection.rb
233
+ - lib/pg_export/listeners/plain/decrypt_dump.rb
234
+ - lib/pg_export/listeners/plain/download_dump.rb
235
+ - lib/pg_export/listeners/plain/encrypt_dump.rb
236
+ - lib/pg_export/listeners/plain/fetch_dumps.rb
237
+ - lib/pg_export/listeners/plain/open_connection.rb
238
+ - lib/pg_export/listeners/plain/prepare_params.rb
239
+ - lib/pg_export/listeners/plain/remove_old_dumps.rb
240
+ - lib/pg_export/listeners/plain/restore.rb
241
+ - lib/pg_export/listeners/plain/upload_dump.rb
242
+ - lib/pg_export/listeners/plain_listener.rb
243
+ - lib/pg_export/operations/decrypt_dump.rb
244
+ - lib/pg_export/operations/encrypt_dump.rb
245
+ - lib/pg_export/operations/open_connection.rb
246
+ - lib/pg_export/operations/remove_old_dumps.rb
247
+ - lib/pg_export/repositories/gateway_dump_repository.rb
248
+ - lib/pg_export/transactions/evaluator.rb
249
+ - lib/pg_export/transactions/export_dump.rb
250
+ - lib/pg_export/transactions/import_dump_interactively.rb
251
+ - lib/pg_export/ui/interactive/input.rb
252
+ - lib/pg_export/ui/plain/input.rb
253
+ - lib/pg_export/value_objects/dump_file.rb
254
+ - lib/pg_export/value_objects/result.rb
327
255
  - lib/pg_export/version.rb
328
256
  - pg_export.gemspec
329
257
  homepage: https://github.com/maicher/pg_export
330
258
  licenses:
331
259
  - MIT
332
260
  metadata: {}
333
- post_install_message:
261
+ post_install_message:
334
262
  rdoc_options: []
335
263
  require_paths:
336
264
  - lib
@@ -346,7 +274,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
346
274
  version: 1.3.1
347
275
  requirements: []
348
276
  rubygems_version: 3.2.3
349
- signing_key:
277
+ signing_key:
350
278
  specification_version: 4
351
279
  summary: CLI for exporting/importing PostgreSQL dumps via FTP/SSH.
352
280
  test_files: []
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/system/container'
4
-
5
- class PgExport
6
- class Container < Dry::System::Container
7
- configure do
8
- config.root = Pathname(__FILE__).realpath.dirname
9
- config.name = :pg_export
10
- config.default_namespace = 'pg_export'
11
- config.auto_register = %w[lib]
12
- end
13
-
14
- load_paths!('lib')
15
-
16
- boot(:main) do |system|
17
- use(:config)
18
- use(system[:config].gateway) # ftp/ssh
19
- use(:operations)
20
- use(system[:config].mode) # plain/interactive
21
- end
22
- end
23
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'container'
4
-
5
- class PgExport
6
- Import = PgExport::Container.injector
7
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry-initializer'
4
- require 'pg_export/lib/pg_export/types'
5
-
6
- class PgExport
7
- module Entities
8
- class Dump
9
- extend Dry::Initializer[undefined: false]
10
-
11
- option :name, Types::DumpName
12
- option :type, Types::DumpType
13
- option :database, Types::Strict::String.constrained(filled: true)
14
- option :file, Types::DumpFile, default: proc { PgExport::ValueObjects::DumpFile.new }
15
-
16
- def encrypt(cipher_factory:)
17
- self.file = file.copy(cipher: cipher_factory.encryptor)
18
- self.type = :encrypted
19
-
20
- self
21
- end
22
-
23
- def decrypt(cipher_factory:)
24
- self.file = file.copy(cipher: cipher_factory.decryptor)
25
- self.type = :plain
26
-
27
- self
28
- end
29
-
30
- def to_s
31
- "#{name} (#{file.size_human})"
32
- end
33
-
34
- def file=(f)
35
- @file = Types::DumpFile[f]
36
- end
37
-
38
- protected
39
-
40
- def type=(t)
41
- @type = Types::DumpType[t]
42
- end
43
- end
44
- end
45
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/transaction/operation'
4
- require 'pg_export/import'
5
-
6
- class PgExport
7
- module Operations
8
- class DecryptDump
9
- include Dry::Transaction::Operation
10
- include Import['factories.cipher_factory']
11
-
12
- def call(dump:)
13
- dump.decrypt(cipher_factory: cipher_factory)
14
- Success(dump: dump)
15
- rescue OpenSSL::Cipher::CipherError => e
16
- Failure(message: "Problem decrypting dump file: #{e}. Try again.")
17
- end
18
- end
19
- end
20
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/transaction/operation'
4
- require 'pg_export/import'
5
-
6
- class PgExport
7
- module Operations
8
- class EncryptDump
9
- include Dry::Transaction::Operation
10
- include Import['factories.cipher_factory']
11
-
12
- def call(dump:)
13
- dump.encrypt(cipher_factory: cipher_factory)
14
- Success(dump: dump)
15
- end
16
- end
17
- end
18
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/transaction/operation'
4
- require 'pg_export/import'
5
-
6
- class PgExport
7
- module Operations
8
- class OpenConnection
9
- include Dry::Transaction::Operation
10
- include Import['factories.gateway_factory']
11
-
12
- def call(inputs)
13
- gateway = gateway_factory.gateway
14
- gateway.open
15
- Success(inputs.merge(gateway: gateway))
16
- end
17
- end
18
- end
19
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/transaction/operation'
4
- require 'pg_export/import'
5
-
6
- class PgExport
7
- module Operations
8
- class RemoveOldDumps
9
- include Dry::Transaction::Operation
10
- include Import['repositories.gateway_dump_repository', 'config']
11
-
12
- def call(dump:, gateway:)
13
- dumps = gateway_dump_repository.by_database_name(
14
- database_name: dump.database,
15
- gateway: gateway,
16
- offset: config.keep_dumps
17
- )
18
- dumps.each do |d|
19
- gateway.delete(d.name)
20
- end
21
-
22
- Success(removed_dumps: dumps, gateway: gateway)
23
- end
24
- end
25
- end
26
- end
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # auto_register: false
4
-
5
- require 'dry/transaction'
6
-
7
- require 'pg_export/import'
8
- require 'pg_export/container'
9
- require 'pg_export/lib/pg_export/value_objects/dump_file'
10
-
11
- class PgExport
12
- module Transactions
13
- class ExportDump
14
- include Dry::Transaction(container: PgExport::Container)
15
- include Import['factories.dump_factory', 'adapters.bash_adapter']
16
-
17
- step :prepare_params
18
- step :build_dump
19
- step :encrypt_dump, with: 'operations.encrypt_dump'
20
- step :open_connection, with: 'operations.open_connection'
21
- step :upload_dump
22
- step :remove_old_dumps, with: 'operations.remove_old_dumps'
23
- step :close_connection
24
-
25
- private
26
-
27
- def prepare_params(database_name:)
28
- database_name = database_name.to_s
29
-
30
- return Failure(message: 'Invalid database name') if database_name.empty?
31
-
32
- Success(database_name: database_name)
33
- end
34
-
35
- def build_dump(database_name:)
36
- dump = dump_factory.plain(
37
- database: database_name,
38
- file: bash_adapter.pg_dump(ValueObjects::DumpFile.new, database_name)
39
- )
40
- Success(dump: dump)
41
- rescue bash_adapter.class::PgDumpError => e
42
- Failure(message: 'Unable to dump database: ' + e.to_s)
43
- end
44
-
45
- def upload_dump(dump:, gateway:)
46
- gateway.persist(dump.file, dump.name)
47
- Success(dump: dump, gateway: gateway)
48
- end
49
-
50
- def close_connection(removed_dumps:, gateway:)
51
- gateway.close
52
- Success(gateway: gateway)
53
- end
54
- end
55
- end
56
- end
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # auto_register: false
4
-
5
- require 'dry/transaction'
6
-
7
- require 'pg_export/import'
8
- require 'pg_export/container'
9
-
10
- class PgExport
11
- module Transactions
12
- class ImportDumpInteractively
13
- include Dry::Transaction(container: PgExport::Container)
14
- include Import[
15
- 'adapters.bash_adapter',
16
- 'repositories.gateway_dump_repository',
17
- 'repositories.gateway_dump_file_repository',
18
- 'ui_input'
19
- ]
20
-
21
- step :open_connection, with: 'operations.open_connection'
22
- step :fetch_dumps
23
- step :select_dump
24
- step :download_dump
25
- step :close_connection
26
- step :decrypt_dump, with: 'operations.decrypt_dump'
27
- step :select_database
28
- step :restore
29
-
30
- private
31
-
32
- def fetch_dumps(database_name:, gateway:)
33
- dumps = gateway_dump_repository.all(database_name: database_name, gateway: gateway)
34
- return Failure(message: 'No dumps') if dumps.none?
35
-
36
- Success(gateway: gateway, dumps: dumps)
37
- end
38
-
39
- def select_dump(dumps:, gateway:)
40
- dump = ui_input.select_dump(dumps)
41
- Success(dump: dump, gateway: gateway)
42
- end
43
-
44
- def download_dump(dump:, gateway:)
45
- dump.file = gateway_dump_file_repository.by_name(name: dump.name, gateway: gateway)
46
- Success(dump: dump, gateway: gateway)
47
- end
48
-
49
- def close_connection(dump:, gateway:)
50
- Thread.new { gateway.close }
51
- Success(dump: dump)
52
- end
53
-
54
- def select_database(dump:)
55
- name = ui_input.enter_database_name(dump.database)
56
- Success(dump: dump, database: name)
57
- end
58
-
59
- def restore(dump:, database:)
60
- bash_adapter.pg_restore(dump.file, database)
61
- Success({})
62
- rescue bash_adapter.class::PgRestoreError => e
63
- Failure(message: e.to_s)
64
- end
65
- end
66
- end
67
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry-types'
4
- require 'pg_export/lib/pg_export/value_objects/dump_file'
5
-
6
- class PgExport
7
- module Types
8
- include Dry::Types()
9
-
10
- DumpName = Strict::String.constrained(format: /.+_20[0-9]{6}_[0-9]{6}\Z/)
11
- DumpType = Types::Coercible::String.enum('plain', 'encrypted')
12
- DumpFile = Types.Instance(PgExport::ValueObjects::DumpFile)
13
- end
14
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- PgExport::Container.boot :config do
4
- init do
5
- require 'logger'
6
- require 'pg_export/lib/pg_export/types'
7
- require 'pg_export/configuration'
8
- end
9
-
10
- start do
11
- config = PgExport::Configuration.build(ENV)
12
-
13
- formatters = {
14
- plain: ->(_, _, _, message) { "#{message}\n" },
15
- muted: ->(*) { raise 'Do not initialize logger when it is muted' },
16
- timestamped: lambda do |severity, datetime, progname, message|
17
- "#{datetime} #{Process.pid} TID-#{Thread.current.object_id.to_s(36)}#{progname} #{severity}: #{message}\n"
18
- end
19
- }
20
-
21
- register(:logger, memoize: true) do
22
- Logger.new($stdout, formatter: formatters.fetch(config.logger_format.to_sym))
23
- end
24
-
25
- register(:config, memoize: true) { config }
26
- end
27
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- PgExport::Container.boot(:ftp) do
4
- init do
5
- require 'pg_export/lib/pg_export/factories/ftp_gateway_factory'
6
- end
7
-
8
- start do
9
- register('factories.gateway_factory') { ::PgExport::Factories::FtpGatewayFactory.new }
10
- end
11
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- PgExport::Container.boot(:interactive) do
4
- init do
5
- require 'pg_export/lib/pg_export/transactions/import_dump_interactively'
6
- end
7
-
8
- start do
9
- type = 'interactive'
10
- transaction = PgExport::Transactions::ImportDumpInteractively.new(ui_input: target["ui.#{type}.input"])
11
-
12
- unless target[:config].logger_muted?
13
- %i[
14
- open_connection
15
- fetch_dumps
16
- download_dump
17
- decrypt_dump
18
- restore
19
- ].each do |step|
20
- transaction.subscribe(step => target["listeners.#{type}.#{step}"])
21
- end
22
- end
23
-
24
- register('transaction', memoize: true) { transaction }
25
- end
26
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- PgExport::Container.boot(:operations) do
4
- init do
5
- require 'pg_export/lib/pg_export/operations/encrypt_dump'
6
- require 'pg_export/lib/pg_export/operations/decrypt_dump'
7
- require 'pg_export/lib/pg_export/operations/remove_old_dumps'
8
- require 'pg_export/lib/pg_export/operations/open_connection'
9
- end
10
-
11
- start do
12
- register('operations.encrypt_dump') { ::PgExport::Operations::EncryptDump.new }
13
- register('operations.decrypt_dump') { ::PgExport::Operations::DecryptDump.new }
14
- register('operations.remove_old_dumps') { ::PgExport::Operations::RemoveOldDumps.new }
15
- register('operations.open_connection') { ::PgExport::Operations::OpenConnection.new }
16
- end
17
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- PgExport::Container.boot(:plain) do
4
- init do
5
- require 'pg_export/lib/pg_export/transactions/export_dump'
6
- end
7
-
8
- start do
9
- transaction = PgExport::Transactions::ExportDump.new
10
-
11
- unless target[:config].logger_muted?
12
- type = 'plain'
13
- %i[
14
- build_dump
15
- encrypt_dump
16
- open_connection
17
- upload_dump
18
- remove_old_dumps
19
- close_connection
20
- ].each do |step|
21
- transaction.subscribe(step => target["listeners.#{type}.#{step}"])
22
- end
23
- end
24
-
25
- register('transaction', memoize: true) { transaction }
26
- end
27
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- PgExport::Container.boot(:ssh) do
4
- init do
5
- require 'pg_export/lib/pg_export/factories/ssh_gateway_factory'
6
- end
7
-
8
- start do
9
- register('factories.gateway_factory') { ::PgExport::Factories::SshGatewayFactory.new }
10
- end
11
- end