eventq 2.5.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: 59946bde6488da5c2567aec735c8a6f251e3532bc0b2636123a4940c519ce935
4
- data.tar.gz: 4b202d8435f23ea6e88a5b7351f9317d91c9179f610651152af9c7b2939a993a
3
+ metadata.gz: c24153f000dd45ba6279ed183820bfe3848eded189017dd04f508d9c30608897
4
+ data.tar.gz: a5a709991c74cfb090434c80534483a194332f893943cd0af170705190372fac
5
5
  SHA512:
6
- metadata.gz: 93e097eb9be108a117f855260ea2334de8018029ba5027349d587bcd28553ab9a296accaca936abfe209d628c5ced3177bbbcfe435f6e2b5bd550a701a066299
7
- data.tar.gz: b83f581d669072a79e378cd93f428628e9896ae0fa8dd09db63c8d3b39505814a29c438690829703cf3ee469b8fc2098b04b50565939323455cf1acdbb0e8c58
6
+ metadata.gz: 97e28e78fb129e611b473a9fde30e5815d885a44177935ca14eb386988f7b64b78bd4dcf0329ed3150ace7e823d24dc0553021fe155bc8431b29b0c441ba0c30
7
+ data.tar.gz: c35141ebe0d1cbeab1393f5284d0cac4a6def35d8eb193fe03856da584ec1578dd58886d3f3013b1b83e09a146a5efb1dae3ceacb4810833eaabb4fd719a513a
@@ -15,25 +15,37 @@ module EventQ
15
15
  @serialization_manager = EventQ::SerializationProviders::Manager.new
16
16
  @signature_manager = EventQ::SignatureProviders::Manager.new
17
17
 
18
- # this array is used to record known event types
19
- @known_event_types = []
20
-
18
+ # this hash is used to record known event types:
19
+ # key = event_type / name
20
+ # value = topic arn
21
+ @known_event_types = {}
21
22
  end
22
23
 
24
+ # Returns true if the event has already been registerd, or false
25
+ # otherwise.
26
+ #
27
+ # @param [String] event_type
28
+ # @param [String] region
29
+ #
30
+ # @return [Boolean]
23
31
  def registered?(event_type, region = nil)
24
32
  topic_key = "#{region}:#{event_type}"
25
- @known_event_types.include?(topic_key)
33
+ @known_event_types.key?(topic_key)
26
34
  end
27
35
 
36
+ # Registers the event event_type and returns its topic arn.
37
+ #
38
+ # @param [String] event_type
39
+ # @param [String] region
40
+ #
41
+ # @return [String]
28
42
  def register_event(event_type, region = nil)
29
- if registered?(event_type, region)
30
- return true
31
- end
32
-
33
43
  topic_key = "#{region}:#{event_type}"
34
- @client.sns_helper(region).create_topic_arn(event_type, region)
35
- @known_event_types << topic_key
36
- true
44
+ return @known_event_types[topic_key] if registered?(event_type, region)
45
+
46
+ topic_arn = @client.sns_helper(region).create_topic_arn(event_type, region)
47
+ @known_event_types[topic_key] = topic_arn
48
+ topic_arn
37
49
  end
38
50
 
39
51
  def publish(topic:, event:, context: {}, region: nil)
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'aws-sdk'
3
+ require 'aws-sdk-sns'
4
+ require 'aws-sdk-sqs'
4
5
 
5
6
  module EventQ
6
7
  module Amazon
@@ -20,7 +20,7 @@ module EventQ
20
20
  end
21
21
 
22
22
  topic_arn = @client.sns_helper(topic_region).public_send(method, event_type, topic_region)
23
- raise Exceptions::EventTypeNotFound, 'SNS topic not found, unable to subscribe' unless topic_arn
23
+ raise Exceptions::EventTypeNotFound, "SNS topic not found, unable to subscribe to #{event_type}" unless topic_arn
24
24
 
25
25
  queue_arn = configure_queue(queue, queue_region)
26
26
 
@@ -29,7 +29,7 @@ module EventQ
29
29
  namespaced_topic_arn = topic_arn.gsub(":#{EventQ.namespace}-", ":#{namespace}-")
30
30
 
31
31
  # create the sns topic - this method is idempotent & returns the topic arn if it already exists
32
- @client.sns.create_topic(name: "#{namespace}-#{event_type}".delete('.')) unless queue.isolated
32
+ @client.sns_helper.create_topic_arn("#{namespace}-#{event_type}".delete('.')) unless queue.isolated
33
33
 
34
34
  # skip subscribe if subscription for given queue/topic already exists
35
35
  # this is a workaround for a localstack issue: https://github.com/localstack/localstack/issues/933
@@ -32,6 +32,7 @@ module EventQ
32
32
  end
33
33
 
34
34
  # Check if a TopicArn exists. This will check with AWS if necessary and cache the results if one is found
35
+ #
35
36
  # @return TopicArn [String]
36
37
  def get_topic_arn(event_type, region = nil)
37
38
  _event_type = EventQ.create_event_type(event_type)
@@ -39,8 +40,7 @@ module EventQ
39
40
 
40
41
  arn = @@topic_arns[topic_key]
41
42
  unless arn
42
- response = sns.list_topics
43
- arn = response.topics.detect { |topic| topic.topic_arn.end_with?(":#{_event_type}") }&.topic_arn
43
+ arn = find_topic(_event_type)
44
44
 
45
45
  @@topic_arns[topic_key] = arn if arn
46
46
  end
@@ -62,6 +62,32 @@ module EventQ
62
62
  def aws_safe_name(name)
63
63
  return name[0..79].gsub(/[^a-zA-Z\d_\-]/,'')
64
64
  end
65
+
66
+ private
67
+
68
+ # Finds the given topic, or returns nil if the topic could not be found
69
+ #
70
+ # @note Responses to list_topics can be paged, so to check *all* topics
71
+ # we'll need to request each page of topics using response.next_token for
72
+ # until the response no longer contains a next_token. Requests to
73
+ # list_topics are throttled to 30 TPS, so in the future we may need to
74
+ # handle this if it becomes a problem.
75
+ #
76
+ # @param topic_name [String] the name of the topic to find
77
+ # @return [String]
78
+ def find_topic(topic_name)
79
+ response = sns.list_topics
80
+ topics = response.topics
81
+ arn = topics.detect { |topic| topic.topic_arn.end_with?(":#{topic_name}") }&.topic_arn
82
+
83
+ while arn.nil? && response.next_token
84
+ response = sns.list_topics(next_token: response.next_token)
85
+ topics = response.topics
86
+ arn = topics.detect { |topic| topic.topic_arn.end_with?(":#{topic_name}") }&.topic_arn
87
+ end
88
+
89
+ arn
90
+ end
65
91
  end
66
92
  end
67
93
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eventq
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.0
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - SageOne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-06 00:00:00.000000000 Z
11
+ date: 2021-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +38,34 @@ dependencies:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
40
  version: '1.11'
41
+ - !ruby/object:Gem::Dependency
42
+ name: byebug
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '11.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '11.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.9'
27
69
  - !ruby/object:Gem::Dependency
28
70
  name: rake
29
71
  requirement: !ruby/object:Gem::Requirement
@@ -53,7 +95,7 @@ dependencies:
53
95
  - !ruby/object:Gem::Version
54
96
  version: '0'
55
97
  - !ruby/object:Gem::Dependency
56
- name: simplecov
98
+ name: shoulda-matchers
57
99
  requirement: !ruby/object:Gem::Requirement
58
100
  requirements:
59
101
  - - ">="
@@ -67,7 +109,7 @@ dependencies:
67
109
  - !ruby/object:Gem::Version
68
110
  version: '0'
69
111
  - !ruby/object:Gem::Dependency
70
- name: shoulda-matchers
112
+ name: simplecov
71
113
  requirement: !ruby/object:Gem::Requirement
72
114
  requirements:
73
115
  - - ">="
@@ -81,35 +123,35 @@ dependencies:
81
123
  - !ruby/object:Gem::Version
82
124
  version: '0'
83
125
  - !ruby/object:Gem::Dependency
84
- name: activesupport
126
+ name: aws-sdk-sqs
85
127
  requirement: !ruby/object:Gem::Requirement
86
128
  requirements:
87
129
  - - "~>"
88
130
  - !ruby/object:Gem::Version
89
- version: '4'
90
- type: :development
131
+ version: '1'
132
+ type: :runtime
91
133
  prerelease: false
92
134
  version_requirements: !ruby/object:Gem::Requirement
93
135
  requirements:
94
136
  - - "~>"
95
137
  - !ruby/object:Gem::Version
96
- version: '4'
138
+ version: '1'
97
139
  - !ruby/object:Gem::Dependency
98
- name: aws-sdk
140
+ name: aws-sdk-sns
99
141
  requirement: !ruby/object:Gem::Requirement
100
142
  requirements:
101
143
  - - "~>"
102
144
  - !ruby/object:Gem::Version
103
- version: '2.0'
145
+ version: '1'
104
146
  type: :runtime
105
147
  prerelease: false
106
148
  version_requirements: !ruby/object:Gem::Requirement
107
149
  requirements:
108
150
  - - "~>"
109
151
  - !ruby/object:Gem::Version
110
- version: '2.0'
152
+ version: '1'
111
153
  - !ruby/object:Gem::Dependency
112
- name: class_kit
154
+ name: bunny
113
155
  requirement: !ruby/object:Gem::Requirement
114
156
  requirements:
115
157
  - - ">="
@@ -123,7 +165,7 @@ dependencies:
123
165
  - !ruby/object:Gem::Version
124
166
  version: '0'
125
167
  - !ruby/object:Gem::Dependency
126
- name: redlock
168
+ name: class_kit
127
169
  requirement: !ruby/object:Gem::Requirement
128
170
  requirements:
129
171
  - - ">="
@@ -137,7 +179,7 @@ dependencies:
137
179
  - !ruby/object:Gem::Version
138
180
  version: '0'
139
181
  - !ruby/object:Gem::Dependency
140
- name: openssl
182
+ name: concurrent-ruby
141
183
  requirement: !ruby/object:Gem::Requirement
142
184
  requirements:
143
185
  - - ">="
@@ -151,7 +193,7 @@ dependencies:
151
193
  - !ruby/object:Gem::Version
152
194
  version: '0'
153
195
  - !ruby/object:Gem::Dependency
154
- name: concurrent-ruby
196
+ name: oj
155
197
  requirement: !ruby/object:Gem::Requirement
156
198
  requirements:
157
199
  - - ">="
@@ -165,7 +207,7 @@ dependencies:
165
207
  - !ruby/object:Gem::Version
166
208
  version: '0'
167
209
  - !ruby/object:Gem::Dependency
168
- name: oj
210
+ name: openssl
169
211
  requirement: !ruby/object:Gem::Requirement
170
212
  requirements:
171
213
  - - ">="
@@ -179,7 +221,7 @@ dependencies:
179
221
  - !ruby/object:Gem::Version
180
222
  version: '0'
181
223
  - !ruby/object:Gem::Dependency
182
- name: bunny
224
+ name: redlock
183
225
  requirement: !ruby/object:Gem::Requirement
184
226
  requirements:
185
227
  - - ">="
@@ -268,7 +310,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
268
310
  - !ruby/object:Gem::Version
269
311
  version: '0'
270
312
  requirements: []
271
- rubygems_version: 3.0.6
313
+ rubygems_version: 3.0.8
272
314
  signing_key:
273
315
  specification_version: 4
274
316
  summary: EventQ is a pub/sub system that uses async notifications and message queues