pg_export 0.6.1 → 0.7.0

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.
Files changed (79) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +9 -13
  3. data/.travis.yml +2 -2
  4. data/CHANGELOG.md +9 -0
  5. data/Gemfile +2 -0
  6. data/README.md +28 -29
  7. data/Rakefile +2 -0
  8. data/bin/console +2 -8
  9. data/bin/pg_export +44 -45
  10. data/lib/pg_export/build_logger.rb +4 -2
  11. data/lib/pg_export/configuration.rb +22 -2
  12. data/lib/pg_export/container.rb +48 -0
  13. data/lib/pg_export/import.rb +7 -0
  14. data/lib/pg_export/lib/pg_export/adapters/bash_adapter.rb +37 -0
  15. data/lib/pg_export/lib/pg_export/adapters/ftp_adapter.rb +67 -0
  16. data/lib/pg_export/lib/pg_export/entities/dump.rb +45 -0
  17. data/lib/pg_export/lib/pg_export/factories/cipher_factory.rb +32 -0
  18. data/lib/pg_export/lib/pg_export/factories/dump_factory.rb +31 -0
  19. data/lib/pg_export/lib/pg_export/factories/ftp_adapter_factory.rb +22 -0
  20. data/lib/pg_export/lib/pg_export/listeners/interactive/build_dump.rb +19 -0
  21. data/lib/pg_export/lib/pg_export/listeners/interactive/close_ftp_connection.rb +19 -0
  22. data/lib/pg_export/lib/pg_export/listeners/interactive/decrypt_dump.rb +19 -0
  23. data/lib/pg_export/lib/pg_export/listeners/interactive/download_dump_from_ftp.rb +19 -0
  24. data/lib/pg_export/lib/pg_export/listeners/interactive/encrypt_dump.rb +19 -0
  25. data/lib/pg_export/lib/pg_export/listeners/interactive/fetch_dumps_from_ftp.rb +19 -0
  26. data/lib/pg_export/lib/pg_export/listeners/interactive/open_ftp_connection.rb +19 -0
  27. data/lib/pg_export/lib/pg_export/listeners/interactive/remove_old_dumps_from_ftp.rb +23 -0
  28. data/lib/pg_export/lib/pg_export/listeners/interactive/restore.rb +19 -0
  29. data/lib/pg_export/lib/pg_export/listeners/interactive/upload_dump_to_ftp.rb +19 -0
  30. data/lib/pg_export/lib/pg_export/listeners/interactive_listener.rb +49 -0
  31. data/lib/pg_export/lib/pg_export/listeners/plain/build_dump.rb +15 -0
  32. data/lib/pg_export/lib/pg_export/listeners/plain/close_ftp_connection.rb +15 -0
  33. data/lib/pg_export/lib/pg_export/listeners/plain/decrypt_dump.rb +15 -0
  34. data/lib/pg_export/lib/pg_export/listeners/plain/download_dump_from_ftp.rb +15 -0
  35. data/lib/pg_export/lib/pg_export/listeners/plain/encrypt_dump.rb +15 -0
  36. data/lib/pg_export/lib/pg_export/listeners/plain/fetch_dumps_from_ftp.rb +15 -0
  37. data/lib/pg_export/lib/pg_export/listeners/plain/open_ftp_connection.rb +15 -0
  38. data/lib/pg_export/lib/pg_export/listeners/plain/remove_old_dumps_from_ftp.rb +17 -0
  39. data/lib/pg_export/lib/pg_export/listeners/plain/restore.rb +15 -0
  40. data/lib/pg_export/lib/pg_export/listeners/plain/upload_dump_to_ftp.rb +15 -0
  41. data/lib/pg_export/lib/pg_export/listeners/plain_listener.rb +17 -0
  42. data/lib/pg_export/lib/pg_export/operations/decrypt_dump.rb +20 -0
  43. data/lib/pg_export/lib/pg_export/operations/encrypt_dump.rb +18 -0
  44. data/lib/pg_export/lib/pg_export/operations/open_ftp_connection.rb +19 -0
  45. data/lib/pg_export/lib/pg_export/operations/remove_old_dumps_from_ftp.rb +22 -0
  46. data/lib/pg_export/lib/pg_export/repositories/ftp_dump_file_repository.rb +19 -0
  47. data/lib/pg_export/lib/pg_export/repositories/ftp_dump_repository.rb +36 -0
  48. data/lib/pg_export/lib/pg_export/transactions/export_dump.rb +56 -0
  49. data/lib/pg_export/lib/pg_export/transactions/import_dump_interactively.rb +67 -0
  50. data/lib/pg_export/lib/pg_export/types.rb +14 -0
  51. data/lib/pg_export/lib/pg_export/ui/interactive/input.rb +36 -0
  52. data/lib/pg_export/lib/pg_export/ui/plain/input.rb +17 -0
  53. data/lib/pg_export/lib/pg_export/value_objects/dump_file.rb +70 -0
  54. data/lib/pg_export/system/boot/config.rb +11 -0
  55. data/lib/pg_export/system/boot/interactive.rb +32 -0
  56. data/lib/pg_export/system/boot/logger.rb +15 -0
  57. data/lib/pg_export/system/boot/plain.rb +33 -0
  58. data/lib/pg_export/version.rb +3 -1
  59. data/lib/pg_export.rb +23 -20
  60. data/pg_export.gemspec +13 -10
  61. metadata +108 -52
  62. data/lib/pg_export/aes/base.rb +0 -47
  63. data/lib/pg_export/aes/decryptor.rb +0 -13
  64. data/lib/pg_export/aes/encryptor.rb +0 -13
  65. data/lib/pg_export/aes.rb +0 -3
  66. data/lib/pg_export/bash/adapter.rb +0 -31
  67. data/lib/pg_export/bash/factory.rb +0 -23
  68. data/lib/pg_export/bash/repository.rb +0 -18
  69. data/lib/pg_export/boot_container.rb +0 -69
  70. data/lib/pg_export/dump.rb +0 -62
  71. data/lib/pg_export/errors.rb +0 -5
  72. data/lib/pg_export/ftp/adapter.rb +0 -41
  73. data/lib/pg_export/ftp/connection.rb +0 -40
  74. data/lib/pg_export/ftp/repository.rb +0 -40
  75. data/lib/pg_export/roles/colourable_string.rb +0 -19
  76. data/lib/pg_export/roles/human_readable.rb +0 -17
  77. data/lib/pg_export/roles/interactive.rb +0 -98
  78. data/lib/pg_export/roles/validatable.rb +0 -24
  79. data/lib/pg_export/services/create_and_export_dump.rb +0 -20
