rails_data_fix 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9aecc5561ca42500f7eeac7f0c491994a2ec22bffe93ac3a562ec3b233c09bc0
4
+ data.tar.gz: 7649eb215c34e313ddda879feb54334f56f0d01d140cf799a06e082d6ea40b0c
5
+ SHA512:
6
+ metadata.gz: b578010033aad671e725ee684ed7619a04c624d2ad39034749a670358e87373de4b402b741d74f26ff48f7cc3d403738116649cb29719824bc4ed0993e014b93
7
+ data.tar.gz: 5d5a8ec6b185644d1ba2ca2563e4a908fb574804c1c8982fb3af20fff99bec7b747fbee49ec4383e54c8faef93a25ff93fd46b72e126cdce86df8ec0bef4fb16
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # Emacs
11
+ *~
12
+
13
+ # rspec failure tracking
14
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,13 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.4
3
+
4
+ Style/StringLiterals:
5
+ Enabled: true
6
+ EnforcedStyle: double_quotes
7
+
8
+ Style/StringLiteralsInInterpolation:
9
+ Enabled: true
10
+ EnforcedStyle: double_quotes
11
+
12
+ Layout/LineLength:
13
+ Max: 120
data/CHANGELOG.org ADDED
@@ -0,0 +1,7 @@
1
+ #+TITLE: ChangeLog
2
+
3
+ ** [Unreleased]
4
+
5
+ ** [0.1.1] - 2021-07-30
6
+
7
+ - 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 data_fix.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
9
+
10
+ gem "rspec", "~> 3.0"
11
+
12
+ gem "rubocop", "~> 1.7"
data/Gemfile.lock ADDED
@@ -0,0 +1,55 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ data_fix (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ast (2.4.2)
10
+ diff-lcs (1.4.4)
11
+ parallel (1.20.1)
12
+ parser (3.0.2.0)
13
+ ast (~> 2.4.1)
14
+ rainbow (3.0.0)
15
+ rake (13.0.6)
16
+ regexp_parser (2.1.1)
17
+ rexml (3.2.5)
18
+ rspec (3.10.0)
19
+ rspec-core (~> 3.10.0)
20
+ rspec-expectations (~> 3.10.0)
21
+ rspec-mocks (~> 3.10.0)
22
+ rspec-core (3.10.1)
23
+ rspec-support (~> 3.10.0)
24
+ rspec-expectations (3.10.1)
25
+ diff-lcs (>= 1.2.0, < 2.0)
26
+ rspec-support (~> 3.10.0)
27
+ rspec-mocks (3.10.2)
28
+ diff-lcs (>= 1.2.0, < 2.0)
29
+ rspec-support (~> 3.10.0)
30
+ rspec-support (3.10.2)
31
+ rubocop (1.18.4)
32
+ parallel (~> 1.10)
33
+ parser (>= 3.0.0.0)
34
+ rainbow (>= 2.2.2, < 4.0)
35
+ regexp_parser (>= 1.8, < 3.0)
36
+ rexml
37
+ rubocop-ast (>= 1.8.0, < 2.0)
38
+ ruby-progressbar (~> 1.7)
39
+ unicode-display_width (>= 1.4.0, < 3.0)
40
+ rubocop-ast (1.8.0)
41
+ parser (>= 3.0.1.1)
42
+ ruby-progressbar (1.11.0)
43
+ unicode-display_width (2.0.0)
44
+
45
+ PLATFORMS
46
+ x86_64-linux
47
+
48
+ DEPENDENCIES
49
+ data_fix!
50
+ rake (~> 13.0)
51
+ rspec (~> 3.0)
52
+ rubocop (~> 1.7)
53
+
54
+ BUNDLED WITH
55
+ 2.2.19
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2021 Adolfo Villafiorita
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.org ADDED
@@ -0,0 +1,210 @@
1
+ #+TITLE: DataFix - Data Maintenance Tasks Manager
2
+ #+AUTHOR: Adolfo Villafiorita
3
+
4
+ Manage your data maintenance tasks like migrations.
5
+
6
+ * Introduction
7
+
8
+ This Rails gem provides a set of tasks to manage DB data maintenance
9
+ tasks like they were migrations.
10
+
11
+ Data maintenance tasks include anything which does not fit in a schema
12
+ migration, such as, for instance, adding new records in production,
13
+ fixing errors in existing records, migrating data to a new
14
+ schema, ...
15
+
16
+ Before we wrote =data_fix= we would create a rake tasks or a script
17
+ with the migration code, test the script in development and finally
18
+ run it in production. The process was highly manual, with no
19
+ information about which migrations were run and when. Although these
20
+ scripts are usually one-offs and lose their value once run, we were
21
+ not quite ok with the approach.
22
+
23
+ =data_fix= helps by enforcing standards and keeping track of the data
24
+ fix run.
25
+
26
+ Similar to Rails schema migrations, thus, =data_fix= provides:
27
+
28
+ - Tasks for generating time-stamped scripts, where you will put the
29
+ code you need to run on your data.=
30
+ - A table in your DBs to keep track of which scripts have been already
31
+ run
32
+ - Tasks to manage execution of the scripts and of the table of the
33
+ tasks run
34
+ - Automatic backup of your data before running the scripts
35
+
36
+ Different from schema migrations data_fix does **not** provide a
37
+ mechanism for data rollbacks. In fact writing reversible maintenance
38
+ scripts on data not only is complex, but also, in many cases,
39
+ pointless: why should you write the code to fix a typo in a record and
40
+ also that to reintroduce the typo you are fixing? It is also an
41
+ overkill, since it is much simpler rolling back to a previous version
42
+ using a backup.
43
+
44
+ We now use it at [[https://shair.tech][Shair.Tech]] to perform data cleaning and data updates
45
+ of our Rails apps.
46
+
47
+ * Installation
48
+
49
+ Add this line to your application's Gemfile:
50
+
51
+ #+begin_example ruby
52
+ gem 'rails_data_fix'
53
+ #+end_example
54
+
55
+ And then execute:
56
+
57
+ #+begin_example
58
+ $ bundle install
59
+ #+end_example
60
+
61
+ Or install it yourself as:
62
+
63
+ #+begin_example
64
+ $ gem install rails_data_fix
65
+ #+end_example
66
+
67
+ Than *for each environment and DB in which you want to use
68
+ =data_fix=* run the following command:
69
+
70
+ #+begin_example
71
+ rails data_fix:init
72
+ #+end_example
73
+
74
+ *This means that you need to run =RAILS_ENV=production rake
75
+ data_fix:init= in your production environment, if you want to use it
76
+ there.*
77
+
78
+ * Usage
79
+
80
+ First create a file and write the script:
81
+
82
+ #+begin_example sh
83
+ rails data_fix:create[data_fix_name]
84
+ [... write the script in the generated file ...]
85
+ #+end_example
86
+
87
+ Then, for each environment in which you need to run the script:
88
+
89
+ #+begin_example sh
90
+ rails data_fix:run
91
+ #+end_example
92
+
93
+ =data_fix= scripts are not atomic: if you interrupt a script, the DB
94
+ will be left in status which depends on the code you wrote and when
95
+ you interrupted the script. In a typical scenario only part your
96
+ record will have been updated/fixed.
97
+
98
+ * Testing
99
+
100
+ It is a good idea to test your scripts in development before running
101
+ them on the actual data.
102
+
103
+ You can run the same script multiple times on the DB either by
104
+ restoring the status from a backup or by using the =rollback= task,
105
+ which declares one or more migrations as not run.
106
+
107
+ For instance:
108
+
109
+ #+begin_example
110
+ rake db:run
111
+ [... ERROR! ... ]
112
+ [... FIX SCRIPT ...]
113
+ rake db:rollback
114
+ rake db:run
115
+ [... REPEAT ...]
116
+ #+end_example
117
+
118
+ * Example
119
+
120
+ A typical usage scenario is the following.
121
+
122
+ 0. You realize you have been inconsistent in storing color names in
123
+ the =color= field of a table of your DB: some of your records use
124
+ the word =gray= while others use the British spelling =grey=.
125
+
126
+ 1. You use =data_fix:create= to generate a file in =db/migrate-data=.
127
+ (The file will contain your data migration/maintenance script):
128
+
129
+ #+begin_example sh
130
+ rails data_fix:create[prefer_british_spelling]
131
+ #+end_example
132
+
133
+ The script generates a file whose name is along the lines of:
134
+ =db/migrate-data/20210730135129_prefer_british_over_american.rb=
135
+
136
+ 2. You now write the code to fix your data in the file just created. For
137
+ instance something along the lines of:
138
+
139
+ #+begin_example sh
140
+ cat > db/migrate-data/20210730135129_prefer_british_over_american.rb
141
+ Color.where(name: "gray").each do |record|
142
+ record.color = "grey"
143
+ record.save
144
+ end
145
+ ^D
146
+ #+end_example
147
+
148
+ 3. You can test your script in development by running:
149
+
150
+ #+begin_example sh
151
+ rails data_fix:run
152
+ #+end_example
153
+
154
+ 4. If you are unhappy, you can declare the data_fix as not run, fix
155
+ you script, and run it again:
156
+
157
+ #+begin_example sh
158
+ rails data_fix:rollback
159
+ #+end_example
160
+
161
+ #+begin_example sh
162
+ cat > db/migrate-data/20210730135129_prefer_british_over_american.rb
163
+ puts "I prefer a brute-force approach"
164
+ Color.all.each do |record|
165
+ record.color = "grey"
166
+ record.save
167
+ end
168
+ ^D
169
+ #+end_example
170
+
171
+ #+begin_example sh
172
+ rails data_fix:run
173
+ #+end_example
174
+
175
+ #+begin_quote
176
+ Despite the name of the task, =data_fix:rollback= does not roll
177
+ back data: for that you need to reload from a DB. The
178
+ =data_fix:rollback= task updates the table in the DB declaring
179
+ the the latest =data_fix= has not yet been run.
180
+ #+end_quote
181
+
182
+ You repeat the steps above for any other data fix you need. When you
183
+ are ready, you can run all the migrations at once in production, with
184
+ the following command:
185
+
186
+ #+begin_example
187
+ RAILS_ENV=production rails data_fix:run
188
+ #+end_example
189
+
190
+ =data_fix= keeps track of the scripts it has already run ensuring the
191
+ script is not run twice.
192
+
193
+
194
+ * Development
195
+
196
+ To install this gem onto your local machine, run `bundle exec rake
197
+ install`. To release a new version, update the version number in
198
+ `version.rb`, and then run `bundle exec rake release`, which will
199
+ create a git tag for the version, push git commits and the created
200
+ tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
201
+
202
+ * Contributing
203
+
204
+ Bug reports and pull requests are welcome on GitHub at
205
+ https://github.com/shair.tech/data_fix.
206
+
207
+ * License
208
+
209
+ The gem is available as open source under the terms of the
210
+ [[https://opensource.org/licenses/MIT][MIT License]].
data/Rakefile ADDED
@@ -0,0 +1,12 @@
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 "rubocop/rake_task"
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "data_fix"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/data_fix.gemspec ADDED
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/data_fix/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "rails_data_fix"
7
+ spec.version = DataFix::VERSION
8
+ spec.authors = ["Adolfo Villafiorita"]
9
+ spec.email = ["adolfo@shair.tech"]
10
+
11
+ spec.summary = "Manage your data maintenance tasks like they were migrations"
12
+ spec.description = <<-EOS
13
+ This gem provides a set of commands to manage data maintenance scripts of a Rails application like migrations.
14
+
15
+ Each script has a timestamped name; a table in the DBs keeps track of
16
+ the scripts which have been run. Similar to migrations you can run
17
+ multiple scripts in the same session. DataFix keeps track of which
18
+ scripts have already run.
19
+
20
+ We use it at Shair.Tech to simplify testing of migration scripts.
21
+ EOS
22
+ spec.homepage = "https://ict4g.net/gitea/haoyun/data_fix.git"
23
+ spec.license = "MIT"
24
+ spec.required_ruby_version = ">= 2.4.0"
25
+
26
+ spec.metadata["allowed_push_host"] = "https://www.rubygems.org"
27
+
28
+ spec.metadata["homepage_uri"] = spec.homepage
29
+ spec.metadata["source_code_uri"] = spec.homepage
30
+ spec.metadata["changelog_uri"] = File.join spec.homepage, "CHANGELOG.org"
31
+
32
+ # Specify which files should be added to the gem when it is released.
33
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
34
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
35
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
36
+ end
37
+ spec.bindir = "exe"
38
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
39
+ spec.require_paths = ["lib"]
40
+
41
+ # Uncomment to register a new dependency of your gem
42
+ # spec.add_dependency "example-gem", "~> 1.0"
43
+
44
+ # For more information and examples about making a new gem, checkout our
45
+ # guide at: https://bundler.io/guides/creating_gem.html
46
+ end
@@ -0,0 +1,6 @@
1
+ require 'active_record'
2
+
3
+ module DataFix
4
+ class DataFix < ActiveRecord::Base
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ module DataFix
2
+ class Railtie < Rails::Railtie
3
+ rake_tasks do
4
+ load "tasks/data_fix_tasks.rake"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DataFix
4
+ VERSION = "0.1.1"
5
+ end
data/lib/data_fix.rb ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "data_fix/version"
4
+
5
+ require_relative "data_fix/data_fix"
6
+ require_relative "data_fix/railtie" if defined?(Rails::Railtie)
@@ -0,0 +1,168 @@
1
+ # coding: utf-8
2
+ namespace :data_fix do
3
+ DATAFIX_DIR = File.join("db", "migrate-data")
4
+
5
+ def puts_and_log message, level = :info
6
+ puts "** #{message}"
7
+ logger = Rails.logger
8
+ logger.send(level) { |msg| "data_fix: #{message}" }
9
+ end
10
+
11
+ # strip characters and whitespace to create valid filenames, also lowercase
12
+ def sanitize_filename(name)
13
+ if(name.is_a? Integer)
14
+ return name.to_s
15
+ end
16
+ return name.tr(
17
+ "ÀÁÂÃÄÅàáâãäåĀāĂ㥹ÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňʼnŊŋÑñÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšſŢţŤťŦŧÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž",
18
+ "AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz"
19
+ ).downcase.strip.gsub(' ', '-').gsub(/[^\w.-]/, '')
20
+ end
21
+
22
+ def exit_if_not_installed
23
+ if not ActiveRecord::Base.connection.table_exists? :data_fixes
24
+ puts_and_log "ERROR: it seems like data_fix:init has not been run yet", :error
25
+ exit(1)
26
+ end
27
+ end
28
+
29
+ desc 'Add a :data_fixes table to the DB (run the first time only)'
30
+ task :init => :environment do
31
+ unless ActiveRecord::Base.connection.table_exists? :data_fixes
32
+ ActiveRecord::Base.connection.create_table :data_fixes do |t|
33
+ t.string :name
34
+ t.timestamps
35
+ end
36
+ end
37
+ Dir.mkdir DATAFIX_DIR if not Dir.exists? DATAFIX_DIR
38
+ end
39
+
40
+ desc 'Create a new data fix'
41
+ task :create, [:name] => :environment do |_, args|
42
+ exit_if_not_installed
43
+
44
+ time = DateTime.now.strftime("%Y%m%d%H%M%S")
45
+ f = File.new(File.join(DATAFIX_DIR, sanitize_filename("#{time}_#{args.name}.rb")), "w")
46
+ f.write("")
47
+ f.close
48
+ end
49
+
50
+ def backup_database dry_run
51
+ config = Rails.configuration.database_configuration[Rails.env]
52
+
53
+ puts_and_log "Backing up #{Rails.env} database"
54
+ case config["adapter"]
55
+ when "sqlite3"
56
+ db_name = config["database"]
57
+ backup_db_name = db_name.gsub(/\.sqlite3$/, "-#{Date.today.strftime('%Y-%m-%d')}.sqlite3")
58
+ cmd = "cp \"#{db_name}\" \"#{backup_db_name}\""
59
+ when "mysql2"
60
+ db_host = config["host"]
61
+ db_name = config["database"]
62
+ db_username = config["username"]
63
+ db_password = config["password"]
64
+ backup_db_name = "db/#{db_name}-#{Rails.env}-#{Date.today.strftime('%Y-%m-%d')}.sql"
65
+ cmd = "mysqldump -u #{db_name} -p #{db_password} #{db_name} > \"#{backup_db_name}\""
66
+ end
67
+ if dry_run
68
+ puts_and_log "WOULD RUN: #{cmd}"
69
+ else
70
+ system cmd
71
+ end
72
+ puts_and_log "backup performed and available as #{backup_db_name}."
73
+ end
74
+
75
+ def df_status
76
+ files = Dir.glob("*.rb", base: DATAFIX_DIR).sort
77
+
78
+ puts "** data_fix status"
79
+ printf "%3s %-60s %-10s\n", "run", "file in #{DATAFIX_DIR}", "when"
80
+ files.each do |file|
81
+ run = DataFix::DataFix.find_by(name: file)
82
+ printf "%-3s %-60s %-10s\n", run ? "Y" : "N", file, run ? run.created_at : ""
83
+ end
84
+ puts ""
85
+ end
86
+
87
+ def df_run dry_run = true, steps = nil, no_backup = false
88
+ df_status
89
+
90
+ files = Dir.glob("*.rb", base: DATAFIX_DIR).sort
91
+ already_run = DataFix::DataFix.all.map { |x| x.name }.sort
92
+
93
+ to_run = steps ? (files - already_run)[0..(steps.to_i - 1)] : (files - already_run)
94
+ puts_and_log "data fix to run: #{to_run.join(", ")}"
95
+
96
+ # if we are doing things for real, backup the DB, unless
97
+ # explicitly asked not to do it
98
+ backup_database(dry_run) unless no_backup
99
+
100
+ # sort filenames by date (same as sorting alphabetically, since
101
+ # the date is in the name
102
+ to_run.sort.each do |file|
103
+ puts_and_log "starting data migration '#{file}'"
104
+ if dry_run
105
+ puts_and_log "WOULD RUN: ${File.join(DATAFIX_DIR, file)}"
106
+ else
107
+ load File.join(DATAFIX_DIR, file)
108
+ DataFix::DataFix.create(name: file)
109
+ end
110
+ puts_and_log "done!"
111
+ end
112
+ end
113
+
114
+ desc 'Dry run the required data fixes (STEP= to specify the optional number of steps)'
115
+ task dry_run: :environment do
116
+ exit_if_not_installed
117
+ df_run true, ENV["STEP"]
118
+ end
119
+
120
+ desc 'Run the required data fixes (STEP= to specify the optional number of steps)'
121
+ task run: :environment do
122
+ exit_if_not_installed
123
+ df_run false, ENV["STEP"]
124
+ end
125
+
126
+ desc 'Status: show which data fixes have been run'
127
+ task status: :environment do
128
+ exit_if_not_installed
129
+ df_status
130
+ end
131
+
132
+ desc 'Reconcile: declare that all data fixes have been run'
133
+ task reconcile: :environment do
134
+ exit_if_not_installed
135
+
136
+ DataFix::DataFix.destroy_all
137
+
138
+ files = Dir.glob("*.rb", base: DATAFIX_DIR).sort
139
+ files.each do |file|
140
+ DataFix::DataFix.create(name: file)
141
+ end
142
+ puts_and_log "all data fixes have now been *declared* as run"
143
+ end
144
+
145
+ desc 'Reconcile up to: declare that data fixes up to given filename (included) have been run'
146
+ task :reconcile_up_to, [:filename] => :environment do |task, args|
147
+ exit_if_not_installed
148
+
149
+ stop_file = args[:filename]
150
+
151
+ DataFix::DataFix.destroy_all
152
+ files = Dir.glob("*.rb", base: DATAFIX_DIR).sort
153
+ files.each do |file|
154
+ DataFix::DataFix.create(name: file)
155
+ exit if file == stop_file
156
+ end
157
+ end
158
+
159
+ desc 'Rollback: declare that the latest STEP data fixes have not been run (default 1)'
160
+ task rollback: :environment do
161
+ exit_if_not_installed
162
+
163
+ step = ENV["STEP"] || 1
164
+ step.times do
165
+ DataFix::DataFix.last.destroy
166
+ end
167
+ end
168
+ end
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_data_fix
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Adolfo Villafiorita
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-07-30 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: " This gem provides a set of commands to manage data maintenance scripts
14
+ of a Rails application like migrations. \n\nEach script has a timestamped name;
15
+ a table in the DBs keeps track of\nthe scripts which have been run. Similar to
16
+ migrations you can run\nmultiple scripts in the same session. DataFix keeps track
17
+ of which\nscripts have already run.\n\nWe use it at Shair.Tech to simplify testing
18
+ of migration scripts.\n"
19
+ email:
20
+ - adolfo@shair.tech
21
+ executables: []
22
+ extensions: []
23
+ extra_rdoc_files: []
24
+ files:
25
+ - ".gitignore"
26
+ - ".rspec"
27
+ - ".rubocop.yml"
28
+ - CHANGELOG.org
29
+ - Gemfile
30
+ - Gemfile.lock
31
+ - LICENSE.txt
32
+ - README.org
33
+ - Rakefile
34
+ - bin/console
35
+ - bin/setup
36
+ - data_fix.gemspec
37
+ - lib/data_fix.rb
38
+ - lib/data_fix/data_fix.rb
39
+ - lib/data_fix/railtie.rb
40
+ - lib/data_fix/version.rb
41
+ - lib/tasks/data_fix_tasks.rake
42
+ homepage: https://ict4g.net/gitea/haoyun/data_fix.git
43
+ licenses:
44
+ - MIT
45
+ metadata:
46
+ allowed_push_host: https://www.rubygems.org
47
+ homepage_uri: https://ict4g.net/gitea/haoyun/data_fix.git
48
+ source_code_uri: https://ict4g.net/gitea/haoyun/data_fix.git
49
+ changelog_uri: https://ict4g.net/gitea/haoyun/data_fix.git/CHANGELOG.org
50
+ post_install_message:
51
+ rdoc_options: []
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: 2.4.0
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubygems_version: 3.0.3
66
+ signing_key:
67
+ specification_version: 4
68
+ summary: Manage your data maintenance tasks like they were migrations
69
+ test_files: []