pub_sub_model_sync 0.3.1 → 0.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ebe8b2dd34e248070f411cac0cd10fd690df7a46592f4a9827b8d185d0dbd29b
4
- data.tar.gz: 2361233134bb4ffa7974fa72e14063d075134e64baeb3cca586b8704922c5242
3
+ metadata.gz: 733ca5e3413a098031be8a2ca5d0c3df9bf972ed8cdbf8954a1968c517ac81f4
4
+ data.tar.gz: a4c419efb5446e8a8632942936589b1b0a4bad2ab913a9ddd34cffb2bfdf8f2a
5
5
  SHA512:
6
- metadata.gz: 5e5e022e72481ce79f69ff111562fc4fb338ab0a9caca18620825dbfabb5fd5a0467bd54c3f9e6d72b5e5bb94fcc13aaf92fb504c44d78e4929d3cd6b5b4fae8
7
- data.tar.gz: 3c6a9a4f04333a34944deef057b4c6a76f9a049c8e131740604647fe7be4fcf7123e2d996c80421e12c716c62e3792ef3405e4d2fbe8e3c4d0674169a3f71c35
6
+ metadata.gz: 3054010e2bad46d8d2377a01757b0f52abc31f27832ddc150b12f3fb5d05f50a9aa87aa1bcafff7237918ecdc3d4cc637033dec76d32d7991d69c36d5e949ea8
7
+ data.tar.gz: 734be5a88e56fa6f508f1c37acdada68cf3b53db5b2d5b3d612616c27a63f4d46c305d0d2148d656c970d0a6cc9e25ec6840ead4c4a74b1c4f39b777a791e2cc
@@ -1,5 +1,12 @@
1
1
  # Change Log
2
2
 
3
+ # 0.4.0 (May 06, 2020)
4
+ - rename as_klass to from_klass and as_action to from_action for subscribers
5
+ - refactor subscribers to be independent
6
+ - refactor message_publisher to use publisher
7
+ - rename publisher into message_publisher
8
+ - reformat publisher to reuse connector
9
+
3
10
  # 0.3.1 (May 05, 2020)
4
11
  - improve rabbit service to use sleep instead of block ("Block is not recommended for production")
5
12
  - improve message ID
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pub_sub_model_sync (0.3.1)
4
+ pub_sub_model_sync (0.4.0)
5
5
  activesupport
6
6
  rails
7
7
 
data/README.md CHANGED
@@ -86,7 +86,7 @@ User.create(name: 'test user', email: 'sample@gmail.com') # Review your App 2 to
86
86
  User.new(name: 'test user').ps_perform_sync(:create) # similar to above to perform sync on demand
87
87
 
88
88
  User.ps_class_publish({ msg: 'Hello' }, action: :greeting) # User.greeting method (Class method) will be called in App2
