i_dig_sql 2.0.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/englishy_sql.rb
DELETED
@@ -1,98 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'pry'
|
3
|
-
require 'sequel'
|
4
|
-
DB = Sequel.mock
|
5
|
-
|
6
|
-
class Englishy_Sql
|
7
|
-
|
8
|
-
Duplicate = Class.new RuntimeError
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
@sql = {}
|
12
|
-
@vals = {}
|
13
|
-
instance_eval(&(Proc.new))
|
14
|
-
end # === def initialize
|
15
|
-
|
16
|
-
def val name, v
|
17
|
-
if @vals.has_key?(name) && @vals[name] != v
|
18
|
-
fail Duplicate, "Already set w/different value: #{name.inspect}"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def screen_name name
|
23
|
-
val :SCREEN_NAME, name.to_s.strip.upcase
|
24
|
-
sql(:SCREEN_NAME) {
|
25
|
-
|
26
|
-
any! {
|
27
|
-
owner_id.==(:AUDIENCE_ID)
|
28
|
-
all {
|
29
|
-
no_block
|
30
|
-
any! {
|
31
|
-
WORLD!
|
32
|
-
allowed
|
33
|
-
}
|
34
|
-
}
|
35
|
-
} # === any
|
36
|
-
|
37
|
-
one!
|
38
|
-
} # === sql
|
39
|
-
end
|
40
|
-
|
41
|
-
def post
|
42
|
-
@sql = @sql.where(:id=> DB[:post].select(:id) )
|
43
|
-
end # === def post
|
44
|
-
|
45
|
-
def comments
|
46
|
-
@sql = @sql.or(:parent_id=>DB[:comment].select(:id))
|
47
|
-
end
|
48
|
-
|
49
|
-
def sql *args
|
50
|
-
case
|
51
|
-
when args.empty?
|
52
|
-
@sql.sql
|
53
|
-
|
54
|
-
when args.size == 2
|
55
|
-
name, v = args
|
56
|
-
is_dup = @sql.has_key?(name) && @sql[name] != v
|
57
|
-
fail Duplicate, "Already set w/different value: #{name.inspect}" if is_dup
|
58
|
-
|
59
|
-
else
|
60
|
-
fail ArgumentError, "Unknown args: #{args.inspect}"
|
61
|
-
|
62
|
-
end # === case
|
63
|
-
end
|
64
|
-
|
65
|
-
end # === Englishy_Sql
|
66
|
-
|
67
|
-
|
68
|
-
puts(Englishy_Sql.new {
|
69
|
-
table(:computer) {
|
70
|
-
as(:comments)
|
71
|
-
any! {
|
72
|
-
is_owner
|
73
|
-
}
|
74
|
-
}
|
75
|
-
}.sql)
|
76
|
-
|
77
|
-
SELECT *
|
78
|
-
FROM screen_name
|
79
|
-
WHERE
|
80
|
-
id = (SELECT id FROM screen_name WHERE screen_name = 'MEANIE_6294')
|
81
|
-
AND (
|
82
|
-
owner_id = :AUDIENCE_ID
|
83
|
-
OR
|
84
|
-
(
|
85
|
-
:AUDIENCE_ID NOT IN (BLOCKED)
|
86
|
-
AND
|
87
|
-
( privacy = :WORLD
|
88
|
-
OR
|
89
|
-
(
|
90
|
-
privacy = :PROTECTED
|
91
|
-
AND
|
92
|
-
:AUDIENCE_ID IN (
|
93
|
-
ALLOWED
|
94
|
-
)
|
95
|
-
)
|
96
|
-
)
|
97
|
-
)
|
98
|
-
)
|
data/specs/i_dig_sql.rb
DELETED
@@ -1,203 +0,0 @@
|
|
1
|
-
|
2
|
-
require "Bacon_Colored"
|
3
|
-
|
4
|
-
def sql o
|
5
|
-
if o.is_a? String
|
6
|
-
return o.split.join(" ")
|
7
|
-
else
|
8
|
-
sql(o.to_sql)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def args o
|
13
|
-
o.to_sql[:args]
|
14
|
-
end
|
15
|
-
|
16
|
-
describe :I_Dig_Sql do
|
17
|
-
|
18
|
-
it "runs the code from README.md" do
|
19
|
-
readme = File.read(File.expand_path(File.dirname(__FILE__) + '/../README.md'))
|
20
|
-
code = readme[/```ruby([^`]+)```/] && $1
|
21
|
-
line = 0
|
22
|
-
readme.split("\n").detect { |l| line = line + 1; l['```ruby'] }
|
23
|
-
result = eval(code, nil, 'README.md', line)
|
24
|
-
sql(result).should == sql(%^
|
25
|
-
WITH
|
26
|
-
HEROES AS ( SELECT id FROM hero WHERE id = :PERSON_ID ) ,
|
27
|
-
VILLIANS AS ( SELECT id FROM villian WHERE id = :PERSON_ID )
|
28
|
-
SELECT * FROM people
|
29
|
-
WHERE
|
30
|
-
id IN ( SELECT id FROM hero WHERE id = :PERSON_ID AND status = :ALIVE)
|
31
|
-
OR
|
32
|
-
id IN (SELECT ID FROM HEROES AND status = :ALIVE)
|
33
|
-
OR
|
34
|
-
id IN ( SELECT * FROM HEROES )
|
35
|
-
OR
|
36
|
-
id IN ( SELECT patron_id FROM VILLIANS )
|
37
|
-
OR
|
38
|
-
id IN ( SELECT id FROM villian WHERE id = :PERSON_ID )
|
39
|
-
^)
|
40
|
-
end # === it
|
41
|
-
|
42
|
-
it "adds WITH: {{MY_NAME}}" do
|
43
|
-
sql = I_Dig_Sql.new
|
44
|
-
sql[:MY_HERO] = "SELECT * FROM hero"
|
45
|
-
sql[:MY_NAME] = "SELECT * FROM name"
|
46
|
-
sql << %^
|
47
|
-
{{MY_HERO}}
|
48
|
-
{{MY_NAME}}
|
49
|
-
^
|
50
|
-
sql(sql).should == sql(%^
|
51
|
-
WITH
|
52
|
-
MY_HERO AS (
|
53
|
-
SELECT * FROM hero
|
54
|
-
)
|
55
|
-
,
|
56
|
-
MY_NAME AS (
|
57
|
-
SELECT * FROM name
|
58
|
-
)
|
59
|
-
MY_HERO
|
60
|
-
MY_NAME
|
61
|
-
^)
|
62
|
-
end
|
63
|
-
|
64
|
-
it "replaces text with content: << MY_NAME >>" do
|
65
|
-
sql = I_Dig_Sql.new
|
66
|
-
sql[:MY_HERO] = "SELECT * FROM hero"
|
67
|
-
sql << %^
|
68
|
-
<< MY_HERO >>
|
69
|
-
^
|
70
|
-
sql(sql).should == "SELECT * FROM hero"
|
71
|
-
end # === it
|
72
|
-
|
73
|
-
%w{ * id }.each { |s|
|
74
|
-
it "adds WITH: << #{s} MY_NAME >>" do
|
75
|
-
sql = I_Dig_Sql.new
|
76
|
-
sql[:MY_HERO] = "SELECT id, p_id FROM hero"
|
77
|
-
sql[:MY_NAME] = "SELECT id, n_id FROM name"
|
78
|
-
sql << %^
|
79
|
-
<< #{s} MY_NAME >>
|
80
|
-
<< #{s} MY_HERO >>
|
81
|
-
^
|
82
|
-
sql(sql).should == sql(%^
|
83
|
-
WITH
|
84
|
-
MY_NAME AS (
|
85
|
-
SELECT id, n_id FROM name
|
86
|
-
) ,
|
87
|
-
MY_HERO AS (
|
88
|
-
SELECT id, p_id FROM hero
|
89
|
-
)
|
90
|
-
SELECT #{s} FROM MY_NAME
|
91
|
-
SELECT #{s} FROM MY_HERO
|
92
|
-
^)
|
93
|
-
end # === it
|
94
|
-
}
|
95
|
-
|
96
|
-
end # === describe :I_Dig_Sql
|
97
|
-
|
98
|
-
describe '.new' do
|
99
|
-
|
100
|
-
it "merges sql values: .new(i_dig_sql)" do
|
101
|
-
first = I_Dig_Sql.new
|
102
|
-
first[:hero] = "SELECT * FROM hero"
|
103
|
-
second = I_Dig_Sql.new(first)
|
104
|
-
second[:name] = "SELECT * FROM name"
|
105
|
-
second << %^
|
106
|
-
<< hero >>
|
107
|
-
<< name >>
|
108
|
-
^
|
109
|
-
sql(second).should == sql(%^
|
110
|
-
SELECT * FROM hero
|
111
|
-
SELECT * FROM name
|
112
|
-
^)
|
113
|
-
end # === it
|
114
|
-
|
115
|
-
it "combines all Strings" do
|
116
|
-
i = I_Dig_Sql.new "SELECT ", " * ", " FROM ", " NAME "
|
117
|
-
sql(i).should == sql("SELECT * FROM NAME")
|
118
|
-
end # === it
|
119
|
-
|
120
|
-
end # === describe '.new'
|
121
|
-
|
122
|
-
|
123
|
-
describe :vars do
|
124
|
-
|
125
|
-
it "combines vars from other digs" do
|
126
|
-
one = I_Dig_Sql.new
|
127
|
-
one.vars[:one] = 1
|
128
|
-
|
129
|
-
two = I_Dig_Sql.new
|
130
|
-
one.vars[:two] = 2
|
131
|
-
|
132
|
-
three = I_Dig_Sql.new
|
133
|
-
one.vars[:three] = 3
|
134
|
-
|
135
|
-
dig = I_Dig_Sql.new one, two, three
|
136
|
-
dig.vars[:four] = 4
|
137
|
-
|
138
|
-
dig.vars.should == {
|
139
|
-
four: 4,
|
140
|
-
three: 3,
|
141
|
-
two: 2,
|
142
|
-
one: 1
|
143
|
-
}
|
144
|
-
end # === it
|
145
|
-
|
146
|
-
it "fails w/Duplicate if other digs have the same var name" do
|
147
|
-
should.raise(ArgumentError) {
|
148
|
-
one = I_Dig_Sql.new
|
149
|
-
one.vars[:two] = 2
|
150
|
-
|
151
|
-
i = I_Dig_Sql.new one
|
152
|
-
i.vars[:two] = 3
|
153
|
-
i.vars
|
154
|
-
}.message.should.match /Key already set: :two/
|
155
|
-
end # === it
|
156
|
-
|
157
|
-
end # === describe :vars
|
158
|
-
|
159
|
-
|
160
|
-
describe :to_pair do
|
161
|
-
|
162
|
-
it "returns an Array: [String, Hash]" do
|
163
|
-
i = I_Dig_Sql.new <<-EOF
|
164
|
-
SELECT * FROM new
|
165
|
-
EOF
|
166
|
-
i.vars[:one] = 2
|
167
|
-
sql, vars = i.to_pair
|
168
|
-
sql(sql).should == sql("SELECT * FROM new")
|
169
|
-
vars.should == {one: 2}
|
170
|
-
end # === it
|
171
|
-
|
172
|
-
end # === describe :to_pair
|
173
|
-
|
174
|
-
|
175
|
-
describe :to_sql do
|
176
|
-
|
177
|
-
it "renders nested replacements" do
|
178
|
-
i = I_Dig_Sql.new <<-EOF
|
179
|
-
<< FIRST >>
|
180
|
-
EOF
|
181
|
-
i[:FIRST] = " << SECOND >> "
|
182
|
-
i[:SECOND] = " << THIRD >> "
|
183
|
-
i[:THIRD] = "FINAL"
|
184
|
-
sql(i).should == "FINAL"
|
185
|
-
end # === it
|
186
|
-
|
187
|
-
it "prints CTE definitions once, if used multiple times" do
|
188
|
-
i = I_Dig_Sql.new <<-EOF
|
189
|
-
{{my_cte}}
|
190
|
-
{{my_cte}}
|
191
|
-
EOF
|
192
|
-
i[:my_cte] = "SELECT *"
|
193
|
-
sql(i).should == sql(%^
|
194
|
-
WITH
|
195
|
-
my_cte AS (
|
196
|
-
SELECT *
|
197
|
-
)
|
198
|
-
my_cte
|
199
|
-
my_cte
|
200
|
-
^)
|
201
|
-
end # === it
|
202
|
-
|
203
|
-
end # === describe :to_sql
|