Re: Trouble understanding clojure.spec.alpha/problems :path :via :in

2017-07-13 Thread Ben Brinckerhoff
> I'm currently trying something very similar to expound but with a GUI 
approach to explore errors.

I look forward to seeing what you come up with!

Ben

On Thursday, July 13, 2017 at 8:48:45 AM UTC-6, Juan Monetta wrote:
>
> Yeah, I read your expound code, really nice btw.
>
> I'm currently trying something very similar to expound but with a GUI 
> approach to explore errors.
>
> I think encoding map paths as [key pos-in-map-entry] should work in all 
> cases as is currently doing in s/map-of. I can't see any issues if s/keys 
> explains in the same way, which it currently doesn't because it just 
> reports [key].
>
> Juan
>
> El jueves, 13 de julio de 2017, 11:27:44 (UTC-3), Ben Brinckerhoff 
> escribió:
>>
>> No, you're not missing anything. I've run into the same issue. I see 
>> you've found the related JIRA issue, but for those who haven't it's 
>> https://dev.clojure.org/jira/browse/CLJ-2192
>>
>> > So the thing is that if you see a problem in [::k 1] you don't know if 
>> its the ::k value, or the value is a sequence and the problem is its 
>> element at pos 1.
>>
>> Yes, you're correct, this is ambiguous right now. In Expound (
>> https://github.com/bhb/expound) I have some code that tries to determine 
>> which case it is, based upon some heuristics, but I'm sure there are cases 
>> in which I'll get it wrong.
>>
>> There are two other interesting related cases I've run into related to 
>> the `:in` path.
>>
>> First, there is the case where the key is wrong, not the value:
>>
>>   (s/def ::spec-1 (s/map-of keyword? int?))
>>
>>   (-> (s/explain-data ::spec-1 {"foobar" 5})
>>   :clojure.spec.alpha/problems
>>   first
>>   :in)
>>   ;; ["foobar" 0]
>>
>> This is also ambiguous in the way you've noted above, but it's not clear 
>> how to construct this path - how do we "point to" a key of a map?
>>
>> Second, there is the case where we want to use 'coll-of' with a map. In 
>> this case, the `in` path is just [0]
>>
>>   (s/def ::coll-of (s/coll-of int? :kind map?))
>>   (-> (s/explain-data ::coll-of {"foobar" 5})
>>   :clojure.spec.alpha/problems
>>   first
>>   :in)
>>   ;; [0]
>>
>> AFAICT, we don't know from looking at that path whether it means: "look 
>> up the key `0` in the map" (incorrect) or "convert the map to a sequence, 
>> then get the 0th element" (correct). Again, Expound has some heuristics to 
>> try to figure this out.
>>
>> Right now, this logic is buried in the (messy) internals of Expound, but 
>> I will soon be providing a cleaner set of functions that allows clients to 
>> do more with the :clojure.spec.alpha/problems, including one that will 
>> provide a `in` path that works around these issues (in most common cases).
>>
>> Ben
>>
>> On Wednesday, July 12, 2017 at 8:50:19 AM UTC-6, Juan Monetta wrote:
>>>
>>> Hi everyone,
>>>
>>> I started exploring the clojure.spec "better user errors" thing and I'm 
>>> having some trouble matching clojure.spec.alpha/problems inside
>>> :clojure.spec.alpha/value in explain-data.
>>>
>>> I'm trying to understand if there is currently a way of using problem to 
>>> directly find the part of the value that is causing the issue independent of
>>> the spec that failed.
>>>
>>> For example given a spec :
>>>
>>> (s/def ::spec-1 (s/map-of keyword? int?))
>>>
>>> (-> (s/explain-data ::spec-1 {::k 8.8})
>>>  :clojure.spec.alpha/problems
>>>  first
>>>  :in)
>>> => [::k 1]   ;; which means the problem was with the value, not the key
>>>
>>> but given a different spec for the same data :
>>>
>>> (s/def ::k int?)
>>> (s/def ::spec-2 (s/keys :req [::k]))
>>>
>>> (-> (s/explain-data ::spec-2 {::k 8.8})
>>>  :clojure.spec.alpha/problems
>>>  first
>>>  :in)
>>> => [::k]
>>>
>>> So the thing is that if you see a problem in [::k 1] you don't know if 
>>> its the ::k value, or the value is a sequence and 
>>> the problem is its element at pos 1.
>>>
>>> Does it make sense or I'm missing something?
>>>
>>> I'm trying with [org.clojure/clojure "1.9.0-alpha17"]
>>>
>>>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Trouble understanding clojure.spec.alpha/problems :path :via :in

