deimos-temp-fork 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +83 -0
  3. data/.gitignore +41 -0
  4. data/.gitmodules +0 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +333 -0
  7. data/.ruby-gemset +1 -0
  8. data/.ruby-version +1 -0
  9. data/CHANGELOG.md +349 -0
  10. data/CODE_OF_CONDUCT.md +77 -0
  11. data/Dockerfile +23 -0
  12. data/Gemfile +6 -0
  13. data/Gemfile.lock +286 -0
  14. data/Guardfile +22 -0
  15. data/LICENSE.md +195 -0
  16. data/README.md +1099 -0
  17. data/Rakefile +13 -0
  18. data/bin/deimos +4 -0
  19. data/deimos-ruby.gemspec +44 -0
  20. data/docker-compose.yml +71 -0
  21. data/docs/ARCHITECTURE.md +140 -0
  22. data/docs/CONFIGURATION.md +236 -0
  23. data/docs/DATABASE_BACKEND.md +147 -0
  24. data/docs/INTEGRATION_TESTS.md +52 -0
  25. data/docs/PULL_REQUEST_TEMPLATE.md +35 -0
  26. data/docs/UPGRADING.md +128 -0
  27. data/lib/deimos-temp-fork.rb +95 -0
  28. data/lib/deimos/active_record_consume/batch_consumption.rb +164 -0
  29. data/lib/deimos/active_record_consume/batch_slicer.rb +27 -0
  30. data/lib/deimos/active_record_consume/message_consumption.rb +79 -0
  31. data/lib/deimos/active_record_consume/schema_model_converter.rb +52 -0
  32. data/lib/deimos/active_record_consumer.rb +67 -0
  33. data/lib/deimos/active_record_producer.rb +87 -0
  34. data/lib/deimos/backends/base.rb +32 -0
  35. data/lib/deimos/backends/db.rb +41 -0
  36. data/lib/deimos/backends/kafka.rb +33 -0
  37. data/lib/deimos/backends/kafka_async.rb +33 -0
  38. data/lib/deimos/backends/test.rb +20 -0
  39. data/lib/deimos/batch_consumer.rb +7 -0
  40. data/lib/deimos/config/configuration.rb +381 -0
  41. data/lib/deimos/config/phobos_config.rb +137 -0
  42. data/lib/deimos/consume/batch_consumption.rb +150 -0
  43. data/lib/deimos/consume/message_consumption.rb +94 -0
  44. data/lib/deimos/consumer.rb +104 -0
  45. data/lib/deimos/instrumentation.rb +76 -0
  46. data/lib/deimos/kafka_message.rb +60 -0
  47. data/lib/deimos/kafka_source.rb +128 -0
  48. data/lib/deimos/kafka_topic_info.rb +102 -0
  49. data/lib/deimos/message.rb +79 -0
  50. data/lib/deimos/metrics/datadog.rb +47 -0
  51. data/lib/deimos/metrics/mock.rb +39 -0
  52. data/lib/deimos/metrics/provider.rb +36 -0
  53. data/lib/deimos/monkey_patches/phobos_cli.rb +35 -0
  54. data/lib/deimos/monkey_patches/phobos_producer.rb +51 -0
  55. data/lib/deimos/poll_info.rb +9 -0
  56. data/lib/deimos/producer.rb +224 -0
  57. data/lib/deimos/railtie.rb +8 -0
  58. data/lib/deimos/schema_backends/avro_base.rb +140 -0
  59. data/lib/deimos/schema_backends/avro_local.rb +30 -0
  60. data/lib/deimos/schema_backends/avro_schema_coercer.rb +119 -0
  61. data/lib/deimos/schema_backends/avro_schema_registry.rb +34 -0
  62. data/lib/deimos/schema_backends/avro_validation.rb +21 -0
  63. data/lib/deimos/schema_backends/base.rb +150 -0
  64. data/lib/deimos/schema_backends/mock.rb +42 -0
  65. data/lib/deimos/shared_config.rb +63 -0
  66. data/lib/deimos/test_helpers.rb +360 -0
  67. data/lib/deimos/tracing/datadog.rb +35 -0
  68. data/lib/deimos/tracing/mock.rb +40 -0
  69. data/lib/deimos/tracing/provider.rb +29 -0
  70. data/lib/deimos/utils/db_poller.rb +150 -0
  71. data/lib/deimos/utils/db_producer.rb +243 -0
  72. data/lib/deimos/utils/deadlock_retry.rb +68 -0
  73. data/lib/deimos/utils/inline_consumer.rb +150 -0
  74. data/lib/deimos/utils/lag_reporter.rb +175 -0
  75. data/lib/deimos/utils/schema_controller_mixin.rb +115 -0
  76. data/lib/deimos/version.rb +5 -0
  77. data/lib/generators/deimos/active_record/templates/migration.rb.tt +28 -0
  78. data/lib/generators/deimos/active_record/templates/model.rb.tt +5 -0
  79. data/lib/generators/deimos/active_record_generator.rb +79 -0
  80. data/lib/generators/deimos/db_backend/templates/migration +25 -0
  81. data/lib/generators/deimos/db_backend/templates/rails3_migration +31 -0
  82. data/lib/generators/deimos/db_backend_generator.rb +48 -0
  83. data/lib/generators/deimos/db_poller/templates/migration +11 -0
  84. data/lib/generators/deimos/db_poller/templates/rails3_migration +16 -0
  85. data/lib/generators/deimos/db_poller_generator.rb +48 -0
  86. data/lib/tasks/deimos.rake +34 -0
  87. data/spec/active_record_batch_consumer_spec.rb +481 -0
  88. data/spec/active_record_consume/batch_slicer_spec.rb +42 -0
  89. data/spec/active_record_consume/schema_model_converter_spec.rb +105 -0
  90. data/spec/active_record_consumer_spec.rb +154 -0
  91. data/spec/active_record_producer_spec.rb +85 -0
  92. data/spec/backends/base_spec.rb +10 -0
  93. data/spec/backends/db_spec.rb +54 -0
  94. data/spec/backends/kafka_async_spec.rb +11 -0
  95. data/spec/backends/kafka_spec.rb +11 -0
  96. data/spec/batch_consumer_spec.rb +256 -0
  97. data/spec/config/configuration_spec.rb +248 -0
  98. data/spec/consumer_spec.rb +209 -0
  99. data/spec/deimos_spec.rb +169 -0
  100. data/spec/generators/active_record_generator_spec.rb +56 -0
  101. data/spec/handlers/my_batch_consumer.rb +10 -0
  102. data/spec/handlers/my_consumer.rb +10 -0
  103. data/spec/kafka_listener_spec.rb +55 -0
  104. data/spec/kafka_source_spec.rb +381 -0
  105. data/spec/kafka_topic_info_spec.rb +111 -0
  106. data/spec/message_spec.rb +19 -0
  107. data/spec/phobos.bad_db.yml +73 -0
  108. data/spec/phobos.yml +77 -0
  109. data/spec/producer_spec.rb +498 -0
  110. data/spec/rake_spec.rb +19 -0
  111. data/spec/schema_backends/avro_base_shared.rb +199 -0
  112. data/spec/schema_backends/avro_local_spec.rb +32 -0
  113. data/spec/schema_backends/avro_schema_registry_spec.rb +32 -0
  114. data/spec/schema_backends/avro_validation_spec.rb +24 -0
  115. data/spec/schema_backends/base_spec.rb +33 -0
  116. data/spec/schemas/com/my-namespace/Generated.avsc +71 -0
  117. data/spec/schemas/com/my-namespace/MyNestedSchema.avsc +62 -0
  118. data/spec/schemas/com/my-namespace/MySchema-key.avsc +13 -0
  119. data/spec/schemas/com/my-namespace/MySchema.avsc +18 -0
  120. data/spec/schemas/com/my-namespace/MySchemaCompound-key.avsc +18 -0
  121. data/spec/schemas/com/my-namespace/MySchemaWithBooleans.avsc +18 -0
  122. data/spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc +33 -0
  123. data/spec/schemas/com/my-namespace/MySchemaWithId.avsc +28 -0
  124. data/spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc +32 -0
  125. data/spec/schemas/com/my-namespace/Wibble.avsc +43 -0
  126. data/spec/schemas/com/my-namespace/Widget.avsc +27 -0
  127. data/spec/schemas/com/my-namespace/WidgetTheSecond.avsc +27 -0
  128. data/spec/schemas/com/my-namespace/request/CreateTopic.avsc +11 -0
  129. data/spec/schemas/com/my-namespace/request/Index.avsc +11 -0
  130. data/spec/schemas/com/my-namespace/request/UpdateRequest.avsc +11 -0
  131. data/spec/schemas/com/my-namespace/response/CreateTopic.avsc +11 -0
  132. data/spec/schemas/com/my-namespace/response/Index.avsc +11 -0
  133. data/spec/schemas/com/my-namespace/response/UpdateResponse.avsc +11 -0
  134. data/spec/spec_helper.rb +267 -0
  135. data/spec/utils/db_poller_spec.rb +320 -0
  136. data/spec/utils/db_producer_spec.rb +514 -0
  137. data/spec/utils/deadlock_retry_spec.rb +74 -0
  138. data/spec/utils/inline_consumer_spec.rb +31 -0
  139. data/spec/utils/lag_reporter_spec.rb +76 -0
  140. data/spec/utils/platform_schema_validation_spec.rb +0 -0
  141. data/spec/utils/schema_controller_mixin_spec.rb +84 -0
  142. data/support/deimos-solo.png +0 -0
  143. data/support/deimos-with-name-next.png +0 -0
  144. data/support/deimos-with-name.png +0 -0
  145. data/support/flipp-logo.png +0 -0
  146. metadata +551 -0
