firm 0.9.1 → 0.9.3

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: 823d2ee34c56ec4457626d9dd06586825f33a01ad3dd34dfd135f9cdefafdd66
4
- data.tar.gz: f0c33ff04609cfa111f98886ca3d92cab1478d81b5bde280c2000bdcaca614c5
3
+ metadata.gz: 5c1c7b999e2db422d608d8aaf8e28a9bace6824640f50a8e5dabb30e2ca89a36
4
+ data.tar.gz: a16d62247a09cc2e1d8b3c4d2a990ffefb7b48c18f6f1d8f27e12c770ff103eb
5
5
  SHA512:
6
- metadata.gz: 9a7c5b5446f5bc1aae9e6f2fcaa3baa0d3589b235144367443292e2785570ce5765f3612fc10c9fc010e7ce4f0e820239167a5e6f4ef5ad77fe2ecdbc0820349
7
- data.tar.gz: 129cb0defe0a5628f9c7731e23ba73b90747f973cfc2931021612f4d271efbd39b80bbb60c8ca751f64fa549110fd79362ca751dfa78d11e68e9c127856da5de
6
+ metadata.gz: 6c45a0bc530a143ad8b37de7e00f6fdd4a2af91ffb52b18ce86f91ffac390ea05825d58b042e29361a96fd762be58d210d141bdb88d9748c3232e7c30232b8cc
7
+ data.tar.gz: 939fe265f4f55f1255851e5f246b73ca416c6649af2ffcdad6aa8fb63341289ef64c71678bc02a7372c66acd6a91a26111ebc049d2a571b5f3f189f7010d3fb2
data/README.md CHANGED
@@ -8,7 +8,8 @@
8
8
 
9
9
  ## Introduction
10
10
 
11
- FIRM is a pure Ruby library providing output format independent object (de-)serialization support.
11
+ FIRM is a pure Ruby library that works across different Ruby implementations like MRI Ruby and JRuby providing output
12
+ format independent object (de-)serialization support.
12
13
 
