hanami-events-cloud_pubsub 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +9 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +4 -6
- data/README.md +12 -3
- data/lib/hanami/events/cloud_pubsub.rb +8 -0
- data/lib/hanami/events/cloud_pubsub/listener.rb +13 -23
- data/lib/hanami/events/cloud_pubsub/middleware/auto_acknowledge.rb +47 -0
- data/lib/hanami/events/cloud_pubsub/middleware/logging.rb +33 -0
- data/lib/hanami/events/cloud_pubsub/middleware/stack.rb +60 -0
- data/lib/hanami/events/cloud_pubsub/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fee1baafca2abf28345214b24f558961ca25a66
|
4
|
+
data.tar.gz: b090b51decb794b529f12786f92de729614d9dfd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9991d0479c5b2f6fdbd0ad5ea5c1d12ae3e7cb3be8a2014ef25c9e712f0768b48b72c609a160d266d624eb6a5d1e2852d77687373c78313535660c55f8a6bd3a
|
7
|
+
data.tar.gz: dfaf278402868f15c16027e3a3d82cc78fc28b9070148926524137c7c3003be216997849811cceb9438bb93298787109904cb2ed39f9b137db359e52ba0c1acd
|
data/.rubocop_todo.yml
CHANGED
@@ -1,20 +1,25 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2018-06-
|
3
|
+
# on 2018-06-11 14:37:44 -0400 using RuboCop version 0.54.0.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
-
# Offense count:
|
9
|
+
# Offense count: 1
|
10
|
+
# Configuration parameters: CountKeywordArgs.
|
11
|
+
Metrics/ParameterLists:
|
12
|
+
Max: 6
|
13
|
+
|
14
|
+
# Offense count: 3
|
10
15
|
# Configuration parameters: AllowedVariables.
|
11
16
|
Style/GlobalVars:
|
12
17
|
Exclude:
|
13
18
|
- 'examples/server.rb'
|
14
19
|
- 'lib/hanami/events/cloud_pubsub/cli.rb'
|
15
20
|
|
16
|
-
# Offense count:
|
21
|
+
# Offense count: 22
|
17
22
|
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
18
23
|
# URISchemes: http, https
|
19
24
|
Metrics/LineLength:
|
20
|
-
Max:
|
25
|
+
Max: 93
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -9,7 +9,7 @@ GIT
|
|
9
9
|
PATH
|
10
10
|
remote: .
|
11
11
|
specs:
|
12
|
-
hanami-events-cloud_pubsub (0.2.
|
12
|
+
hanami-events-cloud_pubsub (0.2.3)
|
13
13
|
dry-configurable (~> 0.7.0)
|
14
14
|
google-cloud-pubsub (~> 0.30.2)
|
15
15
|
hanami-cli (~> 0.2.0)
|
@@ -76,7 +76,6 @@ GEM
|
|
76
76
|
hanami-utils (1.2.0)
|
77
77
|
concurrent-ruby (~> 1.0)
|
78
78
|
transproc (~> 1.0)
|
79
|
-
jaro_winkler (1.5.1)
|
80
79
|
json (2.1.0)
|
81
80
|
jwt (2.1.0)
|
82
81
|
little-plugger (1.1.4)
|
@@ -91,7 +90,7 @@ GEM
|
|
91
90
|
parallel (1.12.1)
|
92
91
|
parser (2.5.1.0)
|
93
92
|
ast (~> 2.4.0)
|
94
|
-
powerpack (0.1.
|
93
|
+
powerpack (0.1.2)
|
95
94
|
pry (0.11.3)
|
96
95
|
coderay (~> 1.1.0)
|
97
96
|
method_source (~> 0.9.0)
|
@@ -113,8 +112,7 @@ GEM
|
|
113
112
|
diff-lcs (>= 1.2.0, < 2.0)
|
114
113
|
rspec-support (~> 3.7.0)
|
115
114
|
rspec-support (3.7.1)
|
116
|
-
rubocop (0.
|
117
|
-
jaro_winkler (~> 1.5.1)
|
115
|
+
rubocop (0.54.0)
|
118
116
|
parallel (~> 1.10)
|
119
117
|
parser (>= 2.5)
|
120
118
|
powerpack (~> 0.1)
|
@@ -145,7 +143,7 @@ DEPENDENCIES
|
|
145
143
|
pry
|
146
144
|
rake (~> 12.3)
|
147
145
|
rspec (~> 3.0)
|
148
|
-
rubocop
|
146
|
+
rubocop (~> 0.54.0)
|
149
147
|
simplecov
|
150
148
|
|
151
149
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
# Hanami
|
2
|
-
[![Build Status](https://travis-ci.org/adHawk/hanami-events-cloud_pubsub.svg?branch=master)](https://travis-ci.org/adHawk/hanami-events-cloud_pubsub) [![Maintainability](https://api.codeclimate.com/v1/badges/7341f70d4ed1d0bd7a5d/maintainability)](https://codeclimate.com/github/adHawk/hanami-events-cloud_pubsub/maintainability)
|
1
|
+
# Hanami Events for Google Cloud Pub/sub
|
2
|
+
[![Build Status](https://travis-ci.org/adHawk/hanami-events-cloud_pubsub.svg?branch=master)](https://travis-ci.org/adHawk/hanami-events-cloud_pubsub) [![Maintainability](https://api.codeclimate.com/v1/badges/7341f70d4ed1d0bd7a5d/maintainability)](https://codeclimate.com/github/adHawk/hanami-events-cloud_pubsub/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/7341f70d4ed1d0bd7a5d/test_coverage)](https://codeclimate.com/github/adHawk/hanami-events-cloud_pubsub/test_coverage)
|
3
3
|
|
4
4
|
## Installation
|
5
5
|
|
@@ -53,6 +53,14 @@ require 'config/environment'
|
|
53
53
|
|
54
54
|
Hanami.boot
|
55
55
|
|
56
|
+
class CustomMiddleware
|
57
|
+
def call(message)
|
58
|
+
puts 'Middleware started!'
|
59
|
+
yield
|
60
|
+
puts 'Middleware ended!'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
56
64
|
Hanami::Events::CloudPubsub.configure do |config|
|
57
65
|
# required
|
58
66
|
config.subscriptions_loader = -> do
|
@@ -68,8 +76,9 @@ Hanami::Events::CloudPubsub.configure do |config|
|
|
68
76
|
config.error_handlers << lambda do |err, message|
|
69
77
|
Honeybadger.notify(err, context: message.attributes)
|
70
78
|
end
|
71
|
-
end
|
72
79
|
|
80
|
+
config.middleware << CustomMiddleware.new # must respond to #call
|
81
|
+
end
|
73
82
|
```
|
74
83
|
|
75
84
|
Then, run the worker process:
|
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
require 'hanami/events'
|
4
4
|
require 'hanami/events/cloud_pubsub/version'
|
5
|
+
require 'hanami/events/cloud_pubsub/middleware/stack'
|
6
|
+
require 'hanami/events/cloud_pubsub/middleware/logging'
|
7
|
+
require 'hanami/events/cloud_pubsub/middleware/auto_acknowledge'
|
5
8
|
require 'hanami/events/cloud_pubsub/runner'
|
6
9
|
require 'hanami/events/cloud_pubsub/mixin'
|
7
10
|
require 'google/cloud/pubsub'
|
@@ -46,6 +49,11 @@ module Hanami
|
|
46
49
|
end
|
47
50
|
], reader: true
|
48
51
|
|
52
|
+
setting :middleware, Middleware::Stack.new(
|
53
|
+
Middleware::Logging.new,
|
54
|
+
Middleware::AutoAcknowledge.new
|
55
|
+
)
|
56
|
+
|
49
57
|
def self.setup
|
50
58
|
Hanami::Events::Adapter.register(:cloud_pubsub) do
|
51
59
|
require_relative 'adapter/cloud_pubsub'
|
@@ -15,15 +15,22 @@ module Hanami
|
|
15
15
|
:logger,
|
16
16
|
:handler,
|
17
17
|
:event_name,
|
18
|
-
:subscriber_opts
|
19
|
-
|
20
|
-
|
18
|
+
:subscriber_opts,
|
19
|
+
:middleware
|
20
|
+
|
21
|
+
def initialize(topic:,
|
22
|
+
logger:,
|
23
|
+
handler:,
|
24
|
+
event_name:,
|
25
|
+
subscriber_id:,
|
26
|
+
middleware: CloudPubsub.config.middleware)
|
21
27
|
@topic = topic
|
22
28
|
@logger = logger
|
23
29
|
@handler = handler
|
24
30
|
@event_name = event_name
|
25
31
|
@subscriber_id = subscriber_id
|
26
32
|
@subscriber_opts = CloudPubsub.config.subscriber.to_h
|
33
|
+
@middleware = middleware
|
27
34
|
end
|
28
35
|
|
29
36
|
def register
|
@@ -72,29 +79,12 @@ module Hanami
|
|
72
79
|
run_handler(msg)
|
73
80
|
end
|
74
81
|
|
75
|
-
#:reek:TooManyStatements
|
76
|
-
#:reek:DuplicateMethodCall
|
77
|
-
# rubocop:disable Metrics/MethodLength
|
78
82
|
def run_handler(message)
|
79
|
-
|
80
|
-
|
81
|
-
handler.call(message)
|
82
|
-
succeeded = true
|
83
|
-
rescue Exception => err # rubocop:disable all
|
84
|
-
failed = true
|
83
|
+
middleware.invoke(message) { handler.call(message) }
|
84
|
+
rescue StandardError => err
|
85
85
|
run_error_handlers(err, message)
|
86
|
-
raise
|
87
|
-
ensure
|
88
|
-
id = message.message_id
|
89
|
-
if succeeded || failed
|
90
|
-
message.acknowledge!
|
91
|
-
logger.debug "Message(#{id}) was acknowledged"
|
92
|
-
else
|
93
|
-
message.reject!
|
94
|
-
logger.warn "Message(#{id}) was terminated from outside, rescheduling"
|
95
|
-
end
|
86
|
+
raise
|
96
87
|
end
|
97
|
-
# rubocop:enable Metrics/MethodLength
|
98
88
|
|
99
89
|
def subscription_for(name)
|
100
90
|
topic.create_subscription(name)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hanami
|
4
|
+
module Events
|
5
|
+
module CloudPubsub
|
6
|
+
# Middleware
|
7
|
+
module Middleware
|
8
|
+
# Middleware used for automatically acknowledging messages
|
9
|
+
class AutoAcknowledge
|
10
|
+
def initialize(logger: nil)
|
11
|
+
@logger = logger
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(message, *_args)
|
15
|
+
succeeded = false
|
16
|
+
failed = false
|
17
|
+
yield
|
18
|
+
succeeded = true
|
19
|
+
rescue StandardError => err
|
20
|
+
failed = true
|
21
|
+
raise err
|
22
|
+
ensure
|
23
|
+
ack_or_reject(message, succeeded, failed)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def ack_or_reject(message, succeeded, failed)
|
29
|
+
id = message.message_id
|
30
|
+
|
31
|
+
if succeeded || failed
|
32
|
+
message.acknowledge!
|
33
|
+
logger.debug "Message(#{id}) was acknowledged"
|
34
|
+
else
|
35
|
+
message.reject!
|
36
|
+
logger.warn "Message(#{id}) was terminated from outside, rescheduling"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def logger
|
41
|
+
@logger || CloudPubsub.logger
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hanami
|
4
|
+
module Events
|
5
|
+
module CloudPubsub
|
6
|
+
module Middleware
|
7
|
+
# Middleware used for logging useful information about an event
|
8
|
+
class Logging
|
9
|
+
def initialize(logger: nil)
|
10
|
+
@logger = logger
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(msg, *_args)
|
14
|
+
started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
15
|
+
yield
|
16
|
+
ensure
|
17
|
+
ended_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
18
|
+
seconds = ended_at - started_at
|
19
|
+
logger.info <<~MSG
|
20
|
+
Processed message(id: #{msg.id}) took #{seconds} seconds to process
|
21
|
+
MSG
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def logger
|
27
|
+
@logger || CloudPubsub.logger
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hanami
|
4
|
+
module Events
|
5
|
+
module CloudPubsub
|
6
|
+
module Middleware
|
7
|
+
# Middleware which is invoked when a message is received
|
8
|
+
class Stack
|
9
|
+
# Error raised when middleware is not callable
|
10
|
+
class InvalidMiddlewareError < ArgumentError
|
11
|
+
def initialize(middleware)
|
12
|
+
super <<~MSG
|
13
|
+
Attempted to add middleware which is not callable: #{middleware.inspect}
|
14
|
+
Make sure that your middleware responds to the #call method
|
15
|
+
MSG
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :entries
|
20
|
+
|
21
|
+
def initialize(*entries)
|
22
|
+
entries.each(&method(:ensure_callable))
|
23
|
+
@entries = entries
|
24
|
+
yield self if block_given?
|
25
|
+
end
|
26
|
+
|
27
|
+
def <<(middleware)
|
28
|
+
ensure_callable(middleware)
|
29
|
+
entries << middleware
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def shift
|
34
|
+
@entries.shift
|
35
|
+
end
|
36
|
+
|
37
|
+
def invoke(*args)
|
38
|
+
stack = entries.dup
|
39
|
+
|
40
|
+
traverse_stack = lambda do
|
41
|
+
if stack.empty?
|
42
|
+
yield(*args)
|
43
|
+
else
|
44
|
+
stack.shift.call(*args, &traverse_stack)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
traverse_stack.call
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def ensure_callable(middleware)
|
54
|
+
raise InvalidMiddlewareError, middleware unless middleware.respond_to?(:call)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanami-events-cloud_pubsub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian Ker-Seymer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-configurable
|
@@ -154,6 +154,9 @@ files:
|
|
154
154
|
- lib/hanami/events/cloud_pubsub/handler.rb
|
155
155
|
- lib/hanami/events/cloud_pubsub/health_check_server.rb
|
156
156
|
- lib/hanami/events/cloud_pubsub/listener.rb
|
157
|
+
- lib/hanami/events/cloud_pubsub/middleware/auto_acknowledge.rb
|
158
|
+
- lib/hanami/events/cloud_pubsub/middleware/logging.rb
|
159
|
+
- lib/hanami/events/cloud_pubsub/middleware/stack.rb
|
157
160
|
- lib/hanami/events/cloud_pubsub/mixin.rb
|
158
161
|
- lib/hanami/events/cloud_pubsub/runner.rb
|
159
162
|
- lib/hanami/events/cloud_pubsub/safe_error_handler.rb
|