stenotype 0.1.13 → 0.1.17

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d0d5893588a564349ac48d4b860e5864d31ee18e204f56bfcb67efa7ca8150cb
4
- data.tar.gz: a11a18ddb4ea62a9c0dfa3a6bb4ab81eb7a7005f7c4f7e3ac9b8206863b25f72
3
+ metadata.gz: d3ece86eb9d12287228f0ed169992fe05fe087fa242017f2dd58c25bae90f88c
4
+ data.tar.gz: 0a53db551815f5d2f8dbf97f5c9fe95bd2a55326f8c751a39fcaa18270ab0d2f
5
5
  SHA512:
6
- metadata.gz: bbf72969fe6b256240563688230bc904bc5f24ae27339f970c74922736f1166d2513e2d4b8cfa6fd0411f5f262c62f7e9864f92644cdf449f9c9b37b94540ef8
7
- data.tar.gz: d210cf4081e569e3e2ebeb6fc2a302394ffdd9e7145088f67166ea4060a51441a76ad92b5209d08fbf0463efc680f7c4fae5c2c0cadaeaa7a4263c43b0347ed4
6
+ metadata.gz: 1b0b60acc691c11caa719e686aa6378f8142466d441a674681c9b745afbc80d3bfb69e155d66ac99bc75a4333d0d23f275722c54840263009ceebcf8992b56bd
7
+ data.tar.gz: cf5db9b8359d73cb00aec740ae746ae4a435a030c9edc2fef7ea4cbdef3daed16551b5e3d4ac8f2b529dcfa4e9912515d46501ce5608f9869c6cb3f380b78fba
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ### 0.1.16
4
+ * Add rspec matchers to use in client code.
5
+
6
+ ### 0.1.15
7
+ * Updates readme.
8
+
9
+ ### 0.1.14
10
+ * Allows autodiscovering of the context handlers and Rails development env autoreload.
11
+
3
12
  ### 0.1.13
4
13
  * Removes obsolete rails pre-configuration for the sake of default configuration settings
5
14
 
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- stenotype (0.1.12)
4
+ stenotype (0.1.17)
5
5
  activesupport (>= 5.0.0)
6
- google-cloud-pubsub (~> 1.0.0)
6
+ google-cloud-pubsub (~> 1.10.0)
7
7
  spicery (>= 0.22.0, < 1.0)
8
8
 
9
9
  GEM
@@ -50,83 +50,109 @@ GEM
50
50
  i18n (>= 0.7, < 2)
51
51
  minitest (~> 5.1)
52
52
  tzinfo (~> 1.1)
53
- addressable (2.7.0)
53
+ addressable (2.8.0)
54
54
  public_suffix (>= 2.0.2, < 5.0)
55
55
  arel (9.0.0)
56
- around_the_world (0.22.4)
56
+ around_the_world (0.29.0)
57
57
  activesupport (>= 5.2.1)
58
58
  ast (2.4.0)
59
59
  builder (3.2.3)
60
60
  coderay (1.1.2)
61
- collectible (0.22.4)
61
+ collectible (0.29.0)
62
62
  activesupport (>= 5.2.1)
63
- short_circu_it (= 0.22.4)
64
- tablesalt (= 0.22.4)
63
+ short_circu_it (= 0.29.0)
64
+ tablesalt (= 0.29.0)
65
65
  concurrent-ruby (1.1.5)
66
- conjunction (0.22.4)
66
+ conjunction (0.29.0)
67
67
  activemodel (>= 5.2.1)
68
68
  activesupport (>= 5.2.1)
69
- spicerack (= 0.22.4)
69
+ directive (= 0.29.0)
70
70
  crass (1.0.5)
71
71
  diff-lcs (1.3)
72
- directive (0.22.4)
72
+ directive (0.29.0)
73
+ activemodel (>= 5.2.1)
73
74
  activesupport (>= 5.2.1)
75
+ substance (= 0.29.0)
74
76
  docile (1.3.2)
75
77
  erubi (1.9.0)
76
- facet (0.22.4)
78
+ facet (0.29.0)
77
79
  activesupport (>= 5.2.1)
78
- short_circu_it (= 0.22.4)
79
- tablesalt (= 0.22.4)
80
+ short_circu_it (= 0.29.0)
81
+ tablesalt (= 0.29.0)
80
82
  faker (1.9.6)
81
83
  i18n (>= 0.7)
82
- faraday (0.17.3)
83
- multipart-post (>= 1.2, < 3)
84
+ faraday (1.10.0)
85
+ faraday-em_http (~> 1.0)
86
+ faraday-em_synchrony (~> 1.0)
87
+ faraday-excon (~> 1.1)
88
+ faraday-httpclient (~> 1.0)
89
+ faraday-multipart (~> 1.0)
90
+ faraday-net_http (~> 1.0)
91
+ faraday-net_http_persistent (~> 1.0)
92
+ faraday-patron (~> 1.0)
93
+ faraday-rack (~> 1.0)
94
+ faraday-retry (~> 1.0)
95
+ ruby2_keywords (>= 0.0.4)
96
+ faraday-em_http (1.0.0)
97
+ faraday-em_synchrony (1.0.0)
98
+ faraday-excon (1.1.0)
99
+ faraday-httpclient (1.0.1)
100
+ faraday-multipart (1.0.4)
101
+ multipart-post (~> 2)
102
+ faraday-net_http (1.0.1)
103
+ faraday-net_http_persistent (1.2.0)
104
+ faraday-patron (1.0.0)
105
+ faraday-rack (1.0.0)
106
+ faraday-retry (1.0.3)
84
107
  github-markup (3.0.4)
85
108
  globalid (0.4.2)
86
109
  activesupport (>= 4.2.0)
87
- google-cloud-core (1.5.0)
110
+ google-cloud-core (1.6.0)
88
111
  google-cloud-env (~> 1.0)
89
112
  google-cloud-errors (~> 1.0)
90
- google-cloud-env (1.3.0)
91
- faraday (~> 0.11)
92
- google-cloud-errors (1.0.0)
93
- google-cloud-pubsub (1.0.2)
113
+ google-cloud-env (1.6.0)
114
+ faraday (>= 0.17.3, < 3.0)
115
+ google-cloud-errors (1.2.0)
116
+ google-cloud-pubsub (1.10.0)
94
117
  concurrent-ruby (~> 1.1)
95
118
  google-cloud-core (~> 1.2)
96
- google-gax (~> 1.7)
119
+ google-gax (~> 1.8)
97
120
  googleapis-common-protos (>= 1.3.9, < 2.0)
121
+ googleapis-common-protos-types (>= 1.0.4, < 2.0)
98
122
  grpc-google-iam-v1 (~> 0.6.9)
99
- google-gax (1.8.1)
123
+ google-gax (1.8.2)
100
124
  google-protobuf (~> 3.9)
101
125
  googleapis-common-protos (>= 1.3.9, < 2.0)
126
+ googleapis-common-protos-types (>= 1.0.4, < 2.0)
102
127
  googleauth (~> 0.9)
103
128
  grpc (~> 1.24)
104
129
  rly (~> 0.2.3)
105
- google-protobuf (3.11.4)
106
- googleapis-common-protos (1.3.9)
107
- google-protobuf (~> 3.0)
108
- googleapis-common-protos-types (~> 1.0)
109
- grpc (~> 1.0)
110
- googleapis-common-protos-types (1.0.4)
111
- google-protobuf (~> 3.0)
112
- googleauth (0.11.0)
130
+ google-protobuf (3.21.2)
131
+ googleapis-common-protos (1.3.12)
132
+ google-protobuf (~> 3.14)
133
+ googleapis-common-protos-types (~> 1.2)
134
+ grpc (~> 1.27)
135
+ googleapis-common-protos-types (1.3.2)
136
+ google-protobuf (~> 3.14)
137
+ googleauth (0.17.1)
113
138
  faraday (>= 0.17.3, < 2.0)
114
139
  jwt (>= 1.4, < 3.0)
115
140
  memoist (~> 0.16)
116
141
  multi_json (~> 1.11)
117
142
  os (>= 0.9, < 2.0)
