Skip to content

Commit 1e42f87

Browse files
committed
Add support for Kicks gem
1 parent cf5120d commit 1e42f87

File tree

18 files changed

+125
-19
lines changed

18 files changed

+125
-19
lines changed

Matrixfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@
168168
'contrib' => '✅ 2.5 / ✅ 2.6 / ✅ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ 3.4 / ✅ jruby'
169169
},
170170
'sneakers' => {
171-
'contrib' => '✅ 2.5 / ✅ 2.6 / ✅ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ 3.4 / ✅ jruby'
171+
'kicks-3' => '✅ 2.5 / ✅ 2.6 / ✅ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ 3.4 / ✅ jruby',
172+
'sneakers-2' => '✅ 2.5 / ✅ 2.6 / ✅ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ 3.4 / ✅ jruby',
172173
},
173174
'stripe' => {
174175
'stripe-latest' => '✅ 2.5 / ✅ 2.6 / ✅ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ 3.4 / ✅ jruby',

appraisal/generate.rb

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,14 @@
4949

5050
# Builds a matrix of versions to test for a given integration
5151

52-
# `range`: the range of versions to test
53-
# `gem` : optional, gem name to test (gem name can be different from the integration name)
54-
# `min` : optional, minimum version to test
55-
# `meta` : optional, additional metadata (development dependencies, etc.) for the group
56-
def build_coverage_matrix(integration, range, gem: nil, min: nil, meta: {})
57-
gem ||= integration
52+
# @param [String] integration the name of the integration to test
53+
# @param [Range, Integer] range the range of major versions to test, or a single major version to test
54+
# @param [String] gem optional, gem name to test (gem name can be different from the integration name)
55+
# @param [String] min optional, minimum version to test
56+
# @param [Hash] meta optional, additional metadata (development dependencies, etc.) for the group
57+
def build_coverage_matrix(integration, range, gem: integration, min: nil, meta: {})
58+
# Allow single version to be passed easily
59+
range = range..range if range.is_a?(Integer)
5860

5961
if min
6062
appraise "#{integration}-min" do

appraisal/jruby-9.2.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@
202202
build_coverage_matrix('stripe', 7..12, min: '5.15.0')
203203
build_coverage_matrix('opensearch', 2..3, gem: 'opensearch-ruby')
204204
build_coverage_matrix('elasticsearch', 7..8)
205+
build_coverage_matrix('kicks', 3)
206+
build_coverage_matrix('sneakers', 2)
205207

206208
appraise 'relational_db' do
207209
gem 'activerecord', '~> 5'

appraisal/jruby-9.3.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@
175175
build_coverage_matrix('stripe', 7..12, min: '5.15.0')
176176
build_coverage_matrix('opensearch', 2..3, gem: 'opensearch-ruby')
177177
build_coverage_matrix('elasticsearch', 7..8)
178+
build_coverage_matrix('kicks', 3)
179+
build_coverage_matrix('sneakers', 2)
178180

179181
appraise 'relational_db' do
180182
gem 'activerecord', '~> 6.0.0'

appraisal/jruby-9.4.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@
7979
build_coverage_matrix('stripe', 7..12, min: '5.15.0')
8080
build_coverage_matrix('opensearch', 2..3, gem: 'opensearch-ruby')
8181
build_coverage_matrix('elasticsearch', 7..8)
82+
build_coverage_matrix('kicks', 3)
83+
build_coverage_matrix('sneakers', 2)
8284

8385
appraise 'relational_db' do
8486
gem 'activerecord', '~> 6.1.0'

appraisal/ruby-2.5.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@
221221
build_coverage_matrix('stripe', 7..12, min: '5.15.0')
222222
build_coverage_matrix('opensearch', 2..3, gem: 'opensearch-ruby')
223223
build_coverage_matrix('elasticsearch', 7..8)
224+
build_coverage_matrix('kicks', 3)
225+
build_coverage_matrix('sneakers', 2)
224226

225227
appraise 'relational_db' do
226228
gem 'activerecord', '~> 5'

appraisal/ruby-2.6.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@
174174
build_coverage_matrix('stripe', 7..12, min: '5.15.0')
175175
build_coverage_matrix('opensearch', 2..3, gem: 'opensearch-ruby')
176176
build_coverage_matrix('elasticsearch', 7..8)
177+
build_coverage_matrix('kicks', 3)
178+
build_coverage_matrix('sneakers', 2)
177179

178180
appraise 'relational_db' do
179181
gem 'activerecord', '~> 6.0.0'

appraisal/ruby-2.7.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@
174174
build_coverage_matrix('stripe', 7..12, min: '5.15.0')
175175
build_coverage_matrix('opensearch', 2..3, gem: 'opensearch-ruby')
176176
build_coverage_matrix('elasticsearch', 7..8)
177+
build_coverage_matrix('kicks', 3)
178+
build_coverage_matrix('sneakers', 2)
177179

178180
appraise 'relational_db' do
179181
gem 'activerecord', '~> 6.1.0'

appraisal/ruby-3.0.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@
9595
build_coverage_matrix('stripe', 7..12, min: '5.15.0')
9696
build_coverage_matrix('opensearch', 2..3, gem: 'opensearch-ruby')
9797
build_coverage_matrix('elasticsearch', 7..8)
98+
build_coverage_matrix('kicks', 3)
99+
build_coverage_matrix('sneakers', 2)
98100

99101
appraise 'relational_db' do
100102
gem 'activerecord', '~> 7'

appraisal/ruby-3.1.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@
9595
build_coverage_matrix('stripe', 7..12, min: '5.15.0')
9696
build_coverage_matrix('opensearch', 2..3, gem: 'opensearch-ruby')
9797
build_coverage_matrix('elasticsearch', 7..8)
98+
build_coverage_matrix('kicks', 3)
99+
build_coverage_matrix('sneakers', 2)
98100

99101
appraise 'relational_db' do
100102
gem 'activerecord', '~> 7'

appraisal/ruby-3.2.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@
9595
build_coverage_matrix('stripe', 7..12, min: '5.15.0')
9696
build_coverage_matrix('opensearch', 2..3, gem: 'opensearch-ruby')
9797
build_coverage_matrix('elasticsearch', 7..8)
98+
build_coverage_matrix('kicks', 3)
99+
build_coverage_matrix('sneakers', 2)
98100

99101
appraise 'relational_db' do
100102
gem 'activerecord', '~> 7'

appraisal/ruby-3.3.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@
9595
build_coverage_matrix('stripe', 7..12, min: '5.15.0')
9696
build_coverage_matrix('opensearch', 2..3, gem: 'opensearch-ruby')
9797
build_coverage_matrix('elasticsearch', 7..8)
98+
build_coverage_matrix('kicks', 3)
99+
build_coverage_matrix('sneakers', 2)
98100

99101
appraise 'relational_db' do
100102
gem 'activerecord', '~> 7'
@@ -131,7 +133,6 @@
131133
gem 'roda', '>= 2.0.0'
132134
gem 'semantic_logger', '~> 4.0'
133135
gem 'sidekiq', '~> 7'
134-
gem 'sneakers', '>= 2.12.0'
135136
gem 'sucker_punch'
136137
gem 'que', '>= 1.0.0'
137138
end

appraisal/ruby-3.4.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@
9595
build_coverage_matrix('stripe', 7..12, min: '5.15.0')
9696
build_coverage_matrix('opensearch', 2..3, gem: 'opensearch-ruby')
9797
build_coverage_matrix('elasticsearch', 7..8)
98+
build_coverage_matrix('kicks', 3)
99+
build_coverage_matrix('sneakers', 2)
98100

99101
appraise 'relational_db' do
100102
# ActiveRecord locked because tests are failing with 7.1, which was attempted as a part of Ruby 3.4 testing in CI.

lib/datadog/tracing/contrib/registerable.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,17 @@ module ClassMethods
3333
def register_as(name, registry: Contrib::REGISTRY, auto_patch: false, **options)
3434
registry.add(name, new(name, **options), auto_patch)
3535
end
36+
37+
# Registers this `alias_name` in the global tracer registry as an alias of `original_name`.
38+
# Using `alias_name` or `original_name` become interchangeable.
39+
# The configuration object is shared between the two names.
40+
# The patcher will only run once if both are activated.
41+
def register_as_alias(original_name, alias_name, registry: Contrib::REGISTRY)
42+
original = registry[original_name]
43+
raise ArgumentError, "integration '#{original_name}' not registered" unless original
44+
45+
registry.add(alias_name, original, false)
46+
end
3647
end
3748

3849
# Instance methods for registerable behavior

lib/datadog/tracing/contrib/sneakers/integration.rb

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,33 @@ module Sneakers
1313
class Integration
1414
include Contrib::Integration
1515

16-
MINIMUM_VERSION = Gem::Version.new('2.12.0')
16+
MINIMUM_SNEAKERS_VERSION = Gem::Version.new('2.12.0')
17+
# All versions are supported. Kicks first version is 3.0.0.
18+
MINIMUM_KICKS_VERSION = Gem::Version.new('3.0.0')
1719

1820
# @public_api Changing the integration name or integration options can cause breaking changes
1921
register_as :sneakers, auto_patch: true
20-
22+
register_as_alias :sneakers, :kicks
23+
24+
# Sneakers development continues in the Kicks gem.
25+
# The **only** thing that has changed is the gem name,
26+
# even the file naming and module namespacing are the same (require 'sneakers', `::Sneakers`).
27+
#
28+
# The last version of Sneakers is 2.12.0.
29+
# The first version of Kicks is 3.0.0. We currently support all versions of Kicks.
30+
#
31+
# @see https://github.com/jondot/sneakers/commit/9780692624c666b6db8266d2d5710f709cb0f2e2
2132
def self.version
22-
Gem.loaded_specs['sneakers'] && Gem.loaded_specs['sneakers'].version
33+
Gem.loaded_specs['sneakers'] && Gem.loaded_specs['sneakers'].version || \
34+
Gem.loaded_specs['kicks'] && Gem.loaded_specs['kicks'].version
2335
end
2436

2537
def self.loaded?
2638
!defined?(::Sneakers).nil?
2739
end
2840

2941
def self.compatible?
30-
super && version >= MINIMUM_VERSION
42+
super && version >= MINIMUM_SNEAKERS_VERSION
3143
end
3244

3345
def new_configuration

sig/datadog/tracing/contrib/registerable.rbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ module Datadog
55
def self.included: (untyped base) -> untyped
66
module ClassMethods
77
def register_as: (untyped name, ?registry: untyped, ?auto_patch: bool, **untyped options) -> untyped
8+
9+
def register_as_alias: (Symbol original_name, Symbol alias_name, registry: Registry) -> void
810
end
911
module InstanceMethods
1012
attr_reader name: untyped

spec/datadog/tracing/contrib/registerable_spec.rb

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,44 @@
5858
end
5959
end
6060
end
61+
62+
describe '#register_as_alias' do
63+
subject(:register_as_alias) { registerable_class.register_as_alias(:original, :alias, **options) }
64+
65+
context 'when a registry' do
66+
context 'is provided' do
67+
let(:options) { { registry: registry } }
68+
let(:registry) { Datadog::Tracing::Contrib::Registry.new }
69+
70+
context 'with the original integration not registered' do
71+
it { expect { register_as_alias }.to raise_error(ArgumentError) }
72+
end
73+
74+
context 'with the original integration registered' do
75+
before { registerable_class.register_as(:original, registry: registry) }
76+
77+
it 'creates an alias to the original integration object' do
78+
register_as_alias
79+
expect(registry[:alias]).to be(registry[:original])
80+
end
81+
end
82+
end
83+
84+
context 'is not provided' do
85+
let(:options) { {} }
86+
let(:registry) { Datadog::Tracing::Contrib::Registry.new }
87+
88+
before { registerable_class.register_as(:original, registry: registry) }
89+
90+
it 'invokes the global Datadog.registry' do
91+
stub_const('Datadog::Tracing::Contrib::REGISTRY', registry)
92+
93+
register_as_alias
94+
expect(registry[:alias]).to be(registry[:original])
95+
end
96+
end
97+
end
98+
end
6199
end
62100

63101
describe 'instance behavior' do

spec/datadog/tracing/contrib/sneakers/integration_spec.rb

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,17 @@
99
subject(:version) { described_class.version }
1010

1111
context 'when the "sneakers" gem is loaded' do
12-
include_context 'loaded gems', sneakers: described_class::MINIMUM_VERSION
12+
include_context 'loaded gems', sneakers: described_class::MINIMUM_SNEAKERS_VERSION
1313
it { is_expected.to be_a_kind_of(Gem::Version) }
1414
end
1515

16-
context 'when "sneakers" gem is not loaded' do
17-
include_context 'loaded gems', sneakers: nil
16+
context 'when the "kicks" gem is loaded' do
17+
include_context 'loaded gems', kicks: described_class::MINIMUM_KICKS_VERSION
18+
it { is_expected.to be_a_kind_of(Gem::Version) }
19+
end
20+
21+
context 'when neither gem is not loaded' do
22+
include_context 'loaded gems', sneakers: nil, kicks: nil
1823
it { is_expected.to be nil }
1924
end
2025
end
@@ -40,18 +45,32 @@
4045

4146
context 'when "sneakers" gem is loaded with a version' do
4247
context 'that is less than the minimum' do
43-
include_context 'loaded gems', sneakers: decrement_gem_version(described_class::MINIMUM_VERSION)
48+
include_context 'loaded gems',
49+
sneakers: decrement_gem_version(described_class::MINIMUM_SNEAKERS_VERSION),
50+
kicks: nil
51+
it { is_expected.to be false }
52+
end
53+
54+
context 'that meets the minimum version' do
55+
include_context 'loaded gems', sneakers: described_class::MINIMUM_SNEAKERS_VERSION, kicks: nil
56+
it { is_expected.to be true }
57+
end
58+
end
59+
60+
context 'when "kicks" gem is loaded with a version' do
61+
context 'that is less than the minimum' do
62+
include_context 'loaded gems', sneakers: nil, kicks: decrement_gem_version(described_class::MINIMUM_KICKS_VERSION)
4463
it { is_expected.to be false }
4564
end
4665

4766
context 'that meets the minimum version' do
48-
include_context 'loaded gems', sneakers: described_class::MINIMUM_VERSION
67+
include_context 'loaded gems', sneakers: nil, kicks: described_class::MINIMUM_KICKS_VERSION
4968
it { is_expected.to be true }
5069
end
5170
end
5271

53-
context 'when gem is not loaded' do
54-
include_context 'loaded gems', sneakers: nil
72+
context 'when neither gem is not loaded' do
73+
include_context 'loaded gems', sneakers: nil, kicks: nil
5574
it { is_expected.to be false }
5675
end
5776
end

0 commit comments

Comments
 (0)