sqlpp 1.0.0 → 1.1.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 +4 -4
- data/README.md +13 -1
- data/bin/sqlpp +14 -1
- data/lib/sqlpp/formatter.rb +7 -3
- data/lib/sqlpp/tokenizer.rb +9 -6
- data/lib/sqlpp/version.rb +1 -1
- data/test/formatter_test.rb +13 -2
- data/test/tokenizer_test.rb +5 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d62b8130206d11428dd96ac48cf586e41cfe9e1
|
4
|
+
data.tar.gz: 7b6e86ff2aed7c3245191b01a8054b8f4999634d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e0116eb2ab2a16df63333e01959c71016d2f7ef93811ff3cbfe34f41058fbe96e2d196ff9b8765fc905cae61aa48902df4416ee7c1c6373fa901b83bd26b5d1
|
7
|
+
data.tar.gz: 73fb8adc6a50638cac01e08d1419bebe200cc7f85e16cddd77e1abf4d931c0e92d3dd9e012da8e56d96415ba62c2367053e1d4ec1e5168b52036bfe724250d43
|
data/README.md
CHANGED
@@ -11,12 +11,24 @@ sql = "..."
|
|
11
11
|
ast = SQLPP::Parser.parse(sql)
|
12
12
|
|
13
13
|
puts SQLPP::Formatter.new.format(ast)
|
14
|
+
|
15
|
+
# or, to wrap projection lists...
|
16
|
+
puts SQLPP::Formatter.new(projections: :wrap).format(ast)
|
14
17
|
```
|
15
18
|
|
16
19
|
Or, you can use the included `bin/sqlpp` script to format SQL via STDIN:
|
17
20
|
|
18
21
|
```sh
|
19
|
-
$ sqlpp
|
22
|
+
$ sqlpp -h
|
23
|
+
SQLPP (SQL Pretty Printer)
|
24
|
+
|
25
|
+
Usage: sqlpp -h -? -wp < SQL
|
26
|
+
|
27
|
+
-h or -?: this list of options
|
28
|
+
-wp: wrap the projection lists
|
29
|
+
|
30
|
+
$ sqlpp -wp < query.sql
|
31
|
+
...
|
20
32
|
```
|
21
33
|
|
22
34
|
## Output
|
data/bin/sqlpp
CHANGED
@@ -4,5 +4,18 @@ require 'sqlpp'
|
|
4
4
|
|
5
5
|
sql = STDIN.read
|
6
6
|
|
7
|
+
if ARGV.grep(/^-[h?]$/).any?
|
8
|
+
puts "SQLPP (SQL Pretty Printer)"
|
9
|
+
puts
|
10
|
+
puts "Usage: #{$0} -h -? -wp < SQL"
|
11
|
+
puts
|
12
|
+
puts " -h or -?: this list of options"
|
13
|
+
puts " -wp: wrap the projection lists"
|
14
|
+
puts
|
15
|
+
exit
|
16
|
+
end
|
17
|
+
|
18
|
+
projections = ARGV.include?("-wp") ? :wrap : nil
|
19
|
+
|
7
20
|
ast = SQLPP::Parser.parse(sql)
|
8
|
-
puts SQLPP::Formatter.new.format(ast)
|
21
|
+
puts SQLPP::Formatter.new(projections: projections).format(ast)
|
data/lib/sqlpp/formatter.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
module SQLPP
|
2
2
|
class Formatter
|
3
|
-
def initialize
|
3
|
+
def initialize(projections: nil)
|
4
4
|
@indent = nil
|
5
5
|
@state = nil
|
6
|
+
|
7
|
+
@projections = projections
|
6
8
|
end
|
7
9
|
|
8
10
|
def format(node)
|
@@ -20,8 +22,10 @@ module SQLPP
|
|
20
22
|
output << "\n"
|
21
23
|
end
|
22
24
|
|
23
|
-
output << "#{_indent}SELECT "
|
24
|
-
|
25
|
+
output << (select = "#{_indent}SELECT ")
|
26
|
+
link = ","
|
27
|
+
link << ((@projections == :wrap) ? "\n#{" " * select.length}" : " ")
|
28
|
+
output << node.projections.map { |c| format(c) }.join(link)
|
25
29
|
output << "\n"
|
26
30
|
|
27
31
|
if node.froms
|
data/lib/sqlpp/tokenizer.rb
CHANGED
@@ -86,9 +86,9 @@ module SQLPP
|
|
86
86
|
Token.new(:punct, punct, pos)
|
87
87
|
elsif (punct = @scanner.scan(/[<>=\(\).*,\/+\-]/))
|
88
88
|
Token.new(:punct, punct, pos)
|
89
|
-
elsif @scanner.scan(/"/)
|
90
|
-
contents = _scan_to_delim(
|
91
|
-
Token.new(:id, "
|
89
|
+
elsif (delim = @scanner.scan(/["`]/))
|
90
|
+
contents = _scan_to_delim(delim, pos)
|
91
|
+
Token.new(:id, "#{delim}#{contents}#{delim}", pos)
|
92
92
|
elsif @scanner.scan(/'/)
|
93
93
|
contents = _scan_to_delim("'", pos)
|
94
94
|
Token.new(:lit, "'#{contents}'", pos)
|
@@ -100,14 +100,17 @@ module SQLPP
|
|
100
100
|
end
|
101
101
|
|
102
102
|
def _scan_to_delim(delim, pos)
|
103
|
+
escape, if_peek = case delim
|
104
|
+
when '"', '`' then ["\\", nil]
|
105
|
+
when "'" then ["'", "'"]
|
106
|
+
end
|
107
|
+
|
103
108
|
string = ""
|
104
109
|
loop do
|
105
110
|
ch = @scanner.getch
|
106
111
|
|
107
|
-
if
|
112
|
+
if ch == escape && (if_peek.nil? || @scanner.peek(1) == if_peek)
|
108
113
|
ch << @scanner.getch
|
109
|
-
elsif delim == "'" && ch == "'"
|
110
|
-
ch << @scanner.getch if @scanner.peek(1) == "'"
|
111
114
|
end
|
112
115
|
|
113
116
|
case ch
|
data/lib/sqlpp/version.rb
CHANGED
data/test/formatter_test.rb
CHANGED
@@ -31,11 +31,22 @@ ORDER BY z ASC
|
|
31
31
|
SQL
|
32
32
|
end
|
33
33
|
|
34
|
+
def test_format_wrap_projections
|
35
|
+
ast = _parser("select a, b, c, d from foo").parse
|
36
|
+
assert_equal <<-SQL, _format(ast, projections: :wrap)
|
37
|
+
SELECT a,
|
38
|
+
b,
|
39
|
+
c,
|
40
|
+
d
|
41
|
+
FROM foo
|
42
|
+
SQL
|
43
|
+
end
|
44
|
+
|
34
45
|
def _parser(string)
|
35
46
|
SQLPP::Parser.new(string)
|
36
47
|
end
|
37
48
|
|
38
|
-
def _format(ast)
|
39
|
-
SQLPP::Formatter.new.format(ast)
|
49
|
+
def _format(ast, options={})
|
50
|
+
SQLPP::Formatter.new(options).format(ast)
|
40
51
|
end
|
41
52
|
end
|
data/test/tokenizer_test.rb
CHANGED
@@ -41,7 +41,7 @@ class TokenizerTest < Minitest::Test
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def test_it_should_recognize_identifiers
|
44
|
-
_setup_tokenizer "word word123 \"quoted word\" \"with \\\"escape\\\" word\""
|
44
|
+
_setup_tokenizer "word word123 \"quoted word\" \"with \\\"escape\\\" word\" `mysql word` `mysql \\`escape\\` word`"
|
45
45
|
|
46
46
|
assert_token _next, type: :id, text: "word"
|
47
47
|
_skip :space
|
@@ -50,6 +50,10 @@ class TokenizerTest < Minitest::Test
|
|
50
50
|
assert_token _next, type: :id, text: '"quoted word"'
|
51
51
|
_skip :space
|
52
52
|
assert_token _next, type: :id, text: '"with \"escape\" word"'
|
53
|
+
_skip :space
|
54
|
+
assert_token _next, type: :id, text: '`mysql word`'
|
55
|
+
_skip :space
|
56
|
+
assert_token _next, type: :id, text: '`mysql \`escape\` word`'
|
53
57
|
end
|
54
58
|
|
55
59
|
def test_it_should_recognize_number_literals
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqlpp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamis Buck
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|