118
- signet (~> 0.12)
119
- grpc (1.27.0)
120
- google-protobuf (~> 3.11)
143
+ signet (~> 0.15)
144
+ grpc (1.47.0)
145
+ google-protobuf (~> 3.19)
121
146
  googleapis-common-protos-types (~> 1.0)
122
- grpc-google-iam-v1 (0.6.9)
123
- googleapis-common-protos (>= 1.3.1, < 2.0)
124
- grpc (~> 1.0)
147
+ grpc-google-iam-v1 (0.6.11)
148
+ google-protobuf (~> 3.14)
149
+ googleapis-common-protos (>= 1.3.11, < 2.0)
150
+ grpc (~> 1.27)
125
151
  i18n (1.7.0)
126
152
  concurrent-ruby (~> 1.0)
127
153
  jaro_winkler (1.5.4)
128
154
  json (2.2.0)
129
- jwt (2.2.1)
155
+ jwt (2.4.1)
130
156
  loofah (2.4.0)
131
157
  crass (~> 1.0.2)
132
158
  nokogiri (>= 1.5.9)
@@ -136,23 +162,25 @@ GEM
136
162
  mimemagic (~> 0.3.2)
137
163
  memoist (0.16.2)
138
164
  method_source (0.9.2)
139
- mimemagic (0.3.3)
165
+ mimemagic (0.3.10)
166
+ nokogiri (~> 1)
167
+ rake
140
168
  mini_mime (1.0.2)
141
169
  mini_portile2 (2.4.0)
142
170
  minitest (5.13.0)
143
- multi_json (1.14.1)
144
- multipart-post (2.1.1)
171
+ multi_json (1.15.0)
172
+ multipart-post (2.2.3)
145
173
  nio4r (2.5.2)
146
174
  nokogiri (1.10.7)
147
175
  mini_portile2 (~> 2.4.0)
148
- os (1.0.1)
176
+ os (1.1.4)
149
177
  parallel (1.19.1)
150
178
  parser (2.6.5.0)
151
179
  ast (~> 2.4.0)
152
180
  pry (0.12.2)
153
181
  coderay (~> 1.1.0)
154
182
  method_source (~> 0.9.0)
155
- public_suffix (4.0.3)
183
+ public_suffix (4.0.7)
156
184
  rack (2.0.8)
157
185
  rack-test (1.1.0)
158
186
  rack (>= 1.0, < 3)
@@ -183,11 +211,11 @@ GEM
183
211
  rainbow (3.0.0)
184
212
  rake (10.5.0)
185
213
  redcarpet (3.5.0)
186
- redis (4.1.3)
187
- redis_hash (0.22.4)
214
+ redis (4.7.1)
215
+ redis_hash (0.29.0)
188
216
  activesupport (>= 5.2.1)
189
217
  redis (>= 3.0)
190
- tablesalt (= 0.22.4)
218
+ tablesalt (= 0.29.0)
191
219
  rly (0.2.3)
192
220
  rspec (3.9.0)
193
221
  rspec-core (~> 3.9.0)
@@ -220,12 +248,13 @@ GEM
220
248
  rubocop-rspec (1.35.0)
221
249
  rubocop (>= 0.60.0)
222
250
  ruby-progressbar (1.10.1)
223
- short_circu_it (0.22.4)
251
+ ruby2_keywords (0.0.5)
252
+ short_circu_it (0.29.0)
224
253
  activesupport (>= 5.2.1)
225
- around_the_world (= 0.22.4)
226
- signet (0.13.0)
227
- addressable (~> 2.3)
228
- faraday (>= 0.17.3, < 2.0)
254
+ around_the_world (= 0.29.0)
255
+ signet (0.17.0)
256
+ addressable (~> 2.8)
257
+ faraday (>= 0.17.5, < 3.a)
229
258
  jwt (>= 1.5, < 3.0)
230
259
  multi_json (~> 1.10)
231
260
  simplecov (0.17.1)
@@ -233,23 +262,24 @@ GEM
233
262
  json (>= 1.8, < 3)
234
263
  simplecov-html (~> 0.10.0)
235
264
  simplecov-html (0.10.2)
