deimos-temp-fork 0.0.1

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 (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