rebel 0.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.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/lib/rebel.rb +3 -0
  3. data/lib/rebel/sql.rb +213 -0
  4. metadata +45 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ea69d0d0787dec584bc554cb9fa7223937d55562
4
+ data.tar.gz: c0d0f09f74a15f6079ac9496eb807981d3250edd
5
+ SHA512:
6
+ metadata.gz: 01672fe5ec3f73beeca1e66465e70d19f47ed765c23f07c47f7dca4fbdbb617900568c7643a694accb47660955b886539bc576e991573fa497a12c96883def84
7
+ data.tar.gz: 6c7457efbe296284d8acb777b3c39df51dd53ed3b94d439f885dacde8dc0638411a465ff7d72d97b556ca72aaafa028234a8c14b189a5bf3e04ea58ae656990e
data/lib/rebel.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Rebel; end
2
+
3
+ require 'rebel/sql'
data/lib/rebel/sql.rb ADDED
@@ -0,0 +1,213 @@
1
+ module Rebel::SQL
2
+ attr_reader :conn
3
+
4
+ def exec(query)
5
+ conn.exec(query)
6
+ end
7
+
8
+ def create_table(table_name, desc)
9
+ exec(SQL.create_table(table_name, desc))
10
+ end
11
+
12
+ def select(*fields, from: nil, where: nil, inner: nil, left: nil, right: nil)
13
+ exec(SQL.select(*fields,
14
+ from: from,
15
+ where: where,
16
+ inner: inner,
17
+ left: left,
18
+ right: right))
19
+ end
20
+
21
+ def insert_into(table_name, *rows)
22
+ exec(SQL.insert_into(table_name, *rows))
23
+ end
24
+
25
+ def update(table_name, set: nil, where: nil, inner: nil, left: nil, right: nil)
26
+ exec(SQL.update(table_name, set: set, where: where, inner: inner, left: left, right: right))
27
+ end
28
+
29
+ def delete_from(table_name, where: nil, inner: nil, left: nil, right: nil)
30
+ exec(SQL.delete_from(table_name, where: where, inner: inner, left: left, right: right))
31
+ end
32
+
33
+ def truncate(table_name)
34
+ exec(SQL.truncate(table_name))
35
+ end
36
+
37
+ def count(*n)
38
+ SQL.count(*n)
39
+ end
40
+
41
+ def join(table, on: nil)
42
+ SQL.join(table, on: on)
43
+ end
44
+
45
+ def outer_join(table, on: nil)
46
+ SQL.outer_join(table, on: on)
47
+ end
48
+
49
+ class Raw < String
50
+ def as(n)
51
+ Raw.new(self + " AS #{SQL.name(n)}")
52
+ end
53
+
54
+ def as?(n)
55
+ n ? as(n) : self
56
+ end
57
+
58
+ def on(clause)
59
+ Raw.new(self + " ON #{SQL.and_clause(clause)}")
60
+ end
61
+
62
+ def on?(clause)
63
+ clause ? on(clause) : self
64
+ end
65
+ end
66
+
67
+ class << self
68
+ def raw(str)
69
+ Raw.new(str)
70
+ end
71
+
72
+ def create_table(table_name, desc)
73
+ <<-SQL
74
+ CREATE TABLE #{SQL.name(table_name)} (
75
+ #{SQL.list(desc.map { |k, v| "#{SQL.name(k)} #{v}" })}
76
+ );
77
+ SQL
78
+ end
79
+
80
+ def select(*fields, from: nil, where: nil, inner: nil, left: nil, right: nil)
81
+ <<-SQL
82
+ SELECT #{names(*fields)} FROM #{name(from)}
83
+ #{SQL.inner?(inner)}
84
+ #{SQL.left?(left)}
85
+ #{SQL.right?(right)}
86
+ #{SQL.where?(where)};
87
+ SQL
88
+ end
89
+
90
+ def insert_into(table_name, *rows)
91
+ <<-SQL
92
+ INSERT INTO #{SQL.name(table_name)} (#{SQL.names(*rows.first.keys)})
93
+ VALUES #{SQL.list(rows.map { |r| "(#{SQL.values(*r.values)})" })};
94
+ SQL
95
+ end
96
+
97
+ def update(table_name, set: nil, where: nil, inner: nil, left: nil, right: nil)
98
+ fail ArgumentError if set.nil?
99
+
100
+ <<-SQL
101
+ UPDATE #{SQL.name(table_name)}
102
+ SET #{SQL.assign_clause(set)}
103
+ #{SQL.inner?(inner)}
104
+ #{SQL.left?(left)}
105
+ #{SQL.right?(right)}
106
+ #{SQL.where?(where)};
107
+ SQL
108
+ end
109
+
110
+ def delete_from(table_name, where: nil, inner: nil, left: nil, right: nil)
111
+ <<-SQL
112
+ DELETE FROM #{SQL.name(table_name)}
113
+ #{SQL.inner?(inner)}
114
+ #{SQL.left?(left)}
115
+ #{SQL.right?(right)}
116
+ #{SQL.where?(where)};
117
+ SQL
118
+ end
119
+
120
+ def truncate(table_name)
121
+ <<-SQL
122
+ TRUNCATE #{SQL.name(table_name)};
123
+ SQL
124
+ end
125
+
126
+ ## Functions
127
+
128
+ def count(*n)
129
+ raw("COUNT(#{names(*n)})")
130
+ end
131
+
132
+ def join(table, on: nil)
133
+ raw("JOIN #{name(table)}").on?(on)
134
+ end
135
+
136
+ def outer_join(table, on: nil)
137
+ raw("OUTER JOIN #{name(table)}").on?(on)
138
+ end
139
+
140
+ ## Support
141
+
142
+ def name(name)
143
+ return name if name.is_a?(Raw)
144
+ return raw('*') if name == '*'
145
+
146
+ name.to_s.split('.').map { |e| "\"#{e}\"" }.join('.')
147
+ end
148
+
149
+ def names(*names)
150
+ list(names.map { |k| name(k) })
151
+ end
152
+
153
+ def list(*items)
154
+ items.join(', ')
155
+ end
156
+
157
+ def value(v)
158
+ case v
159
+ when Raw then v
160
+ when String then raw "'#{v.tr("'", "''")}'"
161
+ when Fixnum then raw v.to_s
162
+ when nil then raw 'NULL'
163
+ else fail NotImplementedError, v.inspect
164
+ end
165
+ end
166
+
167
+ def values(*values)
168
+ list(values.map { |v| value(v) })
169
+ end
170
+
171
+ def name_or_value(item)
172
+ item.is_a?(Symbol) ? name(item) : value(item)
173
+ end
174
+
175
+ def equal(l, r)
176
+ "#{name_or_value(l)} = #{name_or_value(r)}"
177
+ end
178
+
179
+ def assign_clause(clause)
180
+ list(clause.map { |k, v| equal(k, v) })
181
+ end
182
+
183
+ def and_clause(clause)
184
+ return clause if clause.is_a?(Raw) || clause.is_a?(String)
185
+
186
+ clause.map do |e|
187
+ case e
188
+ when Array then "#{name(e[0])} = #{name_or_value(e[1])}"
189
+ when Raw, String then e
190
+ else fail NotImplementedError, e.class
191
+ end
192
+ end.join(' AND ')
193
+ end
194
+
195
+ def where?(clause)
196
+ return "WHERE #{clause}" if clause.is_a?(Raw) || clause.is_a?(String)
197
+
198
+ (clause && clause.any?) ? "WHERE #{SQL.and_clause(clause)}" : nil
199
+ end
200
+
201
+ def inner?(join)
202
+ join ? "INNER #{join}" : nil
203
+ end
204
+
205
+ def left?(join)
206
+ join ? "LEFT #{join}" : nil
207
+ end
208
+
209
+ def right?(join)
210
+ join ? "RIGHT #{join}" : nil
211
+ end
212
+ end
213
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rebel
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Loic Nageleisen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-02-27 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Write SQL queries in Ruby, or is it the other way around?
14
+ email: loic.nageleisen@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/rebel.rb
20
+ - lib/rebel/sql.rb
21
+ homepage: https://github.com/lloeki/rebel.git
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 2.6.10
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: Fight against the Object tyranny
45
+ test_files: []