Skip to content

Commit

Permalink
Introduce serializers wrapper class
Browse files Browse the repository at this point in the history
Provides a wrapper around a set of serializers with constraints to
prevent breakage.
  • Loading branch information
sorentwo committed Sep 16, 2015
1 parent 004d50e commit b30d785
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 0 deletions.
6 changes: 6 additions & 0 deletions lib/readthis.rb
@@ -1,5 +1,11 @@
require 'readthis/cache'
require 'readthis/version'
require 'readthis/serializers'

module Readthis
extend self

def serializers
@serializers ||= Readthis::Serializers.new
end
end
49 changes: 49 additions & 0 deletions lib/readthis/serializers.rb
@@ -0,0 +1,49 @@
require 'readthis/passthrough'

module Readthis
SerializersFrozenError = Class.new(Exception)
SerializersLimitError = Class.new(Exception)

class Serializers
BASE_SERIALIZERS = {
Marshal => 0x1,
Passthrough => 0x2,
JSON => 0x3
}.freeze

SERIALIZER_LIMIT = 7

attr_reader :serializers

def initialize
@serializers = BASE_SERIALIZERS.dup
end

def inverted
serializers.invert
end

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

def freeze!
serializers.freeze
end

def modules
serializers.keys
end

def flags
serializers.values
end
end
end
58 changes: 58 additions & 0 deletions spec/readthis/serializers_spec.rb
@@ -0,0 +1,58 @@
require 'readthis/serializers'

RSpec.describe Readthis::Serializers do
CustomSerializer = Class.new
AnotherSerializer = Class.new

describe '#<<' do
it 'appends new serializers' do
serializers = Readthis::Serializers.new

serializers << CustomSerializer

expect(serializers.modules).to include(CustomSerializer)
expect(serializers.flags).to eq((1..4).to_a)
expect(serializers.serializers).to include(
CustomSerializer => 4
)
end

it 'increments flags' do
serializers = Readthis::Serializers.new
serializers << CustomSerializer
serializers << AnotherSerializer

expect(serializers.flags).to eq((1..5).to_a)
end

it 'prevents more than seven serializers' do
serializers = Readthis::Serializers.new

expect {
10.times { serializers << Class.new }
}.to raise_error(Readthis::SerializersLimitError)
end
end

describe '#inverted' do
it 'inverts the current set of serializers' do
serializers = Readthis::Serializers.new

expect(serializers.inverted).to include(
1 => Marshal
)
end
end

describe '#freeze' do
it 'does now allow appending after freeze' do
serializers = Readthis::Serializers.new

serializers.freeze!

expect {
serializers << CustomSerializer
}.to raise_error(Readthis::SerializersFrozenError)
end
end
end
9 changes: 9 additions & 0 deletions spec/readthis_spec.rb
@@ -0,0 +1,9 @@
require 'readthis'

RSpec.describe Readthis do
describe '#serializers' do
it 'lists currently configured serializers' do
expect(Readthis.serializers.keys).to include(Marshal, JSON)
end
end
end

0 comments on commit b30d785

Please sign in to comment.