89
- PubSubModelSync::Publisher.new.publish_data(User, { msg: 'Hello' }, :greeting) # similar to above when not included publisher concern
89
+ PubSubModelSync::MessagePublisher.publish_data(User, { msg: 'Hello' }, :greeting) # similar to above when not included publisher concern
90
90
  ```
91
91
 
92
92
  ## Advanced Example
@@ -110,8 +110,8 @@ end
110
110
  class User < ActiveRecord::Base
111
111
  self.table_name = 'subscriber_users'
112
112
  include PubSubModelSync::SubscriberConcern
113
- ps_subscribe(%i[name], actions: %i[update], as_klass: 'Client', id: %i[client_id email])
114
- ps_class_subscribe(:greeting, as_action: :custom_greeting, as_klass: 'CustomUser')
113
+ ps_subscribe(%i[name], actions: %i[update], from_klass: 'Client', id: %i[client_id email])
114
+ ps_class_subscribe(:greeting, from_action: :custom_greeting, from_klass: 'CustomUser')
115
115
  alias_attribute :full_name, :name
116
116
 
117
117
  def self.greeting(data)
@@ -139,14 +139,14 @@ end
139
139
  ## API
140
140
  ### Subscribers
141
141
  - Permit to configure class level listeners
142
- ```ps_class_subscribe(action_name, as_action: nil, as_klass: nil)```
143
- * as_action: (Optional) Source method name
144
- * as_klass: (Optional) Source class name
142
+ ```ps_class_subscribe(action_name, from_action: nil, from_klass: nil)```
143
+ * from_action: (Optional) Source method name
144
+ * from_klass: (Optional) Source class name
145
145
 
146
146
  - Permit to configure instance level listeners (CRUD)
147
- ```ps_subscribe(attrs, as_klass: nil, actions: nil, id: nil)```
147
+ ```ps_subscribe(attrs, from_klass: nil, actions: nil, id: nil)```
148
148
  * attrs: (Array/Required) Array of all attributes to be synced
149
- * as_klass: (String/Optional) Source class name (Instead of the model class name, will use this value)
149
+ * from_klass: (String/Optional) Source class name (Instead of the model class name, will use this value)
150
150
  * actions: (Array/Optional, default: create/update/destroy) permit to customize action names
151
151
  * id: (Sym|Array/Optional, default: id) Attr identifier(s) to find the corresponding model
152
152
 
@@ -198,7 +198,7 @@ end
198
198
  * as_klass: (optional, :string) Custom class name (Default current model name)
199
199
 
200
200
  - Publish a class level notification (Same as above: on demand call)
201
- ```PubSubModelSync::Publisher.new.publish_data(Klass_name, data, action_name)```
201
+ ```PubSubModelSync::MessagePublisher.publish_data(Klass_name, data, action_name)```
202
202
  * klass_name: (required, Class) same class name as defined in ps_class_subscribe(...)
203
203
  * data: (required, :hash) message value to deliver
204
204
  * action_name: (required, :sim) same action name as defined in ps_class_subscribe(...)
@@ -254,20 +254,20 @@ end
254
254
 
255
255
  # Publisher
256
256
  it 'publish model action' do
257
- publisher = PubSubModelSync::Publisher
257
+ publisher = PubSubModelSync::MessagePublisher
258
258
  data = { name: 'hello'}
259
259
  action = :create
260
260
  User.ps_class_publish(data, action: action)
261
261
  user = User.create(name: 'name', email: 'email')
262
- expect_any_instance_of(publisher).to receive(:publish_model).with(user, :create, anything)
262
+ expect(publisher).to receive(:publish_model).with(user, :create, anything)
263
263
  end
264
264
 
265
265
  it 'publish class message' do
266
- publisher = PubSubModelSync::Publisher
266
+ publisher = PubSubModelSync::MessagePublisher
267
267
  data = {msg: 'hello'}
268
268
  action = :greeting
269
269
  User.ps_class_publish(data, action: action)
270
- expect_any_instance_of(publisher).to receive(:publish_data).with('User', data, action)
270
+ expect(publisher).to receive(:publish_data).with('User', data, action)
271
271
  end
272
272
  ```
273
273
 
@@ -6,12 +6,15 @@ require 'active_support'
6
6
  require 'pub_sub_model_sync/railtie'
7
7
  require 'pub_sub_model_sync/config'
8
8
  require 'pub_sub_model_sync/subscriber_concern'
9
- require 'pub_sub_model_sync/publisher'
9
+ require 'pub_sub_model_sync/message_publisher'
10
10
  require 'pub_sub_model_sync/publisher_concern'
11
11
  require 'pub_sub_model_sync/runner'
12
12
  require 'pub_sub_model_sync/connector'
13
13
  require 'pub_sub_model_sync/message_processor'
14
14
 
15
+ require 'pub_sub_model_sync/publisher'
16
+ require 'pub_sub_model_sync/subscriber'
17
+
15
18
  require 'pub_sub_model_sync/service_base'
16
19
  require 'pub_sub_model_sync/service_google'
17
20
  require 'pub_sub_model_sync/service_rabbit'
@@ -2,7 +2,7 @@
2
2
 
3
3
  module PubSubModelSync
4
4
  class Config
5
- cattr_accessor(:listeners) { [] }
5
+ cattr_accessor(:subscribers) { [] }
6
6
  cattr_accessor(:publishers) { [] }
7
7
  cattr_accessor(:service_name) { :google }
8
8
  cattr_accessor :logger
@@ -2,91 +2,39 @@
2
2
 
3
3
  module PubSubModelSync
4
4
  class MessageProcessor
5
- attr_accessor :data, :settings, :message_id
5
+ attr_accessor :data, :klass, :action
6
6
 
7
7
  # @param data (Hash): any hash value to deliver
8
8
  def initialize(data, klass, action)
9
9
  @data = data
