From aec43fa1dcfc51fa710287e11e342dc8ce2b62df Mon Sep 17 00:00:00 2001 From: Jeremy Daer Date: Tue, 11 Aug 2026 14:26:39 -0700 Subject: [PATCH] Read the OpenAPI spec as UTF-8 regardless of process locale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The LC_ALL=C hardening pinned encoding: "UTF-8" across scripts/, but the three Ruby generators under ruby/scripts/ were missed. Under a C locale — ssh non-interactive shells, LC_ALL=C CI steps — Ruby's default external encoding is US-ASCII, and JSON.parse dies on the spec's first multibyte character: lib/json/common.rb:364:in 'String#encode': "\xE2" on US-ASCII (Encoding::InvalidByteSequenceError) Found by rb-check-drift failing in a cold make check over ssh — the check runs in no CI job, so no green CI ever disproved it. Verified: the old generate-metadata.rb exits 1 with exactly that error under LC_ALL=C, the pinned scripts exit 0. --- ruby/scripts/generate-metadata.rb | 4 +++- ruby/scripts/generate-services.rb | 3 ++- ruby/scripts/generate-types.rb | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ruby/scripts/generate-metadata.rb b/ruby/scripts/generate-metadata.rb index 8bd40a3514..2d41a5dd68 100755 --- a/ruby/scripts/generate-metadata.rb +++ b/ruby/scripts/generate-metadata.rb @@ -14,7 +14,9 @@ class MetadataExtractor METHODS = %w[get post put patch delete].freeze def initialize(openapi_path) - @openapi = JSON.parse(File.read(openapi_path)) + # Read as UTF-8 regardless of process locale (LC_ALL=C would otherwise read + # as US-ASCII and JSON.parse dies on the spec's multibyte characters) + @openapi = JSON.parse(File.read(openapi_path, encoding: 'UTF-8')) end def extract diff --git a/ruby/scripts/generate-services.rb b/ruby/scripts/generate-services.rb index 71eb8733d0..b898e7ffcf 100644 --- a/ruby/scripts/generate-services.rb +++ b/ruby/scripts/generate-services.rb @@ -321,7 +321,8 @@ def download(upload_id:) ].freeze def initialize(openapi_path) - @openapi = JSON.parse(File.read(openapi_path)) + # UTF-8 regardless of process locale — see generate-metadata.rb + @openapi = JSON.parse(File.read(openapi_path, encoding: 'UTF-8')) @schemas = @openapi.dig('components', 'schemas') || {} end diff --git a/ruby/scripts/generate-types.rb b/ruby/scripts/generate-types.rb index 1d012d9f85..f4dfbc4bf0 100755 --- a/ruby/scripts/generate-types.rb +++ b/ruby/scripts/generate-types.rb @@ -131,7 +131,8 @@ def deprecation_doc_lines(reason, indent:, tag_prefix: '') puts ' module Types' puts ' include TypeHelpers' - schemas = JSON.parse(File.read(openapi_path))['components']['schemas'] || {} + # UTF-8 regardless of process locale — see generate-metadata.rb + schemas = JSON.parse(File.read(openapi_path, encoding: 'UTF-8'))['components']['schemas'] || {} sorted = schemas.keys.sort sorted.each do |name|