anbt-sql-formatter 0.0.6 → 0.0.7
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/CHANGELOG.md +10 -0
- data/bin/anbt-sql-formatter +2 -8
- data/lib/anbt-sql-formatter/formatter.rb +36 -29
- data/lib/anbt-sql-formatter/in_values_checker.rb +32 -0
- data/lib/anbt-sql-formatter/rule.rb +14 -5
- data/lib/anbt-sql-formatter/version.rb +1 -1
- data/test/test_in_values.rb +193 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4680b59adee7c6d2e6bcb649d73b095d3bbcd3d102f8517d50acefc89dfe089
|
4
|
+
data.tar.gz: dac35873e1d94941ec19156d2738fe75c1b0e156e2357cc1a10e263157c253c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52692fbb602a719f52a13077bd72b7a4c8d065ba484c6fbd141f928ad3987364dd3517c6fd7d66f9283acee8ecf8fd7033d2df467ffe6a5e0aa4f9e401b7cc6d
|
7
|
+
data.tar.gz: dcc161a7b754fd3937dfa8c799950aba2ea88a1db9990f38fb4e51ff6cb69e6c07ce619bd4843dba358e93f31d3787ba231ca076fbbdcd0216b224628f802b18
|
data/CHANGELOG.md
CHANGED
data/bin/anbt-sql-formatter
CHANGED
@@ -5,13 +5,8 @@ begin
|
|
5
5
|
require "anbt-sql-formatter/formatter"
|
6
6
|
rescue LoadError
|
7
7
|
$LOAD_PATH << File.expand_path(
|
8
|
-
|
9
|
-
|
10
|
-
"..",
|
11
|
-
"..",
|
12
|
-
"lib"
|
13
|
-
)
|
14
|
-
)
|
8
|
+
File.join(__FILE__, "..", "..", "lib")
|
9
|
+
)
|
15
10
|
require "anbt-sql-formatter/formatter"
|
16
11
|
end
|
17
12
|
|
@@ -36,7 +31,6 @@ def main
|
|
36
31
|
rule.function_names << func_name.upcase
|
37
32
|
}
|
38
33
|
|
39
|
-
#rule.indentString = "('-')"
|
40
34
|
rule.indent_string = " "
|
41
35
|
|
42
36
|
formatter = AnbtSql::Formatter.new(rule)
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require "anbt-sql-formatter/rule"
|
4
4
|
require "anbt-sql-formatter/parser"
|
5
5
|
require "anbt-sql-formatter/exception"
|
6
|
+
require "anbt-sql-formatter/in_values_checker"
|
6
7
|
require "anbt-sql-formatter/helper" # Stack
|
7
8
|
|
8
9
|
|
@@ -16,7 +17,7 @@ class AnbtSql
|
|
16
17
|
def initialize(rule)
|
17
18
|
@rule = rule
|
18
19
|
@parser = AnbtSql::Parser.new(@rule)
|
19
|
-
|
20
|
+
|
20
21
|
# 丸カッコが関数のものかどうかを記憶
|
21
22
|
@function_bracket = Stack.new
|
22
23
|
end
|
@@ -52,7 +53,7 @@ class AnbtSql
|
|
52
53
|
if sql_str.end_with?("\n")
|
53
54
|
is_sql_ends_with_new_line = true
|
54
55
|
end
|
55
|
-
|
56
|
+
|
56
57
|
tokens = @parser.parse(sql_str)
|
57
58
|
|
58
59
|
statements = split_to_statements(tokens)
|
@@ -74,12 +75,12 @@ class AnbtSql
|
|
74
75
|
end
|
75
76
|
end
|
76
77
|
|
77
|
-
|
78
|
+
|
78
79
|
def modify_keyword_case(tokens)
|
79
80
|
# SQLキーワードは大文字とする。or ...
|
80
81
|
tokens.each{ |token|
|
81
82
|
next if token._type != AnbtSql::TokenConstants::KEYWORD
|
82
|
-
|
83
|
+
|
83
84
|
case @rule.keyword
|
84
85
|
when AnbtSql::Rule::KEYWORD_NONE
|
85
86
|
;
|
@@ -91,7 +92,7 @@ class AnbtSql
|
|
91
92
|
}
|
92
93
|
end
|
93
94
|
|
94
|
-
|
95
|
+
|
95
96
|
##
|
96
97
|
# .
|
97
98
|
# ["(", "+", ")"] => ["(+)"]
|
@@ -101,7 +102,7 @@ class AnbtSql
|
|
101
102
|
while index < tokens.size - 2
|
102
103
|
if (tokens[index ].string == "(" &&
|
103
104
|
tokens[index + 1].string == "+" &&
|
104
|
-
tokens[index + 2].string == ")")
|
105
|
+
tokens[index + 2].string == ")")
|
105
106
|
tokens[index].string = "(+)"
|
106
107
|
ArrayUtil.remove(tokens, index + 1)
|
107
108
|
ArrayUtil.remove(tokens, index + 1)
|
@@ -142,21 +143,21 @@ class AnbtSql
|
|
142
143
|
token = ArrayUtil.get(tokens, index )
|
143
144
|
|
144
145
|
if (prev._type != AnbtSql::TokenConstants::SPACE &&
|
145
|
-
token._type != AnbtSql::TokenConstants::SPACE)
|
146
|
+
token._type != AnbtSql::TokenConstants::SPACE)
|
146
147
|
# カンマの後にはスペース入れない
|
147
148
|
if not @rule.space_after_comma
|
148
149
|
if prev.string == ","
|
149
150
|
index += 1 ; next
|
150
151
|
end
|
151
152
|
end
|
152
|
-
|
153
|
+
|
153
154
|
# 関数名の後ろにはスペースは入れない
|
154
155
|
# no space after function name
|
155
156
|
if (@rule.function?(prev.string) &&
|
156
157
|
token.string == "(")
|
157
158
|
index += 1 ; next
|
158
159
|
end
|
159
|
-
|
160
|
+
|
160
161
|
ArrayUtil.add(tokens, index,
|
161
162
|
AnbtSql::Token.new(AnbtSql::TokenConstants::SPACE, " ")
|
162
163
|
)
|
@@ -164,8 +165,8 @@ class AnbtSql
|
|
164
165
|
index += 1
|
165
166
|
end
|
166
167
|
end
|
167
|
-
|
168
|
-
|
168
|
+
|
169
|
+
|
169
170
|
def format_list_main_loop(tokens)
|
170
171
|
# インデントを整える。
|
171
172
|
indent = 0
|
@@ -176,13 +177,14 @@ class AnbtSql
|
|
176
177
|
" ")
|
177
178
|
|
178
179
|
encounter_between = false
|
180
|
+
in_values_checker = nil
|
179
181
|
|
180
182
|
index = 0
|
181
183
|
# Length of tokens changes in loop!
|
182
184
|
while index < tokens.size
|
183
185
|
token = ArrayUtil.get(tokens, index)
|
184
|
-
|
185
|
-
if token._type == AnbtSql::TokenConstants::SYMBOL
|
186
|
+
|
187
|
+
if token._type == AnbtSql::TokenConstants::SYMBOL
|
186
188
|
|
187
189
|
# indentを1つ増やし、'('のあとで改行。
|
188
190
|
if token.string == "("
|
@@ -196,18 +198,23 @@ class AnbtSql
|
|
196
198
|
indent = (bracket_indent.pop()).to_i
|
197
199
|
index += insert_return_and_indent(tokens, index, indent)
|
198
200
|
@function_bracket.pop()
|
199
|
-
|
201
|
+
|
200
202
|
# ','の前で改行
|
201
203
|
elsif token.string == ","
|
202
|
-
|
204
|
+
if in_values_checker.nil? || in_values_checker.check()
|
205
|
+
index += insert_return_and_indent(tokens, index, indent, "x")
|
206
|
+
end
|
203
207
|
|
204
208
|
elsif token.string == ";"
|
205
209
|
# 2005.07.26 Tosiki Iga とりあえずセミコロンでSQL文がつぶれないように改良
|
206
210
|
indent = 0
|
207
211
|
index += insert_return_and_indent(tokens, index, indent)
|
208
212
|
end
|
209
|
-
|
210
|
-
elsif token._type == AnbtSql::TokenConstants::KEYWORD
|
213
|
+
|
214
|
+
elsif token._type == AnbtSql::TokenConstants::KEYWORD
|
215
|
+
in_values_checker = nil if in_values_checker
|
216
|
+
|
217
|
+
in_values_checker = AnbtSql::InValuesChecker.new(@rule) if equals_ignore_case(token.string, "IN")
|
211
218
|
|
212
219
|
# indentを2つ増やし、キーワードの後ろで改行
|
213
220
|
if (equals_ignore_case(token.string, "DELETE") ||
|
@@ -254,7 +261,7 @@ class AnbtSql
|
|
254
261
|
# キーワードの前で改行。indentを強制的に0にする。
|
255
262
|
if (equals_ignore_case(token.string, "UNION" ) ||
|
256
263
|
equals_ignore_case(token.string, "INTERSECT") ||
|
257
|
-
equals_ignore_case(token.string, "EXCEPT" ) )
|
264
|
+
equals_ignore_case(token.string, "EXCEPT" ) )
|
258
265
|
indent -= 2
|
259
266
|
index += insert_return_and_indent(tokens, index , indent)
|
260
267
|
index += insert_return_and_indent(tokens, index + 1, indent)
|
@@ -272,7 +279,7 @@ class AnbtSql
|
|
272
279
|
encounter_between = false
|
273
280
|
end
|
274
281
|
|
275
|
-
elsif (token._type == AnbtSql::TokenConstants::COMMENT)
|
282
|
+
elsif (token._type == AnbtSql::TokenConstants::COMMENT)
|
276
283
|
|
277
284
|
if token.string.start_with?("/*")
|
278
285
|
# マルチラインコメントの後に改行を入れる。
|
@@ -282,12 +289,12 @@ class AnbtSql
|
|
282
289
|
end
|
283
290
|
end
|
284
291
|
prev = token
|
285
|
-
|
292
|
+
|
286
293
|
index += 1
|
287
294
|
end
|
288
295
|
end
|
289
|
-
|
290
|
-
|
296
|
+
|
297
|
+
|
291
298
|
# before: [..., "(", space, "X", space, ")", ...]
|
292
299
|
# after: [..., "(X)", ...]
|
293
300
|
# ただし、これでは "(X)" という一つの symbol トークンになってしまう。
|
@@ -295,7 +302,7 @@ class AnbtSql
|
|
295
302
|
# せっかくなので symbol/X/symbol と分けたい。
|
296
303
|
def special_treatment_for_parenthesis_with_one_element(tokens)
|
297
304
|
(tokens.size - 1).downto(4).each{|index|
|
298
|
-
next if (index >= tokens.size())
|
305
|
+
next if (index >= tokens.size())
|
299
306
|
|
300
307
|
t0 = ArrayUtil.get(tokens, index )
|
301
308
|
t1 = ArrayUtil.get(tokens, index - 1)
|
@@ -305,7 +312,7 @@ class AnbtSql
|
|
305
312
|
|
306
313
|
if (equals_ignore_case(t4.string , "(") &&
|
307
314
|
equals_ignore_case(t3.string.strip, "" ) &&
|
308
|
-
equals_ignore_case(t1.string.strip, "" ) &&
|
315
|
+
equals_ignore_case(t1.string.strip, "" ) &&
|
309
316
|
equals_ignore_case(t0.string , ")") )
|
310
317
|
t4.string = t4.string + t2.string + t0.string
|
311
318
|
ArrayUtil.remove(tokens, index )
|
@@ -316,7 +323,7 @@ class AnbtSql
|
|
316
323
|
}
|
317
324
|
end
|
318
325
|
|
319
|
-
|
326
|
+
|
320
327
|
def format_list(tokens)
|
321
328
|
return [] if tokens.empty?
|
322
329
|
|
@@ -328,7 +335,7 @@ class AnbtSql
|
|
328
335
|
ArrayUtil.remove(tokens, 0)
|
329
336
|
end
|
330
337
|
return [] if tokens.empty?
|
331
|
-
|
338
|
+
|
332
339
|
token = ArrayUtil.get(tokens, tokens.size() - 1)
|
333
340
|
if token._type == AnbtSql::TokenConstants::SPACE
|
334
341
|
ArrayUtil.remove(tokens, tokens.size() - 1)
|
@@ -357,11 +364,11 @@ class AnbtSql
|
|
357
364
|
# 関数内では改行は挿入しない
|
358
365
|
# No linefeed in function.
|
359
366
|
return 0 if (@function_bracket.include?(true))
|
360
|
-
|
367
|
+
|
361
368
|
begin
|
362
369
|
# 挿入する文字列を作成する。
|
363
370
|
s = "\n"
|
364
|
-
|
371
|
+
|
365
372
|
# インデントをつける。
|
366
373
|
indent = 0 if indent < 0 ## Java版と異なる
|
367
374
|
s += @rule.indent_string * indent
|
@@ -397,6 +404,6 @@ class AnbtSql
|
|
397
404
|
rescue => e
|
398
405
|
raise e
|
399
406
|
end
|
400
|
-
end
|
407
|
+
end
|
401
408
|
end
|
402
409
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class AnbtSql
|
2
|
+
class InValuesChecker
|
3
|
+
def initialize(rule)
|
4
|
+
if rule.in_values_num.nil?
|
5
|
+
@mode = :default
|
6
|
+
elsif rule.in_values_num == AnbtSql::Rule::ONELINE_IN_VALUES_NUM
|
7
|
+
@mode = :oneline
|
8
|
+
@num = rule.in_values_num
|
9
|
+
else
|
10
|
+
@mode = :compact
|
11
|
+
@num = rule.in_values_num
|
12
|
+
@counter = 0
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def check
|
17
|
+
if @mode == :default
|
18
|
+
true
|
19
|
+
elsif @mode == :oneline
|
20
|
+
false
|
21
|
+
else
|
22
|
+
@counter += 1
|
23
|
+
if @counter == @num
|
24
|
+
@counter = 0
|
25
|
+
true
|
26
|
+
else
|
27
|
+
false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -32,15 +32,24 @@ class AnbtSql
|
|
32
32
|
attr_accessor :kw_nl_x
|
33
33
|
attr_accessor :kw_nl_x_plus1_indent
|
34
34
|
|
35
|
+
# Limit number of values per line in IN clause to this value.
|
36
|
+
#
|
37
|
+
# nil:: one value per line (default)
|
38
|
+
# n (>=2):: n values per line
|
39
|
+
# ONELINE_IN_VALUES_NUM:: all values in one line
|
40
|
+
attr_accessor :in_values_num
|
41
|
+
|
35
42
|
# キーワードの変換規則: 何もしない
|
36
43
|
KEYWORD_NONE = 0
|
37
44
|
|
38
45
|
# キーワードの変換規則: 大文字にする
|
39
46
|
KEYWORD_UPPER_CASE = 1
|
40
|
-
|
47
|
+
|
41
48
|
# キーワードの変換規則: 小文字にする
|
42
49
|
KEYWORD_LOWER_CASE = 2
|
43
50
|
|
51
|
+
# IN の値を一行表示する場合の in_values_num 値
|
52
|
+
ONELINE_IN_VALUES_NUM = 0
|
44
53
|
|
45
54
|
def initialize
|
46
55
|
# キーワードの変換規則.
|
@@ -51,7 +60,7 @@ class AnbtSql
|
|
51
60
|
@indent_string = " "
|
52
61
|
|
53
62
|
@space_after_comma = false
|
54
|
-
|
63
|
+
|
55
64
|
# __foo
|
56
65
|
# ____KW
|
57
66
|
@kw_plus1_indent_x_nl = %w(INSERT INTO CREATE DROP TRUNCATE TABLE CASE)
|
@@ -65,12 +74,12 @@ class AnbtSql
|
|
65
74
|
# __foo
|
66
75
|
# ____KW
|
67
76
|
@kw_nl_x_plus1_indent = %w(ON USING)
|
68
|
-
|
77
|
+
|
69
78
|
# __foo
|
70
79
|
# __KW
|
71
80
|
@kw_nl_x = %w(OR THEN ELSE)
|
72
81
|
# @kw_nl_x = %w(OR WHEN ELSE)
|
73
|
-
|
82
|
+
|
74
83
|
@kw_multi_words = ["ORDER BY", "GROUP BY"]
|
75
84
|
|
76
85
|
# 関数の名前。
|
@@ -117,7 +126,7 @@ class AnbtSql
|
|
117
126
|
return true
|
118
127
|
end
|
119
128
|
end
|
120
|
-
|
129
|
+
|
121
130
|
return false
|
122
131
|
end
|
123
132
|
end
|
@@ -0,0 +1,193 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), "helper")
|
4
|
+
|
5
|
+
require "anbt-sql-formatter/formatter"
|
6
|
+
|
7
|
+
class TestAnbtSqlInValues < Test::Unit::TestCase
|
8
|
+
def test_format_without_in_values_num
|
9
|
+
rule = base_rule
|
10
|
+
@fmt = AnbtSql::Formatter.new(rule)
|
11
|
+
msg = "without in_values_num setting"
|
12
|
+
sql = "select * from users where id in (" + (1...30).to_a.join(",") + ")"
|
13
|
+
expected = <<EOS
|
14
|
+
SELECT
|
15
|
+
*
|
16
|
+
FROM
|
17
|
+
users
|
18
|
+
WHERE
|
19
|
+
id IN (
|
20
|
+
1
|
21
|
+
,2
|
22
|
+
,3
|
23
|
+
,4
|
24
|
+
,5
|
25
|
+
,6
|
26
|
+
,7
|
27
|
+
,8
|
28
|
+
,9
|
29
|
+
,10
|
30
|
+
,11
|
31
|
+
,12
|
32
|
+
,13
|
33
|
+
,14
|
34
|
+
,15
|
35
|
+
,16
|
36
|
+
,17
|
37
|
+
,18
|
38
|
+
,19
|
39
|
+
,20
|
40
|
+
,21
|
41
|
+
,22
|
42
|
+
,23
|
43
|
+
,24
|
44
|
+
,25
|
45
|
+
,26
|
46
|
+
,27
|
47
|
+
,28
|
48
|
+
,29
|
49
|
+
)
|
50
|
+
EOS
|
51
|
+
|
52
|
+
assert_equals(msg, expected.strip, @fmt.format(sql))
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_format_num_in_values
|
56
|
+
rule = base_rule
|
57
|
+
rule.in_values_num = 10
|
58
|
+
@fmt = AnbtSql::Formatter.new(rule)
|
59
|
+
msg = "num in values"
|
60
|
+
sql = "select * from users where id in (" + (1...100).to_a.join(",") + ")"
|
61
|
+
expected = <<EOS
|
62
|
+
SELECT
|
63
|
+
*
|
64
|
+
FROM
|
65
|
+
users
|
66
|
+
WHERE
|
67
|
+
id IN (
|
68
|
+
1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10
|
69
|
+
,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20
|
70
|
+
,21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30
|
71
|
+
,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40
|
72
|
+
,41 ,42 ,43 ,44 ,45 ,46 ,47 ,48 ,49 ,50
|
73
|
+
,51 ,52 ,53 ,54 ,55 ,56 ,57 ,58 ,59 ,60
|
74
|
+
,61 ,62 ,63 ,64 ,65 ,66 ,67 ,68 ,69 ,70
|
75
|
+
,71 ,72 ,73 ,74 ,75 ,76 ,77 ,78 ,79 ,80
|
76
|
+
,81 ,82 ,83 ,84 ,85 ,86 ,87 ,88 ,89 ,90
|
77
|
+
,91 ,92 ,93 ,94 ,95 ,96 ,97 ,98 ,99
|
78
|
+
)
|
79
|
+
EOS
|
80
|
+
|
81
|
+
assert_equals(msg, expected.strip, @fmt.format(sql))
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_format_str_in_values
|
85
|
+
rule = base_rule
|
86
|
+
rule.in_values_num = 10
|
87
|
+
@fmt = AnbtSql::Formatter.new(rule)
|
88
|
+
msg = "str in values"
|
89
|
+
sql = "select * from users where id in (" + (1...100).map { |i| "'#{i}'" }.join(",") + ")"
|
90
|
+
expected = <<EOS
|
91
|
+
SELECT
|
92
|
+
*
|
93
|
+
FROM
|
94
|
+
users
|
95
|
+
WHERE
|
96
|
+
id IN (
|
97
|
+
'1' ,'2' ,'3' ,'4' ,'5' ,'6' ,'7' ,'8' ,'9' ,'10'
|
98
|
+
,'11' ,'12' ,'13' ,'14' ,'15' ,'16' ,'17' ,'18' ,'19' ,'20'
|
99
|
+
,'21' ,'22' ,'23' ,'24' ,'25' ,'26' ,'27' ,'28' ,'29' ,'30'
|
100
|
+
,'31' ,'32' ,'33' ,'34' ,'35' ,'36' ,'37' ,'38' ,'39' ,'40'
|
101
|
+
,'41' ,'42' ,'43' ,'44' ,'45' ,'46' ,'47' ,'48' ,'49' ,'50'
|
102
|
+
,'51' ,'52' ,'53' ,'54' ,'55' ,'56' ,'57' ,'58' ,'59' ,'60'
|
103
|
+
,'61' ,'62' ,'63' ,'64' ,'65' ,'66' ,'67' ,'68' ,'69' ,'70'
|
104
|
+
,'71' ,'72' ,'73' ,'74' ,'75' ,'76' ,'77' ,'78' ,'79' ,'80'
|
105
|
+
,'81' ,'82' ,'83' ,'84' ,'85' ,'86' ,'87' ,'88' ,'89' ,'90'
|
106
|
+
,'91' ,'92' ,'93' ,'94' ,'95' ,'96' ,'97' ,'98' ,'99'
|
107
|
+
)
|
108
|
+
EOS
|
109
|
+
|
110
|
+
assert_equals(msg, expected.strip, @fmt.format(sql))
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_format_oneline_in_values
|
114
|
+
rule = base_rule
|
115
|
+
rule.in_values_num = AnbtSql::Rule::ONELINE_IN_VALUES_NUM
|
116
|
+
@fmt = AnbtSql::Formatter.new(rule)
|
117
|
+
msg = "oneline in values"
|
118
|
+
sql = "select * from users where id in (" + (1...50).to_a.join(",") + ")"
|
119
|
+
expected = <<EOS
|
120
|
+
SELECT
|
121
|
+
*
|
122
|
+
FROM
|
123
|
+
users
|
124
|
+
WHERE
|
125
|
+
id IN (
|
126
|
+
1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40 ,41 ,42 ,43 ,44 ,45 ,46 ,47 ,48 ,49
|
127
|
+
)
|
128
|
+
EOS
|
129
|
+
|
130
|
+
assert_equals(msg, expected.strip, @fmt.format(sql))
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_format_with_space_after_comma
|
134
|
+
rule = base_rule
|
135
|
+
rule.in_values_num = 10
|
136
|
+
rule.space_after_comma = true
|
137
|
+
@fmt = AnbtSql::Formatter.new(rule)
|
138
|
+
msg = "num in values"
|
139
|
+
sql = "select * from users where id in (" + (1...100).to_a.join(",") + ")"
|
140
|
+
expected = <<EOS
|
141
|
+
SELECT
|
142
|
+
*
|
143
|
+
FROM
|
144
|
+
users
|
145
|
+
WHERE
|
146
|
+
id IN (
|
147
|
+
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10
|
148
|
+
, 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20
|
149
|
+
, 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30
|
150
|
+
, 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40
|
151
|
+
, 41 , 42 , 43 , 44 , 45 , 46 , 47 , 48 , 49 , 50
|
152
|
+
, 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60
|
153
|
+
, 61 , 62 , 63 , 64 , 65 , 66 , 67 , 68 , 69 , 70
|
154
|
+
, 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80
|
155
|
+
, 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90
|
156
|
+
, 91 , 92 , 93 , 94 , 95 , 96 , 97 , 98 , 99
|
157
|
+
)
|
158
|
+
EOS
|
159
|
+
|
160
|
+
assert_equals(msg, expected.strip, @fmt.format(sql))
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_format_ignore_in_values_compact_when_select
|
164
|
+
rule = base_rule
|
165
|
+
rule.in_values_num = AnbtSql::Rule::ONELINE_IN_VALUES_NUM
|
166
|
+
@fmt = AnbtSql::Formatter.new(rule)
|
167
|
+
msg = "num in values"
|
168
|
+
sql = "select * from users where id in (select user_id from admins)"
|
169
|
+
expected = <<EOS
|
170
|
+
SELECT
|
171
|
+
*
|
172
|
+
FROM
|
173
|
+
users
|
174
|
+
WHERE
|
175
|
+
id IN (
|
176
|
+
SELECT
|
177
|
+
user_id
|
178
|
+
FROM
|
179
|
+
admins
|
180
|
+
)
|
181
|
+
EOS
|
182
|
+
|
183
|
+
assert_equals(msg, expected.strip, @fmt.format(sql))
|
184
|
+
end
|
185
|
+
|
186
|
+
private
|
187
|
+
|
188
|
+
def base_rule
|
189
|
+
rule = AnbtSql::Rule.new
|
190
|
+
rule.indent_string = " "
|
191
|
+
rule
|
192
|
+
end
|
193
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: anbt-sql-formatter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sonota88
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A tool for SQL formatting written in Ruby. Ruby port of Blanco SQL Formatter.
|
14
14
|
email:
|
@@ -30,6 +30,7 @@ files:
|
|
30
30
|
- lib/anbt-sql-formatter/exception.rb
|
31
31
|
- lib/anbt-sql-formatter/formatter.rb
|
32
32
|
- lib/anbt-sql-formatter/helper.rb
|
33
|
+
- lib/anbt-sql-formatter/in_values_checker.rb
|
33
34
|
- lib/anbt-sql-formatter/parser.rb
|
34
35
|
- lib/anbt-sql-formatter/rule.rb
|
35
36
|
- lib/anbt-sql-formatter/token.rb
|
@@ -44,6 +45,7 @@ files:
|
|
44
45
|
- test/test_coarse-tokenizer.rb
|
45
46
|
- test/test_formatter.rb
|
46
47
|
- test/test_helper.rb
|
48
|
+
- test/test_in_values.rb
|
47
49
|
- test/test_parser.rb
|
48
50
|
- test/test_rule.rb
|
49
51
|
- uninstall.rb
|