Skip to content

Commit

Permalink
Merge pull request #200 from grails/commands/taglib
Browse files Browse the repository at this point in the history
Add command create-taglib
  • Loading branch information
puneetbehl authored Sep 24, 2023
2 parents 90d01ad + a1af8a7 commit 1fdad47
Show file tree
Hide file tree
Showing 5 changed files with 228 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
* Copyright 2017-2020 original authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.grails.forge.cli.command;

import io.micronaut.context.annotation.Parameter;
import io.micronaut.core.annotation.ReflectiveAccess;
import io.micronaut.core.util.functional.ThrowingSupplier;
import jakarta.inject.Inject;
import org.grails.forge.application.Project;
import org.grails.forge.cli.CodeGenConfig;
import org.grails.forge.cli.command.templates.taglib;
import org.grails.forge.cli.command.templates.taglibSpec;
import org.grails.forge.io.ConsoleOutput;
import org.grails.forge.io.OutputHandler;
import org.grails.forge.template.RenderResult;
import org.grails.forge.template.RockerTemplate;
import org.grails.forge.template.TemplateRenderer;
import picocli.CommandLine;

import java.io.IOException;

@CommandLine.Command(name = CreateTagLibCommand.NAME, description = "Creates a Grails TagLib")
public class CreateTagLibCommand extends CodeGenCommand {

public static final String NAME = "create-taglib";

@ReflectiveAccess
@CommandLine.Parameters(paramLabel = "TAG-LIB-NAME", description = "The name of the taglib to create")
String tagLibName;

@Inject
public CreateTagLibCommand(@Parameter CodeGenConfig config) {
super(config);
}

public CreateTagLibCommand(CodeGenConfig config,
ThrowingSupplier<OutputHandler, IOException> outputHandlerSupplier,
ConsoleOutput consoleOutput) {
super(config, outputHandlerSupplier, consoleOutput);
}

@Override
public boolean applies() {
return true;
}

@Override
public Integer call() throws Exception {
final Project project = getProject(tagLibName);
TemplateRenderer templateRenderer = getTemplateRenderer(project);
final RenderResult controllerRenderResult = templateRenderer.render(new RockerTemplate("grails-app/taglib/{packagePath}/{className}TagLib.groovy", taglib.template(project)), overwrite);
final RenderResult controllerSpecRenderResult = templateRenderer.render(new RockerTemplate("src/test/groovy/{packagePath}/{className}TagLibSpec.groovy", taglibSpec.template(project)), overwrite);
if (controllerRenderResult != null && controllerSpecRenderResult != null) {
logRenderResult(controllerRenderResult);
logRenderResult(controllerSpecRenderResult);
}

return 0;
}

private void logRenderResult(RenderResult result) throws Exception {
if (result != null) {
if (result.isSuccess()) {
out("@|blue ||@ Rendered taglib to " + result.getPath());
} else if (result.isSkipped()) {
warning("Rendering skipped for " + result.getPath() + " because it already exists. Run again with -f to overwrite.");
} else if (result.getError() != null) {
throw result.getError();
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
@import org.grails.forge.application.Project

@args (
Project project
)

@if(project.getPackageName() != null) {
package @project.getPackageName()

}


class @project.getClassName()TagLib {

def simple = { attrs, body ->

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
@import org.grails.forge.application.Project

@args (
Project project
)

@if(project.getPackageName() != null) {
package @project.getPackageName()

}

import grails.testing.web.taglib.TagLibUnitTest
import spock.lang.Specification

class @project.getClassName()TagLibSpec extends Specification implements TagLibUnitTest<@project.getClassName()TagLib> {

void "test simple tag as method"() {
expect:
tagLib.simple()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package org.grails.forge.cli.command

import io.micronaut.context.ApplicationContext
import org.grails.forge.application.ApplicationType
import org.grails.forge.cli.CodeGenConfig
import org.grails.forge.cli.CommandFixture
import org.grails.forge.cli.CommandSpec
import org.grails.forge.io.ConsoleOutput
import spock.lang.AutoCleanup
import spock.lang.Shared

class CreateTagLibCommandSpec extends CommandSpec implements CommandFixture {

@Shared
@AutoCleanup
ApplicationContext beanContext = ApplicationContext.run()


void "test creating a taglib"() {

setup:
generateProject(ApplicationType.WEB)
CodeGenConfig codeGenConfig = CodeGenConfig.load(beanContext, dir, ConsoleOutput.NOOP)
ConsoleOutput consoleOutput = Mock(ConsoleOutput)
CreateTagLibCommand command = new CreateTagLibCommand(codeGenConfig, getOutputHandler(consoleOutput), consoleOutput)
command.tagLibName = "simple"

when:
Integer exitCode = command.call()
File output = new File(dir, "grails-app/taglib/example/grails/SimpleTagLib.groovy")
File specOutput = new File(dir, "src/test/groovy/example/grails/SimpleTagLibSpec.groovy")

then:
exitCode == 0
output.exists()
specOutput.exists()
2 * consoleOutput.out({ it.contains("Rendered taglib") })
}

void "test app with taglib"() {
setup:
generateProject(ApplicationType.WEB)
CodeGenConfig codeGenConfig = CodeGenConfig.load(beanContext, dir, ConsoleOutput.NOOP)
ConsoleOutput consoleOutput = Mock(ConsoleOutput)
CreateTagLibCommand command = new CreateTagLibCommand(codeGenConfig, getOutputHandler(consoleOutput), consoleOutput)

when:
command.tagLibName = 'simple'
Integer exitCode = command.call()
executeGradleCommand("test")

then:
exitCode == 0
testOutputContains("SimpleTagLibSpec > test simple tag as method FAILED")

when:
new File(dir, "grails-app/taglib/example/grails/SimpleTagLib.groovy").text = '''package example.grails
class SimpleTagLib {
def simple = { attrs, body ->
out << "Hello!"
}
}
'''
then:
executeGradleCommand("test")
testOutputContains("BUILD SUCCESSFUL")

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.grails.forge.cli.command

import io.micronaut.configuration.picocli.PicocliRunner
import org.grails.forge.cli.CodeGenConfig
import org.grails.forge.io.ConsoleOutput
import org.grails.forge.utils.CommandSpec
import spock.lang.Ignore

class CreateTagLibSpec extends CommandSpec {

@Ignore
void "test create-taglib command"() {
when:
generateProjectWithDefaults()
applicationContext.createBean(CodeGenConfig.class, new CodeGenConfig())

then:
applicationContext.getBean(CodeGenConfig.class)

when:
PicocliRunner.run(CreateTagLibCommand.class, applicationContext, "simple")

then:
new File(dir, "grails-app/taglib/example/grails/SimpleTagLib.groovy").exists()
new File(dir, "src/tests/example/grails/SimpleTagLibSpec.groovy").exists()

}

@Override
String getTempDirectoryPrefix() {
return "test-app"
}
}

0 comments on commit 1fdad47

Please sign in to comment.