Module: Announcer::Mixins::Serializable::ClassMethods

Defined in:
lib/announcer/mixins/serializable.rb

Instance Method Summary collapse

Instance Method Details

#_deserialize_arg(arg) ⇒ Object



39
40
41
42
43
44
45
# 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) ⇒ Object



29
30
31
32
33
34
35
36
37
# 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_argsObject



152
153
154
155
# 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) ⇒ Object



54
55
56
57
58
59
60
# 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) ⇒ Object



85
86
87
# 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) ⇒ Object

Encoding



50
51
52
# File 'lib/announcer/mixins/serializable.rb', line 50

def _serializable_encode(marshalled)
  Base64.strict_encode64(marshalled) # => encoded
end

#_serializable_encode_class(klass) ⇒ Object

Class Encoding



81
82
83
# 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) ⇒ Object



24
25
26
27
# 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) ⇒ Object

Marshalling



65
66
67
# File 'lib/announcer/mixins/serializable.rb', line 65

def _serializable_marshal(package)
  Marshal.dump(package) # => marshalled
end

#_serializable_package(klass, args) ⇒ Object

Packaging



92
93
94
95
# 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) ⇒ Object



69
70
71
72
73
74
75
# 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) ⇒ Object



138
139
140
141
142
143
# 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) ⇒ Boolean

Returns:

  • (Boolean)


97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# 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_valuesObject

Helpers



148
149
150
# File 'lib/announcer/mixins/serializable.rb', line 148

def _serializable_values
  @__serializable_values ||= {}
end

#deserialize(encoded) ⇒ Object



18
19
20
21
22
# 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) ⇒ Object



14
15
16
# File 'lib/announcer/mixins/serializable.rb', line 14

def serialize_with(*args)
  _serializable_values[:args] = args.map(&:to_sym)
end