master_data_tool 0.21.1 → 0.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/exe/master_data_tool +3 -65
  3. data/lib/master_data_tool/act_as_master_data.rb +13 -0
  4. data/lib/master_data_tool/command/dump.rb +43 -0
  5. data/lib/master_data_tool/command/import.rb +86 -0
  6. data/lib/master_data_tool/command/verify.rb +64 -0
  7. data/lib/master_data_tool/command.rb +5 -0
  8. data/lib/master_data_tool/config.rb +2 -2
  9. data/lib/master_data_tool/dump/config.rb +42 -0
  10. data/lib/master_data_tool/dump/executor.rb +9 -15
  11. data/lib/master_data_tool/dump.rb +1 -0
  12. data/lib/master_data_tool/import/config.rb +35 -0
  13. data/lib/master_data_tool/import/executor.rb +49 -76
  14. data/lib/master_data_tool/import.rb +1 -0
  15. data/lib/master_data_tool/master_data.rb +48 -36
  16. data/lib/master_data_tool/master_data_collection.rb +1 -1
  17. data/lib/master_data_tool/master_data_file.rb +4 -4
  18. data/lib/master_data_tool/master_data_file_collection.rb +10 -8
  19. data/lib/master_data_tool/master_data_status.rb +18 -9
  20. data/lib/master_data_tool/report/core.rb +2 -2
  21. data/lib/master_data_tool/report/default_printer.rb +1 -1
  22. data/lib/master_data_tool/report/import_report.rb +13 -15
  23. data/lib/master_data_tool/report/print_affected_table_report.rb +2 -2
  24. data/lib/master_data_tool/report/printer.rb +2 -2
  25. data/lib/master_data_tool/report/verify_report.rb +8 -8
  26. data/lib/master_data_tool/spec_config.rb +8 -10
  27. data/lib/master_data_tool/verify/config.rb +39 -0
  28. data/lib/master_data_tool/verify/executor.rb +39 -0
  29. data/lib/master_data_tool/verify.rb +4 -0
  30. data/lib/master_data_tool/version.rb +1 -1
  31. data/lib/master_data_tool.rb +21 -3
  32. data/sig/master_data_tool.rbs +323 -171
  33. metadata +38 -15
  34. data/LICENSE +0 -21
  35. data/README.md +0 -242
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3b637e96ac2000aeea49efd8a638384ebe87d750798dfc6e7f87e0d6be5f5d0
4
- data.tar.gz: 2845294e3da24330a05b9f25c8d4bbf9fa0b9d17e12277dbb5cfe75be73b0d63
3
+ metadata.gz: f6232c3b6ae362cffd34640cd73539eb95423952013d5c37d49f23e54407f075
4
+ data.tar.gz: 96378ffa854e3743e75b977219e5727992c0732455f92e417d4bd428e635c7f9
5
5
  SHA512:
6
- metadata.gz: 5363243ee6f1a9e3210b97f31e88eaf4add3f2e452348cc79e27987b9d735947e2c2ffec45076dbad7c2a0d38b434d5ee04bb0de6d460a25b123a85ab54a2ced
7
- data.tar.gz: 5a665a846fd443010e83a99236436bf0e32c68a65185945eeb919415f7f5c2b3b686c993f329eff2ab6f0445abd41b0a40d58744b0136b029418a21c30ca2423
6
+ metadata.gz: 5d730d66002a0f74a6f1600077e30a1df4d4481eee665328fb0d2aa151763a0800112cc073165efe9e5c9df6dd50135348416c296d4b5c8d08ae5c7265c5c9cf
7
+ data.tar.gz: 685e1be7c64b7b61627c08499bd43c5517e8637c203925e9b4f0e8997bdfbc9fe86c3d2d8f6a29500f8bbe754be65be409e3d806a69ba65f53d5940992ca7278
data/exe/master_data_tool CHANGED
@@ -9,71 +9,9 @@ require environment_path
9
9
 
10
10
  module MasterDataTool
11
11
  class CLI < Thor
