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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/erb_sql_templates.rb +77 -0
  3. 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: