turbostreamer 1.5.0 → 1.7.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 +2 -1
- data/lib/turbostreamer/encoders/oj.rb +3 -1
- data/lib/turbostreamer/template.rb +39 -17
- data/lib/turbostreamer/version.rb +1 -1
- data/lib/turbostreamer.rb +19 -7
- 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: f88c7e8d509e97aa6d2d2604f4a36c1e2d4cc5bb6b15393390681b93d570a893
|
4
|
+
data.tar.gz: 454ca8f3167263308d397fc66ffaafc3858e4078fed5109a325932c8c890c664
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 225cfb941767f0f3c45d0b1458aaabd9815f121af909e35534a40f3a71502297ea0dd1b72ca943f0f8d7fb11944ccea64283668d86b3e34c977958e1170edb46
|
7
|
+
data.tar.gz: 22ec94ce3cd8e5e1b81c7373d021297e66bedaadbc7fb780c765cf0c7ff752447b9e13e7de84ec5e114620de3af598d225331a7303ec06d31dc78191971c2295
|
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
|
|
@@ -2,7 +2,8 @@ module ActionView
|
|
2
2
|
class StreamingTemplateRenderer < TemplateRenderer
|
3
3
|
|
4
4
|
def render_template(template, layout_name = nil, locals = {}) #:nodoc:
|
5
|
-
|
5
|
+
template_supports_streaming = (layout_name && template.supports_streaming?) || template.handler == TurboStreamer::Handler
|
6
|
+
return [super] unless template_supports_streaming
|
6
7
|
|
7
8
|
locals ||= {}
|
8
9
|
layout = layout_name && find_layout(layout_name, locals.keys, [formats.first])
|
@@ -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)
|
@@ -113,29 +113,51 @@ class TurboStreamer::Template < TurboStreamer
|
|
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)
|
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)
|
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.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Bracy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -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
|