12
- option :dry_run, default: nil, type: :boolean
13
- option :verify, default: nil, type: :boolean
14
- option :spec_name, default: '', type: :string
15
- option :only_import_tables, default: nil, type: :array
16
- option :except_import_tables, default: nil, type: :array
17
- option :only_verify_tables, default: nil, type: :array
18
- option :except_verify_tables, default: nil, type: :array
19
- option :skip_no_change, default: nil, type: :boolean
20
- option :silent, default: nil, type: :boolean
21
- option :override_identifier, default: nil, type: :string
22
- option :delete_all_ignore_foreign_key, default: nil, type: :boolean
23
- desc 'import', 'import'
24
- def import
25
- spec_config = MasterDataTool.config.spec_config(options['spec_name'])
26
- new_options = config.default_import_options.with_indifferent_access.merge(options)
27
- new_options[:spec_config] = spec_config
28
-
29
- executor = MasterDataTool::Import::Executor.new(**new_options.symbolize_keys)
30
- executor.execute
31
- end
32
-
33
- option :dry_run, default: nil, type: :boolean
34
- option :verify, default: nil, type: :boolean
35
- option :skip_no_change, default: nil, type: :boolean
36
- desc 'import_all', 'import all'
37
- def import_all
38
- MasterDataTool.config.spec_configs.each do |spec_config|
39
- new_options = spec_config.default_import_options.with_indifferent_access.merge(options)
40
- new_options[:spec_config] = spec_config
41
-
42
- executor = MasterDataTool::Import::Executor.new(**new_options.symbolize_keys)
43
- executor.execute
44
- end
45
- end
46
-
47
- option :spec_name, default: nil, type: :string
48
- option :ignore_empty_table, default: true, type: :boolean
49
- option :ignore_tables, default: [], type: :array
50
- option :ignore_column_names, default: [], type: :array
51
- option :only_tables, default: nil, type: :array
52
- option :verbose, default: false, type: :boolean
53
- desc 'dump', 'dump'
54
- def dump
55
- ignore_empty_table = options[:ignore_empty_table]
56
- ignore_tables = options[:ignore_tables]
57
- ignore_column_names = options[:ignore_column_names]
58
- only_tables = options[:only_tables]
59
- verbose = options[:verbose]
60
- spec_config = MasterDataTool.config.spec_config(options['spec_name'])
61
-
62
- executor = MasterDataTool::Dump::Executor.new(
63
- spec_config: spec_config,
64
- ignore_empty_table: ignore_empty_table,
65
- ignore_tables: ignore_tables,
66
- ignore_column_names: ignore_column_names,
67
- only_tables: only_tables,
68
- verbose: verbose
69
- )
70
- errors = executor.execute
71
-
72
- return if errors.empty?
73
-
74
- message = errors.map { |error| "table:#{error.table}\tmessage:#{error.exception.message}" }.join("\n")
75
- raise message
76
- end
12
+ include MasterDataTool::Command::Import
13
+ include MasterDataTool::Command::Verify
14
+ include MasterDataTool::Command::Dump
77
15
  end
78
16
  end
79
17
 
