class Puppet::Pops::Serialization::AbstractWriter

Abstract class for protocol specific writers such as MsgPack or JSON The abstract write is capable of writing the primitive scalars:

and, by using extensions, also

@api public

Public Class Methods

new(packer, options, extension_packer = nil) click to toggle source

@param [MessagePack::Packer,JSON::Packer] packer the underlying packer stream @param [Hash] options @option options [Boolean] :tabulate `true` if tabulation is enabled (which is the default). @param [DebugPacker,nil] extension_packer Optional specific extension packer. Only used for debug output @api public

   # File lib/puppet/pops/serialization/abstract_writer.rb
34 def initialize(packer, options, extension_packer = nil)
35   @tabulate = options[:tabulate]
36   @tabulate = true if @tabulate.nil?
37   @written = {}
38   @packer = packer
39   @extension_packer = extension_packer.nil? ? packer : extension_packer
40   register_types
41 end

Public Instance Methods

build_payload() click to toggle source

Called from extension callbacks only

@api private

   # File lib/puppet/pops/serialization/abstract_writer.rb
81 def build_payload
82   raise SerializationError, "Internal error: Class #{self.class} does not implement method 'build_payload'"
83 end
extension_packer() click to toggle source

@api private

   # File lib/puppet/pops/serialization/abstract_writer.rb
86 def extension_packer
87   @extension_packer
88 end
finish() click to toggle source

Tell the underlying packer to flush. @api public

   # File lib/puppet/pops/serialization/abstract_writer.rb
45 def finish
46   @packer.flush
47 end
inspect() click to toggle source
    # File lib/puppet/pops/serialization/abstract_writer.rb
218 def inspect
219   to_s
220 end
register_type(extension_number, payload_class, &block) click to toggle source

@api private

    # File lib/puppet/pops/serialization/abstract_writer.rb
117 def register_type(extension_number, payload_class, &block)
118   @packer.register_type(extension_number, payload_class, &block)
119 end
register_types() click to toggle source

@api private

    # File lib/puppet/pops/serialization/abstract_writer.rb
