Thanks Beau and Alex, I ended up using a different namespace and got things
done!

About chans:
I was trying to use the spec mainly as a checker on test/dev. We have a
system that communicates a lot via channels but we lose that extra check at
those boundaries. Didn't think about the transducers, that complicates
things.

About the test timing:
I've only instrumented one namespace and it has a some getter fns that are
heavily used[1]. This may not be a typical scenario, because we test brute
force AI and auto generate battles and play them to the end. But it's a
heavy burden. Our travis build went from 9min to 47 min with that change.
So we may need to re-organize the tests and don't instrument all the
scenarios.

[1]
https://github.com/orionsbelt-battlegrounds/obb-rules/blob/9fa5da24a3844982ba51e17e9adfe49f2aeea445/src/obb_rules/unit.cljc

On Fri, May 27, 2016 at 1:36 PM Alex Miller <a...@puredanger.com> wrote:

>
>
> On Friday, May 27, 2016 at 2:36:56 AM UTC-5, Pedro Pereira Santos wrote:
>>
>> Hello,
>>
>> How can I differentiate between the same keyword, but with difference
>> semantics? Example:
>>
>
> If you have different semantics, you should use different keywords (either
> different name or namespace).
>
>
>>
>> {:attack 100
>>  :bonus {:attack {:category {:heavy 100}}}}
>>
>> I have:
>> (s/def ::attack (s/and pos? #(<= 1 1000))
>> (s/def ::bonus (s/keys :req-un [::attack ; <---
>>
>> Is there a way to do this?
>>
>> --
>>
>> Another question: is there a way to spec a fn that handles channels?
>> Something like:
>>
>
> Nothing right now but we've talked about this some. You have to keep in
> mind that channels also can have a transducer which means the read and
> write ends of a channel might have different specs. Tim Baldridge pointed
> out that you could use a map transducer that checked s/valid? on it's
> inputs - that could be used at either the beginning and/or end of a
> transducer chain. That's pretty brute force though and would add a lot of
> overhead.
>
>
>>
>> (s/fdef some-fn
>>  :args (s/cat :ch (s/chan ::unq/model))
>>  :ret (s/chan :unq/model))
>>
>> --
>>
>> And yet another: I have a game project with some test.check scenarios.
>> The test run takes 8s without instrumenting and 22s with instrumentation,
>> and this makes me think on starting to split tests in test suites. Is there
>> something to handle this in clojure.test?
>>
>
> That's the first timing report I've seen - pretty interesting! How many
> fns do you have instrumented? clojure.test does not support this directly
> but if you're using leiningen you can use their test selectors on how to do
> this.
>
>
>>
>> Thanks!
>>
>>
>> On Thu, May 26, 2016 at 7:00 PM Beau Fabry <imf...@gmail.com> wrote:
>>
>>> I'm in a similar position to you Wesley, I'm all for generative testing,
>>> but sometimes I prefer not to spec out the full depth of the tree (ie some
>>> input leaves with s/Any) and just turn on validation in staging and see
>>> what happens. The cpu-time wasted there doesn't matter much to me. Looking
>>> forward to seeing where things end up. Spec certainly seems really well
>>> thought through.
>>>
>>> Aside: Great work on the docs Alex. Much much more comprehensive and
>>> readable than is usually available for an alpha feature in *any* language.
>>>
>>>
>>> On Thursday, May 26, 2016 at 6:57:24 AM UTC-7, Wesley Hall wrote:
>>>>
>>>> Thanks Rich, for this and your work in general. After 15 years of
>>>> working with Java, it has been a real joy to find clojure (let's face it,
>>>> that pun alone is pure gold!).
>>>>
>>>> I might try my hand at the macrology you describe as an exercise...
>>>> everybody stand well back....
>>>>
>>>> On Thursday, 26 May 2016 14:43:04 UTC+1, Rich Hickey wrote:
>>>>>
>>>>> If you name (register) your (sub)specs with s/def and you can reuse
>>>>> them as much as you like.
>>>>>
>>>>> (s/def ::argi (s/cat :i integer?))
>>>>> (s/def ::fnii (s/fspec :args ::argi :ret integer?))
>>>>> (s/conform ::fnii +)
>>>>> (s/valid? ::argi '(42))
>>>>>
>>>>> However you are talking about calling ‘instrument’ so I don’t think
>>>>> you are in the HOF case. So you shouldn’t be using fspec but fdef:
>>>>>
>>>>> (s/fdef fooi :args (s/cat :i integer?) :ret integer?)
>>>>>
>>>>> (defn fooi [i]
>>>>>   (let [spec (-> `fooi s/fn-specs :args)]
>>>>>     (assert (s/valid? spec (list i)) (s/explain-str spec (list i))))
>>>>>   42)
>>>>>
>>>>> (fooi "42")
>>>>> user=> AssertionError Assert failed: In: [0] val: "42" fails at: [:i]
>>>>> predicate: integer?
>>>>>
>>>>> Obviously some macrology could make this more succinct, as is being
>>>>> discussed elsewhere.
>>>>>
>>>>> > On May 26, 2016, at 9:17 AM, Wesley Hall <wesle...@gmail.com>
>>>>> wrote:
>>>>> >
>>>>> > spec is not a contract system.
>>>>> >
>>>>> > Forgive me for I am about to sin :).
>>>>> >
>>>>> > I have a little RPC framework that I use to do simple remoting
>>>>> between clojurescript in the browser and ring based web services. I'm
>>>>> currently using schema to validate arguments received from clients and
>>>>> return appropriate exceptions upon non-conforming invocations.
>>>>> >
>>>>> > The idea of being able to perform generative testing against a
>>>>> specification for these functions is really appealing but if I am using
>>>>> generative testing to verify that my functions behave properly if invoked
>>>>> as intended it does feel like there would be some benefit to ensuring that
>>>>> the conditions under which the function has been tested are enforced at
>>>>> runtime for those functions on the edges of my API.
>>>>> >
>>>>> > I'd definitely prefer a manual conformity check over instrumentation
>>>>> in these cases, but it seems like an fspec cannot be used for this purpose
>>>>> (from within the function itself). I'd rather not define my specs twice.
>>>>> >
>>>>> > Seems like I might be destined to make cheeky instrument calls after
>>>>> each of these edge functions, in the same was the always-validate metadata
>>>>> is used in schema.
>>>>> >
>>>>> > Do I have a desperate need to be convinced otherwise? :)
>>>>> >
>>>>> > --
>>>>> > You received this message because you are subscribed to the Google
>>>>> > Groups "Clojure" group.
>>>>> > To post to this group, send email to clo...@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+u...@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+u...@googlegroups.com.
>>>>> > For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>> --
>>> 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.
>>>
>> --
> 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.
>

-- 
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.

Reply via email to