10
- @settings = { klass: klass, action: action }
11
- @message_id = [klass, action, Time.now.hash].join('-')
10
+ @klass = klass
11
+ @action = action
12
12
  end
13
13
 
14
14
  def process
15
- @failed = false
16
- log "processing message: #{[data, settings]}"
17
- listeners = filter_listeners
18
- return log 'Skipped: No listeners' unless listeners.any?
19
-
20
- eval_message(listeners)
21
- log 'processed message' unless @failed
15
+ subscribers = filter_subscribers
16
+ subscribers.each { |subscriber| run_subscriber(subscriber) }
22
17
  end
23
18
 
24
19
  private
25
20
 
26
- def eval_message(listeners)
27
- listeners.each do |listener|
28
- if listener[:direct_mode]
29
- call_class_listener(listener)
30
- else
31
- call_listener(listener)
32
- end
33
- end
34
- end
35
-
36
- def call_class_listener(listener)
37
- model_class = listener[:klass].constantize
38
- model_class.send(listener[:action], data)
21
+ def run_subscriber(subscriber)
22
+ subscriber.eval_message(data)
23
+ log "processed message with: #{[klass, action, data]}"
39
24
  rescue => e
40
- log("Error listener (#{listener}): #{e.message}", :error)
41
- @failed = true
42
- end
43
-
44
- # support for: create, update, destroy
45
- def call_listener(listener)
46
- model = find_model(listener)
47
- if settings[:action].to_sym == :destroy
48
- model.destroy!
49
- else
50
- populate_model(model, listener)
51
- model.save!
52
- end
53
- rescue => e
54
- log("Error listener (#{listener}): #{e.message}", :error)
55
- @failed = true
56
- end
57
-
58
- def find_model(listener)
59
- model_class = listener[:klass].constantize
60
- if model_class.respond_to?(:ps_find_model)
61
- return model_class.ps_find_model(data, settings)
62
- end
63
-
64
- model_class.where(model_identifiers(listener)).first_or_initialize
65
- end
66
-
67
- def model_identifiers(listener)
68
- identifiers = listener[:settings][:id]
69
- identifiers = [identifiers] unless identifiers.is_a?(Array)
70
- identifiers.map { |key| [key, data[key.to_sym]] }.to_h
71
- end
72
-
73
- def populate_model(model, listener)
74
- values = data.slice(*listener[:settings][:attrs])
75
- values.each do |attr, value|
76
- model.send("#{attr}=", value)
77
- end
25
+ info = [klass, action, data, e.message, e.backtrace]
26
+ log("error processing message: #{info}", :error)
78
27
  end
79
28
 
80
- def filter_listeners
81
- listeners = PubSubModelSync::Config.listeners
82
- listeners.select do |listener|
83
- listener[:as_klass].to_s == settings[:klass].to_s &&
84
- listener[:as_action].to_s == settings[:action].to_s
29
+ def filter_subscribers
30
+ PubSubModelSync::Config.subscribers.select do |subscriber|
31
+ subscriber.settings[:from_klass].to_s == klass.to_s &&
32
+ subscriber.settings[:from_action].to_s == action.to_s
85
33
  end
86
34
  end
87
35
 
88
36
  def log(message, kind = :info)
89
- PubSubModelSync::Config.log "(ID: #{message_id}) #{message}", kind
37
+ PubSubModelSync::Config.log message, kind
90
38
  end
91
39
  end
92
40
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PubSubModelSync
4
+ class MessagePublisher
5
+ class << self
6
+ delegate :publish, to: :connector
7
+
8
+ def connector
9
+ @connector ||= PubSubModelSync::Connector.new
10
+ end
11
+
12
+ def publish_data(klass, data, action)
13
+ attrs = { klass: klass.to_s, action: action.to_sym }
14
+ publish(data, attrs)
15
+ end
16
+
17
+ # @param model: ActiveRecord model
18
+ # @param action: (Sym) Action name
19
+ # @param publisher: (Publisher, optional) Publisher to be used
20
+ def publish_model(model, action, publisher = nil)
21
+ return if model.ps_skip_sync?(action)
22
+
23
+ publisher ||= model.class.ps_publisher(action)
24
+ payload = publisher.payload(model, action)
25
+ res_before = model.ps_before_sync(action, payload[:data])
26
+ return if res_before == :cancel
27
+
28
+ publish(payload[:data], payload[:attrs])
29
+ model.ps_after_sync(action, payload[:data])
30
+ end
31
+ end
32
+ end
33
+ end
@@ -2,42 +2,24 @@
2
2
 