@@ -0,0 +1,13 @@
1
+ require 'active_support/concern'
2
+
3
+ module MasterDataTool
4
+ module ActAsMasterData
5
+ extend ActiveSupport::Concern
6
+
7
+ class_methods do
8
+ def master_data?
9
+ true
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,43 @@
1
+ module MasterDataTool
2
+ module Command
3
+ module Dump
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ desc 'dump', 'dump'
8
+
9
+ option :spec_name, default: nil, type: :string
10
+
11
+ option :ignore_empty_table, default: MasterDataTool::Dump::Config::DEFAULT_VALUES[:ignore_empty_table], type: :boolean
12
+ option :ignore_tables, default: MasterDataTool::Dump::Config::DEFAULT_VALUES[:ignore_tables], type: :array
13
+ option :ignore_column_names, default: MasterDataTool::Dump::Config::DEFAULT_VALUES[:ignore_column_names], type: :array
14
+ option :only_tables, default: MasterDataTool::Dump::Config::DEFAULT_VALUES[:only_tables], type: :array
15
+ option :verbose, default: false, type: :boolean
16
+
17
+ def dump
18
+ spec_config = MasterDataTool.config.spec_config(options[:spec_name])
19
+ raise "正しいspec_nameを指定して下さい" unless spec_config
20
+
21
+ dump_config = spec_config.dump_config || MasterDataTool::Dump::Config.new(
22
+ ignore_empty_table: options[:ignore_empty_table],
23
+ ignore_tables: options[:ignore_tables],
24
+ ignore_column_names: options[:ignore_column_names],
25
+ only_tables: options[:only_tables]
26
+ )
27
+
28
+ executor = MasterDataTool::Dump::Executor.new(
29
+ spec_config: spec_config,
30
+ dump_config: dump_config,
31
+ verbose: options[:verbose]
32
+ )
33
+ errors = executor.execute
34
+
35
+ return if errors.empty?
36
+
37
+ message = errors.map { |error| "table:#{error.table}\tmessage:#{error.exception.message}" }.join("\n")
38
+ raise message
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,86 @@
1
+ module MasterDataTool
2
+ module Command
3
+ module Import
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ option :spec_name, default: nil, type: :string
8
+ option :dry_run, default: true, type: :boolean
9
+ option :verify, default: true, type: :boolean
10
+ option :silent, default: false, type: :boolean
11
+ option :override_identifier, default: nil, type: :string
12
+
13
+ # import config
14
+ option :only_import_tables, default: MasterDataTool::Import::Config::DEFAULT_VALUES[:only_tables], type: :array
15
+ option :except_import_tables, default: MasterDataTool::Import::Config::DEFAULT_VALUES[:except_tables], type: :array
16
+ option :skip_no_change, default: MasterDataTool::Import::Config::DEFAULT_VALUES[:skip_no_change], type: :boolean
17
+ option :ignore_foreign_key_when_delete, default: MasterDataTool::Import::Config::DEFAULT_VALUES[:ignore_foreign_key_when_delete], type: :boolean
18
+
19
+ # verify config
20
+ option :only_verify_tables, default: MasterDataTool::Verify::Config::DEFAULT_VALUES[:only_tables], type: :array
21
+ option :except_verify_tables, default: MasterDataTool::Verify::Config::DEFAULT_VALUES[:except_tables], type: :array
22
+ option :preload_belongs_to_associations, default: MasterDataTool::Verify::Config::DEFAULT_VALUES[:preload_belongs_to_associations], type: :boolean
23
+
24
+ desc 'import', 'import'
25
+ def import
26
+ spec_config = MasterDataTool.config.spec_config(options[:spec_name])
27
+ raise "正しいspec_nameを指定して下さい" unless spec_config
28
+
29
+ build_import_executor(spec_config).execute
30
+ end
31
+
32
+ option :dry_run, default: true, type: :boolean
33
+ option :verify, default: true, type: :boolean
34
+ option :silent, default: false, type: :boolean
35
+ option :override_identifier, default: nil, type: :string
36
+
37
+ # import config
38
+ option :only_import_tables, default: MasterDataTool::Import::Config::DEFAULT_VALUES[:only_tables], type: :array
39
+ option :except_import_tables, default: MasterDataTool::Import::Config::DEFAULT_VALUES[:except_tables], type: :array
40
+ option :skip_no_change, default: MasterDataTool::Import::Config::DEFAULT_VALUES[:skip_no_change], type: :boolean
41
+ option :ignore_foreign_key_when_delete, default: MasterDataTool::Import::Config::DEFAULT_VALUES[:ignore_foreign_key_when_delete], type: :boolean
42
+
43
+ # verify config
44
+ option :only_verify_tables, default: MasterDataTool::Verify::Config::DEFAULT_VALUES[:only_tables], type: :array
45
+ option :except_verify_tables, default: MasterDataTool::Verify::Config::DEFAULT_VALUES[:except_tables], type: :array
46
+ option :preload_belongs_to_associations, default: MasterDataTool::Verify::Config::DEFAULT_VALUES[:preload_belongs_to_associations], type: :boolean
47
+
48
+ desc 'import_all', 'import all'
49
+ def import_all
50
+ MasterDataTool.config.spec_configs.each do |spec_config|
51
+ build_import_executor(spec_config).execute
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def build_import_executor(spec_config)
58
+ import_config = spec_config.import_config || MasterDataTool::Import::Config.new(
59
+ only_tables: options[:only_import_tables],
60
+ except_tables: options[:except_import_tables],
61
+ skip_no_change: options[:skip_no_change],
62
+ ignore_foreign_key_when_delete: options[:ignore_foreign_key_when_delete]
63
+ )
64
+
65
+ verify_config = spec_config.verify_config || MasterDataTool::Verify::Config.new(
66
+ only_tables: options[:only_verify_tables],
67
+ except_tables: options[:except_verify_tables],
68
+ preload_belongs_to_associations: options[:preload_belongs_to_associations],
69
+ preload_associations: {},
70
+ eager_load_associations: {}
71
+ )
72
+
73
+ MasterDataTool::Import::Executor.new(
74
+ spec_config: spec_config,
75
+ import_config: import_config,
76
+ verify_config: verify_config,
77
+ dry_run: options[:dry_run],
78
+ verify: options[:verify],
79
+ silent: options[:silent],
80
+ override_identifier: options[:override_identifier]
81
+ )
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,64 @@
1
+ module MasterDataTool
2
+ module Command
3
+ module Verify
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ desc 'verify', 'verify'
8
+
9
+ option :spec_name, default: nil, type: :string
10
+ option :verify, default: true, type: :boolean
11
+ option :silent, default: false, type: :boolean
12
+ option :override_identifier, default: nil, type: :string
13
+
14
+ # verify config
15
+ option :only_tables, default: MasterDataTool::Verify::Config::DEFAULT_VALUES[:only_tables], type: :array
16
+ option :except_tables, default: MasterDataTool::Verify::Config::DEFAULT_VALUES[:except_tables], type: :array
17
+ option :preload_belongs_to_associations, default: MasterDataTool::Verify::Config::DEFAULT_VALUES[:preload_belongs_to_associations], type: :boolean
18
+
19
+ def verify
20
+ spec_config = MasterDataTool.config.spec_config(options[:spec_name])
21
+ raise "正しいspec_nameを指定して下さい" unless spec_config
22
+
23
+ build_verify_executor(spec_config).execute
24
+ end
25
+
26
+ desc 'verify_all', 'verify all'
27
+
28
+ option :verify, default: true, type: :boolean
29
+ option :silent, default: false, type: :boolean
30
+ option :override_identifier, default: nil, type: :string
31
+
32
+ # verify config
33
+ option :only_tables, default: MasterDataTool::Verify::Config::DEFAULT_VALUES[:only_tables], type: :array
34
+ option :except_tables, default: MasterDataTool::Verify::Config::DEFAULT_VALUES[:except_tables], type: :array
35
+ option :preload_belongs_to_associations, default: MasterDataTool::Verify::Config::DEFAULT_VALUES[:preload_belongs_to_associations], type: :boolean
36
+
37
+ def verify_all
38
+ MasterDataTool.config.spec_configs.each do |spec_config|
39
+ build_verify_executor(spec_config).execute
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def build_verify_executor(spec_config)
46
+ verify_config = spec_config.verify_config || MasterDataTool::Verify::Config.new(
47
+ only_tables: options[:only_tables],
48
+ except_tables: options[:except_tables],
49
+ preload_belongs_to_associations: options[:preload_belongs_to_associations],
50
+ preload_associations: {},
51
+ eager_load_associations: {}
52
+ )
53
+
54
+ MasterDataTool::Verify::Executor.new(
55
+ spec_config: spec_config,
56
+ verify_config: verify_config,
57
+ silent: options[:silent],
58
+ override_identifier: options[:override_identifier]
59
+ )
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "command/import"
4
+ require_relative "command/verify"
5
+ require_relative "command/dump"
@@ -13,10 +13,10 @@ module MasterDataTool
13
13
  end
