roda 3.14.1 → 3.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32418c43dd47ff54b3e1d3d79b295735d7218e51aa902303bf01bef035aeb049
4
- data.tar.gz: 45ea8f26e268865fc8d958496782f0bf23e02a2168e32edb29229840a80de99c
3
+ metadata.gz: 3a3a695566853202815ee8857b9f2276b06d97204c98b06985d2a78c1a535dab
4
+ data.tar.gz: 700b5fbd7c73c2ed9a3f758ddae5476f1428659a39142ab2ce6b155c1cab197d
5
5
  SHA512:
6
- metadata.gz: 1b0e1b07e0e163a1557800e3d5023f05c84e3e80d39f90fba944ec8a147a0edb4bc411100a069a5f52d498603a8b22955793b56ac676c0e8d02d246f4870f7dd
7
- data.tar.gz: 446371d8436c08d79cb4947f005877514471f02bfa700c519715fd64f1e5c851c9865b281bbf24e267cf03cbfd7d3670601b72b8d4fcabc44dbb4a23b0e4549b
6
+ metadata.gz: cc207cd02ca21544f435e6a6d22420915087c1418ede8fe5a5468267e1df070354199c5d13b41a41c7900a20608b7ce020bb1af8bdcb495a2751b34a3826254b
7
+ data.tar.gz: 2685a3c79454feb84de1c58137f8488f82f8b17f89f9f61973bd62ed0ce62ea460f91d871b4b80b83dca21ecb0e0cc073d6a54a148f098e845e8250f92d583cf
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ = 3.15.0 (2018-12-14)
2
+
3
+ * Support render plugin :escape option to be a string or array of strings and only add :escape option for those template engines (jeremyevans) (#158)
4
+
5
+ * Add :skip_missing option to convert!/convert_each! in the typecast_params plugin to support not storing keys not present in params (jeremyevans)
6
+
1
7
  = 3.14.1 (2018-11-29)
2
8
 
3
9
  * SECURITY: content_for plugin no longer post-processes block result with template engine (jeremyevans)
@@ -0,0 +1,21 @@
1
+ = New Features
2
+
3
+ * The render plugin :escape option value can now be a string or an
4
+ array of strings, and then the plugin will will only add the
5
+ :escape template option for those specific template engines given.
6
+ By default, the :escape plugin option adds the :escape template
7
+ option for all engines, which breaks the usage with some engines
8
+ (such as the rcsv engine).
9
+
10
+ * The convert! and convert_each! methods in the typecast_params plugin
11
+ now support a :skip_missing option to support not storing missing
12
+ parameters:
13
+
14
+ typecast_params.convert! do |tp|
15
+ tp.int('missing')
16
+ end
17
+ # => {'missing'=>nil}
18
+ typecast_params.convert!(skip_missing: false) do |tp|
19
+ tp.int('missing')
20
+ end
21
+ # => {}
@@ -56,6 +56,10 @@ class Roda
56
56
  # templates, defaults to 'erb'.
57
57
  # :escape :: Use Erubi as the ERB template engine, and enable escaping by default,
58
58
  # which makes <tt><%= %></tt> escape output and <tt><%== %></tt> not escape output.
59
+ # If given, sets the <tt>:escape=>true</tt> option for all template engines, which
60
+ # can break some non-ERB template engines. You can use a string or array of strings
61
+ # as the value for this option to only set the <tt>:escape=>true</tt> option for those
62
+ # specific template engines.
59
63
  # :layout :: The base name of the layout file, defaults to 'layout'. This can be provided as a hash
60
64
  # with the :template or :inline options.
61
65
  # :layout_opts :: The options to use when rendering the layout, if different from the default options.
@@ -184,18 +188,26 @@ class Roda
184
188
  template_opts[:default_encoding] = Encoding.default_external
185
189
  end
186
190
 
187
- if opts[:escape]
188
- require 'tilt/erubi'
189
- template_opts[:escape] = true
190
- end
191
- template_opts.freeze
192
-
193
191
  engine_opts = opts[:engine_opts] = (opts[:engine_opts] || {}).dup
194
192
  engine_opts.to_a.each do |k,v|
195
193
  engine_opts[k] = v.dup.freeze
196
194
  end
197
- engine_opts.freeze
198
195
 
196
+ if escape = opts[:escape]
197
+ require 'tilt/erubi'
198
+
199
+ case escape
200
+ when String, Array
201
+ Array(escape).each do |engine|
202
+ engine_opts[engine] = (engine_opts[engine] || {}).merge(:escape => true).freeze
203
+ end
204
+ else
205
+ template_opts[:escape] = true
206
+ end
207
+ end
208
+
209
+ template_opts.freeze
210
+ engine_opts.freeze
199
211
  opts.freeze
200
212
  end
201
213
 
@@ -557,7 +557,7 @@ class Roda
557
557
  end
558
558
 
559
559
  @subs[key] = sub
560
- sub.sub_capture(@capture, @symbolize)
560
+ sub.sub_capture(@capture, @symbolize, @skip_missing)
561
561
  sub
562
562
  end
563
563
 
@@ -573,6 +573,8 @@ class Roda
573
573
  # the options hash. Options:
574
574
  #
575
575
  # :raise :: If set to false, do not raise errors for missing keys
576
+ # :skip_missing :: If set to true, does not store values if the key is not
577
+ # present in the params.
576
578
  # :symbolize :: Convert any string keys in the resulting hash and for any
577
579
  # conversions below
578
580
  def convert!(keys=nil, opts=OPTS)
@@ -748,9 +750,10 @@ class Roda
748
750
  end
749
751
 
750
752
  # Inherit given capturing and symbolize setting from parent object.
751
- def sub_capture(capture, symbolize)
753
+ def sub_capture(capture, symbolize, skip_missing)
752
754
  if @capture = capture
753
755
  @symbolize = symbolize
756
+ @skip_missing = skip_missing
754
757
  @params = @obj.class.new
755
758
  end
756
759
  end
@@ -766,6 +769,7 @@ class Roda
766
769
  # Internals of convert! and convert_each!.
767
770
  def _capture!(ret, opts)
768
771
  previous_symbolize = @symbolize
772
+ previous_skip_missing = @skip_missing
769
773
 
770
774
  unless cap = @capture
771
775
  @params = @obj.class.new
@@ -777,6 +781,9 @@ class Roda
777
781
  if opts.has_key?(:symbolize)
778
782
  @symbolize = !!opts[:symbolize]
779
783
  end
784
+ if opts.has_key?(:skip_missing)
785
+ @skip_missing = !!opts[:skip_missing]
786
+ end
780
787
 
781
788
  begin
782
789
  v = yield
@@ -810,6 +817,7 @@ class Roda
810
817
  end
811
818
 
812
819
  @symbolize = previous_symbolize
820
+ @skip_missing = previous_skip_missing
813
821
  end
814
822
 
815
823
  # Raise an error if the array given does contains nil values.
@@ -906,7 +914,9 @@ class Roda
906
914
 
907
915
  if @capture
908
916
  key = key.to_sym if symbolize?
909
- @params[key] = v
917
+ if !@skip_missing || @obj.has_key?(key)
918
+ @params[key] = v
919
+ end
910
920
  end
911
921
 
912
922
  v
data/lib/roda/version.rb CHANGED
@@ -4,11 +4,11 @@ class Roda
4
4
  RodaMajorVersion = 3
5
5
 
6
6
  # The minor version of Roda, updated for new feature releases of Roda.
7
- RodaMinorVersion = 14
7
+ RodaMinorVersion = 15
8
8
 
9
9
  # The patch version of Roda, updated only for bug fixes from the last
10
10
  # feature release.
11
- RodaPatchVersion = 1
11
+ RodaPatchVersion = 0
12
12
 
13
13
  # The full version of Roda as a string.
14
14
  RodaVersion = "#{RodaMajorVersion}.#{RodaMinorVersion}.#{RodaPatchVersion}".freeze
@@ -632,7 +632,7 @@ describe ":render plugin :escape option" do
632
632
 
633
633
  it "should escape inside <%= %> and not inside <%== %>, and handle postfix conditionals" do
634
634
  app(:bare) do
635
- plugin :render, :escape=>:erubi
635
+ plugin :render, :escape=>true
636
636
 
637
637
  route do |r|
638
638
  render(:inline=>'<%= "<>" %> <%== "<>" %><%= "<>" if false %>')
@@ -644,7 +644,7 @@ describe ":render plugin :escape option" do
644
644
 
645
645
  it "should allow for per-branch escaping via set_view options" do
646
646
  app(:bare) do
647
- plugin :render, :escape=>:erubi
647
+ plugin :render, :escape=>true
648
648
  plugin :view_options
649
649
 
650
650
  route do |r|
@@ -660,5 +660,41 @@ describe ":render plugin :escape option" do
660
660
  body('/a').must_equal '&lt;&gt;'
661
661
  body.must_equal '<>'
662
662
  end
663
+
664
+ it "should accept :escape=>String to only escape for that template engine" do
665
+ app(:bare) do
666
+ plugin :render, :escape=>'erb'
667
+
668
+ route do |r|
669
+ r.is 'a' do
670
+ render(:inline=>'<%= "<>" %> <%== "<>" %><%= "<>" if false %>', :engine=>'unescaped.erb')
671
+ end
672
+ render(:inline=>'<%= "<>" %> <%== "<>" %><%= "<>" if false %>')
673
+ end
674
+ end
675
+
676
+ body.must_equal '&lt;&gt; <>'
677
+ body('/a').must_equal '<> &lt;&gt;'
678
+ end
679
+
680
+ it "should accept :escape=>Array to only escape for those template engines" do
681
+ app(:bare) do
682
+ plugin :render, :escape=>%w'erb erubi', :engine_opts=>{'erubi'=>{:bufvar=>'_buf'}}
683
+
684
+ route do |r|
685
+ r.is 'a' do
686
+ render(:inline=>'<%= "<>" %> <%== "<>" %><%= "<>" if false %>', :engine=>'unescaped.erb')
687
+ end
688
+ r.is 'b' do
689
+ render(:inline=>'<%= _buf.length %><%= "<>" %> <%== "<>" %><%= "<>" if false %>', :engine=>'erubi')
690
+ end
691
+ render(:inline=>'<%= "<>" %> <%== "<>" %><%= "<>" if false %>')
692
+ end
693
+ end
694
+
695
+ body.must_equal '&lt;&gt; <>'
696
+ body('/a').must_equal '<> &lt;&gt;'
697
+ body('/b').must_equal '0&lt;&gt; <>'
698
+ end
663
699
  end
664
700
  end
@@ -616,6 +616,44 @@ describe "typecast_params plugin" do
616
616
  end.must_equal(:a=>{:b=>1}, :c=>{:d=>2})
617
617
  end
618
618
 
619
+ it "#convert! should include missing values as nil" do
620
+ tp = tp()
621
+ tp.convert! do |ptp|
622
+ ptp.int('x')
623
+ ptp.array(:int, 'y')
624
+ ptp['c'].convert! do |stp|
625
+ stp.int(%w'x z')
626
+ end
627
+ end.must_equal("x"=>nil, "y"=>nil, "c"=>{"x"=>nil, "z"=>nil})
628
+ end
629
+
630
+ it "#convert! with :missing=>:skip should not include missing values" do
631
+ tp = tp()
632
+ tp.convert!(:skip_missing=>true) do |ptp|
633
+ ptp.int('x')
634
+ ptp.array(:int, 'y')
635
+ ptp['c'].convert! do |stp|
636
+ stp.int(%w'x z')
637
+ end
638
+ end.must_equal("c"=>{})
639
+
640
+ tp.convert! do |ptp|
641
+ ptp.int('x')
642
+ ptp.array(:int, 'y')
643
+ ptp['c'].convert!(:skip_missing=>true) do |stp|
644
+ stp.int(%w'x z')
645
+ end
646
+ end.must_equal("x"=>nil, "y"=>nil, "c"=>{})
647
+
648
+ tp.convert!(:skip_missing=>true) do |ptp|
649
+ ptp.int('x')
650
+ ptp.array(:int, 'y')
651
+ ptp['c'].convert!(:skip_missing=>false) do |stp|
652
+ stp.int(%w'x z')
653
+ end
654
+ end.must_equal("c"=>{"x"=>nil, "z"=>nil})
655
+ end
656
+
619
657
  it "#convert_each! should convert each entry in an array" do
620
658
  tp = tp('a[][b]=1&a[][c]=2&a[][b]=3&a[][c]=4')
621
659
  tp['a'].convert_each! do |tp0|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roda
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.14.1
4
+ version: 3.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-29 00:00:00.000000000 Z
11
+ date: 2018-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -211,6 +211,7 @@ extra_rdoc_files:
211
211
  - doc/release_notes/3.13.0.txt
212
212
  - doc/release_notes/3.14.0.txt
213
213
  - doc/release_notes/3.14.1.txt
214
+ - doc/release_notes/3.15.0.txt
214
215
  files:
215
216
  - CHANGELOG
216
217
  - MIT-LICENSE
@@ -260,6 +261,7 @@ files:
260
261
  - doc/release_notes/3.13.0.txt
261
262
  - doc/release_notes/3.14.0.txt
262
263
  - doc/release_notes/3.14.1.txt
264
+ - doc/release_notes/3.15.0.txt
263
265
  - doc/release_notes/3.2.0.txt
264
266
  - doc/release_notes/3.3.0.txt
265
267
  - doc/release_notes/3.4.0.txt
@@ -493,7 +495,12 @@ files:
493
495
  homepage: http://roda.jeremyevans.net
494
496
  licenses:
495
497
  - MIT
496
- metadata: {}
498
+ metadata:
499
+ bug_tracker_uri: https://github.com/jeremyevans/roda/issues
500
+ changelog_uri: http://roda.jeremyevans.net/rdoc/files/CHANGELOG.html
501
+ documentation_uri: http://roda.jeremyevans.net/documentation.html
502
+ mailing_list_uri: https://groups.google.com/forum/#!forum/ruby-roda
503
+ source_code_uri: https://github.com/jeremyevans/roda
497
504
  post_install_message:
498
505
  rdoc_options: []
499
506
  require_paths: