pub_sub_model_sync 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/Gemfile.lock +20 -16
  4. data/README.md +5 -3
  5. data/Rakefile +0 -1
  6. data/lib/pub_sub_model_sync/config.rb +2 -2
  7. data/lib/pub_sub_model_sync/message_processor.rb +7 -2
  8. data/lib/pub_sub_model_sync/mock_rabbit_service.rb +8 -0
  9. data/lib/pub_sub_model_sync/payload_cache_optimizer.rb +3 -2
  10. data/lib/pub_sub_model_sync/service_base.rb +11 -7
  11. data/lib/pub_sub_model_sync/service_google.rb +0 -1
  12. data/lib/pub_sub_model_sync/service_kafka.rb +2 -1
  13. data/lib/pub_sub_model_sync/service_rabbit.rb +6 -3
  14. data/lib/pub_sub_model_sync/version.rb +1 -1
  15. data/pub_sub_model_sync.gemspec +1 -1
  16. metadata +2 -88
  17. data/samples/README.md +0 -50
  18. data/samples/app1/Dockerfile +0 -13
  19. data/samples/app1/Gemfile +0 -37
  20. data/samples/app1/Gemfile.lock +0 -171
  21. data/samples/app1/README.md +0 -24
  22. data/samples/app1/Rakefile +0 -6
  23. data/samples/app1/app/models/application_record.rb +0 -3
  24. data/samples/app1/app/models/concerns/.keep +0 -0
  25. data/samples/app1/app/models/post.rb +0 -19
  26. data/samples/app1/app/models/user.rb +0 -29
  27. data/samples/app1/bin/bundle +0 -114
  28. data/samples/app1/bin/rails +0 -5
  29. data/samples/app1/bin/rake +0 -5
  30. data/samples/app1/bin/setup +0 -33
  31. data/samples/app1/bin/spring +0 -14
  32. data/samples/app1/config/application.rb +0 -40
  33. data/samples/app1/config/boot.rb +0 -4
  34. data/samples/app1/config/credentials.yml.enc +0 -1
  35. data/samples/app1/config/database.yml +0 -25
  36. data/samples/app1/config/environment.rb +0 -5
  37. data/samples/app1/config/environments/development.rb +0 -63
  38. data/samples/app1/config/environments/production.rb +0 -105
  39. data/samples/app1/config/environments/test.rb +0 -57
  40. data/samples/app1/config/initializers/application_controller_renderer.rb +0 -8
  41. data/samples/app1/config/initializers/backtrace_silencers.rb +0 -8
  42. data/samples/app1/config/initializers/cors.rb +0 -16
  43. data/samples/app1/config/initializers/filter_parameter_logging.rb +0 -6
  44. data/samples/app1/config/initializers/inflections.rb +0 -16
  45. data/samples/app1/config/initializers/mime_types.rb +0 -4
  46. data/samples/app1/config/initializers/pubsub.rb +0 -4
  47. data/samples/app1/config/initializers/wrap_parameters.rb +0 -14
  48. data/samples/app1/config/locales/en.yml +0 -33
  49. data/samples/app1/config/master.key +0 -1
  50. data/samples/app1/config/puma.rb +0 -43
  51. data/samples/app1/config/routes.rb +0 -3
  52. data/samples/app1/config/spring.rb +0 -6
  53. data/samples/app1/config.ru +0 -6
  54. data/samples/app1/db/migrate/20210513080700_create_users.rb +0 -12
  55. data/samples/app1/db/migrate/20210513134332_create_posts.rb +0 -11
  56. data/samples/app1/db/schema.rb +0 -34
  57. data/samples/app1/db/seeds.rb +0 -7
  58. data/samples/app1/docker-compose.yml +0 -32
  59. data/samples/app1/log/.keep +0 -0
  60. data/samples/app2/Dockerfile +0 -13
  61. data/samples/app2/Gemfile +0 -37
  62. data/samples/app2/Gemfile.lock +0 -171
  63. data/samples/app2/README.md +0 -24
  64. data/samples/app2/Rakefile +0 -6
  65. data/samples/app2/app/models/application_record.rb +0 -9
  66. data/samples/app2/app/models/concerns/.keep +0 -0
  67. data/samples/app2/app/models/customer.rb +0 -28
  68. data/samples/app2/app/models/post.rb +0 -10
  69. data/samples/app2/bin/bundle +0 -114
  70. data/samples/app2/bin/rails +0 -5
  71. data/samples/app2/bin/rake +0 -5
  72. data/samples/app2/bin/setup +0 -33
  73. data/samples/app2/bin/spring +0 -14
  74. data/samples/app2/config/application.rb +0 -40
  75. data/samples/app2/config/boot.rb +0 -4
  76. data/samples/app2/config/credentials.yml.enc +0 -1
  77. data/samples/app2/config/database.yml +0 -25
  78. data/samples/app2/config/environment.rb +0 -5
  79. data/samples/app2/config/environments/development.rb +0 -63
  80. data/samples/app2/config/environments/production.rb +0 -105
  81. data/samples/app2/config/environments/test.rb +0 -57
  82. data/samples/app2/config/initializers/application_controller_renderer.rb +0 -8
  83. data/samples/app2/config/initializers/backtrace_silencers.rb +0 -8
  84. data/samples/app2/config/initializers/cors.rb +0 -16
  85. data/samples/app2/config/initializers/filter_parameter_logging.rb +0 -6
  86. data/samples/app2/config/initializers/inflections.rb +0 -16
  87. data/samples/app2/config/initializers/mime_types.rb +0 -4
  88. data/samples/app2/config/initializers/pubsub.rb +0 -4
  89. data/samples/app2/config/initializers/wrap_parameters.rb +0 -14
  90. data/samples/app2/config/locales/en.yml +0 -33
  91. data/samples/app2/config/master.key +0 -1
  92. data/samples/app2/config/puma.rb +0 -43
  93. data/samples/app2/config/routes.rb +0 -3
  94. data/samples/app2/config/spring.rb +0 -6
  95. data/samples/app2/config.ru +0 -6
  96. data/samples/app2/db/development.sqlite3 +0 -0
  97. data/samples/app2/db/migrate/20210513080956_create_customers.rb +0 -10
  98. data/samples/app2/db/migrate/20210513135203_create_posts.rb +0 -10
  99. data/samples/app2/db/schema.rb +0 -31
  100. data/samples/app2/db/seeds.rb +0 -7
  101. data/samples/app2/docker-compose.yml +0 -20
  102. data/samples/app2/log/.keep +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1740843df35081aaeb35e2be5c1c27cf1ff4d219af0bcf9ae4394495ab8bba5e
