database-cloner-rails 1.0 → 1.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 +5 -5
- data/README.md +49 -0
- data/database-cloner-rails.gemspec +23 -0
- data/lib/database-cloner-rails.rb +4 -0
- data/lib/database_cloner_rails/downloader.rb +47 -0
- data/lib/database_cloner_rails/railtie.rb +9 -0
- data/lib/database_cloner_rails/uploader.rb +24 -0
- data/lib/database_cloner_rails/version.rb +3 -0
- data/lib/railtie.rb +1 -9
- data/lib/tasks/database.rake +8 -8
- metadata +94 -17
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 5b9746f0df92bf39ad438cdcd9b6b214a65dc5041bb259aa29358f2144176b69
|
|
4
|
+
data.tar.gz: 02a3b5b3e7e3d16a8be41c727690a15b591215cbd091972afebd8d664450f024
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ec3b1c953a9b0b9be224ec786eddecfadbe2b40330b5327f3bc3e374f50983169c2423469b1110525718ebe30c6deadbddbcf86229109adf7dda34f5ed280e04
|
|
7
|
+
data.tar.gz: bda35012cba75780535f111cd962ce654c8025ce57fa651b3ca98e48b3a22932da6c29f2456161668efc151cc870aac4914f545be0dad19db7353fea958bdf76
|
data/README.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# database-cloner-rails
|
|
2
|
+
|
|
3
|
+
A Rails gem that provides Rake tasks to back up and restore your database records across environments.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
The gem iterates over all ActiveRecord models in your app, serializes their records to Ruby files, and can replay those files to restore the data. Useful for seeding a staging environment from production data or creating snapshots.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
Add this line to your `Gemfile`:
|
|
12
|
+
|
|
13
|
+
```ruby
|
|
14
|
+
gem 'database-cloner-rails'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Then run:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
bundle install
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
### Download (backup)
|
|
26
|
+
|
|
27
|
+
Dumps all records from every model into individual `.rb` files under `lib/tasks/database_cloner/db_dump/`:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
rake database:download
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Each file contains `Model.create(...)` calls — one per record — with `id`, `created_at`, and `updated_at` stripped out.
|
|
34
|
+
|
|
35
|
+
### Upload (restore)
|
|
36
|
+
|
|
37
|
+
Replays the dumped files to recreate records in the current database:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
rake database:upload
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
If a model's dump file fails to load, it prints a warning and continues with the rest.
|
|
44
|
+
|
|
45
|
+
## Notes
|
|
46
|
+
|
|
47
|
+
- Only models that can be resolved via `classify.safe_constantize` are included.
|
|
48
|
+
- Records are ordered by `id` during the dump.
|
|
49
|
+
- The `db_dump/` directory must exist before running `database:download`.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require_relative "lib/database_cloner_rails/version"
|
|
2
|
+
|
|
3
|
+
Gem::Specification.new do |spec|
|
|
4
|
+
spec.name = "database-cloner-rails"
|
|
5
|
+
spec.version = DatabaseClonerRails::VERSION
|
|
6
|
+
spec.authors = ["Abhishek Sharma"]
|
|
7
|
+
spec.email = ["abhsss96@gmail.com"]
|
|
8
|
+
spec.summary = "Rake tasks to back up and restore database records in Rails"
|
|
9
|
+
spec.description = "Provides rake tasks to dump all ActiveRecord model records to Ruby files and restore them — useful for seeding staging from production data."
|
|
10
|
+
spec.homepage = "https://github.com/abhsss96/database-cloner-rails"
|
|
11
|
+
spec.license = "MIT"
|
|
12
|
+
spec.required_ruby_version = ">= 2.7"
|
|
13
|
+
|
|
14
|
+
spec.files = Dir["lib/**/*", "README.md", "*.gemspec"]
|
|
15
|
+
spec.require_paths = ["lib"]
|
|
16
|
+
|
|
17
|
+
spec.add_dependency "rails", ">= 5.0"
|
|
18
|
+
|
|
19
|
+
spec.add_development_dependency "rspec", "~> 3.12"
|
|
20
|
+
spec.add_development_dependency "activerecord", ">= 5.0"
|
|
21
|
+
spec.add_development_dependency "activesupport", ">= 5.0"
|
|
22
|
+
spec.add_development_dependency "sqlite3", "~> 1.7"
|
|
23
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require "fileutils"
|
|
2
|
+
require "json"
|
|
3
|
+
|
|
4
|
+
module DatabaseClonerRails
|
|
5
|
+
class Downloader
|
|
6
|
+
def self.run(dump_dir: default_dump_dir, only: nil)
|
|
7
|
+
new(dump_dir: dump_dir, only: only).run
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.default_dump_dir
|
|
11
|
+
File.join(Rails.root, "lib", "tasks", "database_cloner", "db_dump")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def initialize(dump_dir: self.class.default_dump_dir, only: nil)
|
|
15
|
+
@dump_dir = dump_dir
|
|
16
|
+
@only = Array(only).map(&:to_s).reject(&:empty?)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def run
|
|
20
|
+
FileUtils.mkdir_p(@dump_dir)
|
|
21
|
+
tables = ActiveRecord::Base.connection.tables
|
|
22
|
+
tables = tables.select { |t| @only.include?(t) } if @only.any?
|
|
23
|
+
tables.each do |table|
|
|
24
|
+
model = table.classify.safe_constantize
|
|
25
|
+
next unless model.present?
|
|
26
|
+
dump_table(table, model)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def dump_table(table, model)
|
|
33
|
+
lines = []
|
|
34
|
+
model.all.order(:id).each do |record|
|
|
35
|
+
puts record
|
|
36
|
+
attrs = JSON.parse(record.to_json)
|
|
37
|
+
attrs.delete("created_at")
|
|
38
|
+
attrs.delete("updated_at")
|
|
39
|
+
attrs.delete("id")
|
|
40
|
+
lines << "#{model}.create(#{attrs})"
|
|
41
|
+
lines << 'puts "uploading ...."'
|
|
42
|
+
lines << "puts ' ***===========>#{table}=====*** '"
|
|
43
|
+
end
|
|
44
|
+
File.open(File.join(@dump_dir, "#{table}.rb"), "w") { |f| f.puts lines }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module DatabaseClonerRails
|
|
2
|
+
class Uploader
|
|
3
|
+
def self.run(only: nil)
|
|
4
|
+
new(only: only).run
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def initialize(only: nil)
|
|
8
|
+
@only = Array(only).map(&:to_s).reject(&:empty?)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def run
|
|
12
|
+
tables = ActiveRecord::Base.connection.tables
|
|
13
|
+
tables = tables.select { |t| @only.include?(t) } if @only.any?
|
|
14
|
+
tables.each do |table|
|
|
15
|
+
next unless table.classify.safe_constantize.present?
|
|
16
|
+
begin
|
|
17
|
+
require "tasks/database_cloner/db_dump/#{table}"
|
|
18
|
+
rescue LoadError, StandardError => e
|
|
19
|
+
puts "Oops!! #{table} could not be uploaded."
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/railtie.rb
CHANGED
data/lib/tasks/database.rake
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
namespace :database do
|
|
2
|
-
desc "
|
|
3
|
-
task upload: :environment do
|
|
4
|
-
system("echo 'upload'")
|
|
5
|
-
require "tasks/database_cloner/upload.rb"
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
desc "TODO"
|
|
2
|
+
desc "Dump all model records to Ruby files in lib/tasks/database_cloner/db_dump/. Use MODELS=users,posts to filter."
|
|
9
3
|
task download: :environment do
|
|
10
|
-
|
|
4
|
+
only = ENV["MODELS"]&.split(",")&.map(&:strip)
|
|
5
|
+
DatabaseClonerRails::Downloader.run(only: only)
|
|
11
6
|
end
|
|
12
7
|
|
|
8
|
+
desc "Restore model records from dumped Ruby files. Use MODELS=users,posts to filter."
|
|
9
|
+
task upload: :environment do
|
|
10
|
+
only = ENV["MODELS"]&.split(",")&.map(&:strip)
|
|
11
|
+
DatabaseClonerRails::Uploader.run(only: only)
|
|
12
|
+
end
|
|
13
13
|
end
|
metadata
CHANGED
|
@@ -1,48 +1,125 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: database-cloner-rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Abhishek Sharma
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
12
|
-
dependencies:
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
date: 2026-05-31 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rails
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '5.0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '5.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rspec
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '3.12'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '3.12'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: activerecord
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '5.0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '5.0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: activesupport
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '5.0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '5.0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: sqlite3
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '1.7'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '1.7'
|
|
83
|
+
description: Provides rake tasks to dump all ActiveRecord model records to Ruby files
|
|
84
|
+
and restore them — useful for seeding staging from production data.
|
|
85
|
+
email:
|
|
86
|
+
- abhsss96@gmail.com
|
|
15
87
|
executables: []
|
|
16
88
|
extensions: []
|
|
17
89
|
extra_rdoc_files: []
|
|
18
90
|
files:
|
|
91
|
+
- README.md
|
|
92
|
+
- database-cloner-rails.gemspec
|
|
93
|
+
- lib/database-cloner-rails.rb
|
|
94
|
+
- lib/database_cloner_rails/downloader.rb
|
|
95
|
+
- lib/database_cloner_rails/railtie.rb
|
|
96
|
+
- lib/database_cloner_rails/uploader.rb
|
|
97
|
+
- lib/database_cloner_rails/version.rb
|
|
19
98
|
- lib/railtie.rb
|
|
20
99
|
- lib/tasks/database.rake
|
|
21
100
|
- lib/tasks/database_cloner/download.rb
|
|
22
101
|
- lib/tasks/database_cloner/upload.rb
|
|
23
|
-
homepage: https://
|
|
102
|
+
homepage: https://github.com/abhsss96/database-cloner-rails
|
|
24
103
|
licenses:
|
|
25
|
-
-
|
|
104
|
+
- MIT
|
|
26
105
|
metadata: {}
|
|
27
|
-
post_install_message:
|
|
106
|
+
post_install_message:
|
|
28
107
|
rdoc_options: []
|
|
29
108
|
require_paths:
|
|
30
109
|
- lib
|
|
31
110
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
32
111
|
requirements:
|
|
33
|
-
- -
|
|
112
|
+
- - ">="
|
|
34
113
|
- !ruby/object:Gem::Version
|
|
35
|
-
version: '
|
|
114
|
+
version: '2.7'
|
|
36
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
37
116
|
requirements:
|
|
38
|
-
- -
|
|
117
|
+
- - ">="
|
|
39
118
|
- !ruby/object:Gem::Version
|
|
40
119
|
version: '0'
|
|
41
120
|
requirements: []
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
signing_key:
|
|
121
|
+
rubygems_version: 3.5.22
|
|
122
|
+
signing_key:
|
|
45
123
|
specification_version: 4
|
|
46
|
-
summary:
|
|
124
|
+
summary: Rake tasks to back up and restore database records in Rails
|
|
47
125
|
test_files: []
|
|
48
|
-
has_rdoc:
|