pub_sub_model_sync 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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