2024 年 Clojure 状态调查!分享您的想法。

欢迎!请查看关于页面获取更多关于这是如何工作的信息。

0
Spec
*问题:*

在尝试验证包含可选映射的向量时,如果向量包含有效的映射,规范将正确验证。然而,如果可选映射不满足规格,则会产生误导性错误信息。如果对用户指出可选映射的部分匹配,这将更好。

*说明问题的示例 REPL 会话:*

下面的可选嵌套映射 (:optional-nested-map) 由于 :nested-element-b 是字符串而不是整数而验证失败,但解释报告说明规范是在父级谓词::user/vector-schema何处失败:[:element-value]谓词:string?。

在这种情况下,如果规范报告说可选嵌套映射在 :optional-nested-map 失败是因为 ::nested-element-b 失败了 int? 谓词,将会更有助于用户。

{code:xml}
user=> (require '[clojure.spec :as s])
nil
user=> (s/def ::nested-element-a string?)
:user/nested-element-a
user=> (s/def ::nested-element-b int?)
:user/nested-element-b
user=> (s/def ::nested-element-schema)
          (s/keys :opt-un [::nested-element-a ::nested-element-b]))
:user/nested-element-schema
user=> (s/def ::vector-schema)
          (s/cat :tag-kw                 #{:tag}
                :optional-nested-map  (s/? (s/spec ::nested-element-schema))
                :element-value        string?))
:user/vector-schema
user=> (s/valid? ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b 10} "Element"])
true
user=> (s/valid? ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b ""} "Element"])
false
user=> (s/explain ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b ""} "Element"])
In: [1] val: {:nested-element-a "bla", :nested-element-b ""} fails spec: :user/vector-schema at: [:element-value] predicate: string?
nil
user=>

6 答案

0

评论由:alexmiller 发表

您能否用自包含的示例更新这个描述,演示这个问题?这个大例子太难复现和理解。

0
_评论由:jonesn_ 发表

你好,

对不起,我在创建后似乎没有权限编辑工单的描述。这里是一个简化的示例,希望它能更好地说明问题。

当可选嵌套映射因为:nested-element-b 应该是整数而不是字符串而无法通过验证时,解释报告会指出规范在父级谓词处失败::user/vector-schema at: [:element-value] 谓词:字符串?。

由于这是一个可选映射,我可以看出这种情况是有可能的。当没有找到匹配项时,它将转到父级中的下一个谓词。

话虽如此,我认为报告部分匹配可能会很有帮助(特别是在大型可选嵌套数据结构中),这样可以向用户提供一个可能失败规范的潜在位置。

{code:none}
user=> (require '[clojure.spec :as s])
nil
user=> (s/def ::nested-element-a string?)
:user/nested-element-a
user=> (s/def ::nested-element-b int?)
:user/nested-element-b
user=> (s/def ::nested-element-schema)
          (s/keys :opt-un [::nested-element-a ::nested-element-b]))
:user/nested-element-schema
user=> (s/def ::vector-schema)
          (s/cat :tag-kw                 #{:tag}
                :optional-nested-map  (s/? (s/spec ::nested-element-schema))
                :element-value        string?))
:user/vector-schema
user=> (s/valid? ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b 10} "Element"])
true
user=> (s/valid? ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b ""} "Element"])
false
user=> (s/explain ::vector-schema [:tag {:nested-element-a "bla" :nested-element-b ""} "Element"])
In: [1] val: {:nested-element-a "bla", :nested-element-b ""} fails spec: :user/vector-schema at: [:element-value] predicate: string?
nil
user=>
 
0

评论由:jonesn 发表

在 2016-07-19 添加了项目归档匹配评论的简化版本。

0

评论由:alexmiller 发表

Nick,我已赋予您此处编辑权限。通常,我们不喜欢使用外部项目进行复现——如果您能将描述中的例子缩减到几行,那就更理想了。

0

评论由:jonesn 发表

谢谢 Alex。我已经更新了描述,并移除了项目附件。我还添加了一个用于在独立的 Clojure 1.9.0-alpha10 REPL 中复现问题的交互式会话。

0
参考: https://clojure.atlassian.net/browse/CLJ-1982(由jonesn提交)
...