Skip to content

Commit 05f84f8

Browse files
authored
Merge pull request #129 from braintrustdata/ci/test_ruby_4
Add Ruby 4.0 to CI and fix stdlib dependency issues
2 parents 44c169c + 0df38cf commit 05f84f8

29 files changed

Lines changed: 291 additions & 77 deletions

.github/workflows/ci.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
strategy:
1717
matrix:
1818
os: [ubuntu-latest, macos-latest]
19-
ruby-version: ['3.2', '3.3', '3.4']
19+
ruby-version: ['3.2', '3.3', '3.4', '4.0']
2020

2121
steps:
2222
# Security: Pin to commit SHA instead of tag to prevent tag hijacking
@@ -25,10 +25,11 @@ jobs:
2525

2626
- name: Set up Ruby
2727
# Security: Pin to commit SHA instead of tag
28-
# ruby/setup-ruby@v1.270.0
29-
uses: ruby/setup-ruby@ac793fdd38cc468a4dd57246fa9d0e868aba9085
28+
# ruby/setup-ruby@v1.295.0
29+
uses: ruby/setup-ruby@319994f95fa847cf3fb3cd3dbe89f6dcde9f178f
3030
with:
3131
ruby-version: ${{ matrix.ruby-version }}
32+
bundler: 'latest'
3233
bundler-cache: true
3334

3435
# Security: Provide secrets only to the step that needs them, not all steps

Appraisals

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,41 @@
11
# frozen_string_literal: true
22

3-
# Additional dependencies needed for specific gems.
4-
# These work around upstream gems that haven't declared dependencies properly.
5-
# See docs/appraisal-ruby-version-support.md for future Ruby version support.
6-
GEM_DEPENDENCIES = {
7-
"openai" => ["base64"] # openai uses base64 but doesn't declare it (needed for Ruby 3.4+)
8-
}
9-
10-
def gem_dependencies_for(gem_name)
11-
GEM_DEPENDENCIES.fetch(gem_name, [])
12-
end
13-
14-
# Optional dependencies to test
3+
# Optional dependencies to test.
4+
# Each version entry is a hash with:
5+
# constraint: version constraint for the gem
6+
# deps: hash of additional gem dependencies to install, mapping gem name to
7+
# constraint (or nil for no constraint). Works around upstream gems that
8+
# haven't declared dependencies properly (e.g. base64/cgi removed from stdlib).
159
OPTIONAL_GEMS = {
1610
"openai" => {
17-
"0.33" => "~> 0.33.0",
18-
"0.34" => "~> 0.34.0",
19-
"latest" => ">= 0.34"
11+
"0.33" => {constraint: "~> 0.33.0", deps: {"base64" => nil, "cgi" => nil}},
12+
"0.34" => {constraint: "~> 0.34.0", deps: {"base64" => nil, "cgi" => nil}},
13+
"latest" => {constraint: ">= 0.34", deps: {"base64" => nil, "cgi" => nil}}
2014
},
2115
"anthropic" => {
22-
"1.11" => "~> 1.11.0",
23-
"1.12" => "~> 1.12.0",
24-
"latest" => ">= 1.11"
16+
"1.11" => {constraint: "~> 1.11.0", deps: {"base64" => nil, "cgi" => nil}},
17+
"1.12" => {constraint: "~> 1.12.0", deps: {"base64" => nil, "cgi" => nil}},
18+
"latest" => {constraint: ">= 1.11", deps: {"base64" => nil, "cgi" => nil}}
2519
},
2620
"ruby-openai" => {
27-
"7.0" => "~> 7.0",
28-
"8.0" => "~> 8.0",
29-
"latest" => ">= 8.0"
21+
"7.0" => {constraint: "~> 7.0", deps: {}},
22+
"8.0" => {constraint: "~> 8.0", deps: {}},
23+
"latest" => {constraint: ">= 8.0", deps: {}}
3024
},
3125
"ruby_llm" => {
32-
"1.8" => "~> 1.8.0",
33-
"1.9" => "~> 1.9.0",
34-
"latest" => ">= 1.9"
26+
"1.8" => {constraint: "~> 1.8.0", deps: {}},
27+
"1.9" => {constraint: "~> 1.9.0", deps: {}},
28+
"latest" => {constraint: ">= 1.9", deps: {}}
3529
}
3630
}
3731

3832
# Generate appraisals for each optional gem
3933
OPTIONAL_GEMS.each do |gem_name, versions|
40-
extra_deps = gem_dependencies_for(gem_name)
41-
42-
versions.each do |name, constraint|
34+
versions.each do |name, config|
4335
suffix = (name == "latest") ? "" : "-#{name.tr(".", "-")}"
4436
appraise "#{gem_name}#{suffix}" do
45-
gem gem_name, constraint
46-
extra_deps.each { |dep| gem dep }
37+
gem gem_name, config[:constraint]
38+
config[:deps].each { |dep, version| gem dep, *[version].compact }
4739
end
4840
end
4941