@@ -0,0 +1,13 @@
1
+ {
2
+ "namespace": "com.my-namespace",
3
+ "name": "MySchema-key",
4
+ "type": "record",
5
+ "doc": "Test schema",
6
+ "fields": [
7
+ {
8
+ "name": "test_id",
9
+ "type": "string",
10
+ "doc": "test string"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "namespace": "com.my-namespace",
3
+ "name": "MySchema",
4
+ "type": "record",
5
+ "doc": "Test schema",
6
+ "fields": [
7
+ {
8
+ "name": "test_id",
9
+ "type": "string",
10
+ "doc": "test string"
11
+ },
12
+ {
13
+ "name": "some_int",
14
+ "type": "int",
15
+ "doc": "test int"
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "namespace": "com.my-namespace",
3
+ "name": "MySchemaCompound-key",
4
+ "type": "record",
5
+ "doc": "Test schema",
6
+ "fields": [
7
+ {
8
+ "name": "part_one",
9
+ "type": "string",
10
+ "doc": "test string one"
11
+ },
12
+ {
13
+ "name": "part_two",
14
+ "type": "string",
15
+ "doc": "test string two"
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "namespace": "com.my-namespace",
3
+ "name": "MySchemaWithBooleans",
4
+ "type": "record",
5
+ "doc": "Test schema",
6
+ "fields": [
7
+ {
8
+ "name": "test_id",
9
+ "type": "string",
10
+ "doc": "test string"
11
+ },
12
+ {
13
+ "name": "some_bool",
14
+ "type": "boolean",
15
+ "doc": "test bool"
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "namespace": "com.my-namespace",
3
+ "name": "MySchemaWithDateTimes",
4
+ "type": "record",
5
+ "doc": "Test schema",
6
+ "fields": [
7
+ {
8
+ "name": "test_id",
9
+ "type": "string",
10
+ "doc": "test string"
11
+ },
12
+ {
13
+ "name": "updated_at",
14
+ "type": ["int", "null"]
15
+ },
16
+ {
17
+ "name": "some_int",
18
+ "type": ["null", "int"],
19
+ "doc": "test int"
20
+ },
21
+ {
22
+ "name": "some_datetime_int",
23
+ "type": ["null", "int"],
24
+ "doc": "test datetime"
25
+ },
26
+ {
27
+ "name": "timestamp",
28
+ "type": "string",
29
+ "doc": "ISO timestamp",
30
+ "default": ""
31
+ }
32
+ ]
33
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "namespace": "com.my-namespace",
3
+ "name": "MySchemaWithId",
4
+ "type": "record",
5
+ "doc": "Test schema",
6
+ "fields": [
7
+ {
8
+ "name": "test_id",
9
+ "type": "string",
10
+ "doc": "test string"
11
+ },
12
+ {
13
+ "name": "some_int",
14
+ "type": "int",
15
+ "doc": "test int"
16
+ },
17
+ {
18
+ "name": "message_id",
19
+ "type": "string",
20
+ "doc": "UUID"
21
+ },
22
+ {
23
+ "name": "timestamp",
24
+ "type": "string",
25
+ "doc": "timestamp"
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "namespace": "com.my-namespace",
3
+ "name": "MySchemaWithUniqueId",
4
+ "type": "record",
5
+ "doc": "Test schema",
6
+ "fields": [
7
+ {
8
+ "name": "id",
9
+ "type": "int"
10
+ },
11
+ {
12
+ "name": "test_id",
13
+ "type": "string",
14
+ "doc": "test string"
15
+ },
16
+ {
17
+ "name": "some_int",
18
+ "type": "int",
19
+ "doc": "test int"
20
+ },
21
+ {
22
+ "name": "message_id",
23
+ "type": "string",
24
+ "doc": "UUID"
25
+ },
26
+ {
27
+ "name": "timestamp",
28
+ "type": "string",
29
+ "doc": "timestamp"
30
+ }
31
+ ]
32
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "namespace": "com.my-namespace",
3
+ "name": "Wibble",
4
+ "type": "record",
5
+ "fields": [
6
+ {
7
+ "name": "id",
8
+ "type": "long"
9
+ },
10
+ {
11
+ "name": "wibble_id",
12
+ "type": "long"
13
+ },
14
+ {
15
+ "name": "name",
16
+ "type": "string"
17
+ },
18
+ {
19
+ "name": "floop",
20
+ "type": "string"
21
+ },
22
+ {
23
+ "name": "birthday_int",
24
+ "type": "int"
25
+ },
26
+ {
27
+ "name": "birthday_long",
28
+ "type": "long"
29
+ },
30
+ {
31
+ "name": "birthday_optional",
32
+ "type": ["null", "int"]
33
+ },
34
+ {
35
+ "name": "updated_at",
36
+ "type": "long"
37
+ },
38
+ {
39
+ "name": "created_at",
40
+ "type": "long"
41
+ }
42
+ ]
43
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "namespace": "com.my-namespace",
3
+ "name": "Widget",
4
+ "type": "record",
5
+ "fields": [
6
+ {
7
+ "name": "id",
8
+ "type": "long"
9
+ },
10
+ {
11
+ "name": "widget_id",
12
+ "type": "long"
13
+ },
14
+ {
15
+ "name": "name",
16
+ "type": "string"
17
+ },
18
+ {
19
+ "name": "updated_at",
20
+ "type": "long"
21
+ },
22
+ {
23
+ "name": "created_at",
24
+ "type": "long"
25
+ }
26
+ ]
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "namespace": "com.my-namespace",
3
+ "name": "WidgetTheSecond",
4
+ "type": "record",
5
+ "fields": [
6
+ {
7
+ "name": "id",
8
+ "type": "long"
9
+ },
10
+ {
11
+ "name": "widget_id",
12
+ "type": "long"
13
+ },
14
+ {
15
+ "name": "model_id",
16
+ "type": "string"
17
+ },
18
+ {
19
+ "name": "updated_at",
20
+ "type": "long"
21
+ },
22
+ {
23
+ "name": "created_at",
24
+ "type": "long"
25
+ }
26
+ ]
27
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "namespace": "com.my-namespace.request",
3
+ "name": "CreateTopic",
4
+ "type": "record",
5
+ "fields": [
6
+ {
7
+ "name": "request_id",
8
+ "type": "string"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "namespace": "com.my-namespace.request",
3
+ "name": "Index",
4
+ "type": "record",
5
+ "fields": [
6
+ {
7
+ "name": "request_id",
8
+ "type": "string"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "namespace": "com.my-namespace.request",
3
+ "name": "UpdateRequest",
4
+ "type": "record",
5
+ "fields": [
6
+ {
7
+ "name": "update_request_id",
8
+ "type": "string"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "namespace": "com.my-namespace.response",
3
+ "name": "CreateTopic",
4
+ "type": "record",
5
+ "fields": [
6
+ {
7
+ "name": "response_id",
8
+ "type": "string"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "namespace": "com.my-namespace.response",
3
+ "name": "Index",
4
+ "type": "record",
5
+ "fields": [
6
+ {
7
+ "name": "response_id",
8
+ "type": "string"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "namespace": "com.my-namespace.response",
3
+ "name": "UpdateResponse",
4
+ "type": "record",
5
+ "fields": [
6
+ {
7
+ "name": "update_response_id",
8
+ "type": "string"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,267 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
4
+ require 'active_record'
5
+ require 'action_controller/railtie'
6
+ require 'database_cleaner'
7
+ require 'deimos'
8
+ require 'deimos/metrics/mock'
9
+ require 'deimos/tracing/mock'
10
+ require 'deimos/test_helpers'
11
+ require 'active_support/testing/time_helpers'
12
+ require 'activerecord-import'
13
+ require 'handlers/my_batch_consumer'
14
+ require 'handlers/my_consumer'
15
+ require 'rspec/rails'
16
+
17
+ class DeimosApp < Rails::Application
18
+ end
19
+ DeimosApp.initialize!
20
+
21
+ # Helpers for Executor/DbProducer
22
+ module TestRunners
23
+ # Execute a block until it stops failing. This is helpful for testing threads
24
+ # where we need to wait for them to continue but don't want to rely on
25
+ # sleeping for X seconds, which is crazy brittle and slow.
26
+ def wait_for
27
+ start_time = Time.now
28
+ begin
29
+ yield
30
+ rescue Exception # rubocop:disable Lint/RescueException
31
+ raise if Time.now - start_time > 2 # 2 seconds is probably plenty of time! <_<
32
+
33
+ sleep(0.1)
34
+ retry
35
+ end
36
+ end
37
+
38
+ # Test runner
39
+ class TestRunner
40
+ attr_accessor :id, :started, :stopped, :should_error
41
+
42
+ # :nodoc:
43
+ def initialize(id=nil)
44
+ @id = id
45
+ end
46
+
47
+ # :nodoc:
48
+ def start
49
+ if @should_error
50
+ @should_error = false
51
+ raise 'OH NOES'
52
+ end
53
+ @started = true
54
+ end
55
+
56
+ # :nodoc:
57
+ def stop
58
+ @stopped = true
59
+ end
60
+ end
61
+ end
62
+
63
+ # :nodoc:
64
+ module DbConfigs
65
+ # @param payload [Hash]
66
+ # @param topic [String]
67
+ # @param key [String]
68
+ def build_message(payload, topic, key)
69
+ message = Deimos::Message.new(payload, Deimos::Producer,
70
+ topic: topic, key: key)
71
+ message.encoded_payload = message.payload
72
+ message.encoded_key = message.key
73
+ message
74
+ end
75
+
76
+ DB_OPTIONS = [
77
+ {
78
+ adapter: 'postgresql',
79
+ port: 5432,
80
+ username: 'postgres',
81
+ password: 'root',
82
+ database: 'postgres',
83
+ host: ENV['PG_HOST'] || 'localhost'
84
+ },
85
+ {
86
+ adapter: 'mysql2',
87
+ port: 3306,
88
+ username: 'root',
89
+ database: 'test',
90
+ host: ENV['MYSQL_HOST'] || '127.0.0.1'
91
+ },
92
+ {
93
+ adapter: 'sqlite3',
94
+ database: 'test.sqlite3'
95
+ } # this one always needs to be last for non-integration tests
96
+ ].freeze
97
+
98
+ # For each config, run some tests.
99
+ def each_db_config(subject, &block)
100
+ DB_OPTIONS.each do |options|
101
+ describe subject, :integration, db_config: options do
102
+
103
+ include_context 'with DB'
104
+ describe options[:adapter] do # rubocop:disable RSpec/EmptyExampleGroup
105
+ self.instance_eval(&block)
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ # :nodoc:
112
+ def run_db_backend_migration
113
+ migration_class_name = 'DbBackendMigration'
114
+ migration_version = '[5.2]'
115
+ migration = ERB.new(
116
+ File.read('lib/generators/deimos/db_backend/templates/migration')
117
+ ).result(binding)
118
+ eval(migration) # rubocop:disable Security/Eval
119
+ ActiveRecord::Migration.new.run(DbBackendMigration, direction: :up)
120
+ end
121
+
122
+ # :nodoc:
123
+ def run_db_poller_migration
124
+ migration_class_name = 'DbPollerMigration'
125
+ migration_version = '[5.2]'
126
+ migration = ERB.new(
127
+ File.read('lib/generators/deimos/db_poller/templates/migration')
128
+ ).result(binding)
129
+ eval(migration) # rubocop:disable Security/Eval
130
+ ActiveRecord::Migration.new.run(DbPollerMigration, direction: :up)
131
+ end
132
+
133
+ # Set up the given database.
134
+ def setup_db(options)
135
+ ActiveRecord::Base.establish_connection(options)
136
+ run_db_backend_migration
137
+ run_db_poller_migration
138
+
139
+ ActiveRecord::Base.descendants.each do |klass|
140
+ klass.reset_sequence_name if klass.respond_to?(:reset_sequence_name)
141
+ # reset internal variables - terrible hack to trick Rails into doing this
142
+ table_name = klass.table_name
143
+ klass.table_name = "#{table_name}2"
144
+ klass.table_name = table_name
145
+ end
146
+ end
147
+ end
148
+
149
+ RSpec.configure do |config|
150
+ config.extend(DbConfigs)
151
+ include DbConfigs
152
+ config.include TestRunners
153
+ config.full_backtrace = true
154
+
155
+ # true by default for RSpec 4.0
156
+ config.shared_context_metadata_behavior = :apply_to_host_groups
157
+
158
+ config.filter_run(focus: true)
159
+ config.run_all_when_everything_filtered = true
160
+
161
+ config.before(:all) do
162
+ Time.zone = 'Eastern Time (US & Canada)'
163
+ ActiveRecord::Base.logger = Logger.new('/dev/null')
164
+ ActiveRecord::Base.establish_connection(
165
+ 'adapter' => 'sqlite3',
166
+ 'database' => 'test.sqlite3'
167
+ )
168
+ end
169
+ config.include Deimos::TestHelpers
170
+ config.include ActiveSupport::Testing::TimeHelpers
171
+ config.before(:suite) do
172
+ setup_db(DbConfigs::DB_OPTIONS.last)
173
+
174
+ DatabaseCleaner.strategy = :transaction
175
+ DatabaseCleaner.clean_with(:truncation)
176
+ end
177
+
178
+ config.mock_with(:rspec) do |mocks|
179
+ mocks.yield_receiver_to_any_instance_implementation_blocks = true
180
+ mocks.verify_partial_doubles = true
181
+ end
182
+
183
+ config.before(:each) do
184
+ Deimos.config.reset!
185
+ Deimos.configure do |deimos_config|
186
+ deimos_config.producers.backend = :test
187
+ deimos_config.phobos_config_file = File.join(File.dirname(__FILE__), 'phobos.yml')
188
+ deimos_config.schema.path = File.join(File.expand_path(__dir__), 'schemas')
189
+ deimos_config.consumers.reraise_errors = true
190
+ deimos_config.schema.registry_url = ENV['SCHEMA_REGISTRY'] || 'http://localhost:8081'
191
+ deimos_config.kafka.seed_brokers = ENV['KAFKA_SEED_BROKER'] || 'localhost:9092'
192
+ deimos_config.logger = Logger.new('/dev/null')
193
+ deimos_config.logger.level = Logger::INFO
194
+ deimos_config.schema.backend = :avro_validation
195
+ end
196
+ end
197
+
198
+ config.around(:each) do |example|
199
+ use_cleaner = !example.metadata[:integration]
200
+
201
+ DatabaseCleaner.start if use_cleaner
202
+
203
+ example.run
204
+
205
+ DatabaseCleaner.clean if use_cleaner
206
+ end
207
+ end
208
+
209
+ RSpec.shared_context('with widgets') do
210
+ before(:all) do
211
+ ActiveRecord::Base.connection.create_table(:widgets, force: true) do |t|
212
+ t.string(:test_id)
213
+ t.integer(:some_int)
214
+ t.boolean(:some_bool)
215
+ t.timestamps
216
+ end
217
+
218
+ # :nodoc:
219
+ class Widget < ActiveRecord::Base
220
+ # @return [String]
221
+ def generated_id
222
+ 'generated_id'
223
+ end
224
+ end
225
+ end
226
+
227
+ after(:all) do
228
+ ActiveRecord::Base.connection.drop_table(:widgets)
229
+ end
230
+ end
231
+
232
+ RSpec.shared_context('with DB') do
233
+ before(:all) do
234
+ setup_db(self.class.metadata[:db_config] || DbConfigs::DB_OPTIONS.last)
235
+ end
236
+
237
+ after(:each) do
238
+ Deimos::KafkaMessage.delete_all
239
+ Deimos::KafkaTopicInfo.delete_all
240
+ end
241
+ end
242
+
243
+ RSpec.shared_context('with publish_backend') do
244
+ before(:each) do
245
+ producer_class = Class.new(Deimos::Producer) do
246
+ schema 'MySchema'
247
+ namespace 'com.my-namespace'
248
+ topic 'my-topic'
249
+ key_config field: 'test_id'
250
+ end
251
+ stub_const('MyProducer', producer_class)
252
+
253
+ producer_class = Class.new(Deimos::Producer) do
254
+ schema 'MySchema'
255
+ namespace 'com.my-namespace'
256
+ topic 'my-topic'
257
+ key_config none: true
258
+ end
259
+ stub_const('MyNoKeyProducer', producer_class)
260
+ end
261
+
262
+ let(:messages) do
263
+ (1..3).map do |i|
264
+ build_message({ foo: i }, 'my-topic', "foo#{i}")
265
+ end
266
+ end
267
+ end