236
- spicerack (0.22.4)
237
- around_the_world (= 0.22.4)
238
- directive (= 0.22.4)
239
- redis_hash (= 0.22.4)
240
- short_circu_it (= 0.22.4)
241
- tablesalt (= 0.22.4)
242
- technologic (= 0.22.4)
265
+ spicerack (0.29.0)
266
+ around_the_world (= 0.29.0)
267
+ directive (= 0.29.0)
268
+ redis_hash (= 0.29.0)
269
+ short_circu_it (= 0.29.0)
270
+ substance (= 0.29.0)
271
+ tablesalt (= 0.29.0)
272
+ technologic (= 0.29.0)
243
273
  spicerack-styleguide (0.19.2)
244
274
  rubocop (= 0.74)
245
275
  rubocop-performance (= 1.4.1)
246
276
  rubocop-rails (= 2.3.0)
247
277
  rubocop-rspec (= 1.35.0)
248
- spicery (0.22.4)
249
- collectible (= 0.22.4)
250
- conjunction (= 0.22.4)
251
- facet (= 0.22.4)
252
- spicerack (= 0.22.4)
278
+ spicery (0.29.0)
279
+ collectible (= 0.29.0)
280
+ conjunction (= 0.29.0)
281
+ facet (= 0.29.0)
282
+ spicerack (= 0.29.0)
253
283
  sprockets (4.0.0)
254
284
  concurrent-ruby (~> 1.0)
255
285
  rack (> 1, < 3)
@@ -257,13 +287,18 @@ GEM
257
287
  actionpack (>= 4.0)
258
288
  activesupport (>= 4.0)
259
289
  sprockets (>= 3.0.0)
260
- tablesalt (0.22.4)
290
+ substance (0.29.0)
291
+ activemodel (>= 5.2.1)
292
+ activesupport (>= 5.2.1)
293
+ short_circu_it (= 0.29.0)
294
+ tablesalt (= 0.29.0)
295
+ technologic (= 0.29.0)
296
+ tablesalt (0.29.0)
261
297
  activemodel (>= 5.2.1)
262
298
  activesupport (>= 5.2.1)
263
- technologic (0.22.4)
299
+ technologic (0.29.0)
264
300
  activesupport (>= 5.2.1)
265
- railties (>= 5.2.1)
266
- short_circu_it (= 0.22.4)
301
+ short_circu_it (= 0.29.0)
267
302
  thor (0.20.3)
268
303
  thread_safe (0.3.6)
269
304
  timecop (0.9.1)
@@ -294,4 +329,4 @@ DEPENDENCIES
294
329
  yard (~> 0.9)
295
330
 
296
331
  BUNDLED WITH
297
- 2.0.2
332
+ 2.2.31
data/README.md CHANGED
@@ -105,7 +105,7 @@ Controls whether the hook `auto_initialize!` is run for each adapter. If set to
105
105
 
106
106
  #### Configuring context handlers
107
107
 
108
- Each event is emitted in a context which might be an ActionController instance or an ActiveJob instance or potentially any other place. Context handlers are implemented as plain ruby classes, so before using them you must register them. By default a plain `Class` handler is registered when not used with any framework. In case Ruby on Rails is used, then there are two additional context handlers for `ActionController` and `ActiveJob` instances.
108
+ Each event is emitted in a context which might be an ActionController instance or an ActiveJob instance or potentially any other place. Context handlers are implemented as plain ruby classes. By default a plain `Class` handler is registered when not used with any framework. In case Ruby on Rails is used, then there are two additional context handlers for `ActionController` and `ActiveJob` instances. Registration of the context handler happens upon inheriting from `Stenotype::ContextHandlers::Base`.
109
109
 
110
110
  ### Emitting Events
111
111
 
@@ -118,7 +118,7 @@ Stenotype::Event.emit!(
118
118
  )