14
14
 
15
15
  def spec_config(spec_name)
16
- spec_configs.detect { |c| c.spec_name == spec_name }
16
+ spec_configs.detect { |c| c.spec_name.to_s == spec_name.to_s }
17
17
  end
18
18
 
19
- def csv_dir_for(spec_name, override_identifier = nil)
19
+ def csv_dir_for(spec_name:, override_identifier: nil)
20
20
  path = MasterDataTool.config.master_data_dir
21
21
  path = path.join(spec_name.to_s) if spec_name.present?
22
22
  path = path.join(override_identifier.to_s) if override_identifier.present?
@@ -0,0 +1,42 @@
1
+ module MasterDataTool
2
+ module Dump
3
+ class Config
4
+ DEFAULT_IGNORE_TABLES = %w[ar_internal_metadata schema_migrations master_data_statuses]
5
+ DEFAULT_IGNORE_COLUMNS = %w[created_at updated_at]
6
+
7
+ DEFAULT_VALUES = {
8
+ ignore_empty_table: true,
9
+ ignore_tables: [],
10
+ ignore_column_names: [],
11
+ only_tables: [],
12
+ }
13
+
14
+ attr_accessor :ignore_empty_table, :ignore_tables, :ignore_column_names, :only_tables
15
+
16
+ def initialize(ignore_empty_table:, ignore_tables:, ignore_column_names:, only_tables:)
17
+ @ignore_empty_table = ignore_empty_table
18
+ @ignore_tables = DEFAULT_IGNORE_TABLES + ignore_tables
19
+ @ignore_column_names = DEFAULT_IGNORE_COLUMNS + ignore_column_names
20
+ @only_tables = only_tables
21
+ end
22
+
23
+ def configure
24
+ yield self
25
+ end
26
+
27
+ def ignore_tables=(tables)
28
+ @ignore_tables = (DEFAULT_IGNORE_TABLES + tables).uniq
29
+ end
30
+
31
+ def ignore_column_names=(column_names)
32
+ @ignore_column_names = (DEFAULT_IGNORE_COLUMNS + column_names).uniq
33
+ end
34
+
35
+ class << self
36
+ def default_config
37
+ new(**DEFAULT_VALUES)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -5,34 +5,28 @@ module MasterDataTool
5
5
  class Executor
