serbea 0.8.1 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -2
- data/README.md +1 -1
- data/lib/serbea.rb +1 -1
- data/lib/serbea/helpers.rb +5 -4
- data/lib/serbea/pipeline.rb +20 -6
- data/lib/serbea/template_engine.rb +2 -2
- data/lib/version.rb +1 -1
- data/serbea.gemspec +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 352c314f5f5a9b6df23933e1b379af39617c82c9b583f4c0703480a5f71df498
|
4
|
+
data.tar.gz: 364a353dba20ce3af4bcc071247477ec6dfa6f95c15bb94c88677520344a3cf1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6bcdd89d15300e24e051f68de0d87899bec18c9f304162e3b667afc7c8a420ab5978e5eb91ab40f8dfd4201375a7fab769d9419a19562196e3ba93b85692e262
|
7
|
+
data.tar.gz: 8ba0cddf305d712c3e970adb06979e27f426aae797b2d99702f844e6e5c9248d34a96e35238134314da783e5fbd3de93b56cf7d5701ecc909690719393aa05fc
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -13,7 +13,7 @@ Serbea combines the best ideas from "brace-style" template languages such as Liq
|
|
13
13
|
* Supports every convention of ERB and builds upon it with new features (which is why it's "awesomer!").
|
14
14
|
* Builtin frontmatter support so you can access the variables written into the top YAML within your templates. In any Rails view, including layouts, you'll have access to the `@frontmatter` ivar which is a merged `HashWithDotAccess::Hash` with data from any part of the view tree (partials, pages, layout).
|
15
15
|
* The filters accessible within Serbea templates are either helpers (where the variable gets passed as the first argument) or instance methods of the variable itself, so you can build extremely expressive pipelines that take advantage of the code you already know and love. (For example, in Rails you could write `{{ "My Link" | link_to: route_path }}`).
|
16
|
-
* The `Serbea::Pipeline.exec` method lets you pass a pipeline template in, along with an optional input value or included helpers module, and you'll get the output as a object of any type (not converted to a string like in traditional templates). For example: `Serbea::Pipeline.exec("
|
16
|
+
* The `Serbea::Pipeline.exec` method lets you pass a pipeline template in, along with an optional input value or included helpers module, and you'll get the output as a object of any type (not converted to a string like in traditional templates). For example: `Serbea::Pipeline.exec("arr |> map: ->(i) { i * 10 }", arr: [1,2,3])` will return `[10, 20, 30]`.
|
17
17
|
|
18
18
|
## What It Looks Like
|
19
19
|
|
data/lib/serbea.rb
CHANGED
data/lib/serbea/helpers.rb
CHANGED
@@ -8,11 +8,12 @@ module Serbea
|
|
8
8
|
|
9
9
|
def capture(obj = nil, &block)
|
10
10
|
previous_buffer_state = @_erbout
|
11
|
-
@_erbout = Serbea::
|
11
|
+
@_erbout = Serbea::OutputBuffer.new
|
12
12
|
|
13
13
|
# For compatibility with ActionView, not used by Bridgetown normally
|
14
14
|
previous_ob_state = @output_buffer
|
15
|
-
@output_buffer = Serbea::
|
15
|
+
@output_buffer = Serbea::OutputBuffer.new
|
16
|
+
|
16
17
|
|
17
18
|
result = instance_exec(obj, &block)
|
18
19
|
if @output_buffer != ""
|
@@ -32,11 +33,11 @@ module Serbea
|
|
32
33
|
def helper(name, &helper_block)
|
33
34
|
self.class.define_method(name) do |*args, &block|
|
34
35
|
previous_buffer_state = @_erbout
|
35
|
-
@_erbout = Serbea::
|
36
|
+
@_erbout = Serbea::OutputBuffer.new
|
36
37
|
|
37
38
|
# For compatibility with ActionView, not used by Bridgetown normally
|
38
39
|
previous_ob_state = @output_buffer
|
39
|
-
@output_buffer = Serbea::
|
40
|
+
@output_buffer = Serbea::OutputBuffer.new
|
40
41
|
|
41
42
|
result = helper_block.call(*args, &block)
|
42
43
|
if @output_buffer != ""
|
data/lib/serbea/pipeline.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
require "active_support/core_ext/string/output_safety"
|
2
|
+
require "active_support/core_ext/object/blank"
|
2
3
|
|
3
4
|
module Serbea
|
4
5
|
class Pipeline
|
5
|
-
def self.exec(template,
|
6
|
+
def self.exec(template, locals = {}, include_helpers: nil, **kwargs)
|
6
7
|
anon = Class.new do
|
7
8
|
include Serbea::Helpers
|
8
9
|
|
9
|
-
attr_accessor :
|
10
|
+
attr_accessor :output
|
10
11
|
end
|
11
12
|
|
12
13
|
if include_helpers
|
@@ -14,12 +15,11 @@ module Serbea
|
|
14
15
|
end
|
15
16
|
|
16
17
|
pipeline_obj = anon.new
|
17
|
-
pipeline_obj.input = input unless no_input_passed
|
18
18
|
|
19
19
|
full_template = "{{ #{template} | assign_to: :output }}"
|
20
20
|
|
21
21
|
tmpl = Tilt::SerbeaTemplate.new { full_template }
|
22
|
-
tmpl.render(pipeline_obj)
|
22
|
+
tmpl.render(pipeline_obj, locals.presence || kwargs)
|
23
23
|
|
24
24
|
pipeline_obj.output
|
25
25
|
end
|
@@ -54,8 +54,9 @@ module Serbea
|
|
54
54
|
@value_methods_denylist ||= Set.new
|
55
55
|
end
|
56
56
|
|
57
|
-
def initialize(
|
58
|
-
@
|
57
|
+
def initialize(binding, value)
|
58
|
+
@binding = binding
|
59
|
+
@context = binding.receiver
|
59
60
|
@value = value
|
60
61
|
end
|
61
62
|
|
@@ -83,6 +84,19 @@ module Serbea
|
|
83
84
|
else
|
84
85
|
@value = @context.send(name, @value, *args)
|
85
86
|
end
|
87
|
+
elsif @binding.local_variables.include?(name)
|
88
|
+
var = @binding.local_variable_get(name)
|
89
|
+
if var.respond_to?(:call)
|
90
|
+
unless kwargs.empty?
|
91
|
+
@value = var.call(@value, *args, **kwargs)
|
92
|
+
else
|
93
|
+
@value = var.call(@value, *args)
|
94
|
+
end
|
95
|
+
else
|
96
|
+
"Serbea warning: Filter #{name} does not respond to call".tap do |warning|
|
97
|
+
self.class.raise_on_missing_filters ? raise(warning) : STDERR.puts(warning)
|
98
|
+
end
|
99
|
+
end
|
86
100
|
else
|
87
101
|
"Serbea warning: Filter not found: #{name}".tap do |warning|
|
88
102
|
self.class.raise_on_missing_filters ? raise(warning) : STDERR.puts(warning)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "strscan"
|
2
2
|
|
3
3
|
module Serbea
|
4
|
-
class
|
4
|
+
class OutputBuffer < String
|
5
5
|
def concat_to_s(input)
|
6
6
|
concat input.to_s
|
7
7
|
end
|
@@ -125,7 +125,7 @@ module Serbea
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
-
segments[0] = "pipeline(
|
128
|
+
segments[0] = "pipeline(binding, (#{segments[0].strip}))"
|
129
129
|
segments[1..-1].each_with_index do |segment, index|
|
130
130
|
filter, args = segment.strip.match(/([^ :]*)(.*)/m).captures
|
131
131
|
segments[index + 1] = ".filter(:" + filter
|
data/lib/version.rb
CHANGED
data/serbea.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.require_paths = ["lib"]
|
18
18
|
|
19
19
|
spec.add_runtime_dependency("activesupport", "~> 6.0")
|
20
|
-
spec.add_runtime_dependency("erubi", "
|
20
|
+
spec.add_runtime_dependency("erubi", ">= 1.10")
|
21
21
|
spec.add_runtime_dependency("hash_with_dot_access", "~> 1.1")
|
22
22
|
spec.add_runtime_dependency("tilt", "~> 2.0")
|
23
23
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: serbea
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bridgetown Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: erubi
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.10'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.10'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: hash_with_dot_access
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|