@@ -78,6 +70,7 @@ appraise "contrib" do
7870
gem "anthropic", ">= 1.11"
7971
gem "ruby_llm", ">= 1.9"
8072
gem "base64" # needed for openai gem on Ruby 3.4+
73+
gem "cgi" # needed for openai/anthropic gems on Ruby 4.0+
8174
end
8275

8376
# Server testing - all latest LLM SDKs + server deps for eval dev server
@@ -86,6 +79,7 @@ appraise "server" do
8679
gem "anthropic", ">= 1.11"
8780
gem "ruby_llm", ">= 1.9"
8881
gem "base64" # needed for openai gem on Ruby 3.4+
82+
gem "cgi" # needed for openai/anthropic gems on Ruby 4.0+
8983
gem "rack", "~> 3.0"
9084
gem "rack-test", "~> 2.1"
9185
gem "rackup", "~> 2.3"

Gemfile

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,16 @@ source "https://rubygems.org"
55
# Specify your gem's dependencies in braintrust.gemspec
66
gemspec
77

8-
# Additional development tools not in gemspec (optional/convenience)
8+
# Development dependencies
9+
gem "appraisal", "~> 2.5"
10+
gem "climate_control", "~> 1.2"
11+
gem "kramdown", "~> 2.0"
912
gem "minitest-reporters", "~> 1.6"
1013
gem "minitest-stub-const", "~> 0.6"
11-
gem "climate_control", "~> 1.2"
14+
gem "minitest", "~> 5.0"
15+
gem "rake", "~> 13.0"
16+
gem "simplecov", "~> 0.22"
17+
gem "standard", "~> 1.0"
18+
gem "vcr", "~> 6.0"
19+
gem "webmock", "~> 3.0"
20+
gem "yard", "~> 0.9"

Gemfile.lock

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ PATH
22
remote: .
33
specs:
44
braintrust (0.3.0)
5+
logger (>= 1.0)
56
openssl (~> 3.3.1)
67
opentelemetry-exporter-otlp (~> 0.28)
78
opentelemetry-sdk (~> 1.3)
@@ -24,23 +25,24 @@ GEM
2425
bigdecimal
2526
rexml
2627
docile (1.4.1)
27-
google-protobuf (4.33.2-aarch64-linux-gnu)
28+
google-protobuf (4.34.1-aarch64-linux-gnu)
2829
bigdecimal
29-
rake (>= 13)
30-
google-protobuf (4.33.2-arm64-darwin)
30+
rake (~> 13.3)
31+
google-protobuf (4.34.1-arm64-darwin)
3132
bigdecimal
32-
rake (>= 13)
33-
google-protobuf (4.33.2-x86_64-linux-gnu)
33+
rake (~> 13.3)
34+
google-protobuf (4.34.1-x86_64-linux-gnu)
3435
bigdecimal
35-
rake (>= 13)
36+
rake (~> 13.3)
3637
googleapis-common-protos-types (1.22.0)
3738
google-protobuf (~> 4.26)
3839
hashdiff (1.2.1)
39-
json (2.18.0)
40+
json (2.19.2)
4041
kramdown (2.5.1)
4142
rexml (>= 3.3.9)
4243
language_server-protocol (3.17.0.5)
4344
lint_roller (1.1.0)
45+
logger (1.7.0)
4446
minitest (5.27.0)
4547
minitest-reporters (1.7.1)
4648
ansi
@@ -148,4 +150,4 @@ DEPENDENCIES
148150
yard (~> 0.9)
149151

150152
BUNDLED WITH
151-
2.4.19
153+
4.0.8

braintrust.gemspec

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
3030
spec.require_paths = ["lib"]
3131

3232
# Runtime dependencies
33+
spec.add_runtime_dependency "logger", ">= 1.0"
3334
spec.add_runtime_dependency "opentelemetry-sdk", "~> 1.3"
3435
spec.add_runtime_dependency "opentelemetry-exporter-otlp", "~> 0.28"
3536

@@ -38,15 +39,4 @@ Gem::Specification.new do |spec|
3839
# See: https://github.com/ruby/openssl/issues/949
3940
# This dependency may be removable in future Ruby versions once the fix is widely available.
4041
spec.add_runtime_dependency "openssl", "~> 3.3.1"
41-
42-
# Development dependencies
43-
spec.add_development_dependency "minitest", "~> 5.0"
44-
spec.add_development_dependency "rake", "~> 13.0"
45-
spec.add_development_dependency "standard", "~> 1.0"
46-
spec.add_development_dependency "simplecov", "~> 0.22"
47-
spec.add_development_dependency "vcr", "~> 6.0"
48-
spec.add_development_dependency "webmock", "~> 3.0"
49-
spec.add_development_dependency "appraisal", "~> 2.5"
50-
spec.add_development_dependency "yard", "~> 0.9"
51-
spec.add_development_dependency "kramdown", "~> 2.0"
5242
end

