Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Provides a wrapper around a set of serializers with constraints to prevent breakage.
- Loading branch information
Showing
4 changed files
with
122 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |