anbt-sql-formatter 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|