Class: Readthis::Serializers

Inherits:
Object
  • Object
show all
Defined in:
lib/readthis/serializers.rb

Constant Summary collapse

BASE_SERIALIZERS =

Defines the default set of three serializers: Marshal, Passthrough, and JSON. With a hard limit of 7 that leaves 4 additional slots.

{
  Marshal => 0x1,
  Passthrough => 0x2,
  JSON => 0x3
}.freeze
SERIALIZER_LIMIT =

The hard serializer limit, based on the number of possible values within a single 3bit integer.

7

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSerializers

Creates a new Readthis::Serializers entity. No configuration is expected during initialization.



24
25
26
# File 'lib/readthis/serializers.rb', line 24

def initialize
  reset!
end

Instance Attribute Details

#invertedObject (readonly)

Returns the value of attribute inverted.



19
20
21
# File 'lib/readthis/serializers.rb', line 19

def inverted
  @inverted
end

#serializersObject (readonly)

Returns the value of attribute serializers.



19
20
21
# File 'lib/readthis/serializers.rb', line 19

def serializers
  @serializers
end

Instance Method Details

#<<(serializer) ⇒ self

Append a new serializer. Up to 7 total serializers may be configured for any single application be configured for any single application. This limit is based on the number of bytes available in the option flag.

Examples:


serializers = Readthis::Serializers.new
serializers << Oj

Parameters:

  • serializer (Module)

    Any object that responds to ‘dump` and `load`

Returns:

  • (self)

    Returns itself for possible chaining



40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/readthis/serializers.rb', line 40

def <<(serializer)
  case
  when serializers.frozen?
    raise SerializersFrozenError
  when serializers.length >= SERIALIZER_LIMIT
    raise SerializersLimitError
  else
    @serializers[serializer] = flags.max.succ
    @inverted = @serializers.invert
  end

  self
end

#assoc(serializer) ⇒ Number

Find a flag for a serializer object.

Examples:


serializers.assoc(JSON) #=> 1

Parameters:

  • serializer (Object)

    Look up a flag by object

Returns:

  • (Number)

    Corresponding flag for the serializer object

Raises:

  • (UnknownSerializerError)

    Indicates that a serializer was specified, but hasn’t been configured for usage.



79
80
81
82
83
84
85
86
87
# File 'lib/readthis/serializers.rb', line 79

def assoc(serializer)
  flag = serializers[serializer]

  unless flag
    raise UnknownSerializerError, "'#{serializer}' hasn't been configured"
  end

  flag
end

#flagsObject



108
109
110
# File 'lib/readthis/serializers.rb', line 108

def flags
  serializers.values
end

#freeze!Object

Freeze the serializers hash, preventing modification.



56
57
58
# File 'lib/readthis/serializers.rb', line 56

def freeze!
  serializers.freeze
end

#marshalsObject



103
104
105
# File 'lib/readthis/serializers.rb', line 103

def marshals
  serializers.keys
end

#rassoc(flag) ⇒ Module

Find a serializer object by flag value.

Examples:


serializers.rassoc(1) #=> Marshal

Parameters:

  • flag (Number)

    Integer to look up the serializer object by

Returns:

  • (Module)

    The serializer object



98
99
100
# File 'lib/readthis/serializers.rb', line 98

def rassoc(flag)
  inverted[flag & SERIALIZER_LIMIT]
end

#reset!Object

Reset the instance back to the default state. Useful for cleanup during testing.



63
64
65
66
# File 'lib/readthis/serializers.rb', line 63

def reset!
  @serializers = BASE_SERIALIZERS.dup
  @inverted = @serializers.invert
end