2017-07-13 Thread Juan Monetta
Yeah, I read your expound code, really nice btw.

I'm currently trying something very similar to expound but with a GUI 
approach to explore errors.

I think encoding map paths as [key pos-in-map-entry] should work in all 
cases as is currently doing in s/map-of. I can't see any issues if s/keys 
explains in the same way, which it currently doesn't because it just 
reports [key].

Juan

El jueves, 13 de julio de 2017, 11:27:44 (UTC-3), Ben Brinckerhoff escribió:
>
> No, you're not missing anything. I've run into the same issue. I see 
> you've found the related JIRA issue, but for those who haven't it's 
> https://dev.clojure.org/jira/browse/CLJ-2192
>
> > So the thing is that if you see a problem in [::k 1] you don't know if 
> its the ::k value, or the value is a sequence and the problem is its 
> element at pos 1.
>
> Yes, you're correct, this is ambiguous right now. In Expound (
> https://github.com/bhb/expound) I have some code that tries to determine 
> which case it is, based upon some heuristics, but I'm sure there are cases 
> in which I'll get it wrong.
>
> There are two other interesting related cases I've run into related to the 
> `:in` path.
>
> First, there is the case where the key is wrong, not the value:
>
>   (s/def ::spec-1 (s/map-of keyword? int?))
>
>   (-> (s/explain-data ::spec-1 {"foobar" 5})
>   :clojure.spec.alpha/problems
>   first
>   :in)
>   ;; ["foobar" 0]
>
> This is also ambiguous in the way you've noted above, but it's not clear 
> how to construct this path - how do we "point to" a key of a map?
>
> Second, there is the case where we want to use 'coll-of' with a map. In 
> this case, the `in` path is just [0]
>
>   (s/def ::coll-of (s/coll-of int? :kind map?))
>   (-> (s/explain-data ::coll-of {"foobar" 5})
>   :clojure.spec.alpha/problems
>   first
>   :in)
>   ;; [0]
>
> AFAICT, we don't know from looking at that path whether it means: "look up 
> the key `0` in the map" (incorrect) or "convert the map to a sequence, then 
> get the 0th element" (correct). Again, Expound has some heuristics to try 
> to figure this out.
>
> Right now, this logic is buried in the (messy) internals of Expound, but I 
> will soon be providing a cleaner set of functions that allows clients to do 
> more with the :clojure.spec.alpha/problems, including one that will provide 
> a `in` path that works around these issues (in most common cases).
>
> Ben
>
> On Wednesday, July 12, 2017 at 8:50:19 AM UTC-6, Juan Monetta wrote:
>>
>> Hi everyone,
>>
>> I started exploring the clojure.spec "better user errors" thing and I'm 
>> having some trouble matching clojure.spec.alpha/problems inside
>> :clojure.spec.alpha/value in explain-data.
>>
>> I'm trying to understand if there is currently a way of using problem to 
>> directly find the part of the value that is causing the issue independent of
>> the spec that failed.
>>
>> For example given a spec :
>>
>> (s/def ::spec-1 (s/map-of keyword? int?))
>>
>> (-> (s/explain-data ::spec-1 {::k 8.8})
>>  :clojure.spec.alpha/problems
>>  first
>>  :in)
>> => [::k 1]   ;; which means the problem was with the value, not the key
>>
>> but given a different spec for the same data :
>>
>> (s/def ::k int?)
>> (s/def ::spec-2 (s/keys :req [::k]))
>>
>> (-> (s/explain-data ::spec-2 {::k 8.8})
>>  :clojure.spec.alpha/problems
>>  first
>>  :in)
>> => [::k]
>>
>> So the thing is that if you see a problem in [::k 1] you don't know if 
>> its the ::k value, or the value is a sequence and 
>> the problem is its element at pos 1.
>>
>> Does it make sense or I'm missing something?
>>
>> I'm trying with [org.clojure/clojure "1.9.0-alpha17"]
>>
>>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Trouble understanding clojure.spec.alpha/problems :path :via :in

