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:
-
Boolean
-
Integer
-
Float
-
String
and, by using extensions, also
-
Array start
-
Map start
-
Objectstart -
Regexp
-
Version
-
VersionRange
-
Timespan
-
Timestamp
-
Default
@api public
Public Class Methods
@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
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
@api private
# File lib/puppet/pops/serialization/abstract_writer.rb 86 def extension_packer 87 @extension_packer 88 end
Tell the underlying packer to flush. @api public
# File lib/puppet/pops/serialization/abstract_writer.rb 45 def finish 46 @packer.flush 47 end
# File lib/puppet/pops/serialization/abstract_writer.rb 218 def inspect 219 to_s 220 end
@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
@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
# File lib/puppet/pops/serialization/abstract_writer.rb 49 def supports_binary? 50 false 51 end
# File lib/puppet/pops/serialization/abstract_writer.rb 214 def to_s 215 "#{self.class.name}" 216 end
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
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
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