cyclone_lariat 0.3.0 → 0.3.4
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 +4 -4
- data/CHANGELOG.md +12 -0
- data/Gemfile.lock +1 -1
- data/README.md +2 -2
- data/lib/cyclone_lariat/abstract/message.rb +9 -11
- data/lib/cyclone_lariat/messages_mapper.rb +49 -0
- data/lib/cyclone_lariat/messages_repo.rb +8 -29
- data/lib/cyclone_lariat/middleware.rb +15 -22
- data/lib/cyclone_lariat/version.rb +1 -1
- data/lib/cyclone_lariat.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de7e05c5fba57a9db6c827549404f12b1f88be0336b00d2d5dfb4dc77132b328
|
4
|
+
data.tar.gz: 54d81b79a812fdf91513cdee886933d32055fd405c55bb032aae4dec81ac1ff3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d8ce1ebcd03c53309165592b7e4e0cbe342a3033694afdc639e033fb76a88dd1f340ee2204c5602f02399a5e9e56f47a7483dba867d9aafcd9947b3958933c1
|
7
|
+
data.tar.gz: 8c8668274a9435e56804739e6625703b733810e46401aca602c04f51763274dafa9456f625fc315ae7b322c62d4a426a582a62db8b6061716ad46aced0ab5ef0
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [0.3.3] - 2021-07-14
|
8
|
+
Changed
|
9
|
+
- Bugfix of message equality check
|
10
|
+
|
11
|
+
## [0.3.2] - 2021-06-11
|
12
|
+
Changed
|
13
|
+
- Bugfix
|
14
|
+
|
15
|
+
## [0.3.1] - 2021-06-11
|
16
|
+
Changed
|
17
|
+
- Command
|
18
|
+
- SqsClient
|
7
19
|
|
8
20
|
## [0.3.0] - 2021-06-09
|
9
21
|
Added
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -128,7 +128,8 @@ As you see all params identity. And you can easily change your sqs-queue to sns-
|
|
128
128
|
subscribes. But you should define destination.
|
129
129
|
|
130
130
|
```ruby
|
131
|
-
client.publish_event 'email_is_created', data: { mail: 'john.doe@example.com' }, dest: 'notify_service'
|
131
|
+
client.publish_event 'email_is_created', data: { mail: 'john.doe@example.com' }, dest: 'notify_service'
|
132
|
+
# prod-event-queue-pilot-email_is_created-notify_service
|
132
133
|
```
|
133
134
|
|
134
135
|
Or you can define topic directly:
|
@@ -158,7 +159,6 @@ class Receiver
|
|
158
159
|
queue: 'your_sqs_queue_name'
|
159
160
|
|
160
161
|
server_middleware do |chain|
|
161
|
-
|
162
162
|
# Options dataset, errors_notifier and message_notifier is optionals.
|
163
163
|
# If you dont define notifiers - middleware does not notify
|
164
164
|
# If you dont define dataset - middleware does store events in db
|
@@ -9,13 +9,8 @@ module CycloneLariat
|
|
9
9
|
attr :uuid, String, :new
|
10
10
|
attr :publisher, String, :new
|
11
11
|
attr :type, String, :new
|
12
|
-
|
13
|
-
|
14
|
-
attr :data
|
15
|
-
|
16
|
-
attr_reader :sent_at,
|
17
|
-
:processed_at,
|
18
|
-
:received_at
|
12
|
+
attrs :client_error, :version, :data,
|
13
|
+
:sent_at, :processed_at, :received_at
|
19
14
|
|
20
15
|
def kind
|
21
16
|
raise LunaPark::Errors::AbstractMethod
|
@@ -37,6 +32,10 @@ module CycloneLariat
|
|
37
32
|
@processed_at = wrap_time(value)
|
38
33
|
end
|
39
34
|
|
35
|
+
def processed?
|
36
|
+
!@processed_at.nil?
|
37
|
+
end
|
38
|
+
|
40
39
|
def client_error_message=(txt)
|
41
40
|
return unless txt
|
42
41
|
|
@@ -57,11 +56,10 @@ module CycloneLariat
|
|
57
56
|
publisher == other.publisher &&
|
58
57
|
type == other.type &&
|
59
58
|
client_error&.message == other.client_error&.message &&
|
60
|
-
client_error&.details == other.client_error&.details &&
|
61
59
|
version == other.version &&
|
62
60
|
sent_at.to_i == other.sent_at.to_i &&
|
63
|
-
received_at.to_i == other.received_at.to_i
|
64
|
-
|
61
|
+
received_at.to_i == other.received_at.to_i &&
|
62
|
+
processed_at.to_i == other.processed_at.to_i
|
65
63
|
end
|
66
64
|
|
67
65
|
def to_json(*args)
|
@@ -77,7 +75,7 @@ module CycloneLariat
|
|
77
75
|
when String then Time.parse(value)
|
78
76
|
when Time then value
|
79
77
|
when NilClass then nil
|
80
|
-
else raise
|
78
|
+
else raise ArgumentError, "Unknown type `#{value.class}`"
|
81
79
|
end
|
82
80
|
end
|
83
81
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CycloneLariat
|
4
|
+
class MessagesMapper
|
5
|
+
class << self
|
6
|
+
def from_row(row)
|
7
|
+
return if row.nil?
|
8
|
+
|
9
|
+
row[:data] = hash_from_json_column(row[:data])
|
10
|
+
row[:client_error_details] = hash_from_json_column(row[:client_error_details]) if row[:client_error_details]
|
11
|
+
row
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_row(input)
|
15
|
+
row = {
|
16
|
+
uuid: input.uuid,
|
17
|
+
kind: input.kind,
|
18
|
+
type: input.type,
|
19
|
+
publisher: input.publisher,
|
20
|
+
data: JSON.generate(input.data),
|
21
|
+
client_error_message: input.client_error&.message,
|
22
|
+
client_error_details: JSON.generate(input.client_error&.details),
|
23
|
+
version: input.version,
|
24
|
+
sent_at: input.sent_at
|
25
|
+
}
|
26
|
+
row
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def hash_from_json_column(data)
|
32
|
+
return JSON.parse(data) if data.is_a?(String)
|
33
|
+
|
34
|
+
if pg_json_extension_enabled?
|
35
|
+
return data.to_h if data.is_a?(Sequel::Postgres::JSONHash)
|
36
|
+
return JSON.parse(data.to_s) if data.is_a?(Sequel::Postgres::JSONString)
|
37
|
+
end
|
38
|
+
|
39
|
+
raise ArgumentError, "Unknown type of `#{data}`"
|
40
|
+
end
|
41
|
+
|
42
|
+
def pg_json_extension_enabled?
|
43
|
+
Object.const_defined?('Sequel::Postgres::JSONHash')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'event'
|
4
|
+
require_relative 'messages_mapper'
|
4
5
|
|
5
6
|
module CycloneLariat
|
6
7
|
class MessagesRepo
|
@@ -11,17 +12,7 @@ module CycloneLariat
|
|
11
12
|
end
|
12
13
|
|
13
14
|
def create(msg)
|
14
|
-
dataset.insert(
|
15
|
-
uuid: msg.uuid,
|
16
|
-
kind: msg.kind,
|
17
|
-
type: msg.type,
|
18
|
-
publisher: msg.publisher,
|
19
|
-
data: JSON.generate(msg.data),
|
20
|
-
client_error_message: msg.client_error&.message,
|
21
|
-
client_error_details: JSON.generate(msg.client_error&.details),
|
22
|
-
version: msg.version,
|
23
|
-
sent_at: msg.sent_at
|
24
|
-
)
|
15
|
+
dataset.insert MessagesMapper.to_row(msg)
|
25
16
|
end
|
26
17
|
|
27
18
|
def exists?(uuid:)
|
@@ -36,32 +27,20 @@ module CycloneLariat
|
|
36
27
|
end
|
37
28
|
|
38
29
|
def find(uuid:)
|
39
|
-
|
40
|
-
|
41
|
-
if raw[:client_error_details]
|
42
|
-
raw[:client_error_details] = JSON.parse(raw[:client_error_details], symbolize_names: true)
|
43
|
-
end
|
44
|
-
build raw
|
30
|
+
row = dataset.where(uuid: uuid).first
|
31
|
+
build MessagesMapper.from_row(row)
|
45
32
|
end
|
46
33
|
|
47
34
|
def each_unprocessed
|
48
|
-
dataset.where(processed_at: nil).each do |
|
49
|
-
|
50
|
-
if raw[:client_error_details]
|
51
|
-
raw[:client_error_details] = JSON.parse(raw[:client_error_details], symbolize_names: true)
|
52
|
-
end
|
53
|
-
msg = build raw
|
35
|
+
dataset.where(processed_at: nil).each do |row|
|
36
|
+
msg = build MessagesMapper.from_row(row)
|
54
37
|
yield(msg)
|
55
38
|
end
|
56
39
|
end
|
57
40
|
|
58
41
|
def each_with_client_errors
|
59
|
-
dataset.where { (processed_at !~ nil) & (client_error_message !~ nil) }.each do |
|
60
|
-
|
61
|
-
if raw[:client_error_details]
|
62
|
-
raw[:client_error_details] = JSON.parse(raw[:client_error_details], symbolize_names: true)
|
63
|
-
end
|
64
|
-
msg = build raw
|
42
|
+
dataset.where { (processed_at !~ nil) & (client_error_message !~ nil) }.each do |row|
|
43
|
+
msg = build MessagesMapper.from_row(row)
|
65
44
|
yield(msg)
|
66
45
|
end
|
67
46
|
end
|
@@ -13,15 +13,15 @@ module CycloneLariat
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def call(_worker_instance, queue, _sqs_msg, body, &block)
|
16
|
-
|
16
|
+
msg = receive_message(body)
|
17
17
|
|
18
|
-
|
19
|
-
return true unless check(body[:Message])
|
18
|
+
message_notifier&.info 'Receive message', message: msg, queue: queue
|
20
19
|
|
21
|
-
|
20
|
+
catch_standard_error(queue, msg) do
|
21
|
+
event = Event.wrap(msg)
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
store_in_dataset(event) do
|
24
|
+
catch_business_error(event, &block)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -30,15 +30,17 @@ module CycloneLariat
|
|
30
30
|
|
31
31
|
attr_reader :errors_notifier, :message_notifier, :events_repo
|
32
32
|
|
33
|
-
def
|
34
|
-
|
33
|
+
def receive_message(body)
|
34
|
+
body[:Message] ? JSON.parse(body[:Message], symbolize_names: true ) : body
|
35
35
|
end
|
36
36
|
|
37
37
|
def store_in_dataset(event)
|
38
38
|
return yield if events_repo.nil?
|
39
|
-
return true if events_repo.exists?(uuid: event.uuid)
|
40
39
|
|
41
|
-
events_repo.
|
40
|
+
existed = events_repo.find(uuid: event.uuid)
|
41
|
+
return true if existed&.processed?
|
42
|
+
|
43
|
+
events_repo.create(event) unless existed
|
42
44
|
yield
|
43
45
|
events_repo.processed! uuid: event.uuid, error: event.client_error
|
44
46
|
end
|
@@ -50,20 +52,11 @@ module CycloneLariat
|
|
50
52
|
event.client_error = e
|
51
53
|
end
|
52
54
|
|
53
|
-
def catch_standard_error(queue,
|
55
|
+
def catch_standard_error(queue, msg)
|
54
56
|
yield
|
55
|
-
rescue
|
56
|
-
errors_notifier&.error(e, queue: queue,
|
57
|
+
rescue Exception => e
|
58
|
+
errors_notifier&.error(e, queue: queue, message: msg)
|
57
59
|
raise e
|
58
60
|
end
|
59
|
-
|
60
|
-
def check(msg)
|
61
|
-
if msg.nil? || msg.empty?
|
62
|
-
errors_notifier&.error(Errors::EmptyMessage.new)
|
63
|
-
false
|
64
|
-
else
|
65
|
-
true
|
66
|
-
end
|
67
|
-
end
|
68
61
|
end
|
69
62
|
end
|
data/lib/cyclone_lariat.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require_relative 'cyclone_lariat/sns_client'
|
4
4
|
require_relative 'cyclone_lariat/errors'
|
5
5
|
require_relative 'cyclone_lariat/event'
|
6
|
+
require_relative 'cyclone_lariat/messages_mapper'
|
6
7
|
require_relative 'cyclone_lariat/messages_repo'
|
7
8
|
require_relative 'cyclone_lariat/middleware'
|
8
9
|
require_relative 'cyclone_lariat/version'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cyclone_lariat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Kudrin
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-
|
12
|
+
date: 2021-11-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk-sns
|
@@ -279,6 +279,7 @@ files:
|
|
279
279
|
- lib/cyclone_lariat/command.rb
|
280
280
|
- lib/cyclone_lariat/errors.rb
|
281
281
|
- lib/cyclone_lariat/event.rb
|
282
|
+
- lib/cyclone_lariat/messages_mapper.rb
|
282
283
|
- lib/cyclone_lariat/messages_repo.rb
|
283
284
|
- lib/cyclone_lariat/middleware.rb
|
284
285
|
- lib/cyclone_lariat/sns_client.rb
|