i_dig_sql 2.0.0 → 3.0.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 +10 -19
- data/VERSION +1 -1
- data/bin/test +38 -1
- data/i_dig_sql.gemspec +8 -4
- data/lib/i_dig_sql.rb +388 -65
- data/lib/i_dig_sql/H.rb +43 -0
- data/specs/0000-I_Dig_Sql.rb +84 -0
- data/specs/0001-new.rb +20 -0
- data/specs/0010-vars.rb +38 -0
- data/specs/0011-to_pair.rb +15 -0
- data/specs/0020-to_sql.rb +31 -0
- data/specs/0030-funcs.rb +40 -0
- data/specs/helpers.rb +51 -0
- metadata +74 -12
- data/englishy_sql.rb +0 -98
- data/specs/i_dig_sql.rb +0 -203
data/lib/i_dig_sql/H.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
|
2
|
+
class I_Dig_Sql
|
3
|
+
class H < Hash
|
4
|
+
|
5
|
+
def initialize *options
|
6
|
+
@h_option = {}
|
7
|
+
options.each { |name|
|
8
|
+
case name
|
9
|
+
when :allow_update
|
10
|
+
@h_option[:allow_update] = true
|
11
|
+
else
|
12
|
+
fail ArgumentError, "Unknown option: #{name.inspect}"
|
13
|
+
end
|
14
|
+
}
|
15
|
+
|
16
|
+
super()
|
17
|
+
end
|
18
|
+
|
19
|
+
def [] name
|
20
|
+
fail ArgumentError, "Unknown key: #{name.inspect}" unless has_key?(name)
|
21
|
+
super
|
22
|
+
end
|
23
|
+
|
24
|
+
def []= name, val
|
25
|
+
if has_key?(name) && self[name] != val && !@h_option[:allow_update]
|
26
|
+
fail ArgumentError, "Key already set: #{name.inspect}"
|
27
|
+
end
|
28
|
+
|
29
|
+
super
|
30
|
+
end
|
31
|
+
|
32
|
+
def merge! *args
|
33
|
+
args.each { |h|
|
34
|
+
h.each { |k,v|
|
35
|
+
self[k] = v
|
36
|
+
}
|
37
|
+
}
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
end # === class H
|
42
|
+
end # === I_Dig_Sql
|
43
|
+
|
@@ -0,0 +1,84 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
describe :I_Dig_Sql do
|
4
|
+
|
5
|
+
it "runs the code from README.md" do
|
6
|
+
readme = File.read(File.expand_path(File.dirname(__FILE__) + '/../README.md'))
|
7
|
+
code = readme[/```ruby([^`]+)```/] && $1
|
8
|
+
line = 0
|
9
|
+
readme.split("\n").detect { |l| line = line + 1; l['```ruby'] }
|
10
|
+
result = eval(code, nil, 'README.md', line)
|
11
|
+
sql(result).should == sql(%^
|
12
|
+
WITH
|
13
|
+
HEROES AS ( SELECT id FROM hero WHERE id = :PERSON_ID ),
|
14
|
+
VILLIANS AS ( SELECT id FROM villian WHERE id = :PERSON_ID )
|
15
|
+
SELECT * FROM people
|
16
|
+
WHERE
|
17
|
+
id IN ( SELECT id FROM hero WHERE id = :PERSON_ID AND status = :ALIVE)
|
18
|
+
OR
|
19
|
+
id IN (SELECT ID FROM HEROES AND status = :ALIVE)
|
20
|
+
OR
|
21
|
+
id IN ( SELECT * FROM HEROES )
|
22
|
+
OR
|
23
|
+
id IN ( SELECT patron_id FROM VILLIANS )
|
24
|
+
OR
|
25
|
+
id IN ( SELECT id FROM villian WHERE id = :PERSON_ID )
|
26
|
+
^)
|
27
|
+
end # === it
|
28
|
+
|
29
|
+
it "adds WITH: {{MY_NAME}}" do
|
30
|
+
sql = I_Dig_Sql.new
|
31
|
+
sql[:MY_HERO] = "SELECT * FROM hero"
|
32
|
+
sql[:MY_NAME] = "SELECT * FROM name"
|
33
|
+
sql << %^
|
34
|
+
{{MY_HERO}}
|
35
|
+
{{MY_NAME}}
|
36
|
+
^
|
37
|
+
sql(sql).should == sql(%^
|
38
|
+
WITH
|
39
|
+
MY_HERO AS (
|
40
|
+
SELECT * FROM hero
|
41
|
+
),
|
42
|
+
MY_NAME AS (
|
43
|
+
SELECT * FROM name
|
44
|
+
)
|
45
|
+
MY_HERO
|
46
|
+
MY_NAME
|
47
|
+
^)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "replaces text with content: << MY_NAME >>" do
|
51
|
+
sql = I_Dig_Sql.new
|
52
|
+
sql[:MY_HERO] = "SELECT * FROM hero"
|
53
|
+
sql << %^
|
54
|
+
<< MY_HERO >>
|
55
|
+
^
|
56
|
+
sql(sql).should == "SELECT * FROM hero"
|
57
|
+
end # === it
|
58
|
+
|
59
|
+
%w{ * id }.each { |s|
|
60
|
+
it "adds WITH: << #{s} MY_NAME >>" do
|
61
|
+
sql = I_Dig_Sql.new
|
62
|
+
sql[:MY_HERO] = "SELECT id, p_id FROM hero"
|
63
|
+
sql[:MY_NAME] = "SELECT id, n_id FROM name"
|
64
|
+
sql << %^
|
65
|
+
<< #{s} MY_NAME >>
|
66
|
+
<< #{s} MY_HERO >>
|
67
|
+
^
|
68
|
+
sql(sql).should == sql(%^
|
69
|
+
WITH
|
70
|
+
MY_NAME AS (
|
71
|
+
SELECT id, n_id FROM name
|
72
|
+
),
|
73
|
+
MY_HERO AS (
|
74
|
+
SELECT id, p_id FROM hero
|
75
|
+
)
|
76
|
+
SELECT #{s} FROM MY_NAME
|
77
|
+
SELECT #{s} FROM MY_HERO
|
78
|
+
^)
|
79
|
+
end # === it
|
80
|
+
}
|
81
|
+
|
82
|
+
end # === describe :I_Dig_Sql
|
83
|
+
|
84
|
+
|
data/specs/0001-new.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
describe '.new' do
|
4
|
+
|
5
|
+
it "merges sql values: .new(i_dig_sql)" do
|
6
|
+
first = I_Dig_Sql.new
|
7
|
+
first[:hero] = "SELECT * FROM hero"
|
8
|
+
second = I_Dig_Sql.new(first)
|
9
|
+
second[:name] = "SELECT * FROM name"
|
10
|
+
second << %^
|
11
|
+
<< hero >>
|
12
|
+
<< name >>
|
13
|
+
^
|
14
|
+
sql(second).should == sql(%^
|
15
|
+
SELECT * FROM hero
|
16
|
+
SELECT * FROM name
|
17
|
+
^)
|
18
|
+
end # === it
|
19
|
+
|
20
|
+
end # === describe '.new'
|
data/specs/0010-vars.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
describe :vars do
|
3
|
+
|
4
|
+
it "combines vars from other digs" do
|
5
|
+
one = I_Dig_Sql.new
|
6
|
+
one.vars[:one] = 1
|
7
|
+
|
8
|
+
two = I_Dig_Sql.new
|
9
|
+
one.vars[:two] = 2
|
10
|
+
|
11
|
+
three = I_Dig_Sql.new
|
12
|
+
one.vars[:three] = 3
|
13
|
+
|
14
|
+
dig = I_Dig_Sql.new one, two, three
|
15
|
+
dig.vars[:four] = 4
|
16
|
+
|
17
|
+
dig.vars!.should == {
|
18
|
+
four: 4,
|
19
|
+
three: 3,
|
20
|
+
two: 2,
|
21
|
+
one: 1
|
22
|
+
}
|
23
|
+
end # === it
|
24
|
+
|
25
|
+
it "fails w/Duplicate if other digs have the same var name" do
|
26
|
+
should.raise(ArgumentError) {
|
27
|
+
one = I_Dig_Sql.new
|
28
|
+
one.vars[:two] = 2
|
29
|
+
|
30
|
+
i = I_Dig_Sql.new one
|
31
|
+
i.vars[:two] = 3
|
32
|
+
i.vars!
|
33
|
+
}.message.should.match /Key already set: :two/
|
34
|
+
end # === it
|
35
|
+
|
36
|
+
end # === describe :vars
|
37
|
+
|
38
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
describe :to_pair do
|
3
|
+
|
4
|
+
it "returns an Array: [String, Hash]" do
|
5
|
+
i = I_Dig_Sql.new <<-EOF
|
6
|
+
SELECT * FROM new
|
7
|
+
EOF
|
8
|
+
i.vars[:one] = 2
|
9
|
+
sql, vars = i.to_pair
|
10
|
+
sql(sql).should == sql("SELECT * FROM new")
|
11
|
+
vars.should == {one: 2}
|
12
|
+
end # === it
|
13
|
+
|
14
|
+
end # === describe :to_pair
|
15
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
describe :to_sql do
|
4
|
+
|
5
|
+
it "renders nested replacements" do
|
6
|
+
i = I_Dig_Sql.new <<-EOF
|
7
|
+
<< FIRST >>
|
8
|
+
EOF
|
9
|
+
i[:FIRST] = " << SECOND >> "
|
10
|
+
i[:SECOND] = " << THIRD >> "
|
11
|
+
i[:THIRD] = "SELECT id FROM phantom"
|
12
|
+
sql(i).should == "SELECT id FROM phantom"
|
13
|
+
end # === it
|
14
|
+
|
15
|
+
it "prints CTE definitions once, if used multiple times" do
|
16
|
+
i = I_Dig_Sql.new <<-EOF
|
17
|
+
{{my_cte}}
|
18
|
+
{{my_cte}}
|
19
|
+
EOF
|
20
|
+
i[:my_cte] = "SELECT * FROM my"
|
21
|
+
sql(i).should == sql(%^
|
22
|
+
WITH
|
23
|
+
my_cte AS (
|
24
|
+
SELECT * FROM my
|
25
|
+
)
|
26
|
+
my_cte
|
27
|
+
my_cte
|
28
|
+
^)
|
29
|
+
end # === it
|
30
|
+
|
31
|
+
end # === describe :to_sql
|
data/specs/0030-funcs.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
describe :funcs do
|
3
|
+
|
4
|
+
it "let's you use a lambda in a SQL fragment" do
|
5
|
+
sql = I_Dig_Sql.new :q, <<-EOF
|
6
|
+
SELECT name
|
7
|
+
FROM screen_name
|
8
|
+
WHERE
|
9
|
+
<< id >>
|
10
|
+
EOF
|
11
|
+
|
12
|
+
sql[:id] = lambda { |dig| "id = :id" }
|
13
|
+
|
14
|
+
sql(sql).should == sql(%^
|
15
|
+
SELECT name
|
16
|
+
FROM screen_name
|
17
|
+
WHERE
|
18
|
+
id = :id
|
19
|
+
^)
|
20
|
+
end # === it
|
21
|
+
|
22
|
+
it "passes args to function" do
|
23
|
+
sql = I_Dig_Sql.new :q, <<-EOF
|
24
|
+
SELECT name
|
25
|
+
FROM screen_name
|
26
|
+
WHERE
|
27
|
+
<< names Hans Hoppe >>
|
28
|
+
EOF
|
29
|
+
|
30
|
+
sql[:names] = lambda { |dig, *args| "name IN [#{args.join ', '}]" }
|
31
|
+
|
32
|
+
sql(sql).should == sql(%^
|
33
|
+
SELECT name
|
34
|
+
FROM screen_name
|
35
|
+
WHERE
|
36
|
+
name IN [Hans, Hoppe]
|
37
|
+
^)
|
38
|
+
end # === it
|
39
|
+
|
40
|
+
end # === describe :funcs
|
data/specs/helpers.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
require "Bacon_Colored"
|
4
|
+
require "awesome_print"
|
5
|
+
require "unindent"
|
6
|
+
require "rouge"
|
7
|
+
|
8
|
+
|
9
|
+
module Kernel
|
10
|
+
def aputs *args
|
11
|
+
ap *args, :indent=>-2
|
12
|
+
end
|
13
|
+
|
14
|
+
def asql raw
|
15
|
+
base = raw.split("\n").detect { |l|
|
16
|
+
!l.empty?
|
17
|
+
}
|
18
|
+
prefix = base.split(/[^\ ]+/).first
|
19
|
+
indent = (prefix && prefix.size) || 0
|
20
|
+
src = if indent.zero?
|
21
|
+
raw
|
22
|
+
else
|
23
|
+
raw.split("\n").map { |l|
|
24
|
+
if l.index(prefix) != 0
|
25
|
+
prefix + l
|
26
|
+
else
|
27
|
+
l
|
28
|
+
end
|
29
|
+
}.join "\n"
|
30
|
+
end
|
31
|
+
|
32
|
+
puts "----------------------"
|
33
|
+
puts Rouge::Formatters::Terminal256.new.format(
|
34
|
+
Rouge::Lexers::SQL.new.lex(
|
35
|
+
src.unindent
|
36
|
+
)
|
37
|
+
)
|
38
|
+
puts "----------------------"
|
39
|
+
end
|
40
|
+
|
41
|
+
end # === module Kernel
|
42
|
+
|
43
|
+
def sql o
|
44
|
+
if o.is_a? String
|
45
|
+
return o.split.join(" ")
|
46
|
+
else
|
47
|
+
sql(o.to_sql)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
metadata
CHANGED
@@ -1,71 +1,127 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: i_dig_sql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- da99
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.5'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bacon
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: Bacon_Colored
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: pry
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: awesome_print
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: anbt-sql-formatter
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rouge
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.0.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.0.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: unindent
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.0.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.0.0
|
69
125
|
description: "\n You probably want another gem: arel. Use that\n to generate SQL
|
70
126
|
using Ruby.\n This gem only generates SELECT and WITH (ie CTE) statements/expressions.\n
|
71
127
|
\ "
|
@@ -82,11 +138,17 @@ files:
|
|
82
138
|
- Rakefile
|
83
139
|
- VERSION
|
84
140
|
- bin/test
|
85
|
-
- englishy_sql.rb
|
86
141
|
- i_dig_sql.gemspec
|
87
142
|
- lib/i_dig_sql.rb
|
143
|
+
- lib/i_dig_sql/H.rb
|
88
144
|
- lib/i_dig_sql/String.rb
|
89
|
-
- specs/
|
145
|
+
- specs/0000-I_Dig_Sql.rb
|
146
|
+
- specs/0001-new.rb
|
147
|
+
- specs/0010-vars.rb
|
148
|
+
- specs/0011-to_pair.rb
|
149
|
+
- specs/0020-to_sql.rb
|
150
|
+
- specs/0030-funcs.rb
|
151
|
+
- specs/helpers.rb
|
90
152
|
homepage: https://github.com/da99/i_dig_sql
|
91
153
|
licenses:
|
92
154
|
- MIT
|