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.
@@ -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
- )
@@ -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