remote_database_importer 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cc2634f7ebf5e2ab65295a75ce3a851bfdc12632be061376b921e20689a7e614
4
+ data.tar.gz: 62e21889fbbc2ecff1ec1d9eae582a112bb8121509c31118558bab4ed947c190
5
+ SHA512:
6
+ metadata.gz: a2dab0f7513fba0965b73effd56c2aeeb96c24f85ace4fff2d97e40b0f13c960d517321e950381923c0534b565891c885c10e7ed36ebc0c51899cf0303c8bb4b
7
+ data.tar.gz: ff8507cff4411cb07295a3faddb54df8d263573c15baff4ffcfb493f5379956cc969fb08ca3edf1fc8790ed26618539134e99323a2afa48d8ca9290bf477dc22
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.standard.yml ADDED
@@ -0,0 +1,3 @@
1
+ # For available configuration options, see:
2
+ # https://github.com/testdouble/standard
3
+ ruby_version: 2.6
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ ## [0.1.0] - 2022-10-24
4
+
5
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in remote_database_importer.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
9
+
10
+ gem "rspec", "~> 3.0"
11
+
12
+ gem "standard", "~> 1.3"
data/Gemfile.lock ADDED
@@ -0,0 +1,80 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ remote_database_importer (0.1.0)
5
+ colorize (~> 0.8)
6
+ thor (~> 1.2)
7
+ tty-config (~> 0.6)
8
+ tty-spinner (~> 0.9)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ ast (2.4.2)
14
+ coderay (1.1.3)
15
+ colorize (0.8.1)
16
+ diff-lcs (1.5.0)
17
+ json (2.6.2)
18
+ method_source (1.0.0)
19
+ parallel (1.22.1)
20
+ parser (3.1.2.1)
21
+ ast (~> 2.4.1)
22
+ pry (0.14.1)
23
+ coderay (~> 1.1)
24
+ method_source (~> 1.0)
25
+ rainbow (3.1.1)
26
+ rake (13.0.6)
27
+ regexp_parser (2.6.0)
28
+ rexml (3.2.5)
29
+ rspec (3.11.0)
30
+ rspec-core (~> 3.11.0)
31
+ rspec-expectations (~> 3.11.0)
32
+ rspec-mocks (~> 3.11.0)
33
+ rspec-core (3.11.0)
34
+ rspec-support (~> 3.11.0)
35
+ rspec-expectations (3.11.1)
36
+ diff-lcs (>= 1.2.0, < 2.0)
37
+ rspec-support (~> 3.11.0)
38
+ rspec-mocks (3.11.1)
39
+ diff-lcs (>= 1.2.0, < 2.0)
40
+ rspec-support (~> 3.11.0)
41
+ rspec-support (3.11.1)
42
+ rubocop (1.35.1)
43
+ json (~> 2.3)
44
+ parallel (~> 1.10)
45
+ parser (>= 3.1.2.1)
46
+ rainbow (>= 2.2.2, < 4.0)
47
+ regexp_parser (>= 1.8, < 3.0)
48
+ rexml (>= 3.2.5, < 4.0)
49
+ rubocop-ast (>= 1.20.1, < 2.0)
50
+ ruby-progressbar (~> 1.7)
51
+ unicode-display_width (>= 1.4.0, < 3.0)
52
+ rubocop-ast (1.23.0)
53
+ parser (>= 3.1.1.0)
54
+ rubocop-performance (1.14.3)
55
+ rubocop (>= 1.7.0, < 2.0)
56
+ rubocop-ast (>= 0.4.0)
57
+ ruby-progressbar (1.11.0)
58
+ standard (1.16.1)
59
+ rubocop (= 1.35.1)
60
+ rubocop-performance (= 1.14.3)
61
+ thor (1.2.1)
62
+ tty-config (0.6.0)
63
+ tty-cursor (0.7.1)
64
+ tty-spinner (0.9.3)
65
+ tty-cursor (~> 0.7)
66
+ unicode-display_width (2.3.0)
67
+
68
+ PLATFORMS
69
+ arm64-darwin-21
70
+ x86_64-linux
71
+
72
+ DEPENDENCIES
73
+ pry (~> 0.14)
74
+ rake (~> 13.0)
75
+ remote_database_importer!
76
+ rspec (~> 3.0)
77
+ standard (~> 1.3)
78
+
79
+ BUNDLED WITH
80
+ 2.3.7
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2022 Leon
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # RemoteDatabaseImporter
2
+ **RemoteDatabaseImporter** is a small gem with one specific reason to exist: Dump remote databases and import it locally.
3
+
4
+ **This gem is currently in beta phase!**
5
+ Its well possible that unexpected errors can occur.
6
+
7
+ ## Features
8
+ - Define multiple environments (such as staging, production etc.)
9
+ - Rails intergration via rake task
10
+ - Decide for yourself if the dump should be done over ssh or if pg_dump should connect to the DB port directly
11
+ - It can therefore be used for almost all hosting providers (Heroku, Kubernetes, self-hosted, etc.)
12
+
13
+ ## Installation
14
+
15
+ Add this line to your application's gemfile:
16
+
17
+ ```ruby
18
+ gem 'remote_database_importer'
19
+ ```
20
+
21
+ And then execute:
22
+
23
+ $ bundle install
24
+
25
+ Or install it yourself as:
26
+
27
+ $ gem install remote_database_importer
28
+
29
+ ## Usage
30
+ Whenever you want current live data, you can run the command:
31
+
32
+ ```ruby
33
+ rake remote_database:import
34
+ ```
35
+
36
+ ![Import Job Demo](readme_images/import-job.gif)
37
+
38
+ ### Config
39
+ The settings for the different environments is stored in the `remote_database_importer.yml` file.
40
+ When you first run the rake task, it will dynamically create this file for you.
41
+
42
+
43
+ ![asdf](readme_images/config_sample.png)
44
+
45
+ ### DB Access
46
+ The easiest and fastest way is to exchange your ssh-key with the server beforehand, so you don't have to enter a password.
47
+ Otherwise during the rake task execution a password entry is required.
48
+
49
+ The effective dump call is as follows:
50
+ ```ruby
51
+ "ssh SSH_USER@HOST -p SSH_PORT 'pg_dump -Fc -U DB_USER -d DB_NAME -h localhost -C' > DB_DUMP_LOCATION"
52
+ or
53
+ "pg_dump -Fc 'host=HOST dbname=DB_NAME user=DB_USER port=POSTGRES_PORT' > DB_DUMP_LOCATION"
54
+ ```
55
+
56
+ ## Limitations
57
+ - At the moment only Postgres databases are supported
58
+ - It has to run inside a Rails app. There is a CLI command `remote_database_importer import` as an alternative to the rake task, but there are still some Rails commands like `rails db:drop db:create - rails db:migrate`, which makes it currently not possible to use the gem outside of Rails
59
+ - Not suitable for very large databases, you could run into SSH timeouts
60
+
61
+ ## Contributing
62
+
63
+ Bug reports and pull requests are very welcome!
64
+
65
+ ## License
66
+
67
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "standard/rake"
9
+
10
+ task default: %i[spec standard]
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'thor'
4
+ require_relative '../lib/remote_database_importer/operation'
5
+
6
+ class RemoteDatabaseImporterCLI < Thor
7
+ desc "Restore remote database and import it locally", "asdf"
8
+ def import
9
+ importer = RemoteDatabaseImporter::Operation.new
10
+ importer.import
11
+ end
12
+ end
13
+
14
+ RemoteDatabaseImporterCLI.start
data/lib/railtie.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "remote_database_importer"
2
+ require "rails"
3
+
4
+ module RemoteDatabaseImporter
5
+ class Railtie < Rails::Railtie
6
+ rake_tasks do
7
+ load "tasks/remote_database_importer.rake"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,99 @@
1
+ module RemoteDatabaseImporter
2
+ class Config
3
+ require "tty/config"
4
+ require "colorize"
5
+
6
+ def initialize
7
+ @config = TTY::Config.new
8
+ @config.filename = "remote_database_importer"
9
+ @config.extname = ".yml"
10
+ @config.append_path Dir.pwd
11
+ end
12
+
13
+ def read_or_create_configfile
14
+ unless @config.exist?
15
+ puts "===========================================================".colorize(:green)
16
+ puts "Hi there! There is no config file yet, lets create one! 😄"
17
+ create_default_config
18
+ puts "===========================================================".colorize(:green)
19
+ end
20
+ @config.read
21
+ end
22
+
23
+ def ask(question, default: nil, options: nil)
24
+ question += " (#{options.join(" / ")})" if options.present?
25
+ question += " [#{default}]" if default.present?
26
+
27
+ puts question.colorize(:light_blue)
28
+ answer = $stdin.gets.chomp
29
+ answer.present? ? answer : default
30
+ end
31
+
32
+ def create_default_config
33
+ enter_new_environments = true
34
+ environment_count = 1
35
+
36
+ local_db_name = ask("Whats the name of the local database you wanna import to?", default: "myawesomeapp_development")
37
+ @config.set(:local_db_name, value: local_db_name)
38
+ puts
39
+
40
+ while enter_new_environments
41
+ puts "#{environment_count}. Environment".colorize(:green)
42
+ env = ask("Whats the name of the #{environment_count}. environment you wanna add?", default: "staging")
43
+ puts
44
+
45
+ puts "Database settings:".colorize(:green)
46
+ db_name = ask("Enter the DB name for the #{env} environment:", default: "myawesomeapp_#{env}")
47
+ db_user = ask("Enter the DB user for the #{env} environment:", default: "deployer")
48
+ puts
49
+
50
+ puts "Connection settings:".colorize(:green)
51
+ host = ask("Enter the IP or hostname of the DB server:", default: "myawesomeapp.com")
52
+ dump_type = ask("Should the dump happen over a ssh connection or can pg_dump access the DB port directly? (if the DB lives on a seperat server pg_dump the way to go)", default: "pg_dump", options: ["ssh", "pg_dump"])
53
+
54
+ ssh_user, ssh_port, postgres_port = nil
55
+ if dump_type == "ssh"
56
+ ssh_user = ask("Enter the username for the SSH connection:", default: "deployer")
57
+ ssh_port = ask("Enter the port for the SSH connection:", default: "22")
58
+ else
59
+ postgres_port = ask("Enter the database port for the pg_dump command:", default: "5432")
60
+ end
61
+ puts
62
+
63
+ env_config = {
64
+ env.to_s => {
65
+ "database" => {
66
+ "name" => db_name,
67
+ "user" => db_user
68
+ },
69
+ "connection" => {
70
+ "host" => host,
71
+ "dump_type" => dump_type,
72
+ "postgres_port" => postgres_port,
73
+ "ssh_user" => ssh_user,
74
+ "ssh_port" => ssh_port
75
+ }
76
+ }
77
+ }
78
+ @config.append(env_config, to: :environments)
79
+
80
+ continue = ask("Do you wanna add another environment? (anything other than 'yes' will exit)")
81
+ if continue&.downcase == "yes"
82
+ environment_count += 1
83
+ else
84
+ enter_new_environments = false
85
+ end
86
+ end
87
+
88
+ @config.write
89
+ end
90
+
91
+ # TODO: validate user input
92
+ # private
93
+ # def validate_config(config)
94
+ # config.each do |key, value|
95
+ #
96
+ # end
97
+ # end
98
+ end
99
+ end
@@ -0,0 +1,112 @@
1
+ module RemoteDatabaseImporter
2
+ class Operation
3
+ require "remote_database_importer/config"
4
+ require "tty/spinner/multi"
5
+ require "pry"
6
+
7
+ LOG_FILE = "tmp/remote_database_importer.log"
8
+
9
+ def initialize
10
+ config_handler = RemoteDatabaseImporter::Config.new
11
+ @config = config_handler.read_or_create_configfile
12
+ end
13
+
14
+ def environments
15
+ @config.fetch("environments")
16
+ end
17
+
18
+ def select_environment
19
+ if environments.size > 1
20
+ puts "Select the operation environment:"
21
+
22
+ environments.map(&:keys).flatten.each_with_index do |env, index|
23
+ puts "#{index} for #{env.capitalize}"
24
+ end
25
+ env = environments[$stdin.gets.chomp.to_i].values[0]
26
+ raise "Environment couldn't be found!" if env.blank?
27
+ @current_environment = env
28
+ return
29
+ end
30
+
31
+ @current_environment = environments[0].values[0]
32
+ end
33
+
34
+ def import
35
+ select_environment
36
+ multi_spinner = TTY::Spinner::Multi.new("[:spinner] Import remote DB", format: :dots_3)
37
+ tasks = create_tasks_and_spinners(multi_spinner)
38
+
39
+ puts "Be aware, you may get asked for a password for the ssh or db connection"
40
+ tasks.each do |task|
41
+ task[:spinner].auto_spin
42
+ task_execution_was_successful = system(task[:command])
43
+ return "Can't continue, following task failed: #{task[:command]} - checkout the logfile: #{LOG_FILE}" unless task_execution_was_successful
44
+ task[:spinner].stop("... Done!")
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def create_tasks_and_spinners(multi_spinner)
51
+ tasks = [
52
+ {name: "Terminate current DB sessions", command: terminate_current_db_sessions},
53
+ {name: "Dump remote DB", command: dump_remote_db},
54
+ {name: "Drop and create local DB", command: drop_and_create_local_db},
55
+ {name: "Restore remote DB", command: restore_db},
56
+ {name: "Run migrations", command: run_migrations},
57
+ {name: "Remove logfile", command: remove_logfile},
58
+ {name: "Remove dumpfile", command: remove_dumpfile}
59
+ ]
60
+ tasks.each.with_index(1) do |task, index|
61
+ task[:spinner] = multi_spinner.register "#{index}/#{tasks.length} :spinner #{task[:name]}"
62
+ end
63
+ tasks
64
+ end
65
+
66
+ # terminate local db sessions, otherwise the db can't be dropped
67
+ def terminate_current_db_sessions
68
+ "psql -d #{@config.fetch("local_db_name")} -c 'SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE datname = current_database() AND pid <> pg_backend_pid();' > #{LOG_FILE}"
69
+ end
70
+
71
+ def dump_remote_db
72
+ env = @current_environment
73
+ host = env["connection"]["host"]
74
+ db_name = env["database"]["name"]
75
+ db_user = env["database"]["user"]
76
+ dump_type = env["connection"]["dump_type"]
77
+ ssh_user = env["connection"]["ssh_user"]
78
+ ssh_port = env["connection"]["ssh_port"]
79
+ postgres_port = env["connection"]["postgres_port"]
80
+
81
+ if dump_type == "ssh"
82
+ "ssh #{ssh_user}@#{host} -p #{ssh_port} 'pg_dump -Fc -U #{db_user} -d #{db_name} -h localhost -C' > #{db_dump_location}"
83
+ else
84
+ "pg_dump -Fc 'host=#{host} dbname=#{db_name} user=#{db_user} port=#{postgres_port}' > #{db_dump_location}"
85
+ end
86
+ end
87
+
88
+ def drop_and_create_local_db
89
+ "rails db:environment:set RAILS_ENV=development; rake db:drop db:create > #{LOG_FILE}"
90
+ end
91
+
92
+ def restore_db
93
+ "pg_restore --jobs 8 --no-privileges --no-owner --dbname #{@config.fetch("local_db_name")} #{db_dump_location}"
94
+ end
95
+
96
+ def run_migrations
97
+ "rake db:migrate > #{LOG_FILE}"
98
+ end
99
+
100
+ def remove_logfile
101
+ "rm #{LOG_FILE}"
102
+ end
103
+
104
+ def remove_dumpfile
105
+ "rm #{db_dump_location}"
106
+ end
107
+
108
+ def db_dump_location
109
+ "tmp/#{@current_environment["database"]["name"]}.dump"
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RemoteDatabaseImporter
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "remote_database_importer/version"
4
+ require_relative "remote_database_importer/operation"
5
+
6
+ module RemoteDatabaseImporter
7
+ class Error < StandardError; end
8
+ require_relative "railtie" if defined?(Rails)
9
+ end
@@ -0,0 +1,7 @@
1
+ namespace :remote_database do
2
+ desc "Pulls a database to your filesystem"
3
+ task import: :environment do
4
+ importer = RemoteDatabaseImporter::Operation.new
5
+ importer.import
6
+ end
7
+ end
Binary file
Binary file
Binary file
@@ -0,0 +1,4 @@
1
+ module RemoteDatabaseImporter
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: remote_database_importer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Leon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-10-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: tty-config
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: tty-spinner
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: colorize
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.8'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.8'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.14'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.14'
83
+ description: Dump remote database and import locally. Currently only postgres databases
84
+ supported
85
+ email:
86
+ - nonick@nonick.ch
87
+ executables:
88
+ - remote_database_importer
89
+ extensions: []
90
+ extra_rdoc_files: []
91
+ files:
92
+ - ".rspec"
93
+ - ".standard.yml"
94
+ - CHANGELOG.md
95
+ - Gemfile
96
+ - Gemfile.lock
97
+ - LICENSE.txt
98
+ - README.md
99
+ - Rakefile
100
+ - bin/remote_database_importer
101
+ - lib/railtie.rb
102
+ - lib/remote_database_importer.rb
103
+ - lib/remote_database_importer/config.rb
104
+ - lib/remote_database_importer/operation.rb
105
+ - lib/remote_database_importer/version.rb
106
+ - lib/tasks/remote_database_importer.rake
107
+ - readme_images/.DS_Store
108
+ - readme_images/config_sample.png
109
+ - readme_images/import-job.gif
110
+ - sig/remote_database_importer.rbs
111
+ homepage: https://github.com/leon-vogt/remote_database_importer
112
+ licenses:
113
+ - MIT
114
+ metadata:
115
+ homepage_uri: https://github.com/leon-vogt/remote_database_importer
116
+ source_code_uri: https://github.com/leon-vogt/remote_database_importer
117
+ changelog_uri: https://github.com/leon-vogt/remote_database_importer/blob/main/CHANGELOG.md
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 2.6.0
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubygems_version: 3.3.7
134
+ signing_key:
135
+ specification_version: 4
136
+ summary: Dump remote database and import locally
137
+ test_files: []