All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.stanfy.helium.gradle.HeliumExtension.groovy Maven / Gradle / Ivy

package com.stanfy.helium.gradle

import com.stanfy.helium.Helium
import com.stanfy.helium.gradle.SourceGenDslDelegate.ConstantsDslDelegate
import com.stanfy.helium.gradle.SourceGenDslDelegate.EntitiesDslDelegate
import com.stanfy.helium.gradle.tasks.BaseHeliumTask
import com.stanfy.helium.gradle.tasks.GenerateApiTestsTask
import com.stanfy.helium.gradle.tasks.GenerateJavaConstantsTask
import com.stanfy.helium.gradle.tasks.GenerateJavaEntitiesTask
import com.stanfy.helium.handler.codegen.java.JavaGeneratorOptions
import com.stanfy.helium.utils.DslUtils
import com.stanfy.helium.utils.Names
import groovy.transform.CompileStatic
import org.gradle.api.Project
import org.gradle.api.tasks.GradleBuild
import org.slf4j.Logger
import org.slf4j.LoggerFactory

/**
 * Helium extension.
 */
class HeliumExtension {

  public static final String VERSION = "0.3.4"

  /** Tasks group. */
  public static final String GROUP = "Helium"

  /** Logger. */
  private static final Logger LOG = LoggerFactory.getLogger(HeliumExtension.class)

  private static final String TESTS_OUT_PATH = "helium/api-tests"

  private static final String HELIUM_ARTIFACT_NAME = "helium"
  public static final String HELIUM_DEP = "com.stanfy.helium:$HELIUM_ARTIFACT_NAME"

  /** Helium. */
  private Helium heliumInstance

  /** Specification location. */
  File specification

  /** Ignore test failures. */
  boolean ignoreFailures

  /** Source generation tasks. */
  private final SourceGenerationTasks sourceGenTasks = new SourceGenerationTasks()

  private Project project

  private def genTasks = []
  private GradleBuild runTestsTask

  void attach(final Project project) {
    this.project = project
  }

  private void initHelium() {
    Helium helium = new Helium().defaultTypes() from this.specification
    this.heliumInstance = helium
    genTasks.each {
      it.helium = helium
    }
  }

  void setSpecification(final File file) {
    this.@specification = file

    GenerateApiTestsTask genTestsTask = project.tasks.create("genApiTests", GenerateApiTestsTask)
    genTestsTask.group = GROUP
    genTestsTask.output = new File(project.buildDir, "source/$TESTS_OUT_PATH")
    genTestsTask.input = file
    genTasks += genTestsTask
    LOG.debug "genApiTests task: json=$genTestsTask.input, output=$genTestsTask.output"

    runTestsTask = project.tasks.create('runApiTests', GradleBuild)
    runTestsTask.group = GROUP
    runTestsTask.buildFile = new File(genTestsTask.output, "build.gradle")
    runTestsTask.dir = genTestsTask.output
    runTestsTask.tasks = ['check']
    runTestsTask.dependsOn genTestsTask
    LOG.debug "runApiTests task: dir=$runTestsTask.dir"

    initHelium()
  }

  void sourceGen(Closure config) {
    SourceGenDslDelegate delegate = new SourceGenDslDelegate(config.owner)
    DslUtils.runWithProxy(delegate, config)
    processEntities(delegate.entities)
    processConstants(delegate.constants)
  }

  SourceGenerationTasks getSourceGen() {
    return sourceGenTasks
  }

  private void processEntities(EntitiesDslDelegate entities) {
    if (!entities) {
      return
    }

    if (!entities.output) {
      entities.output = new File(project.buildDir, "source/gen/rest-api")
    }
    GenerateJavaEntitiesTask task = project.tasks.create(
        taskName("generateEntities", entities.genOptions),
        GenerateJavaEntitiesTask
    )
    genTasks += task
    configureGenTask(task, entities.output)
    task.options = entities.genOptions
    sourceGen.entities[entities.genOptions.packageName] = task
  }

  private void configureGenTask(BaseHeliumTask task, File output) {
    task.output = output
    task.input = specification
    task.helium = heliumInstance
  }

  private void processConstants(ConstantsDslDelegate constants) {
    if (!constants) {
      return
    }

    if (!constants.output) {
      constants.output = new File(project.buildDir, "source/gen/constants")
    }
    GenerateJavaConstantsTask task = project.tasks.create(
        taskName("generateConstants", constants.genOptions),
        GenerateJavaConstantsTask
    )
    genTasks += task
    configureGenTask(task, constants.output)
    task.options = constants.genOptions
    sourceGen.constants[constants.genOptions.packageName] = task
  }

  private String taskName(final String prefix, final JavaGeneratorOptions options) {
    String pkgSuffix = Names.prettifiedName(Names.canonicalName(options.packageName))
    return "$prefix${pkgSuffix.capitalize()}"
  }

  public static class SourceGenerationTasks {
    Map entities = [:]
    Map constants = [:]
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy