Or (ignoring the previous) getting even more basic...

*$ tree*

.
|-- LICENSE
|-- pom.xml
|-- project.clj
|-- README.md
`-- src
    `-- leiningen
        `-- zzz.clj



*$ cat src/leiningen/zzz.clj *

(ns leiningen.zzz
  (:require [leiningen.core.eval :refer [eval-in-project]]))

(defn zz [] (println "Hi!"))
(defn zzz [project & args]
  (eval-in-project project
                   `(zz)
                   '(require 'leiningen.zzz)))



*$ lein zzz*

Exception in thread "main" java.io.FileNotFoundException: Could not locate
leiningen/zzz__init.class or leiningen/zzz.clj on classpath: ,
compiling:(/tmp/form-init8179496390342821964.clj:1:4)
        at clojure.lang.Compiler.load(Compiler.java:7142)
        ...
        at clojure.main.main(main.java:37)
Caused by: java.io.FileNotFoundException: Could not locate
leiningen/zzz__init.class or leiningen/zzz.clj on classpath:
        at clojure.lang.RT.load(RT.java:443)
        ...
        at clojure.lang.Compiler.load(Compiler.java:7130)
        ... 11 more
Subprocess failed



Tim Washington
Interruptsoftware.com <http://interruptsoftware.com>



On Mon, Sep 1, 2014 at 10:58 PM, Timothy Washington <twash...@gmail.com>
wrote:

