erb_sql_templates 0.1
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 +7 -0
- data/lib/erb_sql_templates.rb +77 -0
- metadata +46 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8aa544ee1e549c64ddefaefb5f956036ebd5af2e
|
4
|
+
data.tar.gz: 70ae407e9b50cc6397cee8b8d881426596e319c7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2f781347ca13c2ff6c6633310a145bf9b6a9e96531d76bf7fcfd5b78b39bbafc4d9b1d979f879eff65ae332559fbd01a96d891e176b64d9c49e310d467ca3fc0
|
7
|
+
data.tar.gz: 03bb3043452f052d5f70a17db6d19abbb1f1714f38bb00fe2f85320b4f55773c28934d79460f6d8711cc9a7e20b64adfce79f24e541c2412a44d44a08827a7e2
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
# Name template files as `some_query.sql.erb` -- Use <%= h my_var %> - h helper will sanitize
|
5
|
+
# est = ErbSqlTemplates.new(Rails.root.to_s + '/db/sql', ActiveRecord::Base.connection)
|
6
|
+
# est.execute(:some_sql, :my_var => 'Foo!')
|
7
|
+
# sql = est.render(:some_sql, :my_var => 'Foo!')
|
8
|
+
|
9
|
+
class ErbSqlTemplates
|
10
|
+
|
11
|
+
def initialize(dir, connection)
|
12
|
+
@directory = dir
|
13
|
+
@connection = connection
|
14
|
+
end
|
15
|
+
|
16
|
+
def execute(name, **data)
|
17
|
+
sql = render(name, data)
|
18
|
+
@connection.execute(sql)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Returns built sql
|
22
|
+
def render(template_name, **data)
|
23
|
+
scope = TemplateScope.new(@connection, data)
|
24
|
+
erb_string = load_template(template_name)
|
25
|
+
renderer = ERB.new(erb_string, 0, '>') # thread level zero, and '>' means no new lines for <%= %>
|
26
|
+
return renderer.result(scope.get_binding)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns string of the filename
|
30
|
+
def locate_template(name)
|
31
|
+
results = Dir.glob(@directory + "/#{name}.{sql.erb,erb}")
|
32
|
+
if results.length > 1
|
33
|
+
raise Exception.new("Too many templates have the name '#{name}'. ")
|
34
|
+
elsif results.length == 0
|
35
|
+
raise Exception.new("Cannot find template '#{name}.erb' or '#{name}.sql.erb' in the directory '#{@directory}'.")
|
36
|
+
else
|
37
|
+
return results.first
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# returns string of the template
|
42
|
+
def load_template(name)
|
43
|
+
filename = locate_template(name)
|
44
|
+
File.read(filename)
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
class TemplateScope < OpenStruct
|
49
|
+
def initialize(connection, hash)
|
50
|
+
@connection = connection
|
51
|
+
super hash
|
52
|
+
end
|
53
|
+
|
54
|
+
# helper for sanitizing sql inputs
|
55
|
+
def h(value)
|
56
|
+
return @connection.quote(value)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Expose private binding() method.
|
60
|
+
def get_binding
|
61
|
+
binding()
|
62
|
+
end
|
63
|
+
|
64
|
+
# Raise exeption if you try to use a property that does not exist.
|
65
|
+
def method_missing(prop, *args)
|
66
|
+
if prop.to_s.include?('=') || (@table != nil && (@table.has_key?(prop) || self.respond_to?(prop)) )
|
67
|
+
super
|
68
|
+
else
|
69
|
+
raise NoMethodError, "No property `#{prop}` set for this SQL.", caller(1)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
|
metadata
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: erb_sql_templates
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tyler Roberts
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-25 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Utility to render and execute `.sql.erb` templates that have been customized
|
14
|
+
with ERB.
|
15
|
+
email: tyler@westernleap.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/erb_sql_templates.rb
|
21
|
+
homepage: http://github.com/bdevel/erb_sql_templates
|
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.2.2
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: Customize large SQL queries with ERB.
|
45
|
+
test_files: []
|
46
|
+
has_rdoc:
|