pub_sub_model_sync 1.6.4 → 1.7.1
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/.github/workflows/release.yml +6 -38
- data/Gemfile.lock +1 -1
- data/README.md +4 -3
- data/lib/pub_sub_model_sync/message_processor.rb +6 -8
- data/lib/pub_sub_model_sync/message_publisher.rb +19 -16
- data/lib/pub_sub_model_sync/mock_google_service.rb +4 -0
- data/lib/pub_sub_model_sync/payload.rb +7 -4
- data/lib/pub_sub_model_sync/payload_cache_optimizer.rb +2 -2
- data/lib/pub_sub_model_sync/service_google.rb +14 -5
- data/lib/pub_sub_model_sync/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4dbf0fae81e981722c2a5dc1023dc3db9c369cfcdc5558ef727e59b1d6c87a8a
|
4
|
+
data.tar.gz: 340032eb2b9d47de47aa4e57c3db389c5571280df75a92fee96b52de2cc8c19e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f65eac76d6e247c89d863f75476539bf75324b12c510bdce2eaedc9667168381df82a39f3a2ee24c6da1c39b447159981512d9c744233b835c7000a95b514ac1
|
7
|
+
data.tar.gz: 1e549a6a809ecb162eaf6c4101a9a379f2ea2a1cccacb975854de02c1ddf928a54a05b9c432cdd26ac31863fcf5cffbefaa3baf0753f4301054fc509167d3316
|
@@ -1,43 +1,11 @@
|
|
1
|
+
name: Create release from tag
|
1
2
|
on:
|
2
3
|
push:
|
3
|
-
tags: #
|
4
|
+
tags: # Create a release once a git tag is published
|
4
5
|
- '*'
|
5
6
|
|
6
|
-
name: Create Release
|
7
|
-
|
8
7
|
jobs:
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
- name: Checkout code
|
14
|
-
uses: actions/checkout@v2
|
15
|
-
with:
|
16
|
-
fetch-depth: 0
|
17
|
-
|
18
|
-
# Changelog action adaptations
|
19
|
-
- name: Create required package.json
|
20
|
-
run: test -f package.json || echo '{}' >package.json
|
21
|
-
- name: Detect Previous Tag (action not detecting very well)
|
22
|
-
run: echo "::set-output name=previous_tag::$(git describe --abbrev=0 --tags `git rev-list --tags --skip=1 --max-count=1`)"
|
23
|
-
id: tag_checker
|
24
|
-
|
25
|
-
- name: Generate Changelog
|
26
|
-
uses: scottbrenner/generate-changelog-action@master
|
27
|
-
id: Changelog
|
28
|
-
with:
|
29
|
-
from-tag: ${{steps.tag_checker.outputs.previous_tag}}
|
30
|
-
to-tag: HEAD
|
31
|
-
|
32
|
-
- name: Create Release
|
33
|
-
id: create_release
|
34
|
-
uses: actions/create-release@latest
|
35
|
-
env:
|
36
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
|
37
|
-
with:
|
38
|
-
tag_name: ${{ github.ref }}
|
39
|
-
release_name: Release ${{ github.ref }}
|
40
|
-
body: |
|
41
|
-
${{ steps.Changelog.outputs.changelog }}
|
42
|
-
draft: false
|
43
|
-
prerelease: false
|
8
|
+
release-builder:
|
9
|
+
uses: owen2345/reusable-ci-cd-actions/.github/workflows/release_builder_from_tag.yml@main
|
10
|
+
with:
|
11
|
+
commit_mode: true # If true, then fetches all commit titles from all changes. If false, then fetches only the PR titles from all changes.
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -335,7 +335,8 @@ Note: To reduce Payload size, some header info are not delivered (Enable debug m
|
|
335
335
|
payload.publish! # publishes notification data. It raises exception if fails and does not call ```:on_error_publishing``` callback
|
336
336
|
payload.publish # publishes notification data. On error does not raise exception but calls ```:on_error_publishing``` callback
|
337
337
|
payload.process! # process a notification data. It raises exception if fails and does not call ```.on_error_processing``` callback
|
338
|
-
payload.
|
338
|
+
payload.process # process a notification data. It does not raise exception if fails but calls ```.on_error_processing``` callback
|
339
|
+
payload.retry_publish! # allows to retry publishing a failed payload (All callbacks are ignored)
|
339
340
|
```
|
340
341
|
|
341
342
|
## **Transactions**
|
@@ -538,7 +539,7 @@ config.debug = true
|
|
538
539
|
(Proc) => called before publishing a notification (:cancel can be returned to skip publishing)
|
539
540
|
- ```.on_after_publish = ->(payload) { puts payload }```
|
540
541
|
(Proc) => called after publishing a notification
|
541
|
-
- ```.on_error_publish = ->(exception, {payload:}) { payload.delay(...).
|
542
|
+
- ```.on_error_publish = ->(exception, {payload:}) { payload.delay(...).retry_publish! }```
|
542
543
|
(Proc) => called when failed publishing a notification (delayed_job or similar can be used for retrying)
|
543
544
|
- ```.skip_cache = false```
|
544
545
|
(true/false*) => Allow to skip payload optimization (cache settings)
|
@@ -581,7 +582,7 @@ config.debug = true
|
|
581
582
|
end
|
582
583
|
|
583
584
|
PubSubModelSync::Config.on_error_publish = lambda do |_e, data|
|
584
|
-
PubSubRecovery.perform_async(data[:payload].to_h, :
|
585
|
+
PubSubRecovery.perform_async(data[:payload].to_h, :retry_publish!)
|
585
586
|
end
|
586
587
|
PubSubModelSync::Config.on_error_processing = lambda do |_e, data|
|
587
588
|
PubSubRecovery.perform_async(data[:payload].to_h, :process!)
|
@@ -21,12 +21,14 @@ module PubSubModelSync
|
|
21
21
|
log("No subscribers found for #{payload_info}", :warn) if config.debug && subscribers.empty?
|
22
22
|
subscribers.each(&method(:run_subscriber))
|
23
23
|
rescue => e
|
24
|
-
|
24
|
+
print_error(e)
|
25
25
|
raise
|
26
26
|
end
|
27
27
|
|
28
28
|
def process
|
29
|
-
process!
|
29
|
+
process!
|
30
|
+
rescue => e
|
31
|
+
config.on_error_processing.call(e, { payload: payload })
|
30
32
|
end
|
31
33
|
|
32
34
|
private
|
@@ -51,14 +53,10 @@ module PubSubModelSync
|
|
51
53
|
end
|
52
54
|
|
53
55
|
# @param error (StandardError, Exception)
|
54
|
-
def
|
55
|
-
error_msg = 'Error processing message:
|
56
|
+
def print_error(error)
|
57
|
+
error_msg = 'Error processing message:'
|
56
58
|
error_details = [payload, error.message, error.backtrace]
|
57
|
-
res = config.on_error_processing.call(error, { payload: payload })
|
58
|
-
log("#{error_msg} #{error_details}", :error) if res != :skip_log
|
59
|
-
rescue => e
|
60
59
|
log("#{error_msg} #{error_details}", :error)
|
61
|
-
raise(e)
|
62
60
|
end
|
63
61
|
|
64
62
|
# @param error [StandardError]
|
@@ -80,6 +80,17 @@ module PubSubModelSync
|
|
80
80
|
current_transaction ? current_transaction.add_payload(payload) : connector_publish(payload)
|
81
81
|
block&.call
|
82
82
|
payload
|
83
|
+
rescue => e
|
84
|
+
print_error(e, payload)
|
85
|
+
raise
|
86
|
+
end
|
87
|
+
|
88
|
+
# Similar to :publish! method but ignores the error if failed
|
89
|
+
# @return Payload
|
90
|
+
def publish(payload, &block)
|
91
|
+
publish!(payload, &block)
|
92
|
+
rescue => e
|
93
|
+
config.on_error_publish.call(e, { payload: payload })
|
83
94
|
end
|
84
95
|
|
85
96
|
def connector_publish(payload)
|
@@ -89,22 +100,13 @@ module PubSubModelSync
|
|
89
100
|
config.on_after_publish.call(payload)
|
90
101
|
end
|
91
102
|
|
92
|
-
# Similar to :publish! method
|
93
|
-
# Notifies error via :on_error_publish instead of raising error
|
94
|
-
# @return Payload
|
95
|
-
def publish(payload, &block)
|
96
|
-
publish!(payload, &block)
|
97
|
-
rescue => e
|
98
|
-
notify_error(e, payload)
|
99
|
-
end
|
100
|
-
|
101
103
|
private
|
102
104
|
|
103
105
|
def ensure_publish(payload)
|
104
106
|
cache_klass = PubSubModelSync::PayloadCacheOptimizer
|
105
|
-
|
106
|
-
cancelled
|
107
|
-
log_msg = "Publish cancelled by
|
107
|
+
cancelled_cache = payload.cache_settings ? cache_klass.new(payload).call == :already_sent : false
|
108
|
+
cancelled = cancelled_cache || config.on_before_publish.call(payload) == :cancel
|
109
|
+
log_msg = "Publish cancelled by #{cancelled_cache ? 'cache checker' : 'config.on_before_publish'}: #{[payload]}"
|
108
110
|
log(log_msg) if config.debug && cancelled
|
109
111
|
!cancelled
|
110
112
|
end
|
@@ -124,10 +126,11 @@ module PubSubModelSync
|
|
124
126
|
!cancelled
|
125
127
|
end
|
126
128
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
129
|
+
# @param error (StandardError, Exception)
|
130
|
+
def print_error(error, payload)
|
131
|
+
error_msg = 'Error publishing:'
|
132
|
+
error_details = [payload, error.message, error.backtrace]
|
133
|
+
log("#{error_msg} #{error_details}", :error)
|
131
134
|
end
|
132
135
|
|
133
136
|
def define_transaction_key(payload)
|
@@ -72,15 +72,18 @@ module PubSubModelSync
|
|
72
72
|
# Publish payload to pubsub
|
73
73
|
# (If error will raise exception and wont call on_error_publish callback)
|
74
74
|
def publish!
|
75
|
-
|
76
|
-
klass.publish!(self)
|
75
|
+
PubSubModelSync::MessagePublisher.publish!(self)
|
77
76
|
end
|
78
77
|
|
79
78
|
# Publish payload to pubsub
|
80
79
|
# (If error will call on_error_publish callback)
|
81
80
|
def publish
|
82
|
-
|
83
|
-
|
81
|
+
PubSubModelSync::MessagePublisher.publish(self)
|
82
|
+
end
|
83
|
+
|
84
|
+
# allows to retry publishing a failed payload
|
85
|
+
def retry_publish!
|
86
|
+
PubSubModelSync::MessagePublisher.connector_publish(self)
|
84
87
|
end
|
85
88
|
|
86
89
|
# @param attr_keys (Array<Symbol>) List of attributes to be excluded from payload
|
@@ -19,14 +19,14 @@ module PubSubModelSync
|
|
19
19
|
return payload if cache_disabled?
|
20
20
|
return :already_sent if previous_payload_data == payload.data
|
21
21
|
|
22
|
-
optimize_payload if
|
22
|
+
optimize_payload if optimization_allowed?
|
23
23
|
Rails.cache.write(cache_key, backup_data, expires_in: 1.week)
|
24
24
|
payload
|
25
25
|
end
|
26
26
|
|
27
27
|
private
|
28
28
|
|
29
|
-
def
|
29
|
+
def optimization_allowed?
|
30
30
|
previous_payload_data && payload.cache_settings.is_a?(Hash)
|
31
31
|
end
|
32
32
|
|
@@ -35,11 +35,7 @@ module PubSubModelSync
|
|
35
35
|
def publish(payload)
|
36
36
|
p_topic_names = Array(payload.headers[:topic_name] || config.default_topic_name)
|
37
37
|
message_topics = p_topic_names.map(&method(:find_topic))
|
38
|
-
message_topics.each
|
39
|
-
topic.publish_async(encode_payload(payload), message_headers(payload)) do |res|
|
40
|
-
raise StandardError, 'Failed to publish the message.' unless res.succeeded?
|
41
|
-
end
|
42
|
-
end
|
38
|
+
message_topics.each { |topic| publish_to_topic(topic, payload) }
|
43
39
|
end
|
44
40
|
|
45
41
|
def stop
|
@@ -56,6 +52,19 @@ module PubSubModelSync
|
|
56
52
|
topics[topic_name] || publish_topics[topic_name] || init_topic(topic_name, only_publish: true)
|
57
53
|
end
|
58
54
|
|
55
|
+
def publish_to_topic(topic, payload)
|
56
|
+
retries ||= 0
|
57
|
+
topic.publish_async(encode_payload(payload), message_headers(payload)) do |res|
|
58
|
+
raise StandardError, "Failed to publish the message. #{res.error}" unless res.succeeded?
|
59
|
+
end
|
60
|
+
rescue Google::Cloud::PubSub::OrderingKeyError => e
|
61
|
+
raise if (retries += 1) > 1
|
62
|
+
|
63
|
+
log("Resuming ordering_key and retrying OrderingKeyError for #{payload.headers[:uuid]}: #{e.message}")
|
64
|
+
topic.resume_publish(message_headers(payload)[:ordering_key])
|
65
|
+
retry
|
66
|
+
end
|
67
|
+
|
59
68
|
# @param only_publish (Boolean): if false is used to listen and publish messages
|
60
69
|
# @return (Topic): returns created or loaded topic
|
61
70
|
def init_topic(topic_name, only_publish: false)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pub_sub_model_sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Owen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|