querylet 1.1.0 → 1.2.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.
- checksums.yaml +4 -4
- data/lib/querylet/context.rb +19 -8
- data/lib/querylet/template.rb +13 -7
- data/lib/querylet/tree.rb +4 -2
- data/lib/querylet/version.rb +1 -1
- data/lib/querylet.rb +4 -7
- data/spec/querylet_spec.rb +12 -38
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89d1a03b5028328b79f0d575c2aeadec57ebf47f1d743fe5722b4c4a4b165fc6
|
4
|
+
data.tar.gz: 5db0889a5a8fc5a21aca04bb27f406522a22de46f91ef1fd95af5f0137983156
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 296e9452984b0099681d8567ac291e1c71e9ee62cb706d96668927c0e2cab8062ac54f0c1186eed56bdf2e0a93ee463602a75928525fcb1d02eefe3089fae665
|
7
|
+
data.tar.gz: 3b1f422e8cabd1ee7dfbb977df2e3b77ed4d28a6b5bb93f0007cf20aff608737276a8504ca40239671dcd8b66d4e4f8bacaf2a8db92a62d746c200a5e7d7f687
|
data/lib/querylet/context.rb
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
module Querylet
|
2
|
-
|
2
|
+
class Context
|
3
|
+
def initialize(querylet, data)
|
4
|
+
@querylet = querylet
|
5
|
+
@data = data
|
6
|
+
end
|
7
|
+
|
3
8
|
def get(value)
|
4
9
|
@data.merge(locals)[value.to_sym]
|
5
10
|
end
|
@@ -12,15 +17,21 @@ module Querylet
|
|
12
17
|
hash.map { |k, v| add_item(k, v) }
|
13
18
|
end
|
14
19
|
|
15
|
-
def
|
16
|
-
|
20
|
+
def get_partial name, dot_path, data
|
21
|
+
@querylet.get_partial name, dot_path, @data.merge(data)
|
22
|
+
end
|
17
23
|
|
18
|
-
|
19
|
-
|
20
|
-
|
24
|
+
# This never appears to be used
|
25
|
+
# commented out unless I find a use for it.
|
26
|
+
#def with_temporary_context(args = {})
|
27
|
+
# saved = args.keys.collect { |key| [key, get(key.to_s)] }.to_h
|
21
28
|
|
22
|
-
|
23
|
-
|
29
|
+
# add_items(args)
|
30
|
+
# block_result = yield
|
31
|
+
# locals.merge!(saved)
|
32
|
+
|
33
|
+
# block_result
|
34
|
+
#end
|
24
35
|
|
25
36
|
private
|
26
37
|
|
data/lib/querylet/template.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative 'context'
|
2
2
|
|
3
3
|
module Querylet
|
4
4
|
class Template
|
@@ -7,13 +7,19 @@ module Querylet
|
|
7
7
|
@ast = ast
|
8
8
|
end
|
9
9
|
|
10
|
+
# In Ruby, the call method is used to invoke a block, proc, or lambda,
|
11
|
+
# which are all different types of callable objects in Ruby.
|
12
|
+
#
|
13
|
+
# This is how querylet will get called in a developers code.
|
14
|
+
#
|
15
|
+
# querylet = Querylet::Querylet.new path: 'path/to/sql'
|
16
|
+
# querylet.compile(template).call(data)
|
17
|
+
# @args is the initial values passed to the template
|
10
18
|
def call(args = nil)
|
11
|
-
|
12
|
-
@querylet.set_context(args)
|
13
|
-
end
|
19
|
+
ctx = Context.new(@querylet, args)
|
14
20
|
|
15
21
|
# AST should return a Querylet::Tree and call its eval method
|
16
|
-
@ast.eval(
|
22
|
+
@ast.eval(ctx)
|
17
23
|
end
|
18
|
-
end
|
19
|
-
end
|
24
|
+
end # Template
|
25
|
+
end # Querylet
|
data/lib/querylet/tree.rb
CHANGED
@@ -36,10 +36,12 @@ module Querylet
|
|
36
36
|
|
37
37
|
class Partial < TreeItem.new(:partial, :path, :parameters)
|
38
38
|
def _eval(context)
|
39
|
+
data = {}
|
39
40
|
[parameters].flatten.map(&:values).map do |vals|
|
40
|
-
|
41
|
+
# we have to set it as sym so it overrides correctly
|
42
|
+
data[vals.first.to_sym] = vals.last._eval(context)
|
41
43
|
end
|
42
|
-
content = context.get_partial(partial.to_s, path)
|
44
|
+
content = context.get_partial(partial.to_s, path, data)
|
43
45
|
if partial == 'array'
|
44
46
|
<<-HEREDOC.chomp
|
45
47
|
(SELECT COALESCE(array_to_json(array_agg(row_to_json(array_row))),'[]'::json) FROM (
|
data/lib/querylet/version.rb
CHANGED
data/lib/querylet.rb
CHANGED
@@ -6,7 +6,6 @@ require_relative 'querylet/context'
|
|
6
6
|
|
7
7
|
module Querylet
|
8
8
|
class Querylet
|
9
|
-
include Context
|
10
9
|
def initialize(path:)
|
11
10
|
@sql_path = path
|
12
11
|
end
|
@@ -19,17 +18,15 @@ module Querylet
|
|
19
18
|
#puts deep_nested_hash
|
20
19
|
abstract_syntax_tree = transform.apply deep_nested_hash
|
21
20
|
#puts abstract_syntax_tree
|
22
|
-
Template.new self, abstract_syntax_tree
|
23
|
-
end
|
24
21
|
|
25
|
-
|
26
|
-
|
22
|
+
# Querylet::Template
|
23
|
+
Template.new self, abstract_syntax_tree
|
27
24
|
end
|
28
25
|
|
29
|
-
def get_partial name, dot_path
|
26
|
+
def get_partial name, dot_path, data={}
|
30
27
|
path = @sql_path + '/' + dot_path.to_s.split('.').join('/') + '.sql'
|
31
28
|
template = File.read(path).to_s.chomp
|
32
|
-
self.compile(template).call(
|
29
|
+
self.compile(template).call(data)
|
33
30
|
end
|
34
31
|
end # class Querylet
|
35
32
|
end # module Querylet
|
data/spec/querylet_spec.rb
CHANGED
@@ -23,66 +23,40 @@ describe Querylet::Querylet do
|
|
23
23
|
|
24
24
|
context 'helpers' do
|
25
25
|
it 'include' do
|
26
|
-
query =
|
27
|
-
(SELECT
|
28
|
-
users.email
|
29
|
-
FROM users
|
30
|
-
WHERE
|
31
|
-
users.id = 1) as email
|
32
|
-
SQL
|
26
|
+
query = "(SELECT users.email FROM users WHERE users.id = 1) as email"
|
33
27
|
expect(evaluate("({{> include 'examples.include' }}) as email")).to eq(query)
|
34
28
|
end
|
35
29
|
|
36
30
|
it 'include with variables' do
|
37
|
-
query =
|
38
|
-
(SELECT
|
39
|
-
users.email
|
40
|
-
FROM users
|
41
|
-
WHERE
|
42
|
-
users.id = 100) as email
|
43
|
-
SQL
|
31
|
+
query = "(SELECT users.email FROM users WHERE users.id = 100) as email"
|
44
32
|
template = "({{> include 'examples.include_with_vars' }}) as email"
|
45
33
|
expect(evaluate(template, {id: 100})).to eq(query)
|
46
34
|
end
|
47
35
|
|
48
36
|
it 'include with parameters' do
|
49
|
-
query =
|
50
|
-
(SELECT
|
51
|
-
users.email,
|
52
|
-
'andrew' as name
|
53
|
-
FROM users
|
54
|
-
WHERE
|
55
|
-
users.id = 200) as email
|
56
|
-
SQL
|
37
|
+
query = "(SELECT users.email, 'andrew' as name FROM users WHERE users.id = 200) as email"
|
57
38
|
template = "({{> include 'examples.include_with_params' id='200' name='andrew' }}) as email"
|
58
39
|
expect(evaluate(template, {id: 100})).to eq(query)
|
59
40
|
end
|
60
41
|
|
61
42
|
it 'include with parameters variable' do
|
62
|
-
query =
|
63
|
-
(SELECT
|
64
|
-
users.email
|
65
|
-
FROM users
|
66
|
-
WHERE
|
67
|
-
users.id = 300) as email
|
68
|
-
SQL
|
43
|
+
query = "(SELECT users.email FROM users WHERE users.id = 300) as email"
|
69
44
|
template = "({{> include 'examples.include_with_params_vars' id={{user_id}} name='andrew' }}) as email"
|
70
45
|
expect(evaluate(template, {user_id: 300})).to eq(query)
|
71
46
|
end
|
72
47
|
|
73
48
|
it 'include with parameters filter' do
|
74
|
-
query =
|
75
|
-
(SELECT
|
76
|
-
users.email,
|
77
|
-
'Andrew' as name
|
78
|
-
FROM users
|
79
|
-
WHERE
|
80
|
-
users.id = 100) as email
|
81
|
-
SQL
|
49
|
+
query = "(SELECT users.email, 'Andrew' as name FROM users WHERE users.id = 100) as email"
|
82
50
|
template = "({{> include 'examples.include_with_params_filter' name={{str my_name}} }}) as email"
|
83
51
|
expect(evaluate(template, {my_name: "Andrew", id: 100})).to eq(query)
|
84
52
|
end
|
85
53
|
|
54
|
+
it 'variable overrides' do
|
55
|
+
query = "(SELECT questions.id, (SELECT que.id FROM questions que WHERE que.id = 555) as sub FROM questions WHERE questions.id = 100"
|
56
|
+
template = "(SELECT questions.id, ({{> include 'examples.vars_overrides_include' xid={{sub_id}} }}) as sub FROM questions WHERE questions.id = {{xid}}"
|
57
|
+
expect(evaluate(template, {sub_id: 555, xid: 100})).to eq(query)
|
58
|
+
end
|
59
|
+
|
86
60
|
it 'object' do
|
87
61
|
query = <<-SQL.chomp
|
88
62
|
(SELECT COALESCE(row_to_json(object_row),'{}'::json) FROM (
|
@@ -177,5 +151,5 @@ SQL
|
|
177
151
|
end
|
178
152
|
|
179
153
|
end # context 'helpers'
|
180
|
-
|
154
|
+
end # context 'evaluating'
|
181
155
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: querylet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ExamPro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parslet
|