epoxy 0.2.1 → 0.3.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.
- data/README.rdoc +23 -9
- data/Rakefile +4 -1
- data/VERSION +1 -1
- data/lib/epoxy.rb +104 -72
- data/test/helper.rb +2 -0
- data/test/test_epoxy.rb +156 -90
- metadata +26 -5
data/README.rdoc
CHANGED
@@ -1,19 +1,33 @@
|
|
1
|
-
= Epoxy - bind data to queries for any query language.
|
2
|
-
|
3
|
-
Let me hit ya with some science!
|
1
|
+
= Epoxy - bind data to queries for any query language.
|
2
|
+
|
3
|
+
Let me hit ya with some science!
|
4
4
|
|
5
|
+
# numbered binds
|
5
6
|
ep = Epoxy.new("select * from foo where bar=?")
|
6
7
|
binds = %W[foo]
|
7
8
|
bound_query = ep.quote { |x| "'" + binds[x] + "'" }
|
8
9
|
"select * from foo where bar='foo'"
|
9
10
|
|
10
|
-
|
11
|
+
# named binds
|
12
|
+
binds = { :name => 'Lee', :age => 132 }
|
13
|
+
ep = Epoxy.new("select * from people where name=?name and age=?age")
|
14
|
+
bound_query = ep.quote(binds) { |x| "'#{binds[x]}'" }
|
15
|
+
"select * from people where name='Lee' and age='132'"
|
11
16
|
|
12
|
-
|
13
|
-
|
14
|
-
*
|
15
|
-
|
16
|
-
*
|
17
|
+
# mix them!
|
18
|
+
binds = { 0 => "Age", :name => 'Lee' }
|
19
|
+
ep = Epoxy.new("select * from people where name=?name and age=?")
|
20
|
+
bound_query = ep.quote(binds) { |x| "'#{binds[x]}'" }
|
21
|
+
"select * from people where name='Lee' and age='Age'"
|
22
|
+
|
23
|
+
Epoxy handles:
|
24
|
+
|
25
|
+
* ?<name> for named binds
|
26
|
+
* ? for numbered binds
|
27
|
+
* ?? for a *real* question mark
|
28
|
+
* '?' for a *real* question mark
|
29
|
+
* comments, weird quoting styles (look at the "holy shit" test for examples)
|
30
|
+
* not telling you how to quote your data. This solution works for any query language and any database.
|
17
31
|
|
18
32
|
== Note on Patches/Pull Requests
|
19
33
|
|
data/Rakefile
CHANGED
@@ -11,6 +11,7 @@ begin
|
|
11
11
|
gem.homepage = "http://github.com/erikh/epoxy"
|
12
12
|
gem.authors = ["Erik Hollensbe"]
|
13
13
|
gem.add_development_dependency 'rdoc'
|
14
|
+
gem.add_development_dependency 'test-unit'
|
14
15
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
16
|
end
|
16
17
|
Jeweler::GemcutterTasks.new
|
@@ -43,7 +44,7 @@ task :test => :check_dependencies
|
|
43
44
|
task :default => :test
|
44
45
|
|
45
46
|
task :to_blog => [:clobber_rdoc, :rdoc] do
|
46
|
-
|
47
|
+
sh "rm -fr $git/blog/content/docs/epoxy && mv rdoc $git/blog/content/docs/epoxy"
|
47
48
|
end
|
48
49
|
|
49
50
|
require 'rdoc/task'
|
@@ -56,3 +57,5 @@ RDoc::Task.new do |rdoc|
|
|
56
57
|
rdoc.rdoc_files.include('README*')
|
57
58
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
58
59
|
end
|
60
|
+
|
61
|
+
# vim: syntax=ruby ts=2 et sw=2 sts=2
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/epoxy.rb
CHANGED
@@ -1,92 +1,124 @@
|
|
1
1
|
# = Epoxy - bind data to queries for any query language.
|
2
2
|
#
|
3
3
|
# Let me hit ya with some science!
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
4
|
+
#
|
5
|
+
# # numbered binds
|
6
|
+
# ep = Epoxy.new("select * from foo where bar=?")
|
7
|
+
# binds = %W[foo]
|
8
|
+
# bound_query = ep.quote { |x| "'" + binds[x] + "'" }
|
9
|
+
# "select * from foo where bar='foo'"
|
10
|
+
#
|
11
|
+
# # named binds
|
12
|
+
# binds = { :name => 'Lee', :age => 132 }
|
13
|
+
# ep = Epoxy.new("select * from people where name=?name and age=?age")
|
14
|
+
# bound_query = ep.quote(binds) { |x| "'#{binds[x]}'" }
|
15
|
+
# "select * from people where name='Lee' and age='132'"
|
16
|
+
#
|
17
|
+
# # mix them!
|
18
|
+
# binds = { 0 => "Age", :name => 'Lee' }
|
19
|
+
# ep = Epoxy.new("select * from people where name=?name and age=?")
|
20
|
+
# bound_query = ep.quote(binds) { |x| "'#{binds[x]}'" }
|
21
|
+
# "select * from people where name='Lee' and age='Age'"
|
9
22
|
#
|
10
23
|
# Epoxy handles:
|
11
24
|
#
|
12
|
-
# *
|
25
|
+
# * ?<name> for named binds
|
26
|
+
# * ? for numbered binds
|
13
27
|
# * ?? for a *real* question mark
|
14
28
|
# * '?' for a *real* question mark
|
15
29
|
# * comments, weird quoting styles (look at the "holy shit" test for examples)
|
16
30
|
# * not telling you how to quote your data. This solution works for any query language and any database.
|
17
31
|
#
|
18
32
|
class Epoxy
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
33
|
+
#
|
34
|
+
# Token parser, isolates components of the query into parts to where they
|
35
|
+
# can be managed indepdently.
|
36
|
+
#
|
37
|
+
# Probably not the easiest thing to deal with by itself. Use the standard
|
38
|
+
# methods plox.
|
39
|
+
def self.parse_tokens(query, comment_chars)
|
40
|
+
a = query.scan(%r{
|
41
|
+
(
|
42
|
+
#{comment_chars}.* (?# matches "--" style comments to the end of line or string )
|
43
|
+
|
|
44
|
+
' ( [^'\\] | '' | \\. )* ' (?# match strings surrounded by apostophes )
|
45
|
+
|
|
46
|
+
" ( [^"\\] | "" | \\. )* " (?# match strings surrounded by " )
|
47
|
+
|
|
48
|
+
['"] (?# match a loose quote )
|
49
|
+
|
|
50
|
+
\?[a-zA-Z]+ (?# match a named bind )
|
51
|
+
|
|
52
|
+
\?\?? (?# match one or two question marks )
|
53
|
+
|
|
54
|
+
[^-/'"?:]+ (?# match all characters except ' " ? - : and / )
|
55
|
+
)
|
56
|
+
}x).collect(&:first)
|
57
|
+
end
|
43
58
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
59
|
+
# tokens generated by Epoxy.parse_tokens. Just use Epoxy#quote for now.
|
60
|
+
attr_reader :tokens
|
61
|
+
# the original query, before quoting.
|
62
|
+
attr_reader :query
|
63
|
+
# leader comment characters - defaults to SQL "--"
|
64
|
+
attr_reader :comment_chars
|
50
65
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
66
|
+
#
|
67
|
+
# Takes a query as a string and an optional regexp defining
|
68
|
+
# beginning-of-line comments. The binding rules are as follows:
|
69
|
+
#
|
70
|
+
# * ?<name> for named binds
|
71
|
+
# * ? for numbered binds
|
72
|
+
# * ?? for a *real* question mark
|
73
|
+
# * '?' for a *real* question mark
|
74
|
+
# * comments, weird quoting styles are unaffected.
|
75
|
+
#
|
76
|
+
def initialize(query, comment_chars=%r{--|//})
|
77
|
+
@comment_chars = comment_chars
|
78
|
+
@query = query
|
79
|
+
@tokens = self.class.parse_tokens(query, @comment_chars)
|
80
|
+
end
|
65
81
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
82
|
+
#
|
83
|
+
# Processes your query for quoting. Provide a block that emulates how your
|
84
|
+
# data should be quoted. This method accepts a Hash to process named bindings,
|
85
|
+
# which when provided will yield each successive Hash key which has a match
|
86
|
+
# in the named binds. <b>Keys are coerced to symbols before being yielded.</b>
|
87
|
+
#
|
88
|
+
# Without a Hash it will yield on each successive bound element
|
89
|
+
# with the index of that element passed.
|
90
|
+
#
|
91
|
+
# *You* are responsible for quoting your data properly. Epoxy just makes it
|
92
|
+
# easier to get the places you need to quote out of the query.
|
93
|
+
#
|
94
|
+
def quote(binds = {}, &block)
|
95
|
+
result = ""
|
96
|
+
bind_pos = 0
|
77
97
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
result << "?"
|
85
|
-
else
|
86
|
-
result << part
|
87
|
-
end
|
98
|
+
unless binds.empty?
|
99
|
+
tokens.each do |token|
|
100
|
+
binds.each do |key, rep|
|
101
|
+
if token == "?#{key}"
|
102
|
+
token.replace block.call(key.to_sym)
|
103
|
+
end
|
88
104
|
end
|
105
|
+
end
|
106
|
+
end
|
89
107
|
|
90
|
-
|
108
|
+
tokens.each do |part|
|
109
|
+
case part
|
110
|
+
when '?'
|
111
|
+
result << block.call(bind_pos)
|
112
|
+
bind_pos += 1
|
113
|
+
when '??'
|
114
|
+
result << "?"
|
115
|
+
else
|
116
|
+
result << part
|
117
|
+
end
|
91
118
|
end
|
119
|
+
|
120
|
+
return result
|
121
|
+
end
|
92
122
|
end
|
123
|
+
|
124
|
+
# vim: syntax=ruby ts=2 et sw=2 sts=2
|
data/test/helper.rb
CHANGED
data/test/test_epoxy.rb
CHANGED
@@ -1,142 +1,208 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class TestEpoxy < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
def test_01_basic
|
5
|
+
ep = Epoxy.new("select * from foo where bar=?")
|
6
|
+
assert(ep)
|
7
|
+
assert_kind_of(Epoxy, ep)
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
assert_equal("select * from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
def test_02_literal_question_mark
|
13
|
+
ep = Epoxy.new("select ?? from foo where bar=?")
|
14
|
+
assert_equal("select ? from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
15
15
|
|
16
|
-
|
17
|
-
|
16
|
+
ep = Epoxy.new("select ??? from foo where bar=?")
|
17
|
+
assert_equal("select ?'foo' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
ep = Epoxy.new("select ???? from foo where bar=?")
|
20
|
+
assert_equal("select ?? from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
21
21
|
|
22
|
-
|
23
|
-
|
22
|
+
ep = Epoxy.new("select ????? from foo where bar=?")
|
23
|
+
assert_equal("select ??'foo' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
ep = Epoxy.new("select '?' from foo where bar=?")
|
26
|
+
assert_equal("select '?' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
ep = Epoxy.new("select '?'? from foo where bar=?")
|
29
|
+
assert_equal("select '?''foo' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
30
30
|
|
31
|
-
|
32
|
-
|
31
|
+
ep = Epoxy.new("select '?''?' from foo where bar=?")
|
32
|
+
assert_equal("select '?''?' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
33
33
|
|
34
|
-
|
35
|
-
|
34
|
+
ep = Epoxy.new("select ?'?' from foo where bar=?")
|
35
|
+
assert_equal("select 'foo''?' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
36
36
|
|
37
|
-
|
38
|
-
|
37
|
+
ep = Epoxy.new("select ?'?'? from foo where bar=?")
|
38
|
+
assert_equal("select 'foo''?''foo' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
39
39
|
|
40
|
-
|
41
|
-
|
40
|
+
ep = Epoxy.new("select '?'?'? from foo where bar=?")
|
41
|
+
assert_equal("select '?''foo'''foo' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
42
42
|
|
43
|
-
|
44
|
-
|
43
|
+
ep = Epoxy.new("select '?'?'?' from foo where bar=?")
|
44
|
+
assert_equal("select '?''foo''?' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
45
45
|
|
46
|
-
|
47
|
-
|
46
|
+
ep = Epoxy.new("select '?'?? from foo where bar=?")
|
47
|
+
assert_equal("select '?'? from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
48
48
|
|
49
|
-
|
50
|
-
|
49
|
+
ep = Epoxy.new("select '?'??? from foo where bar=?")
|
50
|
+
assert_equal("select '?'?'foo' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
51
51
|
|
52
|
-
|
53
|
-
|
52
|
+
ep = Epoxy.new("select ??'?'??? from foo where bar=?")
|
53
|
+
assert_equal("select ?'?'?'foo' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
54
54
|
|
55
|
-
|
56
|
-
|
55
|
+
ep = Epoxy.new("select ???'?'??? from foo where bar=?")
|
56
|
+
assert_equal("select ?'foo''?'?'foo' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
57
57
|
|
58
|
-
|
59
|
-
|
58
|
+
ep = Epoxy.new("select ''? from foo where bar=?")
|
59
|
+
assert_equal("select '''foo' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
60
60
|
|
61
|
-
|
62
|
-
|
61
|
+
ep = Epoxy.new("select '''? from foo where bar=?")
|
62
|
+
assert_equal("select ''''foo' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
63
63
|
|
64
|
-
|
65
|
-
|
64
|
+
ep = Epoxy.new("select ''?' from foo where bar=?")
|
65
|
+
assert_equal("select '''foo'' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
66
66
|
|
67
|
-
|
68
|
-
|
67
|
+
ep = Epoxy.new("select ''?'' from foo where bar=?")
|
68
|
+
assert_equal("select '''foo''' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
69
69
|
|
70
|
-
|
71
|
-
|
70
|
+
ep = Epoxy.new("select ''??' from foo where bar=?")
|
71
|
+
assert_equal("select ''?' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
72
72
|
|
73
|
-
|
74
|
-
|
73
|
+
ep = Epoxy.new("select '?''?' from foo where bar=?")
|
74
|
+
assert_equal("select '?''?' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
75
75
|
|
76
|
-
|
77
|
-
|
76
|
+
ep = Epoxy.new("select '?'''?' from foo where bar=?")
|
77
|
+
assert_equal("select '?''''foo'' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
78
78
|
|
79
|
-
|
80
|
-
|
79
|
+
ep = Epoxy.new("select '?''''?' from foo where bar=?")
|
80
|
+
assert_equal("select '?''''?' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
81
81
|
|
82
|
-
|
83
|
-
|
82
|
+
ep = Epoxy.new("select '??' from foo where bar=?")
|
83
|
+
assert_equal("select '??' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
84
84
|
|
85
|
-
|
86
|
-
|
85
|
+
ep = Epoxy.new("select '???' from foo where bar=?")
|
86
|
+
assert_equal("select '???' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
87
87
|
|
88
|
-
|
89
|
-
|
90
|
-
|
88
|
+
ep = Epoxy.new("select ''???' from foo where bar=?")
|
89
|
+
assert_equal("select ''?'foo'' from foo where bar='foo'", ep.quote { |x| "'foo'" })
|
90
|
+
end
|
91
91
|
|
92
|
-
|
93
|
-
|
94
|
-
|
92
|
+
def test_03_quotes_already
|
93
|
+
ep = Epoxy.new("select * from \"foo\" where bar=?")
|
94
|
+
assert_equal("select * from \"foo\" where bar='foo'", ep.quote { |x| "'foo'" })
|
95
95
|
|
96
|
-
|
97
|
-
|
98
|
-
|
96
|
+
ep = Epoxy.new("select * from 'foo' where bar=?")
|
97
|
+
assert_equal("select * from 'foo' where bar='foo'", ep.quote { |x| "'foo'" })
|
98
|
+
end
|
99
99
|
|
100
|
-
|
101
|
-
|
102
|
-
|
100
|
+
def test_04_holy_shit
|
101
|
+
ep = Epoxy.new("select * from \"'foo'\" where bar=?")
|
102
|
+
assert_equal("select * from \"'foo'\" where bar='foo'", ep.quote { |x| "'foo'" })
|
103
103
|
|
104
|
-
|
105
|
-
|
104
|
+
ep = Epoxy.new("select * from E\"'foo'\" where bar=?")
|
105
|
+
assert_equal("select * from E\"'foo'\" where bar='foo'", ep.quote { |x| "'foo'" })
|
106
106
|
|
107
|
-
|
108
|
-
|
107
|
+
ep = Epoxy.new("select * from E\"''foo''\" where bar=?")
|
108
|
+
assert_equal("select * from E\"''foo''\" where bar='foo'", ep.quote { |x| "'foo'" })
|
109
109
|
|
110
|
-
|
111
|
-
|
110
|
+
ep = Epoxy.new("select * from E\"\\''foo''\" where bar=?")
|
111
|
+
assert_equal("select * from E\"\\''foo''\" where bar='foo'", ep.quote { |x| "'foo'" })
|
112
112
|
|
113
|
-
|
114
|
-
|
113
|
+
ep = Epoxy.new("select * from E\"\\''foo\\''\" where bar=?")
|
114
|
+
assert_equal("select * from E\"\\''foo\\''\" where bar='foo'", ep.quote { |x| "'foo'" })
|
115
115
|
|
116
|
-
|
117
|
-
|
118
|
-
|
116
|
+
ep = Epoxy.new("select * from foo where bar='?'")
|
117
|
+
assert_equal("select * from foo where bar='?'", ep.quote { |x| "'foo'" })
|
118
|
+
end
|
119
119
|
|
120
|
-
|
121
|
-
|
122
|
-
-- a comment
|
120
|
+
def test_05_comments
|
121
|
+
ep = Epoxy.new(%Q{
|
122
|
+
-- a comment?!
|
123
123
|
select * from foo where bar=?
|
124
124
|
}.strip)
|
125
125
|
|
126
|
-
|
127
|
-
-- a comment
|
126
|
+
assert_equal(%Q{
|
127
|
+
-- a comment?!
|
128
128
|
select * from foo where bar='foo'
|
129
129
|
}.strip, ep.quote { |x| "'foo'" })
|
130
|
-
|
131
|
-
|
130
|
+
|
131
|
+
ep = Epoxy.new(%Q{
|
132
|
+
// a comment?!
|
133
|
+
select * from foo where bar=?
|
134
|
+
}.strip)
|
135
|
+
|
136
|
+
assert_equal(%Q{
|
137
|
+
// a comment?!
|
138
|
+
select * from foo where bar='foo'
|
139
|
+
}.strip, ep.quote { |x| "'foo'" })
|
140
|
+
|
141
|
+
ep = Epoxy.new(%Q{
|
132
142
|
# a comment!
|
133
143
|
select * from foo where bar=?
|
134
144
|
}.strip, %r{#})
|
135
|
-
|
136
|
-
|
145
|
+
|
146
|
+
assert_equal(%Q{
|
137
147
|
# a comment!
|
138
148
|
select * from foo where bar='foo'
|
139
149
|
}.strip, ep.quote { |x| "'foo'" })
|
140
150
|
|
141
|
-
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_06_named_binds
|
154
|
+
binds = { 0 => "test", :foo => 'bar', "bar" => 'baz', "void" => 'unused' }
|
155
|
+
yarrr = proc { |x| "'#{binds[x] || binds[x.to_s]}'" }
|
156
|
+
|
157
|
+
ep = Epoxy.new("select * from 'foo' where bar=?foo and baz=?bar")
|
158
|
+
assert_equal(
|
159
|
+
"select * from 'foo' where bar='bar' and baz='baz'",
|
160
|
+
ep.quote(binds, &yarrr)
|
161
|
+
)
|
162
|
+
|
163
|
+
ep = Epoxy.new("select * from 'foo' where bar='foo ?bar' and baz=?bar")
|
164
|
+
assert_equal(
|
165
|
+
"select * from 'foo' where bar='foo ?bar' and baz='baz'",
|
166
|
+
ep.quote(binds, &yarrr)
|
167
|
+
)
|
168
|
+
|
169
|
+
ep = Epoxy.new("select * from 'foo' where bar=?foo and baz=?")
|
170
|
+
assert_equal(
|
171
|
+
"select * from 'foo' where bar='bar' and baz='test'",
|
172
|
+
ep.quote(binds, &yarrr)
|
173
|
+
)
|
174
|
+
|
175
|
+
ep = Epoxy.new("select * from 'foo' where bar='?foo' and baz='?baz'")
|
176
|
+
assert_equal(
|
177
|
+
"select * from 'foo' where bar='?foo' and baz='?baz'",
|
178
|
+
ep.quote(binds, &yarrr)
|
179
|
+
)
|
180
|
+
|
181
|
+
ep = Epoxy.new("select * from 'foo' where bar=?foo and baz=?foo")
|
182
|
+
assert_equal(
|
183
|
+
"select * from 'foo' where bar='bar' and baz='bar'",
|
184
|
+
ep.quote(binds, &yarrr)
|
185
|
+
)
|
186
|
+
|
187
|
+
ep = Epoxy.new("select * from 'foo' where bar=??")
|
188
|
+
assert_equal(
|
189
|
+
"select * from 'foo' where bar=?",
|
190
|
+
ep.quote(binds, &yarrr)
|
191
|
+
)
|
192
|
+
|
193
|
+
ep = Epoxy.new("select * from 'foo' where bar=??bar")
|
194
|
+
assert_equal(
|
195
|
+
"select * from 'foo' where bar=?bar",
|
196
|
+
ep.quote(binds, &yarrr)
|
197
|
+
)
|
198
|
+
|
199
|
+
ep = Epoxy.new("select * from 'foo' where bar=?notfound")
|
200
|
+
assert_equal(
|
201
|
+
"select * from 'foo' where bar=?notfound",
|
202
|
+
ep.quote(binds, &yarrr)
|
203
|
+
)
|
204
|
+
end
|
205
|
+
|
142
206
|
end
|
207
|
+
|
208
|
+
# vim: syntax=ruby ts=2 et sw=2 sts=2
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epoxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Erik Hollensbe
|
@@ -14,21 +15,37 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2010-
|
18
|
+
date: 2010-07-12 00:00:00 -04:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
22
|
name: rdoc
|
22
23
|
prerelease: false
|
23
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
24
26
|
requirements:
|
25
27
|
- - ">="
|
26
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
27
30
|
segments:
|
28
31
|
- 0
|
29
32
|
version: "0"
|
30
33
|
type: :development
|
31
34
|
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: test-unit
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id002
|
32
49
|
description: Parse binds in SQL or any other data query language, quote, even configure for client-side binding. It all works!
|
33
50
|
email: erik@hollensbe.org
|
34
51
|
executables: []
|
@@ -58,23 +75,27 @@ rdoc_options:
|
|
58
75
|
require_paths:
|
59
76
|
- lib
|
60
77
|
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
61
79
|
requirements:
|
62
80
|
- - ">="
|
63
81
|
- !ruby/object:Gem::Version
|
82
|
+
hash: 3
|
64
83
|
segments:
|
65
84
|
- 0
|
66
85
|
version: "0"
|
67
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
68
88
|
requirements:
|
69
89
|
- - ">="
|
70
90
|
- !ruby/object:Gem::Version
|
91
|
+
hash: 3
|
71
92
|
segments:
|
72
93
|
- 0
|
73
94
|
version: "0"
|
74
95
|
requirements: []
|
75
96
|
|
76
97
|
rubyforge_project:
|
77
|
-
rubygems_version: 1.3.
|
98
|
+
rubygems_version: 1.3.7
|
78
99
|
signing_key:
|
79
100
|
specification_version: 3
|
80
101
|
summary: A binding API for query languages that does not depend on any specific database.
|