Model#initialize drops every `false` value — booleans are silently lost on requests and responses
メンテナーはふだん 1 日以内に返信
評価
調査の方向性
lib/auth0/internal/types/model.rb から始め、Auth0::Users::Types::UpdateUserRequestContent と Auth0::Types::UpdateUserResponseContent を使ってリクエストとレスポンスの例を再現します。false の値が to_h に存在したままになること、load 後に readers から返されること、また default: false を持つフィールドもデフォルト値を使用することを確認します。
索引モデルが issue の本文から書いたものです。
説明
Describe the problem
Auth0::Internal::Types::Model#initialize resolves each declared field with ||, so a legitimate false is treated as absent and never reaches @data. Since #to_h only emits keys present in @data, every boolean whose value is false silently disappears — on requests and responses alike.
Requests: users.update(id:, blocked: false) builds an empty PATCH body, and Auth0 rejects it with 400 Payload validation error: 'None of the valid schemas were met'. Unblocking a user is not possible through the SDK.
Responses: a user who genuinely is "email_verified": false deserializes to nil, indistinguishable from "the API did not return this field". This one is quiet — no exception, just a wrong value.
Reproduction
require "auth0/version" # still needed on 6.2.0, see #786
require "auth0"
k = Auth0::Users::Types::UpdateUserRequestContent
k.new(id: "auth0|abc", blocked: false, email_verified: false).to_h
# => {"id" => "auth0|abc"} # both booleans dropped
k.new(id: "auth0|abc", blocked: true).to_h
# => {"id" => "auth0|abc", "blocked" => true} # true survives
json = '{"user_id":"auth0|abc","email":"[email protected]","email_verified":false,"blocked":false}'
u = Auth0::Types::UpdateUserResponseContent.load(json)
u.email_verified # => nil (expected false)
u.blocked # => nil (expected false)
u.to_h # => {"user_id" => "auth0|abc", "email" => "[email protected]"}
Users::Client#update does request_data.except("id"), so the first case sends PATCH /api/v2/users/auth0|abc with a literal {} body.
Expected behaviour
false round-trips like any other value: to_h includes the key and the reader returns false.
Cause
lib/auth0/internal/types/model.rb:
value = values.delete(field.api_name.to_sym) || values.delete(field.api_name) || values.delete(field_name)
field_value = value || (if field.literal?
field.value
elsif field.default
field.default
end)
Both || chains discard false. Presence has to be decided with Hash#key?, and the literal/default fallback should apply only when the value is genuinely nil:
key = [field.api_name.to_sym, field.api_name, field_name].find { |k| values.key?(k) }
value = key.nil? ? nil : values.delete(key)
field_value =
if !value.nil?
value
elsif field.literal?
field.value
else
field.default
end
(Also note the elsif field.default guard is itself truthiness-based, so a field declared with default: false can never fall back to its default either.)
Because this lives in the shared base model it affects every boolean in the generated API surface — blocked, email_verified, verify_email, phone_verified, include_totals, and so on.
Environment
- auth0 6.2.0 —
lib/auth0/internal/types/model.rbis byte-identical in 6.0.0, 6.1.0 and 6.2.0 (md50908fa9ec6636316bc78688d3e7436b3), so all three are affected - Ruby 3.4
- 主要言語
- Ruby
- スター
- 205
- フォーク
- 147
- 平均マージ
- 16時間 2分
- マージ済み PR(30日)
- 5
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
auth0/ruby-auth0 のほかの issue
-
feature request
難易度 3/5 1〜2日 初心者へのやさしさ 45/100
auth0/ruby-auth0#709 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 1/5 1時間未満 初心者へのやさしさ 50/100
auth0/ruby-auth0#610 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
Rate limit data returned from API methods対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープンfeature request
難易度 5/5 1週間以上 初心者へのやさしさ 32/100
auth0/ruby-auth0#606 · コメント 2 件 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
MFA API Bearer token issue対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープンbug
難易度 3/5 1〜2日 初心者へのやさしさ 35/100
auth0/ruby-auth0#556 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
feature request
難易度 3/5 1〜2日 初心者へのやさしさ 35/100
auth0/ruby-auth0#500 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
auth0/ruby-auth0 の issue をすべて見る
似ている issue
-
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
zerocracy/judges-action#2743 ·
メンテナーはふだん 8 日以内に返信
-
Python 3.15 support対応中かも @amnesiaof が今日担当しました。 オープンL: python L: python:uv
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
dependabot/dependabot-core#16524 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
content good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
rubyevents/rubyevents#2182 ·
メンテナーはふだん 1 日以内に返信
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
TarteelAI/quranic-universal-library#821 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信