pub_sub_model_sync 0.1.2
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 +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.rubocop.yml +24 -0
- data/.travis.yml +13 -0
- data/CHANGELOG.md +8 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +220 -0
- data/LICENSE.txt +21 -0
- data/README.md +183 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/pub_sub_model_sync.rb +20 -0
- data/lib/pub_sub_model_sync/config.rb +20 -0
- data/lib/pub_sub_model_sync/connector.rb +24 -0
- data/lib/pub_sub_model_sync/message_processor.rb +86 -0
- data/lib/pub_sub_model_sync/mock_google_service.rb +44 -0
- data/lib/pub_sub_model_sync/mock_rabbit_service.rb +48 -0
- data/lib/pub_sub_model_sync/publisher.rb +47 -0
- data/lib/pub_sub_model_sync/publisher_concern.rb +50 -0
- data/lib/pub_sub_model_sync/railtie.rb +13 -0
- data/lib/pub_sub_model_sync/runner.rb +40 -0
- data/lib/pub_sub_model_sync/service_google.rb +66 -0
- data/lib/pub_sub_model_sync/service_rabbit.rb +81 -0
- data/lib/pub_sub_model_sync/subscriber_concern.rb +42 -0
- data/lib/pub_sub_model_sync/tasks/worker.rake +8 -0
- data/lib/pub_sub_model_sync/version.rb +5 -0
- data/pub_sub_model_sync.gemspec +42 -0
- metadata +160 -0
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'bunny'
|
5
|
+
rescue LoadError # rubocop:disable Lint/SuppressedException
|
6
|
+
end
|
7
|
+
|
8
|
+
module PubSubModelSync
|
9
|
+
class ServiceRabbit
|
10
|
+
attr_accessor :service, :channel, :queue, :topic
|
11
|
+
attr_accessor :config
|
12
|
+
SERVICE_KEY = 'service_model_sync'
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@config = PubSubModelSync::Config
|
16
|
+
@service = Bunny.new(*config.bunny_connection)
|
17
|
+
end
|
18
|
+
|
19
|
+
def listen_messages
|
20
|
+
log('Listener starting...')
|
21
|
+
subscribe_to_queue
|
22
|
+
log('Listener started')
|
23
|
+
queue.subscribe(block: true, manual_ack: false, &method(:process_message))
|
24
|
+
rescue PubSubModelSync::Runner::ShutDown
|
25
|
+
raise
|
26
|
+
rescue => e
|
27
|
+
log("Error listening message: #{[e.message, e.backtrace]}")
|
28
|
+
end
|
29
|
+
|
30
|
+
def publish(data, attributes)
|
31
|
+
log("Publishing: #{[data, attributes]}")
|
32
|
+
subscribe_to_queue
|
33
|
+
payload = { data: data, attributes: attributes }
|
34
|
+
topic.publish(payload.to_json, routing_key: queue.name, type: SERVICE_KEY)
|
35
|
+
rescue => e
|
36
|
+
log("Error publishing: #{[data, attributes, e.message, e.backtrace]}")
|
37
|
+
end
|
38
|
+
|
39
|
+
def stop
|
40
|
+
log('Listener stopping...')
|
41
|
+
service.close
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def process_message(_delivery_info, meta_info, payload)
|
47
|
+
return unless meta_info[:type] == SERVICE_KEY
|
48
|
+
|
49
|
+
data, attrs = parse_message_payload(payload)
|
50
|
+
args = [data, attrs[:klass], attrs[:action], attrs]
|
51
|
+
PubSubModelSync::MessageProcessor.new(*args).process
|
52
|
+
rescue => e
|
53
|
+
error = [payload, e.message, e.backtrace]
|
54
|
+
log("Error processing message: #{error}")
|
55
|
+
end
|
56
|
+
|
57
|
+
def parse_message_payload(payload)
|
58
|
+
message_payload = JSON.parse(payload).symbolize_keys
|
59
|
+
data = message_payload[:data].symbolize_keys
|
60
|
+
attrs = message_payload[:attributes].symbolize_keys
|
61
|
+
[data, attrs]
|
62
|
+
end
|
63
|
+
|
64
|
+
def subscribe_to_queue
|
65
|
+
service.start
|
66
|
+
@channel = service.create_channel
|
67
|
+
queue_settings = { durable: true, auto_delete: false }
|
68
|
+
@queue = channel.queue(config.queue_name, queue_settings)
|
69
|
+
subscribe_to_topic
|
70
|
+
end
|
71
|
+
|
72
|
+
def subscribe_to_topic
|
73
|
+
@topic = channel.topic(config.topic_name)
|
74
|
+
queue.bind(topic, routing_key: queue.name)
|
75
|
+
end
|
76
|
+
|
77
|
+
def log(msg)
|
78
|
+
config.log("Rabbit Service ==> #{msg}")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PubSubModelSync
|
4
|
+
module SubscriberConcern
|
5
|
+
def self.included(base)
|
6
|
+
base.extend(ClassMethods)
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
# @param settings (Hash): { as_klass: nil, actions: nil, id: nil }
|
11
|
+
def ps_msync_subscribe(attrs, settings = {})
|
12
|
+
settings[:as_klass] = (settings[:as_klass] || name).to_s
|
13
|
+
actions = settings.delete(:actions) || %i[create update destroy]
|
14
|
+
@ps_msync_subscriber_settings = { attrs: attrs }.merge(settings)
|
15
|
+
actions.each do |action|
|
16
|
+
add_ps_msync_subscriber(settings[:as_klass], action, action, false)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def ps_msync_class_subscribe(action, as_action: nil, as_klass: nil)
|
21
|
+
add_ps_msync_subscriber(as_klass, action, as_action, true)
|
22
|
+
end
|
23
|
+
|
24
|
+
def ps_msync_subscriber_settings
|
25
|
+
@ps_msync_subscriber_settings || {}
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def add_ps_msync_subscriber(as_klass, action, as_action, direct_mode)
|
31
|
+
listener = {
|
32
|
+
klass: name,
|
33
|
+
as_klass: (as_klass || name).to_s,
|
34
|
+
action: action.to_sym,
|
35
|
+
as_action: (as_action || action).to_sym,
|
36
|
+
direct_mode: direct_mode
|
37
|
+
}
|
38
|
+
PubSubModelSync::Config.listeners << listener
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'pub_sub_model_sync/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'pub_sub_model_sync'
|
9
|
+
spec.version = PubSubModelSync::VERSION
|
10
|
+
spec.authors = ['Owen']
|
11
|
+
spec.email = ['owenperedo@gmail.com']
|
12
|
+
|
13
|
+
spec.summary = 'Permit to sync models between apps through pub/sub'
|
14
|
+
spec.description = 'Permit to sync models between apps through pub/sub'
|
15
|
+
spec.homepage = 'https://github.com/owen2345/pub_sub_model_sync'
|
16
|
+
spec.license = 'MIT'
|
17
|
+
|
18
|
+
# spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
|
19
|
+
|
20
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
21
|
+
spec.metadata['source_code_uri'] = spec.homepage
|
22
|
+
spec.metadata['changelog_uri'] = "#{spec.homepage}/blob/master/CHANGELOG.md"
|
23
|
+
|
24
|
+
# Specify which files should be added to the gem when it is released.
|
25
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added
|
26
|
+
# into git.
|
27
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
28
|
+
`git ls-files -z`.split("\x0")
|
29
|
+
.reject { |f| f.match(%r{^(test|spec|features)/}) }
|
30
|
+
end
|
31
|
+
spec.bindir = 'exe'
|
32
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
33
|
+
spec.require_paths = ['lib']
|
34
|
+
|
35
|
+
spec.add_dependency 'activesupport'
|
36
|
+
spec.add_dependency 'rails'
|
37
|
+
|
38
|
+
spec.add_development_dependency 'bundler'
|
39
|
+
spec.add_development_dependency 'rake'
|
40
|
+
spec.add_development_dependency 'rspec'
|
41
|
+
spec.add_development_dependency 'sqlite3'
|
42
|
+
end
|
metadata
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pub_sub_model_sync
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Owen
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-03-16 00:00:00.000000000 Z
|
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: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rails
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: sqlite3
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: Permit to sync models between apps through pub/sub
|
98
|
+
email:
|
99
|
+
- owenperedo@gmail.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".gitignore"
|
105
|
+
- ".rspec"
|
106
|
+
- ".rubocop.yml"
|
107
|
+
- ".travis.yml"
|
108
|
+
- CHANGELOG.md
|
109
|
+
- CODE_OF_CONDUCT.md
|
110
|
+
- Gemfile
|
111
|
+
- Gemfile.lock
|
112
|
+
- LICENSE.txt
|
113
|
+
- README.md
|
114
|
+
- Rakefile
|
115
|
+
- bin/console
|
116
|
+
- bin/setup
|
117
|
+
- lib/pub_sub_model_sync.rb
|
118
|
+
- lib/pub_sub_model_sync/config.rb
|
119
|
+
- lib/pub_sub_model_sync/connector.rb
|
120
|
+
- lib/pub_sub_model_sync/message_processor.rb
|
121
|
+
- lib/pub_sub_model_sync/mock_google_service.rb
|
122
|
+
- lib/pub_sub_model_sync/mock_rabbit_service.rb
|
123
|
+
- lib/pub_sub_model_sync/publisher.rb
|
124
|
+
- lib/pub_sub_model_sync/publisher_concern.rb
|
125
|
+
- lib/pub_sub_model_sync/railtie.rb
|
126
|
+
- lib/pub_sub_model_sync/runner.rb
|
127
|
+
- lib/pub_sub_model_sync/service_google.rb
|
128
|
+
- lib/pub_sub_model_sync/service_rabbit.rb
|
129
|
+
- lib/pub_sub_model_sync/subscriber_concern.rb
|
130
|
+
- lib/pub_sub_model_sync/tasks/worker.rake
|
131
|
+
- lib/pub_sub_model_sync/version.rb
|
132
|
+
- pub_sub_model_sync.gemspec
|
133
|
+
homepage: https://github.com/owen2345/pub_sub_model_sync
|
134
|
+
licenses:
|
135
|
+
- MIT
|
136
|
+
metadata:
|
137
|
+
homepage_uri: https://github.com/owen2345/pub_sub_model_sync
|
138
|
+
source_code_uri: https://github.com/owen2345/pub_sub_model_sync
|
139
|
+
changelog_uri: https://github.com/owen2345/pub_sub_model_sync/blob/master/CHANGELOG.md
|
140
|
+
post_install_message:
|
141
|
+
rdoc_options: []
|
142
|
+
require_paths:
|
143
|
+
- lib
|
144
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
145
|
+
requirements:
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: '0'
|
149
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
requirements: []
|
155
|
+
rubyforge_project:
|
156
|
+
rubygems_version: 2.7.7
|
157
|
+
signing_key:
|
158
|
+
specification_version: 4
|
159
|
+
summary: Permit to sync models between apps through pub/sub
|
160
|
+
test_files: []
|