pg_export 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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