pub_sub_model_sync 0.1.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.
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bunny'
4
+ module PubSubModelSync
5
+ class ServiceRabbit
6
+ attr_accessor :service, :channel, :queue, :topic
7
+ attr_accessor :config
8
+ SERVICE_KEY = 'service_model_sync'
9
+
10
+ def initialize
11
+ @config = PubSubModelSync::Config
12
+ @service = Bunny.new(*config.bunny_connection)
13
+ end
14
+
15
+ def listen_messages
16
+ log('Listener starting...')
17
+ subscribe_to_queue
18
+ log('Listener started')
19
+ queue.subscribe(block: true, manual_ack: false, &method(:process_message))
20
+ rescue PubSubModelSync::Runner::ShutDown
21
+ raise
22
+ rescue => e
23
+ log("Error listening message: #{[e.message, e.backtrace]}")
24
+ end
25
+
26
+ def publish(data, attributes)
27
+ log("Publishing: #{[data, attributes]}")
28
+ subscribe_to_queue
29
+ payload = { data: data, attributes: attributes }
30
+ topic.publish(payload.to_json, routing_key: queue.name, type: SERVICE_KEY)
31
+ rescue => e
32
+ log("Error publishing: #{[data, attributes, e.message, e.backtrace]}")
33
+ end
34
+
35
+ def stop
36
+ log('Listener stopping...')
37
+ service.close
38
+ end
39
+
40
+ private
41
+
42
+ def process_message(_delivery_info, meta_info, payload)
43
+ return unless meta_info[:type] == SERVICE_KEY
44
+
45
+ data, attrs = parse_message_payload(payload)
46
+ args = [data, attrs[:klass], attrs[:action], attrs]
47
+ PubSubModelSync::MessageProcessor.new(*args).process
48
+ rescue => e
49
+ error = [payload, e.message, e.backtrace]
50
+ log("Error processing message: #{error}")
51
+ end
52
+
53
+ def parse_message_payload(payload)
54
+ message_payload = JSON.parse(payload).symbolize_keys
55
+ data = message_payload[:data].symbolize_keys
56
+ attrs = message_payload[:attributes].symbolize_keys
57
+ [data, attrs]
58
+ end
59
+
60
+ def subscribe_to_queue
61
+ service.start
62
+ @channel = service.create_channel
63
+ queue_settings = { durable: true, auto_delete: false }
64
+ @queue = channel.queue(config.queue_name, queue_settings)
65
+ subscribe_to_topic
66
+ end
67
+
68
+ def subscribe_to_topic
69
+ @topic = channel.topic(config.topic_name)
70
+ queue.bind(topic, routing_key: queue.name)
71
+ end
72
+
73
+ def log(msg)
74
+ config.log("Rabbit Service ==> #{msg}")
75
+ end
76
+ end
77
+ 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,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :pub_sub_model_sync do
4
+ desc 'Start listening syncs'
5
+ task start: :environment do
6
+ PubSubModelSync::Runner.new.run
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PubSubModelSync
4
+ VERSION = '0.1.1'
5
+ 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.1
5
+ platform: ruby
6
+ authors:
7
+ - Owen
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-03-13 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: []