eventq 2.4.0 → 3.0.0

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: c8a55998f78ac404d51a4278b44b802a23d1b9c322cad2a29b8c1e94950ad4fa
4
- data.tar.gz: 92dddbaed323bf8f803a07adc483376a2b255c43ce015c6a5ed59c3b81081478
3
+ metadata.gz: ea953c5716907922d39bdf208905ef63c23d210dd58efb9a9f5744f328608ae3
4
+ data.tar.gz: ab03fa33de860acc77710fd49b2ee1f42ce782bc9299e8d1e01602e554a1c7b0
5
5
  SHA512:
6
- metadata.gz: 45465979d1c58fd6cb0a4f54752a7cb4278c002465cbb12e3f4ee8b6e98538d9f65ab35e15d69cb41ae88d28f00fbc275bb73b7bc45be777e3c576d07384143f
7
- data.tar.gz: 7011679b0e5c08fc6a0468067816e6bf136ce24900e411d5e1b1afedd53180c92c454dc9696874a2fad3f0a4d30dcd9a829a55fe4e9fb557b519f33abfec33c8
6
+ metadata.gz: 5e8136b710134b4f924d1414b0620cd77425e980ca5ec07bf3485b02bcc766b82dfe04c2c2604b883ac9cfe77f58822ac14e6d7fdb1b5cc37553cd2f8d940a59
7
+ data.tar.gz: 796dd866e6190d45c091fe540fa39760569f92aa968b4a72716a64c130b2836b00cb684c8959fa07e55c5d04c28da21f1d6a395acccb5c77becdf9c86abfeee5
@@ -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)
@@ -12,7 +12,7 @@ module EventQ
12
12
  @manager = options[:queue_manager]
13
13
  end
14
14
 
15
- def subscribe(event_type, queue, topic_region = nil, queue_region = nil)
15
+ def subscribe(event_type, queue, topic_region = nil, queue_region = nil, topic_namespaces = [EventQ.namespace])
16
16
  if queue.isolated
17
17
  method = :get_topic_arn
18
18
  else
@@ -20,26 +20,30 @@ 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
- q = @manager.get_queue(queue)
26
- queue_arn = @client.sqs_helper(queue_region).get_queue_arn(queue)
25
+ queue_arn = configure_queue(queue, queue_region)
27
26
 
28
- attributes = default_queue_attributes(q, queue_arn)
29
- @client.sqs(queue_region).set_queue_attributes(attributes)
27
+ # subscribe the queue to the topic with the namespaces provided
28
+ topic_namespaces.each do |namespace|
29
+ namespaced_topic_arn = topic_arn.gsub(":#{EventQ.namespace}-", ":#{namespace}-")
30
30
 
31
- # skip subscribe if subscription for given queue/topic already exists
32
- # this fixes a localstack issue: https://github.com/localstack/localstack/issues/933
33
- return true if existing_subscription?(queue_arn, topic_arn)
31
+ # create the sns topic - this method is idempotent & returns the topic arn if it already exists
32
+ @client.sns_helper.create_topic_arn("#{namespace}-#{event_type}".delete('.')) unless queue.isolated
34
33
 
35
- @client.sns(topic_region).subscribe(
36
- topic_arn: topic_arn,
37
- protocol: 'sqs',
38
- endpoint: queue_arn
39
- )
34
+ # skip subscribe if subscription for given queue/topic already exists
35
+ # this is a workaround for a localstack issue: https://github.com/localstack/localstack/issues/933
36
+ return true if existing_subscription?(queue_arn, namespaced_topic_arn)
40
37
 
41
- EventQ.logger.debug do
42
- "[#{self.class} #subscribe] - Subscribing Queue: #{queue.name} to topic_arn: #{topic_arn}, endpoint: #{queue_arn}"
38
+ EventQ.logger.debug do
39
+ "[#{self.class} #subscribe] - Subscribing Queue: #{queue.name} to topic_arn: #{namespaced_topic_arn}, endpoint: #{queue_arn}"
40
+ end
41
+
42
+ @client.sns(topic_region).subscribe(
43
+ topic_arn: namespaced_topic_arn,
44
+ protocol: 'sqs',
45
+ endpoint: queue_arn
46
+ )
43
47
  end
44
48
 
45
49
  true
@@ -51,6 +55,15 @@ module EventQ
51
55
 
52
56
  private
53
57
 
58
+ def configure_queue(queue, region)
59
+ q = @manager.get_queue(queue)
60
+ queue_arn = @client.sqs_helper(region).get_queue_arn(queue)
61
+
62
+ attributes = default_queue_attributes(q, queue_arn)
63
+ @client.sqs(region).set_queue_attributes(attributes)
64
+ queue_arn
65
+ end
66
+
54
67
  def default_queue_attributes(queue, queue_arn)
55
68
  {
56
69
  queue_url: queue,
@@ -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.4.0
4
+ version: 3.0.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-08-12 00:00:00.000000000 Z
11
+ date: 2020-06-11 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
@@ -25,35 +39,49 @@ dependencies:
25
39
  - !ruby/object:Gem::Version
26
40
  version: '1.11'
27
41
  - !ruby/object:Gem::Dependency
28
- name: rake
42
+ name: byebug
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '10.0'
47
+ version: '11.0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '10.0'
54
+ version: '11.0'
41
55
  - !ruby/object:Gem::Dependency
42
- name: rspec
56
+ name: pry-byebug
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ">="
59
+ - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '0'
61
+ version: '3.9'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - ">="
66
+ - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '0'
68
+ version: '3.9'
55
69
  - !ruby/object:Gem::Dependency
56
- name: simplecov
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - ">="
@@ -81,19 +109,19 @@ dependencies:
81
109
  - !ruby/object:Gem::Version
82
110
  version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
- name: activesupport
112
+ name: simplecov
85
113
  requirement: !ruby/object:Gem::Requirement
86
114
  requirements:
87
- - - "~>"
115
+ - - ">="
88
116
  - !ruby/object:Gem::Version
89
- version: '4'
117
+ version: '0'
90
118
  type: :development
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
93
121
  requirements:
94
- - - "~>"
122
+ - - ">="
95
123
  - !ruby/object:Gem::Version
96
- version: '4'
124
+ version: '0'
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: aws-sdk
99
127
  requirement: !ruby/object:Gem::Requirement
@@ -109,7 +137,7 @@ dependencies:
109
137
  - !ruby/object:Gem::Version
110
138
  version: '2.0'
111
139
  - !ruby/object:Gem::Dependency
112
- name: class_kit
140
+ name: bunny
113
141
  requirement: !ruby/object:Gem::Requirement
114
142
  requirements:
115
143
  - - ">="
@@ -123,7 +151,7 @@ dependencies:
123
151
  - !ruby/object:Gem::Version
124
152
  version: '0'
125
153
  - !ruby/object:Gem::Dependency
126
- name: redlock
154
+ name: class_kit
127
155
  requirement: !ruby/object:Gem::Requirement
128
156
  requirements:
129
157
  - - ">="
@@ -137,7 +165,7 @@ dependencies:
137
165
  - !ruby/object:Gem::Version
138
166
  version: '0'
139
167
  - !ruby/object:Gem::Dependency
140
- name: openssl
168
+ name: concurrent-ruby
141
169
  requirement: !ruby/object:Gem::Requirement
142
170
  requirements:
143
171
  - - ">="
@@ -151,7 +179,7 @@ dependencies:
151
179
  - !ruby/object:Gem::Version
152
180
  version: '0'
153
181
  - !ruby/object:Gem::Dependency
154
- name: concurrent-ruby
182
+ name: oj
155
183
  requirement: !ruby/object:Gem::Requirement
156
184
  requirements:
157
185
  - - ">="
@@ -165,7 +193,7 @@ dependencies:
165
193
  - !ruby/object:Gem::Version
166
194
  version: '0'
167
195
  - !ruby/object:Gem::Dependency
168
- name: oj
196
+ name: openssl
169
197
  requirement: !ruby/object:Gem::Requirement
170
198
  requirements:
171
199
  - - ">="
@@ -179,7 +207,7 @@ dependencies:
179
207
  - !ruby/object:Gem::Version
180
208
  version: '0'
181
209
  - !ruby/object:Gem::Dependency
182
- name: bunny
210
+ name: redlock
183
211
  requirement: !ruby/object:Gem::Requirement
184
212
  requirements:
185
213
  - - ">="
@@ -268,7 +296,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
268
296
  - !ruby/object:Gem::Version
269
297
  version: '0'
270
298
  requirements: []
271
- rubygems_version: 3.0.4
299
+ rubyforge_project:
300
+ rubygems_version: 2.7.7
272
301
  signing_key:
273
302
  specification_version: 4
274
303
  summary: EventQ is a pub/sub system that uses async notifications and message queues