event_store_client 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b9e8e4782cfd1b70376d4531ae7452d721e7af3078f23a2c6d345e654fed5d1d
4
- data.tar.gz: b7de94d902e0ff87747b5f58f3740c580473514638901ed666fc07d98fc47b7f
3
+ metadata.gz: 82b73db66b7feef1d17e010f9e410476ab900bd6b137af03ee57106f2aefea6b
4
+ data.tar.gz: 926d40bfa51a581de7f9e7942d7092e4e0f0d7c23d1c932cb689946ef3a690f5
5
5
  SHA512:
6
- metadata.gz: 03015ede0f74da75119247433579079ee2d71a9ab9f347d23a2f52915c5bc3441574f098a9509843325c5dd568c95c6c77681a7aaa81c364b90397e95181f929
7
- data.tar.gz: 10f9a45843bc18f0e2e35294b9dee0c7e0c1f9a33e1e4c41881f407c82ee5df4714aaef6f6d4879b271f7ef6ea032e7e765d0f97ff23b99046a68ff2b230bffb
6
+ metadata.gz: 59dc478314bb1a15895dfe851248d6c1b62a381c26d03c8f7d1d18465a1407a28f007a959f2c655222b54dd310929df5430528125c3c97221393e3ce3b937256
7
+ data.tar.gz: bb92b9f60639f5d0552c69b493e0e6dbb8e6985e89d7f4f78de6df45c12e6098554e7de13f8880e45fd84a8ddc8528eec778a78715ebd591fcc5c331709bea4a
data/README.md CHANGED
@@ -9,7 +9,7 @@ An easy-to use GRPC API client for connecting ruby applications with [EventStore
9
9
 
10
10
  `event_store_client` gem requires:
11
11
 
12
- - ruby 2.7 or newer.
12
+ - ruby 3.0 or newer.
13
13
  - EventstoreDB version `>= "20.*"`.
14
14
 
15
15
  ## Installation
@@ -1,6 +1,4 @@
1
- # @title Appending events
2
-
3
- # Append your first event
1
+ # Appending Events
4
2
 
5
3
  ## Append your first event
6
4
 
@@ -15,10 +13,10 @@ event = SomethingHappened.new(
15
13
  )
16
14
 
17
15
  begin
18
- EventStoreClient.client.append_to_stream('some-stream', event)
16
+ EventStoreClient.client.append_to_stream('some-stream', event)
19
17
  # => EventStore::Client::Streams::AppendResp
20
18
  rescue EventStoreClient::WrongExpectedVersionError => e
21
- puts e.message
19
+ puts e.message
22
20
  end
23
21
  ```
24
22
 
@@ -38,7 +36,7 @@ event2 = SomethingHappened.new(
38
36
  )
39
37
 
40
38
  begin
41
- EventStoreClient.client.append_to_stream('some-stream', [event1, event2])
39
+ EventStoreClient.client.append_to_stream('some-stream', [event1, event2])
42
40
  # => Array<EventStore::Client::Streams::AppendResp>
43
41
  rescue EventStoreClient::WrongExpectedVersionError => e
44
42
  puts e.message
@@ -1,6 +1,4 @@
1
- # @title Catch-up subscriptions
2
-
3
- # Catch-up subscriptions
1
+ # Catch-up Subscriptions
4
2
 
5
3
  Subscriptions allow you to subscribe to a stream and receive notifications about new events added to the stream.
6
4
 
@@ -111,7 +109,7 @@ An application, which hosts the subscription, can go offline for a period of tim
111
109
  checkpoint = :start
112
110
  handler = proc do |event|
113
111
  handle_event(event)
114
- checkpoint = event.stream_revision
112
+ checkpoint = event.stream_revision
115
113
  end
116
114
 
117
115
  EventStoreClient.client.subscribe_to_stream('some-stream', handler: handler, options: { from_revision: checkpoint })
@@ -1,5 +1,3 @@
1
- # @title Configuration
2
-
3
1
  # Configuration
4
2
 
5
3
  Configuration options:
@@ -28,9 +26,9 @@ end
28
26
  the resulting `channel_args` value will be
29
27
 
30
28
  ```ruby
31
- {
32
- "grpc.min_reconnect_backoff_ms" => 200,
33
- "grpc.max_reconnect_backoff_ms" => 100,
29
+ {
30
+ "grpc.min_reconnect_backoff_ms" => 200,
31
+ "grpc.max_reconnect_backoff_ms" => 100,
34
32
  "grpc.initial_reconnect_backoff_ms" => 100
35
33
  }
36
34
  ```
@@ -39,7 +37,7 @@ This behaviour is intentional. So, if you want to override them all - you should
39
37
 
40
38
  ```ruby
41
39
  EventStoreClient.configure do |config|
42
- config.channel_args = {
40
+ config.channel_args = {
43
41
  'grpc.min_reconnect_backoff_ms' => 500,
44
42
  'grpc.max_reconnect_backoff_ms' => 500,
45
43
  'grpc.initial_reconnect_backoff_ms' => 500
@@ -139,7 +137,7 @@ EventStoreClient.configure(name: :es_db_1) do |config|
139
137
  end
140
138
  EventStoreClient.configure(name: :es_db_2) do |config|
141
139
  # adjust your second config here
142
- config.eventstore_url = 'esdb://localhost:2114'
140
+ config.eventstore_url = 'esdb://localhost:2114'
143
141
  end
144
142
  ```
145
143
 
@@ -162,7 +160,7 @@ Setup your default config:
162
160
  ```ruby
163
161
  EventStoreClient.configure do |config|
164
162
  # config goes here
165
- config.eventstore_url = 'esdb://localhost:2113'
163
+ config.eventstore_url = 'esdb://localhost:2113'
166
164
  end
167
165
  ```
168
166
 
@@ -1,6 +1,4 @@
1
- # @title Deleting streams
2
-
3
- # Deleting streams
1
+ # Deleting Streams
4
2
 
5
3
  ## Soft deleting streams
6
4
 
@@ -1,6 +1,4 @@
1
- # @title Encrypting events
2
-
3
- # Encrypting events
1
+ # Encrypting Events
4
2
 
5
3
  To encrypt/decrypt events payload, you can use an encrypted mapper.
6
4
 
@@ -1,6 +1,4 @@
1
- # @title Linking events
2
-
3
- # Linking events
1
+ # Linking Events
4
2
 
5
3
  ## Linking single event
6
4
 
@@ -20,7 +18,7 @@ EventStoreClient.client.append_to_stream(stream_name_1, event)
20
18
  # Get persisted event
21
19
  event = EventStoreClient.client.read(stream_name_1).first
22
20
  # Link event from first stream into second stream
23
- EventStoreClient.client.link_to(stream_name_2, event)
21
+ EventStoreClient.client.link_to(stream_name_2, event)
24
22
  # => EventStore::Client::Streams::AppendResp
25
23
  ```
26
24
 
@@ -55,7 +53,7 @@ end
55
53
  # Get persisted events
56
54
  events = EventStoreClient.client.read(stream_name_1)
57
55
  # Link events from first stream into second stream one by one
58
- EventStoreClient.client.link_to(stream_name_2, events)
56
+ EventStoreClient.client.link_to(stream_name_2, events)
59
57
  # => Array<EventStore::Client::Streams::AppendResp>
60
58
  ```
61
59
 
@@ -86,7 +84,7 @@ events = EventStoreClient.client.read(stream_name_1)
86
84
  begin
87
85
  EventStoreClient.client.link_to(stream_name_2, events, options: { expected_revision: :no_stream })
88
86
  rescue EventStoreClient::WrongExpectedVersionError => e
89
- puts e.message
87
+ puts e.message
90
88
  end
91
89
  ```
92
90
 
@@ -1,6 +1,4 @@
1
- # @title Reading events
2
-
3
- # Reading events
1
+ # Reading Events
4
2
 
5
3
  ## Reading from a stream
6
4
 
@@ -63,7 +61,7 @@ In case a stream with given name does not exist - `EventStoreClient::StreamNotFo
63
61
 
64
62
  ```ruby
65
63
  begin
66
- EventStoreClient.client.read('non-existing-stream')
64
+ EventStoreClient.client.read('non-existing-stream')
67
65
  rescue EventStoreClient::StreamNotFoundError => e
68
66
  puts e.message # => Stream "non-existing-stream" does not exist.
69
67
  puts e.stream_name # => "non-existing-stream"
@@ -48,28 +48,43 @@ module EventStoreClient
48
48
 
49
49
  # @return [String]
50
50
  def user_friendly_message
51
- if wrong_expected_version.expected_stream_exists
52
- return "Expected stream to exist, but it doesn't."
53
- end
54
- if wrong_expected_version.expected_no_stream
55
- return "Expected stream to be absent, but it actually exists."
56
- end
57
- if wrong_expected_version.current_no_stream
58
- return <<~TEXT.strip
59
- Stream revision #{wrong_expected_version.expected_revision.inspect} is expected, but \
60
- stream does not exist.
61
- TEXT
62
- end
51
+ return expected_stream_exists if wrong_expected_version.expected_stream_exists
52
+ return expected_no_stream if wrong_expected_version.expected_no_stream
53
+ return current_no_stream if wrong_expected_version.current_no_stream
63
54
  unless wrong_expected_version.expected_revision == wrong_expected_version.current_revision
64
- return <<~TEXT.strip
65
- Stream revision #{wrong_expected_version.expected_revision.inspect} is expected, but \
66
- actual stream revision is #{wrong_expected_version.current_revision.inspect}.
67
- TEXT
55
+ return unmatched_stream_revision
68
56
  end
57
+
69
58
  # Unhandled case. Could happen if something else would be added to proto and I don't add it
70
59
  # here.
71
60
  self.class.to_s
72
61
  end
62
+
63
+ # @return [String]
64
+ def expected_stream_exists
65
+ "Expected stream to exist, but it doesn't."
66
+ end
67
+
68
+ # @return [String]
69
+ def expected_no_stream
70
+ "Expected stream to be absent, but it actually exists."
71
+ end
72
+
73
+ # @return [String]
74
+ def current_no_stream
75
+ <<~TEXT.strip
76
+ Stream revision #{wrong_expected_version.expected_revision.inspect} is expected, but \
77
+ stream does not exist.
78
+ TEXT
79
+ end
80
+
81
+ # @return [String]
82
+ def unmatched_stream_revision
83
+ <<~TEXT.strip
84
+ Stream revision #{wrong_expected_version.expected_revision.inspect} is expected, but \
85
+ actual stream revision is #{wrong_expected_version.current_revision.inspect}.
86
+ TEXT
87
+ end
73
88
  end
74
89
 
75
90
  class StreamDeletionError < Error
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This matcher is defined to test options which are defined by using
4
+ # EventStoreClient::Extensions::OptionsExtension option. Example:
5
+ # Let's say you have next class
6
+ # class SomeClass
7
+ # include EventStoreClient::Extensions::OptionsExtension
8
+ #
9
+ # option(:some_opt) { '1' }
10
+ # end
11
+ #
12
+ # To test that its instance has the proper option with the proper default value you can use this
13
+ # matcher:
14
+ # RSpec.describe SomeClass do
15
+ # subject { described_class.new }
16
+ #
17
+ # # Check that :some_opt is present
18
+ # it { is_expected.to have_option(:some_opt) }
19
+ # # Check that :some_opt is present and has the correct default value
20
+ # it { is_expected.to have_option(:some_opt).with_default_value('1') }
21
+ # end
22
+ #
23
+ # If you have more complex implementation of default value of your option - you should handle it
24
+ # customly. For example:
25
+ # class SomeClass
26
+ # include EventStoreClient::Extensions::OptionsExtension
27
+ #
28
+ # option(:some_opt) { calc_value }
29
+ # end
30
+ # You could test it like so:
31
+ # RSpec.described SomeClass do
32
+ # let(:instance) { described_class.new }
33
+ #
34
+ # describe ':some_opt default value' do
35
+ # subject { instance.some_opt }
36
+ #
37
+ # let(:value) { 'some val' }
38
+ #
39
+ # before do
40
+ # allow(instance).to receive(:calc_value).and_return(value)
41
+ # end
42
+ #
43
+ # it { is_expected.to eq(value) }
44
+ # end
45
+ # end
46
+ RSpec::Matchers.define :has_option do |option_name|
47
+ match do |obj|
48
+ option_presence = obj.class.respond_to?(:options) && obj.class.options.include?(option_name)
49
+ if @default_value
50
+ option_presence && obj.class.allocate.public_send(option_name) == @default_value
51
+ else
52
+ option_presence
53
+ end
54
+ end
55
+
56
+ failure_message do |obj|
57
+ option_presence = obj.class.respond_to?(:options) && obj.class.options.include?(option_name)
58
+ if option_presence && @default_value
59
+ msg = "Expected #{obj.class} to have `#{option_name.inspect}' option with #{@default_value.inspect}"
60
+ msg += ' default value, but default value is'
61
+ msg += " #{obj.class.allocate.public_send(option_name).inspect}"
62
+ else
63
+ msg = "Expected #{obj} to have `#{option_name.inspect}' option."
64
+ end
65
+
66
+ msg
67
+ end
68
+
69
+ description do
70
+ expected_list = RSpec::Matchers::EnglishPhrasing.list(expected)
71
+ sentences =
72
+ @chained_method_clauses.map do |(method_name, method_args)|
73
+ next '' if method_name == :required_kwargs
74
+
75
+ english_name = RSpec::Matchers::EnglishPhrasing.split_words(method_name)
76
+ arg_list = RSpec::Matchers::EnglishPhrasing.list(method_args)
77
+ " #{english_name}#{arg_list}"
78
+ end.join
79
+
80
+ "have#{expected_list} option#{sentences}"
81
+ end
82
+
83
+ chain :with_default_value do |val|
84
+ @default_value = val
85
+ end
86
+ end
87
+
88
+ RSpec::Matchers.alias_matcher :have_option, :has_option
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EventStoreClient
4
- VERSION = '3.0.0'
4
+ VERSION = '3.1.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: event_store_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Wilgosz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-06 00:00:00.000000000 Z
11
+ date: 2023-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grpc
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.11'
47
+ version: '3.12'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.11'
54
+ version: '3.12'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: simplecov
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -226,6 +226,7 @@ files:
226
226
  - lib/event_store_client/mapper.rb
227
227
  - lib/event_store_client/mapper/default.rb
228
228
  - lib/event_store_client/mapper/encrypted.rb
229
+ - lib/event_store_client/rspec/has_option_matcher.rb
229
230
  - lib/event_store_client/serialized_event.rb
230
231
  - lib/event_store_client/serializer/event_deserializer.rb
231
232
  - lib/event_store_client/serializer/event_serializer.rb
@@ -245,14 +246,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
245
246
  requirements:
246
247
  - - ">="
247
248
  - !ruby/object:Gem::Version
248
- version: '0'
249
+ version: 3.0.0
249
250
  required_rubygems_version: !ruby/object:Gem::Requirement
250
251
  requirements:
251
252
  - - ">="
252
253
  - !ruby/object:Gem::Version
253
254
  version: '0'
254
255
  requirements: []
255
- rubygems_version: 3.3.7
256
+ rubygems_version: 3.4.10
256
257
  signing_key:
257
258
  specification_version: 4
258
259
  summary: Ruby integration for https://eventstore.org