pub_sub_model_sync 0.1.3 → 0.1.4

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: 1134a868bdf5d405f2cd05dbca21806c6cc3c8240ae5951f8a26146f2f98917a
4
- data.tar.gz: 3d2c96dfd3155827f178ef824074f84a5e1be04408cbaa2948c6536ea6b34e48
3
+ metadata.gz: 4eda619ab984f99ffe46cfef36fa380aaa6766c1564081dcc4e5e53e6f7976e0
4
+ data.tar.gz: dd056d897c96bac38a20c115fee501cbb1383038483f74849bbb0e7217568163
5
5
  SHA512:
6
- metadata.gz: fb61cce4b0170bb86137a7f51452c703804e2eb4523ec5729eb8a77fabd768e215a9029f200795a2662124621c2b5aa5d77fdfbdecdcafb1d380e3524fa8eb34
7
- data.tar.gz: d6a6463def886802bd5a353468adfaa12d1a5d94885d978e85c65f26b03b4db1a05586a8dd051c780782f7dcdb2f57770a6b482c663df880cd40d2f75acd3515
6
+ metadata.gz: 75796a135c2f820d89303c29c9bb6dc78eaa1e207391a07ba86a45f547a7007b4b00f767bb949d354c5a90c504b5d2d287619fd3106bca1dce71e75588ac6173
7
+ data.tar.gz: fe4829f970142bfea0089beb4e86a27c9d1e08049213372ae77f94b9d02d16752218d58e88b25ac1f34848931da3651e4405caa3a8932401c1410d7f04e3d0da
@@ -1,5 +1,15 @@
1
1
  # Change Log
2
2
 
3
+ # 0.1.4
4
+ - Add attribute aliases when publishing, ```ps_publish(['name:full_name', 'email'])```
5
+ - Ability to retrieve publisher/subscriber crud settings
6
+
7
+ # 0.1.3
8
+ - shorter publisher/subscriber methods: ps_msync_subscribe into ps_subscribe
9
+
10
+ # 0.1.2
11
+ - fix not found pub/sub library (buggy)
12
+
3
13
  # 0.1.1
4
14
  - Add rabbitmq pub/sub service support
5
15
  - Reformat to support multiple pub/sub services
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pub_sub_model_sync (0.1.3)
4
+ pub_sub_model_sync (0.1.4)
5
5
  activesupport
6
6
  rails
7
7
 
data/README.md CHANGED
@@ -45,7 +45,7 @@ And then execute: $ bundle install
45
45
 
46
46
  - Add publishers/subscribers to your models (See examples below)
47
47
 
48
- - Start listening for publishers (Only in the app that has subscribers)
48
+ - Start subscribers to listen for publishers (Only in the app that has subscribers)
49
49
  ```ruby
50
50
  rake pub_sub_model_sync:start
51
51
  ```
@@ -53,14 +53,14 @@ And then execute: $ bundle install
53
53
 
54
54
  ## Examples
55
55
  ```ruby
56
- # App 1
56
+ # App 1 (Publisher)
57
57
  # attributes: name email age
58
58
  class User < ActiveRecord::Base
59
59
  include PubSubModelSync::PublisherConcern
60
60
  ps_publish(%i[name email])
61
61
  end
62
62
 
63
- # App 2
63
+ # App 2 (Subscriber)
64
64
  class User < ActiveRecord::Base
65
65
  include PubSubModelSync::SubscriberConcern
66
66
  ps_subscribe(%i[name])
@@ -72,24 +72,24 @@ class User < ActiveRecord::Base
72
72
  end
73
73
 
74
74
  # Samples
75
- User.create(name: 'test user') # Review your App 2 to see the created user (only name will be saved)
75
+ User.create(name: 'test user', email: 'sample@gmail.com') # Review your App 2 to see the created user (only name will be saved)
76
76
  User.ps_class_publish({ msg: 'Hello' }, action: :greeting) # User.greeting method (Class method) will be called in App2
77
77
  ```
78
78
 
79
79
  ## Advanced Example
