Skip to content

Bump faraday from 2.13.1 to 2.14.1#882

Open
dependabot[bot] wants to merge 1 commit intomainfrom
dependabot/bundler/faraday-2.14.1
Open

Bump faraday from 2.13.1 to 2.14.1#882
dependabot[bot] wants to merge 1 commit intomainfrom
dependabot/bundler/faraday-2.14.1

Conversation

@dependabot
Copy link
Contributor

@dependabot dependabot bot commented on behalf of github Feb 9, 2026

Bumps faraday from 2.13.1 to 2.14.1.

Release notes

Sourced from faraday's releases.

v2.14.1

Security Note

This release contains a security fix, we recommend all users to upgrade as soon as possible. A Security Advisory with more details will be posted shortly.

What's Changed

New Contributors

Full Changelog: lostisland/faraday@v2.14.0...v2.14.1

v2.14.0

What's Changed

New features ✨

Fixes 🐞

Misc/Docs 📄

New Contributors

Full Changelog: lostisland/faraday@v2.13.4...v2.14.0

v2.13.4

What's Changed

Full Changelog: lostisland/faraday@v2.13.3...v2.13.4

v2.13.3

What's Changed

... (truncated)

Commits
  • 16cbd38 Version bump to 2.14.1
  • a6d3a3a Merge commit from fork
  • b23f710 Explicit top-level namespace reference (#1657)
  • 49ba4ac Bump actions/checkout from 5 to 6 (#1655)
  • 51a49bc Ensure Claude reads the guidelines and allow to plan in a gitignored .ai/PLAN...
  • 894f65c Add RFC document for Options architecture refactoring plan (#1644)
  • 397e3de Add comprehensive AI agent guidelines for Claude, Cursor, and GitHub Copilot ...
  • d98c65c Update Faraday-specific AI agent guidelines
  • 56c18ec Add AI agent guidelines specific to Faraday repository
  • 3201a42 Version bump to 2.14.0
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    You can disable automated security fix PRs for this repo from the Security Alerts page.

@dependabot dependabot bot added dependencies ruby Pull requests that update Ruby code labels Feb 9, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

3 similar comments
@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare faraday 2.13.1 2.14.1

Compared versions: ["2.13.1", "2.14.1"]
  DIFFERENT metadata:
    2.13.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.13.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
    2.14.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.14.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
  DIFFERENT rubygems_version:
    2.13.1: 3.6.7
    2.14.1: 3.6.9
  DIFFERENT version:
    2.13.1: 2.13.1
    2.14.1: 2.14.1
  DIFFERENT files:
    2.13.1->2.14.1:
      * Changed:
            lib/faraday.rb +2/-1
            lib/faraday/connection.rb +3/-2
            lib/faraday/encoders/flat_params_encoder.rb +2/-2
            lib/faraday/error.rb +42/-5
            lib/faraday/logging/formatter.rb +1/-1
            lib/faraday/rack_builder.rb +1/-5
            lib/faraday/response.rb +7/-3
            lib/faraday/response/raise_error.rb +1/-1
            lib/faraday/version.rb +1/-1
            spec/faraday/connection_spec.rb +33/-0
            spec/faraday/error_spec.rb +83/-1
            spec/faraday/response/logger_spec.rb +6/-0
            spec/faraday/response/raise_error_spec.rb +24/-13
            spec/faraday/response_spec.rb +7/-0

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare faraday 2.13.1 2.14.1

Compared versions: ["2.13.1", "2.14.1"]
  DIFFERENT metadata:
    2.13.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.13.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
    2.14.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.14.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
  DIFFERENT rubygems_version:
    2.13.1: 3.6.7
    2.14.1: 3.6.9
  DIFFERENT version:
    2.13.1: 2.13.1
    2.14.1: 2.14.1
  DIFFERENT files:
    2.13.1->2.14.1:
      * Changed:
            lib/faraday.rb +2/-1
            lib/faraday/connection.rb +3/-2
            lib/faraday/encoders/flat_params_encoder.rb +2/-2
            lib/faraday/error.rb +42/-5
            lib/faraday/logging/formatter.rb +1/-1
            lib/faraday/rack_builder.rb +1/-5
            lib/faraday/response.rb +7/-3
            lib/faraday/response/raise_error.rb +1/-1
            lib/faraday/version.rb +1/-1
            spec/faraday/connection_spec.rb +33/-0
            spec/faraday/error_spec.rb +83/-1
            spec/faraday/response/logger_spec.rb +6/-0
            spec/faraday/response/raise_error_spec.rb +24/-13
            spec/faraday/response_spec.rb +7/-0

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff faraday 2.13.1 2.14.1

Compared versions: ["2.13.1", "2.14.1"]
  DIFFERENT files:
    2.13.1->2.14.1:
      * Changed:
        lib/faraday.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday.rb	2026-02-09 22:17:28.899198366 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday.rb	2026-02-09 22:17:28.908198411 +0000
                @@ -3 +3,2 @@
                -require 'cgi'
                +require 'cgi/escape'
                +require 'cgi/util' if RUBY_VERSION < '3.5'
        lib/faraday/connection.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/connection.rb	2026-02-09 22:17:28.900198371 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/connection.rb	2026-02-09 22:17:28.909198416 +0000
                @@ -484,2 +484,3 @@
                -      # Ensure relative url will be parsed correctly (such as `service:search` )
                -      url = "./#{url}" if url.respond_to?(:start_with?) && !url.start_with?('http://', 'https://', '/', './', '../')
                +      # Ensure relative url will be parsed correctly (such as `service:search` or `//evil.com`)
                +      url = "./#{url}" if url.respond_to?(:start_with?) &&
                +                          (!url.start_with?('http://', 'https://', '/', './', '../') || url.start_with?('//'))
        lib/faraday/encoders/flat_params_encoder.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/encoders/flat_params_encoder.rb	2026-02-09 22:17:28.900198371 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/encoders/flat_params_encoder.rb	2026-02-09 22:17:28.909198416 +0000
                @@ -79 +79 @@
                -      split_query = (query.split('&').map do |pair|
                +      split_query = query.split('&').filter_map do |pair|
                @@ -81 +81 @@
                -      end).compact
                +      end
        lib/faraday/error.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/error.rb	2026-02-09 22:17:28.900198371 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/error.rb	2026-02-09 22:17:28.909198416 +0000
                @@ -82 +82,25 @@
                -      return [exc, exc.message, response] if exc.respond_to?(:backtrace)
                +      case exc
                +      when Exception
                +        [exc, exc.message, response]
                +      when Hash
                +        [nil, build_error_message_from_hash(exc), exc]
                +      when Faraday::Env
                +        [nil, build_error_message_from_env(exc), exc]
                +      else
                +        [nil, exc.to_s, response]
                +      end
                +    end
                +
                +    private
                +
                +    def build_error_message_from_hash(hash)
                +      # Be defensive with external Hash objects - they might be missing keys
                +      status = hash.fetch(:status, nil)
                +      request = hash.fetch(:request, nil)
                +
                +      return fallback_error_message(status) if request.nil?
                +
                +      method = request.fetch(:method, nil)
                +      url = request.fetch(:url, nil)
                +      build_status_error_message(status, method, url)
                +    end
                @@ -84,2 +108,10 @@
                -      return [nil, "the server responded with status #{exc[:status]}", exc] \
                -        if exc.respond_to?(:each_key)
                +    def build_error_message_from_env(env)
                +      # Faraday::Env is internal - we can make reasonable assumptions about its structure
                +      build_status_error_message(env.status, env.method, env.url)
                +    end
                +
                +    def build_status_error_message(status, method, url)
                +      method_str = method ? method.to_s.upcase : ''
                +      url_str = url ? url.to_s : ''
                +      "the server responded with status #{status} for #{method_str} #{url_str}"
                +    end
                @@ -87 +119,3 @@
                -      [nil, exc.to_s, response]
                +    def fallback_error_message(status)
                +      "the server responded with status #{status} - method and url are not available " \
                +        'due to include_request: false on Faraday::Response::RaiseError middleware'
                @@ -124 +158 @@
                -  class UnprocessableEntityError < ClientError
                +  class UnprocessableContentError < ClientError
                @@ -125,0 +160,3 @@
                +
                +  # Used to provide compatibility with legacy error name.
                +  UnprocessableEntityError = UnprocessableContentError
        lib/faraday/logging/formatter.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/logging/formatter.rb	2026-02-09 22:17:28.900198371 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/logging/formatter.rb	2026-02-09 22:17:28.909198416 +0000
                @@ -66 +66 @@
                -          body.to_str
                +          body.to_str.encode(::Encoding::UTF_8, undef: :replace, invalid: :replace)
        lib/faraday/rack_builder.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/rack_builder.rb	2026-02-09 22:17:28.901198376 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/rack_builder.rb	2026-02-09 22:17:28.910198421 +0000
                @@ -224 +224 @@
                -      return unless is_adapter?(klass)
                +      return unless klass <= Faraday::Adapter
                @@ -235,4 +234,0 @@
                -    end
                -
                -    def is_adapter?(klass) # rubocop:disable Naming/PredicateName
                -      klass <= Faraday::Adapter
        lib/faraday/response.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/response.rb	2026-02-09 22:17:28.903198386 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/response.rb	2026-02-09 22:17:28.911198426 +0000
                @@ -35,0 +36,4 @@
                +    def url
                +      finished? ? env.url : nil
                +    end
                +
                @@ -63,3 +67,3 @@
                -        status: env.status, body: env.body,
                -        response_headers: env.response_headers,
                -        url: env.url
                +        status: status, body: body,
                +        response_headers: headers,
                +        url: url
        lib/faraday/response/raise_error.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/response/raise_error.rb	2026-02-09 22:17:28.903198386 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/response/raise_error.rb	2026-02-09 22:17:28.911198426 +0000
                @@ -18 +18 @@
                -        422 => Faraday::UnprocessableEntityError,
                +        422 => Faraday::UnprocessableContentError,
        lib/faraday/version.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/lib/faraday/version.rb	2026-02-09 22:17:28.903198386 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/lib/faraday/version.rb	2026-02-09 22:17:28.911198426 +0000
                @@ -4 +4 @@
                -  VERSION = '2.13.1'
                +  VERSION = '2.14.1'
        spec/faraday/connection_spec.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/spec/faraday/connection_spec.rb	2026-02-09 22:17:28.904198391 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/spec/faraday/connection_spec.rb	2026-02-09 22:17:28.912198431 +0000
                @@ -313,0 +314,33 @@
                +    context 'with protocol-relative URL (GHSA-33mh-2634-fwr2)' do
                +      it 'does not allow host override with //evil.com/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//evil.com/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with //evil.com:8080/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//evil.com:8080/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with //user:pass@evil.com/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//user:pass@evil.com/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with ///evil.com' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('///evil.com')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'still allows single-slash absolute paths' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('/safe/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +        expect(uri.path).to eq('/safe/path')
                +      end
                +    end
                +
        spec/faraday/error_spec.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/spec/faraday/error_spec.rb	2026-02-09 22:17:28.904198391 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/spec/faraday/error_spec.rb	2026-02-09 22:17:28.912198431 +0000
                @@ -26 +26 @@
                -      it { expect(subject.message).to eq('the server responded with status 400') }
                +      it { expect(subject.message).to eq('the server responded with status 400 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                @@ -90,0 +91,82 @@
                +    end
                +
                +    context 'with hash missing status key' do
                +      let(:exception) { { body: 'error body' } }
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status  - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                +    end
                +
                +    context 'with hash with status but missing request data' do
                +      let(:exception) { { status: 404, body: 'not found' } } # missing request key
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                +    end
                +
                +    context 'with hash with status and request but missing method in request' do
                +      let(:exception) { { status: 404, body: 'not found', request: { url: 'http://example.com/test' } } } # missing method
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for  http://example.com/test') }
                +    end
                +
                +    context 'with hash with status and request but missing url in request' do
                +      let(:exception) { { status: 404, body: 'not found', request: { method: :get } } } # missing url
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for GET ') }
                +    end
                +
                +    context 'with properly formed Faraday::Env' do
                +      # This represents the normal case - a well-formed Faraday::Env object
                +      # with all the standard properties populated as they would be during
                +      # a typical HTTP request/response cycle
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception.status = 500
                +        exception.method = :post
                +        exception.url = URI('https://api.example.com/users')
                +        exception.request = Faraday::RequestOptions.new
                +        exception.response_headers = { 'content-type' => 'application/json' }
                +        exception.response_body = '{"error": "Internal server error"}'
                +        exception.request_headers = { 'authorization' => 'Bearer token123' }
                +        exception.request_body = '{"name": "John"}'
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 500 for POST https://api.example.com/users') }
                +    end
                +
                +    context 'with Faraday::Env missing status key' do
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception[:body] = 'error body'
                +        # Intentionally not setting status
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status  for  ') }
                +    end
                +
                +    context 'with Faraday::Env with direct method and url properties' do
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception.status = 404
                +        exception.method = :get
                +        exception.url = URI('http://example.com/test')
                +        exception[:body] = 'not found'
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for GET http://example.com/test') }
        spec/faraday/response/logger_spec.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/spec/faraday/response/logger_spec.rb	2026-02-09 22:17:28.906198401 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/spec/faraday/response/logger_spec.rb	2026-02-09 22:17:28.914198442 +0000
                @@ -23,0 +24 @@
                +        stubs.get('/8bit') { [200, { 'Content-Type' => 'text/html' }, (+'café!').force_encoding(Encoding::ASCII_8BIT)] }
                @@ -238,0 +240,5 @@
                +    end
                +
                +    it 'converts to UTF-8' do
                +      conn.get '/8bit'
                +      expect(string_io.string).to match(%(caf��!))
        spec/faraday/response/raise_error_spec.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/spec/faraday/response/raise_error_spec.rb	2026-02-09 22:17:28.906198401 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/spec/faraday/response/raise_error_spec.rb	2026-02-09 22:17:28.914198442 +0000
                @@ -16 +16 @@
                -        stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
                +        stub.get('unprocessable-content') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
                @@ -31 +31 @@
                -      expect(ex.message).to eq('the server responded with status 400')
                +      expect(ex.message).to eq('the server responded with status 400 for GET http:/bad-request')
                @@ -42 +42 @@
                -      expect(ex.message).to eq('the server responded with status 401')
                +      expect(ex.message).to eq('the server responded with status 401 for GET http:/unauthorized')
                @@ -53 +53 @@
                -      expect(ex.message).to eq('the server responded with status 403')
                +      expect(ex.message).to eq('the server responded with status 403 for GET http:/forbidden')
                @@ -64 +64 @@
                -      expect(ex.message).to eq('the server responded with status 404')
                +      expect(ex.message).to eq('the server responded with status 404 for GET http:/not-found')
                @@ -86 +86 @@
                -      expect(ex.message).to eq('the server responded with status 408')
                +      expect(ex.message).to eq('the server responded with status 408 for GET http:/request-timeout')
                @@ -97 +97 @@
                -      expect(ex.message).to eq('the server responded with status 409')
                +      expect(ex.message).to eq('the server responded with status 409 for GET http:/conflict')
                @@ -106,3 +106,14 @@
                -  it 'raises Faraday::UnprocessableEntityError for 422 responses' do
                -    expect { conn.get('unprocessable-entity') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
                -      expect(ex.message).to eq('the server responded with status 422')
                +  it 'raises legacy Faraday::UnprocessableEntityError for 422 responses' do
                +    expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
                +      expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
                +      expect(ex.response[:headers]['X-Reason']).to eq('because')
                +      expect(ex.response[:status]).to eq(422)
                +      expect(ex.response_status).to eq(422)
                +      expect(ex.response_body).to eq('keep looking')
                +      expect(ex.response_headers['X-Reason']).to eq('because')
                +    end
                +  end
                +
                +  it 'raises Faraday::UnprocessableContentError for 422 responses' do
                +    expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableContentError) do |ex|
                +      expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
                @@ -119 +130 @@
                -      expect(ex.message).to eq('the server responded with status 429')
                +      expect(ex.message).to eq('the server responded with status 429 for GET http:/too-many-requests')
                @@ -141 +152 @@
                -      expect(ex.message).to eq('the server responded with status 499')
                +      expect(ex.message).to eq('the server responded with status 499 for GET http:/4xx')
                @@ -152 +163 @@
                -      expect(ex.message).to eq('the server responded with status 500')
                +      expect(ex.message).to eq('the server responded with status 500 for GET http:/server-error')
        spec/faraday/response_spec.rb
                --- /tmp/d20260209-595-upj6gv/faraday-2.13.1/spec/faraday/response_spec.rb	2026-02-09 22:17:28.906198401 +0000
                +++ /tmp/d20260209-595-upj6gv/faraday-2.14.1/spec/faraday/response_spec.rb	2026-02-09 22:17:28.914198442 +0000
                @@ -15,0 +16 @@
                +  it { expect(subject.url).to eq(URI('https://lostisland.github.io/faraday')) }
                @@ -33,0 +35,6 @@
                +
                +    context 'when response is not finished' do
                +      subject { Faraday::Response.new.to_hash }
                +
                +      it { is_expected.to eq({ status: nil, body: nil, response_headers: {}, url: nil }) }
                +    end

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare faraday 2.13.1 2.14.1

Compared versions: ["2.13.1", "2.14.1"]
  DIFFERENT metadata:
    2.13.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.13.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
    2.14.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.14.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
  DIFFERENT rubygems_version:
    2.13.1: 3.6.7
    2.14.1: 3.6.9
  DIFFERENT version:
    2.13.1: 2.13.1
    2.14.1: 2.14.1
  DIFFERENT files:
    2.13.1->2.14.1:
      * Changed:
            lib/faraday.rb +2/-1
            lib/faraday/connection.rb +3/-2
            lib/faraday/encoders/flat_params_encoder.rb +2/-2
            lib/faraday/error.rb +42/-5
            lib/faraday/logging/formatter.rb +1/-1
            lib/faraday/rack_builder.rb +1/-5
            lib/faraday/response.rb +7/-3
            lib/faraday/response/raise_error.rb +1/-1
            lib/faraday/version.rb +1/-1
            spec/faraday/connection_spec.rb +33/-0
            spec/faraday/error_spec.rb +83/-1
            spec/faraday/response/logger_spec.rb +6/-0
            spec/faraday/response/raise_error_spec.rb +24/-13
            spec/faraday/response_spec.rb +7/-0

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff faraday 2.13.1 2.14.1

Compared versions: ["2.13.1", "2.14.1"]
  DIFFERENT files:
    2.13.1->2.14.1:
      * Changed:
        lib/faraday.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday.rb	2026-02-09 22:17:35.432759639 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday.rb	2026-02-09 22:17:35.442759743 +0000
                @@ -3 +3,2 @@
                -require 'cgi'
                +require 'cgi/escape'
                +require 'cgi/util' if RUBY_VERSION < '3.5'
        lib/faraday/connection.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/connection.rb	2026-02-09 22:17:35.433759650 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/connection.rb	2026-02-09 22:17:35.442759743 +0000
                @@ -484,2 +484,3 @@
                -      # Ensure relative url will be parsed correctly (such as `service:search` )
                -      url = "./#{url}" if url.respond_to?(:start_with?) && !url.start_with?('http://', 'https://', '/', './', '../')
                +      # Ensure relative url will be parsed correctly (such as `service:search` or `//evil.com`)
                +      url = "./#{url}" if url.respond_to?(:start_with?) &&
                +                          (!url.start_with?('http://', 'https://', '/', './', '../') || url.start_with?('//'))
        lib/faraday/encoders/flat_params_encoder.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/encoders/flat_params_encoder.rb	2026-02-09 22:17:35.433759650 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/encoders/flat_params_encoder.rb	2026-02-09 22:17:35.442759743 +0000
                @@ -79 +79 @@
                -      split_query = (query.split('&').map do |pair|
                +      split_query = query.split('&').filter_map do |pair|
                @@ -81 +81 @@
                -      end).compact
                +      end
        lib/faraday/error.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/error.rb	2026-02-09 22:17:35.433759650 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/error.rb	2026-02-09 22:17:35.443759754 +0000
                @@ -82 +82,25 @@
                -      return [exc, exc.message, response] if exc.respond_to?(:backtrace)
                +      case exc
                +      when Exception
                +        [exc, exc.message, response]
                +      when Hash
                +        [nil, build_error_message_from_hash(exc), exc]
                +      when Faraday::Env
                +        [nil, build_error_message_from_env(exc), exc]
                +      else
                +        [nil, exc.to_s, response]
                +      end
                +    end
                +
                +    private
                +
                +    def build_error_message_from_hash(hash)
                +      # Be defensive with external Hash objects - they might be missing keys
                +      status = hash.fetch(:status, nil)
                +      request = hash.fetch(:request, nil)
                +
                +      return fallback_error_message(status) if request.nil?
                +
                +      method = request.fetch(:method, nil)
                +      url = request.fetch(:url, nil)
                +      build_status_error_message(status, method, url)
                +    end
                @@ -84,2 +108,10 @@
                -      return [nil, "the server responded with status #{exc[:status]}", exc] \
                -        if exc.respond_to?(:each_key)
                +    def build_error_message_from_env(env)
                +      # Faraday::Env is internal - we can make reasonable assumptions about its structure
                +      build_status_error_message(env.status, env.method, env.url)
                +    end
                +
                +    def build_status_error_message(status, method, url)
                +      method_str = method ? method.to_s.upcase : ''
                +      url_str = url ? url.to_s : ''
                +      "the server responded with status #{status} for #{method_str} #{url_str}"
                +    end
                @@ -87 +119,3 @@
                -      [nil, exc.to_s, response]
                +    def fallback_error_message(status)
                +      "the server responded with status #{status} - method and url are not available " \
                +        'due to include_request: false on Faraday::Response::RaiseError middleware'
                @@ -124 +158 @@
                -  class UnprocessableEntityError < ClientError
                +  class UnprocessableContentError < ClientError
                @@ -125,0 +160,3 @@
                +
                +  # Used to provide compatibility with legacy error name.
                +  UnprocessableEntityError = UnprocessableContentError
        lib/faraday/logging/formatter.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/logging/formatter.rb	2026-02-09 22:17:35.433759650 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/logging/formatter.rb	2026-02-09 22:17:35.443759754 +0000
                @@ -66 +66 @@
                -          body.to_str
                +          body.to_str.encode(::Encoding::UTF_8, undef: :replace, invalid: :replace)
        lib/faraday/rack_builder.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/rack_builder.rb	2026-02-09 22:17:35.434759660 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/rack_builder.rb	2026-02-09 22:17:35.444759764 +0000
                @@ -224 +224 @@
                -      return unless is_adapter?(klass)
                +      return unless klass <= Faraday::Adapter
                @@ -235,4 +234,0 @@
                -    end
                -
                -    def is_adapter?(klass) # rubocop:disable Naming/PredicateName
                -      klass <= Faraday::Adapter
        lib/faraday/response.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/response.rb	2026-02-09 22:17:35.435759671 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/response.rb	2026-02-09 22:17:35.444759764 +0000
                @@ -35,0 +36,4 @@
                +    def url
                +      finished? ? env.url : nil
                +    end
                +
                @@ -63,3 +67,3 @@
                -        status: env.status, body: env.body,
                -        response_headers: env.response_headers,
                -        url: env.url
                +        status: status, body: body,
                +        response_headers: headers,
                +        url: url
        lib/faraday/response/raise_error.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/response/raise_error.rb	2026-02-09 22:17:35.436759681 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/response/raise_error.rb	2026-02-09 22:17:35.445759775 +0000
                @@ -18 +18 @@
                -        422 => Faraday::UnprocessableEntityError,
                +        422 => Faraday::UnprocessableContentError,
        lib/faraday/version.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/lib/faraday/version.rb	2026-02-09 22:17:35.436759681 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/lib/faraday/version.rb	2026-02-09 22:17:35.445759775 +0000
                @@ -4 +4 @@
                -  VERSION = '2.13.1'
                +  VERSION = '2.14.1'
        spec/faraday/connection_spec.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/spec/faraday/connection_spec.rb	2026-02-09 22:17:35.437759691 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/spec/faraday/connection_spec.rb	2026-02-09 22:17:35.446759785 +0000
                @@ -313,0 +314,33 @@
                +    context 'with protocol-relative URL (GHSA-33mh-2634-fwr2)' do
                +      it 'does not allow host override with //evil.com/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//evil.com/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with //evil.com:8080/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//evil.com:8080/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with //user:pass@evil.com/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//user:pass@evil.com/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with ///evil.com' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('///evil.com')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'still allows single-slash absolute paths' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('/safe/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +        expect(uri.path).to eq('/safe/path')
                +      end
                +    end
                +
        spec/faraday/error_spec.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/spec/faraday/error_spec.rb	2026-02-09 22:17:35.437759691 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/spec/faraday/error_spec.rb	2026-02-09 22:17:35.446759785 +0000
                @@ -26 +26 @@
                -      it { expect(subject.message).to eq('the server responded with status 400') }
                +      it { expect(subject.message).to eq('the server responded with status 400 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                @@ -90,0 +91,82 @@
                +    end
                +
                +    context 'with hash missing status key' do
                +      let(:exception) { { body: 'error body' } }
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status  - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                +    end
                +
                +    context 'with hash with status but missing request data' do
                +      let(:exception) { { status: 404, body: 'not found' } } # missing request key
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                +    end
                +
                +    context 'with hash with status and request but missing method in request' do
                +      let(:exception) { { status: 404, body: 'not found', request: { url: 'http://example.com/test' } } } # missing method
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for  http://example.com/test') }
                +    end
                +
                +    context 'with hash with status and request but missing url in request' do
                +      let(:exception) { { status: 404, body: 'not found', request: { method: :get } } } # missing url
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for GET ') }
                +    end
                +
                +    context 'with properly formed Faraday::Env' do
                +      # This represents the normal case - a well-formed Faraday::Env object
                +      # with all the standard properties populated as they would be during
                +      # a typical HTTP request/response cycle
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception.status = 500
                +        exception.method = :post
                +        exception.url = URI('https://api.example.com/users')
                +        exception.request = Faraday::RequestOptions.new
                +        exception.response_headers = { 'content-type' => 'application/json' }
                +        exception.response_body = '{"error": "Internal server error"}'
                +        exception.request_headers = { 'authorization' => 'Bearer token123' }
                +        exception.request_body = '{"name": "John"}'
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 500 for POST https://api.example.com/users') }
                +    end
                +
                +    context 'with Faraday::Env missing status key' do
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception[:body] = 'error body'
                +        # Intentionally not setting status
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status  for  ') }
                +    end
                +
                +    context 'with Faraday::Env with direct method and url properties' do
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception.status = 404
                +        exception.method = :get
                +        exception.url = URI('http://example.com/test')
                +        exception[:body] = 'not found'
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for GET http://example.com/test') }
        spec/faraday/response/logger_spec.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/spec/faraday/response/logger_spec.rb	2026-02-09 22:17:35.439759712 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/spec/faraday/response/logger_spec.rb	2026-02-09 22:17:35.448759806 +0000
                @@ -23,0 +24 @@
                +        stubs.get('/8bit') { [200, { 'Content-Type' => 'text/html' }, (+'café!').force_encoding(Encoding::ASCII_8BIT)] }
                @@ -238,0 +240,5 @@
                +    end
                +
                +    it 'converts to UTF-8' do
                +      conn.get '/8bit'
                +      expect(string_io.string).to match(%(caf��!))
        spec/faraday/response/raise_error_spec.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/spec/faraday/response/raise_error_spec.rb	2026-02-09 22:17:35.439759712 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/spec/faraday/response/raise_error_spec.rb	2026-02-09 22:17:35.448759806 +0000
                @@ -16 +16 @@
                -        stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
                +        stub.get('unprocessable-content') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
                @@ -31 +31 @@
                -      expect(ex.message).to eq('the server responded with status 400')
                +      expect(ex.message).to eq('the server responded with status 400 for GET http:/bad-request')
                @@ -42 +42 @@
                -      expect(ex.message).to eq('the server responded with status 401')
                +      expect(ex.message).to eq('the server responded with status 401 for GET http:/unauthorized')
                @@ -53 +53 @@
                -      expect(ex.message).to eq('the server responded with status 403')
                +      expect(ex.message).to eq('the server responded with status 403 for GET http:/forbidden')
                @@ -64 +64 @@
                -      expect(ex.message).to eq('the server responded with status 404')
                +      expect(ex.message).to eq('the server responded with status 404 for GET http:/not-found')
                @@ -86 +86 @@
                -      expect(ex.message).to eq('the server responded with status 408')
                +      expect(ex.message).to eq('the server responded with status 408 for GET http:/request-timeout')
                @@ -97 +97 @@
                -      expect(ex.message).to eq('the server responded with status 409')
                +      expect(ex.message).to eq('the server responded with status 409 for GET http:/conflict')
                @@ -106,3 +106,14 @@
                -  it 'raises Faraday::UnprocessableEntityError for 422 responses' do
                -    expect { conn.get('unprocessable-entity') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
                -      expect(ex.message).to eq('the server responded with status 422')
                +  it 'raises legacy Faraday::UnprocessableEntityError for 422 responses' do
                +    expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
                +      expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
                +      expect(ex.response[:headers]['X-Reason']).to eq('because')
                +      expect(ex.response[:status]).to eq(422)
                +      expect(ex.response_status).to eq(422)
                +      expect(ex.response_body).to eq('keep looking')
                +      expect(ex.response_headers['X-Reason']).to eq('because')
                +    end
                +  end
                +
                +  it 'raises Faraday::UnprocessableContentError for 422 responses' do
                +    expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableContentError) do |ex|
                +      expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
                @@ -119 +130 @@
                -      expect(ex.message).to eq('the server responded with status 429')
                +      expect(ex.message).to eq('the server responded with status 429 for GET http:/too-many-requests')
                @@ -141 +152 @@
                -      expect(ex.message).to eq('the server responded with status 499')
                +      expect(ex.message).to eq('the server responded with status 499 for GET http:/4xx')
                @@ -152 +163 @@
                -      expect(ex.message).to eq('the server responded with status 500')
                +      expect(ex.message).to eq('the server responded with status 500 for GET http:/server-error')
        spec/faraday/response_spec.rb
                --- /tmp/d20260209-590-ga1dwr/faraday-2.13.1/spec/faraday/response_spec.rb	2026-02-09 22:17:35.439759712 +0000
                +++ /tmp/d20260209-590-ga1dwr/faraday-2.14.1/spec/faraday/response_spec.rb	2026-02-09 22:17:35.448759806 +0000
                @@ -15,0 +16 @@
                +  it { expect(subject.url).to eq(URI('https://lostisland.github.io/faraday')) }
                @@ -33,0 +35,6 @@
                +
                +    context 'when response is not finished' do
                +      subject { Faraday::Response.new.to_hash }
                +
                +      it { is_expected.to eq({ status: nil, body: nil, response_headers: {}, url: nil }) }
                +    end

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare faraday 2.13.1 2.14.1

Compared versions: ["2.13.1", "2.14.1"]
  DIFFERENT metadata:
    2.13.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.13.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
    2.14.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.14.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
  DIFFERENT rubygems_version:
    2.13.1: 3.6.7
    2.14.1: 3.6.9
  DIFFERENT version:
    2.13.1: 2.13.1
    2.14.1: 2.14.1
  DIFFERENT files:
    2.13.1->2.14.1:
      * Changed:
            lib/faraday.rb +2/-1
            lib/faraday/connection.rb +3/-2
            lib/faraday/encoders/flat_params_encoder.rb +2/-2
            lib/faraday/error.rb +42/-5
            lib/faraday/logging/formatter.rb +1/-1
            lib/faraday/rack_builder.rb +1/-5
            lib/faraday/response.rb +7/-3
            lib/faraday/response/raise_error.rb +1/-1
            lib/faraday/version.rb +1/-1
            spec/faraday/connection_spec.rb +33/-0
            spec/faraday/error_spec.rb +83/-1
            spec/faraday/response/logger_spec.rb +6/-0
            spec/faraday/response/raise_error_spec.rb +24/-13
            spec/faraday/response_spec.rb +7/-0

1 similar comment
@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare faraday 2.13.1 2.14.1

Compared versions: ["2.13.1", "2.14.1"]
  DIFFERENT metadata:
    2.13.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.13.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
    2.14.1: {"homepage_uri" => "https://lostisland.github.io/faraday", "changelog_uri" => "https://github.com/lostisland/faraday/releases/tag/v2.14.1", "source_code_uri" => "https://github.com/lostisland/faraday", "bug_tracker_uri" => "https://github.com/lostisland/faraday/issues", "rubygems_mfa_required" => "true"}
  DIFFERENT rubygems_version:
    2.13.1: 3.6.7
    2.14.1: 3.6.9
  DIFFERENT version:
    2.13.1: 2.13.1
    2.14.1: 2.14.1
  DIFFERENT files:
    2.13.1->2.14.1:
      * Changed:
            lib/faraday.rb +2/-1
            lib/faraday/connection.rb +3/-2
            lib/faraday/encoders/flat_params_encoder.rb +2/-2
            lib/faraday/error.rb +42/-5
            lib/faraday/logging/formatter.rb +1/-1
            lib/faraday/rack_builder.rb +1/-5
            lib/faraday/response.rb +7/-3
            lib/faraday/response/raise_error.rb +1/-1
            lib/faraday/version.rb +1/-1
            spec/faraday/connection_spec.rb +33/-0
            spec/faraday/error_spec.rb +83/-1
            spec/faraday/response/logger_spec.rb +6/-0
            spec/faraday/response/raise_error_spec.rb +24/-13
            spec/faraday/response_spec.rb +7/-0

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare faraday-net_http 3.4.1 3.4.2

Compared versions: ["3.4.1", "3.4.2"]
  DIFFERENT metadata:
    3.4.1: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.1", "rubygems_mfa_required" => "true"}
    3.4.2: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.2", "rubygems_mfa_required" => "true"}
  DIFFERENT version:
    3.4.1: 3.4.1
    3.4.2: 3.4.2
  DIFFERENT files:
    3.4.1->3.4.2:
      * Changed:
            lib/faraday/net_http/version.rb +1/-1
  DIFFERENT runtime dependencies:
    3.4.1->3.4.2:
      * Updated:
            net-http from: [">= 0.5.0"] to: ["~> 0.5"]

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff faraday 2.13.1 2.14.1

Compared versions: ["2.13.1", "2.14.1"]
  DIFFERENT files:
    2.13.1->2.14.1:
      * Changed:
        lib/faraday.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday.rb	2026-02-09 22:17:47.838920746 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday.rb	2026-02-09 22:17:47.847920747 +0000
                @@ -3 +3,2 @@
                -require 'cgi'
                +require 'cgi/escape'
                +require 'cgi/util' if RUBY_VERSION < '3.5'
        lib/faraday/connection.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/connection.rb	2026-02-09 22:17:47.838920746 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/connection.rb	2026-02-09 22:17:47.848920748 +0000
                @@ -484,2 +484,3 @@
                -      # Ensure relative url will be parsed correctly (such as `service:search` )
                -      url = "./#{url}" if url.respond_to?(:start_with?) && !url.start_with?('http://', 'https://', '/', './', '../')
                +      # Ensure relative url will be parsed correctly (such as `service:search` or `//evil.com`)
                +      url = "./#{url}" if url.respond_to?(:start_with?) &&
                +                          (!url.start_with?('http://', 'https://', '/', './', '../') || url.start_with?('//'))
        lib/faraday/encoders/flat_params_encoder.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/encoders/flat_params_encoder.rb	2026-02-09 22:17:47.838920746 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/encoders/flat_params_encoder.rb	2026-02-09 22:17:47.848920748 +0000
                @@ -79 +79 @@
                -      split_query = (query.split('&').map do |pair|
                +      split_query = query.split('&').filter_map do |pair|
                @@ -81 +81 @@
                -      end).compact
                +      end
        lib/faraday/error.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/error.rb	2026-02-09 22:17:47.839920746 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/error.rb	2026-02-09 22:17:47.848920748 +0000
                @@ -82 +82,25 @@
                -      return [exc, exc.message, response] if exc.respond_to?(:backtrace)
                +      case exc
                +      when Exception
                +        [exc, exc.message, response]
                +      when Hash
                +        [nil, build_error_message_from_hash(exc), exc]
                +      when Faraday::Env
                +        [nil, build_error_message_from_env(exc), exc]
                +      else
                +        [nil, exc.to_s, response]
                +      end
                +    end
                +
                +    private
                +
                +    def build_error_message_from_hash(hash)
                +      # Be defensive with external Hash objects - they might be missing keys
                +      status = hash.fetch(:status, nil)
                +      request = hash.fetch(:request, nil)
                +
                +      return fallback_error_message(status) if request.nil?
                +
                +      method = request.fetch(:method, nil)
                +      url = request.fetch(:url, nil)
                +      build_status_error_message(status, method, url)
                +    end
                @@ -84,2 +108,10 @@
                -      return [nil, "the server responded with status #{exc[:status]}", exc] \
                -        if exc.respond_to?(:each_key)
                +    def build_error_message_from_env(env)
                +      # Faraday::Env is internal - we can make reasonable assumptions about its structure
                +      build_status_error_message(env.status, env.method, env.url)
                +    end
                +
                +    def build_status_error_message(status, method, url)
                +      method_str = method ? method.to_s.upcase : ''
                +      url_str = url ? url.to_s : ''
                +      "the server responded with status #{status} for #{method_str} #{url_str}"
                +    end
                @@ -87 +119,3 @@
                -      [nil, exc.to_s, response]
                +    def fallback_error_message(status)
                +      "the server responded with status #{status} - method and url are not available " \
                +        'due to include_request: false on Faraday::Response::RaiseError middleware'
                @@ -124 +158 @@
                -  class UnprocessableEntityError < ClientError
                +  class UnprocessableContentError < ClientError
                @@ -125,0 +160,3 @@
                +
                +  # Used to provide compatibility with legacy error name.
                +  UnprocessableEntityError = UnprocessableContentError
        lib/faraday/logging/formatter.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/logging/formatter.rb	2026-02-09 22:17:47.839920746 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/logging/formatter.rb	2026-02-09 22:17:47.848920748 +0000
                @@ -66 +66 @@
                -          body.to_str
                +          body.to_str.encode(::Encoding::UTF_8, undef: :replace, invalid: :replace)
        lib/faraday/rack_builder.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/rack_builder.rb	2026-02-09 22:17:47.840920746 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/rack_builder.rb	2026-02-09 22:17:47.849920748 +0000
                @@ -224 +224 @@
                -      return unless is_adapter?(klass)
                +      return unless klass <= Faraday::Adapter
                @@ -235,4 +234,0 @@
                -    end
                -
                -    def is_adapter?(klass) # rubocop:disable Naming/PredicateName
                -      klass <= Faraday::Adapter
        lib/faraday/response.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/response.rb	2026-02-09 22:17:47.841920746 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/response.rb	2026-02-09 22:17:47.850920748 +0000
                @@ -35,0 +36,4 @@
                +    def url
                +      finished? ? env.url : nil
                +    end
                +
                @@ -63,3 +67,3 @@
                -        status: env.status, body: env.body,
                -        response_headers: env.response_headers,
                -        url: env.url
                +        status: status, body: body,
                +        response_headers: headers,
                +        url: url
        lib/faraday/response/raise_error.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/response/raise_error.rb	2026-02-09 22:17:47.841920746 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/response/raise_error.rb	2026-02-09 22:17:47.850920748 +0000
                @@ -18 +18 @@
                -        422 => Faraday::UnprocessableEntityError,
                +        422 => Faraday::UnprocessableContentError,
        lib/faraday/version.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/lib/faraday/version.rb	2026-02-09 22:17:47.842920746 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/lib/faraday/version.rb	2026-02-09 22:17:47.851920748 +0000
                @@ -4 +4 @@
                -  VERSION = '2.13.1'
                +  VERSION = '2.14.1'
        spec/faraday/connection_spec.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/spec/faraday/connection_spec.rb	2026-02-09 22:17:47.842920746 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/spec/faraday/connection_spec.rb	2026-02-09 22:17:47.851920748 +0000
                @@ -313,0 +314,33 @@
                +    context 'with protocol-relative URL (GHSA-33mh-2634-fwr2)' do
                +      it 'does not allow host override with //evil.com/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//evil.com/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with //evil.com:8080/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//evil.com:8080/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with //user:pass@evil.com/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//user:pass@evil.com/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with ///evil.com' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('///evil.com')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'still allows single-slash absolute paths' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('/safe/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +        expect(uri.path).to eq('/safe/path')
                +      end
                +    end
                +
        spec/faraday/error_spec.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/spec/faraday/error_spec.rb	2026-02-09 22:17:47.843920747 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/spec/faraday/error_spec.rb	2026-02-09 22:17:47.851920748 +0000
                @@ -26 +26 @@
                -      it { expect(subject.message).to eq('the server responded with status 400') }
                +      it { expect(subject.message).to eq('the server responded with status 400 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                @@ -90,0 +91,82 @@
                +    end
                +
                +    context 'with hash missing status key' do
                +      let(:exception) { { body: 'error body' } }
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status  - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                +    end
                +
                +    context 'with hash with status but missing request data' do
                +      let(:exception) { { status: 404, body: 'not found' } } # missing request key
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                +    end
                +
                +    context 'with hash with status and request but missing method in request' do
                +      let(:exception) { { status: 404, body: 'not found', request: { url: 'http://example.com/test' } } } # missing method
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for  http://example.com/test') }
                +    end
                +
                +    context 'with hash with status and request but missing url in request' do
                +      let(:exception) { { status: 404, body: 'not found', request: { method: :get } } } # missing url
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for GET ') }
                +    end
                +
                +    context 'with properly formed Faraday::Env' do
                +      # This represents the normal case - a well-formed Faraday::Env object
                +      # with all the standard properties populated as they would be during
                +      # a typical HTTP request/response cycle
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception.status = 500
                +        exception.method = :post
                +        exception.url = URI('https://api.example.com/users')
                +        exception.request = Faraday::RequestOptions.new
                +        exception.response_headers = { 'content-type' => 'application/json' }
                +        exception.response_body = '{"error": "Internal server error"}'
                +        exception.request_headers = { 'authorization' => 'Bearer token123' }
                +        exception.request_body = '{"name": "John"}'
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 500 for POST https://api.example.com/users') }
                +    end
                +
                +    context 'with Faraday::Env missing status key' do
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception[:body] = 'error body'
                +        # Intentionally not setting status
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status  for  ') }
                +    end
                +
                +    context 'with Faraday::Env with direct method and url properties' do
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception.status = 404
                +        exception.method = :get
                +        exception.url = URI('http://example.com/test')
                +        exception[:body] = 'not found'
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for GET http://example.com/test') }
        spec/faraday/response/logger_spec.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/spec/faraday/response/logger_spec.rb	2026-02-09 22:17:47.844920747 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/spec/faraday/response/logger_spec.rb	2026-02-09 22:17:47.853920749 +0000
                @@ -23,0 +24 @@
                +        stubs.get('/8bit') { [200, { 'Content-Type' => 'text/html' }, (+'café!').force_encoding(Encoding::ASCII_8BIT)] }
                @@ -238,0 +240,5 @@
                +    end
                +
                +    it 'converts to UTF-8' do
                +      conn.get '/8bit'
                +      expect(string_io.string).to match(%(caf��!))
        spec/faraday/response/raise_error_spec.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/spec/faraday/response/raise_error_spec.rb	2026-02-09 22:17:47.844920747 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/spec/faraday/response/raise_error_spec.rb	2026-02-09 22:17:47.853920749 +0000
                @@ -16 +16 @@
                -        stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
                +        stub.get('unprocessable-content') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
                @@ -31 +31 @@
                -      expect(ex.message).to eq('the server responded with status 400')
                +      expect(ex.message).to eq('the server responded with status 400 for GET http:/bad-request')
                @@ -42 +42 @@
                -      expect(ex.message).to eq('the server responded with status 401')
                +      expect(ex.message).to eq('the server responded with status 401 for GET http:/unauthorized')
                @@ -53 +53 @@
                -      expect(ex.message).to eq('the server responded with status 403')
                +      expect(ex.message).to eq('the server responded with status 403 for GET http:/forbidden')
                @@ -64 +64 @@
                -      expect(ex.message).to eq('the server responded with status 404')
                +      expect(ex.message).to eq('the server responded with status 404 for GET http:/not-found')
                @@ -86 +86 @@
                -      expect(ex.message).to eq('the server responded with status 408')
                +      expect(ex.message).to eq('the server responded with status 408 for GET http:/request-timeout')
                @@ -97 +97 @@
                -      expect(ex.message).to eq('the server responded with status 409')
                +      expect(ex.message).to eq('the server responded with status 409 for GET http:/conflict')
                @@ -106,3 +106,14 @@
                -  it 'raises Faraday::UnprocessableEntityError for 422 responses' do
                -    expect { conn.get('unprocessable-entity') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
                -      expect(ex.message).to eq('the server responded with status 422')
                +  it 'raises legacy Faraday::UnprocessableEntityError for 422 responses' do
                +    expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
                +      expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
                +      expect(ex.response[:headers]['X-Reason']).to eq('because')
                +      expect(ex.response[:status]).to eq(422)
                +      expect(ex.response_status).to eq(422)
                +      expect(ex.response_body).to eq('keep looking')
                +      expect(ex.response_headers['X-Reason']).to eq('because')
                +    end
                +  end
                +
                +  it 'raises Faraday::UnprocessableContentError for 422 responses' do
                +    expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableContentError) do |ex|
                +      expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
                @@ -119 +130 @@
                -      expect(ex.message).to eq('the server responded with status 429')
                +      expect(ex.message).to eq('the server responded with status 429 for GET http:/too-many-requests')
                @@ -141 +152 @@
                -      expect(ex.message).to eq('the server responded with status 499')
                +      expect(ex.message).to eq('the server responded with status 499 for GET http:/4xx')
                @@ -152 +163 @@
                -      expect(ex.message).to eq('the server responded with status 500')
                +      expect(ex.message).to eq('the server responded with status 500 for GET http:/server-error')
        spec/faraday/response_spec.rb
                --- /tmp/d20260209-595-noxpmo/faraday-2.13.1/spec/faraday/response_spec.rb	2026-02-09 22:17:47.844920747 +0000
                +++ /tmp/d20260209-595-noxpmo/faraday-2.14.1/spec/faraday/response_spec.rb	2026-02-09 22:17:47.854920749 +0000
                @@ -15,0 +16 @@
                +  it { expect(subject.url).to eq(URI('https://lostisland.github.io/faraday')) }
                @@ -33,0 +35,6 @@
                +
                +    context 'when response is not finished' do
                +      subject { Faraday::Response.new.to_hash }
                +
                +      it { is_expected.to eq({ status: nil, body: nil, response_headers: {}, url: nil }) }
                +    end

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare faraday-net_http 3.4.1 3.4.2

Compared versions: ["3.4.1", "3.4.2"]
  DIFFERENT metadata:
    3.4.1: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.1", "rubygems_mfa_required" => "true"}
    3.4.2: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.2", "rubygems_mfa_required" => "true"}
  DIFFERENT version:
    3.4.1: 3.4.1
    3.4.2: 3.4.2
  DIFFERENT files:
    3.4.1->3.4.2:
      * Changed:
            lib/faraday/net_http/version.rb +1/-1
  DIFFERENT runtime dependencies:
    3.4.1->3.4.2:
      * Updated:
            net-http from: [">= 0.5.0"] to: ["~> 0.5"]

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff faraday 2.13.1 2.14.1

Compared versions: ["2.13.1", "2.14.1"]
  DIFFERENT files:
    2.13.1->2.14.1:
      * Changed:
        lib/faraday.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday.rb	2026-02-09 22:17:50.536074188 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday.rb	2026-02-09 22:17:50.545074235 +0000
                @@ -3 +3,2 @@
                -require 'cgi'
                +require 'cgi/escape'
                +require 'cgi/util' if RUBY_VERSION < '3.5'
        lib/faraday/connection.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/connection.rb	2026-02-09 22:17:50.537074193 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/connection.rb	2026-02-09 22:17:50.546074240 +0000
                @@ -484,2 +484,3 @@
                -      # Ensure relative url will be parsed correctly (such as `service:search` )
                -      url = "./#{url}" if url.respond_to?(:start_with?) && !url.start_with?('http://', 'https://', '/', './', '../')
                +      # Ensure relative url will be parsed correctly (such as `service:search` or `//evil.com`)
                +      url = "./#{url}" if url.respond_to?(:start_with?) &&
                +                          (!url.start_with?('http://', 'https://', '/', './', '../') || url.start_with?('//'))
        lib/faraday/encoders/flat_params_encoder.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/encoders/flat_params_encoder.rb	2026-02-09 22:17:50.537074193 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/encoders/flat_params_encoder.rb	2026-02-09 22:17:50.546074240 +0000
                @@ -79 +79 @@
                -      split_query = (query.split('&').map do |pair|
                +      split_query = query.split('&').filter_map do |pair|
                @@ -81 +81 @@
                -      end).compact
                +      end
        lib/faraday/error.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/error.rb	2026-02-09 22:17:50.537074193 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/error.rb	2026-02-09 22:17:50.546074240 +0000
                @@ -82 +82,25 @@
                -      return [exc, exc.message, response] if exc.respond_to?(:backtrace)
                +      case exc
                +      when Exception
                +        [exc, exc.message, response]
                +      when Hash
                +        [nil, build_error_message_from_hash(exc), exc]
                +      when Faraday::Env
                +        [nil, build_error_message_from_env(exc), exc]
                +      else
                +        [nil, exc.to_s, response]
                +      end
                +    end
                +
                +    private
                +
                +    def build_error_message_from_hash(hash)
                +      # Be defensive with external Hash objects - they might be missing keys
                +      status = hash.fetch(:status, nil)
                +      request = hash.fetch(:request, nil)
                +
                +      return fallback_error_message(status) if request.nil?
                +
                +      method = request.fetch(:method, nil)
                +      url = request.fetch(:url, nil)
                +      build_status_error_message(status, method, url)
                +    end
                @@ -84,2 +108,10 @@
                -      return [nil, "the server responded with status #{exc[:status]}", exc] \
                -        if exc.respond_to?(:each_key)
                +    def build_error_message_from_env(env)
                +      # Faraday::Env is internal - we can make reasonable assumptions about its structure
                +      build_status_error_message(env.status, env.method, env.url)
                +    end
                +
                +    def build_status_error_message(status, method, url)
                +      method_str = method ? method.to_s.upcase : ''
                +      url_str = url ? url.to_s : ''
                +      "the server responded with status #{status} for #{method_str} #{url_str}"
                +    end
                @@ -87 +119,3 @@
                -      [nil, exc.to_s, response]
                +    def fallback_error_message(status)
                +      "the server responded with status #{status} - method and url are not available " \
                +        'due to include_request: false on Faraday::Response::RaiseError middleware'
                @@ -124 +158 @@
                -  class UnprocessableEntityError < ClientError
                +  class UnprocessableContentError < ClientError
                @@ -125,0 +160,3 @@
                +
                +  # Used to provide compatibility with legacy error name.
                +  UnprocessableEntityError = UnprocessableContentError
        lib/faraday/logging/formatter.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/logging/formatter.rb	2026-02-09 22:17:50.537074193 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/logging/formatter.rb	2026-02-09 22:17:50.546074240 +0000
                @@ -66 +66 @@
                -          body.to_str
                +          body.to_str.encode(::Encoding::UTF_8, undef: :replace, invalid: :replace)
        lib/faraday/rack_builder.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/rack_builder.rb	2026-02-09 22:17:50.538074199 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/rack_builder.rb	2026-02-09 22:17:50.547074245 +0000
                @@ -224 +224 @@
                -      return unless is_adapter?(klass)
                +      return unless klass <= Faraday::Adapter
                @@ -235,4 +234,0 @@
                -    end
                -
                -    def is_adapter?(klass) # rubocop:disable Naming/PredicateName
                -      klass <= Faraday::Adapter
        lib/faraday/response.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/response.rb	2026-02-09 22:17:50.540074209 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/response.rb	2026-02-09 22:17:50.548074250 +0000
                @@ -35,0 +36,4 @@
                +    def url
                +      finished? ? env.url : nil
                +    end
                +
                @@ -63,3 +67,3 @@
                -        status: env.status, body: env.body,
                -        response_headers: env.response_headers,
                -        url: env.url
                +        status: status, body: body,
                +        response_headers: headers,
                +        url: url
        lib/faraday/response/raise_error.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/response/raise_error.rb	2026-02-09 22:17:50.540074209 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/response/raise_error.rb	2026-02-09 22:17:50.548074250 +0000
                @@ -18 +18 @@
                -        422 => Faraday::UnprocessableEntityError,
                +        422 => Faraday::UnprocessableContentError,
        lib/faraday/version.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/lib/faraday/version.rb	2026-02-09 22:17:50.540074209 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/lib/faraday/version.rb	2026-02-09 22:17:50.549074256 +0000
                @@ -4 +4 @@
                -  VERSION = '2.13.1'
                +  VERSION = '2.14.1'
        spec/faraday/connection_spec.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/spec/faraday/connection_spec.rb	2026-02-09 22:17:50.541074214 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/spec/faraday/connection_spec.rb	2026-02-09 22:17:50.549074256 +0000
                @@ -313,0 +314,33 @@
                +    context 'with protocol-relative URL (GHSA-33mh-2634-fwr2)' do
                +      it 'does not allow host override with //evil.com/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//evil.com/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with //evil.com:8080/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//evil.com:8080/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with //user:pass@evil.com/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//user:pass@evil.com/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with ///evil.com' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('///evil.com')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'still allows single-slash absolute paths' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('/safe/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +        expect(uri.path).to eq('/safe/path')
                +      end
                +    end
                +
        spec/faraday/error_spec.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/spec/faraday/error_spec.rb	2026-02-09 22:17:50.541074214 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/spec/faraday/error_spec.rb	2026-02-09 22:17:50.550074261 +0000
                @@ -26 +26 @@
                -      it { expect(subject.message).to eq('the server responded with status 400') }
                +      it { expect(subject.message).to eq('the server responded with status 400 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                @@ -90,0 +91,82 @@
                +    end
                +
                +    context 'with hash missing status key' do
                +      let(:exception) { { body: 'error body' } }
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status  - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                +    end
                +
                +    context 'with hash with status but missing request data' do
                +      let(:exception) { { status: 404, body: 'not found' } } # missing request key
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                +    end
                +
                +    context 'with hash with status and request but missing method in request' do
                +      let(:exception) { { status: 404, body: 'not found', request: { url: 'http://example.com/test' } } } # missing method
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for  http://example.com/test') }
                +    end
                +
                +    context 'with hash with status and request but missing url in request' do
                +      let(:exception) { { status: 404, body: 'not found', request: { method: :get } } } # missing url
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for GET ') }
                +    end
                +
                +    context 'with properly formed Faraday::Env' do
                +      # This represents the normal case - a well-formed Faraday::Env object
                +      # with all the standard properties populated as they would be during
                +      # a typical HTTP request/response cycle
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception.status = 500
                +        exception.method = :post
                +        exception.url = URI('https://api.example.com/users')
                +        exception.request = Faraday::RequestOptions.new
                +        exception.response_headers = { 'content-type' => 'application/json' }
                +        exception.response_body = '{"error": "Internal server error"}'
                +        exception.request_headers = { 'authorization' => 'Bearer token123' }
                +        exception.request_body = '{"name": "John"}'
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 500 for POST https://api.example.com/users') }
                +    end
                +
                +    context 'with Faraday::Env missing status key' do
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception[:body] = 'error body'
                +        # Intentionally not setting status
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status  for  ') }
                +    end
                +
                +    context 'with Faraday::Env with direct method and url properties' do
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception.status = 404
                +        exception.method = :get
                +        exception.url = URI('http://example.com/test')
                +        exception[:body] = 'not found'
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for GET http://example.com/test') }
        spec/faraday/response/logger_spec.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/spec/faraday/response/logger_spec.rb	2026-02-09 22:17:50.543074225 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/spec/faraday/response/logger_spec.rb	2026-02-09 22:17:50.551074266 +0000
                @@ -23,0 +24 @@
                +        stubs.get('/8bit') { [200, { 'Content-Type' => 'text/html' }, (+'café!').force_encoding(Encoding::ASCII_8BIT)] }
                @@ -238,0 +240,5 @@
                +    end
                +
                +    it 'converts to UTF-8' do
                +      conn.get '/8bit'
                +      expect(string_io.string).to match(%(caf��!))
        spec/faraday/response/raise_error_spec.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/spec/faraday/response/raise_error_spec.rb	2026-02-09 22:17:50.543074225 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/spec/faraday/response/raise_error_spec.rb	2026-02-09 22:17:50.551074266 +0000
                @@ -16 +16 @@
                -        stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
                +        stub.get('unprocessable-content') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
                @@ -31 +31 @@
                -      expect(ex.message).to eq('the server responded with status 400')
                +      expect(ex.message).to eq('the server responded with status 400 for GET http:/bad-request')
                @@ -42 +42 @@
                -      expect(ex.message).to eq('the server responded with status 401')
                +      expect(ex.message).to eq('the server responded with status 401 for GET http:/unauthorized')
                @@ -53 +53 @@
                -      expect(ex.message).to eq('the server responded with status 403')
                +      expect(ex.message).to eq('the server responded with status 403 for GET http:/forbidden')
                @@ -64 +64 @@
                -      expect(ex.message).to eq('the server responded with status 404')
                +      expect(ex.message).to eq('the server responded with status 404 for GET http:/not-found')
                @@ -86 +86 @@
                -      expect(ex.message).to eq('the server responded with status 408')
                +      expect(ex.message).to eq('the server responded with status 408 for GET http:/request-timeout')
                @@ -97 +97 @@
                -      expect(ex.message).to eq('the server responded with status 409')
                +      expect(ex.message).to eq('the server responded with status 409 for GET http:/conflict')
                @@ -106,3 +106,14 @@
                -  it 'raises Faraday::UnprocessableEntityError for 422 responses' do
                -    expect { conn.get('unprocessable-entity') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
                -      expect(ex.message).to eq('the server responded with status 422')
                +  it 'raises legacy Faraday::UnprocessableEntityError for 422 responses' do
                +    expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
                +      expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
                +      expect(ex.response[:headers]['X-Reason']).to eq('because')
                +      expect(ex.response[:status]).to eq(422)
                +      expect(ex.response_status).to eq(422)
                +      expect(ex.response_body).to eq('keep looking')
                +      expect(ex.response_headers['X-Reason']).to eq('because')
                +    end
                +  end
                +
                +  it 'raises Faraday::UnprocessableContentError for 422 responses' do
                +    expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableContentError) do |ex|
                +      expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
                @@ -119 +130 @@
                -      expect(ex.message).to eq('the server responded with status 429')
                +      expect(ex.message).to eq('the server responded with status 429 for GET http:/too-many-requests')
                @@ -141 +152 @@
                -      expect(ex.message).to eq('the server responded with status 499')
                +      expect(ex.message).to eq('the server responded with status 499 for GET http:/4xx')
                @@ -152 +163 @@
                -      expect(ex.message).to eq('the server responded with status 500')
                +      expect(ex.message).to eq('the server responded with status 500 for GET http:/server-error')
        spec/faraday/response_spec.rb
                --- /tmp/d20260209-618-1ldtrm/faraday-2.13.1/spec/faraday/response_spec.rb	2026-02-09 22:17:50.543074225 +0000
                +++ /tmp/d20260209-618-1ldtrm/faraday-2.14.1/spec/faraday/response_spec.rb	2026-02-09 22:17:50.551074266 +0000
                @@ -15,0 +16 @@
                +  it { expect(subject.url).to eq(URI('https://lostisland.github.io/faraday')) }
                @@ -33,0 +35,6 @@
                +
                +    context 'when response is not finished' do
                +      subject { Faraday::Response.new.to_hash }
                +
                +      it { is_expected.to eq({ status: nil, body: nil, response_headers: {}, url: nil }) }
                +    end

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff faraday 2.13.1 2.14.1

Compared versions: ["2.13.1", "2.14.1"]
  DIFFERENT files:
    2.13.1->2.14.1:
      * Changed:
        lib/faraday.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday.rb	2026-02-09 22:17:51.849963539 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday.rb	2026-02-09 22:17:51.865963568 +0000
                @@ -3 +3,2 @@
                -require 'cgi'
                +require 'cgi/escape'
                +require 'cgi/util' if RUBY_VERSION < '3.5'
        lib/faraday/connection.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/connection.rb	2026-02-09 22:17:51.850963541 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/connection.rb	2026-02-09 22:17:51.868963574 +0000
                @@ -484,2 +484,3 @@
                -      # Ensure relative url will be parsed correctly (such as `service:search` )
                -      url = "./#{url}" if url.respond_to?(:start_with?) && !url.start_with?('http://', 'https://', '/', './', '../')
                +      # Ensure relative url will be parsed correctly (such as `service:search` or `//evil.com`)
                +      url = "./#{url}" if url.respond_to?(:start_with?) &&
                +                          (!url.start_with?('http://', 'https://', '/', './', '../') || url.start_with?('//'))
        lib/faraday/encoders/flat_params_encoder.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/encoders/flat_params_encoder.rb	2026-02-09 22:17:51.850963541 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/encoders/flat_params_encoder.rb	2026-02-09 22:17:51.868963574 +0000
                @@ -79 +79 @@
                -      split_query = (query.split('&').map do |pair|
                +      split_query = query.split('&').filter_map do |pair|
                @@ -81 +81 @@
                -      end).compact
                +      end
        lib/faraday/error.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/error.rb	2026-02-09 22:17:51.850963541 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/error.rb	2026-02-09 22:17:51.870963577 +0000
                @@ -82 +82,25 @@
                -      return [exc, exc.message, response] if exc.respond_to?(:backtrace)
                +      case exc
                +      when Exception
                +        [exc, exc.message, response]
                +      when Hash
                +        [nil, build_error_message_from_hash(exc), exc]
                +      when Faraday::Env
                +        [nil, build_error_message_from_env(exc), exc]
                +      else
                +        [nil, exc.to_s, response]
                +      end
                +    end
                +
                +    private
                +
                +    def build_error_message_from_hash(hash)
                +      # Be defensive with external Hash objects - they might be missing keys
                +      status = hash.fetch(:status, nil)
                +      request = hash.fetch(:request, nil)
                +
                +      return fallback_error_message(status) if request.nil?
                +
                +      method = request.fetch(:method, nil)
                +      url = request.fetch(:url, nil)
                +      build_status_error_message(status, method, url)
                +    end
                @@ -84,2 +108,10 @@
                -      return [nil, "the server responded with status #{exc[:status]}", exc] \
                -        if exc.respond_to?(:each_key)
                +    def build_error_message_from_env(env)
                +      # Faraday::Env is internal - we can make reasonable assumptions about its structure
                +      build_status_error_message(env.status, env.method, env.url)
                +    end
                +
                +    def build_status_error_message(status, method, url)
                +      method_str = method ? method.to_s.upcase : ''
                +      url_str = url ? url.to_s : ''
                +      "the server responded with status #{status} for #{method_str} #{url_str}"
                +    end
                @@ -87 +119,3 @@
                -      [nil, exc.to_s, response]
                +    def fallback_error_message(status)
                +      "the server responded with status #{status} - method and url are not available " \
                +        'due to include_request: false on Faraday::Response::RaiseError middleware'
                @@ -124 +158 @@
                -  class UnprocessableEntityError < ClientError
                +  class UnprocessableContentError < ClientError
                @@ -125,0 +160,3 @@
                +
                +  # Used to provide compatibility with legacy error name.
                +  UnprocessableEntityError = UnprocessableContentError
        lib/faraday/logging/formatter.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/logging/formatter.rb	2026-02-09 22:17:51.852963544 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/logging/formatter.rb	2026-02-09 22:17:51.870963577 +0000
                @@ -66 +66 @@
                -          body.to_str
                +          body.to_str.encode(::Encoding::UTF_8, undef: :replace, invalid: :replace)
        lib/faraday/rack_builder.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/rack_builder.rb	2026-02-09 22:17:51.855963550 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/rack_builder.rb	2026-02-09 22:17:51.872963581 +0000
                @@ -224 +224 @@
                -      return unless is_adapter?(klass)
                +      return unless klass <= Faraday::Adapter
                @@ -235,4 +234,0 @@
                -    end
                -
                -    def is_adapter?(klass) # rubocop:disable Naming/PredicateName
                -      klass <= Faraday::Adapter
        lib/faraday/response.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/response.rb	2026-02-09 22:17:51.856963552 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/response.rb	2026-02-09 22:17:51.875963587 +0000
                @@ -35,0 +36,4 @@
                +    def url
                +      finished? ? env.url : nil
                +    end
                +
                @@ -63,3 +67,3 @@
                -        status: env.status, body: env.body,
                -        response_headers: env.response_headers,
                -        url: env.url
                +        status: status, body: body,
                +        response_headers: headers,
                +        url: url
        lib/faraday/response/raise_error.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/response/raise_error.rb	2026-02-09 22:17:51.857963554 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/response/raise_error.rb	2026-02-09 22:17:51.875963587 +0000
                @@ -18 +18 @@
                -        422 => Faraday::UnprocessableEntityError,
                +        422 => Faraday::UnprocessableContentError,
        lib/faraday/version.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/lib/faraday/version.rb	2026-02-09 22:17:51.857963554 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/lib/faraday/version.rb	2026-02-09 22:17:51.876963589 +0000
                @@ -4 +4 @@
                -  VERSION = '2.13.1'
                +  VERSION = '2.14.1'
        spec/faraday/connection_spec.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/spec/faraday/connection_spec.rb	2026-02-09 22:17:51.859963557 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/spec/faraday/connection_spec.rb	2026-02-09 22:17:51.877963590 +0000
                @@ -313,0 +314,33 @@
                +    context 'with protocol-relative URL (GHSA-33mh-2634-fwr2)' do
                +      it 'does not allow host override with //evil.com/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//evil.com/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with //evil.com:8080/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//evil.com:8080/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with //user:pass@evil.com/path' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('//user:pass@evil.com/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'does not allow host override with ///evil.com' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('///evil.com')
                +        expect(uri.host).to eq('httpbingo.org')
                +      end
                +
                +      it 'still allows single-slash absolute paths' do
                +        conn.url_prefix = 'http://httpbingo.org/api'
                +        uri = conn.build_exclusive_url('/safe/path')
                +        expect(uri.host).to eq('httpbingo.org')
                +        expect(uri.path).to eq('/safe/path')
                +      end
                +    end
                +
        spec/faraday/error_spec.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/spec/faraday/error_spec.rb	2026-02-09 22:17:51.859963557 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/spec/faraday/error_spec.rb	2026-02-09 22:17:51.877963590 +0000
                @@ -26 +26 @@
                -      it { expect(subject.message).to eq('the server responded with status 400') }
                +      it { expect(subject.message).to eq('the server responded with status 400 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                @@ -90,0 +91,82 @@
                +    end
                +
                +    context 'with hash missing status key' do
                +      let(:exception) { { body: 'error body' } }
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status  - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                +    end
                +
                +    context 'with hash with status but missing request data' do
                +      let(:exception) { { status: 404, body: 'not found' } } # missing request key
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 - method and url are not available due to include_request: false on Faraday::Response::RaiseError middleware') }
                +    end
                +
                +    context 'with hash with status and request but missing method in request' do
                +      let(:exception) { { status: 404, body: 'not found', request: { url: 'http://example.com/test' } } } # missing method
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for  http://example.com/test') }
                +    end
                +
                +    context 'with hash with status and request but missing url in request' do
                +      let(:exception) { { status: 404, body: 'not found', request: { method: :get } } } # missing url
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for GET ') }
                +    end
                +
                +    context 'with properly formed Faraday::Env' do
                +      # This represents the normal case - a well-formed Faraday::Env object
                +      # with all the standard properties populated as they would be during
                +      # a typical HTTP request/response cycle
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception.status = 500
                +        exception.method = :post
                +        exception.url = URI('https://api.example.com/users')
                +        exception.request = Faraday::RequestOptions.new
                +        exception.response_headers = { 'content-type' => 'application/json' }
                +        exception.response_body = '{"error": "Internal server error"}'
                +        exception.request_headers = { 'authorization' => 'Bearer token123' }
                +        exception.request_body = '{"name": "John"}'
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 500 for POST https://api.example.com/users') }
                +    end
                +
                +    context 'with Faraday::Env missing status key' do
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception[:body] = 'error body'
                +        # Intentionally not setting status
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status  for  ') }
                +    end
                +
                +    context 'with Faraday::Env with direct method and url properties' do
                +      let(:exception) { Faraday::Env.new }
                +
                +      before do
                +        exception.status = 404
                +        exception.method = :get
                +        exception.url = URI('http://example.com/test')
                +        exception[:body] = 'not found'
                +      end
                +
                +      it { expect(subject.wrapped_exception).to be_nil }
                +      it { expect(subject.response).to eq(exception) }
                +      it { expect(subject.message).to eq('the server responded with status 404 for GET http://example.com/test') }
        spec/faraday/response/logger_spec.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/spec/faraday/response/logger_spec.rb	2026-02-09 22:17:51.861963561 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/spec/faraday/response/logger_spec.rb	2026-02-09 22:17:51.882963600 +0000
                @@ -23,0 +24 @@
                +        stubs.get('/8bit') { [200, { 'Content-Type' => 'text/html' }, (+'café!').force_encoding(Encoding::ASCII_8BIT)] }
                @@ -238,0 +240,5 @@
                +    end
                +
                +    it 'converts to UTF-8' do
                +      conn.get '/8bit'
                +      expect(string_io.string).to match(%(caf��!))
        spec/faraday/response/raise_error_spec.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/spec/faraday/response/raise_error_spec.rb	2026-02-09 22:17:51.861963561 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/spec/faraday/response/raise_error_spec.rb	2026-02-09 22:17:51.882963600 +0000
                @@ -16 +16 @@
                -        stub.get('unprocessable-entity') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
                +        stub.get('unprocessable-content') { [422, { 'X-Reason' => 'because' }, 'keep looking'] }
                @@ -31 +31 @@
                -      expect(ex.message).to eq('the server responded with status 400')
                +      expect(ex.message).to eq('the server responded with status 400 for GET http:/bad-request')
                @@ -42 +42 @@
                -      expect(ex.message).to eq('the server responded with status 401')
                +      expect(ex.message).to eq('the server responded with status 401 for GET http:/unauthorized')
                @@ -53 +53 @@
                -      expect(ex.message).to eq('the server responded with status 403')
                +      expect(ex.message).to eq('the server responded with status 403 for GET http:/forbidden')
                @@ -64 +64 @@
                -      expect(ex.message).to eq('the server responded with status 404')
                +      expect(ex.message).to eq('the server responded with status 404 for GET http:/not-found')
                @@ -86 +86 @@
                -      expect(ex.message).to eq('the server responded with status 408')
                +      expect(ex.message).to eq('the server responded with status 408 for GET http:/request-timeout')
                @@ -97 +97 @@
                -      expect(ex.message).to eq('the server responded with status 409')
                +      expect(ex.message).to eq('the server responded with status 409 for GET http:/conflict')
                @@ -106,3 +106,14 @@
                -  it 'raises Faraday::UnprocessableEntityError for 422 responses' do
                -    expect { conn.get('unprocessable-entity') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
                -      expect(ex.message).to eq('the server responded with status 422')
                +  it 'raises legacy Faraday::UnprocessableEntityError for 422 responses' do
                +    expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableEntityError) do |ex|
                +      expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
                +      expect(ex.response[:headers]['X-Reason']).to eq('because')
                +      expect(ex.response[:status]).to eq(422)
                +      expect(ex.response_status).to eq(422)
                +      expect(ex.response_body).to eq('keep looking')
                +      expect(ex.response_headers['X-Reason']).to eq('because')
                +    end
                +  end
                +
                +  it 'raises Faraday::UnprocessableContentError for 422 responses' do
                +    expect { conn.get('unprocessable-content') }.to raise_error(Faraday::UnprocessableContentError) do |ex|
                +      expect(ex.message).to eq('the server responded with status 422 for GET http:/unprocessable-content')
                @@ -119 +130 @@
                -      expect(ex.message).to eq('the server responded with status 429')
                +      expect(ex.message).to eq('the server responded with status 429 for GET http:/too-many-requests')
                @@ -141 +152 @@
                -      expect(ex.message).to eq('the server responded with status 499')
                +      expect(ex.message).to eq('the server responded with status 499 for GET http:/4xx')
                @@ -152 +163 @@
                -      expect(ex.message).to eq('the server responded with status 500')
                +      expect(ex.message).to eq('the server responded with status 500 for GET http:/server-error')
        spec/faraday/response_spec.rb
                --- /tmp/d20260209-603-kl2bhu/faraday-2.13.1/spec/faraday/response_spec.rb	2026-02-09 22:17:51.861963561 +0000
                +++ /tmp/d20260209-603-kl2bhu/faraday-2.14.1/spec/faraday/response_spec.rb	2026-02-09 22:17:51.882963600 +0000
                @@ -15,0 +16 @@
                +  it { expect(subject.url).to eq(URI('https://lostisland.github.io/faraday')) }
                @@ -33,0 +35,6 @@
                +
                +    context 'when response is not finished' do
                +      subject { Faraday::Response.new.to_hash }
                +
                +      it { is_expected.to eq({ status: nil, body: nil, response_headers: {}, url: nil }) }
                +    end

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff faraday-net_http 3.4.1 3.4.2

Compared versions: ["3.4.1", "3.4.2"]
  DIFFERENT files:
    3.4.1->3.4.2:
      * Changed:
        lib/faraday/net_http/version.rb
                --- /tmp/d20260209-960-q1e9rc/faraday-net_http-3.4.1/lib/faraday/net_http/version.rb	2026-02-09 22:17:54.128298516 +0000
                +++ /tmp/d20260209-960-q1e9rc/faraday-net_http-3.4.2/lib/faraday/net_http/version.rb	2026-02-09 22:17:54.128298516 +0000
                @@ -5 +5 @@
                -    VERSION = '3.4.1'
                +    VERSION = '3.4.2'

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff faraday-net_http 3.4.1 3.4.2

Compared versions: ["3.4.1", "3.4.2"]
  DIFFERENT files:
    3.4.1->3.4.2:
      * Changed:
        lib/faraday/net_http/version.rb
                --- /tmp/d20260209-963-kwskz7/faraday-net_http-3.4.1/lib/faraday/net_http/version.rb	2026-02-09 22:18:00.431002328 +0000
                +++ /tmp/d20260209-963-kwskz7/faraday-net_http-3.4.2/lib/faraday/net_http/version.rb	2026-02-09 22:18:00.432002339 +0000
                @@ -5 +5 @@
                -    VERSION = '3.4.1'
                +    VERSION = '3.4.2'

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare faraday-net_http 3.4.1 3.4.2

Compared versions: ["3.4.1", "3.4.2"]
  DIFFERENT metadata:
    3.4.1: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.1", "rubygems_mfa_required" => "true"}
    3.4.2: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.2", "rubygems_mfa_required" => "true"}
  DIFFERENT version:
    3.4.1: 3.4.1
    3.4.2: 3.4.2
  DIFFERENT files:
    3.4.1->3.4.2:
      * Changed:
            lib/faraday/net_http/version.rb +1/-1
  DIFFERENT runtime dependencies:
    3.4.1->3.4.2:
      * Updated:
            net-http from: [">= 0.5.0"] to: ["~> 0.5"]

2 similar comments
@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare faraday-net_http 3.4.1 3.4.2

Compared versions: ["3.4.1", "3.4.2"]
  DIFFERENT metadata:
    3.4.1: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.1", "rubygems_mfa_required" => "true"}
    3.4.2: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.2", "rubygems_mfa_required" => "true"}
  DIFFERENT version:
    3.4.1: 3.4.1
    3.4.2: 3.4.2
  DIFFERENT files:
    3.4.1->3.4.2:
      * Changed:
            lib/faraday/net_http/version.rb +1/-1
  DIFFERENT runtime dependencies:
    3.4.1->3.4.2:
      * Updated:
            net-http from: [">= 0.5.0"] to: ["~> 0.5"]

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare faraday-net_http 3.4.1 3.4.2

Compared versions: ["3.4.1", "3.4.2"]
  DIFFERENT metadata:
    3.4.1: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.1", "rubygems_mfa_required" => "true"}
    3.4.2: {"homepage_uri" => "https://github.com/lostisland/faraday-net_http", "source_code_uri" => "https://github.com/lostisland/faraday-net_http", "changelog_uri" => "https://github.com/lostisland/faraday-net_http/releases/tag/v3.4.2", "rubygems_mfa_required" => "true"}
  DIFFERENT version:
    3.4.1: 3.4.1
    3.4.2: 3.4.2
  DIFFERENT files:
    3.4.1->3.4.2:
      * Changed:
            lib/faraday/net_http/version.rb +1/-1
  DIFFERENT runtime dependencies:
    3.4.1->3.4.2:
      * Updated:
            net-http from: [">= 0.5.0"] to: ["~> 0.5"]

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare json 2.13.2 2.18.1

Compared versions: ["2.13.2", "2.18.1"]
  DIFFERENT date:
    2.13.2: 2025-07-28 00:00:00 UTC
    2.18.1: 1980-01-02 00:00:00 UTC
  DIFFERENT require_paths:
    2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
    2.18.1: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.18.1", "lib"]
  DIFFERENT rubygems_version:
    2.13.2: 3.6.2
    2.18.1: 4.1.0.dev
  DIFFERENT version:
    2.13.2: 2.13.2
    2.18.1: 2.18.1
  DIFFERENT files:
    2.13.2->2.18.1:
      * Added:
            ext/json/ext/json.h +101/-0
            ext/json/ext/vendor/ryu.h +819/-0
            lib/json/add/string.rb +35/-0
      * Changed:
            CHANGES.md +81/-8
            LEGAL +12/-0
            README.md +19/-1
            ext/json/ext/fbuffer/fbuffer.h +35/-56
            ext/json/ext/generator/extconf.rb +1/-1
            ext/json/ext/generator/generator.c +326/-264
            ext/json/ext/parser/extconf.rb +2/-1
            ext/json/ext/parser/parser.c +565/-445
            ext/json/ext/simd/simd.h +42/-12
            ext/json/ext/vendor/fpconv.c +13/-12
            lib/json.rb +44/-1
            lib/json/add/core.rb +1/-0
            lib/json/common.rb +60/-23
            lib/json/ext/generator/state.rb +11/-14
            lib/json/generic_object.rb +0/-8
            lib/json/truffle_ruby/generator.rb +113/-63
            lib/json/version.rb +1/-1
  DIFFERENT extra_rdoc_files:
    2.13.2->2.18.1:
      * Changed:
            README.md +19/-1

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff faraday-net_http 3.4.1 3.4.2

Compared versions: ["3.4.1", "3.4.2"]
  DIFFERENT files:
    3.4.1->3.4.2:
      * Changed:
        lib/faraday/net_http/version.rb
                --- /tmp/d20260209-960-eaiyzg/faraday-net_http-3.4.1/lib/faraday/net_http/version.rb	2026-02-09 22:18:12.369909474 +0000
                +++ /tmp/d20260209-960-eaiyzg/faraday-net_http-3.4.2/lib/faraday/net_http/version.rb	2026-02-09 22:18:12.370909474 +0000
                @@ -5 +5 @@
                -    VERSION = '3.4.1'
                +    VERSION = '3.4.2'

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff faraday-net_http 3.4.1 3.4.2

Compared versions: ["3.4.1", "3.4.2"]
  DIFFERENT files:
    3.4.1->3.4.2:
      * Changed:
        lib/faraday/net_http/version.rb
                --- /tmp/d20260209-986-d677ud/faraday-net_http-3.4.1/lib/faraday/net_http/version.rb	2026-02-09 22:18:15.571202812 +0000
                +++ /tmp/d20260209-986-d677ud/faraday-net_http-3.4.2/lib/faraday/net_http/version.rb	2026-02-09 22:18:15.572202817 +0000
                @@ -5 +5 @@
                -    VERSION = '3.4.1'
                +    VERSION = '3.4.2'

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff faraday-net_http 3.4.1 3.4.2

Compared versions: ["3.4.1", "3.4.2"]
  DIFFERENT files:
    3.4.1->3.4.2:
      * Changed:
        lib/faraday/net_http/version.rb
                --- /tmp/d20260209-977-je1dos/faraday-net_http-3.4.1/lib/faraday/net_http/version.rb	2026-02-09 22:18:17.862011322 +0000
                +++ /tmp/d20260209-977-je1dos/faraday-net_http-3.4.2/lib/faraday/net_http/version.rb	2026-02-09 22:18:17.863011324 +0000
                @@ -5 +5 @@
                -    VERSION = '3.4.1'
                +    VERSION = '3.4.2'

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff json 2.13.2 2.18.1

Diff too large (218398 chars)

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare json 2.13.2 2.18.1

Compared versions: ["2.13.2", "2.18.1"]
  DIFFERENT date:
    2.13.2: 2025-07-28 00:00:00 UTC
    2.18.1: 1980-01-02 00:00:00 UTC
  DIFFERENT require_paths:
    2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
    2.18.1: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.18.1", "lib"]
  DIFFERENT rubygems_version:
    2.13.2: 3.6.2
    2.18.1: 4.1.0.dev
  DIFFERENT version:
    2.13.2: 2.13.2
    2.18.1: 2.18.1
  DIFFERENT files:
    2.13.2->2.18.1:
      * Added:
            ext/json/ext/json.h +101/-0
            ext/json/ext/vendor/ryu.h +819/-0
            lib/json/add/string.rb +35/-0
      * Changed:
            CHANGES.md +81/-8
            LEGAL +12/-0
            README.md +19/-1
            ext/json/ext/fbuffer/fbuffer.h +35/-56
            ext/json/ext/generator/extconf.rb +1/-1
            ext/json/ext/generator/generator.c +326/-264
            ext/json/ext/parser/extconf.rb +2/-1
            ext/json/ext/parser/parser.c +565/-445
            ext/json/ext/simd/simd.h +42/-12
            ext/json/ext/vendor/fpconv.c +13/-12
            lib/json.rb +44/-1
            lib/json/add/core.rb +1/-0
            lib/json/common.rb +60/-23
            lib/json/ext/generator/state.rb +11/-14
            lib/json/generic_object.rb +0/-8
            lib/json/truffle_ruby/generator.rb +113/-63
            lib/json/version.rb +1/-1
  DIFFERENT extra_rdoc_files:
    2.13.2->2.18.1:
      * Changed:
            README.md +19/-1

2 similar comments
@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare json 2.13.2 2.18.1

Compared versions: ["2.13.2", "2.18.1"]
  DIFFERENT date:
    2.13.2: 2025-07-28 00:00:00 UTC
    2.18.1: 1980-01-02 00:00:00 UTC
  DIFFERENT require_paths:
    2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
    2.18.1: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.18.1", "lib"]
  DIFFERENT rubygems_version:
    2.13.2: 3.6.2
    2.18.1: 4.1.0.dev
  DIFFERENT version:
    2.13.2: 2.13.2
    2.18.1: 2.18.1
  DIFFERENT files:
    2.13.2->2.18.1:
      * Added:
            ext/json/ext/json.h +101/-0
            ext/json/ext/vendor/ryu.h +819/-0
            lib/json/add/string.rb +35/-0
      * Changed:
            CHANGES.md +81/-8
            LEGAL +12/-0
            README.md +19/-1
            ext/json/ext/fbuffer/fbuffer.h +35/-56
            ext/json/ext/generator/extconf.rb +1/-1
            ext/json/ext/generator/generator.c +326/-264
            ext/json/ext/parser/extconf.rb +2/-1
            ext/json/ext/parser/parser.c +565/-445
            ext/json/ext/simd/simd.h +42/-12
            ext/json/ext/vendor/fpconv.c +13/-12
            lib/json.rb +44/-1
            lib/json/add/core.rb +1/-0
            lib/json/common.rb +60/-23
            lib/json/ext/generator/state.rb +11/-14
            lib/json/generic_object.rb +0/-8
            lib/json/truffle_ruby/generator.rb +113/-63
            lib/json/version.rb +1/-1
  DIFFERENT extra_rdoc_files:
    2.13.2->2.18.1:
      * Changed:
            README.md +19/-1

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare json 2.13.2 2.18.1

Compared versions: ["2.13.2", "2.18.1"]
  DIFFERENT date:
    2.13.2: 2025-07-28 00:00:00 UTC
    2.18.1: 1980-01-02 00:00:00 UTC
  DIFFERENT require_paths:
    2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
    2.18.1: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.18.1", "lib"]
  DIFFERENT rubygems_version:
    2.13.2: 3.6.2
    2.18.1: 4.1.0.dev
  DIFFERENT version:
    2.13.2: 2.13.2
    2.18.1: 2.18.1
  DIFFERENT files:
    2.13.2->2.18.1:
      * Added:
            ext/json/ext/json.h +101/-0
            ext/json/ext/vendor/ryu.h +819/-0
            lib/json/add/string.rb +35/-0
      * Changed:
            CHANGES.md +81/-8
            LEGAL +12/-0
            README.md +19/-1
            ext/json/ext/fbuffer/fbuffer.h +35/-56
            ext/json/ext/generator/extconf.rb +1/-1
            ext/json/ext/generator/generator.c +326/-264
            ext/json/ext/parser/extconf.rb +2/-1
            ext/json/ext/parser/parser.c +565/-445
            ext/json/ext/simd/simd.h +42/-12
            ext/json/ext/vendor/fpconv.c +13/-12
            lib/json.rb +44/-1
            lib/json/add/core.rb +1/-0
            lib/json/common.rb +60/-23
            lib/json/ext/generator/state.rb +11/-14
            lib/json/generic_object.rb +0/-8
            lib/json/truffle_ruby/generator.rb +113/-63
            lib/json/version.rb +1/-1
  DIFFERENT extra_rdoc_files:
    2.13.2->2.18.1:
      * Changed:
            README.md +19/-1

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff json 2.13.2 2.18.1

Diff too large (218398 chars)

2 similar comments
@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff json 2.13.2 2.18.1

Diff too large (218398 chars)

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff json 2.13.2 2.18.1

Diff too large (218398 chars)

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare json 2.13.2 2.18.1

Compared versions: ["2.13.2", "2.18.1"]
  DIFFERENT date:
    2.13.2: 2025-07-28 00:00:00 UTC
    2.18.1: 1980-01-02 00:00:00 UTC
  DIFFERENT require_paths:
    2.13.2: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.13.2", "lib"]
    2.18.1: ["/opt/hostedtoolcache/Ruby/4.0.1/x64/lib/ruby/gems/4.0.0/extensions/x86_64-linux/4.0.0/json-2.18.1", "lib"]
  DIFFERENT rubygems_version:
    2.13.2: 3.6.2
    2.18.1: 4.1.0.dev
  DIFFERENT version:
    2.13.2: 2.13.2
    2.18.1: 2.18.1
  DIFFERENT files:
    2.13.2->2.18.1:
      * Added:
            ext/json/ext/json.h +101/-0
            ext/json/ext/vendor/ryu.h +819/-0
            lib/json/add/string.rb +35/-0
      * Changed:
            CHANGES.md +81/-8
            LEGAL +12/-0
            README.md +19/-1
            ext/json/ext/fbuffer/fbuffer.h +35/-56
            ext/json/ext/generator/extconf.rb +1/-1
            ext/json/ext/generator/generator.c +326/-264
            ext/json/ext/parser/extconf.rb +2/-1
            ext/json/ext/parser/parser.c +565/-445
            ext/json/ext/simd/simd.h +42/-12
            ext/json/ext/vendor/fpconv.c +13/-12
            lib/json.rb +44/-1
            lib/json/add/core.rb +1/-0
            lib/json/common.rb +60/-23
            lib/json/ext/generator/state.rb +11/-14
            lib/json/generic_object.rb +0/-8
            lib/json/truffle_ruby/generator.rb +113/-63
            lib/json/version.rb +1/-1
  DIFFERENT extra_rdoc_files:
    2.13.2->2.18.1:
      * Changed:
            README.md +19/-1

@github-actions
Copy link
Contributor

github-actions bot commented Feb 9, 2026

gem compare --diff json 2.13.2 2.18.1

Diff too large (218398 chars)

@dependabot dependabot bot force-pushed the dependabot/bundler/faraday-2.14.1 branch 3 times, most recently from 9591d96 to 2287810 Compare February 14, 2026 00:38
Bumps [faraday](https://github.com/lostisland/faraday) from 2.13.1 to 2.14.1.
- [Release notes](https://github.com/lostisland/faraday/releases)
- [Changelog](https://github.com/lostisland/faraday/blob/main/CHANGELOG.md)
- [Commits](lostisland/faraday@v2.13.1...v2.14.1)

---
updated-dependencies:
- dependency-name: faraday
  dependency-version: 2.14.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot bot force-pushed the dependabot/bundler/faraday-2.14.1 branch from 2287810 to 930ce5c Compare February 14, 2026 01:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies ruby Pull requests that update Ruby code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants