master_data_tool 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b3b9d67166d9f8444eb81991dbb936e830d8b7e60ba50570e0912dd0140e638
4
- data.tar.gz: 7f8d0d3b3290e82c193dd71df2708bdc1a02e5712f2b8efb0781ca5edd2a489e
3
+ metadata.gz: e948beea211d4b3fba1d194412cbafd3b6d7d8c768215bf038b5ea89bbaf1b17
4
+ data.tar.gz: d72dc44dce6c653c75713440bba5691b062bef9ca766a6159ed233d640f00724
5
5
  SHA512:
6
- metadata.gz: b5411088ef9469c49e89a3686e5b13505777d7c8a5bf2467d048bd10ffe463dd620786c5ad0b0cfb283973f156ac58f16e80cf0ae1d9f8b3e24603f86476caf6
7
- data.tar.gz: 52d97978ad4fbc4fadd81bcb4ec22bfeb8630a9f0edfc59142809aabec75c62b28e0bb60c3a541b352fed9a2b5f96cd7603959842f1f9d1f9f9b5abe964ed23e
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
- module Import
5
- class MasterData
6
- attr_reader :csv_path, :model_klass, :columns, :new_records, :updated_records, :no_change_records, :deleted_records
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
- def load
23
- csv = CSV.read(@csv_path, headers: true, skip_blanks: true)
24
- old_records_by_id = @model_klass.all.index_by(&:id)
8
+ def initialize(csv_path, model_klass)
9
+ @csv_path = csv_path
10
+ @model_klass = model_klass
25
11
 
26
- csv_records_by_id = build_records_from_csv(csv, old_records_by_id)
27
- deleted_ids = old_records_by_id.keys - csv_records_by_id.keys
12
+ @loaded = false
28
13
 
29
- @columns = csv.headers
14
+ @columns = []
15
+ @new_records = []
16
+ @updated_records = []
17
+ @no_change_records = []
18
+ @deleted_records = []
19
+ end
30
20
 
31
- csv_records_by_id.each do |_, record|
32
- if record.new_record?
33
- @new_records << record
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
- next
36
- end
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
- if record.has_changes_to_save?
39
- @updated_records << record
28
+ @columns = csv.headers
40
29
 
41
- next
42
- end
30
+ csv_records_by_id.each do |_, record|
31
+ if record.new_record?
32
+ @new_records << record
43
33
 
44
- @no_change_records << record
34
+ next
45
35
  end
46
36
 
47
- deleted_ids.each do |id|
48
- @deleted_records << old_records_by_id[id]
37
+ if record.has_changes_to_save?
38
+ @updated_records << record
39
+
40
+ next
49
41
  end
50
42
 
51
- @loaded = true
43
+ @no_change_records << record
52
44
  end
53
45
 
54
- def import_records
55
- new_records + updated_records + no_change_records
46
+ deleted_ids.each do |id|
47
+ @deleted_records << old_records_by_id[id]
56
48
  end
57
49
 
58
- def affected_records
59
- new_records + updated_records + deleted_records
60
- end
50
+ @loaded = true
51
+ end
61
52
 
62
- def new_records
63
- raise MasterDataTool::NotLoadedError unless @loaded
53
+ def import_records
54
+ new_records + updated_records + no_change_records
55
+ end
64
56
 
65
- @new_records
66
- end
57
+ def affected_records
58
+ new_records + updated_records + deleted_records
59
+ end
67
60
 
68
- def updated_records
69
- raise MasterDataTool::NotLoadedError unless @loaded
61
+ def new_records
62
+ raise MasterDataTool::NotLoadedError unless @loaded
70
63
 
71
- @updated_records
72
- end
64
+ @new_records
65
+ end
73
66
 
74
- def no_change_records
75
- raise MasterDataTool::NotLoadedError unless @loaded
67
+ def updated_records
68
+ raise MasterDataTool::NotLoadedError unless @loaded
76
69
 
77
- @no_change_records
78
- end
70
+ @updated_records
71
+ end
79
72
 
80
- def deleted_records
81
- raise MasterDataTool::NotLoadedError unless @loaded
73
+ def no_change_records
74
+ raise MasterDataTool::NotLoadedError unless @loaded
82
75
 
83
- @deleted_records
84
- end
76
+ @no_change_records
77
+ end
85
78
 
86
- def loaded?
87
- @loaded
88
- end
79
+ def deleted_records
80
+ raise MasterDataTool::NotLoadedError unless @loaded
89
81
 
90
- def affected?
91
- return @affected if instance_variable_defined?(:@affected)
92
- @affected = affected_records.any?
93
- end
82
+ @deleted_records
83
+ end
94
84
 
95
- def before_count
96
- @before_count ||= updated_records.count + no_change_records.count + deleted_records.count
97
- end
85
+ def loaded?
86
+ @loaded
87
+ end
98
88
 
99
- def after_count
100
- @after_count ||= updated_records.count + no_change_records.count + new_records.count
101
- end
89
+ def affected?
90
+ return @affected if instance_variable_defined?(:@affected)
91
+ @affected = affected_records.any?
92
+ end
102
93
 
103
- def table_name
104
- @model_klass.table_name
105
- end
94
+ def before_count
95
+ @before_count ||= updated_records.count + no_change_records.count + deleted_records.count
96
+ end
106
97
 
107
- def import!(dry_run: true)
108
- raise MasterDataTool::NotLoadedError unless @loaded
98
+ def after_count
99
+ @after_count ||= updated_records.count + no_change_records.count + new_records.count
100
+ end
109
101
 
110
- MasterDataTool::Report::ImportReport.new(self).tap do |report|
111
- return report if dry_run
112
- return report unless affected?
102
+ def table_name
103
+ @model_klass.table_name
104
+ end
113
105
 
114
- @model_klass.delete_all
106
+ def import!(dry_run: true)
107
+ raise MasterDataTool::NotLoadedError unless @loaded
115
108
 
116
- # マスターデータ間の依存がある場合に投入順制御するのは大変なのでこのタイミングでのバリデーションはしない
117
- @model_klass.import(import_records, validate: false, on_duplicate_key_update: @columns, timestamps: true)
118
- end
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
- def verify!(dry_run: true)
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
- raise MasterDataTool::VerifyFailed.new("[#{table_name}] id = #{record.id} is invalid") unless valid
129
- end
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
- def print_affected_table
134
- return unless loaded?
135
- return unless affected?
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
- MasterDataTool::Report::PrintAffectedTableReport.new(self)
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
- private
136
+ MasterDataTool::Report::PrintAffectedTableReport.new(self)
137
+ end
141
138
 
142
- def build_records_from_csv(csv, old_records_by_id)
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
- csv.headers.each do |key|
149
- record[key.to_s] = row[key]
150
- end
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
- records[id] = record
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MasterDataTool
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: master_data_tool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takahiro Ooishi