3
3
  module PubSubModelSync
4
4
  class Publisher
5
- attr_accessor :connector
6
- delegate :publish, to: :connector
7
-
8
- def initialize
9
- @connector = PubSubModelSync::Connector.new
10
- end
11
-
12
- def publish_data(klass, data, action)
13
- attributes = self.class.build_attrs(klass, action)
14
- publish(data, attributes)
5
+ attr_accessor :attrs, :actions, :klass, :as_klass
6
+ def initialize(attrs, klass, actions = nil, as_klass = nil)
7
+ @attrs = attrs
8
+ @klass = klass
9
+ @actions = actions || %i[create update destroy]
10
+ @as_klass = as_klass || klass
15
11
  end
16
12
 
17
- # @param custom_settings (Hash): { attrs: [], as_klass: nil }
18
- def publish_model(model, action, custom_settings = {})
19
- return if model.ps_skip_sync?(action)
20
-
21
- settings = model.class.ps_publisher(action).merge(custom_settings)
22
- attributes = build_model_attrs(model, action, settings)
23
- data = build_model_data(model, settings[:attrs])
24
- res_before = model.ps_before_sync(action, data)
25
- return if res_before == :cancel
26
-
27
- publish(data.symbolize_keys, attributes)
28
- model.ps_after_sync(action, data)
29
- end
30
-
31
- def self.build_attrs(klass, action)
32
- { klass: klass.to_s, action: action.to_sym }
13
+ def payload(model, action)
14
+ { data: payload_data(model), attrs: payload_attrs(model, action) }
33
15
  end
34
16
 
35
17
  private
36
18
 
37
- def build_model_data(model, model_props)
38
- source_props = model_props.map { |prop| prop.to_s.split(':').first }
19
+ def payload_data(model)
20
+ source_props = @attrs.map { |prop| prop.to_s.split(':').first }
39
21
  data = model.as_json(only: source_props, methods: source_props)
40
- aliased_props = model_props.select { |prop| prop.to_s.include?(':') }
22
+ aliased_props = @attrs.select { |prop| prop.to_s.include?(':') }
41
23
  aliased_props.each do |prop|
42
24
  source, target = prop.to_s.split(':')
43
25
  data[target] = data.delete(source)
@@ -45,13 +27,8 @@ module PubSubModelSync
45
27
  data.symbolize_keys
46
28
  end
47
29
 
48
- def build_model_attrs(model, action, settings)
49
- as_klass = (settings[:as_klass] || model.class.name).to_s
50
- self.class.build_attrs(as_klass, action)
51
- end
52
-
53
- def log(msg)
54
- PubSubModelSync::Config.log(msg)
30
+ def payload_attrs(model, action)
31
+ { klass: (as_klass || model.class.name).to_s, action: action.to_sym }
55
32
  end
56
33
  end
57
34
  end
@@ -23,49 +23,49 @@ module PubSubModelSync
23
23
  def ps_after_sync(_action, _data); end
24
24
 
25
25
  # To perform sync on demand
26
- # @param custom_settings (Hash): { attrs: [], as_klass: nil }
27
- def ps_perform_sync(action = :create, custom_settings = {})
28
- service = self.class.ps_publisher_service
29
- model_settings = self.class.ps_publisher(action) || {}
30
- service.publish_model(self, action, model_settings.merge(custom_settings))
26
+ # @param attrs (Array, optional): custom attrs to be used
27
+ # @param as_klass (Array, optional): custom klass name to be used
28
+ # @param publisher (Publisher, optional): custom publisher object
29
+ def ps_perform_sync(action = :create, attrs: nil, as_klass: nil,
30
+ publisher: nil)
31
+ publisher ||= self.class.ps_publisher(action).dup
32
+ publisher.attrs = attrs if attrs
33
+ publisher.as_klass = as_klass if as_klass
34
+ PubSubModelSync::MessagePublisher.publish_model(self, action, publisher)
31
35
  end
32
36
 
33
37
  module ClassMethods
34
38
  # Permit to configure to publish crud actions (:create, :update, :destroy)