4
- data.tar.gz: ed506905c6b29b554f4a1cd100ddf4c8df2bf0a99590eb26901fae8feef862ce
3
+ metadata.gz: '0839d268607d201c9f77bbbca404f32aa5af02621b7582256eb384b42b9d3985'
4
+ data.tar.gz: 0ad3d2cfdce3ce99eb5d0b95a4292496927befaca2a8e2d83b865af411be2988
5
5
  SHA512:
6
- metadata.gz: bff308ce421ae321d2a9e7b53df194d3678e5f6103eb4f2048d4ed064302c042fb7768f96a3c639190b8d452a0636fded9e72394a5ffe4731b4e24ba0b2f5b53
7
- data.tar.gz: e60c4c78c5fbde7c40d68adb1ed029d74bb10d1759a27682850aae6015c84f938cbccccaadc976878afa26d97621d360937cdeb5cc028b2393facb12fa0d4831
6
+ metadata.gz: c86be499e21572b796060fc07f5d95191971b87366bbebe3b22737d5eb906f25a6e850f4b4b6f2c08f2790541169f36401fb67b95df0c5da365fda1f76e8751f
7
+ data.tar.gz: 3e91e306f83eb4ba8dd5c494aadc90b36a702935d7fb716424af80efee6fe6bce9ff895ae6231aa1c32327d7f468ed2148aa69a5f37842c10e0f50e206dad82a
data/.gitignore CHANGED
@@ -6,6 +6,7 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
-
9
+ /samples/app2/db/**/*
10
+ /samples/app1/db/**/*
10
11
  # rspec failure tracking
