satt 0.0.2 → 0.0.3

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.
Files changed (2) hide show
  1. data/lib/satt.rb +43 -6
  2. metadata +2 -2
@@ -1,4 +1,11 @@
1
- require "msgpack"
1
+ unless defined?(MessagePack)
2
+ require "msgpack"
3
+ end
4
+
5
+ unless defined?(BigDecimal)
6
+ class BigDecimal
7
+ end
8
+ end
2
9
 
3
10
  class Satt
4
11
  class InvalidArgument < RuntimeError; end
@@ -16,7 +23,7 @@ class Satt
16
23
  class Primitive
17
24
  NOT_DUMPABLE = [ Binding, IO, Proc, Class ].freeze
18
25
  DONT_SERIALIZE = [ NilClass, Fixnum, Float, TrueClass, FalseClass ].freeze
19
- OTHER_PRIMITIVES = [ Symbol, String, Array, Hash, Bignum ].freeze
26
+ OTHER_PRIMITIVES = [ Symbol, String, Array, Hash, Bignum, BigDecimal ].freeze
20
27
 
21
28
  class Dumper
22
29
  def initialize()
@@ -29,10 +36,18 @@ class Satt
29
36
  raise InvalidArgument, "objects of type #{cl.to_s} are not dumpable" if obj.is_a?(cl)
30
37
  end
31
38
 
39
+ if obj.respond_to?(:marshal_dump)
40
+ return [ class_identifier(obj), dump(obj.marshal_dump) ]
41
+ end
42
+
43
+ if obj.respond_to?(:_dump)
44
+ return [ class_identifier(obj), obj._dump ]
45
+ end
46
+
32
47
  case obj
33
48
  when *DONT_SERIALIZE
34
49
  obj
35
- when Symbol, Bignum
50
+ when Symbol, Bignum, BigDecimal
36
51
  [ class_identifier(obj), dump_value(obj) ]
37
52
  else
38
53
  id, cached = local_id(obj)
@@ -50,7 +65,7 @@ class Satt
50
65
  obj
51
66
  when Symbol
52
67
  obj.to_s
53
- when Bignum
68
+ when Bignum, BigDecimal
54
69
  obj.to_s(16)
55
70
  when Array
56
71
  obj.map{ |e| dump(e) }
@@ -94,6 +109,16 @@ class Satt
94
109
  raise InvalidArgument, priv.inspect if priv.class != Array or priv.empty?
95
110
  objclass = get_class(priv.first)
96
111
 
112
+ if objclass.respond_to?(:marshal_load)
113
+ raise InvalidArgument unless priv.length == 2
114
+ return objclass.marshal_load(load(priv.last))
115
+ end
116
+
117
+ if objclass.respond_to?(:_load)
118
+ raise InvalidArgument, priv.inspect unless priv.length == 2
119
+ return objclass._load(priv.last)
120
+ end
121
+
97
122
  if objclass == Symbol
98
123
  raise InvalidArgument unless priv.length == 2 and priv.last.class == String
99
124
  return priv.last.to_sym
@@ -104,6 +129,11 @@ class Satt
104
129
  return priv.last.to_i(16)
105
130
  end
106
131
 
132
+ if objclass == BigDecimal
133
+ raise InvalidArgument unless priv.length == 2 and priv.last.class == String
134
+ return BigDecimal.new(priv.last)
135
+ end
136
+
107
137
  if [Array, Hash].include?(objclass) and priv.length == 3
108
138
  raise InvalidArgument unless priv.last.class == objclass
109
139
  end
@@ -159,8 +189,15 @@ class Satt
159
189
 
160
190
  def get_class(id)
161
191
  return OTHER_PRIMITIVES[id] if id.class == Fixnum
162
- unless Object.constants.include?(id.to_sym) and objclass = Object.const_get(id) and objclass.class == Class
163
- raise InvalidArgument, "unknown class #{id.to_s}"
192
+ path = id.split("::")
193
+ objclass = Object
194
+ while tmp = path.shift
195
+ unless objclass.constants.include?(tmp.to_sym) and
196
+ objclass = objclass.const_get(tmp) and
197
+ (objclass.class == Class or (path != [] and objclass.class == Module)) then
198
+ raise InvalidArgument, "unknown class #{id.to_s}"
199
+ end
200
+ objclass
164
201
  end
165
202
  objclass
166
203
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: satt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-28 00:00:00.000000000 Z
12
+ date: 2013-05-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: msgpack