6
6
  Error = Struct.new(:table, :exception)
7
7
 
8
- DEFAULT_IGNORE_TABLES = %w[ar_internal_metadata schema_migrations master_data_statuses]
9
- DEFAULT_IGNORE_COLUMNS = %w[created_at updated_at]
10
-
11
- def initialize(spec_config:, ignore_empty_table: true, ignore_tables: [], ignore_column_names: [], only_tables: [], verbose: false)
8
+ def initialize(spec_config:, dump_config:, verbose: false)
12
9
  @spec_config = spec_config
13
- @ignore_empty_table = ignore_empty_table
14
- @ignore_tables = DEFAULT_IGNORE_TABLES + Array(spec_config.dump_ignore_tables) + ignore_tables
15
- @ignore_column_names = DEFAULT_IGNORE_COLUMNS + Array(spec_config.dump_ignore_columns) + ignore_column_names
16
- @only_tables = Array(only_tables)
10
+ @dump_config = dump_config
17
11
  @verbose = verbose
18
12
  end
19
13
 
20
14
  def execute
21
15
  [].tap do |errors|
22
16
  spec_config.application_record_class.connection.tables.each do |table|
23
- if ignore_tables.include?(table)
17
+ if dump_config.ignore_tables.include?(table)
24
18
  print_message "[ignore] #{table}"
25
19
 
26
20
  next
27
21
  end
28
22
 
29
- if only_tables.any? && !only_tables.include?(table)
23
+ if dump_config.only_tables.any? && !dump_config.only_tables.include?(table)
30
24
  print_message "[skip] #{table}"
31
25
  next
32
26
  end
33
27
 
34
28
  dump_to_csv(table)
35
- rescue => e
29
+ rescue StandardError => e
36
30
  errors << Error.new(table, e)
37
31
  end
38
32
  end
@@ -40,7 +34,7 @@ module MasterDataTool
40
34
 
41
35
  private
42
36
 
43
- attr_reader :spec_config, :ignore_empty_table, :ignore_tables, :ignore_column_names, :only_tables, :verbose
37
+ attr_reader :spec_config, :dump_config, :verbose
44
38
 
45
39
  def print_message(message)
46
40
  return unless verbose
@@ -56,11 +50,11 @@ module MasterDataTool
56
50
  return
57
51
  end
58
52
 
59
- csv_path = MasterDataTool.config.csv_dir_for(spec_config.spec_name).join("#{table}.csv")
53
+ csv_path = MasterDataTool.config.csv_dir_for(spec_name: spec_config.spec_name).join("#{table}.csv")
60
54
  FileUtils.mkdir_p(csv_path.dirname)
61
55
 
62
56
  CSV.open(csv_path, 'w', force_quotes: true) do |csv|
63
- headers = model_klass.column_names - ignore_column_names
57
+ headers = model_klass.column_names - dump_config.ignore_column_names
64
58
 
65
59
  csv << headers
66
60
 
@@ -76,7 +70,7 @@ module MasterDataTool
76
70
  end
77
71
 
78
72
  def ignore?(model_klass)
79
- return false unless ignore_empty_table
73
+ return false unless dump_config.ignore_empty_table
80
74
 
81
75
  model_klass.count < 1
82
76
  end
@@ -1,3 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "dump/config"
3
4
  require_relative "dump/executor"
@@ -0,0 +1,35 @@
1
+ module MasterDataTool
2
+ module Import
3
+ class Config
4
+ DEFAULT_VALUES = {
5
+ only_tables: [],
6
+ except_tables: [],
7
+ skip_no_change: true,
8
+ ignore_foreign_key_when_delete: true,
9
+ }
10
+
11
+ attr_accessor :only_tables, :except_tables, :skip_no_change, :ignore_foreign_key_when_delete
12
+
13
+ def initialize(only_tables:, except_tables:, skip_no_change:, ignore_foreign_key_when_delete:)
14
+ @only_tables = only_tables
15
+ @except_tables = except_tables
16
+ @skip_no_change = skip_no_change
17
+ @ignore_foreign_key_when_delete = ignore_foreign_key_when_delete
18
+ end
19
+
20
+ def skip_table?(table_name)
21
+ MasterDataTool.need_skip_table?(table_name, only_tables, except_tables)
22
+ end
23
+
24
+ def configure
25
+ yield self
26
+ end
27
+
28
+ class << self
29
+ def default_config
30
+ new(**DEFAULT_VALUES)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end