Skip to content

Commit

Permalink
Dump and load options and sub_elements
Browse files Browse the repository at this point in the history
Previously, ROS did not play well when being dump and loaded with Marshal because the options from ROS did not translate through the serialization. This change saves the information through marshal_dump and then reassigns the information to ROS instance when the object is loaded.
  • Loading branch information
wildmaples committed Nov 24, 2022
1 parent da38709 commit c569909
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 0 deletions.
8 changes: 8 additions & 0 deletions lib/recursive_open_struct.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,14 @@ def initialize(hash=nil, passed_options={})
@sub_elements = {}
end

def marshal_load(attributes)
hash, @options, @sub_elements = attributes
super(hash)
end

def marshal_dump
[super, @options, @sub_elements]
end

if OpenStruct.public_instance_methods.include?(:initialize_copy)
def initialize_copy(orig)
Expand Down
19 changes: 19 additions & 0 deletions spec/recursive_open_struct/recursion_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,14 @@
expect(ros.blah.changed).to eql 'backing'
end

it "handles being dump then loaded by Marshal" do
foo_struct = [RecursiveOpenStruct.new]
bar_struct = RecursiveOpenStruct.new(foo: foo_struct)
serialized = Marshal.dump(bar_struct)

expect(Marshal.load(serialized).foo).to eq(foo_struct)
end

describe "handling loops in the original Hashes" do
let(:h1) { { :a => 'a'} }
let(:h2) { { :a => 'b', :h1 => h1 } }
Expand Down Expand Up @@ -182,6 +190,17 @@
let(:blah_list) { [ { :foo => '1' }, { :foo => '2' }, 'baz' ] }
let(:h) { { :blah => blah_list } }

context "when dump and loaded by Marshal" do
let(:test) { RecursiveOpenStruct.new(h, :recurse_over_arrays => true) }
subject { Marshal.load(Marshal.dump(test))}

it { expect(subject.blah.length).to eq 3 }
it { expect(subject.blah[0].foo).to eq '1' }
it { expect(subject.blah[1].foo).to eq '2' }
it { expect(subject.blah_as_a_hash).to eq blah_list }
it { expect(subject.blah[2]).to eq 'baz' }
end

context "when recursing over arrays is enabled" do
subject { RecursiveOpenStruct.new(h, :recurse_over_arrays => true) }

Expand Down

0 comments on commit c569909

Please sign in to comment.