
org.jnario.spec.doc.SpecDocGenerator.xtend Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.jnario.standalone Show documentation
Show all versions of org.jnario.standalone Show documentation
The required libraries to execute Jnario specifications without Eclipse.
The newest version!
/*******************************************************************************
* Copyright (c) 2012 BMW Car IT and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.jnario.spec.doc
import com.google.inject.Inject
import java.util.List
import org.eclipse.emf.ecore.EObject
import org.eclipse.xtend.core.xtend.XtendClass
import org.eclipse.xtend.core.xtend.XtendMember
import org.eclipse.xtend2.lib.StringConcatenation
import org.jnario.ExampleTable
import org.jnario.doc.AbstractDocGenerator
import org.jnario.doc.Filter
import org.jnario.doc.FilterExtractor
import org.jnario.doc.HtmlFile
import org.jnario.spec.naming.ExampleNameProvider
import org.jnario.spec.spec.Example
import org.jnario.spec.spec.ExampleGroup
import static org.eclipse.xtend.core.xtend.XtendPackage$Literals.*
class SpecDocGenerator extends AbstractDocGenerator {
@Inject extension ExampleNameProvider
@Inject extension FilterExtractor
override createHtmlFile(XtendClass xtendClass) {
if(!(xtendClass instanceof ExampleGroup)){
return HtmlFile::EMPTY_FILE
}
val exampleGroup = xtendClass as ExampleGroup
HtmlFile::newHtmlFile[
name = exampleGroup.toJavaClassName
title = exampleGroup.asTitle
content = exampleGroup.generateContent
rootFolder = exampleGroup.root
sourceCode = xtendClass.eContainer.pre("lang-spec")
fileName = xtendClass.fileName
executionStatus = exampleGroup.executionStateClass
]
}
def private generateContent(ExampleGroup exampleGroup)'''
«exampleGroup.generateDoc()»
«exampleGroup.generateMembers(1)»
'''
def private StringConcatenation generateMembers(ExampleGroup exampleGroup, int level){
val result = new StringConcatenation
var inList = false
val members = exampleGroup.members.filter[(it instanceof Example)
|| (it instanceof ExampleGroup)
|| (it instanceof ExampleTable)
]
for(member : members){
val isExampleGroup = member instanceof ExampleGroup
if (inList && !isExampleGroup){
result.append("")
result.append(generate(member, level))
result.append(" ")
}else if(!inList && !isExampleGroup){
result.append("")
result.append("- ")
result.append(generate(member, level))
result.append("
")
inList = true
}else if(inList && isExampleGroup){
result.append("
")
result.append(generate(member, level))
inList = false
}else if(!inList && isExampleGroup){
result.append(generate(member, level))
}
}
if(inList){
result.append("")
}
return result
}
def private generateDoc(EObject eObject)'''
«IF eObject.documentation != null»
«eObject.documentation.markdown2Html»
«ENDIF»
'''
def dispatch generate(XtendMember member, int level)'''
'''
def dispatch generate(Example example, int level){
var String docString = example.documentation
var filters = emptyList
if(docString != null){
val filterResult = docString.apply
filters = filterResult.filters
docString = filterResult.string
docString = docString.markdown2Html
}
'''
«IF example.name != null»
«example.describe.decode»
«ENDIF»
«docString»
«IF !example.pending && example.eIsSet(XTEND_EXECUTABLE__EXPRESSION)»
«example.toCodeBlock(filters)»
«ENDIF»
«example.errorMessage»
'''
}
def toCodeBlock(Example example, List filters){
var prefix = ''
prefix = filters.apply(prefix)
val code = example.expression.serialize(filters)
if(code.length == 0) return ""
'''
«prefix»
«code»
'''
}
def dispatch generate(ExampleTable table, int level)'''
«table.toFieldName.toTitle»
«table.generateDoc»
«super.generate(table)»
'''
def dispatch generate(ExampleGroup exampleGroup, int level)'''
«IF level > 1»
«ENDIF»
«exampleGroup.asTitle»
«exampleGroup.generateDoc»
«generateMembers(exampleGroup, level + 1)»
«IF level > 1»
«ENDIF»
'''
def private header(ExampleGroup exampleGroup, int level){
if(level <= 1){
"3"
}else if(level == 2){
"4"
}else {
"5"
}
}
def dispatch asTitle(ExampleGroup exampleGroup){
exampleGroup.describe.toTitle
}
def dispatch asTitle(Example example){
example.describe.toTitle
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy