diff --git a/lib/datadog/ci/contrib/contrib.rb b/lib/datadog/ci/contrib/contrib.rb index 457a7e74..69a6a19f 100644 --- a/lib/datadog/ci/contrib/contrib.rb +++ b/lib/datadog/ci/contrib/contrib.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require_relative "integration" +require_relative "instrumentation" module Datadog module CI @@ -13,7 +13,7 @@ module Contrib def self.auto_instrument_on_session_start! Datadog.logger.debug("Auto instrumenting all integrations...") - Integration.registry.each do |name, integration| + Instrumentation.registry.each do |name, integration| next unless integration.auto_instrument? Datadog.logger.debug "#{name} is allowed to be auto instrumented" diff --git a/lib/datadog/ci/contrib/instrumentation.rb b/lib/datadog/ci/contrib/instrumentation.rb index 0e7c01d0..bf2042e9 100644 --- a/lib/datadog/ci/contrib/instrumentation.rb +++ b/lib/datadog/ci/contrib/instrumentation.rb @@ -6,6 +6,16 @@ module Contrib module Instrumentation class InvalidIntegrationError < StandardError; end + @registry = {} + + def self.registry + @registry + end + + def self.register_integration(integration_class) + @registry[integration_name(integration_class)] = integration_class.new + end + def self.instrument(integration_name, options = {}, &block) integration = fetch_integration(integration_name) integration.configure(options, &block) @@ -34,9 +44,17 @@ def self.instrument(integration_name, options = {}, &block) end def self.fetch_integration(name) - Datadog::CI::Contrib::Integration.registry[name] || + @registry[name] || raise(InvalidIntegrationError, "'#{name}' is not a valid integration.") end + + # take the parent module name and downcase it + # for example for Datadog::CI::Contrib::RSpec::Integration it will be :rspec + def self.integration_name(subclass) + result = subclass.name&.split("::")&.[](-2)&.downcase&.to_sym + raise "Integration name could not be derived for #{subclass}" if result.nil? + result + end end end end diff --git a/lib/datadog/ci/contrib/integration.rb b/lib/datadog/ci/contrib/integration.rb index 87fc84a3..1c6cda21 100644 --- a/lib/datadog/ci/contrib/integration.rb +++ b/lib/datadog/ci/contrib/integration.rb @@ -1,27 +1,14 @@ # frozen_string_literal: true require_relative "settings" +require_relative "instrumentation" module Datadog module CI module Contrib class Integration - @registry = {} - def self.inherited(subclass) - @registry[integration_name(subclass)] = subclass.new - end - - # take the parent module name and downcase it - # for example for Datadog::CI::Contrib::RSpec::Integration it will be :rspec - def self.integration_name(subclass) - result = subclass.name&.split("::")&.[](-2)&.downcase&.to_sym - raise "Integration name could not be derived for #{subclass}" if result.nil? - result - end - - def self.registry - @registry + Instrumentation.register_integration(subclass) end # List of integrations names that depend on this integration. diff --git a/sig/datadog/ci/contrib/instrumentation.rbs b/sig/datadog/ci/contrib/instrumentation.rbs index 958c9862..e43cdaf6 100644 --- a/sig/datadog/ci/contrib/instrumentation.rbs +++ b/sig/datadog/ci/contrib/instrumentation.rbs @@ -5,9 +5,17 @@ module Datadog class InvalidIntegrationError < StandardError end + self.@registry: Hash[Symbol, untyped] + + def self.registry: () -> Hash[Symbol, untyped] + def self.instrument: (Symbol integration_name, ?::Hash[untyped, untyped] options) { (?) -> untyped } -> void def self.fetch_integration: (Symbol name) -> untyped + + def self.integration_name: (Class) -> Symbol + + def self.register_integration: (Class integration) -> void end end end diff --git a/sig/datadog/ci/contrib/integration.rbs b/sig/datadog/ci/contrib/integration.rbs index 4708e3a2..11659090 100644 --- a/sig/datadog/ci/contrib/integration.rbs +++ b/sig/datadog/ci/contrib/integration.rbs @@ -2,14 +2,8 @@ module Datadog module CI module Contrib class Integration - self.@registry: Hash[Symbol, untyped] - def self.inherited: (untyped) -> void - def self.registry: () -> Hash[Symbol, untyped] - - def self.integration_name: (Class) -> Symbol - def version: () -> untyped def available?: () -> bool