119
119
  ```
120
120
 
121
- The event is then going to be passed to a dispatcher responsible for sending the evens to targets. Note that a context handler must be registered before using it. See [Custom context handlers](#custom-context-handlers) for more details.
121
+ The event is then going to be passed to a dispatcher responsible for sending the evens to targets. See [Custom context handlers](#custom-context-handlers) for more details.
122
122
 
123
123
  #### ActionController
124
124
 
@@ -201,8 +201,6 @@ class CustomHandler < Stenotype::ContextHandlers::Base
201
201
  end
202
202
  end
203
203
 
204
- Stenotype::ContextHandlers.register CustomHandler
205
-
206
204
  # Event is being emitted twice. First time with default options.
207
205
  # Second time with overriden method name and eval_context.
208
206
  class PlainRubyClass < BaseClass
@@ -251,7 +249,7 @@ Stenotype.config.targets.push(CustomAdapter.new)
251
249
 
252
250
  #### Custom context handlers
253
251
 
254
- A list of context handlers might be extended by defining a class inheriting from `Stenotype::ContextHandlers::Base` and registering a new context handler. Event handler must have a `self.handler_name` in order to use it during context serialization. Also custom handler must implement method `#as_json`:
252
+ A list of context handlers might be extended by defining a class inheriting from `Stenotype::ContextHandlers::Base`. Event handler must have a `self.handler_name` in order to use it during context serialization. Also custom handler must implement method `#as_json`:
255
253
  ```ruby
256
254
  class CustomHandler < Stenotype::ContextHandlers::Base
257
255
  self.handler_name = :custom_handler_name
@@ -275,9 +273,49 @@ class CustomHandler < Stenotype::ContextHandlers::Base
275
273
  end
276
274
  ```
277
275
 
278
- After defining a new context handler you must register it as follows:
276
+ You do not have to manually register the context handler since it happens upon inheriting from `Stenotype::ContextHandlers::Base`
277
+
278
+ ## Testing
279
+
280
+ Stenotype currently supports RSpec integration. To be able to test even emission you can use a predefined matcher by adding the following to spec helper:
281
+
282
+ ```ruby
283
+ RSpec.configure do |config|
284
+ config.around(:each, type: :stenotype_event) do |example|
285
+ require 'stenotype/adapters/test_adapter'
286
+
287
+ config.include Stenotype::Test::Matchers
288
+
289
+ RSpec::Mocks.with_temporary_scope do
290
+ allow(Stenotype.config).to receive(:targets).and_return(Array.wrap(Stenotype::Adapters::TestAdapter.new))
291
+ example.run
292
+ allow(Stenotype.config).to receive(:targets).and_call_original
293
+ end
294
+ end
295
+ end
296
+ ```
297
+
298
+ After adding the configuration you can use the matchers:
279
299
  ```ruby
280
- Stenotype::ContextHandlers.register CustomHandler
300
+ class Example
301
+ include Stenotype::Emitter
302
+
303
+ def trigger
304
+ emit_event(:user_subscription)
305
+ end
306
+ end
307
+
308
+ RSpec.describe Stenotype::Emitter do
309
+ describe "POST #create" do
310
+ subject(:post) { Example.new.trigger }
311
+
312
+ it "emits a user_subscription event", type: :stenotype_event do
313
+ expect { post }.to emit_an_event(:user_subscription).
314
+ with_arguments_including({ uuid: "abcd" }).
315
+ exactly(1).times
316
+ end
317
+ end
318
+ end
281
319
  ```
282
320
 
283
321
  ## Development
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stenotype
4
+ module Adapters
5
+ class TestAdapter < Base
6
+ attr_reader :buffer
7
+
8
+ def initialize(*_)
9
+ @buffer = Array.new
10
+ super()
11
+ end
12
+
13
+ #
14
+ # @param event_data {Sting} The data to be published
15
+ # @param additional_attrs {Hash} The list of additional event attributes
16
+ #
17
+ def publish(event_data, **additional_attrs)
18
+ buffer << parse(event_data)
19
+ end
20
+
21
+ #
22
+ # Clears the buffer
23
+ #
24
+ def flush!
25
+ buffer.clear
26
+ end
27
+
28
+ private
29
+
30
+ def parse(event_data)
31
+ JSON.parse(event_data)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -24,6 +24,10 @@ module Stenotype
24
24
  class Base
25
25
  attr_reader :context, :options
26
26
 
27
+ def self.inherited(subklass)
28
+ ContextHandlers.register(subklass)
29
+ end
30
+
27
31
  #
