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/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
|