class Puppet::Pops::Serialization::JSON::Packer

The JSON Packer. Modeled after the MessagePack::Packer @api private

Public Class Methods

new(io, options = {}) click to toggle source
   # File lib/puppet/pops/serialization/json.rb
65 def initialize(io, options = {})
66   @io = io
67   @io << '['
68   @type_registry = {}
69   @nested = []
70   @verbose = options[:verbose]
71   @verbose = false if @verbose.nil?
72   @indent = options[:indent] || 0
73 end

Public Instance Methods

clear_io() click to toggle source
   # File lib/puppet/pops/serialization/json.rb
79 def clear_io
80   # Truncate everything except leading '['
81   if @io.is_a?(String)
82     @io.slice!(1..-1)
83   else
84     @io.truncate(1)
85   end
86 end
empty?() click to toggle source
   # File lib/puppet/pops/serialization/json.rb
88 def empty?
89   @io.is_a?(String) ? io.length == 1 : @io.pos == 1
90 end
flush() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
 92 def flush
 93   # Drop last comma unless just start marker present
 94   if @io.is_a?(String)
 95     @io.chop! unless @io.length == 1
 96     @io << ']'
 97   else
 98     pos = @io.pos
 99     @io.pos = pos - 1 unless pos == 1
100     @io << ']'
101     @io.flush
102   end
103 end
pack(obj)
Alias for: write
register_type(type, klass, &block) click to toggle source
   # File lib/puppet/pops/serialization/json.rb
75 def register_type(type, klass, &block)
76   @type_registry[klass] = [type, klass, block]
77 end
to_a() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
148 def to_a
149   ::Puppet::Util::Json.load(io_string)
150 end
to_json() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
152 def to_json
153   if @indent > 0
154     ::Puppet::Util::Json.dump(to_a, { :pretty => true, :indent => ' ' * @indent })
155   else
156     io_string
157   end
158 end
to_s() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
144 def to_s
145   to_json
146 end
write(obj) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
105 def write(obj)
106   case obj
107   when Array
108     write_array_header(obj.size)
109     obj.each { |x| write(x) }
110   when Hash
111     write_map_header(obj.size)
112     obj.each_pair {|k, v| write(k); write(v) }
113   when nil
114     write_nil
115   else
116     write_scalar(obj)
117   end
118 end
Also aliased as: pack
write_array_header(n) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
121 def write_array_header(n)
122   if n < 1
123     @io << '[]'
124   else
125     @io << '['
126     @nested <<  [false, n]
127   end
128 end
write_map_header(n) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
130 def write_map_header(n)
131   if n < 1
132     @io << '{}'
133   else
134     @io << '{'
135     @nested <<  [true, n * 2]
136   end
137 end
write_nil() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
139 def write_nil
140   @io << 'null'
141   write_delim
142 end
write_pl(obj) click to toggle source

Write a payload object. Not subject to extensions

    # File lib/puppet/pops/serialization/json.rb
161 def write_pl(obj)
162   @io << Puppet::Util::Json.dump(obj) << ','
163 end

Private Instance Methods

extension_indicator(ext) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
236 def extension_indicator(ext)
237   @verbose ? ext[1].name.sub(/^Puppet::Pops::Serialization::\w+::(.+)$/, '\1') : ext[0]
238 end
io_string() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
165 def io_string
166   if @io.is_a?(String)
167     @io
168   else
169     @io.pos = 0
170     @io.read
171   end
172 end
write_delim() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
175 def write_delim
176   nesting = @nested.last
177   cnt = nesting.nil? ? nil : nesting[1]
178   case cnt
179   when 1
180     @io << (nesting[0] ? '}' : ']')
181     @nested.pop
182     write_delim
183   when Integer
184     if (cnt % 2) == 0 || !nesting[0]
185       @io << ','
186     else
187       @io << ':'
188     end
189     nesting[1] = cnt - 1
190   else
191     @io << ','
192   end
193 end
write_extension(ext, obj) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
212 def write_extension(ext, obj)
213   @io << '[' << extension_indicator(ext).to_json << ','
214   @nested << nil
215   write_extension_payload(ext, obj)
216   @nested.pop
217   if obj.is_a?(Extension::SequenceStart) && obj.sequence_size > 0
218     @nested << [false, obj.sequence_size]
219   else
220     if @io.is_a?(String)
221       @io.chop!
222     else
223       @io.pos -= 1
224     end
225     @io << ']'
226     write_delim
227   end
228 end
write_extension_payload(ext, obj) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
231 def write_extension_payload(ext, obj)
232   ext[2].call(obj)
233 end
write_scalar(obj) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
196 def write_scalar(obj)
197   ext = @type_registry[obj.class]
198   if ext.nil?
199     case obj
200     when Numeric, String, true, false, nil
201       @io << Puppet::Util::Json.dump(obj)
202       write_delim
203     else
204       raise SerializationError, _("Unable to serialize a %{obj}") % { obj: obj.class.name }
205     end
206   else
207     write_extension(ext, obj)
208   end
209 end