28
32
  # @param context {Object} A context where the event was emitted
29
33
  # @param options {Hash} A hash of additional options
@@ -58,6 +62,15 @@ module Stenotype
58
62
  @handler_name || raise(NotImplementedError, "Please, specify the handler_name of #{self}")
59
63
  end
60
64
  end
65
+
66
+ private
67
+
68
+ #
69
+ # A rails specific workaround to make reloading in dev env happy
70
+ #
71
+ def self.before_remove_const
72
+ Stenotype::ContextHandlers.known.unregister(self)
73
+ end
61
74
  end
62
75
  end
63
76
  end
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "stenotype/context_handlers/base"
4
- require "stenotype/context_handlers/rails/controller"
5
- require "stenotype/context_handlers/rails/active_job"
6
- require "stenotype/context_handlers/klass"
7
3
  require "stenotype/context_handlers/collection"
8
4
 
9
5
  module Stenotype
@@ -14,6 +10,7 @@ module Stenotype
14
10
  module ContextHandlers
15
11
  class << self
16
12
  attr_writer :known
13
+
17
14
  #
18
15
  # @return {Array<#publish>} A list of handlers implementing [#publish]
19
16
  #
@@ -28,3 +25,9 @@ module Stenotype
28
25
  end
29
26
  end
30
27
  end
28
+
29
+ require "stenotype/context_handlers/base"
30
+ require "stenotype/context_handlers/rails/controller"
31
+ require "stenotype/context_handlers/rails/active_job"
32
+ require "stenotype/context_handlers/klass"
33
+
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ module Stenotype
5
+ module Test
6
+ module Matchers
7
+ extend RSpec::Matchers::DSL
8
+
9
+ class DiffSizeMatchesExpectation
10
+ attr_reader :matching_events, :expected_count
11
+
12
+ def initialize(matching_events, expected_count)
13
+ @matching_events = matching_events
14
+ @expected_count = expected_count
15
+ end
16
+
17
+ def failure_message
18
+ "expected to see #{expected_count} event(s) but got #{matching_events.count} event(s)."
19
+ end
20
+
21
+ def matches?
22
+ matching_events.count == expected_count
23
+ end
24
+ end
25
+
26
+ class EventHasExpectedArguments
27
+ attr_reader :matching_events, :expected_arguments
28
+
29
+ def initialize(matching_events, expected_arguments)
30
+ @matching_events = matching_events
31
+ @expected_arguments = stringify_keys(expected_arguments)
32
+ end
33
+
34
+ def matches?
35
+ return false if multiple_events?
36
+
37
+ (expected_arguments.to_a - matching_event.to_a).empty?
38
+ end
39
+
40
+ def failure_message
41
+ if multiple_events?
42
+ "more than one event with given event name has been emitted. Can not match event arguments"
43
+ else
44
+ "expected to see all attributes from #{expected_arguments} to be included in event attributes but got #{matching_event}"
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def multiple_events?
51
+ matching_events.size > 1
52
+ end
53
+
54
+ def matching_event
55
+ matching_events.first
56
+ end
57
+
58
+ def stringify_keys(hash)
59
+ hash.transform_keys(&:to_s)
60
+ end
61
+ end
62
+
63
+ class EventEmitted
64
+ attr_reader :matching_events, :expected_event_name
65
+
66
+ def initialize(matching_events, expected_event_name)
67
+ @matching_events = matching_events
68
+ @expected_event_name = expected_event_name
69
+ end
70
+
71
+ def matches?
72
+ matching_events.any?
73
+ end
74
+
75
+ def failure_message
76
+ "expected to see a '#{expected_event_name}' event but got nothing"
77
+ end
78
+ end
79
+
80
+ matcher :emit_an_event do |expected_event_name, *_|
81
+ supports_block_expectations
82
+
83
+ match do |emitting_event_block|
84
+ @emitting_event_block = emitting_event_block
85
+
86
+ partial_matchers << EventEmitted.new(matching_events, expected_event_name)
87
+ partial_matchers << EventHasExpectedArguments.new(matching_events, @arguments_should_include) if should_validate_events_count?
88
+ partial_matchers << DiffSizeMatchesExpectation.new(matching_events, @matching_events_count) if should_validate_attributes?
89
+
90
+ return first_failure.nil?
91
+ end
92
+
93
+ chain(:with_arguments_including) { |**args| @arguments_should_include = args }
94
+ chain(:exactly) { |times| @matching_events_count = times }
95
+
96
+ # noop for syntatic sugar
97
+ chain(:times) {}
98
+ chain(:time) {}
99
+
100
+ def matching_events
101
+ @matching_events ||= begin
102
+ buffer_before_emit = stenotype_event_buffer.dup
103
+ @emitting_event_block.call
104
+ buffer_after_emit = stenotype_event_buffer.dup
105
+
106
+ diff = buffer_after_emit - buffer_before_emit
107
+ diff.select { |event| event["name"] == expected_event_name.to_s }
108
+ end
109
+ end
110
+
111
+ def partial_matchers
112
+ @partial_matchers ||= []
113
+ end
114
+
115
+ def first_failure
116
+ @first_failure ||= partial_matchers.detect { |matcher| !matcher.matches? }
117
+ end
118
+
119
+ failure_message do
120
+ return super() unless first_failure
121
+
122
+ first_failure.failure_message
123
+ end
124
+
125
+ private
126
+
127
+ def should_validate_events_count?
128
+ @matching_events_count.present?
129
+ end
130
+
131
+ def should_validate_attributes?
132
+ @arguments_should_include.present?
133
+ end
134
+
135
+ def stenotype_event_buffer
136
+ stenotype_event_target.buffer
137
+ end
138
+
139
+ def stenotype_event_target
140
+ Stenotype.config.targets.first
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Stenotype
4
4
  # :nodoc:
