master_data_tool 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/master_data_tool/master_data.rb +104 -106
- data/lib/master_data_tool/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e948beea211d4b3fba1d194412cbafd3b6d7d8c768215bf038b5ea89bbaf1b17
|
4
|
+
data.tar.gz: d72dc44dce6c653c75713440bba5691b062bef9ca766a6159ed233d640f00724
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 355a59050f15b91c854e3c79602d89f4c41fd7d7abf49ae0a9cc9be2bc6fbdb212aa4af8d714619e1c0231ad7fd6f321a66e65b6b43cbf0751c4eaf7aa25d7ea
|
7
|
+
data.tar.gz: 48daa315d4805233c1f357ffc80de821c1cd55cba71401723cbb1e33524d4fa483a24e8a6acef42065be58bd0ba4cda208d1b3229679b73c3423098eb38f71c1
|
@@ -1,156 +1,154 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module MasterDataTool
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
attr_reader :before_count, :after_count
|
8
|
-
|
9
|
-
def initialize(csv_path, model_klass)
|
10
|
-
@csv_path = csv_path
|
11
|
-
@model_klass = model_klass
|
12
|
-
|
13
|
-
@loaded = false
|
14
|
-
|
15
|
-
@columns = []
|
16
|
-
@new_records = []
|
17
|
-
@updated_records = []
|
18
|
-
@no_change_records = []
|
19
|
-
@deleted_records = []
|
20
|
-
end
|
4
|
+
class MasterData
|
5
|
+
attr_reader :csv_path, :model_klass, :columns, :new_records, :updated_records, :no_change_records, :deleted_records
|
6
|
+
attr_reader :before_count, :after_count
|
21
7
|
|
22
|
-
|
23
|
-
|
24
|
-
|
8
|
+
def initialize(csv_path, model_klass)
|
9
|
+
@csv_path = csv_path
|
10
|
+
@model_klass = model_klass
|
25
11
|
|
26
|
-
|
27
|
-
deleted_ids = old_records_by_id.keys - csv_records_by_id.keys
|
12
|
+
@loaded = false
|
28
13
|
|
29
|
-
|
14
|
+
@columns = []
|
15
|
+
@new_records = []
|
16
|
+
@updated_records = []
|
17
|
+
@no_change_records = []
|
18
|
+
@deleted_records = []
|
19
|
+
end
|
30
20
|
|
31
|
-
|
32
|
-
|
33
|
-
|
21
|
+
def load
|
22
|
+
csv = CSV.read(@csv_path, headers: true, skip_blanks: true)
|
23
|
+
old_records_by_id = @model_klass.all.index_by(&:id)
|
34
24
|
|
35
|
-
|
36
|
-
|
25
|
+
csv_records_by_id = build_records_from_csv(csv, old_records_by_id)
|
26
|
+
deleted_ids = old_records_by_id.keys - csv_records_by_id.keys
|
37
27
|
|
38
|
-
|
39
|
-
@updated_records << record
|
28
|
+
@columns = csv.headers
|
40
29
|
|
41
|
-
|
42
|
-
|
30
|
+
csv_records_by_id.each do |_, record|
|
31
|
+
if record.new_record?
|
32
|
+
@new_records << record
|
43
33
|
|
44
|
-
|
34
|
+
next
|
45
35
|
end
|
46
36
|
|
47
|
-
|
48
|
-
@
|
37
|
+
if record.has_changes_to_save?
|
38
|
+
@updated_records << record
|
39
|
+
|
40
|
+
next
|
49
41
|
end
|
50
42
|
|
51
|
-
@
|
43
|
+
@no_change_records << record
|
52
44
|
end
|
53
45
|
|
54
|
-
|
55
|
-
|
46
|
+
deleted_ids.each do |id|
|
47
|
+
@deleted_records << old_records_by_id[id]
|
56
48
|
end
|
57
49
|
|
58
|
-
|
59
|
-
|
60
|
-
end
|
50
|
+
@loaded = true
|
51
|
+
end
|
61
52
|
|
62
|
-
|
63
|
-
|
53
|
+
def import_records
|
54
|
+
new_records + updated_records + no_change_records
|
55
|
+
end
|
64
56
|
|
65
|
-
|
66
|
-
|
57
|
+
def affected_records
|
58
|
+
new_records + updated_records + deleted_records
|
59
|
+
end
|
67
60
|
|
68
|
-
|
69
|
-
|
61
|
+
def new_records
|
62
|
+
raise MasterDataTool::NotLoadedError unless @loaded
|
70
63
|
|
71
|
-
|
72
|
-
|
64
|
+
@new_records
|
65
|
+
end
|
73
66
|
|
74
|
-
|
75
|
-
|
67
|
+
def updated_records
|
68
|
+
raise MasterDataTool::NotLoadedError unless @loaded
|
76
69
|
|
77
|
-
|
78
|
-
|
70
|
+
@updated_records
|
71
|
+
end
|
79
72
|
|
80
|
-
|
81
|
-
|
73
|
+
def no_change_records
|
74
|
+
raise MasterDataTool::NotLoadedError unless @loaded
|
82
75
|
|
83
|
-
|
84
|
-
|
76
|
+
@no_change_records
|
77
|
+
end
|
85
78
|
|
86
|
-
|
87
|
-
|
88
|
-
end
|
79
|
+
def deleted_records
|
80
|
+
raise MasterDataTool::NotLoadedError unless @loaded
|
89
81
|
|
90
|
-
|
91
|
-
|
92
|
-
@affected = affected_records.any?
|
93
|
-
end
|
82
|
+
@deleted_records
|
83
|
+
end
|
94
84
|
|
95
|
-
|
96
|
-
|
97
|
-
|
85
|
+
def loaded?
|
86
|
+
@loaded
|
87
|
+
end
|
98
88
|
|
99
|
-
|
100
|
-
|
101
|
-
|
89
|
+
def affected?
|
90
|
+
return @affected if instance_variable_defined?(:@affected)
|
91
|
+
@affected = affected_records.any?
|
92
|
+
end
|
102
93
|
|
103
|
-
|
104
|
-
|
105
|
-
|
94
|
+
def before_count
|
95
|
+
@before_count ||= updated_records.count + no_change_records.count + deleted_records.count
|
96
|
+
end
|
106
97
|
|
107
|
-
|
108
|
-
|
98
|
+
def after_count
|
99
|
+
@after_count ||= updated_records.count + no_change_records.count + new_records.count
|
100
|
+
end
|
109
101
|
|
110
|
-
|
111
|
-
|
112
|
-
|
102
|
+
def table_name
|
103
|
+
@model_klass.table_name
|
104
|
+
end
|
113
105
|
|
114
|
-
|
106
|
+
def import!(dry_run: true)
|
107
|
+
raise MasterDataTool::NotLoadedError unless @loaded
|
115
108
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
end
|
109
|
+
MasterDataTool::Report::ImportReport.new(self).tap do |report|
|
110
|
+
return report if dry_run
|
111
|
+
return report unless affected?
|
120
112
|
|
121
|
-
|
122
|
-
MasterDataTool::Report::VerifyReport.new(self).tap do |report|
|
123
|
-
@model_klass.all.find_each do |record|
|
124
|
-
valid = record.valid?
|
125
|
-
report.append(MasterDataTool::Report::VerifyReport.build_verify_record_report(self, record, valid))
|
126
|
-
next if dry_run
|
113
|
+
@model_klass.delete_all
|
127
114
|
|
128
|
-
|
129
|
-
|
130
|
-
end
|
115
|
+
# マスターデータ間の依存がある場合に投入順制御するのは大変なのでこのタイミングでのバリデーションはしない
|
116
|
+
@model_klass.import(import_records, validate: false, on_duplicate_key_update: @columns, timestamps: true)
|
131
117
|
end
|
118
|
+
end
|
132
119
|
|
133
|
-
|
134
|
-
|
135
|
-
|
120
|
+
def verify!(dry_run: true)
|
121
|
+
MasterDataTool::Report::VerifyReport.new(self).tap do |report|
|
122
|
+
@model_klass.all.find_each do |record|
|
123
|
+
valid = record.valid?
|
124
|
+
report.append(MasterDataTool::Report::VerifyReport.build_verify_record_report(self, record, valid))
|
125
|
+
next if dry_run
|
136
126
|
|
137
|
-
|
127
|
+
raise MasterDataTool::VerifyFailed.new("[#{table_name}] id = #{record.id} is invalid") unless valid
|
128
|
+
end
|
138
129
|
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def print_affected_table
|
133
|
+
return unless loaded?
|
134
|
+
return unless affected?
|
139
135
|
|
140
|
-
|
136
|
+
MasterDataTool::Report::PrintAffectedTableReport.new(self)
|
137
|
+
end
|
141
138
|
|
142
|
-
|
143
|
-
{}.tap do |records|
|
144
|
-
csv.each do |row|
|
145
|
-
id = row['id'].to_i
|
146
|
-
record = old_records_by_id[id] || @model_klass.new(id: id)
|
139
|
+
private
|
147
140
|
|
148
|
-
|
149
|
-
|
150
|
-
|
141
|
+
def build_records_from_csv(csv, old_records_by_id)
|
142
|
+
{}.tap do |records|
|
143
|
+
csv.each do |row|
|
144
|
+
id = row['id'].to_i
|
145
|
+
record = old_records_by_id[id] || @model_klass.new(id: id)
|
151
146
|
|
152
|
-
|
147
|
+
csv.headers.each do |key|
|
148
|
+
record[key.to_s] = row[key]
|
153
149
|
end
|
150
|
+
|
151
|
+
records[id] = record
|
154
152
|
end
|
155
153
|
end
|
156
154
|
end
|