11
12
  .rspec_status
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pub_sub_model_sync (1.4.0)
4
+ pub_sub_model_sync (1.5.0)
5
5
  rails
6
6
 
7
7
  GEM
@@ -99,8 +99,8 @@ GEM
99
99
  googleapis-common-protos-types (>= 1.0.6, < 2.0)
100
100
  googleauth (~> 0.15, >= 0.15.1)
101
101
  grpc (~> 1.36)
102
- globalid (0.4.2)
103
- activesupport (>= 4.2.0)
102
+ globalid (1.0.0)
103
+ activesupport (>= 5.0)
104
104
  google-cloud-core (1.6.0)
105
105
  google-cloud-env (~> 1.0)
106
106
  google-cloud-errors (~> 1.0)
@@ -116,6 +116,7 @@ GEM
116
116
  google-cloud-errors (~> 1.0)
117
117
  grpc-google-iam-v1 (>= 0.6.10, < 2.0)
118
118
  google-protobuf (3.17.0)
119
+ google-protobuf (3.17.0-x86_64-linux)
119
120
  googleapis-common-protos (1.3.11)
120
121
  google-protobuf (~> 3.14)
121
122
  googleapis-common-protos-types (>= 1.0.6, < 2.0)
@@ -132,6 +133,9 @@ GEM
132
133
  grpc (1.37.1)
133
134
  google-protobuf (~> 3.15)
134
135
  googleapis-common-protos-types (~> 1.0)
136
+ grpc (1.37.1-x86_64-linux)
137
+ google-protobuf (~> 3.15)
138
+ googleapis-common-protos-types (~> 1.0)
135
139
  grpc-google-iam-v1 (0.6.11)
136
140
  google-protobuf (~> 3.14)
137
141
  googleapis-common-protos (>= 1.3.11, < 2.0)
@@ -139,27 +143,27 @@ GEM
139
143
  i18n (1.8.10)
140
144
  concurrent-ruby (~> 1.0)
141
145
  jwt (2.2.3)
142
- loofah (2.9.1)
146
+ loofah (2.15.0)
143
147
  crass (~> 1.0.2)
144
148
  nokogiri (>= 1.5.9)
145
149
  mail (2.7.1)
146
150
  mini_mime (>= 0.1.1)
147
- marcel (1.0.1)
151
+ marcel (1.0.2)
148
152
  memoist (0.16.2)
149
153
  method_source (1.0.0)
150
154
  mini_mime (1.0.3)
151
155
  minitest (5.14.4)
152
156
  multi_json (1.15.0)
153
157
  multipart-post (2.1.1)
154
- nio4r (2.5.7)
155
- nokogiri (1.11.3-x86_64-darwin)
158
+ nio4r (2.5.8)
159
+ nokogiri (1.12.5-x86_64-linux)
156
160
  racc (~> 1.4)
157
161
  os (1.1.1)
158
162
  parallel (1.20.1)
159
163
  parser (3.0.1.1)
160
164
  ast (~> 2.4.1)
161
165
  public_suffix (4.0.6)
162
- racc (1.5.2)
166
+ racc (1.6.0)
163
167
  rack (2.2.3)
164
168
  rack-test (1.1.0)
165
169
  rack (>= 1.0, < 3)
@@ -181,7 +185,7 @@ GEM
181
185
  rails-dom-testing (2.0.3)
182
186
  activesupport (>= 4.2.0)
183
187
  nokogiri (>= 1.6)
184
- rails-html-sanitizer (1.3.0)
188
+ rails-html-sanitizer (1.4.2)
185
189
  loofah (~> 2.3)
186
190
  railties (6.1.3.2)
187
191
  actionpack (= 6.1.3.2)
@@ -226,19 +230,19 @@ GEM
226
230
  faraday (>= 0.17.3, < 2.0)
227
231
  jwt (>= 1.5, < 3.0)
228
232
  multi_json (~> 1.10)
229
- sprockets (4.0.2)
233
+ sprockets (4.0.3)
230
234
  concurrent-ruby (~> 1.0)