5
- VERSION = "0.1.13"
5
+ VERSION = "0.1.17"
6
6
  # :nodoc:
7
7
  end
data/lib/stenotype.rb CHANGED
@@ -32,6 +32,4 @@ module Stenotype
32
32
  delegates_to_configuration
33
33
  end
34
34
 
35
- Stenotype::ContextHandlers.register(Stenotype::ContextHandlers::Klass)
36
-
37
35
  require "stenotype/railtie" if defined?(Rails)
data/stenotype.gemspec CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.require_paths = ["lib"]
31
31
 
32
32
  spec.add_dependency "activesupport", ">= 5.0.0"
33
- spec.add_dependency "google-cloud-pubsub", "~> 1.0.0"
33
+ spec.add_dependency "google-cloud-pubsub", "~> 1.10.0"
34
34
 
35
35
  spec.add_runtime_dependency "spicery", ">= 0.22.0", "< 1.0"
36
36
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stenotype
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.13
4
+ version: 0.1.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Kapitonov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-05 00:00:00.000000000 Z
11
+ date: 2022-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.0.0
33
+ version: 1.10.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.0.0
40
+ version: 1.10.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: spicery
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -268,6 +268,7 @@ files:
268
268
  - lib/stenotype/adapters/base.rb
269
269
  - lib/stenotype/adapters/google_cloud.rb
270
270
  - lib/stenotype/adapters/stdout_adapter.rb
271
+ - lib/stenotype/adapters/test_adapter.rb
271
272
  - lib/stenotype/at_exit.rb
272
273
  - lib/stenotype/configuration.rb
273
274
  - lib/stenotype/context_handlers.rb
@@ -283,6 +284,7 @@ files:
283
284
  - lib/stenotype/frameworks/rails/action_controller.rb
284
285
  - lib/stenotype/frameworks/rails/active_job.rb
285
286
  - lib/stenotype/railtie.rb
287
+ - lib/stenotype/test/matchers.rb
286
288
  - lib/stenotype/version.rb
287
289
  - stenotype.gemspec
288
290
  homepage: https://github.com/Freshly/stenotype
@@ -307,7 +309,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
307
309
  - !ruby/object:Gem::Version
308
310
  version: '0'
309
311
  requirements: []
310
- rubygems_version: 3.0.3
312
+ rubygems_version: 3.1.6
311
313
  signing_key:
312
314
  specification_version: 4
313
315
  summary: Gem for emitting events and sending them to an external system.