Skip to content

Commit f9b6505

Browse files
committed
Add global configuration to tweak defaults
- Only permit changing serializer for now, nothing else makes sense. - In the future this would allow choosing PG backends, to make best fit for application constraints in which En57 is embedded.
1 parent 4da34f7 commit f9b6505

8 files changed

Lines changed: 57 additions & 15 deletions

File tree

.mutant.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ matcher:
1919
- En57::EventStore.for_sequel
2020
- En57::JsonSerializer#optional_big_decimal_type
2121
- En57::Migrator*
22+
- En57::Repository#initialize

lib/en57.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,16 @@
1111
require_relative "en57/repository"
1212
require_relative "en57/migrator"
1313
require_relative "en57/event_store"
14+
require_relative "en57/configuration"
1415

1516
module En57
1617
AppendConditionViolated = Class.new(StandardError)
18+
19+
def self.configuration = Configuration.instance
20+
21+
def self.configure
22+
yield configuration
23+
ensure
24+
configuration.freeze
25+
end
1726
end

lib/en57/active_record_adapter.rb

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,7 @@ def with_serializable_transaction
2525

2626
class EventStore
2727
def self.for_active_record(model = ActiveRecord::Base)
28-
new(
29-
Repository.new(
30-
ActiveRecordAdapter.new(model.connection_pool),
31-
JsonSerializer.new,
32-
),
33-
)
28+
new(Repository.new(ActiveRecordAdapter.new(model.connection_pool)))
3429
end
3530
end
3631
end

lib/en57/configuration.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# frozen_string_literal: true
2+
3+
require "singleton"
4+
5+
module En57
6+
class Configuration
7+
include Singleton
8+
9+
attr_accessor :serializer
10+
11+
def initialize
12+
@serializer = JsonSerializer.new
13+
end
14+
end
15+
end

lib/en57/pg_adapter.rb

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,7 @@ def with
3939

4040
class EventStore
4141
def self.for_pg(connection_uri)
42-
new(
43-
Repository.new(
44-
PgAdapter.for_connection(PG.connect(connection_uri)),
45-
JsonSerializer.new,
46-
),
47-
)
42+
new(Repository.new(PgAdapter.for_connection(PG.connect(connection_uri))))
4843
end
4944
end
5045

@@ -58,7 +53,6 @@ def self.for_pooled_pg(connection_uri, max_connections: 5)
5853
PG.connect(connection_uri)
5954
end,
6055
),
61-
JsonSerializer.new,
6256
),
6357
)
6458
end

lib/en57/repository.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
module En57
66
class Repository
7-
def initialize(adapter, serializer)
7+
def initialize(adapter, serializer = En57.configuration.serializer)
88
@adapter = adapter
99
@serializer = serializer
1010
@record_encoder = PG::TextEncoder::Record.new

lib/en57/sequel_adapter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def with_serializable_transaction
2424

2525
class EventStore
2626
def self.for_sequel(database)
27-
new(Repository.new(SequelAdapter.new(database), JsonSerializer.new))
27+
new(Repository.new(SequelAdapter.new(database)))
2828
end
2929
end
3030
end

test/test_en57.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,36 @@ def test_requiring_en57_without_active_record_skips_active_record_adapter
2424
RUBY
2525
end
2626

27+
def test_configuration_default_serializer
28+
assert_kind_of JsonSerializer, En57.configuration.serializer
29+
end
30+
31+
def test_configure
32+
with_empty_configuration do
33+
serializer = Object.new
34+
En57.configure { |c| c.serializer = serializer }
35+
36+
assert_equal serializer, En57.configuration.serializer
37+
end
38+
end
39+
40+
def test_configure_disallows_further_modifications_after_boot
41+
with_empty_configuration do
42+
serializer = Object.new
43+
En57.configure { |c| c.serializer = serializer }
44+
45+
assert_raises(FrozenError) do
46+
En57.configure { |c| c.serializer = serializer }
47+
end
48+
end
49+
end
50+
2751
private
2852

53+
def with_empty_configuration
54+
En57.stub(:configuration, Class.new(Configuration).instance) { yield }
55+
end
56+
2957
def assert_ruby(script)
3058
reader, writer = IO.pipe
3159
pid =

0 commit comments

Comments
 (0)