231
235
  rack (> 1, < 3)
232
- sprockets-rails (3.2.2)
233
- actionpack (>= 4.0)
234
- activesupport (>= 4.0)
236
+ sprockets-rails (3.4.2)
237
+ actionpack (>= 5.2)
238
+ activesupport (>= 5.2)
235
239
  sprockets (>= 3.0.0)
236
240
  sqlite3 (1.4.2)
237
- thor (1.1.0)
241
+ thor (1.2.1)
238
242
  tzinfo (2.0.4)
239
243
  concurrent-ruby (~> 1.0)
240
244
  unicode-display_width (1.7.0)
241
- websocket-driver (0.7.3)
245
+ websocket-driver (0.7.5)
242
246
  websocket-extensions (>= 0.1.0)
243
247
  websocket-extensions (0.1.5)
244
248
  zeitwerk (2.4.2)
@@ -260,4 +264,4 @@ DEPENDENCIES
260
264
  sqlite3
261
265
 
262
266
  BUNDLED WITH
263
- 2.2.29
267
+ 2.3.9
data/README.md CHANGED
@@ -167,7 +167,7 @@ PubSubModelSync::Payload.new({ ids: [my_user.id] }, { klass: 'User', action: :ba
167
167
  ps_class_subscribe(action, settings)
168
168
  end
169
169
  ```
170
- - Instance subscriptions: `ps_subscribe(action, mapping, settings)`
170
+ - Instance subscriptions: `ps_subscribe(action, mapping, settings, &block)`
171
171
  When model receives the corresponding notification, `action` or `to_action` method will be called on the model. Like: `model.destroy`
172
172
  - `action` (Symbol|Array<Symbol>) Only notifications with this action name will be processed by this subscription. Sample: save|create|update|destroy|<any_other_action>
173
173
  - `mapping` (Array<String>) Data mapping from payload data into model attributes, sample: ["email", "full_name:name"] (Note: Only these attributes will be assigned/synced to the current model)
@@ -182,12 +182,14 @@ PubSubModelSync::Payload.new({ ids: [my_user.id] }, { klass: 'User', action: :ba
182
182
  Sample: `id: :id` will search for a model like: `model_class.where(id: payload.data[:id])`
183
183
  Sample: `id: [:id, :email:user_email]` will search for a model like: `model_class.where(id: payload.data[:id], user_email: payload.data[:email])`
184
184
  - `if:` (Symbol|Proc|Array<Symbol>) Method(s) or block called for the confirmation before calling the callback
185
- - `unless:` (Symbol|Proc|Array<Symbol>) Method or block called for the negation before calling the callback
185
+ - `unless:` (Symbol|Proc|Array<Symbol>) Method or block called for the negation before calling the callback
186
+ - `&block` Block to be used as the callback method (ignored if `:to_action` is present). Sample: `ps_subscribe(:send_welcome, %i[email]) { |_data| puts model.email }`
186
187
 
187
- - Class subscriptions: `ps_class_subscribe(action, settings)`
188
+ - Class subscriptions: `ps_class_subscribe(action, settings, &block)`
188
189
  When current class receives the corresponding notification, `action` or `to_action` method will be called on the Class. Like: `User.hello(data)`
189
190
  * `action` (Symbol) Notification.action name
190
191
  * `settings` (Hash) refer ps_subscribe.settings except(:id)
192
+ * `&block` Block to be used as the callback method (ignored if `:to_action` is present). Sample: `ps_class_subscribe(:send_welcome) { |data| puts data }`
191
193
 
192
194
  - `ps_processing_payload` a class and instance variable that saves the current payload being processed
193
195
 
data/Rakefile CHANGED
@@ -4,4 +4,3 @@ require "rspec/core/rake_task"
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  task :default => :spec
7
- # by default skip ACK when failed in three of them
@@ -7,13 +7,13 @@ module PubSubModelSync
7
7
 
8
8
  # customizable callbacks
9
9
  cattr_accessor(:debug) { false }
10
- cattr_accessor :logger # LoggerInst
10
+ cattr_accessor(:logger) { Rails.logger }
11
11
  cattr_accessor(:transactions_max_buffer) { 1 }
12
12
  cattr_accessor(:skip_cache) { false }
13
13
 
14
14
  cattr_accessor(:on_before_processing) { ->(_payload, _info) {} } # return :cancel to skip
15
15
  cattr_accessor(:on_success_processing) { ->(_payload, _info) {} }
16
- cattr_accessor(:on_error_processing) { ->(_exception, _info) {} }
16
+ cattr_accessor(:on_error_processing) { ->(exception, _info) { raise(exception) } }
17
17
  cattr_accessor(:on_before_publish) { ->(_payload) {} } # return :cancel to skip
18
18
  cattr_accessor(:on_after_publish) { ->(_payload) {} }
19
19
  cattr_accessor(:on_error_publish) { ->(_exception, _info) {} }
@@ -49,9 +49,14 @@ module PubSubModelSync
49
49
 
50
50
  # @param error (StandardError)
51
51
  def notify_error(error)
52
- info = [payload, error.message, error.backtrace]
52
+ error_msg = 'Error processing message: '
53
+ error_details = [payload, error.message, error.backtrace]
53
54
  res = config.on_error_processing.call(error, { payload: payload })
54
- log("Error processing message: #{info}", :error) if res != :skip_log
55
+ log("#{error_msg} #{error_details}", :error) if res != :skip_log
56
+ rescue => e
57
+ error_details = [payload, e.message, e.backtrace]
58
+ log("#{error_msg} #{error_details}", :error)
59
+ raise(e)
55
60
  end
56
61
 
57
62
  def lost_db_connection?(error)
@@ -24,6 +24,10 @@ module PubSubModelSync
24
24
  def publish(*_args)
25
25
  true
26
26
  end
27
+
28
+ def channel
29
+ MockChannel.new
30
+ end
27
31
  end
28
32
 
29
33
  class MockChannel
@@ -39,6 +43,10 @@ module PubSubModelSync
39
43
  def close
40
44
  true
41
45
  end
46
+
47
+ def ack(_delivery_tag)
48
+ true
49
+ end
42
50
  end
43
51
 
44
52
  def create_channel(*_args)
@@ -41,8 +41,9 @@ module PubSubModelSync
41
41
  end
42
42
 
43
43
  def optimize_payload # rubocop:disable Metrics/AbcSize
44
- changed_keys = Hash[(payload.data.to_a - previous_payload_data.to_a)].keys
45
- invalid_keys = payload.data.keys - (changed_keys + payload.cache_settings[:required])
44
+ changed_keys = Hash[(payload.data.to_a - previous_payload_data.to_a)].keys.map(&:to_sym)
45
+ required_keys = payload.cache_settings[:required].map(&:to_sym)
46
+ invalid_keys = payload.data.keys - (changed_keys + required_keys)
46
47
  log("Excluding non changed attributes: #{invalid_keys} from: #{payload.inspect}") if debug?
47
48
  payload.exclude_data_attrs(invalid_keys)
48
49
  end
@@ -33,25 +33,29 @@ module PubSubModelSync
33
33
  # @param (String: Payload in json format)
34
34
  def process_message(payload_info)
35
35
  payload = decode_payload(payload_info)
36
- return payload.process unless same_app_message?(payload)
36
+ return unless payload
37
+ return if same_app_message?(payload)
37
38
 
38
- log("Skipping message from same origin: #{[payload]}") if config.debug
39
- rescue => e
40
- error_payload = [payload, e.message, e.backtrace]
41
- log("Error while starting to process a message: #{error_payload}", :error)
39
+ payload.process
42
40
  end
43
41
 
44
- # @return Payload
42
+ # @return [Payload,Nil]
45
43
  def decode_payload(payload_info)
46
44
  payload = ::PubSubModelSync::Payload.from_payload_data(JSON.parse(payload_info))
47
45
  log("Received message: #{[payload]}") if config.debug
48
46
  payload
47
+ rescue => e
48
+ error_payload = [payload_info, e.message, e.backtrace]
49
+ log("Error while parsing payload: #{error_payload}", :error)
50
+ nil
49
51
  end
50
52
 
51
53
  # @param payload (Payload)
52
54
  def same_app_message?(payload)
53
55
  key = payload.headers[:app_key]
54
- key && key == config.subscription_key
56
+ res = key && key == config.subscription_key
57
+ log("Skipping message from same origin: #{[payload]}") if res && config.debug
58
+ res
55
59
  end
56
60
  end
57
61
  end
@@ -92,7 +92,6 @@ module PubSubModelSync
92
92
  def process_message(received_message)
93
93
  message = received_message.message
94
94
  super(message.data) if message.attributes[SERVICE_KEY]
95
- ensure
96
95
  received_message.acknowledge!
97
96
  end
98
97
  end
@@ -8,7 +8,7 @@ end
8
8
  module PubSubModelSync
9
9
  class ServiceKafka < ServiceBase
10
10
  QTY_WORKERS = 10
11
- LISTEN_SETTINGS = {}.freeze
11
+ LISTEN_SETTINGS = { automatically_mark_as_processed: false }.freeze
12
12
  PUBLISH_SETTINGS = {}.freeze
13
13
  PRODUCER_SETTINGS = { delivery_threshold: 200, delivery_interval: 30 }.freeze
14
14
  cattr_accessor :producer
@@ -73,6 +73,7 @@ module PubSubModelSync
73
73
 
74
74
  def process_message(message)
75
75
  super(message.value) if message.headers[SERVICE_KEY]
76
+ consumer.mark_message_as_processed(message)
76
77
  end
77
78
 
78
79
  # Check topic existence, create if missing topic
@@ -8,7 +8,7 @@ end
8
8
  module PubSubModelSync
9
9
  class ServiceRabbit < ServiceBase
10
10
  QUEUE_SETTINGS = { durable: true, auto_delete: false }.freeze
11
- LISTEN_SETTINGS = { manual_ack: false }.freeze
11
+ LISTEN_SETTINGS = { manual_ack: true }.freeze
12
12
  PUBLISH_SETTINGS = {}.freeze
13
13
 
14
14
  # @!attribute topic_names (Array): ['Topic 1', 'Topic 2']
@@ -25,7 +25,9 @@ module PubSubModelSync
25
25
 
26
26
  def listen_messages
27
27
  log('Listener starting...')
28
- subscribe_to_queues { |queue| queue.subscribe(LISTEN_SETTINGS, &method(:process_message)) }
28
+ subscribe_to_queues do |queue|
29
+ queue.subscribe(LISTEN_SETTINGS) { |info, meta, payload| process_message(queue, info, meta, payload) }
30
+ end
29
31
  log('Listener started')
30
32
  loop { sleep 5 }
31
33
  rescue PubSubModelSync::Runner::ShutDown
@@ -62,8 +64,9 @@ module PubSubModelSync
62
64
  }.merge(PUBLISH_SETTINGS)
63
65
  end
64
66
 
65
- def process_message(_delivery_info, meta_info, payload)
67
+ def process_message(queue, delivery_info, meta_info, payload)
66
68
  super(payload) if meta_info[:type] == SERVICE_KEY
69
+ queue.channel.ack(delivery_info.delivery_tag)
67
70
  end
68
71
 
69
72
  def subscribe_to_queues(&block)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PubSubModelSync
4
- VERSION = '1.4.0'
4
+ VERSION = '1.5.0'
5
5
  end
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  # into git.
28
28
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
29
29
  `git ls-files -z`.split("\x0")
30
- .reject { |f| f.match(%r{^(test|spec|features)/}) }
30
+ .reject { |f| f.match(%r{^(test|spec|features|samples)/}) }
31
31
  end
32
32
  spec.bindir = 'exe'
33
33
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
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: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Owen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-02 00:00:00.000000000 Z
11
+ date: 2022-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -134,92 +134,6 @@ files:
134
134
  - lib/pub_sub_model_sync/transaction.rb
135
135
  - lib/pub_sub_model_sync/version.rb
136
136
  - pub_sub_model_sync.gemspec
137
- - samples/README.md
138
- - samples/app1/Dockerfile
139
- - samples/app1/Gemfile
140
- - samples/app1/Gemfile.lock
141
- - samples/app1/README.md
142
- - samples/app1/Rakefile
143
- - samples/app1/app/models/application_record.rb
144
- - samples/app1/app/models/concerns/.keep
145
- - samples/app1/app/models/post.rb
146
- - samples/app1/app/models/user.rb
147
- - samples/app1/bin/bundle
148
- - samples/app1/bin/rails
149
- - samples/app1/bin/rake
150
- - samples/app1/bin/setup
151
- - samples/app1/bin/spring
152
- - samples/app1/config.ru
153
- - samples/app1/config/application.rb
154
- - samples/app1/config/boot.rb
155
- - samples/app1/config/credentials.yml.enc
156
- - samples/app1/config/database.yml
157
- - samples/app1/config/environment.rb
158
- - samples/app1/config/environments/development.rb
159
- - samples/app1/config/environments/production.rb
160
- - samples/app1/config/environments/test.rb
161
- - samples/app1/config/initializers/application_controller_renderer.rb
162
- - samples/app1/config/initializers/backtrace_silencers.rb
163
- - samples/app1/config/initializers/cors.rb
164
- - samples/app1/config/initializers/filter_parameter_logging.rb
165
- - samples/app1/config/initializers/inflections.rb
166
- - samples/app1/config/initializers/mime_types.rb
167
- - samples/app1/config/initializers/pubsub.rb
168
- - samples/app1/config/initializers/wrap_parameters.rb
169
- - samples/app1/config/locales/en.yml
170
- - samples/app1/config/master.key
171
- - samples/app1/config/puma.rb
172
- - samples/app1/config/routes.rb
173
- - samples/app1/config/spring.rb
174
- - samples/app1/db/migrate/20210513080700_create_users.rb
175
- - samples/app1/db/migrate/20210513134332_create_posts.rb
176
- - samples/app1/db/schema.rb
177
- - samples/app1/db/seeds.rb
178
- - samples/app1/docker-compose.yml
179
- - samples/app1/log/.keep
180
- - samples/app2/Dockerfile
181
- - samples/app2/Gemfile
182
- - samples/app2/Gemfile.lock
183
- - samples/app2/README.md
184
- - samples/app2/Rakefile
185
- - samples/app2/app/models/application_record.rb
186
- - samples/app2/app/models/concerns/.keep
187
- - samples/app2/app/models/customer.rb
188
- - samples/app2/app/models/post.rb
189
- - samples/app2/bin/bundle
190
- - samples/app2/bin/rails
191
- - samples/app2/bin/rake
192
- - samples/app2/bin/setup
193
- - samples/app2/bin/spring
194
- - samples/app2/config.ru
195
- - samples/app2/config/application.rb
196
- - samples/app2/config/boot.rb
197
- - samples/app2/config/credentials.yml.enc
198
- - samples/app2/config/database.yml
199
- - samples/app2/config/environment.rb
200
- - samples/app2/config/environments/development.rb
201
- - samples/app2/config/environments/production.rb
202
- - samples/app2/config/environments/test.rb
203
- - samples/app2/config/initializers/application_controller_renderer.rb
204
- - samples/app2/config/initializers/backtrace_silencers.rb
205
- - samples/app2/config/initializers/cors.rb
206
- - samples/app2/config/initializers/filter_parameter_logging.rb
207
- - samples/app2/config/initializers/inflections.rb
208
- - samples/app2/config/initializers/mime_types.rb
209
- - samples/app2/config/initializers/pubsub.rb
210
- - samples/app2/config/initializers/wrap_parameters.rb
211
- - samples/app2/config/locales/en.yml
212
- - samples/app2/config/master.key
213
- - samples/app2/config/puma.rb
214
- - samples/app2/config/routes.rb
215
- - samples/app2/config/spring.rb
216
- - samples/app2/db/development.sqlite3
217
- - samples/app2/db/migrate/20210513080956_create_customers.rb
218
- - samples/app2/db/migrate/20210513135203_create_posts.rb
219
- - samples/app2/db/schema.rb
220
- - samples/app2/db/seeds.rb
221
- - samples/app2/docker-compose.yml
222
- - samples/app2/log/.keep
223
137
  homepage: https://github.com/owen2345/pub_sub_model_sync
224
138
  licenses:
225
139
  - MIT
data/samples/README.md DELETED
@@ -1,50 +0,0 @@
1
- # Sample model sync
2
- This is a sample to sync information between rails applications using RabbitMQ
3
-
4
- ## Installation
5
- 1. Create manually the required network to share rabbitMQ accross Rails applications (just if not exist):
6
- ```docker network create shared_app_services```
7
-
8
- 2. Start RabbitMQ server
9
- ```cd samples/app1 && docker-compose up pubsub```
10
-
11
- 3. In another tab access to App2 to listen notifications (Wait for step 2)
12
- - Access to the folder
13
- `cd samples/app2`
14
-
15
- - Build docker and start listener (Received notifications will be printed here)
16
- ```docker-compose run listener```
17
-
18
- - Optional: Open another tab to access application to ensure synced data
19
- ```docker-compose run listener bash -c "rails c```
20
- ```ruby
21
- user = User.last.inspect
22
- user.posts.inspect
23
- ```
24
-
25
- 4. In another tab access to App1 to publish notifications (Wait for step 2)
26
- - Access to the application
27
- `cd samples/app1`
28
-
29
- - Build docker and enter rails console
30
- ```docker-compose run app bash -c "rails db:migrate && rails c"```
31
-
32
- - Create a sample user
33
- ```ruby
34
- user = User.create!(name: 'User 1', posts_attributes: [{ title: 'Post 1' }, { title: 'Post 2' }])
35
- ```
36
- Note: Check app2 console to see notifications (3 notifications)
37
- Note2: Access app2 console to see user and its posts
38
-
39
- - Update previous user
40
- ```ruby
41
- user.update!(name: 'User 1 changed', posts_attributes: user.posts.map { |post| { id: post.id, title: "#{post.title} changed" } })
42
- ```
43
- Note: Check app2 console to see notifications (3 notifications)
44
- Note2: Access app2 console to see changes for user and its posts
45
-
46
- - Destroy previous user
47
- ```ruby
48
- user.destroy!
49
- ```
50
-
@@ -1,13 +0,0 @@
1
- FROM ruby:2.7.1 AS builder
2
-
3
- # Allow apt to work with https-based sources
4
- RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends apt-transport-https
5
-
6
- RUN mkdir /app
7
- WORKDIR /app
8
-
9
- # backend
10
- COPY Gemfile.lock Gemfile /app/
11
- RUN gem install bundler && bundle install
12
-
13
- COPY . /app
data/samples/app1/Gemfile DELETED
@@ -1,37 +0,0 @@
1
- source 'https://rubygems.org'
2
- git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
-
4
- # Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main'
5
- gem 'rails', '~> 6.1.3', '>= 6.1.3.2'
6
- # Use sqlite3 as the database for Active Record
7
- gem 'sqlite3', '~> 1.4'
8
- # Use Puma as the app server
9
- gem 'puma', '~> 5.0'
10
- # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
11
- # gem 'jbuilder', '~> 2.7'
12
- # Use Active Model has_secure_password
13
- # gem 'bcrypt', '~> 3.1.7'
14
-
15
- # Reduces boot times through caching; required in config/boot.rb
16
- gem 'bootsnap', '>= 1.4.4', require: false
17
-
18
- # Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
19
- # gem 'rack-cors'
20
-
21
- gem 'pub_sub_model_sync', '>= 1.0'
22
- gem 'bunny' # to use rabbit-mq pub/sub service
23
- gem 'annotate'
24
-
25
- group :development, :test do
26
- # Call 'byebug' anywhere in the code to stop execution and get a debugger console
27
- gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
28
- end
29
-
30
- group :development do
31
- gem 'listen', '~> 3.3'
32
- # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
33
- gem 'spring'
34
- end
35
-
36
- # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
37
- gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]