class Puppet::Pops::Serialization::AbstractReader

Abstract class for protocol specific readers such as MsgPack or JSON The abstract reader is capable of reading the primitive scalars:

and, by using extensions, also

@api public

Public Class Methods

new(unpacker, extension_unpacker = nil) click to toggle source

@param [MessagePack::Unpacker,JSON::Unpacker] unpacker The low lever unpacker that delivers the primitive objects @param [MessagePack::Unpacker,JSON::Unpacker] extension_unpacker Optional unpacker for extensions. Defaults to the unpacker @api public

   # File lib/puppet/pops/serialization/abstract_reader.rb
29 def initialize(unpacker, extension_unpacker = nil)
30   @read = []
31   @unpacker = unpacker
32   @extension_unpacker = extension_unpacker.nil? ? unpacker : extension_unpacker
33   register_types
34 end

Public Instance Methods

extension_unpacker() click to toggle source

@api private

   # File lib/puppet/pops/serialization/abstract_reader.rb
82 def extension_unpacker
83   @extension_unpacker
84 end
primitive_count() click to toggle source

@return [Integer] The total count of unique primitive values that has been read @api private

   # File lib/puppet/pops/serialization/abstract_reader.rb
55 def primitive_count
56   @read.size
57 end
read() click to toggle source

Read an object from the underlying unpacker @return [Object] the object that was read @api public

   # File lib/puppet/pops/serialization/abstract_reader.rb
39 def read
40   obj = @unpacker.read
41   case obj
42   when Extension::InnerTabulation
43     @read[obj.index]
44   when Numeric, Symbol, Extension::NotTabulated, true, false, nil
45     # not tabulated
46     obj
47   else
48     @read << obj
49     obj
50   end
51 end
read_payload(data) click to toggle source

@api private

   # File lib/puppet/pops/serialization/abstract_reader.rb
60 def read_payload(data)
61   raise SerializationError, "Internal error: Class #{self.class} does not implement method 'read_payload'"
62 end
read_tpl(ep) click to toggle source

@api private

   # File lib/puppet/pops/serialization/abstract_reader.rb
70 def read_tpl(ep)
71   obj = ep.read
72   case obj
73   when Integer
74     @read[obj]
75   else
76     @read << obj
77     obj
78   end
79 end
read_tpl_qname(ep) click to toggle source

@api private

   # File lib/puppet/pops/serialization/abstract_reader.rb
65 def read_tpl_qname(ep)
66   Array.new(ep.read) { read_tpl(ep) }.join('::')
67 end
register_type(extension_number, &block) click to toggle source

@api private

   # File lib/puppet/pops/serialization/abstract_reader.rb
87 def register_type(extension_number, &block)
88   @unpacker.register_type(extension_number, &block)
89 end
register_types() click to toggle source

@api private

    # File lib/puppet/pops/serialization/abstract_reader.rb
 92 def register_types
 93   register_type(Extension::INNER_TABULATION) do |data|
 94     read_payload(data) { |ep| Extension::InnerTabulation.new(ep.read) }
 95   end
 96 
 97   register_type(Extension::TABULATION) do |data|
 98     read_payload(data) { |ep| Extension::Tabulation.new(ep.read) }
 99   end
100 
101   register_type(Extension::ARRAY_START) do |data|
102     read_payload(data) { |ep| Extension::ArrayStart.new(ep.read) }
103   end
104 
105   register_type(Extension::MAP_START) do |data|
106     read_payload(data) { |ep| Extension::MapStart.new(ep.read) }
107   end
108 
109   register_type(Extension::PCORE_OBJECT_START) do |data|
110     read_payload(data) { |ep| type_name = read_tpl_qname(ep); Extension::PcoreObjectStart.new(type_name, ep.read) }
111   end
112 
113   register_type(Extension::OBJECT_START) do |data|
114     read_payload(data) { |ep| Extension::ObjectStart.new(ep.read) }
115   end
116 
117   register_type(Extension::DEFAULT) do |data|
118     read_payload(data) { |ep| Extension::Default::INSTANCE }
119   end
120 
121   register_type(Extension::COMMENT) do |data|
122     read_payload(data) { |ep| Extension::Comment.new(ep.read) }
123   end
124 
125   register_type(Extension::SENSITIVE_START) do |data|
126     read_payload(data) { |ep| Extension::SensitiveStart::INSTANCE }
127   end
128 
129   register_type(Extension::REGEXP) do |data|
130     read_payload(data) { |ep| Regexp.new(ep.read) }
131   end
132 
133   register_type(Extension::TYPE_REFERENCE) do |data|
134     read_payload(data) { |ep| Types::PTypeReferenceType.new(ep.read) }
135   end
136 
137   register_type(Extension::SYMBOL) do |data|
138     read_payload(data) { |ep| ep.read.to_sym }
139   end
140 
141   register_type(Extension::TIME) do |data|
142     read_payload(data) do |ep|
143       sec = ep.read
144       nsec = ep.read
145       Time::Timestamp.new(sec * 1000000000 + nsec)
146     end
147   end
148 
149   register_type(Extension::TIMESPAN) do |data|
150     read_payload(data) do |ep|
151       sec = ep.read
152       nsec = ep.read
153       Time::Timespan.new(sec * 1000000000 + nsec)
154     end
155   end
156 
157   register_type(Extension::VERSION) do |data|
158     read_payload(data) { |ep| SemanticPuppet::Version.parse(ep.read) }
159   end
160 
161   register_type(Extension::VERSION_RANGE) do |data|
162     read_payload(data) { |ep| SemanticPuppet::VersionRange.parse(ep.read) }
163   end
164 
165   register_type(Extension::BASE64) do |data|
166     read_payload(data) { |ep| Types::PBinaryType::Binary.from_base64_strict(ep.read) }
167   end
168 
169   register_type(Extension::BINARY) do |data|
170     # The Ruby MessagePack implementation have special treatment for "ASCII-8BIT" strings. They
171     # are written as binary data.
172     read_payload(data) { |ep| Types::PBinaryType::Binary.new(ep.read) }
173   end
174 
175   register_type(Extension::URI) do |data|
176     read_payload(data) { |ep| URI(ep.read) }
177   end
178 end