roo_on_rails 1.8.1 → 1.9.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
  SHA1:
3
- metadata.gz: a12748afeabfe5feb779e2051e59c58428709628
4
- data.tar.gz: 39f18f2e6d56c739e3b95c23e73b5de7a1bce388
3
+ metadata.gz: 82ad20e84b42ea5464aa1d089f6e54c1476f38bf
4
+ data.tar.gz: b707a2fc6d70a093fc7b75c9ab44f61d1678bdd7
5
5
  SHA512:
6
- metadata.gz: 30dddc77f957057480418a62fe13d82ed0d5516e3aca68bb32e1d61f188e6dacf84276fb8d0d94d4bb58e5bb9655d65e7707c33abc7b0c93c24c556294a5177c
7
- data.tar.gz: e1e48287115b12b7d48792dc4e68540c20485b9ff9d801695daad2f15305f1ce9af06b7df9629c5e54f3eaf24d0bd85eebd3ed5123e52626a0bb4f98e7f2f856
6
+ metadata.gz: d94ba024d087ea2d51405d81bc9b690c072492551384d409bc0d8b34d6b24a11dd46db96e8ef5093ef6e04db731d149af91377470d0da6fc7fc328e81ec09682
7
+ data.tar.gz: 0a7839fda65b584af46860dd660a303889cb9a159502053a02ec7875e70fe1ea20c7240f12b9f0ccb2696134fe19b72d8c3b5a2b19a77d95467992feb84cab79
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # v1.9.0 (2017-08-08)
2
+
3
+ Features:
4
+
5
+ - Publish lifecycle events to Routemaster (#19)
6
+
1
7
  # v1.8.1 (2017-07-27)
2
8
 
3
9
  Features:
data/README.md CHANGED
@@ -16,16 +16,18 @@
16
16
  **Table of Contents**
17
17
 
18
18
  - [Installation](#installation)
19
- - [Usage](#usage)
20
- - [Library features](#library-features)
21
- - [New Relic configuration](#new-relic-configuration)
22
- - [Rack middleware](#rack-middleware)
23
- - [Database configuration](#database-configuration)
24
- - [Sidekiq](#sidekiq)
25
- - [HireFire Workers](#hirefire-workers)
26
- - [Logging](#logging)
27
- - [Google Oauth](#google-oauth)
19
+ - [Library usage](#library-usage)
20
+ - [New Relic configuration](#new-relic-configuration)
21
+ - [Rack middleware](#rack-middleware)
22
+ - [Database configuration](#database-configuration)
23
+ - [Sidekiq](#sidekiq)
24
+ - [HireFire (for Sidekiq workers)](#hirefire-for-sidekiq-workers)
25
+ - [Logging](#logging)
26
+ - [Google OAuth authentication](#google-oauth-authentication)
27
+ - [Routemaster Client](#routemaster-client)
28
28
  - [Command features](#command-features)
29
+ - [Usage](#usage)
30
+ - [Description](#description)
29
31
  - [Contributing](#contributing)
30
32
  - [License](#license)
31
33
 
@@ -57,9 +59,7 @@ And then execute:
57
59
 
58
60
  Then re-run your test suite to make sure everything is shipshape.
59
61
 
60
- ## Usage
61
-
62
- ## Configuration and usage
62
+ ## Library usage
63
63
 
64
64
  ### New Relic configuration
65
65
 
@@ -199,6 +199,14 @@ application.
199
199
 
200
200
  A simple but secure example is detailed in `README.google_oauth2.md`.
201
201
 
202
+ ### Routemaster Client
203
+
204
+ When `ROUTEMASTER_ENABLED` is set to `true` we attempt to configure [`routemaster-client`](https://github.com/deliveroo/routemaster-client) on your application. In order for this to happen you need to set the following environment variables:
205
+
206
+ * `ROUTEMASTER_URL` – the full URL of your Routemaster application (mandatory)
207
+ * `ROUTEMASTER_UUID` – the UUID of your application, e.g. `logistics-dashboard` (mandatory)
208
+
209
+ If you then want to enable the publishing of events onto the event bus, you need to set `ROUTEMASTER_PUBLISHING_ENABLED` to `true` and implement publishers as needed. An example of how to do this is detailed in [`README.routemaster_client.md`](README.routemaster_client.md).
202
210
 
203
211
  ## Command features
204
212
 
@@ -0,0 +1,105 @@
1
+ ## Using the Routemaster Client feature
2
+
3
+ [`routemaster-client`](https://github.com/deliveroo/routemaster-client) comes as a dependency of `roo_on_rails` with a basic implementation of lifecycle event publishers.
4
+
5
+ This code example assumes that you are using the latest version of the [`roo_on_rails`](roo_on_rails) gem and that you have set the correct environment variables for Routemaster Client to work on your app, as explained in the main [`README.md`](roo_on_rails#routemaster-client) file.
6
+
7
+ It also assumes that your app has an API for the resources you want to publish lifecycle events for, with matching routes and an `API_HOST` environment variable set.
8
+
9
+ ### Setup lifecycle events for your models
10
+
11
+ We will most likely want to publish lifecycle events for several models, so to write slightly less code let's create a model concern first:
12
+
13
+ ```ruby
14
+ # app/models/concerns/routemaster_lifecycle_events.rb
15
+ require 'roo_on_rails/routemaster/lifecycle_events'
16
+
17
+ module RoutemasterLifecycleEvents
18
+ extend ActiveSupport::Concern
19
+ include RooOnRails::Routemaster::LifecycleEvents
20
+
21
+ included do
22
+ publish_lifecycle_events
23
+ end
24
+ end
25
+ ```
26
+
27
+ Then let's include this concern to the relevant model(s):
28
+
29
+ ```ruby
30
+ # app/models/order.rb
31
+ class Order < ApplicationRecord
32
+ include RoutemasterLifecycleEvents
33
+
34
+ # ...
35
+ end
36
+ ```
37
+
38
+ And another one for the example:
39
+
40
+ ```ruby
41
+ # app/models/rider.rb
42
+ class Rider < ApplicationRecord
43
+ include RoutemasterLifecycleEvents
44
+
45
+ # ...
46
+ end
47
+ ```
48
+
49
+ ### Create publishers for lifecycle events
50
+
51
+ We have now configured our models to publish lifecycle events to Routemaster, but it won't send anything until you have enabled publishing and created matching publishers. Let's start with creating a `BasePublisher` that we can then inherit from:
52
+
53
+ ```ruby
54
+ # app/publishers/base_publisher.rb
55
+ require 'roo_on_rails/routemaster/publisher'
56
+
57
+ class BasePublisher < RooOnRails::Routemaster::Publisher
58
+ include Rails.application.routes.url_helpers
59
+
60
+ # Add your method overrides here if needed
61
+ end
62
+ ```
63
+
64
+ Then create a publisher for each model with lifecycle events enabled:
65
+
66
+ ```ruby
67
+ # app/publishers/order_publisher.rb
68
+ class OrderPublisher < BasePublisher
69
+ def url
70
+ api_order_url(model, host: ENV.fetch('API_HOST'), protocol: 'https')
71
+ end
72
+ end
73
+ ```
74
+
75
+ and
76
+
77
+ ```ruby
78
+ # app/publishers/rider_publisher.rb
79
+ class RiderPublisher < BasePublisher
80
+ def url
81
+ api_rider_url(model, host: ENV.fetch('API_HOST'), protocol: 'https')
82
+ end
83
+ end
84
+ ```
85
+
86
+ ### Register the publishers with Routemaster
87
+
88
+ The final step is to tell Routemaster that these publishers exist, so that it can listen to their events. We're going to do this in an initialiser:
89
+
90
+ ```ruby
91
+ # config/initilizers/routemaster.rb
92
+ require 'roo_on_rails/routemaster/publishers'
93
+
94
+ PUBLISHERS = [
95
+ OrderPublisher,
96
+ RiderPublisher
97
+ ].freeze
98
+
99
+ PUBLISHERS.each do |publisher|
100
+ model_class = publisher.to_s.gsub("Publisher", "").constantize
101
+ RooOnRails::Routemaster::Publishers.register(publisher, model_class: model_class)
102
+ end
103
+ ```
104
+
105
+ We should now be all set for our app to publish lifecycle events for `orders` and `riders` onto the event bus, so that other apps can listen to them.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- roo_on_rails (1.8.1)
4
+ roo_on_rails (1.9.0)
5
5
  dogstatsd-ruby
6
6
  dotenv-rails (~> 2.1)
7
7
  faraday
@@ -15,6 +15,7 @@ PATH
15
15
  rack-ssl-enforcer
16
16
  rack-timeout
17
17
  rails (>= 3.2.22, < 5.2)
18
+ routemaster-client
18
19
  sidekiq
19
20
 
20
21
  GEM
@@ -73,10 +74,12 @@ GEM
73
74
  dotenv (= 2.2.1)
74
75
  railties (>= 3.2, < 5.2)
75
76
  erubis (2.7.0)
76
- excon (0.57.1)
77
+ ethon (0.10.1)
78
+ ffi (>= 1.3.0)
79
+ excon (0.58.0)
77
80
  faraday (0.12.2)
78
81
  multipart-post (>= 1.2, < 3)
79
- faraday_middleware (0.11.0.1)
82
+ faraday_middleware (0.12.2)
80
83
  faraday (>= 0.7.4, < 1.0)
81
84
  ffi (1.9.18)
82
85
  formatador (0.2.5)
@@ -134,10 +137,11 @@ GEM
134
137
  rack (>= 1.2, < 3)
135
138
  octokit (4.7.0)
136
139
  sawyer (~> 0.8.0, >= 0.5.3)
140
+ oj (2.18.5)
137
141
  omniauth (1.4.2)
138
142
  hashie (>= 1.2, < 4)
139
143
  rack (>= 1.0, < 3)
140
- omniauth-google-oauth2 (0.5.1)
144
+ omniauth-google-oauth2 (0.5.2)
141
145
  jwt (~> 1.5)
142
146
  multi_json (~> 1.3)
143
147
  omniauth (>= 1.1.1)
@@ -191,6 +195,11 @@ GEM
191
195
  rdoc (3.12.2)
192
196
  json (~> 1.4)
193
197
  redis (3.3.3)
198
+ routemaster-client (3.1.0)
199
+ faraday (>= 0.9.0)
200
+ oj (~> 2.17)
201
+ typhoeus (~> 1.1)
202
+ wisper (~> 1.6.1)
194
203
  rspec (3.6.0)
195
204
  rspec-core (~> 3.6.0)
196
205
  rspec-expectations (~> 3.6.0)
@@ -232,12 +241,15 @@ GEM
232
241
  treetop (1.4.15)
233
242
  polyglot
234
243
  polyglot (>= 0.3.1)
244
+ typhoeus (1.1.2)
245
+ ethon (>= 0.9.0)
235
246
  tzinfo (0.3.53)
236
247
  url (0.3.2)
237
248
  webmock (3.0.1)
238
249
  addressable (>= 2.3.6)
239
250
  crack (>= 0.3.2)
240
251
  hashdiff
252
+ wisper (1.6.1)
241
253
 
242
254
  PLATFORMS
243
255
  ruby
@@ -263,4 +275,4 @@ DEPENDENCIES
263
275
  webmock
264
276
 
265
277
  BUNDLED WITH
266
- 1.14.6
278
+ 1.15.3
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- roo_on_rails (1.8.1)
4
+ roo_on_rails (1.9.0)
5
5
  dogstatsd-ruby
6
6
  dotenv-rails (~> 2.1)
7
7
  faraday
@@ -15,6 +15,7 @@ PATH
15
15
  rack-ssl-enforcer
16
16
  rack-timeout
17
17
  rails (>= 3.2.22, < 5.2)
18
+ routemaster-client
18
19
  sidekiq
19
20
 
20
21
  GEM
@@ -80,10 +81,12 @@ GEM
80
81
  dotenv (= 2.2.1)
81
82
  railties (>= 3.2, < 5.2)
82
83
  erubis (2.7.0)
83
- excon (0.57.1)
84
+ ethon (0.10.1)
85
+ ffi (>= 1.3.0)
86
+ excon (0.58.0)
84
87
  faraday (0.12.2)
85
88
  multipart-post (>= 1.2, < 3)
86
- faraday_middleware (0.11.0.1)
89
+ faraday_middleware (0.12.2)
87
90
  faraday (>= 0.7.4, < 1.0)
88
91
  ffi (1.9.18)
89
92
  formatador (0.2.5)
@@ -148,10 +151,11 @@ GEM
148
151
  rack (>= 1.2, < 3)
149
152
  octokit (4.7.0)
150
153
  sawyer (~> 0.8.0, >= 0.5.3)
154
+ oj (2.18.5)
151
155
  omniauth (1.6.1)
152
156
  hashie (>= 3.4.6, < 3.6.0)
153
157
  rack (>= 1.6.2, < 3)
154
- omniauth-google-oauth2 (0.5.1)
158
+ omniauth-google-oauth2 (0.5.2)
155
159
  jwt (~> 1.5)
156
160
  multi_json (~> 1.3)
157
161
  omniauth (>= 1.1.1)
@@ -207,6 +211,11 @@ GEM
207
211
  rb-inotify (0.9.10)
208
212
  ffi (>= 0.5.0, < 2)
209
213
  redis (3.3.3)
214
+ routemaster-client (3.1.0)
215
+ faraday (>= 0.9.0)
216
+ oj (~> 2.17)
217
+ typhoeus (~> 1.1)
218
+ wisper (~> 1.6.1)
210
219
  rspec (3.6.0)
211
220
  rspec-core (~> 3.6.0)
212
221
  rspec-expectations (~> 3.6.0)
@@ -247,6 +256,8 @@ GEM
247
256
  sqlite3 (1.3.13)
248
257
  thor (0.19.4)
249
258
  thread_safe (0.3.6)
259
+ typhoeus (1.1.2)
260
+ ethon (>= 0.9.0)
250
261
  tzinfo (1.2.3)
251
262
  thread_safe (~> 0.1)
252
263
  url (0.3.2)
@@ -254,6 +265,7 @@ GEM
254
265
  addressable (>= 2.3.6)
255
266
  crack (>= 0.3.2)
256
267
  hashdiff
268
+ wisper (1.6.1)
257
269
 
258
270
  PLATFORMS
259
271
  ruby
@@ -278,4 +290,4 @@ DEPENDENCIES
278
290
  webmock
279
291
 
280
292
  BUNDLED WITH
281
- 1.14.6
293
+ 1.15.3
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- roo_on_rails (1.8.1)
4
+ roo_on_rails (1.9.0)
5
5
  dogstatsd-ruby
6
6
  dotenv-rails (~> 2.1)
7
7
  faraday
@@ -15,6 +15,7 @@ PATH
15
15
  rack-ssl-enforcer
16
16
  rack-timeout
17
17
  rails (>= 3.2.22, < 5.2)
18
+ routemaster-client
18
19
  sidekiq
19
20
 
20
21
  GEM
@@ -83,10 +84,12 @@ GEM
83
84
  dotenv (= 2.2.1)
84
85
  railties (>= 3.2, < 5.2)
85
86
  erubis (2.7.0)
86
- excon (0.57.1)
87
+ ethon (0.10.1)
88
+ ffi (>= 1.3.0)
89
+ excon (0.58.0)
87
90
  faraday (0.12.2)
88
91
  multipart-post (>= 1.2, < 3)
89
- faraday_middleware (0.11.0.1)
92
+ faraday_middleware (0.12.2)
90
93
  faraday (>= 0.7.4, < 1.0)
91
94
  ffi (1.9.18)
92
95
  formatador (0.2.5)
@@ -152,10 +155,11 @@ GEM
152
155
  rack (>= 1.2, < 3)
153
156
  octokit (4.7.0)
154
157
  sawyer (~> 0.8.0, >= 0.5.3)
158
+ oj (2.18.5)
155
159
  omniauth (1.6.1)
156
160
  hashie (>= 3.4.6, < 3.6.0)
157
161
  rack (>= 1.6.2, < 3)
158
- omniauth-google-oauth2 (0.5.1)
162
+ omniauth-google-oauth2 (0.5.2)
159
163
  jwt (~> 1.5)
160
164
  multi_json (~> 1.3)
161
165
  omniauth (>= 1.1.1)
@@ -210,6 +214,11 @@ GEM
210
214
  rb-inotify (0.9.10)
211
215
  ffi (>= 0.5.0, < 2)
212
216
  redis (3.3.3)
217
+ routemaster-client (3.1.0)
218
+ faraday (>= 0.9.0)
219
+ oj (~> 2.17)
220
+ typhoeus (~> 1.1)
221
+ wisper (~> 1.6.1)
213
222
  rspec (3.6.0)
214
223
  rspec-core (~> 3.6.0)
215
224
  rspec-expectations (~> 3.6.0)
@@ -250,6 +259,8 @@ GEM
250
259
  sqlite3 (1.3.13)
251
260
  thor (0.19.4)
252
261
  thread_safe (0.3.6)
262
+ typhoeus (1.1.2)
263
+ ethon (>= 0.9.0)
253
264
  tzinfo (1.2.3)
254
265
  thread_safe (~> 0.1)
255
266
  url (0.3.2)
@@ -260,6 +271,7 @@ GEM
260
271
  websocket-driver (0.6.5)
261
272
  websocket-extensions (>= 0.1.0)
262
273
  websocket-extensions (0.1.2)
274
+ wisper (1.6.1)
263
275
 
264
276
  PLATFORMS
265
277
  ruby
@@ -284,4 +296,4 @@ DEPENDENCIES
284
296
  webmock
285
297
 
286
298
  BUNDLED WITH
287
- 1.14.6
299
+ 1.15.3
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- roo_on_rails (1.8.1)
4
+ roo_on_rails (1.9.0)
5
5
  dogstatsd-ruby
6
6
  dotenv-rails (~> 2.1)
7
7
  faraday
@@ -15,6 +15,7 @@ PATH
15
15
  rack-ssl-enforcer
16
16
  rack-timeout
17
17
  rails (>= 3.2.22, < 5.2)
18
+ routemaster-client
18
19
  sidekiq
19
20
 
20
21
  GEM
@@ -84,10 +85,12 @@ GEM
84
85
  railties (>= 3.2, < 5.2)
85
86
  erubi (1.6.0)
86
87
  erubis (2.7.0)
87
- excon (0.57.1)
88
+ ethon (0.10.1)
89
+ ffi (>= 1.3.0)
90
+ excon (0.58.0)
88
91
  faraday (0.12.2)
89
92
  multipart-post (>= 1.2, < 3)
90
- faraday_middleware (0.11.0.1)
93
+ faraday_middleware (0.12.2)
91
94
  faraday (>= 0.7.4, < 1.0)
92
95
  ffi (1.9.18)
93
96
  formatador (0.2.5)
@@ -153,10 +156,11 @@ GEM
153
156
  rack (>= 1.2, < 3)
154
157
  octokit (4.7.0)
155
158
  sawyer (~> 0.8.0, >= 0.5.3)
159
+ oj (2.18.5)
156
160
  omniauth (1.6.1)
157
161
  hashie (>= 3.4.6, < 3.6.0)
158
162
  rack (>= 1.6.2, < 3)
159
- omniauth-google-oauth2 (0.5.1)
163
+ omniauth-google-oauth2 (0.5.2)
160
164
  jwt (~> 1.5)
161
165
  multi_json (~> 1.3)
162
166
  omniauth (>= 1.1.1)
@@ -211,6 +215,11 @@ GEM
211
215
  rb-inotify (0.9.10)
212
216
  ffi (>= 0.5.0, < 2)
213
217
  redis (3.3.3)
218
+ routemaster-client (3.1.0)
219
+ faraday (>= 0.9.0)
220
+ oj (~> 2.17)
221
+ typhoeus (~> 1.1)
222
+ wisper (~> 1.6.1)
214
223
  rspec (3.6.0)
215
224
  rspec-core (~> 3.6.0)
216
225
  rspec-expectations (~> 3.6.0)
@@ -251,6 +260,8 @@ GEM
251
260
  sqlite3 (1.3.13)
252
261
  thor (0.19.4)
253
262
  thread_safe (0.3.6)
263
+ typhoeus (1.1.2)
264
+ ethon (>= 0.9.0)
254
265
  tzinfo (1.2.3)
255
266
  thread_safe (~> 0.1)
256
267
  url (0.3.2)
@@ -261,6 +272,7 @@ GEM
261
272
  websocket-driver (0.6.5)
262
273
  websocket-extensions (>= 0.1.0)
263
274
  websocket-extensions (0.1.2)
275
+ wisper (1.6.1)
264
276
 
265
277
  PLATFORMS
266
278
  ruby
@@ -285,4 +297,4 @@ DEPENDENCIES
285
297
  webmock
286
298
 
287
299
  BUNDLED WITH
288
- 1.14.6
300
+ 1.15.3
@@ -25,6 +25,14 @@ module RooOnRails
25
25
  ENV.fetch('GOOGLE_AUTH_CONTROLLER')
26
26
  end
27
27
 
28
+ def routemaster_enabled?
29
+ enabled? 'ROUTEMASTER_ENABLED', default: false
30
+ end
31
+
32
+ def routemaster_publishing_enabled?
33
+ enabled? 'ROUTEMASTER_PUBLISHING_ENABLED', default: false
34
+ end
35
+
28
36
  private
29
37
 
30
38
  ENABLED_PATTERN = /\A(YES|TRUE|ON|1)\Z/i
@@ -15,6 +15,10 @@ NEW_RELIC_DEVELOPER_MODE=false
15
15
  NEW_RELIC_LICENSE_KEY=override-me
16
16
  RACK_SERVICE_TIMEOUT=10
17
17
  RACK_WAIT_TIMEOUT=30
18
+ ROUTEMASTER_URL=''
19
+ ROUTEMASTER_UUID=''
20
+ ROUTEMASTER_ENABLED=false
21
+ ROUTEMASTER_PUBLISHING_ENABLED=false
18
22
  SIDEKIQ_ENABLED=true
19
23
  SIDEKIQ_THREADS=25
20
24
  SIDEKIQ_DATABASE_REAPING_FREQUENCY=10
@@ -0,0 +1,36 @@
1
+ require 'roo_on_rails/config'
2
+
3
+ module RooOnRails
4
+ module Railties
5
+ class Routemaster < Rails::Railtie
6
+ initializer 'roo_on_rails.routemaster' do
7
+ next unless Config.routemaster_enabled?
8
+
9
+ $stderr.puts 'initializer roo_on_rails.routemaster'
10
+
11
+ abort 'Aborting: ROUTEMASTER_URL and ROUTEMASTER_UUID are required' if bus_details_missing?
12
+
13
+ require 'routemaster/client'
14
+
15
+ ::Routemaster::Client.configure do |config|
16
+ config.url = routemaster_url
17
+ config.uuid = routemaster_uuid
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def bus_details_missing?
24
+ routemaster_url.blank? || routemaster_uuid.blank?
25
+ end
26
+
27
+ def routemaster_url
28
+ ENV.fetch('ROUTEMASTER_URL')
29
+ end
30
+
31
+ def routemaster_uuid
32
+ ENV.fetch('ROUTEMASTER_UUID')
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,56 @@
1
+ require 'active_support/concern'
2
+ require 'new_relic/agent'
3
+ require 'roo_on_rails/routemaster/publishers'
4
+
5
+ module RooOnRails
6
+ module Routemaster
7
+ module LifecycleEvents
8
+ extend ActiveSupport::Concern
9
+
10
+ ACTIVE_RECORD_TO_ROUTEMASTER_EVENT_MAP = {
11
+ create: :created,
12
+ update: :updated,
13
+ destroy: :deleted,
14
+ noop: :noop
15
+ }.freeze
16
+ private_constant :ACTIVE_RECORD_TO_ROUTEMASTER_EVENT_MAP
17
+
18
+ def publish_lifecycle_event(event)
19
+ publishers = Routemaster::Publishers.for(self, routemaster_event_type(event))
20
+ publishers.each do |publisher|
21
+ begin
22
+ publisher.publish!
23
+ rescue => e
24
+ NewRelic::Agent.notice_error(e)
25
+ end
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def routemaster_event_type(event)
32
+ ACTIVE_RECORD_TO_ROUTEMASTER_EVENT_MAP[event].tap do |type|
33
+ raise "invalid lifecycle event '#{event}'" unless type
34
+ end
35
+ end
36
+
37
+ %i(create update destroy noop).each do |event|
38
+ define_method("publish_lifecycle_event_on_#{event}") do
39
+ publish_lifecycle_event(event)
40
+ end
41
+ end
42
+
43
+ module ClassMethods
44
+ def publish_lifecycle_events(*events)
45
+ events = events.any? ? events : %i(create update destroy)
46
+ events.each do |event|
47
+ after_commit(
48
+ :"publish_lifecycle_event_on_#{event}",
49
+ on: event
50
+ )
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,57 @@
1
+ require 'roo_on_rails/config'
2
+ require 'routemaster/client'
3
+
4
+ module RooOnRails
5
+ module Routemaster
6
+ class Publisher
7
+ attr_reader :model, :event
8
+
9
+ def initialize(model, event, client: ::Routemaster::Client)
10
+ @model = model
11
+ @event = event
12
+ @client = client
13
+ end
14
+
15
+ def publish?
16
+ noop? || @model.new_record? || @model.previous_changes.any?
17
+ end
18
+
19
+ def will_publish?
20
+ Config.routemaster_publishing_enabled? && publish?
21
+ end
22
+
23
+ def publish!
24
+ return unless will_publish?
25
+ @client.send(@event, topic, url, data: stringify_keys(data))
26
+ end
27
+
28
+ def topic
29
+ @model.class.name.tableize
30
+ end
31
+
32
+ def url
33
+ raise NotImplementedError
34
+ end
35
+
36
+ def data
37
+ nil
38
+ end
39
+
40
+ %i(created updated deleted noop).each do |event_type|
41
+ define_method :"#{event_type}?" do
42
+ @event.to_sym == event_type
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def stringify_keys(hash)
49
+ return hash if hash.nil? || hash.empty?
50
+
51
+ hash.each_with_object({}) do |(k, v), h|
52
+ h[k.to_s] = v.is_a?(Hash) ? stringify_keys(v) : v
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,17 @@
1
+ module RooOnRails
2
+ module Routemaster
3
+ module Publishers
4
+ @publishers = {}
5
+
6
+ def self.register(publisher_class, model_class:)
7
+ @publishers[model_class] ||= Set.new
8
+ @publishers[model_class] << publisher_class
9
+ end
10
+
11
+ def self.for(model, event)
12
+ publisher_classes = @publishers[model.class]
13
+ publisher_classes.map { |c| c.new(model, event) }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module RooOnRails
2
- VERSION = '1.8.1'.freeze
2
+ VERSION = '1.9.0'.freeze
3
3
  end
data/lib/roo_on_rails.rb CHANGED
@@ -12,4 +12,5 @@ if defined?(Rails)
12
12
  require 'roo_on_rails/railties/sidekiq'
13
13
  require 'roo_on_rails/railties/rake_tasks'
14
14
  require 'roo_on_rails/railties/google_oauth'
15
+ require 'roo_on_rails/railties/routemaster'
15
16
  end
data/roo_on_rails.gemspec CHANGED
@@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
35
35
  spec.add_runtime_dependency 'omniauth-google-oauth2'
36
36
  spec.add_runtime_dependency 'faraday'
37
37
  spec.add_runtime_dependency 'faraday_middleware'
38
+ spec.add_runtime_dependency 'routemaster-client'
38
39
 
39
40
  spec.add_development_dependency 'bundler', '~> 1.13'
40
41
  spec.add_development_dependency 'rake', '~> 10.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roo_on_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.1
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julien Letessier
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-27 00:00:00.000000000 Z
11
+ date: 2017-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dotenv-rails
@@ -212,6 +212,20 @@ dependencies:
212
212
  - - ">="
213
213
  - !ruby/object:Gem::Version
214
214
  version: '0'
215
+ - !ruby/object:Gem::Dependency
216
+ name: routemaster-client
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ type: :runtime
223
+ prerelease: false
224
+ version_requirements: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - ">="
227
+ - !ruby/object:Gem::Version
228
+ version: '0'
215
229
  - !ruby/object:Gem::Dependency
216
230
  name: bundler
217
231
  requirement: !ruby/object:Gem::Requirement
@@ -360,6 +374,7 @@ files:
360
374
  - LICENSE.txt
361
375
  - README.google_oauth2.md
362
376
  - README.md
377
+ - README.routemaster_client.md
363
378
  - Rakefile
364
379
  - appraise
365
380
  - bin/console
@@ -415,7 +430,11 @@ files:
415
430
  - lib/roo_on_rails/railties/http.rb
416
431
  - lib/roo_on_rails/railties/new_relic.rb
417
432
  - lib/roo_on_rails/railties/rake_tasks.rb
433
+ - lib/roo_on_rails/railties/routemaster.rb
418
434
  - lib/roo_on_rails/railties/sidekiq.rb
435
+ - lib/roo_on_rails/routemaster/lifecycle_events.rb
436
+ - lib/roo_on_rails/routemaster/publisher.rb
437
+ - lib/roo_on_rails/routemaster/publishers.rb
419
438
  - lib/roo_on_rails/shell.rb
420
439
  - lib/roo_on_rails/sidekiq/loader.rb
421
440
  - lib/roo_on_rails/sidekiq/metrics_worker.rb