diff --git a/.mutant.yml b/.mutant.yml index f4c2821..ab0865b 100644 --- a/.mutant.yml +++ b/.mutant.yml @@ -19,3 +19,4 @@ matcher: - En57::EventStore.for_sequel - En57::JsonSerializer#optional_big_decimal_type - En57::Migrator* + - En57::Repository#initialize diff --git a/lib/en57.rb b/lib/en57.rb index 6a2bc44..42ff441 100644 --- a/lib/en57.rb +++ b/lib/en57.rb @@ -11,7 +11,16 @@ require_relative "en57/active_record_adapter" if defined?(ActiveRecord) require_relative "en57/repository" require_relative "en57/migrator" require_relative "en57/event_store" +require_relative "en57/configuration" module En57 AppendConditionViolated = Class.new(StandardError) + + def self.configuration = Configuration.instance + + def self.configure + yield configuration + ensure + configuration.freeze + end end diff --git a/lib/en57/active_record_adapter.rb b/lib/en57/active_record_adapter.rb index 1962aba..d9c06e8 100644 --- a/lib/en57/active_record_adapter.rb +++ b/lib/en57/active_record_adapter.rb @@ -25,12 +25,7 @@ module En57 class EventStore def self.for_active_record(model = ActiveRecord::Base) - new( - Repository.new( - ActiveRecordAdapter.new(model.connection_pool), - JsonSerializer.new, - ), - ) + new(Repository.new(ActiveRecordAdapter.new(model.connection_pool))) end end end diff --git a/lib/en57/configuration.rb b/lib/en57/configuration.rb new file mode 100644 index 0000000..1670cbf --- /dev/null +++ b/lib/en57/configuration.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require "singleton" + +module En57 + class Configuration + include Singleton + + attr_accessor :serializer + + def initialize + @serializer = JsonSerializer.new + end + end +end diff --git a/lib/en57/pg_adapter.rb b/lib/en57/pg_adapter.rb index 3324cd6..66a4cf1 100644 --- a/lib/en57/pg_adapter.rb +++ b/lib/en57/pg_adapter.rb @@ -39,12 +39,7 @@ module En57 class EventStore def self.for_pg(connection_uri) - new( - Repository.new( - PgAdapter.for_connection(PG.connect(connection_uri)), - JsonSerializer.new, - ), - ) + new(Repository.new(PgAdapter.for_connection(PG.connect(connection_uri)))) end end @@ -58,7 +53,6 @@ module En57 PG.connect(connection_uri) end, ), - JsonSerializer.new, ), ) end diff --git a/lib/en57/repository.rb b/lib/en57/repository.rb index 0fde7f8..dddf761 100644 --- a/lib/en57/repository.rb +++ b/lib/en57/repository.rb @@ -4,7 +4,7 @@ require "pg" module En57 class Repository - def initialize(adapter, serializer) + def initialize(adapter, serializer = En57.configuration.serializer) @adapter = adapter @serializer = serializer @record_encoder = PG::TextEncoder::Record.new diff --git a/lib/en57/sequel_adapter.rb b/lib/en57/sequel_adapter.rb index ea4565c..871c8c0 100644 --- a/lib/en57/sequel_adapter.rb +++ b/lib/en57/sequel_adapter.rb @@ -24,7 +24,7 @@ module En57 class EventStore def self.for_sequel(database) - new(Repository.new(SequelAdapter.new(database), JsonSerializer.new)) + new(Repository.new(SequelAdapter.new(database))) end end end diff --git a/test/test_en57.rb b/test/test_en57.rb index b8c2900..3a0f030 100644 --- a/test/test_en57.rb +++ b/test/test_en57.rb @@ -24,8 +24,36 @@ module En57 RUBY end + def test_configuration_default_serializer + assert_kind_of JsonSerializer, En57.configuration.serializer + end + + def test_configure + with_empty_configuration do + serializer = Object.new + En57.configure { |c| c.serializer = serializer } + + assert_equal serializer, En57.configuration.serializer + end + end + + def test_configure_disallows_further_modifications_after_boot + with_empty_configuration do + serializer = Object.new + En57.configure { |c| c.serializer = serializer } + + assert_raises(FrozenError) do + En57.configure { |c| c.serializer = serializer } + end + end + end + private + def with_empty_configuration + En57.stub(:configuration, Class.new(Configuration).instance) { yield } + end + def assert_ruby(script) reader, writer = IO.pipe pid =