Commits

Meikel Brandmeyer committed 3328f38

Fix ClojureSourceSet

Unfortunately this requires some breaking changes.

* includeNamespace and excludeNamespace are now clojureIncludeNamespace
resp. clojureExcludeNamespace on SourceSet level
* sourceDir is gone; it's now sourceDirs again

Fixes #22

Comments (0)

Files changed (5)

src/main/groovy/clojuresque/ClojureCompileTask.groovy

             this.jvmClosure()
             systemProperties "clojure.compile.path": this.destinationDir.path
             classpath = project.files(
-                this.inputRoots,
+                this.clojureRoots.srcDirs,
                 this.destinationDir,
                 project.configurations.development,
                 this.compileClasspath

src/main/groovy/clojuresque/ClojurePlugin.groovy

 import org.gradle.api.Plugin
 import org.gradle.api.Project
 import org.gradle.api.artifacts.dsl.RepositoryHandler
+import org.gradle.api.internal.project.ProjectInternal
 import org.gradle.api.plugins.JavaPlugin
 import org.gradle.api.plugins.MavenPlugin
 import org.gradle.api.tasks.Copy
     }
 
     private void configureSourceSets(Project project) {
+        ProjectInternal projectInternal = (ProjectInternal)project
+
         project.sourceSets.each { sourceSet ->
-            String srcDir = String.format("src/%s/clojure", sourceSet.name)
+            ClojureSourceSet clojureSourceSet =
+                new ClojureSourceSet(sourceSet.name, projectInternal.fileResolver)
 
-            ClojureSourceSetConvention clojureSourceSetConvention =
-                new ClojureSourceSetConvention(project, srcDir)
-
-            sourceSet.convention.plugins.clojure = clojureSourceSetConvention
+            sourceSet.convention.plugins.clojure = clojureSourceSet
+            sourceSet.clojure.srcDirs = [ String.format("src/%s/clojure", sourceSet.name) ]
             sourceSet.resources.filter.exclude("**/*.clj")
-            sourceSet.allSource.plus(clojureSourceSetConvention.clojure)
+            sourceSet.allSource.add(clojureSourceSet.clojure)
         }
     }
 
                     type: ClojureCompileTask.class) {
                 destinationDir = set.classesDir
                 source set.clojure
-                inputRoot set.clojure.sourceDir
+                clojureRoots = set.clojure
                 compileClasspath = set.compileClasspath
                 dependsOn set.compileClasspath, project.configurations.development
                 description =

src/main/groovy/clojuresque/ClojureSourceSet.groovy

 
 package clojuresque
 
-import org.gradle.api.Project
-import org.gradle.api.file.FileTree
-
 import groovy.lang.Closure
 
-import java.io.File
+import org.gradle.api.file.FileTree
+import org.gradle.api.file.SourceDirectorySet
+import org.gradle.api.internal.file.UnionFileTree
+import org.gradle.api.internal.file.DefaultSourceDirectorySet
+import org.gradle.api.internal.file.FileResolver
+import org.gradle.api.tasks.util.PatternFilterable
+import org.gradle.api.tasks.util.PatternSet
+import org.gradle.util.ConfigureUtil
 
 class ClojureSourceSet {
-    private Project project
-    private File sourceDir
-    @Delegate private FileTree sources
+    private final SourceDirectorySet clojure
+    private final UnionFileTree allClojure
+    private final PatternFilterable clojurePatterns = new PatternSet()
 
-    public ClojureSourceSet(Project project, Object dir) {
-        this.project = project
-        this.sources = project.fileTree {
-            include "**/*.clj"
-        }
-        setSourceDir(dir)
+    public ClojureSourceSet(String displayName, FileResolver fileResolver) {
+        clojure = new DefaultSourceDirectorySet(String.format("%s Clojure source", displayName), fileResolver)
+        clojure.filter.include("**/*.clj")
+        clojurePatterns.include("**/*.clj")
+        allClojure = new UnionFileTree(String.format("%s Clojure source", displayName), clojure.matching(clojurePatterns))
     }
 
-    public void setSourceDir(Object dir) {
-        this.sourceDir = project.file(dir)
-        this.sources.from this.sourceDir
+    public SourceDirectorySet getClojure() {
+        return clojure
     }
 
-    public File getSourceDir() {
-        return this.sourceDir
+    public ClojureSourceSet clojure(Closure configureClosure) {
+        ConfigureUtil.configure(configureClosure, this.clojure)
+        return this
     }
 
-    public void includeNamespace(String pattern) {
-        sources.include(
+    public PatternFilterable getClojureSourcePatterns() {
+        return clojurePatterns
+    }
+
+    public FileTree getAllClojure() {
+        return allClojure
+    }
+
+    public void clojureIncludeNamespace(String pattern) {
+        clojure.include(
             pattern.replaceAll("-", "_").replaceAll("\\.", "/") + ".clj"
         )
     }
 
-    public void excludeNamespace(String pattern) {
-        sources.exclude(
+    public void clojureExcludeNamespace(String pattern) {
+        clojure.exclude(
             pattern.replaceAll("-", "_").replaceAll("\\.", "/") + ".clj"
         )
     }

src/main/groovy/clojuresque/ClojureSourceSetConvention.groovy

-/*-
- * Copyright 2009,2010 © Meikel Brandmeyer.
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-package clojuresque
-
-import org.gradle.api.Project
-import org.gradle.api.file.FileTree
-import org.gradle.util.ConfigureUtil
-
-import groovy.lang.Closure
-
-class ClojureSourceSetConvention {
-    private ClojureSourceSet clojure
-
-    public ClojureSourceSetConvention(Project project, Object dir) {
-        this.clojure = new ClojureSourceSet(project, dir)
-    }
-
-    public ClojureSourceSetConvention clojure(Closure closure) {
-        ConfigureUtil.configure(closure, this.clojure)
-        return this
-    }
-
-    public FileTree getClojure() {
-        return this.clojure
-    }
-}

src/main/groovy/clojuresque/ClojureSourceTask.groovy

 package clojuresque
 
 import org.gradle.api.file.FileCollection
+import org.gradle.api.file.SourceDirectorySet
 import org.gradle.api.tasks.OutputDirectory
 import org.gradle.api.tasks.SourceTask
 import org.gradle.api.tasks.SourceSet
     def Closure jvmClosure = {}
     def FileCollection compileClasspath
     def File destinationDir
-    def List<Object> inputRoots = new ArrayList<Object>()
+    def SourceDirectorySet clojureRoots
 
     public ByteArrayInputStream clojureInput(String cmd) {
         return new ByteArrayInputStream(cmd.bytes)
         return this.destinationDir
     }
 
-    public ClojureCompileTask inputRoot(Object... roots) {
-        roots.each { this.inputRoots.add(it) }
-        return this
-    }
-
     public ClojureCompileTask jvm(Closure closure) {
         this.jvmClosure = closure
         return this