activerecord-snapshot 0.8.0 → 1.0.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 +4 -4
- data/README.md +12 -1
- data/Rakefile +6 -29
- data/lib/active_record/snapshot/actions/create.rb +2 -2
- data/lib/active_record/snapshot/actions/import.rb +34 -5
- data/lib/active_record/snapshot/commands/filter_tables.rb +2 -2
- data/lib/active_record/snapshot/commands/mysql.rb +16 -7
- data/lib/active_record/snapshot/configuration.rb +2 -0
- data/lib/active_record/snapshot/version.rb +1 -1
- data/lib/tasks/active_record/snapshot_tasks.rake +26 -0
- metadata +102 -22
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2ea1b2759aa89b7300c4825dc19821b7df75a78b78911ec1ec3fd774db83ed41
|
|
4
|
+
data.tar.gz: a8a99a1053eb103fccc48bdcd70b71fbf996f394e2de5b539248bd98cdf2f4da
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: baa534c7a96404980ec584f38516a8ba5061fafef1a0dd8a83ee56c95af9eda37226211f1912a8e5782e40c47251f803b8f6106feee36b04e00ff90e04c033b5
|
|
7
|
+
data.tar.gz: 628bedd84b304a6ea652000f2107bb12b33bc20ede5ab90c13e403bac5f24ecb0e22599c4e0e22cff29fe8082f557dd3ae4d3536da93ee65c201ee84ac4f5e1f
|
data/README.md
CHANGED
|
@@ -100,7 +100,8 @@ Creates a named snapshot: `[name].sql.bz2.enc` which is stored at
|
|
|
100
100
|
##### `db:snapshot:import`
|
|
101
101
|
|
|
102
102
|
When used without arguments, it imports the latest regular snapshot from S3,
|
|
103
|
-
then
|
|
103
|
+
then imports all the tables listed in the config file. Each table imported is
|
|
104
|
+
first dropped and then rebuilt from the snapshot.
|
|
104
105
|
|
|
105
106
|
Can be given arguments for the version:
|
|
106
107
|
|
|
@@ -112,6 +113,16 @@ Can be given arguments for the version:
|
|
|
112
113
|
Imports _only_ the tables given as arguments (`foo` and `bar` in this example)
|
|
113
114
|
from the latest regular snapshot
|
|
114
115
|
|
|
116
|
+
##### `db:snapshot:import:destructive`
|
|
117
|
+
|
|
118
|
+
When used without arguments, it imports the latest regular snapshot from S3,
|
|
119
|
+
then drops and replaces the local database.
|
|
120
|
+
|
|
121
|
+
Can be given arguments for the version:
|
|
122
|
+
|
|
123
|
+
`db:snapshot:import[12]` gets you the 12th regular snapshot
|
|
124
|
+
`db:snapshot:import['foo']` gets you your snapshot named `foo`
|
|
125
|
+
|
|
115
126
|
##### `db:snapshot:reload`
|
|
116
127
|
|
|
117
128
|
Reloads the current snapshot
|
data/Rakefile
CHANGED
|
@@ -1,33 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
rescue LoadError
|
|
4
|
-
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
require 'rdoc/task'
|
|
8
|
-
|
|
9
|
-
RDoc::Task.new(:rdoc) do |rdoc|
|
|
10
|
-
rdoc.rdoc_dir = 'rdoc'
|
|
11
|
-
rdoc.title = 'ActiveRecord::Snapshot'
|
|
12
|
-
rdoc.options << '--line-numbers'
|
|
13
|
-
rdoc.rdoc_files.include('README.md')
|
|
14
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
require 'bundler/gem_tasks'
|
|
23
|
-
|
|
24
|
-
require 'rake/testtask'
|
|
1
|
+
require "bundler/gem_tasks"
|
|
2
|
+
require "rake/testtask"
|
|
25
3
|
|
|
26
4
|
Rake::TestTask.new(:test) do |t|
|
|
27
|
-
t.libs <<
|
|
28
|
-
t.
|
|
29
|
-
t.
|
|
5
|
+
t.libs << "test"
|
|
6
|
+
t.libs << "lib"
|
|
7
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
|
30
8
|
end
|
|
31
9
|
|
|
32
|
-
|
|
33
|
-
task default: :test
|
|
10
|
+
task :default => :test
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
module ActiveRecord
|
|
2
2
|
module Snapshot
|
|
3
3
|
class Import
|
|
4
|
-
def self.call(
|
|
5
|
-
new(
|
|
4
|
+
def self.call(**args)
|
|
5
|
+
new(**args).call
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
def initialize(version: nil, tables: [])
|
|
8
|
+
def initialize(version: nil, tables: [], reset: false)
|
|
9
9
|
@version = version
|
|
10
10
|
if named_version?
|
|
11
11
|
name = version
|
|
@@ -14,6 +14,7 @@ module ActiveRecord
|
|
|
14
14
|
end
|
|
15
15
|
@snapshot = Snapshot.new(name)
|
|
16
16
|
@tables = tables
|
|
17
|
+
@reset = reset
|
|
17
18
|
end
|
|
18
19
|
|
|
19
20
|
def call
|
|
@@ -22,12 +23,18 @@ module ActiveRecord
|
|
|
22
23
|
|
|
23
24
|
private
|
|
24
25
|
|
|
25
|
-
attr_reader :
|
|
26
|
+
attr_reader :reset, :snapshot, :version
|
|
26
27
|
|
|
27
28
|
def config
|
|
28
29
|
ActiveRecord::Snapshot.config
|
|
29
30
|
end
|
|
30
31
|
|
|
32
|
+
def tables
|
|
33
|
+
return [] if reset?
|
|
34
|
+
return @tables if @tables.compact.length > 0
|
|
35
|
+
config.tables
|
|
36
|
+
end
|
|
37
|
+
|
|
31
38
|
def named_version?
|
|
32
39
|
!version.blank? && version.to_i.to_s != version.to_s
|
|
33
40
|
end
|
|
@@ -44,7 +51,7 @@ module ActiveRecord
|
|
|
44
51
|
steps[:decompress] = "Decompress snapshot to #{snapshot.dump}"
|
|
45
52
|
end
|
|
46
53
|
|
|
47
|
-
if
|
|
54
|
+
if reset?
|
|
48
55
|
steps[:reset_database] = "Reset database"
|
|
49
56
|
else
|
|
50
57
|
steps[:filter_tables] = "Filter tables"
|
|
@@ -53,10 +60,31 @@ module ActiveRecord
|
|
|
53
60
|
steps[:import] = "Importing the snapshot into #{config.db.database}"
|
|
54
61
|
steps[:save] = "Caching the new snapshot version" unless named_version? || tables.present?
|
|
55
62
|
steps[:set_env] = "Setting database environment to #{Rails.env}" if Rails::VERSION::MAJOR >= 5
|
|
63
|
+
steps[:run_tasks] = "Running post-import rake tasks" if post_import_tasks.present?
|
|
56
64
|
|
|
57
65
|
steps
|
|
58
66
|
end
|
|
59
67
|
|
|
68
|
+
def reset?
|
|
69
|
+
!!reset
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def post_import_tasks
|
|
73
|
+
@post_import_tasks ||=
|
|
74
|
+
ActiveRecord::Snapshot.config.post_import_tasks
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def run_tasks
|
|
78
|
+
post_import_tasks.each do |task_name|
|
|
79
|
+
if Rake::Task.task_defined?(task_name)
|
|
80
|
+
puts "Running: #{task_name}"
|
|
81
|
+
Rake::Task[task_name].invoke
|
|
82
|
+
else
|
|
83
|
+
puts "Warning: could not find task with name #{task_name}"
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
60
88
|
def download
|
|
61
89
|
snapshot.download
|
|
62
90
|
end
|
|
@@ -75,6 +103,7 @@ module ActiveRecord
|
|
|
75
103
|
def reset_database
|
|
76
104
|
Rake::Task["db:drop"].invoke
|
|
77
105
|
Rake::Task["db:create"].invoke
|
|
106
|
+
Rake::Task["db:schema:load"].invoke
|
|
78
107
|
end
|
|
79
108
|
|
|
80
109
|
def filter_tables
|
|
@@ -3,19 +3,21 @@ require 'shellwords'
|
|
|
3
3
|
module ActiveRecord
|
|
4
4
|
module Snapshot
|
|
5
5
|
class MySQL
|
|
6
|
-
def self.dump(
|
|
7
|
-
new.dump(
|
|
6
|
+
def self.dump(**args)
|
|
7
|
+
new.dump(**args)
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
def dump(tables:, output:)
|
|
11
|
-
# the --no-tablespaces
|
|
11
|
+
# the --no-tablespaces flag are necessary to dump a db
|
|
12
12
|
# containing SQL view queries and tablespace metadata
|
|
13
|
-
dump_command("--no-data --single-transaction --no-tablespaces
|
|
14
|
-
dump_command(
|
|
13
|
+
dump_command("--no-data --single-transaction --no-tablespaces #{build_ignore_flags} #{database} > #{output}") &&
|
|
14
|
+
dump_command(
|
|
15
|
+
"--quick --single-transaction --no-tablespaces #{build_ignore_flags} #{database} #{tables.join(' ')} >> #{output}"
|
|
16
|
+
)
|
|
15
17
|
end
|
|
16
18
|
|
|
17
|
-
def self.import(
|
|
18
|
-
new.import(
|
|
19
|
+
def self.import(**args)
|
|
20
|
+
new.import(**args)
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
def import(input:)
|
|
@@ -34,6 +36,13 @@ module ActiveRecord
|
|
|
34
36
|
ActiveRecord::Snapshot.config.db
|
|
35
37
|
end
|
|
36
38
|
|
|
39
|
+
def build_ignore_flags
|
|
40
|
+
ActiveRecord::Snapshot
|
|
41
|
+
.config
|
|
42
|
+
.ignore_tables
|
|
43
|
+
&.reduce('') { |str, table| str + "--ignore-table=#{database}.#{table} " }
|
|
44
|
+
end
|
|
45
|
+
|
|
37
46
|
def escape(value)
|
|
38
47
|
Shellwords.escape(value)
|
|
39
48
|
end
|
|
@@ -57,7 +57,9 @@ module ActiveRecord
|
|
|
57
57
|
property :s3, required: true, coerce: S3Config
|
|
58
58
|
property :ssl_key, required: true
|
|
59
59
|
property :tables, required: true
|
|
60
|
+
property :ignore_tables
|
|
60
61
|
property :store, coerce: StoreConfig
|
|
62
|
+
property :post_import_tasks
|
|
61
63
|
|
|
62
64
|
def db
|
|
63
65
|
DBConfig.new(env)
|
|
@@ -42,6 +42,32 @@ namespace :db do
|
|
|
42
42
|
tables = args[:tables].split(/[, ;'"]+/).reject(&:blank?)
|
|
43
43
|
ActiveRecord::Snapshot::Import.call(tables: tables)
|
|
44
44
|
end
|
|
45
|
+
|
|
46
|
+
desc "Import only specific tables from a named snapshot"
|
|
47
|
+
task :named_only, [:snapshot_name, :tables] => :load do |_t, args|
|
|
48
|
+
abort "Do not run in production mode!" if Rails.env.production?
|
|
49
|
+
|
|
50
|
+
snapshot_name = args.fetch(:snapshot_name, "").strip
|
|
51
|
+
tables_arg = args.fetch(:tables, "").strip
|
|
52
|
+
|
|
53
|
+
if snapshot_name.blank?
|
|
54
|
+
abort "Usage: bundle exec rake db:snapshot:import:named_only['snapshot_name','table1 table2']"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
if tables_arg.blank?
|
|
58
|
+
abort "Usage: bundle exec rake db:snapshot:import:named_only['snapshot_name','table1 table2']"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
tables = tables_arg.split(/[, ;'"]+/).reject(&:blank?)
|
|
62
|
+
ActiveRecord::Snapshot::Import.call(version: snapshot_name, tables: tables)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
desc "Destructive import of the most recent snapshot"
|
|
66
|
+
task :destructive, [:version] => [:load] do |_t, args|
|
|
67
|
+
abort "Do not run in production mode!" if Rails.env.production?
|
|
68
|
+
version = args.fetch(:version, "").strip
|
|
69
|
+
ActiveRecord::Snapshot::Import.call(version: version, reset: true)
|
|
70
|
+
end
|
|
45
71
|
end
|
|
46
72
|
|
|
47
73
|
desc "Reload current snapshot version"
|
metadata
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: activerecord-snapshot
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Bernardo Farah
|
|
8
|
-
|
|
8
|
+
- Nathan Seither
|
|
9
|
+
- Sean Mulligan
|
|
10
|
+
autorequire:
|
|
9
11
|
bindir: bin
|
|
10
12
|
cert_chain: []
|
|
11
|
-
date:
|
|
13
|
+
date: 2026-02-20 00:00:00.000000000 Z
|
|
12
14
|
dependencies:
|
|
13
15
|
- !ruby/object:Gem::Dependency
|
|
14
16
|
name: railties
|
|
@@ -17,9 +19,6 @@ dependencies:
|
|
|
17
19
|
- - ">="
|
|
18
20
|
- !ruby/object:Gem::Version
|
|
19
21
|
version: 4.1.0
|
|
20
|
-
- - "<"
|
|
21
|
-
- !ruby/object:Gem::Version
|
|
22
|
-
version: '6.0'
|
|
23
22
|
type: :runtime
|
|
24
23
|
prerelease: false
|
|
25
24
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -27,9 +26,6 @@ dependencies:
|
|
|
27
26
|
- - ">="
|
|
28
27
|
- !ruby/object:Gem::Version
|
|
29
28
|
version: 4.1.0
|
|
30
|
-
- - "<"
|
|
31
|
-
- !ruby/object:Gem::Version
|
|
32
|
-
version: '6.0'
|
|
33
29
|
- !ruby/object:Gem::Dependency
|
|
34
30
|
name: fog-aws
|
|
35
31
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -82,32 +78,116 @@ dependencies:
|
|
|
82
78
|
name: mocha
|
|
83
79
|
requirement: !ruby/object:Gem::Requirement
|
|
84
80
|
requirements:
|
|
85
|
-
- -
|
|
81
|
+
- - "~>"
|
|
86
82
|
- !ruby/object:Gem::Version
|
|
87
|
-
version: '
|
|
83
|
+
version: '3.0'
|
|
88
84
|
type: :development
|
|
89
85
|
prerelease: false
|
|
90
86
|
version_requirements: !ruby/object:Gem::Requirement
|
|
91
87
|
requirements:
|
|
92
|
-
- -
|
|
88
|
+
- - "~>"
|
|
93
89
|
- !ruby/object:Gem::Version
|
|
94
|
-
version: '
|
|
90
|
+
version: '3.0'
|
|
95
91
|
- !ruby/object:Gem::Dependency
|
|
96
|
-
name:
|
|
92
|
+
name: rails
|
|
97
93
|
requirement: !ruby/object:Gem::Requirement
|
|
98
94
|
requirements:
|
|
99
95
|
- - "~>"
|
|
100
96
|
- !ruby/object:Gem::Version
|
|
101
|
-
version: 0.
|
|
97
|
+
version: 6.0.1
|
|
102
98
|
type: :development
|
|
103
99
|
prerelease: false
|
|
104
100
|
version_requirements: !ruby/object:Gem::Requirement
|
|
105
101
|
requirements:
|
|
106
102
|
- - "~>"
|
|
107
103
|
- !ruby/object:Gem::Version
|
|
108
|
-
version: 0.
|
|
104
|
+
version: 6.0.1
|
|
105
|
+
- !ruby/object:Gem::Dependency
|
|
106
|
+
name: minitest
|
|
107
|
+
requirement: !ruby/object:Gem::Requirement
|
|
108
|
+
requirements:
|
|
109
|
+
- - "~>"
|
|
110
|
+
- !ruby/object:Gem::Version
|
|
111
|
+
version: '5.1'
|
|
112
|
+
type: :development
|
|
113
|
+
prerelease: false
|
|
114
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
115
|
+
requirements:
|
|
116
|
+
- - "~>"
|
|
117
|
+
- !ruby/object:Gem::Version
|
|
118
|
+
version: '5.1'
|
|
119
|
+
- !ruby/object:Gem::Dependency
|
|
120
|
+
name: mutex_m
|
|
121
|
+
requirement: !ruby/object:Gem::Requirement
|
|
122
|
+
requirements:
|
|
123
|
+
- - ">="
|
|
124
|
+
- !ruby/object:Gem::Version
|
|
125
|
+
version: '0'
|
|
126
|
+
type: :development
|
|
127
|
+
prerelease: false
|
|
128
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
129
|
+
requirements:
|
|
130
|
+
- - ">="
|
|
131
|
+
- !ruby/object:Gem::Version
|
|
132
|
+
version: '0'
|
|
109
133
|
- !ruby/object:Gem::Dependency
|
|
110
|
-
name:
|
|
134
|
+
name: bigdecimal
|
|
135
|
+
requirement: !ruby/object:Gem::Requirement
|
|
136
|
+
requirements:
|
|
137
|
+
- - ">="
|
|
138
|
+
- !ruby/object:Gem::Version
|
|
139
|
+
version: '0'
|
|
140
|
+
type: :development
|
|
141
|
+
prerelease: false
|
|
142
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
143
|
+
requirements:
|
|
144
|
+
- - ">="
|
|
145
|
+
- !ruby/object:Gem::Version
|
|
146
|
+
version: '0'
|
|
147
|
+
- !ruby/object:Gem::Dependency
|
|
148
|
+
name: drb
|
|
149
|
+
requirement: !ruby/object:Gem::Requirement
|
|
150
|
+
requirements:
|
|
151
|
+
- - ">="
|
|
152
|
+
- !ruby/object:Gem::Version
|
|
153
|
+
version: '0'
|
|
154
|
+
type: :development
|
|
155
|
+
prerelease: false
|
|
156
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
157
|
+
requirements:
|
|
158
|
+
- - ">="
|
|
159
|
+
- !ruby/object:Gem::Version
|
|
160
|
+
version: '0'
|
|
161
|
+
- !ruby/object:Gem::Dependency
|
|
162
|
+
name: ostruct
|
|
163
|
+
requirement: !ruby/object:Gem::Requirement
|
|
164
|
+
requirements:
|
|
165
|
+
- - ">="
|
|
166
|
+
- !ruby/object:Gem::Version
|
|
167
|
+
version: '0'
|
|
168
|
+
type: :development
|
|
169
|
+
prerelease: false
|
|
170
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
171
|
+
requirements:
|
|
172
|
+
- - ">="
|
|
173
|
+
- !ruby/object:Gem::Version
|
|
174
|
+
version: '0'
|
|
175
|
+
- !ruby/object:Gem::Dependency
|
|
176
|
+
name: cgi
|
|
177
|
+
requirement: !ruby/object:Gem::Requirement
|
|
178
|
+
requirements:
|
|
179
|
+
- - ">="
|
|
180
|
+
- !ruby/object:Gem::Version
|
|
181
|
+
version: '0'
|
|
182
|
+
type: :development
|
|
183
|
+
prerelease: false
|
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
185
|
+
requirements:
|
|
186
|
+
- - ">="
|
|
187
|
+
- !ruby/object:Gem::Version
|
|
188
|
+
version: '0'
|
|
189
|
+
- !ruby/object:Gem::Dependency
|
|
190
|
+
name: benchmark
|
|
111
191
|
requirement: !ruby/object:Gem::Requirement
|
|
112
192
|
requirements:
|
|
113
193
|
- - ">="
|
|
@@ -122,7 +202,7 @@ dependencies:
|
|
|
122
202
|
version: '0'
|
|
123
203
|
description: Snapshots for ActiveRecord
|
|
124
204
|
email:
|
|
125
|
-
-
|
|
205
|
+
- eng-admin@coverhound.com
|
|
126
206
|
executables: []
|
|
127
207
|
extensions: []
|
|
128
208
|
extra_rdoc_files: []
|
|
@@ -158,7 +238,7 @@ homepage: https://github.com/coverhound/active-record-snapshot
|
|
|
158
238
|
licenses:
|
|
159
239
|
- MIT
|
|
160
240
|
metadata: {}
|
|
161
|
-
post_install_message:
|
|
241
|
+
post_install_message:
|
|
162
242
|
rdoc_options: []
|
|
163
243
|
require_paths:
|
|
164
244
|
- lib
|
|
@@ -166,15 +246,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
166
246
|
requirements:
|
|
167
247
|
- - ">="
|
|
168
248
|
- !ruby/object:Gem::Version
|
|
169
|
-
version: '0'
|
|
249
|
+
version: '3.0'
|
|
170
250
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
251
|
requirements:
|
|
172
252
|
- - ">="
|
|
173
253
|
- !ruby/object:Gem::Version
|
|
174
254
|
version: '0'
|
|
175
255
|
requirements: []
|
|
176
|
-
rubygems_version: 3.
|
|
177
|
-
signing_key:
|
|
256
|
+
rubygems_version: 3.4.19
|
|
257
|
+
signing_key:
|
|
178
258
|
specification_version: 4
|
|
179
259
|
summary: Snapshots for ActiveRecord
|
|
180
260
|
test_files: []
|