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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a57088ffa5913d3e80f1d6d978bfe3f0a4ff090bd78f20f3fcbed1c32b84bdbc
4
- data.tar.gz: 75c470723ae03dd2695300c0a8a2aaf0d05202fac8fdb5157efd248214a7eb6d
3
+ metadata.gz: 4cefb08a9d7ab294f9084f150f89cda921982fffdb0ec7b0a5bc702ede1d23b8
4
+ data.tar.gz: 21a484a10c58a3f551e95af064b5f718b9496ba7840ac6c1ac84142b859942db
5
5
  SHA512:
6
- metadata.gz: ffcbd7201f572423fa304c440d18b2993e7a97050b5ac7b1be68143da64a8c7caaa430aa3ef64d8a99940380b67361e50ef55cb9ce01cecb9dd017f977e08934
7
- data.tar.gz: a6c33d7c56b1fbd9558d219617a12dbfa0b704dac7b9ca3171cd2387477a3b00a6fe6dac592ed6a8cc4a4f6de2cbb806ff49d670134131a6e2eddfe5d64be0d7
6
+ metadata.gz: 59d07f836a83dde4e4a24a8a5f326ff5cbc7a751d92fb6df66ee22b5b31ac1aa63326675167d45bcd8c572a0e4afeb831774a468eb45097a71c6940a79ce2681
7
+ data.tar.gz: 807c603b1085819ed003ed8053f81b6fec59ba895c920bc24ac178b0d3188fac554a2ed9b2dcb80ceceb2a26fc5effe6af5d52819f66d041ad7959cfc30957da
data/README.md CHANGED
@@ -1,16 +1,16 @@
1
1
  # Journaled
2
2
 
3
- A Rails engine to durably deliver schematized events to Amazon Kinesis via DelayedJob.
3
+ A Rails engine to durably deliver schematized events to Amazon Kinesis via ActiveJob.
4
4
 
5
5
  More specifically, `journaled` is composed of three opinionated pieces:
6
6
  schema definition/validation via JSON Schema, transactional enqueueing
7
- via Delayed::Job (specifically `delayed_job_active_record`), and event
7
+ via ActiveJob (specifically, via a DB-backed queue adapter), and event
8
8
  transmission via Amazon Kinesis. Our current use-cases include
9
9
  transmitting audit events for durable storage in S3 and/or analytical
10
10
  querying in Amazon Redshift.
11
11
 
12
12
  Journaled provides an at-least-once event delivery guarantee assuming
13
- Delayed::Job is configured not to delete jobs on failure.
13
+ ActiveJob's queue adapter is not configured to delete jobs on failure.
14
14
 
15
15
  Note: Do not use the journaled gem to build an event sourcing solution
16
16
  as it does not guarantee total ordering of events. It's possible we'll
@@ -20,9 +20,20 @@ durable, eventually consistent record that discrete events happened.
20
20
 
21
21
  ## Installation
22
22
 
23
- 1. [Install `delayed_job_active_record`](https://github.com/collectiveidea/delayed_job_active_record#installation)
24
- if you haven't already.
23
+ 1. If you haven't already,
24
+ [configure ActiveJob](https://guides.rubyonrails.org/active_job_basics.html)
25
+ to use one of the following queue adapters:
25
26
 
27
+ - `:delayed_job` (via `delayed_job_active_record`)
28
+ - `:que`
29
+ - `:good_job`
30
+ - `:delayed`
31
+
32
+ Ensure that your queue adapter is not configured to delete jobs on failure.
33
+
34
+ **If you launch your application in production mode and the gem detects that
35
+ `ActiveJob::Base.queue_adapter` is not in the above list, it will raise an exception
36
+ and prevent your application from performing unsafe journaling.**
26
37
 
27
38
  2. To integrate Journaled into your application, simply include the gem in your
28
39
  app's Gemfile.
@@ -40,20 +51,21 @@ app's Gemfile.
40
51
  require 'journaled/rspec'
41
52
  ```
42
53
 
43
- 3. You will also need to define the following environment variables to allow Journaled to publish events to your AWS Kinesis event stream:
54
+ 3. You will need to set the following config in an initializer to allow Journaled to publish events to your AWS Kinesis event stream:
44
55
 
45
- * `JOURNALED_STREAM_NAME`
56
+ ```ruby
57
+ Journaled.default_stream_name = "my_app_#{Rails.env}_events"
58
+ ```
46
59
 
47
- Special case: if your `Journaled::Event` objects override the
48
- `#journaled_app_name` method to a non-nil value e.g. `my_app`, you will
49
- instead need to provide a corresponding
50
- `[upcased_app_name]_JOURNALED_STREAM_NAME` variable for each distinct
51
- value, e.g. `MY_APP_JOURNALED_STREAM_NAME`. You can provide a default value
52
- for all `Journaled::Event`s in an initializer like this:
60
+ You may also define a `#journaled_stream_name` method on `Journaled::Event` instances:
53
61
 
54
62
  ```ruby
55
- Journaled.default_app_name = 'my_app'
56
- ```
63
+ def journaled_stream_name
64
+ "my_app_#{Rails.env}_alternate_events"
65
+ end
66
+ ````
67
+
68
+ 3. You may also need to define environment variables to allow Journaled to publish events to your AWS Kinesis event stream:
57
69
 
58
70
  You may optionally define the following ENV vars to specify AWS
59
71
  credentials outside of the locations that the AWS SDK normally looks:
@@ -71,6 +83,41 @@ app's Gemfile.
71
83
 
72
84
  The AWS principal whose credentials are in the environment will need to be allowed to assume this role.
73
85
 
86
+ ### Upgrading from 3.1.0
87
+
88
+ Versions of Journaled prior to 4.0 relied directly on environment variables for stream names, but now stream names are configured directly.
89
+ When upgrading, you can use the following configuration to maintain the previous behavior:
90
+
91
+ ```ruby
92
+ Journaled.default_stream_name = ENV['JOURNALED_STREAM_NAME']
93
+ ```
94
+
95
+ If you previously specified a `Journaled.default_app_name`, you would have required a more precise environment variable name (substitute `{{upcase_app_name}}`):
96
+
97
+ ```ruby
98
+ Journaled.default_stream_name = ENV["{{upcase_app_name}}_JOURNALED_STREAM_NAME"]
99
+ ```
100
+
101
+ And if you had defined any `journaled_app_name` methods on `Journaled::Event` instances, you can replace them with the following:
102
+
103
+ ```ruby
104
+ def journaled_stream_name
105
+ ENV['{{upcase_app_name}}_JOURNALED_STREAM_NAME']
106
+ end
107
+ ```
108
+
109
+ When upgrading from 3.1 or below, `Journaled::DeliveryJob` will handle any jobs that remain in the queue by accepting an `app_name` argument. **This behavior will be removed in version 5.0**, so it is recommended to upgrade one major version at a time.
110
+
111
+ ### Upgrading from 2.5.0
112
+
113
+ Versions of Journaled prior to 3.0 relied direclty on `delayed_job` and a "performable" class called `Journaled::Delivery`.
114
+ In 3.0, this was superceded by an ActiveJob class called `Journaled::DeliveryJob`, but the `Journaled::Delivery` class was not removed until 4.0.
115
+
116
+ Therefore, when upgrading from 2.5.0 or below, it is recommended to first upgrade to 3.1.0 (to allow any `Journaled::Delivery` jobs to finish working off) before upgrading to 4.0+.
117
+
118
+ The upgrade to 3.1.0 will require a working ActiveJob config. ActiveJob can be configured globally by setting `ActiveJob::Base.queue_adapter`, or just for Journaled jobs by setting `Journaled::DeliveryJob.queue_adapter`.
119
+ The `:delayed_job` queue adapter will allow you to continue relying on `delayed_job`. You may also consider switching your app(s) to [`delayed`](https://github.com/Betterment/delayed) and using the `:delayed` queue adapter.
120
+
74
121
  ## Usage
75
122
 
76
123
  ### Configuration
@@ -85,14 +132,16 @@ Journaling provides a number of different configuation options that can be set i
85
132
 
86
133
  #### `Journaled.job_priority` (default: 20)
87
134
 
88
- This can be used to configure what `priority` the Delayed Jobs are enqueued with. This will be applied to all the Journaled::Devivery jobs that are created by this application.
135
+ This can be used to configure what `priority` the ActiveJobs are enqueued with. This will be applied to all the `Journaled::DeliveryJob`s that are created by this application.
89
136
  Ex: `Journaled.job_priority = 14`
90
137
 
138
+ _Note that job priority is only supported on Rails 6.0+. Prior Rails versions will ignore this parameter and enqueue jobs with the underlying ActiveJob adapter's default priority._
139
+
91
140
  #### `Journaled.http_idle_timeout` (default: 1 second)
92
141
 
93
142
  The number of seconds a persistent connection is allowed to sit idle before it should no longer be used.
94
143
 
95
- #### `Journaled.http_open_timeout` (default: 15 seconds)
144
+ #### `Journaled.http_open_timeout` (default: 2 seconds)
96
145
 
97
146
  The number of seconds before the :http_handler should timeout while trying to open a new HTTP session.
98
147
 
@@ -100,9 +149,9 @@ Journaling provides a number of different configuation options that can be set i
100
149
 
101
150
  The number of seconds before the :http_handler should timeout while waiting for a HTTP response.
102
151
 
103
- #### DJ `enqueue` options
152
+ #### ActiveJob `set` options
104
153
 
105
- Both model-level directives accept additional options to be passed into DelayedJob's `enqueue` method:
154
+ Both model-level directives accept additional options to be passed into ActiveJob's `set` method:
106
155
 
107
156
  ```ruby
108
157
  # For change journaling:
data/Rakefile CHANGED
@@ -28,7 +28,13 @@ if %w(development test).include? Rails.env
28
28
  RuboCop::RakeTask.new
29
29
 
30
30
  task(:default).clear
31
- task default: %i(rubocop spec)
31
+ if ENV['APPRAISAL_INITIALIZED'] || ENV['CI']
32
+ task default: %i(rubocop spec)
33
+ else
34
+ require 'appraisal'
35
+ Appraisal::Task.new
36
+ task default: :appraisal
37
+ end
32
38
 
33
39
  task 'db:test:prepare' => 'db:setup'
34
40
  end
@@ -0,0 +1,4 @@
1
+ module Journaled
2
+ class ApplicationJob < Journaled.job_base_class_name.constantize
3
+ end
4
+ end
@@ -0,0 +1,105 @@
1
+ module Journaled
2
+ class DeliveryJob < ApplicationJob
3
+ DEFAULT_REGION = 'us-east-1'.freeze
4
+
5
+ rescue_from(Aws::Kinesis::Errors::InternalFailure, Aws::Kinesis::Errors::ServiceUnavailable, Aws::Kinesis::Errors::Http503Error) do |e|
6
+ Rails.logger.error "Kinesis Error - Server Error occurred - #{e.class}"
7
+ raise KinesisTemporaryFailure
8
+ end
9
+
10
+ rescue_from(Seahorse::Client::NetworkingError) do |e|
11
+ Rails.logger.error "Kinesis Error - Networking Error occurred - #{e.class}"
12
+ raise KinesisTemporaryFailure
13
+ end
14
+
15
+ UNSPECIFIED = Object.new
16
+ private_constant :UNSPECIFIED
17
+
18
+ def perform(serialized_event:, partition_key:, stream_name: UNSPECIFIED, app_name: UNSPECIFIED)
19
+ @serialized_event = serialized_event
20
+ @partition_key = partition_key
21
+ if app_name != UNSPECIFIED
22
+ @stream_name = self.class.legacy_computed_stream_name(app_name: app_name)
23
+ elsif stream_name != UNSPECIFIED && !stream_name.nil?
24
+ @stream_name = stream_name
25
+ else
26
+ raise(ArgumentError, 'missing keyword: stream_name')
27
+ end
28
+
29
+ journal!
30
+ end
31
+
32
+ def self.legacy_computed_stream_name(app_name:)
33
+ env_var_name = [app_name&.upcase, 'JOURNALED_STREAM_NAME'].compact.join('_')
34
+ ENV.fetch(env_var_name)
35
+ end
36
+
37
+ def kinesis_client_config
38
+ {
39
+ region: ENV.fetch('AWS_DEFAULT_REGION', DEFAULT_REGION),
40
+ retry_limit: 0,
41
+ http_idle_timeout: Journaled.http_idle_timeout,
42
+ http_open_timeout: Journaled.http_open_timeout,
43
+ http_read_timeout: Journaled.http_read_timeout,
44
+ }.merge(credentials)
45
+ end
46
+
47
+ private
48
+
49
+ attr_reader :serialized_event, :partition_key, :stream_name
50
+
51
+ def journal!
52
+ kinesis_client.put_record record if Journaled.enabled?
53
+ end
54
+
55
+ def record
56
+ {
57
+ stream_name: stream_name,
58
+ data: serialized_event,
59
+ partition_key: partition_key,
60
+ }
61
+ end
62
+
63
+ def kinesis_client
64
+ Aws::Kinesis::Client.new(kinesis_client_config)
65
+ end
66
+
67
+ def credentials
68
+ if ENV.key?('JOURNALED_IAM_ROLE_ARN')
69
+ {
70
+ credentials: iam_assume_role_credentials,
71
+ }
72
+ else
73
+ legacy_credentials_hash_if_present
74
+ end
75
+ end
76
+
77
+ def legacy_credentials_hash_if_present
78
+ if ENV.key?('RUBY_AWS_ACCESS_KEY_ID')
79
+ {
80
+ access_key_id: ENV.fetch('RUBY_AWS_ACCESS_KEY_ID'),
81
+ secret_access_key: ENV.fetch('RUBY_AWS_SECRET_ACCESS_KEY'),
82
+ }
83
+ else
84
+ {}
85
+ end
86
+ end
87
+
88
+ def sts_client
89
+ Aws::STS::Client.new({
90
+ region: ENV.fetch('AWS_DEFAULT_REGION', DEFAULT_REGION),
91
+ }.merge(legacy_credentials_hash_if_present))
92
+ end
93
+
94
+ def iam_assume_role_credentials
95
+ @iam_assume_role_credentials ||= Aws::AssumeRoleCredentials.new(
96
+ client: sts_client,
97
+ role_arn: ENV.fetch('JOURNALED_IAM_ROLE_ARN'),
98
+ role_session_name: "JournaledAssumeRoleAccess",
99
+ )
100
+ end
101
+
102
+ class KinesisTemporaryFailure < NotTrulyExceptionalError
103
+ end
104
+ end
105
+ end
@@ -6,7 +6,7 @@ class Journaled::Change
6
6
  :database_operation,
7
7
  :logical_operation,
8
8
  :changes,
9
- :journaled_app_name,
9
+ :journaled_stream_name,
10
10
  :journaled_enqueue_opts,
11
11
  :actor
12
12
 
@@ -22,7 +22,7 @@ class Journaled::Change
22
22
  database_operation:,
23
23
  logical_operation:,
24
24
  changes:,
25
- journaled_app_name:,
25
+ journaled_stream_name:,
26
26
  journaled_enqueue_opts:,
27
27
  actor:)
28
28
  @table_name = table_name
@@ -30,7 +30,7 @@ class Journaled::Change
30
30
  @database_operation = database_operation
31
31
  @logical_operation = logical_operation
32
32
  @changes = changes
33
- @journaled_app_name = journaled_app_name
33
+ @journaled_stream_name = journaled_stream_name
34
34
  @journaled_enqueue_opts = journaled_enqueue_opts
35
35
  @actor = actor
36
36
  end
@@ -27,7 +27,7 @@ class Journaled::ChangeWriter
27
27
  database_operation: database_operation,
28
28
  logical_operation: logical_operation,
29
29
  changes: JSON.dump(changes),
30
- journaled_app_name: journaled_app_name,
30
+ journaled_stream_name: journaled_stream_name,
31
31
  journaled_enqueue_opts: model.journaled_enqueue_opts,
32
32
  actor: actor_uri,
33
33
  )
@@ -57,11 +57,11 @@ class Journaled::ChangeWriter
57
57
  end
58
58
  end
59
59
 
60
- def journaled_app_name
61
- if model.class.respond_to?(:journaled_app_name)
62
- model.class.journaled_app_name
60
+ def journaled_stream_name
61
+ if model.class.respond_to?(:journaled_stream_name)
62
+ model.class.journaled_stream_name
63
63
  else
64
- Journaled.default_app_name
64
+ Journaled.default_stream_name
65
65
  end
66
66
  end
67
67
  end
@@ -35,8 +35,8 @@ module Journaled::Event
35
35
  event_type
36
36
  end
37
37
 
38
- def journaled_app_name
39
- Journaled.default_app_name
38
+ def journaled_stream_name
39
+ Journaled.default_stream_name
40
40
  end
41
41
 
42
42
  private
@@ -3,7 +3,7 @@ class Journaled::Writer
3
3
  journaled_schema_name
4
4
  journaled_partition_key
5
5
  journaled_attributes
6
- journaled_app_name
6
+ journaled_stream_name
7
7
  journaled_enqueue_opts
8
8
  ).freeze
9
9
 
@@ -27,7 +27,9 @@ class Journaled::Writer
27
27
  def journal!
28
28
  base_event_json_schema_validator.validate! serialized_event
29
29
  json_schema_validator.validate! serialized_event
30
- Journaled.enqueue!(journaled_delivery, journaled_enqueue_opts)
30
+ Journaled::DeliveryJob
31
+ .set(journaled_enqueue_opts.reverse_merge(priority: Journaled.job_priority))
32
+ .perform_later(delivery_perform_args)
31
33
  end
32
34
 
33
35
  private
@@ -35,12 +37,12 @@ class Journaled::Writer
35
37
  attr_reader :journaled_event
36
38
  delegate(*EVENT_METHOD_NAMES, to: :journaled_event)
37
39
 
38
- def journaled_delivery
39
- @journaled_delivery ||= Journaled::Delivery.new(
40
+ def delivery_perform_args
41
+ {
40
42
  serialized_event: serialized_event,
41
43
  partition_key: journaled_partition_key,
42
- app_name: journaled_app_name,
43
- )
44
+ stream_name: journaled_stream_name,
45
+ }
44
46
  end
45
47
 
46
48
  def serialized_event
@@ -1,4 +1,9 @@
1
1
  module Journaled
2
2
  class Engine < ::Rails::Engine
3
+ config.after_initialize do
4
+ ActiveSupport.on_load(:active_job) do
5
+ Journaled.detect_queue_adapter! unless Journaled.development_or_test?
6
+ end
7
+ end
3
8
  end
4
9
  end
@@ -1,5 +1,5 @@
1
1
  module Journaled::RelationChangeProtection
2
- def update_all(updates, force: false) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/PerceivedComplexity
2
+ def update_all(updates, force: false) # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
3
3
  unless force || !@klass.respond_to?(:journaled_attribute_names) || @klass.journaled_attribute_names.empty?
4
4
  conflicting_journaled_attribute_names = if updates.is_a?(Hash)
5
5
  @klass.journaled_attribute_names & updates.keys.map(&:to_sym)
@@ -1,3 +1,3 @@
1
1
  module Journaled
2
- VERSION = "2.4.0".freeze
2
+ VERSION = "4.0.0".freeze
3
3
  end
data/lib/journaled.rb CHANGED
@@ -1,17 +1,19 @@
1
1
  require "aws-sdk-kinesis"
2
- require "delayed_job"
2
+ require "active_job"
3
3
  require "json-schema"
4
4
  require "request_store"
5
5
 
6
6
  require "journaled/engine"
7
- require 'journaled/enqueue'
8
7
 
9
8
  module Journaled
10
- mattr_accessor :default_app_name
9
+ SUPPORTED_QUEUE_ADAPTERS = %w(delayed delayed_job good_job que).freeze
10
+
11
+ mattr_accessor :default_stream_name
11
12
  mattr_accessor(:job_priority) { 20 }
12
13
  mattr_accessor(:http_idle_timeout) { 5 }
13
- mattr_accessor(:http_open_timeout) { 15 }
14
+ mattr_accessor(:http_open_timeout) { 2 }
14
15
  mattr_accessor(:http_read_timeout) { 60 }
16
+ mattr_accessor(:job_base_class_name) { 'ActiveJob::Base' }
15
17
 
16
18
  def development_or_test?
17
19
  %w(development test).include?(Rails.env)
@@ -33,5 +35,21 @@ module Journaled
33
35
  Journaled::ActorUriProvider.instance.actor_uri
34
36
  end
35
37
 
36
- module_function :development_or_test?, :enabled?, :schema_providers, :commit_hash, :actor_uri
38
+ def detect_queue_adapter!
39
+ adapter = job_base_class_name.constantize.queue_adapter_name
40
+ unless SUPPORTED_QUEUE_ADAPTERS.include?(adapter)
41
+ raise <<~MSG
42
+ Journaled has detected an unsupported ActiveJob queue adapter: `:#{adapter}`
43
+
44
+ Journaled jobs must be enqueued transactionally to your primary database.
45
+
46
+ Please install the appropriate gems and set `queue_adapter` to one of the following:
47
+ #{SUPPORTED_QUEUE_ADAPTERS.map { |a| "- `:#{a}`" }.join("\n")}
48
+
49
+ Read more at https://github.com/Betterment/journaled
50
+ MSG
51
+ end
52
+ end
53
+
54
+ module_function :development_or_test?, :enabled?, :schema_providers, :commit_hash, :actor_uri, :detect_queue_adapter!
37
55
  end
@@ -1,10 +1,9 @@
1
1
  require File.expand_path('boot', __dir__)
2
2
 
3
3
  require "active_record/railtie"
4
+ require "active_job/railtie"
4
5
  require "active_model/railtie"
5
6
  require "action_controller/railtie"
6
- require "action_mailer/railtie"
7
- require "sprockets/railtie"
8
7
 
9
8
  Bundler.require(*Rails.groups)
10
9
  require "journaled"
@@ -1,21 +1,6 @@
1
- default: &default
2
- pool: 5
3
- encoding: unicode
4
-
5
- postgresql:
6
- default: &postgres_default
7
- adapter: postgresql
8
- url: <%= ENV['DATABASE_URL'] %>
9
- test: &postgres_test
10
- <<: *postgres_default
11
- url: <%= ENV['DATABASE_URL'] || "postgresql://localhost:#{ENV.fetch('PGPORT', 5432)}/journaled_test" %>
12
- database: journaled_test
13
- development: &postgres_development
14
- <<: *postgres_default
15
- url: <%= ENV['DATABASE_URL'] || "postgresql://localhost:#{ENV.fetch('PGPORT', 5432)}/journaled_development" %>
16
- database: journaled_development
17
-
18
1
  development:
19
- <<: *postgres_development
2
+ adapter: sqlite3
3
+ database: ":memory:"
20
4
  test:
21
- <<: *postgres_test
5
+ adapter: sqlite3
6
+ database: ":memory:"
@@ -13,25 +13,12 @@ Rails.application.configure do
13
13
  config.consider_all_requests_local = true
14
14
  config.action_controller.perform_caching = false
15
15
 
16
- # Don't care if the mailer can't send.
17
- config.action_mailer.raise_delivery_errors = false
18
-
19
16
  # Print deprecation notices to the Rails logger.
20
17
  config.active_support.deprecation = :log
21
18
 
22
19
  # Raise an error on page load if there are pending migrations.
23
20
  config.active_record.migration_error = :page_load
24
21
 
25
- # Debug mode disables concatenation and preprocessing of assets.
26
- # This option may cause significant delays in view rendering with a large
27
- # number of complex assets.
28
- config.assets.debug = true
29
-
30
- # Adds additional error checking when serving assets at runtime.
31
- # Checks for improperly declared sprockets dependencies.
32
- # Raises helpful error messages.
33
- config.assets.raise_runtime_errors = true
34
-
35
22
  # Raises error for missing translations
36
23
  # config.action_view.raise_on_missing_translations = true
37
24
  end
@@ -26,14 +26,12 @@ Rails.application.configure do
26
26
  # Disable request forgery protection in test environment.
27
27
  config.action_controller.allow_forgery_protection = false
28
28
 
29
- # Tell Action Mailer not to deliver emails to the real world.
30
- # The :test delivery method accumulates sent emails in the
31
- # ActionMailer::Base.deliveries array.
32
- config.action_mailer.delivery_method = :test
33
-
34
29
  # Print deprecation notices to the stderr.
35
30
  config.active_support.deprecation = :stderr
36
31
 
37
32
  # Raises error for missing translations
38
33
  # config.action_view.raise_on_missing_translations = true
34
+
35
+ # Use ActiveJob test adapter
36
+ config.active_job.queue_adapter = :test
39
37
  end
@@ -11,21 +11,8 @@
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
13
  ActiveRecord::Schema.define(version: 20180606205114) do
14
- # These are extensions that must be enabled in order to support this database
15
- enable_extension "plpgsql"
16
-
17
- create_table "delayed_jobs", force: :cascade do |t|
18
- t.integer "priority", default: 0, null: false
19
- t.integer "attempts", default: 0, null: false
20
- t.text "handler", null: false
21
- t.text "last_error"
22
- t.datetime "run_at"
23
- t.datetime "locked_at"
24
- t.datetime "failed_at"
25
- t.string "locked_by"
26
- t.string "queue"
27
- t.datetime "created_at"
28
- t.datetime "updated_at"
29
- t.index ["priority", "run_at"], name: "delayed_jobs_priority"
14
+ create_table "widgets", force: :cascade do |t|
15
+ t.string "name"
16
+ t.string "other_column"
30
17
  end
31
18
  end