请在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 上失败:[:element-value] 谓词:string?。

由于这是一个可选映射,我明白为什么会这样。如果没有匹配到,它将转到父级中的下一个谓词。

不过,我认为如果部分匹配成功,将这一点报告给用户作为一个规范失败的潜在位置可能会有所帮助(特别是在一个大的可选嵌套数据结构中)。

{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年7月19日项目归档匹配评论的简化版本。

0

评论者:alexmiller

Nick,我已经给了你编辑权限。通常,我们不喜欢有外部项目进行重试 - 如果你能在描述中将其缩减到几行示例,那就太理想了。

0
... ...

评论者:jonesn

感谢 Alex。我已经更新了描述并删除了项目附件。我还将一个 REPL 会话添加到描述中,以便在独立的 Clojure 1.9.0-alpha10 REPL 中重现问题。

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