data_shifter 0.1.0 → 0.3.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/.husky/pre-commit +0 -3
- data/CHANGELOG.md +39 -0
- data/README.md +158 -46
- data/lib/data_shifter/configuration.rb +42 -0
- data/lib/data_shifter/errors.rb +46 -0
- data/lib/data_shifter/internal/colors.rb +71 -0
- data/lib/data_shifter/internal/env.rb +8 -6
- data/lib/data_shifter/internal/log_deduplicator.rb +149 -0
- data/lib/data_shifter/internal/output.rb +118 -69
- data/lib/data_shifter/internal/side_effect_guards.rb +120 -0
- data/lib/data_shifter/shift.rb +212 -23
- data/lib/data_shifter/version.rb +1 -1
- data/lib/data_shifter.rb +21 -0
- data/lib/generators/data_shift_generator.rb +90 -13
- metadata +21 -3
- data/lib/data_shifter/rubocop.rb +0 -4
- data/lib/rubocop/cop/data_shifter/skip_transaction_guard_dry_run.rb +0 -55
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module RuboCop
|
|
4
|
-
module Cop
|
|
5
|
-
module DataShifter
|
|
6
|
-
# In data shift files, `transaction false` disables automatic transaction
|
|
7
|
-
# and rollback. DB writes (and side effects) are not rolled back on dry run, so
|
|
8
|
-
# the shift must guard them with `return if dry_run?` or `return unless dry_run?`.
|
|
9
|
-
#
|
|
10
|
-
# @example
|
|
11
|
-
# # bad
|
|
12
|
-
# class BackfillUsers < DataShifter::Shift
|
|
13
|
-
# transaction false
|
|
14
|
-
# def process_record(record)
|
|
15
|
-
# record.update!(foo: 1)
|
|
16
|
-
# end
|
|
17
|
-
# end
|
|
18
|
-
#
|
|
19
|
-
# # good
|
|
20
|
-
# class BackfillUsers < DataShifter::Shift
|
|
21
|
-
# transaction false
|
|
22
|
-
# def process_record(record)
|
|
23
|
-
# return if dry_run?
|
|
24
|
-
# record.update!(foo: 1)
|
|
25
|
-
# end
|
|
26
|
-
# end
|
|
27
|
-
class SkipTransactionGuardDryRun < Base
|
|
28
|
-
MSG = "Data shifts using `transaction false` must guard writes/side effects with " \
|
|
29
|
-
"`return if dry_run?` or `return unless dry_run?`."
|
|
30
|
-
|
|
31
|
-
def_node_matcher :skip_transaction_call?, <<~PATTERN
|
|
32
|
-
(send _ :transaction {(sym :none) (false)})
|
|
33
|
-
PATTERN
|
|
34
|
-
|
|
35
|
-
def on_send(node)
|
|
36
|
-
return unless skip_transaction_call?(node)
|
|
37
|
-
return if file_contains_dry_run_guard?
|
|
38
|
-
|
|
39
|
-
add_offense(node, message: MSG)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
private
|
|
43
|
-
|
|
44
|
-
def file_contains_dry_run_guard?
|
|
45
|
-
return true unless processed_source.ast
|
|
46
|
-
|
|
47
|
-
processed_source.ast.each_node(:send) do |send_node|
|
|
48
|
-
return true if send_node.method?(:dry_run?)
|
|
49
|
-
end
|
|
50
|
-
false
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|