journaled 2.4.0 → 4.0.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.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +68 -19
  3. data/Rakefile +7 -1
  4. data/app/jobs/journaled/application_job.rb +4 -0
  5. data/app/jobs/journaled/delivery_job.rb +105 -0
  6. data/app/models/journaled/change.rb +3 -3
  7. data/app/models/journaled/change_writer.rb +5 -5
  8. data/app/models/journaled/event.rb +2 -2
  9. data/app/models/journaled/writer.rb +8 -6
  10. data/lib/journaled/engine.rb +5 -0
  11. data/lib/journaled/relation_change_protection.rb +1 -1
  12. data/lib/journaled/version.rb +1 -1
  13. data/lib/journaled.rb +23 -5
  14. data/spec/dummy/config/application.rb +1 -2
  15. data/spec/dummy/config/database.yml +4 -19
  16. data/spec/dummy/config/environments/development.rb +0 -13
  17. data/spec/dummy/config/environments/test.rb +3 -5
  18. data/spec/dummy/db/schema.rb +3 -16
  19. data/spec/{models/journaled/delivery_spec.rb → jobs/journaled/delivery_job_spec.rb} +82 -28
  20. data/spec/lib/journaled_spec.rb +39 -0
  21. data/spec/models/database_change_protection_spec.rb +19 -25
  22. data/spec/models/journaled/change_writer_spec.rb +10 -10
  23. data/spec/models/journaled/event_spec.rb +4 -4
  24. data/spec/models/journaled/writer_spec.rb +18 -15
  25. data/spec/rails_helper.rb +1 -2
  26. data/spec/spec_helper.rb +1 -3
  27. metadata +31 -74
  28. data/app/models/journaled/delivery.rb +0 -88
  29. data/config/routes.rb +0 -2
  30. data/lib/journaled/enqueue.rb +0 -13
  31. data/spec/dummy/config/environments/production.rb +0 -78
  32. data/spec/dummy/config/initializers/assets.rb +0 -8
  33. data/spec/dummy/db/migrate/20180606205114_create_delayed_jobs.rb +0 -18
  34. data/spec/support/delayed_job_spec_helper.rb +0 -11
metadata CHANGED
@@ -1,34 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: journaled
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Lipson
8
8
  - Corey Alexander
9
9
  - Cyrus Eslami
10
10
  - John Mileham
11
- autorequire:
11
+ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2020-12-09 00:00:00.000000000 Z
14
+ date: 2021-10-27 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
- name: aws-sdk-kinesis
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: json-schema
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: rails
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: '7.0'
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: '7.0'
57
+ version: '2'
78
58
  - !ruby/object:Gem::Dependency
79
- name: request_store
59
+ name: json-schema
80
60
  requirement: !ruby/object:Gem::Requirement
81
61
  requirements:
82
62
  - - ">="
@@ -90,41 +70,27 @@ dependencies:
90
70
  - !ruby/object:Gem::Version
91
71
  version: '0'
92
72
  - !ruby/object:Gem::Dependency
93
- name: appraisal
94
- 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
73
+ name: railties
108
74
  requirement: !ruby/object:Gem::Requirement
109
75
  requirements:
110
76
  - - ">="
111
77
  - !ruby/object:Gem::Version
112
- version: '0'
113
- type: :development
78
+ version: '5.2'
79
+ type: :runtime
114
80
  prerelease: false
115
81
  version_requirements: !ruby/object:Gem::Requirement
116
82
  requirements:
117
83
  - - ">="
118
84
  - !ruby/object:Gem::Version
119
- version: '0'
85
+ version: '5.2'
120
86
  - !ruby/object:Gem::Dependency
121
- name: pg
87
+ name: request_store
122
88
  requirement: !ruby/object:Gem::Requirement
123
89
  requirements:
124
90
  - - ">="
125
91
  - !ruby/object:Gem::Version
126
92
  version: '0'
127
- type: :development
93
+ type: :runtime
128
94
  prerelease: false
129
95
  version_requirements: !ruby/object:Gem::Requirement
130
96
  requirements:
@@ -132,19 +98,19 @@ dependencies:
132
98
  - !ruby/object:Gem::Version
133
99
  version: '0'
134
100
  - !ruby/object:Gem::Dependency
135
- name: pry-rails
101
+ name: appraisal
136
102
  requirement: !ruby/object:Gem::Requirement
137
103
  requirements:
138
- - - ">="
104
+ - - "~>"
139
105
  - !ruby/object:Gem::Version
140
- version: '0'
106
+ version: 2.2.0
141
107
  type: :development
142
108
  prerelease: false
143
109
  version_requirements: !ruby/object:Gem::Requirement
144
110
  requirements:
145
- - - ">="
111
+ - - "~>"
146
112
  - !ruby/object:Gem::Version
147
- version: '0'
113
+ version: 2.2.0
148
114
  - !ruby/object:Gem::Dependency
149
115
  name: rspec-rails
150
116
  requirement: !ruby/object:Gem::Requirement
@@ -216,19 +182,19 @@ dependencies:
216
182
  - !ruby/object:Gem::Version
217
183
  version: '0'
218
184
  - !ruby/object:Gem::Dependency
219
- name: sprockets
185
+ name: sqlite3
220
186
  requirement: !ruby/object:Gem::Requirement
221
187
  requirements:
222
- - - "<"
188
+ - - ">="
223
189
  - !ruby/object:Gem::Version
224
- version: '4.0'
190
+ version: '0'
225
191
  type: :development
226
192
  prerelease: false
227
193
  version_requirements: !ruby/object:Gem::Requirement
228
194
  requirements:
229
- - - "<"
195
+ - - ">="
230
196
  - !ruby/object:Gem::Version
231
- version: '4.0'
197
+ version: '0'
232
198
  - !ruby/object:Gem::Dependency
233
199
  name: timecop
234
200
  requirement: !ruby/object:Gem::Requirement
@@ -272,24 +238,23 @@ files:
272
238
  - README.md
273
239
  - Rakefile
274
240
  - app/controllers/concerns/journaled/actor.rb
241
+ - app/jobs/journaled/application_job.rb
242
+ - app/jobs/journaled/delivery_job.rb
275
243
  - app/models/concerns/journaled/changes.rb
276
244
  - app/models/journaled/actor_uri_provider.rb
277
245
  - app/models/journaled/change.rb
278
246
  - app/models/journaled/change_definition.rb
279
247
  - app/models/journaled/change_writer.rb
280
- - app/models/journaled/delivery.rb
281
248
  - app/models/journaled/event.rb
282
249
  - app/models/journaled/json_schema_model/validator.rb
283
250
  - app/models/journaled/not_truly_exceptional_error.rb
284
251
  - app/models/journaled/writer.rb
285
252
  - config/initializers/change_protection.rb
286
- - config/routes.rb
287
253
  - config/spring.rb
288
254
  - journaled_schemas/base_event.json
289
255
  - journaled_schemas/journaled/change.json
290
256
  - lib/journaled.rb
291
257
  - lib/journaled/engine.rb
292
- - lib/journaled/enqueue.rb
293
258
  - lib/journaled/relation_change_protection.rb
294
259
  - lib/journaled/rspec.rb
295
260
  - lib/journaled/version.rb
@@ -304,9 +269,7 @@ files:
304
269
  - spec/dummy/config/database.yml
305
270
  - spec/dummy/config/environment.rb
306
271
  - spec/dummy/config/environments/development.rb
307
- - spec/dummy/config/environments/production.rb
308
272
  - spec/dummy/config/environments/test.rb
309
- - spec/dummy/config/initializers/assets.rb
310
273
  - spec/dummy/config/initializers/backtrace_silencers.rb
311
274
  - spec/dummy/config/initializers/cookies_serializer.rb
312
275
  - spec/dummy/config/initializers/filter_parameter_logging.rb
@@ -317,31 +280,29 @@ files:
317
280
  - spec/dummy/config/locales/en.yml
318
281
  - spec/dummy/config/routes.rb
319
282
  - spec/dummy/config/secrets.yml
320
- - spec/dummy/db/migrate/20180606205114_create_delayed_jobs.rb
321
283
  - spec/dummy/db/schema.rb
322
284
  - spec/dummy/public/404.html
323
285
  - spec/dummy/public/422.html
324
286
  - spec/dummy/public/500.html
325
287
  - spec/dummy/public/favicon.ico
288
+ - spec/jobs/journaled/delivery_job_spec.rb
326
289
  - spec/lib/journaled_spec.rb
327
290
  - spec/models/concerns/journaled/actor_spec.rb
328
291
  - spec/models/concerns/journaled/changes_spec.rb
329
292
  - spec/models/database_change_protection_spec.rb
330
293
  - spec/models/journaled/actor_uri_provider_spec.rb
331
294
  - spec/models/journaled/change_writer_spec.rb
332
- - spec/models/journaled/delivery_spec.rb
333
295
  - spec/models/journaled/event_spec.rb
334
296
  - spec/models/journaled/json_schema_model/validator_spec.rb
335
297
  - spec/models/journaled/writer_spec.rb
336
298
  - spec/rails_helper.rb
337
299
  - spec/spec_helper.rb
338
- - spec/support/delayed_job_spec_helper.rb
339
300
  - spec/support/environment_spec_helper.rb
340
301
  homepage: http://github.com/Betterment/journaled
341
302
  licenses:
342
303
  - MIT
343
304
  metadata: {}
344
- post_install_message:
305
+ post_install_message:
345
306
  rdoc_options: []
346
307
  require_paths:
347
308
  - lib
@@ -357,7 +318,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
357
318
  version: '0'
358
319
  requirements: []
359
320
  rubygems_version: 3.0.1
360
- signing_key:
321
+ signing_key:
361
322
  specification_version: 4
362
323
  summary: Journaling for Betterment apps.
363
324
  test_files:
@@ -368,7 +329,6 @@ test_files:
368
329
  - spec/dummy/config/secrets.yml
369
330
  - spec/dummy/config/routes.rb
370
331
  - spec/dummy/config/locales/en.yml
371
- - spec/dummy/config/environments/production.rb
372
332
  - spec/dummy/config/environments/development.rb
373
333
  - spec/dummy/config/environments/test.rb
374
334
  - spec/dummy/config/environment.rb
@@ -380,7 +340,6 @@ test_files:
380
340
  - spec/dummy/config/initializers/filter_parameter_logging.rb
381
341
  - spec/dummy/config/initializers/session_store.rb
382
342
  - spec/dummy/config/initializers/wrap_parameters.rb
383
- - spec/dummy/config/initializers/assets.rb
384
343
  - spec/dummy/config/initializers/cookies_serializer.rb
385
344
  - spec/dummy/config/initializers/inflections.rb
386
345
  - spec/dummy/config.ru
@@ -390,18 +349,16 @@ test_files:
390
349
  - spec/dummy/public/500.html
391
350
  - spec/dummy/public/404.html
392
351
  - spec/dummy/db/schema.rb
393
- - spec/dummy/db/migrate/20180606205114_create_delayed_jobs.rb
394
352
  - spec/dummy/README.rdoc
395
353
  - spec/models/journaled/json_schema_model/validator_spec.rb
396
354
  - spec/models/journaled/actor_uri_provider_spec.rb
397
- - spec/models/journaled/delivery_spec.rb
398
355
  - spec/models/journaled/event_spec.rb
399
356
  - spec/models/journaled/change_writer_spec.rb
400
357
  - spec/models/journaled/writer_spec.rb
401
358
  - spec/models/database_change_protection_spec.rb
402
359
  - spec/models/concerns/journaled/changes_spec.rb
403
360
  - spec/models/concerns/journaled/actor_spec.rb
404
- - spec/support/delayed_job_spec_helper.rb
405
361
  - spec/support/environment_spec_helper.rb
406
362
  - spec/lib/journaled_spec.rb
363
+ - spec/jobs/journaled/delivery_job_spec.rb
407
364
  - 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
@@ -1,2 +0,0 @@
1
- Rails.application.routes.draw do
2
- end
@@ -1,13 +0,0 @@
1
- module Journaled
2
- class << self
3
- def enqueue!(*args)
4
- delayed_job_enqueue(*args)
5
- end
6
-
7
- private
8
-
9
- def delayed_job_enqueue(*args, **opts)
10
- Delayed::Job.enqueue(*args, **opts.reverse_merge(priority: Journaled.job_priority))
11
- end
12
- end
13
- end
@@ -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