nicker_pocker 0.1.0 → 0.2.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: 2e7deb51ce3139db804c630002ca57d9ba14e1eae83b9838814ce88fed339d07
4
- data.tar.gz: 42b090b3a581625bb1554e85365cfb27f70429c1a0df067149eb12c7171260ed
3
+ metadata.gz: 74a52c39ca930e3720480a937ad3decec09f0ea61b13bc99fecceb7d258acfa7
4
+ data.tar.gz: b79e0dd5a16e4e62236234708371787abfc4dede1e54a58b3eb8298d934fdcf8
5
5
  SHA512:
6
- metadata.gz: b3c9afc9c7c15b9f4fbe34ad2e0afac7b95ecc7b90b2eefa8ede52d6cbac65d5305f5abc158e831adbf4ee5e97c8fc5ee7b668b3d6fc1a85166c4dd4098b5972
7
- data.tar.gz: 2ef075af0ca18c1cc998702b74ddccb315eb3c86c6f3abc95de9517b1b7a57a0abbfce0379c52632cbdec422b27b490e28f2f82078f48ab552b5019274eb6ee6
6
+ metadata.gz: 8c7e7d4ee9bee1c8b102627626aeb1803e9ecf015c163a8fb527aa0fa760f42237c92d652d45ce9338e8d11ffeef1e3e76b8803ffaddaa785c7a3c43037a6470
7
+ data.tar.gz: ca79c04b1fddc0faba5818b637c029103bcf81a76ecc6b1c70732c33a158090904412173da305e1864fc072f19e83fa92575cd0ad64732d83df8b47980dab3a0
data/Gemfile CHANGED
@@ -8,5 +8,6 @@ gemspec
8
8
  gem "rake", "~> 13.0"
9
9
 
10
10
  gem "rspec", "~> 3.0"
11
+ gem "factory_bot"
11
12
 
12
13
  gem "rubocop", "~> 1.21"
