journaled 2.5.0 → 4.1.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 +4 -4
- data/README.md +115 -24
- data/Rakefile +7 -1
- data/app/controllers/concerns/journaled/actor.rb +8 -5
- data/app/jobs/journaled/application_job.rb +4 -0
- data/app/jobs/journaled/delivery_job.rb +105 -0
- data/app/models/journaled/actor_uri_provider.rb +1 -2
- data/app/models/journaled/change.rb +3 -3
- data/app/models/journaled/change_writer.rb +5 -5
- data/app/models/journaled/event.rb +25 -3
- data/app/models/journaled/writer.rb +17 -14
- data/journaled_schemas/tagged_event.json +14 -0
- data/lib/journaled/current.rb +18 -0
- data/lib/journaled/engine.rb +5 -0
- data/lib/journaled/version.rb +1 -1
- data/lib/journaled.rb +35 -5
- data/spec/dummy/config/application.rb +1 -2
- data/spec/dummy/config/database.yml +4 -19
- data/spec/dummy/config/environments/development.rb +0 -13
- data/spec/dummy/config/environments/test.rb +3 -5
- data/spec/dummy/db/schema.rb +3 -16
- data/spec/{models/journaled/delivery_spec.rb → jobs/journaled/delivery_job_spec.rb} +79 -25
- data/spec/lib/journaled_spec.rb +39 -0
- data/spec/models/concerns/journaled/actor_spec.rb +8 -7
- data/spec/models/database_change_protection_spec.rb +19 -25
- data/spec/models/journaled/actor_uri_provider_spec.rb +6 -5
- data/spec/models/journaled/change_writer_spec.rb +10 -10
- data/spec/models/journaled/event_spec.rb +82 -6
- data/spec/models/journaled/writer_spec.rb +47 -15
- data/spec/rails_helper.rb +1 -2
- data/spec/spec_helper.rb +1 -3
- metadata +29 -84
- data/app/models/journaled/delivery.rb +0 -88
- data/config/routes.rb +0 -2
- data/lib/journaled/enqueue.rb +0 -13
- data/spec/dummy/config/environments/production.rb +0 -78
- data/spec/dummy/config/initializers/assets.rb +0 -8
- data/spec/dummy/db/migrate/20180606205114_create_delayed_jobs.rb +0 -18
- data/spec/support/delayed_job_spec_helper.rb +0 -11
@@ -18,7 +18,7 @@ RSpec.describe Journaled::Writer do
|
|
18
18
|
journaled_schema_name: nil,
|
19
19
|
journaled_attributes: {},
|
20
20
|
journaled_partition_key: '',
|
21
|
-
|
21
|
+
journaled_stream_name: nil,
|
22
22
|
journaled_enqueue_opts: {},
|
23
23
|
)
|
24
24
|
end
|
@@ -34,7 +34,7 @@ RSpec.describe Journaled::Writer do
|
|
34
34
|
journaled_schema_name: :fake_schema_name,
|
35
35
|
journaled_attributes: { foo: :bar },
|
36
36
|
journaled_partition_key: 'fake_partition_key',
|
37
|
-
|
37
|
+
journaled_stream_name: nil,
|
38
38
|
journaled_enqueue_opts: {},
|
39
39
|
)
|
40
40
|
end
|
@@ -75,21 +75,18 @@ RSpec.describe Journaled::Writer do
|
|
75
75
|
journaled_schema_name: :fake_schema_name,
|
76
76
|
journaled_attributes: journaled_event_attributes,
|
77
77
|
journaled_partition_key: 'fake_partition_key',
|
78
|
-
|
78
|
+
journaled_stream_name: 'my_app_events',
|
79
79
|
journaled_enqueue_opts: journaled_enqueue_opts,
|
80
|
+
tagged?: false,
|
80
81
|
)
|
81
82
|
end
|
82
83
|
|
83
|
-
around do |example|
|
84
|
-
with_jobs_delayed { example.run }
|
85
|
-
end
|
86
|
-
|
87
84
|
context 'when the journaled event does NOT comply with the base_event schema' do
|
88
85
|
let(:journaled_event_attributes) { { foo: 1 } }
|
89
86
|
|
90
87
|
it 'raises an error and does not enqueue anything' do
|
91
88
|
expect { subject.journal! }.to raise_error JSON::Schema::ValidationError
|
92
|
-
expect(
|
89
|
+
expect(enqueued_jobs.count).to eq 0
|
93
90
|
end
|
94
91
|
end
|
95
92
|
|
@@ -99,7 +96,7 @@ RSpec.describe Journaled::Writer do
|
|
99
96
|
|
100
97
|
it 'raises an error and does not enqueue anything' do
|
101
98
|
expect { subject.journal! }.to raise_error JSON::Schema::ValidationError
|
102
|
-
expect(
|
99
|
+
expect(enqueued_jobs.count).to eq 0
|
103
100
|
end
|
104
101
|
end
|
105
102
|
|
@@ -107,9 +104,8 @@ RSpec.describe Journaled::Writer do
|
|
107
104
|
let(:journaled_event_attributes) { { id: 'FAKE_UUID', event_type: 'fake_event', created_at: Time.zone.now, foo: :bar } }
|
108
105
|
|
109
106
|
it 'creates a delivery with the app name passed through' do
|
110
|
-
|
111
|
-
|
112
|
-
expect(Journaled::Delivery).to have_received(:new).with(hash_including(app_name: 'my_app'))
|
107
|
+
expect { subject.journal! }.to change { enqueued_jobs.count }.from(0).to(1)
|
108
|
+
expect(enqueued_jobs.first[:args].first).to include('stream_name' => 'my_app_events')
|
113
109
|
end
|
114
110
|
|
115
111
|
context 'when there is no job priority specified in the enqueue opts' do
|
@@ -122,7 +118,11 @@ RSpec.describe Journaled::Writer do
|
|
122
118
|
|
123
119
|
it 'defaults to the global default' do
|
124
120
|
expect { subject.journal! }.to change {
|
125
|
-
|
121
|
+
if Rails::VERSION::MAJOR < 6
|
122
|
+
enqueued_jobs.select { |j| j[:job] == Journaled::DeliveryJob }.count
|
123
|
+
else
|
124
|
+
enqueued_jobs.select { |j| j['job_class'] == 'Journaled::DeliveryJob' && j['priority'] == 999 }.count
|
125
|
+
end
|
126
126
|
}.from(0).to(1)
|
127
127
|
end
|
128
128
|
end
|
@@ -130,13 +130,45 @@ RSpec.describe Journaled::Writer do
|
|
130
130
|
context 'when there is a job priority specified in the enqueue opts' do
|
131
131
|
let(:journaled_enqueue_opts) { { priority: 13 } }
|
132
132
|
|
133
|
-
it 'enqueues a Journaled::
|
133
|
+
it 'enqueues a Journaled::DeliveryJob with the given priority' do
|
134
134
|
expect { subject.journal! }.to change {
|
135
|
-
|
135
|
+
if Rails::VERSION::MAJOR < 6
|
136
|
+
enqueued_jobs.select { |j| j[:job] == Journaled::DeliveryJob }.count
|
137
|
+
else
|
138
|
+
enqueued_jobs.select { |j| j['job_class'] == 'Journaled::DeliveryJob' && j['priority'] == 13 }.count
|
139
|
+
end
|
136
140
|
}.from(0).to(1)
|
137
141
|
end
|
138
142
|
end
|
139
143
|
end
|
140
144
|
end
|
145
|
+
|
146
|
+
context 'when the event is tagged' do
|
147
|
+
before do
|
148
|
+
allow(journaled_event).to receive(:tagged?).and_return(true)
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'and the "tags" attribute is not present' do
|
152
|
+
let(:journaled_event_attributes) do
|
153
|
+
{ id: 'FAKE_UUID', event_type: 'fake_event', created_at: Time.zone.now, foo: 'bar' }
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'raises an error and does not enqueue anything' do
|
157
|
+
expect { subject.journal! }.to raise_error JSON::Schema::ValidationError
|
158
|
+
expect(enqueued_jobs.count).to eq 0
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'and the "tags" attribute is present' do
|
163
|
+
let(:journaled_event_attributes) do
|
164
|
+
{ id: 'FAKE_UUID', event_type: 'fake_event', created_at: Time.zone.now, foo: 'bar', tags: { baz: 'bat' } }
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'creates a delivery with the app name passed through' do
|
168
|
+
expect { subject.journal! }.to change { enqueued_jobs.count }.from(0).to(1)
|
169
|
+
expect(enqueued_jobs.first[:args].first).to include('stream_name' => 'my_app_events')
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
141
173
|
end
|
142
174
|
end
|
data/spec/rails_helper.rb
CHANGED
@@ -6,7 +6,6 @@ require 'rspec/rails'
|
|
6
6
|
require 'timecop'
|
7
7
|
require 'webmock/rspec'
|
8
8
|
require 'journaled/rspec'
|
9
|
-
require 'pry-rails'
|
10
9
|
|
11
10
|
Dir[Rails.root.join('..', 'support', '**', '*.rb')].each { |f| require f }
|
12
11
|
|
@@ -15,6 +14,6 @@ RSpec.configure do |config|
|
|
15
14
|
|
16
15
|
config.infer_spec_type_from_file_location!
|
17
16
|
|
18
|
-
config.include
|
17
|
+
config.include ActiveJob::TestHelper
|
19
18
|
config.include EnvironmentSpecHelper
|
20
19
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
require 'delayed_job_active_record'
|
2
1
|
rails_env = ENV['RAILS_ENV'] ||= 'test'
|
3
|
-
db_adapter = ENV['DB_ADAPTER'] ||= 'postgresql'
|
4
2
|
require File.expand_path('dummy/config/environment.rb', __dir__)
|
5
3
|
|
6
|
-
Rails.configuration.database_configuration[
|
4
|
+
Rails.configuration.database_configuration[rails_env].tap do |c|
|
7
5
|
ActiveRecord::Tasks::DatabaseTasks.create(c)
|
8
6
|
ActiveRecord::Base.establish_connection(c)
|
9
7
|
load File.expand_path('dummy/db/schema.rb', __dir__)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: journaled
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jake Lipson
|
@@ -11,24 +11,10 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2021-
|
14
|
+
date: 2021-11-04 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
|
-
name:
|
18
|
-
requirement: !ruby/object:Gem::Requirement
|
19
|
-
requirements:
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '2'
|
23
|
-
type: :runtime
|
24
|
-
prerelease: false
|
25
|
-
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
requirements:
|
27
|
-
- - "<"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '2'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: delayed_job
|
17
|
+
name: activejob
|
32
18
|
requirement: !ruby/object:Gem::Requirement
|
33
19
|
requirements:
|
34
20
|
- - ">="
|
@@ -42,7 +28,7 @@ dependencies:
|
|
42
28
|
- !ruby/object:Gem::Version
|
43
29
|
version: '0'
|
44
30
|
- !ruby/object:Gem::Dependency
|
45
|
-
name:
|
31
|
+
name: activerecord
|
46
32
|
requirement: !ruby/object:Gem::Requirement
|
47
33
|
requirements:
|
48
34
|
- - ">="
|
@@ -56,27 +42,21 @@ dependencies:
|
|
56
42
|
- !ruby/object:Gem::Version
|
57
43
|
version: '0'
|
58
44
|
- !ruby/object:Gem::Dependency
|
59
|
-
name:
|
45
|
+
name: aws-sdk-kinesis
|
60
46
|
requirement: !ruby/object:Gem::Requirement
|
61
47
|
requirements:
|
62
|
-
- - ">="
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
version: '5.1'
|
65
48
|
- - "<"
|
66
49
|
- !ruby/object:Gem::Version
|
67
|
-
version: '
|
50
|
+
version: '2'
|
68
51
|
type: :runtime
|
69
52
|
prerelease: false
|
70
53
|
version_requirements: !ruby/object:Gem::Requirement
|
71
54
|
requirements:
|
72
|
-
- - ">="
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: '5.1'
|
75
55
|
- - "<"
|
76
56
|
- !ruby/object:Gem::Version
|
77
|
-
version: '
|
57
|
+
version: '2'
|
78
58
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
59
|
+
name: json-schema
|
80
60
|
requirement: !ruby/object:Gem::Requirement
|
81
61
|
requirements:
|
82
62
|
- - ">="
|
@@ -90,61 +70,33 @@ dependencies:
|
|
90
70
|
- !ruby/object:Gem::Version
|
91
71
|
version: '0'
|
92
72
|
- !ruby/object:Gem::Dependency
|
93
|
-
name:
|
73
|
+
name: railties
|
94
74
|
requirement: !ruby/object:Gem::Requirement
|
95
|
-
requirements:
|
96
|
-
- - "~>"
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
version: 2.2.0
|
99
|
-
type: :development
|
100
|
-
prerelease: false
|
101
|
-
version_requirements: !ruby/object:Gem::Requirement
|
102
|
-
requirements:
|
103
|
-
- - "~>"
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
version: 2.2.0
|
106
|
-
- !ruby/object:Gem::Dependency
|
107
|
-
name: delayed_job_active_record
|
108
|
-
requirement: !ruby/object:Gem::Requirement
|
109
|
-
requirements:
|
110
|
-
- - ">="
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
version: '0'
|
113
|
-
type: :development
|
114
|
-
prerelease: false
|
115
|
-
version_requirements: !ruby/object:Gem::Requirement
|
116
75
|
requirements:
|
117
76
|
- - ">="
|
118
77
|
- !ruby/object:Gem::Version
|
119
|
-
version: '
|
120
|
-
|
121
|
-
name: pg
|
122
|
-
requirement: !ruby/object:Gem::Requirement
|
123
|
-
requirements:
|
124
|
-
- - ">="
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
version: '0'
|
127
|
-
type: :development
|
78
|
+
version: '5.2'
|
79
|
+
type: :runtime
|
128
80
|
prerelease: false
|
129
81
|
version_requirements: !ruby/object:Gem::Requirement
|
130
82
|
requirements:
|
131
83
|
- - ">="
|
132
84
|
- !ruby/object:Gem::Version
|
133
|
-
version: '
|
85
|
+
version: '5.2'
|
134
86
|
- !ruby/object:Gem::Dependency
|
135
|
-
name:
|
87
|
+
name: appraisal
|
136
88
|
requirement: !ruby/object:Gem::Requirement
|
137
89
|
requirements:
|
138
|
-
- - "
|
90
|
+
- - "~>"
|
139
91
|
- !ruby/object:Gem::Version
|
140
|
-
version:
|
92
|
+
version: 2.2.0
|
141
93
|
type: :development
|
142
94
|
prerelease: false
|
143
95
|
version_requirements: !ruby/object:Gem::Requirement
|
144
96
|
requirements:
|
145
|
-
- - "
|
97
|
+
- - "~>"
|
146
98
|
- !ruby/object:Gem::Version
|
147
|
-
version:
|
99
|
+
version: 2.2.0
|
148
100
|
- !ruby/object:Gem::Dependency
|
149
101
|
name: rspec-rails
|
150
102
|
requirement: !ruby/object:Gem::Requirement
|
@@ -216,19 +168,19 @@ dependencies:
|
|
216
168
|
- !ruby/object:Gem::Version
|
217
169
|
version: '0'
|
218
170
|
- !ruby/object:Gem::Dependency
|
219
|
-
name:
|
171
|
+
name: sqlite3
|
220
172
|
requirement: !ruby/object:Gem::Requirement
|
221
173
|
requirements:
|
222
|
-
- - "
|
174
|
+
- - ">="
|
223
175
|
- !ruby/object:Gem::Version
|
224
|
-
version: '
|
176
|
+
version: '0'
|
225
177
|
type: :development
|
226
178
|
prerelease: false
|
227
179
|
version_requirements: !ruby/object:Gem::Requirement
|
228
180
|
requirements:
|
229
|
-
- - "
|
181
|
+
- - ">="
|
230
182
|
- !ruby/object:Gem::Version
|
231
|
-
version: '
|
183
|
+
version: '0'
|
232
184
|
- !ruby/object:Gem::Dependency
|
233
185
|
name: timecop
|
234
186
|
requirement: !ruby/object:Gem::Requirement
|
@@ -272,24 +224,25 @@ files:
|
|
272
224
|
- README.md
|
273
225
|
- Rakefile
|
274
226
|
- app/controllers/concerns/journaled/actor.rb
|
227
|
+
- app/jobs/journaled/application_job.rb
|
228
|
+
- app/jobs/journaled/delivery_job.rb
|
275
229
|
- app/models/concerns/journaled/changes.rb
|
276
230
|
- app/models/journaled/actor_uri_provider.rb
|
277
231
|
- app/models/journaled/change.rb
|
278
232
|
- app/models/journaled/change_definition.rb
|
279
233
|
- app/models/journaled/change_writer.rb
|
280
|
-
- app/models/journaled/delivery.rb
|
281
234
|
- app/models/journaled/event.rb
|
282
235
|
- app/models/journaled/json_schema_model/validator.rb
|
283
236
|
- app/models/journaled/not_truly_exceptional_error.rb
|
284
237
|
- app/models/journaled/writer.rb
|
285
238
|
- config/initializers/change_protection.rb
|
286
|
-
- config/routes.rb
|
287
239
|
- config/spring.rb
|
288
240
|
- journaled_schemas/base_event.json
|
289
241
|
- journaled_schemas/journaled/change.json
|
242
|
+
- journaled_schemas/tagged_event.json
|
290
243
|
- lib/journaled.rb
|
244
|
+
- lib/journaled/current.rb
|
291
245
|
- lib/journaled/engine.rb
|
292
|
-
- lib/journaled/enqueue.rb
|
293
246
|
- lib/journaled/relation_change_protection.rb
|
294
247
|
- lib/journaled/rspec.rb
|
295
248
|
- lib/journaled/version.rb
|
@@ -304,9 +257,7 @@ files:
|
|
304
257
|
- spec/dummy/config/database.yml
|
305
258
|
- spec/dummy/config/environment.rb
|
306
259
|
- spec/dummy/config/environments/development.rb
|
307
|
-
- spec/dummy/config/environments/production.rb
|
308
260
|
- spec/dummy/config/environments/test.rb
|
309
|
-
- spec/dummy/config/initializers/assets.rb
|
310
261
|
- spec/dummy/config/initializers/backtrace_silencers.rb
|
311
262
|
- spec/dummy/config/initializers/cookies_serializer.rb
|
312
263
|
- spec/dummy/config/initializers/filter_parameter_logging.rb
|
@@ -317,25 +268,23 @@ files:
|
|
317
268
|
- spec/dummy/config/locales/en.yml
|
318
269
|
- spec/dummy/config/routes.rb
|
319
270
|
- spec/dummy/config/secrets.yml
|
320
|
-
- spec/dummy/db/migrate/20180606205114_create_delayed_jobs.rb
|
321
271
|
- spec/dummy/db/schema.rb
|
322
272
|
- spec/dummy/public/404.html
|
323
273
|
- spec/dummy/public/422.html
|
324
274
|
- spec/dummy/public/500.html
|
325
275
|
- spec/dummy/public/favicon.ico
|
276
|
+
- spec/jobs/journaled/delivery_job_spec.rb
|
326
277
|
- spec/lib/journaled_spec.rb
|
327
278
|
- spec/models/concerns/journaled/actor_spec.rb
|
328
279
|
- spec/models/concerns/journaled/changes_spec.rb
|
329
280
|
- spec/models/database_change_protection_spec.rb
|
330
281
|
- spec/models/journaled/actor_uri_provider_spec.rb
|
331
282
|
- spec/models/journaled/change_writer_spec.rb
|
332
|
-
- spec/models/journaled/delivery_spec.rb
|
333
283
|
- spec/models/journaled/event_spec.rb
|
334
284
|
- spec/models/journaled/json_schema_model/validator_spec.rb
|
335
285
|
- spec/models/journaled/writer_spec.rb
|
336
286
|
- spec/rails_helper.rb
|
337
287
|
- spec/spec_helper.rb
|
338
|
-
- spec/support/delayed_job_spec_helper.rb
|
339
288
|
- spec/support/environment_spec_helper.rb
|
340
289
|
homepage: http://github.com/Betterment/journaled
|
341
290
|
licenses:
|
@@ -356,7 +305,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
356
305
|
- !ruby/object:Gem::Version
|
357
306
|
version: '0'
|
358
307
|
requirements: []
|
359
|
-
rubygems_version: 3.1
|
308
|
+
rubygems_version: 3.0.1
|
360
309
|
signing_key:
|
361
310
|
specification_version: 4
|
362
311
|
summary: Journaling for Betterment apps.
|
@@ -368,7 +317,6 @@ test_files:
|
|
368
317
|
- spec/dummy/config/secrets.yml
|
369
318
|
- spec/dummy/config/routes.rb
|
370
319
|
- spec/dummy/config/locales/en.yml
|
371
|
-
- spec/dummy/config/environments/production.rb
|
372
320
|
- spec/dummy/config/environments/development.rb
|
373
321
|
- spec/dummy/config/environments/test.rb
|
374
322
|
- spec/dummy/config/environment.rb
|
@@ -380,7 +328,6 @@ test_files:
|
|
380
328
|
- spec/dummy/config/initializers/filter_parameter_logging.rb
|
381
329
|
- spec/dummy/config/initializers/session_store.rb
|
382
330
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
383
|
-
- spec/dummy/config/initializers/assets.rb
|
384
331
|
- spec/dummy/config/initializers/cookies_serializer.rb
|
385
332
|
- spec/dummy/config/initializers/inflections.rb
|
386
333
|
- spec/dummy/config.ru
|
@@ -390,18 +337,16 @@ test_files:
|
|
390
337
|
- spec/dummy/public/500.html
|
391
338
|
- spec/dummy/public/404.html
|
392
339
|
- spec/dummy/db/schema.rb
|
393
|
-
- spec/dummy/db/migrate/20180606205114_create_delayed_jobs.rb
|
394
340
|
- spec/dummy/README.rdoc
|
395
341
|
- spec/models/journaled/json_schema_model/validator_spec.rb
|
396
342
|
- spec/models/journaled/actor_uri_provider_spec.rb
|
397
|
-
- spec/models/journaled/delivery_spec.rb
|
398
343
|
- spec/models/journaled/event_spec.rb
|
399
344
|
- spec/models/journaled/change_writer_spec.rb
|
400
345
|
- spec/models/journaled/writer_spec.rb
|
401
346
|
- spec/models/database_change_protection_spec.rb
|
402
347
|
- spec/models/concerns/journaled/changes_spec.rb
|
403
348
|
- spec/models/concerns/journaled/actor_spec.rb
|
404
|
-
- spec/support/delayed_job_spec_helper.rb
|
405
349
|
- spec/support/environment_spec_helper.rb
|
406
350
|
- spec/lib/journaled_spec.rb
|
351
|
+
- spec/jobs/journaled/delivery_job_spec.rb
|
407
352
|
- spec/rails_helper.rb
|
@@ -1,88 +0,0 @@
|
|
1
|
-
class Journaled::Delivery # rubocop:disable Betterment/ActiveJobPerformable
|
2
|
-
DEFAULT_REGION = 'us-east-1'.freeze
|
3
|
-
|
4
|
-
def initialize(serialized_event:, partition_key:, app_name:)
|
5
|
-
@serialized_event = serialized_event
|
6
|
-
@partition_key = partition_key
|
7
|
-
@app_name = app_name
|
8
|
-
end
|
9
|
-
|
10
|
-
def perform
|
11
|
-
kinesis_client.put_record record if Journaled.enabled?
|
12
|
-
rescue Aws::Kinesis::Errors::InternalFailure, Aws::Kinesis::Errors::ServiceUnavailable, Aws::Kinesis::Errors::Http503Error => e
|
13
|
-
Rails.logger.error "Kinesis Error - Server Error occurred - #{e.class}"
|
14
|
-
raise KinesisTemporaryFailure
|
15
|
-
rescue Seahorse::Client::NetworkingError => e
|
16
|
-
Rails.logger.error "Kinesis Error - Networking Error occurred - #{e.class}"
|
17
|
-
raise KinesisTemporaryFailure
|
18
|
-
end
|
19
|
-
|
20
|
-
def stream_name
|
21
|
-
env_var_name = [app_name&.upcase, 'JOURNALED_STREAM_NAME'].compact.join('_')
|
22
|
-
ENV.fetch(env_var_name)
|
23
|
-
end
|
24
|
-
|
25
|
-
def kinesis_client_config
|
26
|
-
{
|
27
|
-
region: ENV.fetch('AWS_DEFAULT_REGION', DEFAULT_REGION),
|
28
|
-
retry_limit: 0,
|
29
|
-
http_idle_timeout: Journaled.http_idle_timeout,
|
30
|
-
http_open_timeout: Journaled.http_open_timeout,
|
31
|
-
http_read_timeout: Journaled.http_read_timeout,
|
32
|
-
}.merge(credentials)
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
attr_reader :serialized_event, :partition_key, :app_name
|
38
|
-
|
39
|
-
def record
|
40
|
-
{
|
41
|
-
stream_name: stream_name,
|
42
|
-
data: serialized_event,
|
43
|
-
partition_key: partition_key,
|
44
|
-
}
|
45
|
-
end
|
46
|
-
|
47
|
-
def kinesis_client
|
48
|
-
Aws::Kinesis::Client.new(kinesis_client_config)
|
49
|
-
end
|
50
|
-
|
51
|
-
def credentials
|
52
|
-
if ENV.key?('JOURNALED_IAM_ROLE_ARN')
|
53
|
-
{
|
54
|
-
credentials: iam_assume_role_credentials,
|
55
|
-
}
|
56
|
-
else
|
57
|
-
legacy_credentials_hash_if_present
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def legacy_credentials_hash_if_present
|
62
|
-
if ENV.key?('RUBY_AWS_ACCESS_KEY_ID')
|
63
|
-
{
|
64
|
-
access_key_id: ENV.fetch('RUBY_AWS_ACCESS_KEY_ID'),
|
65
|
-
secret_access_key: ENV.fetch('RUBY_AWS_SECRET_ACCESS_KEY'),
|
66
|
-
}
|
67
|
-
else
|
68
|
-
{}
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def sts_client
|
73
|
-
Aws::STS::Client.new({
|
74
|
-
region: ENV.fetch('AWS_DEFAULT_REGION', DEFAULT_REGION),
|
75
|
-
}.merge(legacy_credentials_hash_if_present))
|
76
|
-
end
|
77
|
-
|
78
|
-
def iam_assume_role_credentials
|
79
|
-
@iam_assume_role_credentials ||= Aws::AssumeRoleCredentials.new(
|
80
|
-
client: sts_client,
|
81
|
-
role_arn: ENV.fetch('JOURNALED_IAM_ROLE_ARN'),
|
82
|
-
role_session_name: "JournaledAssumeRoleAccess",
|
83
|
-
)
|
84
|
-
end
|
85
|
-
|
86
|
-
class KinesisTemporaryFailure < NotTrulyExceptionalError
|
87
|
-
end
|
88
|
-
end
|
data/config/routes.rb
DELETED
data/lib/journaled/enqueue.rb
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
Rails.application.configure do
|
2
|
-
# Settings specified here will take precedence over those in config/application.rb.
|
3
|
-
|
4
|
-
# Code is not reloaded between requests.
|
5
|
-
config.cache_classes = true
|
6
|
-
|
7
|
-
# Eager load code on boot. This eager loads most of Rails and
|
8
|
-
# your application in memory, allowing both threaded web servers
|
9
|
-
# and those relying on copy on write to perform better.
|
10
|
-
# Rake tasks automatically ignore this option for performance.
|
11
|
-
config.eager_load = true
|
12
|
-
|
13
|
-
# Full error reports are disabled and caching is turned on.
|
14
|
-
config.consider_all_requests_local = false
|
15
|
-
config.action_controller.perform_caching = true
|
16
|
-
|
17
|
-
# Enable Rack::Cache to put a simple HTTP cache in front of your application
|
18
|
-
# Add `rack-cache` to your Gemfile before enabling this.
|
19
|
-
# For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid.
|
20
|
-
# config.action_dispatch.rack_cache = true
|
21
|
-
|
22
|
-
# Disable Rails's static asset server (Apache or nginx will already do this).
|
23
|
-
config.serve_static_assets = false
|
24
|
-
|
25
|
-
# Compress JavaScripts and CSS.
|
26
|
-
config.assets.js_compressor = :uglifier
|
27
|
-
# config.assets.css_compressor = :sass
|
28
|
-
|
29
|
-
# Do not fallback to assets pipeline if a precompiled asset is missed.
|
30
|
-
config.assets.compile = false
|
31
|
-
|
32
|
-
# Generate digests for assets URLs.
|
33
|
-
config.assets.digest = true
|
34
|
-
|
35
|
-
# `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb
|
36
|
-
|
37
|
-
# Specifies the header that your server uses for sending files.
|
38
|
-
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
|
39
|
-
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
|
40
|
-
|
41
|
-
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
42
|
-
# config.force_ssl = true
|
43
|
-
|
44
|
-
# Set to :debug to see everything in the log.
|
45
|
-
config.log_level = :info
|
46
|
-
|
47
|
-
# Prepend all log lines with the following tags.
|
48
|
-
# config.log_tags = [ :subdomain, :uuid ]
|
49
|
-
|
50
|
-
# Use a different logger for distributed setups.
|
51
|
-
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
|
52
|
-
|
53
|
-
# Use a different cache store in production.
|
54
|
-
# config.cache_store = :mem_cache_store
|
55
|
-
|
56
|
-
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
|
57
|
-
# config.action_controller.asset_host = "http://assets.example.com"
|
58
|
-
|
59
|
-
# Ignore bad email addresses and do not raise email delivery errors.
|
60
|
-
# Set this to true and configure the email server for immediate delivery to raise delivery errors.
|
61
|
-
# config.action_mailer.raise_delivery_errors = false
|
62
|
-
|
63
|
-
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
64
|
-
# the I18n.default_locale when a translation cannot be found).
|
65
|
-
config.i18n.fallbacks = true
|
66
|
-
|
67
|
-
# Send deprecation notices to registered listeners.
|
68
|
-
config.active_support.deprecation = :notify
|
69
|
-
|
70
|
-
# Disable automatic flushing of the log to improve performance.
|
71
|
-
# config.autoflush_log = false
|
72
|
-
|
73
|
-
# Use default logging formatter so that PID and timestamp are not suppressed.
|
74
|
-
config.log_formatter = ::Logger::Formatter.new
|
75
|
-
|
76
|
-
# Do not dump schema after migrations.
|
77
|
-
config.active_record.dump_schema_after_migration = false
|
78
|
-
end
|
@@ -1,8 +0,0 @@
|
|
1
|
-
# Be sure to restart your server when you modify this file.
|
2
|
-
|
3
|
-
# Version of your assets, change this if you want to expire all your assets.
|
4
|
-
Rails.application.config.assets.version = '1.0'
|
5
|
-
|
6
|
-
# Precompile additional assets.
|
7
|
-
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
|
8
|
-
# Rails.application.config.assets.precompile += %w( search.js )
|
@@ -1,18 +0,0 @@
|
|
1
|
-
class CreateDelayedJobs < ActiveRecord::Migration[5.1]
|
2
|
-
def change
|
3
|
-
create_table :delayed_jobs do |t|
|
4
|
-
t.integer :priority, default: 0, null: false # Allows some jobs to jump to the front of the queue
|
5
|
-
t.integer :attempts, default: 0, null: false # Provides for retries, but still fail eventually.
|
6
|
-
t.text :handler, null: false # YAML-encoded string of the object that will do work
|
7
|
-
t.text :last_error # reason for last failure (See Note below)
|
8
|
-
t.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future.
|
9
|
-
t.datetime :locked_at # Set when a client is working on this object
|
10
|
-
t.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
|
11
|
-
t.string :locked_by # Who is working on this object (if locked)
|
12
|
-
t.string :queue # The name of the queue this job is in
|
13
|
-
t.timestamps null: true
|
14
|
-
end
|
15
|
-
|
16
|
-
add_index :delayed_jobs, [:priority, :run_at], name: "delayed_jobs_priority"
|
17
|
-
end
|
18
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
module DelayedJobSpecHelper
|
2
|
-
def with_jobs_delayed(opts = {})
|
3
|
-
work_off = opts.fetch(:work_off, true)
|
4
|
-
original = Delayed::Worker.delay_jobs
|
5
|
-
Delayed::Worker.delay_jobs = true
|
6
|
-
yield
|
7
|
-
ensure
|
8
|
-
Delayed::Worker.delay_jobs = original
|
9
|
-
Delayed::Worker.new.work_off if work_off
|
10
|
-
end
|
11
|
-
end
|