roda 3.13.0 → 3.14.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: f5b811d1ec0ddceb3a222c490b2af8e1488c6d454b637c7b6522962c149e6fd6
4
- data.tar.gz: 0f3fad8d3d14f799fcc0e92a29bbc9210aadec3bade4bf68379409ce8780b29a
3
+ metadata.gz: fc2076279138faeeae9396e6cb397e5661de1ebe90517dc8bfcc0ab69c1c6a66
4
+ data.tar.gz: dbbd9323a8b414de60b4d2f4a6c5ca63ca7fbbf0cd4f9015fbbf82973500a8d6
5
5
  SHA512:
6
- metadata.gz: 8de657deae4c712c6d18c329c1137e103b979d7c1c4e1f7a36fa9a72f3bd0c202610bc73e78b7ce30c80806adfcd19a67d42da0ce5ab4932e04a8df6aba7a54d
7
- data.tar.gz: 66cc1c59eca2bc0fb7a5186fc353332ca630b255de48406429fbb1ecfb7a42253102d2616b98196c8e4bd608a335ea2ce7af973b5b15c6150fddfc124b7b7591
6
+ metadata.gz: ad3f3d6d15bdcf8d146a8f44f3f3a4e1599dd7ec15e0aa3b7a912e61fea72a7cb3d1d631f9c9943abf43a796bfd38c18a44184579f13456c2b943cdf3cf3f272
7
+ data.tar.gz: affb16c92264210bbbe62a4f059012a4242f821bef661c308050bb36815f5885eaa3c0dc0c59d312390330dcda91de511a8413be109608e1f39bce641d97c78b
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ = 3.14.0 (2018-11-16)
2
+
3
+ * Add :raise option to convert!/convert_each! in the typecast_params plugin to support not raising for missing keys (celsworth) (#153)
4
+
5
+ * Do not persist convert!/convert_each! :symbolize setting in the typecast_params plugin (jeremyevans)
6
+
1
7
  = 3.13.0 (2018-10-12)
2
8
 
3
9
  * Make Stream#write in streaming plugin return number of bytes written instead of self, so it works with IO.copy_stream (jeremyevans)
@@ -0,0 +1,36 @@
1
+ = New Features
2
+
3
+ * The convert! and convert_each! methods in the typecast_params plugin
4
+ now support a :raise option for handling missing parameters specified
5
+ as arguments to the methods.
6
+
7
+ If the :raise option is set to false for convert! and the parameter
8
+ argument is missing, then no conversion is done and an empty hash
9
+ is returned:
10
+
11
+ typecast_params.convert!('missing', raise: false) do |tp|
12
+ # ...
13
+ end
14
+ # => {}
15
+
16
+ If the :raise option is set to false for convert_each! and a :keys
17
+ option is given, any key not present is ignored and nil will be
18
+ returned for the converted value
19
+
20
+ typecast_params.convert_each!(:keys=>['present', 'missing'], raise: false) do |tp|
21
+ tp.int('b')
22
+ end
23
+ # => [{'b'=>1}, nil]
24
+
25
+ = Other Improvements
26
+
27
+ * The :symbolize setting to the convert! and convert_each! methods in
28
+ the typecast_params plugin is no longer persisted beyond the call
29
+ to the method. This fixes unexpected behavior if you do:
30
+
31
+ typecast_params.convert!(:symbolize=>true) do |tp|
32
+ # ...
33
+ end
34
+ typecast_params.convert! do |tp|
35
+ # ...
36
+ end
@@ -572,6 +572,7 @@ class Roda
572
572
  # or nil to convert the current object. If +keys+ is given as a hash, it is used as
573
573
  # the options hash. Options:
574
574
  #
575
+ # :raise :: If set to false, do not raise errors for missing keys
575
576
  # :symbolize :: Convert any string keys in the resulting hash and for any
576
577
  # conversions below
577
578
  def convert!(keys=nil, opts=OPTS)
@@ -581,19 +582,19 @@ class Roda
581
582
  end
582
583
 
583
584
  _capture!(:nested_params, opts) do
584
- if sub = subkey(Array(keys).dup, true)
585
+ if sub = subkey(Array(keys).dup, opts.fetch(:raise, true))
585
586
  yield sub
586
587
  end
587
588
  end
588
589
  end
589
590
 
590
- # Runs convert! for each key specified by the :keys option. If :keys option is not given
591
- # and the object is an array, runs convert! for all entries in the array. If the :keys
591
+ # Runs conversions similar to convert! for each key specified by the :keys option. If :keys option is not given
592
+ # and the object is an array, runs conversions for all entries in the array. If the :keys
592
593
  # option is not given and the object is a Hash with string keys '0', '1', ..., 'N' (with
593
- # no skipped keys), runs convert! for all entries in the hash. If :keys option is a Proc
594
+ # no skipped keys), runs conversions for all entries in the hash. If :keys option is a Proc
594
595
  # or a Method, calls the proc/method with the current object, which should return an
595
596
  # array of keys to use.
596
- # Passes any options given to #convert!. Options:
597
+ # Supports options given to #convert!, and this additional option:
597
598
  #
598
599
  # :keys :: The keys to extract from the object. If a proc or method,
599
600
  # calls the value with the current object, which should return the array of keys
@@ -628,7 +629,7 @@ class Roda
628
629
 
629
630
  keys.map do |i|
630
631
  begin
631
- if v = subkey([i], true)
632
+ if v = subkey([i], opts.fetch(:raise, true))
632
633
  yield v
633
634
  v.nested_params if np
634
635
  end
@@ -692,6 +693,8 @@ class Roda
692
693
 
693
694
  # Recursively descendent into all known subkeys and get the converted params from each.
694
695
  def nested_params
696
+ return @nested_params if @nested_params
697
+
695
698
  params = @params
696
699
 
697
700
  if @subs
@@ -762,6 +765,8 @@ class Roda
762
765
 
763
766
  # Internals of convert! and convert_each!.
764
767
  def _capture!(ret, opts)
768
+ previous_symbolize = @symbolize
769
+
765
770
  unless cap = @capture
766
771
  @params = @obj.class.new
767
772
  @subs.clear if @subs
@@ -793,10 +798,18 @@ class Roda
793
798
  end
794
799
  end
795
800
  ensure
796
- # Only unset capturing if capturing was not already started.
801
+ @nested_params = nil
802
+
797
803
  if capturing_started
804
+ # Unset capturing if capturing was not already started.
798
805
  @capture = nil
806
+ else
807
+ # If capturing was already started, update cached nested params
808
+ # before resetting symbolize setting.
809
+ @nested_params = nested_params
799
810
  end
811
+
812
+ @symbolize = previous_symbolize
800
813
  end
801
814
 
802
815
  # Raise an error if the array given does contains nil values.
data/lib/roda/version.rb CHANGED
@@ -4,7 +4,7 @@ class Roda
4
4
  RodaMajorVersion = 3
5
5
 
6
6
  # The minor version of Roda, updated for new feature releases of Roda.
7
- RodaMinorVersion = 13
7
+ RodaMinorVersion = 14
8
8
 
9
9
  # The patch version of Roda, updated only for bug fixes from the last
10
10
  # feature release.
@@ -102,7 +102,7 @@ describe "mailer plugin" do
102
102
  m.attachments.first.content_type.must_match(/mailer_spec\.rb/)
103
103
  m.content_type.must_match(/\Amultipart\/mixed/)
104
104
  m.parts.length.must_equal 1
105
- m.parts.first.body.must_be :==, File.read(__FILE__)
105
+ m.parts.first.body.decoded.gsub("\r\n", "\n").must_equal File.read(__FILE__)
106
106
  end
107
107
 
108
108
  it "supports attachments with blocks" do
@@ -120,7 +120,7 @@ describe "mailer plugin" do
120
120
  m.attachments.first.content_type.must_equal 'text/foo'
121
121
  m.content_type.must_match(/\Amultipart\/mixed/)
122
122
  m.parts.length.must_equal 1
123
- m.parts.first.body.must_be :==, File.read(__FILE__)
123
+ m.parts.first.body.decoded.gsub("\r\n", "\n").must_equal File.read(__FILE__)
124
124
  end
125
125
 
126
126
  it "supports plain-text attachments with an email body" do
@@ -242,7 +242,7 @@ describe "mailer plugin" do
242
242
  m.parts.first.content_type.must_match(/\Atext\/html/)
243
243
  m.parts.first.body.must_be :==, "a"
244
244
  m.parts.last.content_type.must_match(/\Atext\/css/)
245
- m.parts.last.body.must_be :==, File.read('spec/assets/css/raw.css')
245
+ m.parts.last.body.decoded.gsub("\r\n", "\n").must_equal File.read('spec/assets/css/raw.css')
246
246
  end
247
247
  end
248
248
  end
@@ -530,6 +530,24 @@ describe "typecast_params plugin" do
530
530
  end.must_equal('a'=>[{'b'=>[{'e'=>1}]}])
531
531
  end
532
532
 
533
+ it "#convert! should not raise errors for missing keys if :raise option is false" do
534
+ tp = tp('a[b]=1')
535
+ tp.convert! do |tp0|
536
+ tp0.convert!('a') do |tp1|
537
+ tp1.convert!('c', :raise=>false) do |tp2|
538
+ tp2.convert!('d') do |tp2|
539
+ end
540
+ end
541
+ end
542
+ end.must_equal('a'=>{})
543
+
544
+ tp.convert!('b', :raise=>false){}.must_equal({})
545
+
546
+ tp.convert!('b', :raise=>false) do |tp0|
547
+ tp1.convert!('c'){}
548
+ end.must_equal({})
549
+ end
550
+
533
551
  it "#convert! should handle #[] without #convert! at each level" do
534
552
  tp = tp('a[b][c][d][e]=1')
535
553
  tp.convert! do |tp0|
@@ -585,6 +603,19 @@ describe "typecast_params plugin" do
585
603
  end.must_equal('a'=>[1], 'd'=>[2], 'g'=>[nil])
586
604
  end
587
605
 
606
+ it "#convert! should handle multiple convert! calls inside" do
607
+ tp = tp('a[b]=1&c[d]=2')
608
+ tp.convert! do |tp0|
609
+ tp0.convert!('a'){|d| d.int('b')}
610
+ tp0.convert!('c'){|d| d.int('d')}
611
+ end.must_equal('a'=>{'b'=>1}, 'c'=>{'d'=>2})
612
+
613
+ tp.convert!(:symbolize=>true) do |tp0|
614
+ tp0.convert!('a'){|d| d.int('b')}
615
+ tp0.convert!('c'){|d| d.int('d')}
616
+ end.must_equal(:a=>{:b=>1}, :c=>{:d=>2})
617
+ end
618
+
588
619
  it "#convert_each! should convert each entry in an array" do
589
620
  tp = tp('a[][b]=1&a[][c]=2&a[][b]=3&a[][c]=4')
590
621
  tp['a'].convert_each! do |tp0|
@@ -652,6 +683,13 @@ describe "typecast_params plugin" do
652
683
  lambda{tp['b'].convert_each!{}}.must_raise @tp_error
653
684
  end
654
685
 
686
+ it "#convert_each! should not raise errors for missing keys if :raise option is false" do
687
+ tp = tp('a[0][b]=1&a[0][c]=2&a[1][b]=3&a[1][c]=4')
688
+ tp['a'].convert_each!(:keys=>%w'0 2', :raise=>false) do |tp0|
689
+ tp0.int(%w'b c')
690
+ end.must_equal [{'b'=>1, 'c'=>2}, nil]
691
+ end
692
+
655
693
  it "#convert! with :symbolize option should return a hash of converted parameters" do
656
694
  tp = tp()
657
695
  tp.convert!(:symbolize=>true) do |ptp|
@@ -663,6 +701,25 @@ describe "typecast_params plugin" do
663
701
  end.must_equal(:a=>1, :b=>[2, 3], :c=>{:d=>4, :e=>5})
664
702
  end
665
703
 
704
+ it "#convert! with :symbolize option should not persist" do
705
+ tp = tp()
706
+ tp.convert!(:symbolize=>true) do |ptp|
707
+ ptp.int!('a')
708
+ ptp.array!(:int, 'b')
709
+ ptp['c'].convert! do |stp|
710
+ stp.int!(%w'd e')
711
+ end
712
+ end.must_equal(:a=>1, :b=>[2, 3], :c=>{:d=>4, :e=>5})
713
+
714
+ tp.convert! do |ptp|
715
+ ptp.int!('a')
716
+ ptp.array!(:int, 'b')
717
+ ptp['c'].convert! do |stp|
718
+ stp.int!(%w'd e')
719
+ end
720
+ end.must_equal("a"=>1, "b"=>[2, 3], "c"=>{"d"=>4, "e"=>5})
721
+ end
722
+
666
723
  it "#convert! with :symbolize option hash should only include changes made inside block" do
667
724
  tp = tp()
668
725
  tp.convert!(:symbolize=>true) do |ptp|
@@ -782,6 +839,18 @@ describe "typecast_params plugin" do
782
839
  end.must_equal(:a=>{:'0'=>{:b=>1, :c=>2}, :'1'=>{:b=>3, :c=>4}})
783
840
  end
784
841
 
842
+ it "#convert_each! with :symbolize option should not persist" do
843
+ tp = tp('a[][b]=1&a[][c]=2&a[][b]=3&a[][c]=4')
844
+ tp['a'].convert_each!(:symbolize=>true) do |tp0|
845
+ tp0.int(%w'b c')
846
+ end.must_equal [{:b=>1, :c=>2}, {:b=>3, :c=>4}]
847
+
848
+ tp = tp('a[][b]=1&a[][c]=2&a[][b]=3&a[][c]=4')
849
+ tp['a'].convert_each! do |tp0|
850
+ tp0.int(%w'b c')
851
+ end.must_equal [{'b'=>1, 'c'=>2}, {'b'=>3, 'c'=>4}]
852
+ end
853
+
785
854
  it "#convert! with :symbolize options specified at different levels should work" do
786
855
  tp = tp('a[b][c][d][e]=1')
787
856
  tp.convert!(:symbolize=>true) 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.13.0
4
+ version: 3.14.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-10-12 00:00:00.000000000 Z
11
+ date: 2018-11-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -209,6 +209,7 @@ extra_rdoc_files:
209
209
  - doc/release_notes/3.11.0.txt
210
210
  - doc/release_notes/3.12.0.txt
211
211
  - doc/release_notes/3.13.0.txt
212
+ - doc/release_notes/3.14.0.txt
212
213
  files:
213
214
  - CHANGELOG
214
215
  - MIT-LICENSE
@@ -256,6 +257,7 @@ files:
256
257
  - doc/release_notes/3.11.0.txt
257
258
  - doc/release_notes/3.12.0.txt
258
259
  - doc/release_notes/3.13.0.txt
260
+ - doc/release_notes/3.14.0.txt
259
261
  - doc/release_notes/3.2.0.txt
260
262
  - doc/release_notes/3.3.0.txt
261
263
  - doc/release_notes/3.4.0.txt