> Awesome, thanks for the feedback. That all makes sense. And yes, the work
> will be done in the project's VM.
>
> I guess what I'm missing is something more basic. If you look at
> lein-midje
> <https://github.com/marick/lein-midje/blob/master/src/leiningen/midje.clj#L168>
> or lein-spec
> <https://github.com/slagyr/speclj/blob/master/src/clj/leiningen/spec.clj#L41>,
> they're doing straightforward requires of *eval-in-project*. Yet, I'll
> get an error, even for a stripped down version. So take the below example.
> I'm locally installing the lein plugin, and running it from a separate
> project with "*lein chesk fubar*".  Still an error loading
> eval-in-project. I looked through some other leiningen projects. None of
> them are bundling some leiningen core library. I'm sure it'll be a simple
> switch that'll make sense, once I figure it out.
>
> *error*
>
> $ lein chesk bkell.domain.user-check
> clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: *Unable
> to resolve symbol: eval-in-project in this context,
> compiling:(leiningen/chesk.clj:16:3)*
>  at clojure.lang.Compiler.analyze (Compiler.java:6464)
>     clojure.lang.Compiler.analyze (Compiler.java:6406)
>     clojure.lang.Compiler$InvokeExpr.parse (Compiler.java:3665)
>     ...
>
>
> *project.clj *
>
> (defproject chesk "0.1.0-SNAPSHOT"
>   :description "FIXME: write description"
>   :url "http://example.com/FIXME";
>   :license {:name "Eclipse Public License"
>             :url "http://www.eclipse.org/legal/epl-v10.html"}
>   :eval-in-leiningen true)
>
>
> *chesk.clj *
>
> (ns leiningen.chesk
>   (:require [leiningen.core.eval :refer [eval-in-project]]))
>
> (defn check-foreach-namespace []
>   (println "sanity check"))
>
> (defn chesk [project & args]
>   (eval-in-project project
>                           `(check-foreach-namespace)
>                           '()))
>
>
>
> Hmm
>
> Tim Washington
> Interruptsoftware.com <http://interruptsoftware.com>
>
>
>
> On Mon, Sep 1, 2014 at 10:27 AM, Nelson Morris <nmor...@nelsonmorris.net>
> wrote:
>
>> When writing lein plugins you have to think about if they should do work
>> in lein's vm or the project's vm. In this case, since you want to load
>> namespaces from the project, the work will need to be done in the project's
>> vm.  This is where `leiningen.core.eval/eval-in-project` is used, to spin
>> up the project's vm and run forms in it.
>>
>> The arguments to `l.c.e/eval-in-project` will be the project map, a
>> clojure form representing what to run, and a clojure form designed to allow
>> avoidance of the gilardi scenario. The big question here becomes how to
>> create the first form representing what to run.
>>
>> Option 1: short syntax quote form + injecting dependency into project
>> Example: cljx
>> https://github.com/lynaghk/cljx/blob/master/src/leiningen/cljx.clj#L32
>>  and
>> https://github.com/lynaghk/cljx/blob/master/src/leiningen/cljx.clj#L20
>> Disadvantages:
>>
>> 1. Requires injecting a dependency into the project (could also be ok if
>> the working code already exists in a seperate dep, marg vs lein-marg,
>> ring-server vs lein-ring, etc).
>> 2. Needs a require for the dependency's helper namespace as part of
>> gilardi avoidance form.
>>
>> Option 2: long syntax quote form
>> Example: leiningen.test
>> https://github.com/technomancy/leiningen/blob/master/src/leiningen/test.clj#L67
>> Disadvantages:
>>
>> 1. Have to think in syntax quote vs normal evaluation.
>> 2. Needs a require for each namespace the form uses as part of the
>> gilardi avoidance form (could be ok if only 1 or 2 ns used).
>>
>>
>> I generally recommend option 1 as easier to think about, and I believe it
>> to be more common.
>>
>> As for why `l.c.e/eval-in-project` was not found, I would hazard a guess
>> based on limited info that it was not `require`d first.
>>
>> I'll plug
>> https://github.com/technomancy/leiningen/blob/master/doc/PLUGINS.md#code-evaluation
>> and https://www.youtube.com/watch?v=uXebQ7RkhKs as containing similar
>> information said in different ways, in case it comes across better there.
>>
>> -
>> Nelson Morris
>>
>>
>> On Sun, Aug 31, 2014 at 4:02 PM, Timothy Washington <twash...@gmail.com>
>> wrote:
>>
>>> Ok,
>>>
>>> So I'm trying to write a leiningen plugin that takes some namespace
>>> arguments. Let's call it *<myplugin>*. This is a brand new plugin, so
>>> everything else is empty, and this value is present: *{:eval-in-leiningen
>>> true}*. My problem happens when, in the context of the project
>>> *<myplugin>* is acting on, the plugin code fails. I pass in some
>>> project-local namespace that I want to eval (which is definitely present).
>>> And I get this situation:
>>>
>>> *Error*
>>>
>>> java.lang.Exception: No namespace: <mynamespace> found
>>>
>>>
>>> *Offending Code*
>>>
>>> (defn check-foreach-namespace [namespaces]
>>>
>>>
>>>   (let [fnss (filter #(= Fubar (type (var-get %)))
>>>
>>>                      (vals *(ns-publics (symbol (first namespaces)))*))]
>>>
>>>
>>>     (println "filtered-namespace [" fnss "]")))
>>>
>>>
>>> (defn myplugin [project & args]
>>>
>>>   (check-foreach-namespace args))
>>>
>>>
>>>
>>> So then, if I try to require the namespace being passed in, that too
>>> fails like so:
>>>
>>> *Error: *
>>>
>>> java.io.FileNotFoundException: Could not locate <mynamespace_file.clj>
>>> on classpath:
>>>
>>>
>>> *Offending Code:*
>>>
>>> (ns leiningen.chesk
>>>
>>>   (:require [clojure.test.check :as tc]
>>>
>>>             [clojure.test.check.generators :as gen]
>>>
>>>             [clojure.test.check.properties :as prop]))
>>>
>>>
>>> (defn check-foreach-namespace [namespaces]
>>>
>>>
>>>
>>>   (let [nss (map *#(require (symbol %))* namespaces)
>>>
>>>          fnss (filter #(= clojure.test.check.generators.Generator (type
>>> (var-get %)))
>>>
>>>                      (vals (ns-publics (symbol (first nss)))))]
>>>
>>>
>>>     (println "filtered-namespace [" fnss "]")))
>>>
>>>
>>> (defn myplugin [project & args]
>>>
>>>   (check-foreach-namespace args))
>>>
>>>
>>> Looking around, I thought I had found some relevant instruction on how
>>> to handle this gilardi scenario
>>> <https://github.com/technomancy/leiningen/blob/master/doc/PLUGINS.md#evaluating-in-project-context>.
>>> So I tried to use *eval-in-project* with and without namespace prefix,
>>> and with several permutations of quoting. This is the error that occurs.
>>>
>>> *Error: *
>>>
>>> clojure.lang.Compiler$CompilerException:
>>> java.lang.ClassNotFoundException: leiningen.core.eval
>>>
>>>
>>> *Offending Code: *
>>>
>>> (ns leiningen.chesk
>>>   (:require [clojure.test.check :as tc]
>>>             [clojure.test.check.generators :as gen]
>>>             [clojure.test.check.properties :as prop]))
>>>
>>> (defn check-foreach-namespace [namespaces]
>>>
>>>   (let [fnss (filter #(= clojure.test.check.generators.Generator (type
>>> (var-get %)))
>>>                      (vals (ns-publics (symbol (first namespaces)))))]
>>>
>>>     (println "filtered-namespace [" fnss "]")))
>>>
>>> (defn myplugin [project & args]
>>>   (*leiningen.core.eval/eval-in-project* project
>>>                                        (check-foreach-namespace args)
>>>                                        (map #(require (symbol %)) args)))
>>>
>>>
>>>
>>>
>>> So something that looks like it should be straightforward, is not
>>> working out as planned. I also can't quite see how other plugins are doing
>>> this. lein-midje seems a bit cryptic (see here
>>> <https://github.com/marick/lein-midje/blob/master/src/leiningen/midje.clj#L14-L23>
>>> and here
>>> <https://github.com/marick/Midje/blob/master/src/midje/repl.clj#L192-L235>).
>>> Are there any clearer examples?
>>>
>>>
>>> Tim Washington
>>> Interruptsoftware.com <http://interruptsoftware.com>
>>>
>>>  --
>>> 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