80
80
  ```ruby
81
- # App 1
81
+ # App 1 (Publisher)
82
82
  class User < ActiveRecord::Base
83
83
  self.table_name = 'publisher_users'
84
84
  include PubSubModelSync::PublisherConcern
85
- ps_publish(%i[name], actions: %i[update], as_klass: 'Client', id: :client_id)
85
+ ps_publish(%i[name:full_name email], actions: %i[update], as_klass: 'Client', id: :client_id)
86
86
 
87
87
  def ps_skip_for?(_action)
88
88
  false # here logic with action to skip push message
89
89
  end
90
90
  end
91
91
 
92
- # App 2
92
+ # App 2 (Subscriber)
93
93
  class User < ActiveRecord::Base
94
94
  self.table_name = 'subscriber_users'
95
95
  include PubSubModelSync::SubscriberConcern
@@ -102,8 +102,8 @@ class User < ActiveRecord::Base
102
102
  end
103
103
  ```
104
104
 
105
- ## Testing
106
- - Rspec: (spec/rails_helper.rb)
105
+ ## Testing with RSpec
106
+ - Config: (spec/rails_helper.rb)
107
107
  ```ruby
108
108
 
109
109
  # when using google service
@@ -163,9 +163,9 @@ end
163
163
 
164
164
  There are two special methods to extract crud configuration settings (attrs, id, ...):
165
165
 
166
- Subscribers: ```User.ps_subscriber_settings```
166
+ Subscribers: ```User.ps_subscriber```
167
167
 
168
- Publishers: ```User.ps_publisher_settings```
168
+ Publishers: ```User.ps_publisher```
169
169
 
170
170
  Note: Inspect all configured listeners with:
171
171
  ``` PubSubModelSync::Config.listeners ```
@@ -3,6 +3,7 @@
3
3
  module PubSubModelSync
4
4
  class Config
5
5
  cattr_accessor :listeners, default: []
6
+ cattr_accessor :publishers, default: []
6
7
  cattr_accessor :service_name, default: :google
7
8
  cattr_accessor :logger
8
9
 
@@ -40,7 +40,6 @@ module PubSubModelSync
40
40
 
41
41
  # support for: create, update, destroy
42
42
  def call_listener(listener)
43
- listener_add_crud_settings(listener)
44
43
  model = find_model(listener)
45
44
  if attrs[:action].to_sym == :destroy
46
45
  model.destroy!
@@ -74,11 +73,6 @@ module PubSubModelSync
74
73
  end
75
74
  end
76
75
 
77
- def listener_add_crud_settings(listener)
78
- model_class = listener[:klass].constantize
79
- listener[:settings] = model_class.ps_subscriber_settings
80
- end
81
-
82
76
  def log(message, kind = :info)
83
77
  PubSubModelSync::Config.log "#{message} ==> #{[data, attrs]}", kind
84
78
  end
@@ -14,12 +14,10 @@ module PubSubModelSync
14
14
 
15
15
  # @param settings (Hash): { attrs: [], as_klass: nil, id: nil }
16
16
  def publish_model(model, action, settings = nil)
17
- settings ||= model.class.ps_publisher_settings
17
+ settings ||= model.class.ps_publisher_info(action)
18
18
  attributes = build_model_attrs(model, action, settings)
19
19
  data = {}
20
- if action != 'destroy'
21
- data = model.as_json(only: settings[:attrs], methods: settings[:attrs])
22
- end
20
+ data = build_model_data(model, settings[:attrs]) if action != :destroy
23
21
  connector.publish(data.symbolize_keys, attributes)
24
22
  end
25
23
 
@@ -34,6 +32,17 @@ module PubSubModelSync
34
32
 
35
33
  private
36
34
 
35
+ def build_model_data(model, model_props)
36
+ source_props = model_props.map { |prop| prop.to_s.split(':').first }
37
+ data = model.as_json(only: source_props, methods: source_props)
38
+ aliased_props = model_props.select { |prop| prop.to_s.include?(':') }
39
+ aliased_props.each do |prop|
40
+ source, target = prop.to_s.split(':')
41
+ data[target] = data.delete(source)
42
+ end
43
+ data.symbolize_keys
44
+ end
45
+
37
46
  def build_model_attrs(model, action, settings)
38
47
  as_klass = (settings[:as_klass] || model.class.name).to_s
39
48
  id_val = model.send(settings[:id] || :id)
@@ -16,32 +16,35 @@ module PubSubModelSync
16
16
  # @param settings (Hash): { actions: nil, as_klass: nil, id: nil }
17
17
  def ps_publish(attrs, settings = {})
18
18
  actions = settings.delete(:actions) || %i[create update destroy]
19
- @ps_publisher_settings = settings.merge(attrs: attrs)
20
- ps_register_callbacks(actions)
19
+ actions.each do |action|
20
+ info = settings.merge(klass: name, action: action, attrs: attrs)
21
+ PubSubModelSync::Config.publishers << info
22
+ ps_register_callback(action.to_sym, info)
23
+ end
21
24
  end
22
25
 
23
- def ps_publisher_settings
24
- @ps_publisher_settings
26
+ def ps_publisher_info(action = :create)
27
+ PubSubModelSync::Config.publishers.select do |listener|
28
+ listener[:klass] == name && listener[:action] == action
29
+ end.last
25
30
  end
26
31
 
27
32
  def ps_class_publish(data, action:, as_klass: nil)
28
33
  as_klass = (as_klass || name).to_s
29
- ps_publisher.publish_data(as_klass, data, action.to_sym)
34
+ ps_publisher_service.publish_data(as_klass, data, action.to_sym)
30
35
  end
31
36
 
32
- def ps_publisher
37
+ def ps_publisher_service
33
38
  PubSubModelSync::Publisher.new
34
39
  end
35
40
 
36
41
  private
37
42
 
38
- def ps_register_callbacks(actions)
39
- actions.each do |action|
40
- after_commit(on: action) do |model|
41
- unless model.ps_skip_for?(action)
42
- publisher = model.class.ps_publisher
43
- publisher.publish_model(model, action.to_sym)
44
- end
43
+ def ps_register_callback(action, info)
44
+ after_commit(on: action) do |model|
45
+ unless model.ps_skip_for?(action)
46
+ service = model.class.ps_publisher_service
47
+ service.publish_model(model, action.to_sym, info)
45
48
  end
46
49
  end
47
50
  end
@@ -9,31 +9,34 @@ module PubSubModelSync
9
9
  module ClassMethods
10
10
  # @param settings (Hash): { as_klass: nil, actions: nil, id: nil }
11
11
  def ps_subscribe(attrs, settings = {})
12
- settings[:as_klass] = (settings[:as_klass] || name).to_s
12
+ as_klass = (settings[:as_klass] || name).to_s
13
13
  actions = settings.delete(:actions) || %i[create update destroy]
14
- @ps_subscriber_settings = { attrs: attrs }.merge(settings)
14
+ settings = settings.merge(attrs: attrs)
15
15
  actions.each do |action|
16
- add_ps_subscriber(settings[:as_klass], action, action, false)
16
+ add_ps_subscriber(as_klass, action, action, false, settings)
17
17
  end
18
18
  end
19
19
 
20
20
  def ps_class_subscribe(action, as_action: nil, as_klass: nil)
21
- add_ps_subscriber(as_klass, action, as_action, true)
21
+ add_ps_subscriber(as_klass, action, as_action, true, {})
22
22
  end
23
23
 
24
- def ps_subscriber_settings
25
- @ps_subscriber_settings || {}
24
+ def ps_subscriber(action = :create)
25
+ PubSubModelSync::Config.listeners.select do |listener|
26
+ listener[:klass] == name && listener[:action] == action
27
+ end.last
26
28
  end
27
29
 
28
30
  private
29
31
 
30
- def add_ps_subscriber(as_klass, action, as_action, direct_mode)
32
+ def add_ps_subscriber(as_klass, action, as_action, direct_mode, settings)
31
33
  listener = {
32
34
  klass: name,
33
35
  as_klass: (as_klass || name).to_s,
34
36
  action: action.to_sym,
35
37
  as_action: (as_action || action).to_sym,
36
- direct_mode: direct_mode
38
+ direct_mode: direct_mode,
39
+ settings: settings
37
40
  }
38
41
  PubSubModelSync::Config.listeners << listener
39
42
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PubSubModelSync
4
- VERSION = '0.1.3'
4
+ VERSION = '0.1.4'
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.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Owen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-20 00:00:00.000000000 Z
11
+ date: 2020-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport