roda 3.87.0 → 3.88.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/roda/plugins/head.rb +1 -1
- data/lib/roda/plugins/json_parser.rb +20 -19
- data/lib/roda/plugins/render.rb +158 -40
- data/lib/roda/plugins/render_coverage.rb +22 -3
- data/lib/roda/plugins/render_each.rb +1 -1
- data/lib/roda/response.rb +4 -2
- data/lib/roda/version.rb +1 -1
- metadata +3 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bfe23e68b3616d0513c55ca0d6006639eaa5595c36e48445e3a4b961f17dc483
|
|
4
|
+
data.tar.gz: 110d2f273b1b2eee5d0717d7238c3c131d7dd9fd2f7eb5a7ff0b575ce0256af0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2c60bdca82724f3f1f468ca408e6d58a7fb61bb49e5819835afdb59743b82a8f1ad77e98775f8ce720bcc4aff4d72ae2e3526419cba509d60588eefd585aedba
|
|
7
|
+
data.tar.gz: 223ed6296acb9829902050161f88356e4bd6d2e5da5dc06e43175b4a59cd38c312a63c79cd93b5f2c648d7bf25e84f66a1ab02c72b603b42866ad434851350d1
|
data/lib/roda/plugins/head.rb
CHANGED
|
@@ -53,27 +53,28 @@ class Roda
|
|
|
53
53
|
# parse the request body as JSON. Ignore an empty request body.
|
|
54
54
|
def POST
|
|
55
55
|
env = @env
|
|
56
|
-
if post_params =
|
|
57
|
-
post_params
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
56
|
+
if post_params = env["roda.json_params"]
|
|
57
|
+
return post_params
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
unless (input = env["rack.input"]) && (content_type = self.content_type) && content_type.include?('json')
|
|
61
|
+
return super
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
str = _read_json_input(input)
|
|
65
|
+
return super if str.empty?
|
|
66
|
+
begin
|
|
67
|
+
json_params = parse_json(str)
|
|
68
|
+
rescue
|
|
69
|
+
roda_class.opts[:json_parser_error_handler].call(self)
|
|
70
|
+
end
|
|
66
71
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
end
|
|
71
|
-
env["roda.json_params"] = json_params
|
|
72
|
-
env["rack.request.form_input"] = input
|
|
73
|
-
json_params
|
|
74
|
-
else
|
|
75
|
-
super
|
|
72
|
+
wrap = roda_class.opts[:json_parser_wrap]
|
|
73
|
+
if wrap == :always || (wrap == :unless_hash && !json_params.is_a?(Hash))
|
|
74
|
+
json_params = {"_json"=>json_params}
|
|
76
75
|
end
|
|
76
|
+
env["roda.json_params"] = json_params
|
|
77
|
+
json_params
|
|
77
78
|
end
|
|
78
79
|
|
|
79
80
|
private
|
data/lib/roda/plugins/render.rb
CHANGED
|
@@ -118,6 +118,45 @@ class Roda
|
|
|
118
118
|
# have either +:template+, +:inline+, +:path+, or +:content+ (for +view+) as
|
|
119
119
|
# one of the keys.
|
|
120
120
|
#
|
|
121
|
+
# = Fixed Locals in Templates
|
|
122
|
+
#
|
|
123
|
+
# By default, you can pass any local variables to any templates. A separate
|
|
124
|
+
# template method is compiled for each combination of locals. This causes
|
|
125
|
+
# multiple issues:
|
|
126
|
+
#
|
|
127
|
+
# * It is inefficient, especially for large templates that are called with
|
|
128
|
+
# many combinations of locals.
|
|
129
|
+
# * It hides issues if unused local variable names are passed to the template
|
|
130
|
+
# * It does not support default values for local variables
|
|
131
|
+
# * It does not support required local variables
|
|
132
|
+
# * It does not support cases where you want to pass values via a keyword splat
|
|
133
|
+
# * It does not support named blocks
|
|
134
|
+
#
|
|
135
|
+
# If you are using Tilt 2.6+, you can used fixed locals in templates, by
|
|
136
|
+
# passing the appropriate options in :template_opts. For example, if you
|
|
137
|
+
# are using ERB templates, the recommended way to use the render plugin is to
|
|
138
|
+
# use the +:extract_fixed_locals+ and +:default_fixed_locals+ template options:
|
|
139
|
+
#
|
|
140
|
+
# plugin :render, template_opts: {extract_fixed_locals: true, default_fixed_locals: '()'}
|
|
141
|
+
#
|
|
142
|
+
# This will default templates to not allowing any local variables to be passed.
|
|
143
|
+
# If the template requires local variables, you can specify them using a magic
|
|
144
|
+
# comment in the template, such as:
|
|
145
|
+
#
|
|
146
|
+
# <%# locals(required_local:, optional_local: nil) %>
|
|
147
|
+
#
|
|
148
|
+
# The magic comment is used as method parameters when defining the compiled template
|
|
149
|
+
# method.
|
|
150
|
+
#
|
|
151
|
+
# For better debugging of issues with invalid keywords being passed to templates that
|
|
152
|
+
# have not been updated to support fixed locals, it can be helpful to set
|
|
153
|
+
# +:default_fixed_locals+ to use a single optional keyword argument
|
|
154
|
+
# <tt>'(_no_kw: nil)'</tt>. This makes the error message show which keywords
|
|
155
|
+
# were passed, instead of showing that the takes no arguments (if you use <tt>'()'</tt>),
|
|
156
|
+
# or that no keywords are accepted (if you pass <tt>(**nil)</tt>).
|
|
157
|
+
#
|
|
158
|
+
# See Tilt's documentation for more information regarding fixed locals.
|
|
159
|
+
#
|
|
121
160
|
# = Speeding Up Template Rendering
|
|
122
161
|
#
|
|
123
162
|
# The render/view method calls are optimized for usage with a single symbol/string
|
|
@@ -131,6 +170,21 @@ class Roda
|
|
|
131
170
|
# the hash, making sure the +:cache_key+ is unique to the template you are
|
|
132
171
|
# rendering.
|
|
133
172
|
#
|
|
173
|
+
# = Recommended +template_opts+
|
|
174
|
+
#
|
|
175
|
+
# Here are the recommended values of :template_opts for new applications (a couple
|
|
176
|
+
# are Erubi-specific and can be ignored if you are using other templates engines):
|
|
177
|
+
#
|
|
178
|
+
# plugin :render, template_opts: {
|
|
179
|
+
# scope_class: self, # Always uses current class as scope class for compiled templates
|
|
180
|
+
# freeze: true, # Freeze string literals in templates
|
|
181
|
+
# extract_fixed_locals: true, # Support fixed locals in templates
|
|
182
|
+
# default_fixed_locals: '()', # Default to templates not supporting local variables
|
|
183
|
+
# escape: true, # For Erubi templates, escapes <%= by default (use <%== for unescaped
|
|
184
|
+
# chain_appends: true, # For Erubi templates, improves performance
|
|
185
|
+
# skip_compiled_encoding_detection: true, # Unless you need encodings explicitly specified
|
|
186
|
+
# }
|
|
187
|
+
#
|
|
134
188
|
# = Accepting Template Blocks in Methods
|
|
135
189
|
#
|
|
136
190
|
# If you are used to Rails, you may be surprised that this type of template code
|
|
@@ -228,6 +282,19 @@ class Roda
|
|
|
228
282
|
([1, -2].include?(((compiled_method_arity = Tilt::Template.instance_method(:compiled_method).arity) rescue false)))
|
|
229
283
|
NO_CACHE = {:cache=>false}.freeze
|
|
230
284
|
COMPILED_METHOD_SUPPORT = RUBY_VERSION >= '2.3' && tilt_compiled_method_support && ENV['RODA_RENDER_COMPILED_METHOD_SUPPORT'] != 'no'
|
|
285
|
+
FIXED_LOCALS_COMPILED_METHOD_SUPPORT = COMPILED_METHOD_SUPPORT && Tilt::Template.method_defined?(:fixed_locals?)
|
|
286
|
+
|
|
287
|
+
if FIXED_LOCALS_COMPILED_METHOD_SUPPORT
|
|
288
|
+
def self.tilt_template_fixed_locals?(template)
|
|
289
|
+
template.fixed_locals?
|
|
290
|
+
end
|
|
291
|
+
# :nocov:
|
|
292
|
+
else
|
|
293
|
+
def self.tilt_template_fixed_locals?(template)
|
|
294
|
+
false
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
# :nocov:
|
|
231
298
|
|
|
232
299
|
if compiled_method_arity == -2
|
|
233
300
|
def self.tilt_template_compiled_method(template, locals_keys, scope_class)
|
|
@@ -385,6 +452,11 @@ class Roda
|
|
|
385
452
|
end
|
|
386
453
|
|
|
387
454
|
if COMPILED_METHOD_SUPPORT
|
|
455
|
+
# Whether the underlying template uses fixed locals.
|
|
456
|
+
def fixed_locals?
|
|
457
|
+
Render.tilt_template_fixed_locals?(@template)
|
|
458
|
+
end
|
|
459
|
+
|
|
388
460
|
# Compile a method in the given module with the given name that will
|
|
389
461
|
# call the compiled template method, updating the compiled template method
|
|
390
462
|
def define_compiled_method(roda_class, method_name, locals_keys=EMPTY_ARRAY)
|
|
@@ -403,6 +475,15 @@ class Roda
|
|
|
403
475
|
method_name
|
|
404
476
|
end
|
|
405
477
|
|
|
478
|
+
# Returns an appropriate value for the template method cache.
|
|
479
|
+
def define_compiled_method_cache_value(roda_class, method_name, locals_keys=EMPTY_ARRAY)
|
|
480
|
+
if compiled_method = define_compiled_method(roda_class, method_name, locals_keys)
|
|
481
|
+
[compiled_method, false].freeze
|
|
482
|
+
else
|
|
483
|
+
compiled_method
|
|
484
|
+
end
|
|
485
|
+
end
|
|
486
|
+
|
|
406
487
|
private
|
|
407
488
|
|
|
408
489
|
# Return the compiled method for the current template object.
|
|
@@ -422,7 +503,7 @@ class Roda
|
|
|
422
503
|
mod.send(:private, method_name)
|
|
423
504
|
end
|
|
424
505
|
|
|
425
|
-
|
|
506
|
+
_call_optimized_template_method([method_name, Render.tilt_template_fixed_locals?(template)], locals, &block)
|
|
426
507
|
end
|
|
427
508
|
end
|
|
428
509
|
end
|
|
@@ -489,17 +570,17 @@ class Roda
|
|
|
489
570
|
def _freeze_layout_method
|
|
490
571
|
if render_opts[:layout]
|
|
491
572
|
instance = allocate
|
|
573
|
+
# This needs to be called even if COMPILED_METHOD_SUPPORT is not set,
|
|
574
|
+
# in order for the precompile_templates plugin to work correctly.
|
|
492
575
|
instance.send(:retrieve_template, instance.send(:view_layout_opts, OPTS))
|
|
493
576
|
|
|
494
|
-
if COMPILED_METHOD_SUPPORT
|
|
495
|
-
if (layout_template = render_opts[:optimize_layout]) && !opts[:render][:optimized_layout_method_created]
|
|
577
|
+
if COMPILED_METHOD_SUPPORT && (layout_template = render_opts[:optimize_layout]) && !opts[:render][:optimized_layout_method_created]
|
|
496
578
|
instance.send(:retrieve_template, :template=>layout_template, :cache_key=>nil, :template_method_cache_key => :_roda_layout)
|
|
497
579
|
layout_method = opts[:render][:template_method_cache][:_roda_layout]
|
|
498
580
|
define_method(:_layout_method){layout_method}
|
|
499
581
|
private :_layout_method
|
|
500
582
|
alias_method(:_layout_method, :_layout_method)
|
|
501
583
|
opts[:render] = opts[:render].merge(:optimized_layout_method_created=>true)
|
|
502
|
-
end
|
|
503
584
|
end
|
|
504
585
|
end
|
|
505
586
|
end
|
|
@@ -509,9 +590,9 @@ class Roda
|
|
|
509
590
|
# Render the given template. See Render for details.
|
|
510
591
|
def render(template, opts = (no_opts = true; optimized_template = _cached_template_method(template); OPTS), &block)
|
|
511
592
|
if optimized_template
|
|
512
|
-
|
|
593
|
+
_call_optimized_template_method(optimized_template, OPTS, &block)
|
|
513
594
|
elsif !no_opts && opts.length == 1 && (locals = opts[:locals]) && (optimized_template = _optimized_render_method_for_locals(template, locals))
|
|
514
|
-
|
|
595
|
+
_call_optimized_template_method(optimized_template, locals, &block)
|
|
515
596
|
else
|
|
516
597
|
opts = render_template_opts(template, opts)
|
|
517
598
|
retrieve_template(opts).render((opts[:scope]||self), (opts[:locals]||OPTS), &block)
|
|
@@ -534,7 +615,7 @@ class Roda
|
|
|
534
615
|
# and use it if so. This way avoids the extra conditional and local variable
|
|
535
616
|
# assignments in the next section.
|
|
536
617
|
if layout_method = _layout_method
|
|
537
|
-
return
|
|
618
|
+
return _call_optimized_template_method(layout_method, OPTS){content}
|
|
538
619
|
end
|
|
539
620
|
|
|
540
621
|
# If we have an optimized template method but no optimized layout method, create the
|
|
@@ -543,7 +624,7 @@ class Roda
|
|
|
543
624
|
if layout_template = self.class.opts[:render][:optimize_layout]
|
|
544
625
|
retrieve_template(:template=>layout_template, :cache_key=>nil, :template_method_cache_key => :_roda_layout)
|
|
545
626
|
if layout_method = _layout_method
|
|
546
|
-
return
|
|
627
|
+
return _call_optimized_template_method(layout_method, OPTS){content}
|
|
547
628
|
end
|
|
548
629
|
end
|
|
549
630
|
else
|
|
@@ -594,37 +675,43 @@ class Roda
|
|
|
594
675
|
def _optimized_render_method_for_locals(template, locals)
|
|
595
676
|
return unless method_cache = render_opts[:template_method_cache]
|
|
596
677
|
|
|
597
|
-
|
|
598
|
-
key = [:_render_locals, template, locals_keys]
|
|
599
|
-
|
|
600
|
-
optimized_template = case template
|
|
678
|
+
case template
|
|
601
679
|
when String, Symbol
|
|
602
|
-
|
|
680
|
+
key = [:_render_locals, template]
|
|
681
|
+
if optimized_template = _cached_template_method_lookup(method_cache, key)
|
|
682
|
+
# Fixed locals case
|
|
683
|
+
return optimized_template
|
|
684
|
+
end
|
|
685
|
+
|
|
686
|
+
locals_keys = locals.keys.sort
|
|
687
|
+
key << locals_keys
|
|
688
|
+
if optimized_template = _cached_template_method_lookup(method_cache, key)
|
|
689
|
+
# Regular locals case
|
|
690
|
+
return optimized_template
|
|
691
|
+
end
|
|
603
692
|
else
|
|
604
693
|
return
|
|
605
694
|
end
|
|
606
695
|
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
method_name = :"_roda_template_locals_#{self.class.object_id}_#{method_cache_key}"
|
|
696
|
+
if method_cache_key = _cached_template_method_key(key)
|
|
697
|
+
template_obj = retrieve_template(render_template_opts(template, NO_CACHE))
|
|
698
|
+
key.pop if fixed_locals = Render.tilt_template_fixed_locals?(template_obj)
|
|
699
|
+
key.freeze
|
|
700
|
+
method_cache_key.freeze
|
|
701
|
+
method_name = :"_roda_template_locals_#{self.class.object_id}_#{method_cache_key}"
|
|
614
702
|
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
703
|
+
method_cache[method_cache_key] = case template_obj
|
|
704
|
+
when Render::TemplateMtimeWrapper
|
|
705
|
+
template_obj.define_compiled_method_cache_value(self.class, method_name, locals_keys)
|
|
706
|
+
else
|
|
707
|
+
begin
|
|
708
|
+
unbound_method = Render.tilt_template_compiled_method(template_obj, locals_keys, self.class)
|
|
709
|
+
rescue ::NotImplementedError
|
|
710
|
+
false
|
|
618
711
|
else
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
false
|
|
623
|
-
else
|
|
624
|
-
self.class::RodaCompiledTemplates.send(:define_method, method_name, unbound_method)
|
|
625
|
-
self.class::RodaCompiledTemplates.send(:private, method_name)
|
|
626
|
-
method_name
|
|
627
|
-
end
|
|
712
|
+
self.class::RodaCompiledTemplates.send(:define_method, method_name, unbound_method)
|
|
713
|
+
self.class::RodaCompiledTemplates.send(:private, method_name)
|
|
714
|
+
[method_name, fixed_locals].freeze
|
|
628
715
|
end
|
|
629
716
|
end
|
|
630
717
|
end
|
|
@@ -634,11 +721,47 @@ class Roda
|
|
|
634
721
|
# a single argument is passed to view.
|
|
635
722
|
def _optimized_view_content(template)
|
|
636
723
|
if optimized_template = _cached_template_method(template)
|
|
637
|
-
|
|
724
|
+
_call_optimized_template_method(optimized_template, OPTS)
|
|
638
725
|
elsif template.is_a?(Hash) && template.length == 1
|
|
639
726
|
template[:content]
|
|
640
727
|
end
|
|
641
728
|
end
|
|
729
|
+
|
|
730
|
+
if RUBY_VERSION >= '3'
|
|
731
|
+
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
|
732
|
+
def _call_optimized_template_method((meth, fixed_locals), locals, &block)
|
|
733
|
+
if fixed_locals
|
|
734
|
+
send(meth, **locals, &block)
|
|
735
|
+
else
|
|
736
|
+
send(meth, locals, &block)
|
|
737
|
+
end
|
|
738
|
+
end
|
|
739
|
+
RUBY
|
|
740
|
+
# :nocov:
|
|
741
|
+
elsif RUBY_VERSION >= '2'
|
|
742
|
+
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
|
743
|
+
def _call_optimized_template_method((meth, fixed_locals), locals, &block)
|
|
744
|
+
if fixed_locals
|
|
745
|
+
if locals.empty?
|
|
746
|
+
send(meth, &block)
|
|
747
|
+
else
|
|
748
|
+
send(meth, **locals, &block)
|
|
749
|
+
end
|
|
750
|
+
else
|
|
751
|
+
send(meth, locals, &block)
|
|
752
|
+
end
|
|
753
|
+
end
|
|
754
|
+
RUBY
|
|
755
|
+
else
|
|
756
|
+
# Call the optimized template method. This is designed to be used with the
|
|
757
|
+
# method cache, which caches the method name and whether the method uses
|
|
758
|
+
# fixed locals. Methods with fixed locals need to be called with a keyword
|
|
759
|
+
# splat.
|
|
760
|
+
def _call_optimized_template_method((meth, fixed_locals), locals, &block)
|
|
761
|
+
send(meth, locals, &block)
|
|
762
|
+
end
|
|
763
|
+
end
|
|
764
|
+
# :nocov:
|
|
642
765
|
else
|
|
643
766
|
def _cached_template_method(_)
|
|
644
767
|
nil
|
|
@@ -648,10 +771,6 @@ class Roda
|
|
|
648
771
|
nil
|
|
649
772
|
end
|
|
650
773
|
|
|
651
|
-
def _layout_method
|
|
652
|
-
nil
|
|
653
|
-
end
|
|
654
|
-
|
|
655
774
|
def _optimized_render_method_for_locals(_, _)
|
|
656
775
|
nil
|
|
657
776
|
end
|
|
@@ -661,7 +780,6 @@ class Roda
|
|
|
661
780
|
end
|
|
662
781
|
end
|
|
663
782
|
|
|
664
|
-
|
|
665
783
|
# Convert template options to single hash when rendering templates using render.
|
|
666
784
|
def render_template_opts(template, opts)
|
|
667
785
|
parse_template_opts(template, opts)
|
|
@@ -772,7 +890,7 @@ class Roda
|
|
|
772
890
|
|
|
773
891
|
if define_compiled_method
|
|
774
892
|
method_name = :"_roda_template_#{self.class.object_id}_#{method_cache_key}"
|
|
775
|
-
method_cache[method_cache_key] = template.
|
|
893
|
+
method_cache[method_cache_key] = template.define_compiled_method_cache_value(self.class, method_name)
|
|
776
894
|
end
|
|
777
895
|
else
|
|
778
896
|
template = self.class.create_template(opts, template_opts)
|
|
@@ -786,7 +904,7 @@ class Roda
|
|
|
786
904
|
method_name = :"_roda_template_#{self.class.object_id}_#{method_cache_key}"
|
|
787
905
|
self.class::RodaCompiledTemplates.send(:define_method, method_name, unbound_method)
|
|
788
906
|
self.class::RodaCompiledTemplates.send(:private, method_name)
|
|
789
|
-
method_cache[method_cache_key] = method_name
|
|
907
|
+
method_cache[method_cache_key] = [method_name, Render.tilt_template_fixed_locals?(template)].freeze
|
|
790
908
|
end
|
|
791
909
|
end
|
|
792
910
|
end
|
|
@@ -50,17 +50,36 @@ class Roda
|
|
|
50
50
|
# Set a compiled path on the created template, if the path for
|
|
51
51
|
# the template is in one of the allowed_views.
|
|
52
52
|
def create_template(opts, template_opts)
|
|
53
|
-
|
|
54
|
-
return template if opts[:template_block]
|
|
53
|
+
return super if opts[:template_block]
|
|
55
54
|
|
|
56
55
|
path = File.expand_path(opts[:path])
|
|
56
|
+
compiled_path = nil
|
|
57
57
|
(self.opts[:render_coverage_strip_paths] || render_opts[:allowed_paths]).each do |dir|
|
|
58
58
|
if path.start_with?(dir + '/')
|
|
59
|
-
|
|
59
|
+
compiled_path = File.join(self.opts[:render_coverage_dir], path[dir.length+1, 10000000].gsub('/', '-'))
|
|
60
60
|
break
|
|
61
61
|
end
|
|
62
62
|
end
|
|
63
63
|
|
|
64
|
+
# For Tilt 2.6+, when using :scope_class and fixed locals, must provide
|
|
65
|
+
# compiled path as option, since compilation happens during initalization
|
|
66
|
+
# in that case. This option should be ignored if the template does not
|
|
67
|
+
# support it, but some template class may break if the option is not
|
|
68
|
+
# handled, so for compatibility, only set the method if Tilt::Template
|
|
69
|
+
# will handle it.
|
|
70
|
+
if compiled_path && Tilt::Template.method_defined?(:fixed_locals?)
|
|
71
|
+
template_opts = template_opts.dup
|
|
72
|
+
template_opts[:compiled_path] = compiled_path
|
|
73
|
+
compiled_path = nil
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
template = super
|
|
77
|
+
|
|
78
|
+
# Set compiled path for template when using older tilt versions.
|
|
79
|
+
# :nocov:
|
|
80
|
+
template.compiled_path = compiled_path if compiled_path
|
|
81
|
+
# :nocov:
|
|
82
|
+
|
|
64
83
|
template
|
|
65
84
|
end
|
|
66
85
|
end
|
data/lib/roda/response.rb
CHANGED
|
@@ -46,8 +46,6 @@ class Roda
|
|
|
46
46
|
|
|
47
47
|
# Instance methods for RodaResponse
|
|
48
48
|
module ResponseMethods
|
|
49
|
-
DEFAULT_HEADERS = {RodaResponseHeaders::CONTENT_TYPE => "text/html".freeze}.freeze
|
|
50
|
-
|
|
51
49
|
# The body for the current response.
|
|
52
50
|
attr_reader :body
|
|
53
51
|
|
|
@@ -179,11 +177,15 @@ class Roda
|
|
|
179
177
|
private
|
|
180
178
|
|
|
181
179
|
if defined?(Rack::Headers) && Rack::Headers.is_a?(Class)
|
|
180
|
+
DEFAULT_HEADERS = Rack::Headers[{RodaResponseHeaders::CONTENT_TYPE => "text/html".freeze}].freeze
|
|
181
|
+
|
|
182
182
|
# Use Rack::Headers for headers by default on Rack 3
|
|
183
183
|
def _initialize_headers
|
|
184
184
|
Rack::Headers.new
|
|
185
185
|
end
|
|
186
186
|
else
|
|
187
|
+
DEFAULT_HEADERS = {RodaResponseHeaders::CONTENT_TYPE => "text/html".freeze}.freeze
|
|
188
|
+
|
|
187
189
|
# Use plain hash for headers by default on Rack 1-2
|
|
188
190
|
def _initialize_headers
|
|
189
191
|
{}
|
data/lib/roda/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: roda
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.
|
|
4
|
+
version: 3.88.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jeremy Evans
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 2025-01-14 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: rack
|
|
@@ -150,7 +149,6 @@ dependencies:
|
|
|
150
149
|
- - ">="
|
|
151
150
|
- !ruby/object:Gem::Version
|
|
152
151
|
version: '0'
|
|
153
|
-
description:
|
|
154
152
|
email:
|
|
155
153
|
- code@jeremyevans.net
|
|
156
154
|
executables: []
|
|
@@ -313,7 +311,6 @@ metadata:
|
|
|
313
311
|
documentation_uri: https://roda.jeremyevans.net/documentation.html
|
|
314
312
|
mailing_list_uri: https://github.com/jeremyevans/roda/discussions
|
|
315
313
|
source_code_uri: https://github.com/jeremyevans/roda
|
|
316
|
-
post_install_message:
|
|
317
314
|
rdoc_options: []
|
|
318
315
|
require_paths:
|
|
319
316
|
- lib
|
|
@@ -328,8 +325,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
328
325
|
- !ruby/object:Gem::Version
|
|
329
326
|
version: '0'
|
|
330
327
|
requirements: []
|
|
331
|
-
rubygems_version: 3.
|
|
332
|
-
signing_key:
|
|
328
|
+
rubygems_version: 3.6.2
|
|
333
329
|
specification_version: 4
|
|
334
330
|
summary: Routing tree web toolkit
|
|
335
331
|
test_files: []
|