From dafb8784b217d97aab3aeda532894374106d5672 Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Tue, 19 Dec 2023 20:06:18 -0500 Subject: [PATCH] feat!: add otp_app option to consumer and producer compile-time options to improve configurating the modules --- README.md | 2 ++ lib/kafee/consumer.ex | 21 +++++++++++++++++- lib/kafee/producer.ex | 22 ++++++++++++++++++- lib/kafee/producer/test_adapter.ex | 1 + .../broadway_adapter_integration_test.exs | 1 + .../brod_adapter_integration_test.exs | 1 + test/kafee/consumer_test.exs | 2 ++ test/kafee/producer/async_adapter_test.exs | 1 + test/kafee/producer/sync_adapter_test.exs | 1 + test/kafee/producer/test_adapter_test.exs | 1 + test/kafee/producer_integration_test.exs | 1 + test/kafee/producer_test.exs | 1 + test/kafee/test_async_test.exs | 1 + test/kafee/test_sync_test.exs | 1 + test/support/example/my_consumer.ex | 1 + test/support/example/my_producer.ex | 1 + 16 files changed, 57 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6375d1e..f94ee33 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ You'll first setup a module for your consumer logic like so: ```elixir defmodule MyConsumer do use Kafee.Consumer, + otp_app: :my_app, adapter: Application.compile_env(:my_app, :kafee_consumer_adapter, nil), consumer_group_id: "my-app", topic: "my-topic" @@ -91,6 +92,7 @@ So you want to send messages to Kafka eh? Well, first you will need to create a ```elixir defmodule MyProducer do use Kafee.Producer, + otp_app: :my_app, adapter: Application.compile_env(:my_app, :kafee_producer_adapter, nil), encoder: Kafee.JasonEncoderDecoder, topic: "my-topic", diff --git a/lib/kafee/consumer.ex b/lib/kafee/consumer.ex index cac94a9..45762cb 100644 --- a/lib/kafee/consumer.ex +++ b/lib/kafee/consumer.ex @@ -1,5 +1,16 @@ defmodule Kafee.Consumer do @options_schema NimbleOptions.new!( + otp_app: [ + doc: """ + The name of the OTP application to read configuration from. + + If the option is set, the configuration will be read from the application environment under the + given name. For example, if the OTP application is `:my_app`, the configuration will be read from + `Application.get_env(:my_app, Myapp.KafeeConsumer)`. + """, + required: true, + type: :atom + ], adapter: [ default: nil, doc: """ @@ -93,6 +104,7 @@ defmodule Kafee.Consumer do defmodule MyConsumer do use Kafee.Consumer, + otp_app: :my_app, adapter: Kafee.Consumer.BroadwayAdapter, host: "localhost", port: 9092 @@ -116,6 +128,7 @@ defmodule Kafee.Consumer do defmodule MyConsumer do use Kafee.Consumer, + otp_app: :my_app, adapter: Application.compile_env(:my_app, :kafee_consumer_adapter, nil), host: "localhost", port: 9092, @@ -197,7 +210,13 @@ defmodule Kafee.Consumer do @doc false @spec child_spec(Kafee.Consumer.options()) :: Supervisor.child_spec() def child_spec(args) do - full_opts = Keyword.merge(unquote(Macro.escape(opts)), args) + opts = unquote(Macro.escape(opts)) + env_opts = Application.get_env(opts[:otp_app], unquote(__MODULE__), []) + + full_opts = + opts + |> Keyword.merge(env_opts) + |> Keyword.merge(args) %{ id: __MODULE__, diff --git a/lib/kafee/producer.ex b/lib/kafee/producer.ex index bfac161..b3759e7 100644 --- a/lib/kafee/producer.ex +++ b/lib/kafee/producer.ex @@ -1,5 +1,16 @@ defmodule Kafee.Producer do @options_schema NimbleOptions.new!( + otp_app: [ + doc: """ + The name of the OTP application to read configuration from. + + If the option is set, the configuration will be read from the application environment under the + given name. For example, if the OTP application is `:my_app`, the configuration will be read from + `Application.get_env(:my_app, Myapp.KafeeProducer)`. + """, + required: true, + type: :atom + ], adapter: [ default: nil, doc: """ @@ -107,6 +118,7 @@ defmodule Kafee.Producer do defmodule MyProducer do use Kafee.Producer, + otp_app: :my_app, topic: "my-topic", partition_fun: :random end @@ -125,6 +137,7 @@ defmodule Kafee.Producer do defmodule MyProducer do use Kafee.Producer, + otp_app: :my_app, topic: "my-topic", partition_fun: :random @@ -151,6 +164,7 @@ defmodule Kafee.Producer do defmodule MyProducer do use Kafee.Producer, + otp_app: :my_app, encoder: Kafee.JasonEncoderDecoder, topic: "order-created", partition_fun: :random @@ -213,7 +227,13 @@ defmodule Kafee.Producer do @doc false @spec child_spec(Kafee.Producer.options()) :: Supervisor.child_spec() def child_spec(args) do - full_opts = Keyword.merge(unquote(Macro.escape(opts)), args) + opts = unquote(Macro.escape(opts)) + env_opts = Application.get_env(opts[:otp_app], unquote(__MODULE__), []) + + full_opts = + opts + |> Keyword.merge(env_opts) + |> Keyword.merge(args) %{ id: __MODULE__, diff --git a/lib/kafee/producer/test_adapter.ex b/lib/kafee/producer/test_adapter.ex index 555731a..88de44d 100644 --- a/lib/kafee/producer/test_adapter.ex +++ b/lib/kafee/producer/test_adapter.ex @@ -18,6 +18,7 @@ defmodule Kafee.Producer.TestAdapter do defmodule MyProducer do use Kafee.Producer, + otp_app: :my_app, adapter: Kafee.Producer.TestAdapter, encoder: Kafee.JasonEncoderDecoder diff --git a/test/kafee/consumer/broadway_adapter_integration_test.exs b/test/kafee/consumer/broadway_adapter_integration_test.exs index 624636a..d6a02ea 100644 --- a/test/kafee/consumer/broadway_adapter_integration_test.exs +++ b/test/kafee/consumer/broadway_adapter_integration_test.exs @@ -3,6 +3,7 @@ defmodule Kafee.Consumer.BroadwayAdapterIntegrationTest do defmodule MyConsumer do use Kafee.Consumer, + otp_app: :kafee, adapter: {Kafee.Consumer.BroadwayAdapter, []} def handle_message(%Kafee.Consumer.Message{} = message) do diff --git a/test/kafee/consumer/brod_adapter_integration_test.exs b/test/kafee/consumer/brod_adapter_integration_test.exs index 7245388..ec5b93e 100644 --- a/test/kafee/consumer/brod_adapter_integration_test.exs +++ b/test/kafee/consumer/brod_adapter_integration_test.exs @@ -3,6 +3,7 @@ defmodule Kafee.Consumer.BrodAdapterIntegrationTest do defmodule MyConsumer do use Kafee.Consumer, + otp_app: :kafee, adapter: Kafee.Consumer.BrodAdapter def handle_message(%Kafee.Consumer.Message{} = message) do diff --git a/test/kafee/consumer_test.exs b/test/kafee/consumer_test.exs index 03eba75..8c5b4a9 100644 --- a/test/kafee/consumer_test.exs +++ b/test/kafee/consumer_test.exs @@ -12,6 +12,7 @@ defmodule Kafee.ConsumerTest do test "starts the adapter process tree", %{topic: topic} do assert {:ok, pid} = Kafee.Consumer.start_link(MyConsumer, + otp_app: :kafee, adapter: Kafee.Consumer.BroadwayAdapter, host: Kafee.KafkaApi.host(), port: Kafee.KafkaApi.port(), @@ -25,6 +26,7 @@ defmodule Kafee.ConsumerTest do test "starts nothing if no adapter is set", %{topic: topic} do assert :ignore = Kafee.Consumer.start_link(MyConsumer, + otp_app: :kafee, adapter: nil, host: Kafee.KafkaApi.host(), port: Kafee.KafkaApi.port(), diff --git a/test/kafee/producer/async_adapter_test.exs b/test/kafee/producer/async_adapter_test.exs index 4c61ae0..073e308 100644 --- a/test/kafee/producer/async_adapter_test.exs +++ b/test/kafee/producer/async_adapter_test.exs @@ -5,6 +5,7 @@ defmodule Kafee.Producer.AsyncAdapterTest do defmodule MyProducer do use Kafee.Producer, + otp_app: :kafee, adapter: Kafee.Producer.AsyncAdapter, encoder: Kafee.JasonEncoderDecoder, partition_fun: :random diff --git a/test/kafee/producer/sync_adapter_test.exs b/test/kafee/producer/sync_adapter_test.exs index 600d81c..8f05c23 100644 --- a/test/kafee/producer/sync_adapter_test.exs +++ b/test/kafee/producer/sync_adapter_test.exs @@ -5,6 +5,7 @@ defmodule Kafee.Producer.SyncAdapterTest do defmodule MyProducer do use Kafee.Producer, + otp_app: :kafee, adapter: Kafee.Producer.SyncAdapter, encoder: Kafee.JasonEncoderDecoder, partition_fun: :random diff --git a/test/kafee/producer/test_adapter_test.exs b/test/kafee/producer/test_adapter_test.exs index 13fd338..9ee2f11 100644 --- a/test/kafee/producer/test_adapter_test.exs +++ b/test/kafee/producer/test_adapter_test.exs @@ -3,6 +3,7 @@ defmodule Kafee.Producer.TestAdapterTest do defmodule MyProducer do use Kafee.Producer, + otp_app: :kafee, adapter: Kafee.Producer.TestAdapter, encoder: Kafee.JasonEncoderDecoder, partition_fun: :random diff --git a/test/kafee/producer_integration_test.exs b/test/kafee/producer_integration_test.exs index eebb93c..6163fb2 100644 --- a/test/kafee/producer_integration_test.exs +++ b/test/kafee/producer_integration_test.exs @@ -8,6 +8,7 @@ defmodule Kafee.ProducerIntegrationTest do defmodule MyProducer do use Kafee.Producer, + otp_app: :kafee, adapter: Kafee.Producer.AsyncAdapter, partition_fun: :random end diff --git a/test/kafee/producer_test.exs b/test/kafee/producer_test.exs index 3d40217..a861df7 100644 --- a/test/kafee/producer_test.exs +++ b/test/kafee/producer_test.exs @@ -14,6 +14,7 @@ defmodule Kafee.ProducerTest do test "allows setting config via using macro" do defmodule MyTestProducer do use Kafee.Producer, + otp_app: :kafee, adapter: Kafee.Producer.TestAdapter, topic: "my super-amazing-test-topic", partition_fun: :random diff --git a/test/kafee/test_async_test.exs b/test/kafee/test_async_test.exs index 18cd1cc..7f25827 100644 --- a/test/kafee/test_async_test.exs +++ b/test/kafee/test_async_test.exs @@ -8,6 +8,7 @@ defmodule Kafee.TestAsyncTest do defmodule TestProducer do use Kafee.Producer, + otp_app: :kafee, adapter: Kafee.Producer.TestAdapter, topic: "kafee-test-async-test", partition_fun: :random diff --git a/test/kafee/test_sync_test.exs b/test/kafee/test_sync_test.exs index 9068a62..4a01797 100644 --- a/test/kafee/test_sync_test.exs +++ b/test/kafee/test_sync_test.exs @@ -8,6 +8,7 @@ defmodule Kafee.TestSyncTest do defmodule TestProducer do use Kafee.Producer, + otp_app: :kafee, adapter: Kafee.Producer.TestAdapter, topic: "kafee-test-sync-test", partition_fun: :random diff --git a/test/support/example/my_consumer.ex b/test/support/example/my_consumer.ex index a3dfa77..f317c8f 100644 --- a/test/support/example/my_consumer.ex +++ b/test/support/example/my_consumer.ex @@ -4,6 +4,7 @@ defmodule MyConsumer do """ use Kafee.Consumer, + otp_app: :kafee, adapter: nil, host: "localhost", consumer_group_id: "test", diff --git a/test/support/example/my_producer.ex b/test/support/example/my_producer.ex index 0db94fb..f23557b 100644 --- a/test/support/example/my_producer.ex +++ b/test/support/example/my_producer.ex @@ -4,6 +4,7 @@ defmodule MyProducer do """ use Kafee.Producer, + otp_app: :kafee, adapter: nil, topic: "test-topic", partition_fun: :random