2017-07-13 Thread Ben Brinckerhoff
No, you're not missing anything. I've run into the same issue. I see you've 
found the related JIRA issue, but for those who haven't it's 
https://dev.clojure.org/jira/browse/CLJ-2192

> So the thing is that if you see a problem in [::k 1] you don't know if 
its the ::k value, or the value is a sequence and the problem is its 
element at pos 1.

Yes, you're correct, this is ambiguous right now. In Expound 
(https://github.com/bhb/expound) I have some code that tries to determine 
which case it is, based upon some heuristics, but I'm sure there are cases 
in which I'll get it wrong.

There are two other interesting related cases I've run into related to the 
`:in` path.

First, there is the case where the key is wrong, not the value:

  (s/def ::spec-1 (s/map-of keyword? int?))

  (-> (s/explain-data ::spec-1 {"foobar" 5})
  :clojure.spec.alpha/problems
  first
  :in)
  ;; ["foobar" 0]

This is also ambiguous in the way you've noted above, but it's not clear 
how to construct this path - how do we "point to" a key of a map?

Second, there is the case where we want to use 'coll-of' with a map. In 
this case, the `in` path is just [0]

  (s/def ::coll-of (s/coll-of int? :kind map?))
  (-> (s/explain-data ::coll-of {"foobar" 5})
  :clojure.spec.alpha/problems
  first
  :in)
  ;; [0]

AFAICT, we don't know from looking at that path whether it means: "look up 
the key `0` in the map" (incorrect) or "convert the map to a sequence, then 
get the 0th element" (correct). Again, Expound has some heuristics to try 
to figure this out.

Right now, this logic is buried in the (messy) internals of Expound, but I 
will soon be providing a cleaner set of functions that allows clients to do 
more with the :clojure.spec.alpha/problems, including one that will provide 
a `in` path that works around these issues (in most common cases).

Ben

On Wednesday, July 12, 2017 at 8:50:19 AM UTC-6, Juan Monetta wrote:
>
> Hi everyone,
>
> I started exploring the clojure.spec "better user errors" thing and I'm 
> having some trouble matching clojure.spec.alpha/problems inside
> :clojure.spec.alpha/value in explain-data.
>
> I'm trying to understand if there is currently a way of using problem to 
> directly find the part of the value that is causing the issue independent of
> the spec that failed.
>
> For example given a spec :
>
> (s/def ::spec-1 (s/map-of keyword? int?))
>
> (-> (s/explain-data ::spec-1 {::k 8.8})
>  :clojure.spec.alpha/problems
>  first
>  :in)
> => [::k 1]   ;; which means the problem was with the value, not the key
>
> but given a different spec for the same data :
>
> (s/def ::k int?)
> (s/def ::spec-2 (s/keys :req [::k]))
>
> (-> (s/explain-data ::spec-2 {::k 8.8})
>  :clojure.spec.alpha/problems
>  first
>  :in)
> => [::k]
>
> So the thing is that if you see a problem in [::k 1] you don't know if its 
> the ::k value, or the value is a sequence and 
> the problem is its element at pos 1.
>
> Does it make sense or I'm missing something?
>
> I'm trying with [org.clojure/clojure "1.9.0-alpha17"]
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Trouble understanding clojure.spec.alpha/problems :path :via :in

2017-07-12 Thread Juan Monetta
Hi everyone,

I started exploring the clojure.spec "better user errors" thing and I'm 
having some trouble matching clojure.spec.alpha/problems inside
:clojure.spec.alpha/value in explain-data.

I'm trying to understand if there is currently a way of using problem to 
directly find the part of the value that is causing the issue independent of
the spec that failed.

For example given a spec :

(s/def ::spec-1 (s/map-of keyword? int?))

(-> (s/explain-data ::spec-1 {::k 8.8})
 :clojure.spec.alpha/problems
 first
 :in)
=> [::k 1]   ;; which means the problem was with the value, not the key

but given a different spec for the same data :

(s/def ::k int?)
(s/def ::spec-2 (s/keys :req [::k]))

(-> (s/explain-data ::spec-2 {::k 8.8})
 :clojure.spec.alpha/problems
 first
 :in)
=> [::k]

So the thing is that if you see a problem in [::k 1] you don't know if its 
the ::k value, or the value is a sequence and 
the problem is its element at pos 1.

Does it make sense or I'm missing something?

I'm trying with [org.clojure/clojure "1.9.0-alpha17"]

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.