35
39
  def ps_publish(attrs, actions: %i[create update destroy], as_klass: nil)
36
- as_klass ||= name
40
+ klass = PubSubModelSync::Publisher
41
+ publisher = klass.new(attrs, name, actions, as_klass)
42
+ PubSubModelSync::Config.publishers << publisher
37
43
  actions.each do |action|
38
- info = { klass: name, action: action, attrs: attrs,
39
- as_klass: as_klass }
40
- PubSubModelSync::Config.publishers << info
41
- ps_register_callback(action.to_sym, info)
44
+ ps_register_callback(action.to_sym, publisher)
42
45
  end
43
46
  end
44
47
 
45
48
  # On demand class level publisher
46
49
  def ps_class_publish(data, action:, as_klass: nil)
47
50
  as_klass = (as_klass || name).to_s
48
- ps_publisher_service.publish_data(as_klass, data, action.to_sym)
51
+ klass = PubSubModelSync::MessagePublisher
52
+ klass.publish_data(as_klass, data, action.to_sym)
49
53
  end
50
54
 
51
55
  # Publisher info for specific action
52
56
  def ps_publisher(action = :create)
53
- PubSubModelSync::Config.publishers.find do |listener|
54
- listener[:klass] == name && listener[:action] == action
57
+ PubSubModelSync::Config.publishers.find do |publisher|
58
+ publisher.klass == name && publisher.actions.include?(action)
55
59
  end
56
60
  end
57
61
 
58
- def ps_publisher_service
59
- PubSubModelSync::Publisher.new
60
- end
61
-
62
62
  private
63
63
 
64
- def ps_register_callback(action, info)
64
+ def ps_register_callback(action, publisher)
65
65
  after_commit(on: action) do |model|
66
66
  unless model.ps_skip_callback?(action)
67
- service = model.class.ps_publisher_service
68
- service.publish_model(model, action.to_sym, info)
67
+ klass = PubSubModelSync::MessagePublisher
68
+ klass.publish_model(model, action.to_sym, publisher)
69
69
  end
70
70
  end
71
71
  end
@@ -19,7 +19,7 @@ module PubSubModelSync
19
19
  private
20
20
 
21
21
  # @param payload (String JSON): '{"data":{}, "attributes":{..}}'
22
- # refer: PubSubModelSync::Publisher (.publish_model | .publish_data)
22
+ # refer: PubSubModelSync::MessagePublisher(.publish_model | .publish_data)
23
23
  def perform_message(payload)
24
24
  data, attrs = parse_message_payload(payload)
25
25
  args = [data, attrs[:klass], attrs[:action]]
@@ -30,9 +30,11 @@ module PubSubModelSync
30
30
 
31
31
  def publish(data, attributes)
32
32
  log("Publishing message: #{[data, attributes]}")
33
-
34
33
  payload = { data: data, attributes: attributes }.to_json
35
34
  topic.publish(payload, { SERVICE_KEY => true })
35
+ rescue => e
36
+ info = [data, attributes, e.message, e.backtrace]
37
+ log("Error publishing: #{info}", :error)
36
38
  end
37
39
 
38
40
  def stop
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PubSubModelSync
4
+ class Subscriber
5
+ attr_accessor :klass, :action, :attrs, :settings
6
+
7
+ # @param settings: (Hash) { id: :id, direct_mode: false,
8
+ # from_klass: klass, from_action: action }
9
+ def initialize(klass, action, attrs: nil, settings: {})
10
+ def_settings = { id: :id, direct_mode: false,
11
+ from_klass: klass, from_action: action }
12
+ @klass = klass
13
+ @action = action
14
+ @attrs = attrs
15
+ @settings = def_settings.merge(settings)
16
+ end
17
+
18
+ def eval_message(message)
19
+ if settings[:direct_mode]
20
+ run_class_message(message)
21
+ else
22
+ run_model_message(message)
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def run_class_message(message)
29
+ model_class = klass.constantize
30
+ model_class.send(action, message)
31
+ end
32
+
33
+ # support for: create, update, destroy
34
+ def run_model_message(message)
35
+ model = find_model(message)
36
+ if action == :destroy
37
+ model.destroy!
38
+ else
39
+ populate_model(model, message)
40
+ model.save!
41
+ end
42
+ end
43
+
44
+ def find_model(message)
45
+ model_class = klass.constantize
46
+ if model_class.respond_to?(:ps_find_model)
47
+ return model_class.ps_find_model(message)
48
+ end
49
+
50
+ model_class.where(model_identifiers(message)).first_or_initialize
51
+ end
52
+
53
+ def model_identifiers(message)
54
+ identifiers = Array(settings[:id])
55
+ identifiers.map { |key| [key, message[key.to_sym]] }.to_h
56
+ end
57
+
58
+ def populate_model(model, message)
59
+ values = message.slice(*attrs)
60
+ values.each do |attr, value|
61
+ model.send("#{attr}=", value)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -7,37 +7,34 @@ module PubSubModelSync
7
7
  end
