pub_sub_model_sync 0.1.3

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,82 @@
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]}", :error)
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
+ info = [data, attributes, e.message, e.backtrace]
37
+ log("Error publishing: #{info}", :error)
38
+ end
39
+
40
+ def stop
41
+ log('Listener stopping...')
42
+ service.close
43
+ end
44
+
45
+ private
46
+
47
+ def process_message(_delivery_info, meta_info, payload)
48
+ return unless meta_info[:type] == SERVICE_KEY
49
+
50
+ data, attrs = parse_message_payload(payload)
51
+ args = [data, attrs[:klass], attrs[:action], attrs]
52
+ PubSubModelSync::MessageProcessor.new(*args).process
53
+ rescue => e
54
+ error = [payload, e.message, e.backtrace]
55
+ log("Error processing message: #{error}", :error)
56
+ end
57
+
58
+ def parse_message_payload(payload)
59
+ message_payload = JSON.parse(payload).symbolize_keys
60
+ data = message_payload[:data].symbolize_keys
61
+ attrs = message_payload[:attributes].symbolize_keys
62
+ [data, attrs]
63
+ end
64
+
65
+ def subscribe_to_queue
66
+ service.start
67
+ @channel = service.create_channel
68
+ queue_settings = { durable: true, auto_delete: false }
69
+ @queue = channel.queue(config.queue_name, queue_settings)
70
+ subscribe_to_topic
71
+ end
72
+
73
+ def subscribe_to_topic
74
+ @topic = channel.topic(config.topic_name)
75
+ queue.bind(topic, routing_key: queue.name)
76
+ end
77
+
78
+ def log(msg, kind = :info)
79
+ config.log("Rabbit Service ==> #{msg}", kind)
80
+ end
81
+ end
82
+ 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_subscribe(attrs, settings = {})
12
+ settings[:as_klass] = (settings[:as_klass] || name).to_s
13
+ actions = settings.delete(:actions) || %i[create update destroy]
14
+ @ps_subscriber_settings = { attrs: attrs }.merge(settings)
15
+ actions.each do |action|
16
+ add_ps_subscriber(settings[:as_klass], action, action, false)
17
+ end
18
+ end
19
+
20
+ def ps_class_subscribe(action, as_action: nil, as_klass: nil)
21
+ add_ps_subscriber(as_klass, action, as_action, true)
22
+ end
23
+
24
+ def ps_subscriber_settings
25
+ @ps_subscriber_settings || {}
26
+ end
27
+
28
+ private
29
+
30
+ def add_ps_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.3'
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.3
5
+ platform: ruby
6
+ authors:
7
+ - Owen
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-03-20 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: []