@@ -1,40 +0,0 @@
1
- class PgExport
2
- module Ftp
3
- class Repository
4
- def initialize(adapter:, logger:)
5
- @adapter, @logger = adapter, logger
6
- end
7
-
8
- def persist(dump)
9
- adapter.persist(dump.path, dump.timestamped_name)
10
- logger.info "Persist #{dump} #{dump.timestamped_name} to #{adapter}"
11
- end
12
-
13
- def get(db_name)
14
- dump = Dump.new(name: 'Encrypted Dump', db_name: db_name)
15
- adapter.get(dump.path, dump.db_name)
16
- logger.info "Get #{dump} #{db_name} from #{adapter}"
17
- dump
18
- end
19
-
20
- def remove_old(name, keep)
21
- find_by_name(name).drop(keep).each do |filename|
22
- adapter.delete(filename)
23
- logger.info "Remove #{filename} from #{adapter}"
24
- end
25
- end
26
-
27
- def find_by_name(name)
28
- adapter.list(name + '_*')
29
- end
30
-
31
- def all
32
- adapter.list('*')
33
- end
34
-
35
- private
36
-
37
- attr_reader :adapter, :logger
38
- end
39
- end
40
- end
@@ -1,19 +0,0 @@
1
- class PgExport
2
- module Roles
3
- module ColourableString
4
- refine String do
5
- def red
6
- "\e[31m#{self}\e[0m"
7
- end
8
-
9
- def green
10
- "\e[0;32;49m#{self}\e[0m"
11
- end
12
-
13
- def gray
14
- "\e[37m#{self}\e[0m"
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,17 +0,0 @@
1
- class PgExport
2
- module Roles
3
- module HumanReadable
4
- MAPPING = {
5
- 'B' => 1024,
6
- 'kB' => 1024 * 1024,
7
- 'MB' => 1024 * 1024 * 1024,
8
- 'GB' => 1024 * 1024 * 1024 * 1024,
9
- 'TB' => 1024 * 1024 * 1024 * 1024 * 1024
10
- }.freeze
11
-
12
- def size_human
13
- MAPPING.each_pair { |e, s| return "#{(size.to_f / (s / 1024)).round(2)}#{e}" if size < s }
14
- end
15
- end
16
- end
17
- end
@@ -1,98 +0,0 @@
1
- require 'cli_spinnable'
2
- require_relative 'colourable_string'
3
-
4
- class PgExport
5
- module Roles
6
- module Interactive
7
- include CliSpinnable
8
- using ColourableString
9
-
10
- def self.extended(_)
11
- puts 'Interactive mode, for restoring dump into database.'.green
12
- end
13
-
14
- def call(database, _keep_dumps = nil)
15
- initialize_connection
16
- dumps = print_all_dumps
17
- dump = download_dump(select_dump(dumps))
18
- t = Thread.new { container[:ftp_connection].close }
19
- restore_downloaded_dump(dump, database)
20
- t.join
21
- puts 'Success'.green
22
- self
23
- end
24
-
25
- private
26
-
27
- def initialize_connection
28
- with_spinner do |cli|
29
- cli.print 'Connecting to FTP'
30
- container[:ftp_connection].ftp
31
- cli.tick
32
- end
33
- end
34
-
35
- def print_all_dumps
36
- dumps = container[:ftp_repository].all
37
- dumps.each.with_index(1) do |name, i|
38
- print "(#{i}) "
39
- puts name.to_s.gray
40
- end
41
-
42
- dumps
43
- end
44
-
45
- def select_dump(dumps)
46
- puts 'Which dump would you like to import?'
47
- number = loop do
48
- print "Type from 1 to #{dumps.count} (1): "
49
- number = gets.chomp.to_i
50
- break number if (1..dumps.count).cover?(number)
51
- puts 'Invalid number. Please try again.'.red
52
- end
53
-
54
- dumps.fetch(number - 1)
55
- end
56
-
57
- def download_dump(name)
58
- dump = nil
59
-
60
- with_spinner do |cli|
61
- cli.print "Downloading dump #{name}"
62
- encrypted_dump = container[:ftp_repository].get(name)
63
- cli.print " (#{encrypted_dump.size_human})"
64
- cli.tick
65
- cli.print "Decrypting dump #{name}"
66
- dump = container[:decryptor].call(encrypted_dump)
67
- cli.print " (#{dump.size_human})"
68
- cli.tick
69
- end
70
-
71
- dump
72
- rescue OpenSSL::Cipher::CipherError => e
73
- puts "Problem decrypting dump file: #{e}. Try again.".red
74
- retry
75
- end
76
-
77
- def restore_downloaded_dump(dump, database)
78
- puts 'To which database you would like to restore the downloaded dump?'
79
- if database == 'undefined'
80
- print 'Enter a local database name: '
81
- else
82
- print "Enter a local database name (#{database}): "
83
- end
84
- db_name = gets.chomp
85
- db_name = db_name.empty? ? database : db_name
86
- with_spinner do |cli|
87
- cli.print "Restoring dump to #{db_name} database"
88
- container[:bash_repository].persist(dump, db_name)
89
- cli.tick
90
- end
91
- self
92
- rescue PgRestoreError => e
93
- puts e.to_s.red
94
- retry
95
- end
96
- end
97
- end
98
- end
@@ -1,24 +0,0 @@
1
- require 'dry-types'
2
-
3
- class PgExport
4
- module Roles
5
- module Validatable
6
- include Dry::Types.module
7
-
8
- VALID_NON_EMPTY_STRING = Strict::String.constrained(min_size: 1)
9
- VALID_POSITIVE_INTEGER = Strict::Int.constrained(gteq: 0)
10
-
11
- def validate_database_name(database)
12
- VALID_NON_EMPTY_STRING[database]
13
- rescue Dry::Types::ConstraintError
14
- raise ArgumentError, 'The "database" parameter has to be a valid, non-empty string'
15
- end
16
-
17
- def validate_keep_dumps(keep_dumps)
18
- VALID_POSITIVE_INTEGER[keep_dumps]
19
- rescue Dry::Types::ConstraintError
20
- raise ArgumentError, 'The "keep_dumps" parameter has to be a valid, non-negative integer'
21
- end
22
- end
23
- end
24
- end
@@ -1,20 +0,0 @@
1
- class PgExport
2
- module Services
3
- class CreateAndExportDump
4
- def initialize(bash_factory:, encryptor:, ftp_repository:)
5
- @bash_factory, @encryptor, @ftp_repository = bash_factory, encryptor, ftp_repository
6
- end
7
-
8
- def call(database_name, keep_dumps)
9
- dump = bash_factory.build_dump(database_name)
10
- encrypted_dump = encryptor.call(dump)
11
- ftp_repository.persist(encrypted_dump)
12
- ftp_repository.remove_old(database_name, keep_dumps)
13
- end
14
-
15
- private
16
-
17
- attr_reader :bash_factory, :encryptor, :ftp_repository
18
- end
19
- end
20
- end