turbostreamer 1.3.0 → 1.9.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/README.md +13 -0
- data/ext/actionview/streaming_template_renderer.rb +5 -4
- data/lib/turbostreamer.rb +19 -7
- data/lib/turbostreamer/encoders/oj.rb +3 -1
- data/lib/turbostreamer/handler.rb +6 -2
- data/lib/turbostreamer/template.rb +45 -30
- data/lib/turbostreamer/version.rb +1 -1
- metadata +14 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5560f65eafd9983a08cc6cd0745101c0909d923dbca5cb012b9f5b884446de37
|
4
|
+
data.tar.gz: 14697af3049c50e3504e46e66a0209cf694c450ba95ac84fa4b723038126460d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 894d614c59b3b002130c00519a5b687cc0814c4bd5358c033858f590f3a5e6082dec8b220cba91b59114eb1236129f1f166f27eb276c4ddbfab7bd796e81bacf
|
7
|
+
data.tar.gz: f0d5a68cf0e48ce0e73f50b879d69dc21fcdd6ed35110b4d8498255eeb33f35fb1b1326ff13619dee729adaca4a79ed787ced23f471931112bef5cf2657c1c03
|
data/README.md
CHANGED
@@ -299,12 +299,25 @@ TurboStreamer.encode(encoder: TurboStreamer::WankelEncoder)
|
|
299
299
|
TurboStreamer.encode(encoder: MyEncoder)
|
300
300
|
```
|
301
301
|
|
302
|
+
# Setting the default encoder and options
|
302
303
|
If you need explicitly set the default:
|
303
304
|
|
304
305
|
```ruby
|
305
306
|
TurboStreamer.set_default_encoder(:json, :oj)
|
306
307
|
```
|
307
308
|
|
309
|
+
You can also set default options to pass to the encoder if needed:
|
310
|
+
|
311
|
+
```ruby
|
312
|
+
TurboStreamer.set_default_encoder(:json, :oj, buffer_size: 1_024)
|
313
|
+
```
|
314
|
+
|
315
|
+
You may also just set the default options for an encoder:
|
316
|
+
|
317
|
+
```ruby
|
318
|
+
TurboStreamer.set_default_encoder_options(:oj, buffer_size: 2_048)
|
319
|
+
```
|
320
|
+
|
308
321
|
The idea was to also support [MessagePack](http://msgpack.org/), hence requring
|
309
322
|
the mime type when setting a default encoder.
|
310
323
|
|
@@ -1,17 +1,18 @@
|
|
1
1
|
module ActionView
|
2
2
|
class StreamingTemplateRenderer < TemplateRenderer
|
3
3
|
|
4
|
-
def render_template(template, layout_name = nil, locals = {}) #:nodoc:
|
5
|
-
|
4
|
+
def render_template(view, template, layout_name = nil, locals = {}) #:nodoc:
|
5
|
+
template_supports_streaming = (layout_name && template.supports_streaming?) || template.handler == TurboStreamer::Handler
|
6
|
+
return [super.body] unless layout_name && template_supports_streaming
|
6
7
|
|
7
8
|
locals ||= {}
|
8
9
|
layout = layout_name && find_layout(layout_name, locals.keys, [formats.first])
|
9
10
|
|
10
11
|
Body.new do |buffer|
|
11
12
|
if template.handler == TurboStreamer::Handler
|
12
|
-
delayed_render_json(buffer, template, layout,
|
13
|
+
delayed_render_json(buffer, template, layout, view, locals)
|
13
14
|
else
|
14
|
-
delayed_render(buffer, template, layout,
|
15
|
+
delayed_render(buffer, template, layout, view, locals)
|
15
16
|
end
|
16
17
|
end
|
17
18
|
end
|
data/lib/turbostreamer.rb
CHANGED
@@ -6,13 +6,13 @@ class TurboStreamer
|
|
6
6
|
|
7
7
|
BLANK = ::Object.new
|
8
8
|
|
9
|
-
|
10
9
|
ENCODERS = {
|
11
10
|
json: {oj: 'Oj', wankel: 'Wankel'},
|
12
11
|
msgpack: {msgpack: 'MessagePack'}
|
13
12
|
}
|
14
13
|
|
15
14
|
@@default_encoders = {}
|
15
|
+
@@encoder_options = Hash.new { |h, k| h[k] = {} }
|
16
16
|
@@key_formatter = nil
|
17
17
|
|
18
18
|
undef_method :==
|
@@ -24,15 +24,22 @@ class TurboStreamer
|
|
24
24
|
|
25
25
|
def initialize(options = {})
|
26
26
|
@output_buffer = options[:output_buffer] || ::StringIO.new
|
27
|
-
|
28
|
-
TurboStreamer.get_encoder(options[:mime] || :json, options[:encoder])
|
27
|
+
if options[:encoder].is_a?(Symbol)
|
28
|
+
@encoder = TurboStreamer.get_encoder(options[:mime] || :json, options[:encoder])
|
29
|
+
@encoder_options = @@encoder_options[options[:encoder]]
|
29
30
|
elsif options[:encoder].nil?
|
30
|
-
TurboStreamer.default_encoder_for(options[:mime] || :json)
|
31
|
+
@encoder = TurboStreamer.default_encoder_for(options[:mime] || :json)
|
32
|
+
if encoder_symbol = ENCODERS[options[:mime] || :json].find { |k, v| v == @encoder.name.delete_prefix('TurboStreamer::').delete_suffix('Encoder') }&.first
|
33
|
+
@encoder_options = @@encoder_options[encoder_symbol]
|
34
|
+
else
|
35
|
+
@encoder_options = {}
|
36
|
+
end
|
31
37
|
else
|
32
|
-
options[:encoder]
|
38
|
+
@encoder = options[:encoder]
|
39
|
+
@encoder_options = {}
|
33
40
|
end
|
34
|
-
@encoder = @encoder.new(@output_buffer)
|
35
41
|
|
42
|
+
@encoder = @encoder.new(@output_buffer, @encoder_options)
|
36
43
|
@key_formatter = options.fetch(:key_formatter){ @@key_formatter ? @@key_formatter.clone : nil }
|
37
44
|
|
38
45
|
yield self if ::Kernel.block_given?
|
@@ -221,12 +228,17 @@ class TurboStreamer
|
|
221
228
|
@@key_formatter = formatter
|
222
229
|
end
|
223
230
|
|
224
|
-
def self.set_default_encoder(mime, encoder)
|
231
|
+
def self.set_default_encoder(mime, encoder, default_options={})
|
225
232
|
if encoder.is_a?(Symbol)
|
226
233
|
@@default_encoders[mime] = get_encoder(mime, encoder)
|
227
234
|
else
|
228
235
|
@@default_encoders[mime] = encoder
|
229
236
|
end
|
237
|
+
@@encoder_options[encoder] = default_options
|
238
|
+
end
|
239
|
+
|
240
|
+
def self.set_default_encoder_options(encoder, options)
|
241
|
+
@@encoder_options[encoder] = options
|
230
242
|
end
|
231
243
|
|
232
244
|
def self.get_encoder(mime, key)
|
@@ -5,11 +5,13 @@ class TurboStreamer
|
|
5
5
|
|
6
6
|
attr_reader :output
|
7
7
|
|
8
|
+
BUFFER_SIZE = 4096
|
9
|
+
|
8
10
|
def initialize(io, options={})
|
9
11
|
@stack = []
|
10
12
|
@indexes = []
|
11
13
|
|
12
|
-
@options = {mode: :json}.merge(options)
|
14
|
+
@options = {mode: :json, buffer_size: BUFFER_SIZE}.merge(options)
|
13
15
|
|
14
16
|
@output = io
|
15
17
|
@stream_writer = ::Oj::StreamWriter.new(io, @options)
|
@@ -12,9 +12,13 @@ class TurboStreamer
|
|
12
12
|
true
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
# TODO: setting source=nil is for rails 5.x compatability, once unsppored
|
16
|
+
# source can be a required param and
|
17
|
+
# `source = template.source if source.nil?` can be removed
|
18
|
+
def self.call(template, source=nil)
|
19
|
+
source = template.source if source.nil?
|
16
20
|
# this juggling is required to keep line numbers right in the error
|
17
|
-
%{__already_defined = defined?(json); json||=TurboStreamer::Template.new(self, output_buffer: output_buffer || ActionView::OutputBuffer.new); #{
|
21
|
+
%{__already_defined = defined?(json); json||=TurboStreamer::Template.new(self, output_buffer: output_buffer || ActionView::OutputBuffer.new); #{source}
|
18
22
|
json.target! unless (__already_defined && __already_defined != "method")}
|
19
23
|
end
|
20
24
|
|
@@ -106,36 +106,58 @@ class TurboStreamer::Template < TurboStreamer
|
|
106
106
|
# json.cache_if! !admin?, @person, expires_in: 10.minutes do
|
107
107
|
# json.extract! @person, :name, :age
|
108
108
|
# end
|
109
|
-
def cache_if!(condition, *args)
|
110
|
-
condition ? cache!(*args,
|
109
|
+
def cache_if!(condition, *args, &block)
|
110
|
+
condition ? cache!(*args, &block) : yield
|
111
111
|
end
|
112
112
|
|
113
113
|
private
|
114
114
|
|
115
115
|
def _render_partial_with_options(options)
|
116
|
-
|
116
|
+
|
117
117
|
options.reverse_merge! ::TurboStreamer::Template.template_lookup_options
|
118
|
-
as = options[:as]
|
118
|
+
as = options[:as]&.to_sym
|
119
|
+
options[:locals] ||= {}
|
120
|
+
options[:locals][:json] = self
|
119
121
|
|
120
122
|
if as && options.key?(:collection)
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
123
|
+
# Option 1, nice simple, fast, calls find_template once
|
124
|
+
array! { @context.render(options) }
|
125
|
+
|
126
|
+
# Option 2, the jBuilder way, slow because find_template for every item
|
127
|
+
# in the collection (a method which is known as one of the heaviest parts
|
128
|
+
# of Action View)
|
129
|
+
# as = as.to_sym
|
130
|
+
# collection = options.delete(:collection)
|
131
|
+
# locals = options.delete(:locals)
|
132
|
+
# array! collection do |member|
|
133
|
+
# member_locals = locals.clone
|
134
|
+
# member_locals.merge! collection: collection
|
135
|
+
# member_locals.merge! as => member
|
136
|
+
# _render_partial options.merge(locals: member_locals)
|
137
|
+
# end
|
138
|
+
|
139
|
+
# Option 3, the fastest, haven't looked into precisely why, but would need
|
140
|
+
# to customeize to the rails version
|
141
|
+
# lookup_context = @context.view_renderer.lookup_context
|
142
|
+
# options[:locals][:json] = self
|
143
|
+
# options[:locals][:collection] = options[:collection]
|
144
|
+
#
|
145
|
+
# pr = ActionView::PartialRenderer.new(lookup_context)
|
146
|
+
# pr.send(:setup, @context, options, as, nil)
|
147
|
+
# path = pr.instance_variable_get(:@path)
|
148
|
+
# a, b, c = pr.send(:retrieve_variable, path, as)
|
149
|
+
# template_keys = pr.send(:retrieve_template_keys, a).compact
|
150
|
+
# # + [:"#{a}__counter", :"#{a}_iteration"]
|
151
|
+
# template = pr.send(:find_partial, path, template_keys)
|
152
|
+
# locals = options[:locals]
|
153
|
+
# array! options[:collection] do |member|
|
154
|
+
# locals[as] = member
|
155
|
+
# template.render(@context, locals)
|
156
|
+
# end
|
130
157
|
else
|
131
|
-
|
158
|
+
@context.render(options)
|
132
159
|
end
|
133
160
|
end
|
134
|
-
|
135
|
-
def _render_partial(options)
|
136
|
-
options[:locals].merge! json: self
|
137
|
-
@context.render options
|
138
|
-
end
|
139
161
|
|
140
162
|
def _keys_to_collection_map(collection, options)
|
141
163
|
key = options.delete(:key)
|
@@ -177,7 +199,10 @@ class TurboStreamer::Template < TurboStreamer
|
|
177
199
|
name_options = options.slice(:skip_digest, :virtual_path)
|
178
200
|
key = _fragment_name_with_digest(key, name_options)
|
179
201
|
|
180
|
-
if @context.respond_to?(:
|
202
|
+
if @context.respond_to?(:combined_fragment_cache_key)
|
203
|
+
key = @context.combined_fragment_cache_key(key)
|
204
|
+
elsif @context.respond_to?(:fragment_cache_key)
|
205
|
+
# TODO: remove after droping rails 5.1 support
|
181
206
|
key = @context.fragment_cache_key(key)
|
182
207
|
elsif ::Hash === key
|
183
208
|
key = url_for(key).split('://', 2).last
|
@@ -199,16 +224,6 @@ class TurboStreamer::Template < TurboStreamer
|
|
199
224
|
end
|
200
225
|
end
|
201
226
|
|
202
|
-
def _fragment_name_with_digest(key, options)
|
203
|
-
if @context.respond_to?(:cache_fragment_name)
|
204
|
-
# Current compatibility, fragment_name_with_digest is private again and cache_fragment_name
|
205
|
-
# should be used instead.
|
206
|
-
@context.cache_fragment_name(key, options)
|
207
|
-
else
|
208
|
-
key
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
227
|
def _partial_options?(options)
|
213
228
|
::Hash === options && options.key?(:as) && options.key?(:partial)
|
214
229
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: turbostreamer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Bracy
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 5.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 5.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,16 +70,16 @@ dependencies:
|
|
70
70
|
name: bundler
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: mocha
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,7 +192,7 @@ dependencies:
|
|
192
192
|
- - ">="
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
|
-
description:
|
195
|
+
description:
|
196
196
|
email:
|
197
197
|
- jonbracy@gmail.com
|
198
198
|
executables: []
|
@@ -217,7 +217,7 @@ homepage: https://github.com/malomalo/turbostreamer
|
|
217
217
|
licenses:
|
218
218
|
- MIT
|
219
219
|
metadata: {}
|
220
|
-
post_install_message:
|
220
|
+
post_install_message:
|
221
221
|
rdoc_options:
|
222
222
|
- "--main"
|
223
223
|
- README.md
|
@@ -227,15 +227,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
227
227
|
requirements:
|
228
228
|
- - ">="
|
229
229
|
- !ruby/object:Gem::Version
|
230
|
-
version: '
|
230
|
+
version: '2.5'
|
231
231
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
232
232
|
requirements:
|
233
233
|
- - ">="
|
234
234
|
- !ruby/object:Gem::Version
|
235
235
|
version: '0'
|
236
236
|
requirements: []
|
237
|
-
rubygems_version: 3.
|
238
|
-
signing_key:
|
237
|
+
rubygems_version: 3.1.2
|
238
|
+
signing_key:
|
239
239
|
specification_version: 4
|
240
240
|
summary: Stream JSON via a Builder-style DSL
|
241
241
|
test_files: []
|