module Announcer::Mixins::Serializable::ClassMethods

Public Instance Methods

_deserialize_arg(arg) click to toggle source
# File lib/announcer/mixins/serializable.rb, line 39
def _deserialize_arg(arg)
  if _serializable_valid_package?(arg, false)
    _serializable_load_package(arg)
  else
    arg
  end
end
_deserialize_args(args) click to toggle source
# File lib/announcer/mixins/serializable.rb, line 29
def _deserialize_args(args)
  args = args.map { |arg| _deserialize_arg(arg) }

  if respond_to?(:load_from_serialized)
    load_from_serialized(*args)
  else
    new(*args)
  end
end
_serializable_args() click to toggle source
# File lib/announcer/mixins/serializable.rb, line 152
def _serializable_args
  _serializable_values[:args] or
    raise Errors::SerializableError, "Missing serialize_with definition"
end
_serializable_decode(encoded) click to toggle source
# File lib/announcer/mixins/serializable.rb, line 54
def _serializable_decode(encoded)
  begin
    Base64.strict_decode64(encoded) # => marshalled
  rescue ArgumentError
    raise Errors::SerializableError, 'serialized string not encoded properly'
  end
end
_serializable_decode_class(encoded_klass) click to toggle source
# File lib/announcer/mixins/serializable.rb, line 85
def _serializable_decode_class(encoded_klass)
  Announcer.const_get(encoded_klass.to_s)
end
_serializable_encode(marshalled) click to toggle source

Encoding

# File lib/announcer/mixins/serializable.rb, line 50
def _serializable_encode(marshalled)
  Base64.strict_encode64(marshalled) # => encoded
end
_serializable_encode_class(klass) click to toggle source

Class Encoding

# File lib/announcer/mixins/serializable.rb, line 81
def _serializable_encode_class(klass)
  klass.name.to_s.sub('Announcer::', '').to_sym
end
_serializable_load_package(package) click to toggle source
# File lib/announcer/mixins/serializable.rb, line 24
def _serializable_load_package(package)
  klass, args = _serializable_unpackage(package)
  klass._deserialize_args(args)
end
_serializable_marshal(package) click to toggle source

Marshalling

# File lib/announcer/mixins/serializable.rb, line 65
def _serializable_marshal(package)
  Marshal.dump(package) # => marshalled
end
_serializable_package(klass, args) click to toggle source

Packaging

# File lib/announcer/mixins/serializable.rb, line 92
def _serializable_package(klass, args)
  encoded_klass = _serializable_encode_class(klass)
  [MAGIC, VERSION, encoded_klass] + args # => package
end
_serializable_unmarshal(marshalled) click to toggle source
# File lib/announcer/mixins/serializable.rb, line 69
def _serializable_unmarshal(marshalled)
  begin
    Marshal.load(marshalled) # => package
  rescue TypeError
    raise Errors::SerializableError, 'incorrect format'
  end
end
_serializable_unpackage(package) click to toggle source
# File lib/announcer/mixins/serializable.rb, line 138
def _serializable_unpackage(package)
  _serializable_valid_package?(package)
  magic, version, encoded_klass, *args = package
  klass = _serializable_decode_class(encoded_klass)
  [klass, args]
end
_serializable_valid_package?(package, noisy=true) click to toggle source
# File lib/announcer/mixins/serializable.rb, line 97
def _serializable_valid_package?(package, noisy=true)
  unless package.is_a?(Array)
    if noisy
      raise Errors::SerializableError, 'not a package'
    else
      return false
    end
  end

  magic, version, class_name = package

  # Check Magic
  unless magic == MAGIC
    if noisy
      raise Errors::SerializableError, 'invalid serialized package'
    else
      return false
    end
  end

  # Check Version
  unless version == VERSION
    if noisy
      raise Errors::SerializableError, 'unsupported package version'
    else
      return false
    end
  end

  # Check Class Name
  unless class_name.is_a?(Symbol)
    if noisy
      raise Errors::SerializableError, 'invalid class name'
    else
      return false
    end
  end

  return true
end
_serializable_values() click to toggle source

Helpers

# File lib/announcer/mixins/serializable.rb, line 148
def _serializable_values
  @__serializable_values ||= {}
end
deserialize(encoded) click to toggle source
# File lib/announcer/mixins/serializable.rb, line 18
def deserialize(encoded)
  marshalled = _serializable_decode(encoded)
  package = _serializable_unmarshal(marshalled)
  _serializable_load_package(package)
end
serialize_with(*args) click to toggle source
# File lib/announcer/mixins/serializable.rb, line 14
def serialize_with(*args)
  _serializable_values[:args] = args.map(&:to_sym)
end