8
8
 
9
9
  module ClassMethods
10
- def ps_subscribe(attrs, as_klass: nil, actions: nil, id: :id)
10
+ def ps_subscribe(attrs, actions: nil, from_klass: name, id: :id)
11
+ settings = { id: id, from_klass: from_klass }
11
12
  actions ||= %i[create update destroy]
12
- settings = { attrs: attrs, id: id }
13
13
  actions.each do |action|
14
- add_ps_subscriber(as_klass, action, action, false, settings)
14
+ add_ps_subscriber(action, attrs, settings)
15
15
  end
16
16
  end
17
17
 
18
- def ps_class_subscribe(action, as_action: nil, as_klass: nil)
19
- add_ps_subscriber(as_klass, action, as_action, true, {})
18
+ def ps_class_subscribe(action, from_action: nil, from_klass: nil)
19
+ settings = { direct_mode: true }
20
+ settings[:from_action] = from_action if from_action
21
+ settings[:from_klass] = from_klass if from_klass
22
+ add_ps_subscriber(action, nil, settings)
20
23
  end
21
24
 
22
25
  def ps_subscriber(action = :create)
23
- PubSubModelSync::Config.listeners.find do |listener|
24
- listener[:klass] == name && listener[:action] == action
26
+ PubSubModelSync::Config.subscribers.find do |subscriber|
27
+ subscriber.klass == name && subscriber.action == action
25
28
  end
26
29
  end
27
30
 
28
31
  private
29
32
 
30
- # @param settings (Hash): { id:, attrs: }
31
- def add_ps_subscriber(as_klass, action, as_action, direct_mode, settings)
32
- listener = {
33
- klass: name,
34
- as_klass: (as_klass || name).to_s,
35
- action: action.to_sym,
36
- as_action: (as_action || action).to_sym,
37
- direct_mode: direct_mode,
38
- settings: settings
39
- }
40
- PubSubModelSync::Config.listeners.push(listener) && listener
33
+ # @param settings (Hash): refer to PubSubModelSync::Subscriber.settings
34
+ def add_ps_subscriber(action, attrs, settings = {})
35
+ klass = PubSubModelSync::Subscriber
36
+ subscriber = klass.new(name, action, attrs: attrs, settings: settings)
37
+ PubSubModelSync::Config.subscribers.push(subscriber) && subscriber
41
38
  end
42
39
  end
43
40
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PubSubModelSync
4
- VERSION = '0.3.1'
4
+ VERSION = '0.4.0'
5
5
  end
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: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Owen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-05 00:00:00.000000000 Z
11
+ date: 2020-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -127,6 +127,7 @@ files:
127
127
  - lib/pub_sub_model_sync/config.rb
128
128
  - lib/pub_sub_model_sync/connector.rb
129
129
  - lib/pub_sub_model_sync/message_processor.rb
130
+ - lib/pub_sub_model_sync/message_publisher.rb
130
131
  - lib/pub_sub_model_sync/mock_google_service.rb
131
132
  - lib/pub_sub_model_sync/mock_kafka_service.rb
132
133
  - lib/pub_sub_model_sync/mock_rabbit_service.rb
@@ -138,6 +139,7 @@ files:
138
139
  - lib/pub_sub_model_sync/service_google.rb
139
140
  - lib/pub_sub_model_sync/service_kafka.rb
140
141
  - lib/pub_sub_model_sync/service_rabbit.rb
142
+ - lib/pub_sub_model_sync/subscriber.rb
141
143
  - lib/pub_sub_model_sync/subscriber_concern.rb
142
144
  - lib/pub_sub_model_sync/tasks/worker.rake
143
145
  - lib/pub_sub_model_sync/version.rb