13
14
  FIRM is explicitly **NOT** intended as a non-discriminative marshaling library (dumping any object's attributes)
14
15
  but rather as structured and safe serialization library requiring users to think about what state they want
@@ -148,20 +148,20 @@ module FIRM
148
148
  def json_create(object)
149
149
  data = object['data']
150
150
  # deserializing (anchor) object or alias
151
- if data.has_key?('*id')
152
- if Serializable::Aliasing.restored?(self, data['*id'])
151
+ if object.has_key?('*id')
152
+ if Serializable::Aliasing.restored?(self, object['*id'])
153
153
  # resolving an already restored anchor for this alias
154
- Serializable::Aliasing.resolve_anchor(self, data['*id'])
154
+ Serializable::Aliasing.resolve_anchor(self, object['*id'])
155
155
  else
156
156
  # in case of cyclic references JSON will restore aliases before the anchors
157
157
  # so in this case we allocate an instance here and register it as
158
158
  # the anchor; when the anchor is restored it will re-use this instance to initialize & restore
159
159
  # the properties
160
- Serializable::Aliasing.restore_anchor(data['*id'], self.allocate)
160
+ Serializable::Aliasing.restore_anchor(object['*id'], self.allocate)
161
161
  end
162
162
  else
163
- instance = if data.has_key?('&id')
164
- anchor_id = data.delete('&id') # extract anchor id
163
+ instance = if object.has_key?('&id')
164
+ anchor_id = object['&id'] # extract anchor id
165
165
  if Serializable::Aliasing.restored?(self, anchor_id)
166
166
  # in case of cyclic references an alias will already have restored the anchor instance
167
167
  # (default constructed); retrieve that instance here for deserialization of properties
@@ -192,14 +192,16 @@ module FIRM
192
192
  anchor_data = Serializable::Aliasing.get_anchor_data(self)
193
193
  # retroactively insert the anchor in the anchored instance's serialization data
194
194
  anchor_data['&id'] = anchor unless anchor_data.has_key?('&id')
195
- json_data["data"] = {
196
- '*id' => anchor
197
- }
195
+ json_data['*id'] = anchor
198
196
  else
199
197
  # register anchor object **before** serializing properties to properly handle cycling (bidirectional
200
198
  # references)
201
- json_data['data'] = for_serialize(Serializable::Aliasing.register_anchor_object(self, {}))
202
- json_data['data'].transform_values! { |v| v.respond_to?(:as_json) ? v.as_json : v }
199
+ Serializable::Aliasing.register_anchor_object(self, json_data)
200
+ data = for_serialize({})
201
+ unless data.empty?
202
+ json_data['data'] = data
203
+ json_data['data'].transform_values! { |v| v.respond_to?(:as_json) ? v.as_json : v }
204
+ end
203
205
  end
204
206
  json_data
205
207
  end
@@ -182,7 +182,11 @@ module FIRM
182
182
  xml
183
183
  end
184
184
  def from_xml(xml)
185
- xml.content
185
+ # in case the xml was somehow formatted it may be additional text nodes
186
+ # get inserted because of added space and/or newlines
187
+ # (like with JRuby's Nokogiri when outputting pretty formatted XML)
188
+ # so just in case look up the one CDATA child and only use that one's content
189
+ xml.children.find { |child| child.cdata? }&.text || ''
186
190
  end
187
191
  end
188
192
 
@@ -212,8 +216,9 @@ module FIRM
212
216
  xml
213
217
  end
214
218
  def from_xml(xml)
215
- case (s = xml.content)
216
- when 'NaN' then :Float::NAN
219
+ s = xml.children.find { |child| child.cdata? }&.text
220
+ case s
221
+ when nil, 'NaN' then :Float::NAN
217
222
  when 'Infinity' then ::Float::INFINITY
218
223
  when '-Infinity' then -::Float::INFINITY
219
224
  else
@@ -307,7 +312,12 @@ module FIRM
307
312
  xml
308
313
  end
309
314
  def from_xml(xml)
310
- ::BigDecimal._load(xml.content)
315
+ # in case the xml was somehow formatted it may be additional text nodes
316
+ # get inserted because of added space and/or newlines
317
+ # (like with JRuby's Nokogiri when outputting pretty formatted XML)
318
+ # so just in case look up the one CDATA child and only use that one's content
319
+ data = xml.children.find { |child| child.cdata? }&.text
320
+ ::BigDecimal._load(data || '')
311
321
  end
312
322
  end
313
323
  end
data/lib/firm/version.rb CHANGED
@@ -4,6 +4,6 @@
4
4
  module FIRM
5
5
 
6
6
  # FIRM version
7
- VERSION = "0.9.1"
7
+ VERSION = "0.9.3"
8
8
 
9
9
  end
@@ -228,7 +228,7 @@ module SerializerTestMixin
228
228
  assert_equal(obj, obj_new)
229
229
 
230
230
  Struct.new('MyStruct', :one, :two) unless defined? Struct::MyStruct
231
- obj = Struct::MyStruct.new(one: Point.new(10, 90), two: Point.new(20, 80))
231
+ obj = Struct::MyStruct.new(Point.new(10, 90), Point.new(20, 80))
232
232
  obj_serial = obj.serialize
233
233
  assert_nothing_raised { obj_new = FIRM.deserialize(obj_serial) }
234
234
  assert_equal(obj, obj_new)
@@ -705,10 +705,12 @@ module SerializerTestMixin
705
705
  end
706
706
  end
707
707
 
708
+ require 'base64'
709
+
708
710
  class NestedSerializer
709
711
  include FIRM::Serializable
710
712
 
711
- property :nested, handler: :marshall_nested
713
+ property nested: :marshall_nested
712
714
 
713
715
  def initialize(serializable=nil)
714
716
  @nested = serializable
@@ -718,11 +720,13 @@ module SerializerTestMixin
718
720
 
719
721
  protected
720
722
 
721
- def marshall_nested(_id, *val)
723
+ def marshall_nested(*val)
722
724
  if val.empty?
723
- @nested.serialize
725
+ # as this results in another XML string to embed it is probably best to encode
726
+ # it (at least JRuby's Nokogiri version seems to have problems with this without encoding)
727
+ Base64.urlsafe_encode64(@nested.serialize)
724
728
  else
725
- @nested = FIRM.deserialize(val.first)
729
+ @nested = FIRM.deserialize(Base64.urlsafe_decode64(val.first))
726
730
  nil
727
731
  end
728
732
  end
@@ -746,9 +750,8 @@ module SerializerTestMixin
746
750
  ref_obj = RefUser.new(container.map[:seven].id, container.map[:eight].id, container.map[:nine].id)
747
751
  container.map[:ten] = ref_obj
748
752
  nest_obj = NestedSerializer.new(container)
749
- obj_serial = [nest_obj, container.map[:one], container.map[:two], container.map[:five], [container.map[:three], container.map[:four], container.map[:six]], ref_obj].serialize(nil, pretty: true)
750
- obj_new = nil
751
- assert_nothing_raised { obj_new = FIRM.deserialize(obj_serial) }
753
+ obj_serial = [nest_obj, container.map[:one], container.map[:two], container.map[:five], [container.map[:three], container.map[:four], container.map[:six]], ref_obj].serialize(pretty: true)
754
+ obj_new = assert_nothing_raised { FIRM.deserialize(obj_serial) }
752
755
  assert_instance_of(::Array, obj_new)
753
756
  assert_instance_of(NestedSerializer, obj_new[0])
754
757
  container = obj_new[0].nested
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: firm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Corino