122 def register_types
123   # 0x00 - 0x0F are reserved for low-level serialization / tabulation extensions
124 
125   register_type(Extension::INNER_TABULATION, Extension::InnerTabulation) do |o|
126     build_payload { |ep| ep.write(o.index) }
127   end
128 
129   register_type(Extension::TABULATION, Extension::Tabulation) do |o|
130     build_payload { |ep| ep.write(o.index) }
131   end
132 
133   # 0x10 - 0x1F are reserved for structural extensions
134 
135   register_type(Extension::ARRAY_START, Extension::ArrayStart) do |o|
136     build_payload { |ep| ep.write(o.size) }
137   end
138 
139   register_type(Extension::MAP_START, Extension::MapStart) do |o|
140     build_payload { |ep| ep.write(o.size) }
141   end
142 
143   register_type(Extension::PCORE_OBJECT_START, Extension::PcoreObjectStart) do |o|
144     build_payload { |ep| write_tpl_qname(ep, o.type_name); ep.write(o.attribute_count) }
145   end
146 
147   register_type(Extension::OBJECT_START, Extension::ObjectStart) do |o|
148     build_payload { |ep| ep.write(o.attribute_count) }
149   end
150 
151   # 0x20 - 0x2f reserved for special extension objects
152 
153   register_type(Extension::DEFAULT, Extension::Default) do |o|
154     build_payload { |ep| }
155   end
156 
157   register_type(Extension::COMMENT, Extension::Comment) do |o|
158     build_payload { |ep| ep.write(o.comment) }
159   end
160 
161   register_type(Extension::SENSITIVE_START, Extension::SensitiveStart) do |o|
162     build_payload { |ep| }
163   end
164 
165   # 0x30 - 0x7f reserved for mapping of specific runtime classes
166 
167   register_type(Extension::REGEXP, Regexp) do |o|
168     build_payload { |ep| ep.write(o.source) }
169   end
170 
171   register_type(Extension::TYPE_REFERENCE, Types::PTypeReferenceType) do |o|
172     build_payload { |ep| ep.write(o.type_string) }
173   end
174 
175   register_type(Extension::SYMBOL, Symbol) do |o|
176     build_payload { |ep| ep.write(o.to_s) }
177   end
178 
179   register_type(Extension::TIME, Time::Timestamp) do |o|
180     build_payload { |ep| nsecs = o.nsecs; ep.write(nsecs / 1000000000); ep.write(nsecs % 1000000000) }
181   end
182 
183   register_type(Extension::TIMESPAN, Time::Timespan) do |o|
184     build_payload { |ep| nsecs = o.nsecs; ep.write(nsecs / 1000000000); ep.write(nsecs % 1000000000) }
185   end
186 
187   register_type(Extension::VERSION, SemanticPuppet::Version) do |o|
188     build_payload { |ep| ep.write(o.to_s) }
189   end
190 
191   register_type(Extension::VERSION_RANGE, SemanticPuppet::VersionRange) do |o|
192     build_payload { |ep| ep.write(o.to_s) }
193   end
194 
195   if supports_binary?
196     register_type(Extension::BINARY, Types::PBinaryType::Binary) do |o|
197       # The Ruby MessagePack implementation has special treatment for "ASCII-8BIT" strings. They
198       # are written as binary data.
199       build_payload { |ep| ep.write(o.binary_buffer) }
200     end
201   else
202     register_type(Extension::BASE64, Types::PBinaryType::Binary) do |o|
203       build_payload { |ep| ep.write(o.to_s) }
204     end
205   end
206 
207   URI.scheme_list.values.each do |uri_class|
208     register_type(Extension::URI, uri_class) do |o|
209       build_payload { |ep| ep.write(o.to_s) }
210     end
211   end
212 end
supports_binary?() click to toggle source
   # File lib/puppet/pops/serialization/abstract_writer.rb
49 def supports_binary?
50   false
51 end
to_s() click to toggle source
    # File lib/puppet/pops/serialization/abstract_writer.rb
214 def to_s
215   "#{self.class.name}"
216 end
write(value) click to toggle source

Write a value on the underlying stream @api public

   # File lib/puppet/pops/serialization/abstract_writer.rb
55 def write(value)
56   written = false
57   case value
58   when Integer
59     # not tabulated, but integers larger than 64-bit cannot be allowed.
60     raise SerializationError, _('Integer out of bounds') if value > MAX_INTEGER || value < MIN_INTEGER
61   when Numeric, Symbol, Extension::NotTabulated, true, false, nil
62     # not tabulated
63   else
64     if @tabulate
65       index = @written[value]
66       if index.nil?
67         @packer.write(value)
68         written = true
69         @written[value] = @written.size
70       else
71         value = Extension::InnerTabulation.new(index)
72       end
73     end
74   end
75   @packer.write(value) unless written
76 end
write_tpl(ep, value) click to toggle source

Called from extension callbacks only

@api private

    # File lib/puppet/pops/serialization/abstract_writer.rb
102 def write_tpl(ep, value)
103   #TRANSLATORS 'Integers' is a Ruby class for numbers and should not be translated
104   raise ArgumentError, _('Internal error. Integers cannot be tabulated in extension payload') if value.is_a?(Integer)
105   if @tabulate
106     index = @written[value]
107     if index.nil?
108       @written[value] = @written.size
109     else
110       value = index
111     end
112   end
113   ep.write(value)
114 end
write_tpl_qname(ep, qname) click to toggle source

Called from extension callbacks only

@api private

   # File lib/puppet/pops/serialization/abstract_writer.rb
93 def write_tpl_qname(ep, qname)
94   names = qname.split('::')
95   ep.write(names.size)
96   names.each {|n| write_tpl(ep, n)}
97 end