data/Gemfile.lock ADDED
@@ -0,0 +1,71 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ nicker_pocker (0.1.2.3)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ activesupport (7.0.4.3)
10
+ concurrent-ruby (~> 1.0, >= 1.0.2)
11
+ i18n (>= 1.6, < 2)
12
+ minitest (>= 5.1)
13
+ tzinfo (~> 2.0)
14
+ ast (2.4.2)
15
+ concurrent-ruby (1.2.2)
16
+ diff-lcs (1.5.0)
17
+ factory_bot (6.2.1)
18
+ activesupport (>= 5.0.0)
19
+ i18n (1.12.0)
20
+ concurrent-ruby (~> 1.0)
21
+ json (2.6.3)
22
+ minitest (5.18.0)
23
+ parallel (1.22.1)
24
+ parser (3.2.2.0)
25
+ ast (~> 2.4.1)
26
+ rainbow (3.1.1)
27
+ rake (13.0.6)
28
+ regexp_parser (2.7.0)
29
+ rexml (3.2.5)
30
+ rspec (3.12.0)
31
+ rspec-core (~> 3.12.0)
32
+ rspec-expectations (~> 3.12.0)
33
+ rspec-mocks (~> 3.12.0)
34
+ rspec-core (3.12.1)
35
+ rspec-support (~> 3.12.0)
36
+ rspec-expectations (3.12.2)
37
+ diff-lcs (>= 1.2.0, < 2.0)
38
+ rspec-support (~> 3.12.0)
39
+ rspec-mocks (3.12.5)
40
+ diff-lcs (>= 1.2.0, < 2.0)
41
+ rspec-support (~> 3.12.0)
42
+ rspec-support (3.12.0)
43
+ rubocop (1.50.1)
44
+ json (~> 2.3)
45
+ parallel (~> 1.10)
46
+ parser (>= 3.2.0.0)
47
+ rainbow (>= 2.2.2, < 4.0)
48
+ regexp_parser (>= 1.8, < 3.0)
49
+ rexml (>= 3.2.5, < 4.0)
50
+ rubocop-ast (>= 1.28.0, < 2.0)
51
+ ruby-progressbar (~> 1.7)
52
+ unicode-display_width (>= 2.4.0, < 3.0)
53
+ rubocop-ast (1.28.0)
54
+ parser (>= 3.2.1.0)
55
+ ruby-progressbar (1.13.0)
56
+ tzinfo (2.0.6)
57
+ concurrent-ruby (~> 1.0)
58
+ unicode-display_width (2.4.2)
59
+
60
+ PLATFORMS
61
+ x86_64-darwin-21
62
+
63
+ DEPENDENCIES
64
+ factory_bot
65
+ nicker_pocker!
66
+ rake (~> 13.0)
67
+ rspec (~> 3.0)
68
+ rubocop (~> 1.21)
69
+
70
+ BUNDLED WITH
71
+ 2.4.8
@@ -0,0 +1,149 @@
1
+ # 指定オプションに基づいて処理実行
2
+ require 'fileutils'
3
+ require 'csv'
4
+
5
+ module NickerPocker
6
+ MIGRATE_METHODS =
7
+ Format::Operator::PROTOTYPE_METHODS +
8
+ Format::Operator::DETAIL_METHODS
9
+
10
+ class Command
11
+ class << self
12
+ def exec(options = {})
13
+ new(options).run
14
+ end
15
+ end
16
+
17
+ # 各設定をセット
18
+ def initialize(options)
19
+ @options = options
20
+
21
+ # 初期値設定
22
+ @options[:input] ||= './db/migrate/'
23
+ @options[:output] ||= './nicker_pocker/'
24
+ @options[:format] ||= :csv
25
+ end
26
+
27
+ # 実行
28
+ def run
29
+ return if Dir.glob("#{@options[:input]}*\.rb").empty?
30
+
31
+ output(read_data)
32
+ end
33
+
34
+ private
35
+
36
+ # 対象マイグレーションファイルを読み込み
37
+ #
38
+ # @return [Array]
39
+ def read_data
40
+ temp_data = {}
41
+
42
+ Dir::foreach(@options[:input]) do |file_name|
43
+ next if ['.', '..'].include?(file_name)
44
+
45
+ File.open(@options[:input] + file_name) do |f|
46
+ temp_data[file_name.to_i] = f.readlines.each(&:strip!)
47
+ end
48
+ end
49
+
50
+ # migrationファイルの実行順に並べ替える
51
+ temp_data_list = temp_data.sort.to_h.values
52
+ temp_data_list.flatten!.select! { |row| target_data?(row) }.compact!
53
+
54
+ data_list = necessary_data(temp_data_list)
55
+
56
+ groups = Grouping.exec(data_list)
57
+ Format::Operator.exec(groups)
58
+ end
59
+
60
+ # 対象データ判定
61
+ #
62
+ # @params [String] row
63
+ # @return [Boolean]
64
+ def target_data?(row)
65
+ return true if /^t\..*|^def\s.*/.match(row)
66
+
67
+ MIGRATE_METHODS.each do |method_name|
68
+ return true if /#{method_name.to_s}\s/.match(row)
69
+ end
70
+
71
+ false
72
+ end
73
+
74
+ # 必要なデータを抽出
75
+ #
76
+ # @params [Array] data_list
77
+ # @return [Array]
78
+ def necessary_data(temp_data_list)
79
+ data_list = data_list(temp_data_list)
80
+ necessary_data_list = []
81
+ pattern = MIGRATE_METHODS.map(&:to_s).join('|')
82
+ scan_pattern = Regexp.new(".*?[#{pattern}].*")
83
+
84
+ # グルーピングしやすいように整形
85
+ data_list.each_with_index do |data, index|
86
+ pattern_match_list = data.map do |content|
87
+ scan_list = content.scan(scan_pattern)
88
+ scan_list if scan_list.any?
89
+ end.compact
90
+
91
+ # 同じファイルに複数のmigrationメソッドが記載されている場合の対応
92
+ if pattern_match_list.length > 1
93
+ sub_list = []
94
+ pattern_match_list.each do |pattern_match|
95
+ if pattern_match.first.match?(/#{pattern}/)
96
+ sub_list.push([*pattern_match])
97
+ else
98
+ sub_list.last.push(*pattern_match)
99
+ end
100
+ end
101
+
102
+ necessary_data_list.push(sub_list)
103
+ else
104
+ necessary_data_list.push(pattern_match_list)
105
+ end
106
+ end
107
+
108
+ necessary_data_list
109
+ end
110
+
111
+ def data_list(temp_data_list)
112
+ data_list = []
113
+ methods_contents_list = []
114
+
115
+ # def ごとの配列に格納
116
+ temp_data_list.each do |data|
117
+ if /^def\s.*/.match(data)
118
+ data_list.push(methods_contents_list) if methods_contents_list.any?
119
+ methods_contents_list = []
120
+ end
121
+
122
+ methods_contents_list.push(data)
123
+ end
124
+ data_list.push(methods_contents_list) if methods_contents_list.any?
125
+
126
+ # 不要データを除外
127
+ data_list.reject! { |data| data.include?('def down') }
128
+ data_list.map { |data| data.reject { |x| /^def\s.*/.match(x) } }.reject(&:empty?)
129
+ end
130
+
131
+ # 出力
132
+ #
133
+ # @params [Array] formatted_list
134
+ def output(formatted_list)
135
+ # ディレクトリ作成(なければ)
136
+ FileUtils.mkdir_p(@options[:output])
137
+
138
+ # csv作成
139
+ CSV.open("#{@options[:output]}table_definition.csv", 'w') do |csv|
140
+ formatted_list.each do |formatted_table|
141
+ formatted_table.each do |formatted_row|
142
+ csv << formatted_row
143
+ end
144
+ csv << []
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,152 @@
1
+ # カラム整形
2
+ module NickerPocker
3
+ module Format
4
+ class Detail
5
+ # フォーマット後の各データ格納列
6
+ COL_PK = 0
7
+ COL_FK = 1
8
+ COL_INDEX = 2
9
+ COL_UNIQUE = 3
10
+ COL_TYPE = 4
11
+ COL_COLUMN = 5
12
+ COL_NULL = 7
13
+ COL_LIMIT = 8
14
+ COL_DEFAULT = 9
15
+ COL_COMMENT = 10
16
+ COL_MEMO = 12
17
+
18
+ # フォーマット後のカラムデータの先頭行
19
+ ROW_COLUMN_START = 3
20
+
21
+ # 各データの格納位置
22
+ INDEX_COLUMN = 0
23
+ INDEX_TYPE = 1
24
+ INDEX_OPTIONS_START = 2
25
+
26
+ # add_column用
27
+ #
28
+ # @params [Array] method_data_list
29
+ # @params [Array] table_list
30
+ # @return [Array]
31
+ def add_column(method_data_list, table_list)
32
+ add_list = column_migrate_list(method_data_list)
33
+ index = table_list.index(table_list.last)
34
+
35
+ counter = 0
36
+ add_list.map do |additions|
37
+ counter += 1
38
+ add_row = %W(
39
+ #{nil} #{nil} #{nil} #{nil}
40
+ #{additions[:type]} #{additions[:column]} #{nil} #{additions[:null]}
41
+ #{additions[:limit]} #{additions[:default]} #{additions[:comment]}
42
+ )
43
+
44
+ { (index + counter) => add_row }
45
+ end
46
+ end
47
+
48
+ # change_column用
49
+ #
50
+ # @params [Array] method_data_list
51
+ # @params [Array] table_list
52
+ # @return [Array]
53
+ def change_column(method_data_list, table_list)
54
+ change_list = column_migrate_list(method_data_list)
55
+ column_formatted_list = table_list[ROW_COLUMN_START..]
56
+
57
+ change_list.map do |changes|
58
+ change_row = column_formatted_list.find { |row| row[COL_COLUMN] == changes[:column] }
59
+ target_index = column_formatted_list.index(change_row) + ROW_COLUMN_START
60
+ change_row[COL_TYPE] = changes[:type]
61
+ change_row[COL_NULL] = changes[:null] || change_row[COL_NULL]
62
+ change_row[COL_LIMIT] = changes[:limit] || change_row[COL_LIMIT]
63
+ change_row[COL_DEFAULT] = changes[:default] || change_row[COL_DEFAULT]
64
+ change_row[COL_COMMENT] = changes[:comment] || change_row[COL_COMMENT]
65
+
66
+ { target_index => change_row }
67
+ end
68
+ end
69
+
70
+ # add_index用
71
+ #
72
+ # @params [Array] method_data_list
73
+ # @params [Array] table_list
74
+ # @return [Array]
75
+ def add_index(method_data_list, table_list)
76
+ column_formatted_list = table_list[ROW_COLUMN_START..]
77
+ change_list = []
78
+
79
+ method_data_list.each do |method_data|
80
+ index_column_list = [method_data.first]
81
+ option_list = method_data[1..]
82
+
83
+ if index_column_list.first.match(/^\[/)
84
+ index_end = method_data.index { |x| x.match(/\]/) }
85
+ index_column_list = method_data[..index_end]
86
+ option_list = method_data[index_end + 1..]
87
+ end
88
+
89
+ index_column_list.each do |index_column|
90
+ column_formatted_list.each_with_index do |column_formatted_data, index|
91
+ next unless index_column.include?(column_formatted_data[COL_COLUMN])
92
+
93
+ column_formatted_data[COL_INDEX] = '*'
94
+
95
+ if option_list.any?
96
+ if option_list.find { |option| option.match(/^unique/) }&.match(/true/i)
97
+ column_formatted_data[COL_UNIQUE] = '*'
98
+ end
99
+
100
+ column_formatted_data[COL_MEMO] = option_list.find { |option| option.match(/^name/) }&.gsub(/^name|\s|:|"/, '')
101
+ end
102
+
103
+ change_list.push({ (index + ROW_COLUMN_START) => column_formatted_data })
104
+ break
105
+ end
106
+ end
107
+ end
108
+
109
+ change_list
110
+ end
111
+
112
+ # remove_column用
113
+ #
114
+ # @params [Array] method_data_list
115
+ # @params [Array] table_list
116
+ # @return [Array]
117
+ def remove_column(method_data_list, table_list)
118
+ remove_column_list = method_data_list.map { |method_data| method_data[INDEX_COLUMN] }
119
+ column_formatted_list = table_list[ROW_COLUMN_START..]
120
+
121
+ column_formatted_list.map.with_index do |column_formatted_data, index|
122
+ if remove_column_list.include?(column_formatted_data[COL_COLUMN])
123
+ { (index + ROW_COLUMN_START) => nil }
124
+ end
125
+ end.compact
126
+ end
127
+
128
+ private
129
+
130
+ def column_migrate_list(method_data_list)
131
+ method_data_list.map do |method_data|
132
+ migrates = {}
133
+
134
+ migrates[:column] = method_data[INDEX_COLUMN]
135
+ migrates[:type] = method_data[INDEX_TYPE]
136
+
137
+ option_list = method_data[INDEX_OPTIONS_START..]
138
+ unless option_list
139
+ migrates
140
+ next
141
+ end
142
+
143
+ migrates[:null] = option_list.find { |option| option.match(/^null/) }&.match(/true|false/i)
144
+ migrates[:limit] = option_list.find { |option| option.match(/^limit/) }&.gsub(/[^\d]/, '')
145
+ migrates[:default] = option_list.find { |option| option.match(/^default/) }&.gsub(/^default:|\s/, '')
146
+ migrates[:comment] = option_list.find { |option| option.match(/^comment/) }&.gsub(/^comment:|\s/, '')
147
+ migrates
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,88 @@
1
+ # フォーマッタ
2
+ module NickerPocker
3
+ module Format
4
+ class Operator
5
+ PROTOTYPE_METHODS = %i(
6
+ rename_table
7
+ drop_table
8
+ rename_column
9
+ create_table
10
+ ).freeze
11
+
12
+ DETAIL_METHODS = %i(
13
+ add_column
14
+ change_column
15
+ add_index
16
+ remove_column
17
+ ).freeze
18
+
19
+ class << self
20
+ def exec(groups, options = {})
21
+ new(options).run(groups)
22
+ end
23
+ end
24
+
25
+ # options[:target_format]
26
+ def initialize(options)
27
+ @options = options
28
+ end
29
+
30
+ # 実行
31
+ #
32
+ # @params [Hash] groups
33
+ # @return [Array]
34
+ def run(groups)
35
+ return [] if groups.length == 0
36
+
37
+ # 各関数の処理をする
38
+ formatted_list(groups)
39
+ end
40
+
41
+ private
42
+
43
+ # 整形した配列を返す
44
+ #
45
+ # @params [Hash] groups
46
+ # @return [Array]
47
+ def formatted_list(groups)
48
+ prototype_formatter = Prototype.new
49
+
50
+ # 定義書の原型をつくる
51
+ table_groups = prototype_formatter.format_groups(groups)
52
+ table_list = prototype_formatter.table_list(table_groups)
53
+
54
+ # カラム整形
55
+ format_column(table_groups, table_list)
56
+ end
57
+
58
+ # 整形したカラムを返す
59
+ #
60
+ # @params [Hash] table_groups
61
+ # @params [Array] table_list
62
+ # @return [Array]
63
+ def format_column(table_groups, table_list)
64
+ detail_formatter = Detail.new
65
+
66
+ table_groups.map do |table_data|
67
+ target_table_list = table_list.find { |table| table[1].first == table_data.first }
68
+
69
+ DETAIL_METHODS.each do |method_name|
70
+ method_data = table_data[1][method_name]
71
+ next unless method_data
72
+
73
+ change_content_list =
74
+ detail_formatter.send(method_name, method_data, target_table_list)
75
+
76
+ change_content_list.each do |change_contents|
77
+ index = change_contents.keys.first
78
+ value = change_contents.values.first
79
+
80
+ target_table_list[index] = value
81
+ end
82
+ end
83
+ target_table_list.compact
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,242 @@
1
+ # 定義書の原型をつくる
2
+ module NickerPocker
3
+ module Format
4
+ class Prototype
5
+ TABLE_HEADER_LIST = %W(
6
+ table_name
7
+ #{nil}
8
+ #{nil}
9
+ table_name(jp)
10
+ #{nil}
11
+ #{nil}
12
+ created_by
13
+ created_date
14
+ updated_by
15
+ updated_date
16
+ table_memo
17
+ ).freeze
18
+
19
+ COLMN_HEADER_LIST = %W(
20
+ PK
21
+ FK
22
+ index
23
+ unique
24
+ type
25
+ column_name
26
+ #{nil}
27
+ null
28
+ limit
29
+ default
30
+ column_name(jp)
31
+ #{nil}
32
+ column_memo
33
+ ).freeze
34
+
35
+ # グループ整形
36
+ #
37
+ # @params [Hash] groups
38
+ # @return [Hash]
39
+ def format_groups(groups)
40
+ return [] if groups.length == 0
41
+
42
+ # リネームテーブル処理
43
+ renamed_groups = rename_table(groups)
44
+
45
+ # テーブル削除処理
46
+ dropped_groups = drop_table(renamed_groups)
47
+
48
+ # リネームカラム処理
49
+ rename_column(dropped_groups)
50
+ end
51
+
52
+ # テーブル作成用配列
53
+ #
54
+ # @params [Hash] groups
55
+ # @return [Hash]
56
+ def table_list(table_groups)
57
+ table_groups.map { |table_data| create_table_format(table_data) }
58
+ end
59
+
60
+ private
61
+
62
+ # テーブルリネーム処理
63
+ #
64
+ # @params [Hash] groups
65
+ # @return [Hash]
66
+ def rename_table(groups)
67
+ temp_list =
68
+ groups.map do |table_data|
69
+ if table_data[1][:rename_table]
70
+ new_table_name = table_data[1][:rename_table].first.first.to_sym
71
+ [table_data[0], new_table_name]
72
+ end
73
+ end.compact
74
+
75
+ temp_list.each do |rename_table|
76
+ old_val = groups[rename_table[1]]
77
+ # リネーム後のテーブル名に対するmigrateの有無
78
+ if old_val
79
+ groups[rename_table[1]] =
80
+ old_val.merge(groups.delete(rename_table[0])) { |key, old_v, new_v| old_v + new_v }
81
+ else
82
+ groups[rename_table[1]] = groups.delete(rename_table[0])
83
+ end
84
+ end
85
+
86
+ groups
87
+ end
88
+
89
+ # テーブル削除処理
90
+ #
91
+ # @params [Hash] groups
92
+ # @return [Hash]
93
+ def drop_table(groups)
94
+ # 削除対象tableリスト
95
+ drop_table_list = []
96
+ groups.each do |table_data|
97
+ next unless table_data[1][:drop_table]
98
+ drop_table_list.push(table_data[0])
99
+ end
100
+
101
+ return groups if drop_table_list.empty?
102
+
103
+ drop_table_list.each do |drop_table_name|
104
+ groups.delete(drop_table_name)
105
+ end
106
+
107
+ groups
108
+ end
109
+
110
+ # rename_column用
111
+ #
112
+ # @params [Hash] table_groups
113
+ # @return [Hash]
114
+ def rename_column(table_groups)
115
+ rename_target_list = rename_target_list(table_groups)
116
+ return table_groups if rename_target_list.empty?
117
+
118
+ rename_target_list.each do |rename_target|
119
+ table_name = rename_target.keys.first
120
+ rename_val_list = rename_target.values.first
121
+
122
+ rename_targets = table_groups.delete(table_name)
123
+
124
+ key_arr = rename_targets.keys
125
+ values_arr = rename_targets.values
126
+
127
+ rename_val_list.each do |rename_val|
128
+ old_name = rename_val[0]
129
+
130
+ new_name = rename_val[1]
131
+ values_arr = values_arr.map do |val_arr|
132
+ val_arr.map { |val|
133
+ val.map { |v|
134
+ if /^#{old_name}$/.match?(v)
135
+ next v.gsub(/^#{old_name}$/, new_name)
136
+ end
137
+ v.gsub(/:#{old_name}$/, ":#{new_name}")
138
+ }
139
+ }
140
+ end
141
+ end
142
+ table_datas = {}
143
+ renamed_targets = [key_arr, values_arr].transpose.to_h
144
+ table_datas[table_name] = renamed_targets
145
+ table_groups.update(table_datas)
146
+ end
147
+
148
+ table_groups
149
+ end
150
+
151
+ # リネーム対象を返す
152
+ #
153
+ # @params [Hash]
154
+ # @return [Array]
155
+ def rename_target_list(table_groups)
156
+ table_groups.map do |table_group|
157
+ rename_list = table_group[1][:rename_column]
158
+ next unless rename_list
159
+
160
+ { table_group[0] => rename_list }
161
+ end.compact
162
+ end
163
+
164
+ # テーブル作成用に整形した配列を返す
165
+ #
166
+ # @params [Array] table_data
167
+ # @return [Array]
168
+ def create_table_format(table_data)
169
+ formatted_table_list = []
170
+
171
+ # テーブル情報
172
+ formatted_table_list.push(TABLE_HEADER_LIST)
173
+ formatted_table_list.push([table_data[0]])
174
+
175
+ # カラムヘッダー追加
176
+ formatted_table_list.push(COLMN_HEADER_LIST)
177
+
178
+ methods = table_data[1]
179
+ columns_list = methods[:create_table].join.split(/t\./).reject(&:empty?)
180
+ formatted_column_list = create_table(columns_list)
181
+
182
+ formatted_table_list.push(*formatted_column_list)
183
+ end
184
+
185
+ # テーブル作成処理
186
+ #
187
+ # @params [Array] columns_list
188
+ # @return [Array]
189
+ def create_table(columns_list)
190
+ result_list = []
191
+
192
+ # Pキー追加
193
+ result_list.push(%W(* #{nil} #{nil} #{nil} integer id #{nil} false #{nil} #{nil} ID))
194
+
195
+ columns_list.each do |column|
196
+ column_data_list = column.split(/\s|,|=>/)
197
+ column_data_list.delete('')
198
+
199
+ type = column_data_list[0]
200
+
201
+ if type == 'timestamps'
202
+ timestamps_list = timestamps(column_data_list[1..])
203
+ result_list.push(*timestamps_list)
204
+ next
205
+ end
206
+
207
+ name = column_data_list[1]&.sub(/^:/, '')
208
+ null, limit, default, comment = constraints(column_data_list[2..])
209
+
210
+ result_list.push(%W(#{nil} #{nil} #{nil} #{nil} #{type} #{name} #{nil} #{null} #{limit} #{default} #{comment}))
211
+ end
212
+
213
+ result_list
214
+ end
215
+
216
+ # 作成・更新日時カラム追加処理
217
+ #
218
+ # @params [Array] timestamps_left_list
219
+ # @return [Array]
220
+ def timestamps(timestamps_left_list)
221
+ timestamps_list = []
222
+
223
+ null, limit, default, comment = constraints(timestamps_left_list)
224
+
225
+ timestamps_list.push(%W(#{nil} #{nil} #{nil} #{nil} timestamp created_at #{nil} #{null} #{limit} #{default} #{comment}))
226
+ timestamps_list.push(%W(#{nil} #{nil} #{nil} #{nil} timestamp updated_at #{nil} #{null} #{limit} #{default} #{comment}))
227
+ end
228
+
229
+ # 各制約
230
+ #
231
+ # @params [Array] left_list
232
+ def constraints(left_list)
233
+ return if left_list.nil? || left_list.empty?
234
+
235
+ temp_constraint_list = left_list.map { |column_data| column_data.gsub(/:|'/, '') }
236
+ constraints = temp_constraint_list.each_slice(2).to_h
237
+
238
+ %W(#{constraints['null']} #{constraints['limit']} #{constraints['default']} #{constraints['comment']})
239
+ end
240
+ end
241
+ end
242
+ end
@@ -0,0 +1,82 @@
1
+ # テーブルごとにグループ化
2
+ module NickerPocker
3
+ class Grouping
4
+ class << self
5
+ def exec(data_list, options = {})
6
+ new(options).run(data_list)
7
+ end
8
+ end
9
+
10
+ # options[:target_tables]
11
+ # options[:target_files]
12
+ def initialize(options)
13
+ @options = options
14
+ end
15
+
16
+ # 実行
17
+ #
18
+ # @params [Array] data_list
19
+ # @return [Hash]
20
+ def run(data_list)
21
+ return {} if data_list.length == 0
22
+
23
+ # テーブルごとにまとめる
24
+ grouping(data_list)
25
+ end
26
+
27
+ private
28
+
29
+ # テーブルごと・メソッドごとにグルーピング
30
+ #
31
+ # @params [Array] data_list
32
+ # @return [Hash]
33
+ def grouping(data_list)
34
+ temp_group_list = data_list.map { |data| data.map { |row| format_raw_data(row) } }.flatten
35
+
36
+ groups = {}
37
+ temp_group_list.each do |temp_group|
38
+ table_name = temp_group.first.first
39
+ methods = temp_group.first[1]
40
+ method_name = methods.keys.first
41
+
42
+ groups[table_name] = {} unless groups[table_name]
43
+ groups[table_name][method_name] = [] unless groups[table_name][method_name]
44
+
45
+ groups[table_name][method_name].push(methods.values.first)
46
+ end
47
+
48
+ # 出力対象を絞る
49
+ groups.each { |group| group.delete(group[0]) }
50
+ groups
51
+ end
52
+
53
+ # データを整形
54
+ def format_raw_data(data)
55
+ # メソッド・対象テーブルを取得
56
+ tables = {}
57
+ methods = {}
58
+
59
+ target_method = target_method(data.first).to_sym
60
+ return unless target_method
61
+
62
+ method_row = data.first.split(/,/)
63
+ table_name = method_row[0].split(/\s/)[1].sub(/^:/, '').to_sym
64
+
65
+ method_contents = data.length > 1 ? data[1..] : method_row[1..]
66
+ method_contents = method_contents.map { |content| content.strip.sub(/^:/, '') }.reject(&:empty?)
67
+
68
+ methods[target_method] = method_contents
69
+
70
+ tables[table_name] = methods
71
+ tables
72
+ end
73
+
74
+ def target_method(str)
75
+ MIGRATE_METHODS.each do |method_name|
76
+ return method_name if /#{method_name.to_s}/.match(str)
77
+ end
78
+
79
+ return
80
+ end
81
+ end
82
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NickerPocker
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/nicker_pocker.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
-
3
- require_relative "nicker_pocker/version"
2
+ require_relative 'nicker_pocker/format/operator'
3
+ require_relative 'nicker_pocker/format/prototype'
4
+ require_relative 'nicker_pocker/format/detail'
5
+ require_relative 'nicker_pocker/command'
6
+ require_relative 'nicker_pocker/grouping'
4
7
 
5
8
  module NickerPocker
6
9
  class Error < StandardError; end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nicker_pocker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ms919
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-15 00:00:00.000000000 Z
11
+ date: 2023-06-10 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -21,10 +21,16 @@ files:
21
21
  - ".rubocop.yml"
22
22
  - CHANGELOG.md
23
23
  - Gemfile
24
+ - Gemfile.lock
24
25
  - LICENSE.txt
25
26
  - README.md
26
27
  - Rakefile
27
28
  - lib/nicker_pocker.rb
29
+ - lib/nicker_pocker/command.rb
30
+ - lib/nicker_pocker/format/detail.rb
31
+ - lib/nicker_pocker/format/operator.rb
32
+ - lib/nicker_pocker/format/prototype.rb
33
+ - lib/nicker_pocker/grouping.rb
28
34
  - lib/nicker_pocker/version.rb
29
35
  - nicker_pocker.gemspec
30
36
  - sig/nicker_pocker.rbs