gemfiles/anthropic.gemfile

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,20 @@
22

33
source "https://rubygems.org"
44

5+
gem "appraisal", "~> 2.5"
6+
gem "climate_control", "~> 1.2"
7+
gem "kramdown", "~> 2.0"
58
gem "minitest-reporters", "~> 1.6"
69
gem "minitest-stub-const", "~> 0.6"
7-
gem "climate_control", "~> 1.2"
10+
gem "minitest", "~> 5.0"
11+
gem "rake", "~> 13.0"
12+
gem "simplecov", "~> 0.22"
13+
gem "standard", "~> 1.0"
14+
gem "vcr", "~> 6.0"
15+
gem "webmock", "~> 3.0"
16+
gem "yard", "~> 0.9"
817
gem "anthropic", ">= 1.11"
18+
gem "base64"
19+
gem "cgi"
920

1021
gemspec path: "../"

gemfiles/anthropic_1_11.gemfile

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,20 @@
22

33
source "https://rubygems.org"
44

5+
gem "appraisal", "~> 2.5"
6+
gem "climate_control", "~> 1.2"
7+
gem "kramdown", "~> 2.0"
58
gem "minitest-reporters", "~> 1.6"
69
gem "minitest-stub-const", "~> 0.6"
7-
gem "climate_control", "~> 1.2"
10+
gem "minitest", "~> 5.0"
11+
gem "rake", "~> 13.0"
12+
gem "simplecov", "~> 0.22"
13+
gem "standard", "~> 1.0"
14+
gem "vcr", "~> 6.0"
15+
gem "webmock", "~> 3.0"
16+
gem "yard", "~> 0.9"
817
gem "anthropic", "~> 1.11.0"
18+
gem "base64"
19+
gem "cgi"
920

1021
gemspec path: "../"

gemfiles/anthropic_1_12.gemfile

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,20 @@
22

33
source "https://rubygems.org"
44

5+
gem "appraisal", "~> 2.5"
6+
gem "climate_control", "~> 1.2"
7+
gem "kramdown", "~> 2.0"
58
gem "minitest-reporters", "~> 1.6"
69
gem "minitest-stub-const", "~> 0.6"
7-
gem "climate_control", "~> 1.2"
10+
gem "minitest", "~> 5.0"
11+
gem "rake", "~> 13.0"
12+
gem "simplecov", "~> 0.22"
13+
gem "standard", "~> 1.0"
14+
gem "vcr", "~> 6.0"
15+
gem "webmock", "~> 3.0"
16+
gem "yard", "~> 0.9"
817
gem "anthropic", "~> 1.12.0"
18+
gem "base64"
19+
gem "cgi"
920

1021
gemspec path: "../"

gemfiles/anthropic_uninstalled.gemfile

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,17 @@
22

33
source "https://rubygems.org"
44

5+
gem "appraisal", "~> 2.5"
6+
gem "climate_control", "~> 1.2"
7+
gem "kramdown", "~> 2.0"
58
gem "minitest-reporters", "~> 1.6"
69
gem "minitest-stub-const", "~> 0.6"
7-
gem "climate_control", "~> 1.2"
10+
gem "minitest", "~> 5.0"
11+
gem "rake", "~> 13.0"
12+
gem "simplecov", "~> 0.22"
13+
gem "standard", "~> 1.0"
14+
gem "vcr", "~> 6.0"
15+
gem "webmock", "~> 3.0"
16+
gem "yard", "~> 0.9"
817

918
gemspec path: "../"

gemfiles/contrib.gemfile

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,22 @@
22

33
source "https://rubygems.org"
44

5+
gem "appraisal", "~> 2.5"
6+
gem "climate_control", "~> 1.2"
7+
gem "kramdown", "~> 2.0"
58
gem "minitest-reporters", "~> 1.6"
69
gem "minitest-stub-const", "~> 0.6"
7-
gem "climate_control", "~> 1.2"
10+
gem "minitest", "~> 5.0"
11+
gem "rake", "~> 13.0"
12+
gem "simplecov", "~> 0.22"
13+
gem "standard", "~> 1.0"
14+
gem "vcr", "~> 6.0"
15+
gem "webmock", "~> 3.0"
16+
gem "yard", "~> 0.9"
817
gem "openai", ">= 0.34"
918
gem "anthropic", ">= 1.11"
1019
gem "ruby_llm", ">= 1.9"
1120
gem "base64"
21+
gem "cgi"
1222

1323
gemspec path: "../"

0 commit comments

Comments
 (0)