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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df0b6d4cfd32a2749f92fa402eb4bcf3c11cadd7639eed131e4aa303339e2a6c
4
- data.tar.gz: 52a7c83917b568d262fb50fd16c84815605eb7046ae3faa89cf3694343f6155d
3
+ metadata.gz: 2ea1b2759aa89b7300c4825dc19821b7df75a78b78911ec1ec3fd774db83ed41
4
+ data.tar.gz: a8a99a1053eb103fccc48bdcd70b71fbf996f394e2de5b539248bd98cdf2f4da
5
5
  SHA512:
6
- metadata.gz: 42c7599a1f7addc4f89f1cbf32243fdec12a25f070c6ab66e38a829fa4259d29c510aafcf03355bf6d53a43690e36bc57a52b619b1e1ebec22d87c07c346fe9b
7
- data.tar.gz: 8532fbb8a3356726abae122e0f02dc26bd8c0b3c68cfff9c29d59598cbc94b6956e7cbdf2c714ebde2262c40a88678199f8f6982a0ae233bfdf2d5556837d269
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 drops and replaces the local database.
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
- begin
2
- require 'bundler/setup'
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 << 'test'
28
- t.pattern = 'test/**/*_test.rb'
29
- t.verbose = false
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
@@ -3,8 +3,8 @@ require "active_record/snapshot/utils/logger"
3
3
  module ActiveRecord
4
4
  module Snapshot
5
5
  class Create
6
- def self.call(*args)
7
- new(*args).call
6
+ def self.call(**args)
7
+ new(**args).call
8
8
  end
9
9
 
10
10
  def initialize(name: nil)
@@ -1,11 +1,11 @@
1
1
  module ActiveRecord
2
2
  module Snapshot
3
3
  class Import
4
- def self.call(*args)
5
- new(*args).call
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 :snapshot, :tables, :version
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 tables.empty?
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
@@ -1,8 +1,8 @@
1
1
  module ActiveRecord
2
2
  module Snapshot
3
3
  class FilterTables
4
- def self.call(*args)
5
- new(*args).call
4
+ def self.call(**args)
5
+ new(**args).call
6
6
  end
7
7
 
8
8
  def initialize(tables:, sql_dump:)
@@ -3,19 +3,21 @@ require 'shellwords'
3
3
  module ActiveRecord
4
4
  module Snapshot
5
5
  class MySQL
6
- def self.dump(*args)
7
- new.dump(*args)
6
+ def self.dump(**args)
7
+ new.dump(**args)
8
8
  end
9
9
 
10
10
  def dump(tables:, output:)
11
- # the --no-tablespaces and --single-transaction flags are necessary to dump a db
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 --set-gtid-purged=OFF #{database} > #{output}") &&
14
- dump_command("--quick --single-transaction --no-tablespaces --set-gtid-purged=OFF #{database} #{tables.join(" ")} >> #{output}")
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(*args)
18
- new.import(*args)
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)
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module Snapshot
3
- VERSION = '0.8.0'
3
+ VERSION = '1.0.0'
4
4
  end
5
5
  end
@@ -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.8.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernardo Farah
8
- autorequire:
8
+ - Nathan Seither
9
+ - Sean Mulligan
10
+ autorequire:
9
11
  bindir: bin
10
12
  cert_chain: []
11
- date: 2022-03-08 00:00:00.000000000 Z
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: '1.1'
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: '1.1'
90
+ version: '3.0'
95
91
  - !ruby/object:Gem::Dependency
96
- name: pry
92
+ name: rails
97
93
  requirement: !ruby/object:Gem::Requirement
98
94
  requirements:
99
95
  - - "~>"
100
96
  - !ruby/object:Gem::Version
101
- version: 0.10.3
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.10.3
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: simplecov
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
- - ber@bernardo.me
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.0.3.1
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: []