我目前正在为Gatling实现SBT插件。其功能之一是在SBT的新浏览器选项卡中打开最后生成的报告。由于每次运行都可以具有不同的“模拟ID”(基本上是一个简单的字符串),因此我想在模拟ID上提供制表符补全。
一个例子 :
运行在加特林SBT插件会产生几个文件夹(从报告generaation的simulationId +日期命名)target/gatling
,例如mysim-20140204234534
,myothersim-20140203124534
和yetanothersim-20140204234534
。
让我们称之为任务lastReport
。如果有人开始输入文字lastReport my
,我希望过滤掉制表符补全,仅建议mysim
和myothersim
。
获得仿真ID轻而易举,但是如何帮助解析器过滤掉建议,使其仅建议现有的仿真ID?
综上所述,我想以testOnly
某种方式做些什么:我只想建议适合我的情况。
预先感谢您的回答,
皮埃尔
编辑:由于我最近一次尝试后卡住了,这是我的inputTask的代码,处于当前状态:
package io.gatling.sbt
import sbt._
import sbt.complete.{ DefaultParsers, Parser }
import io.gatling.sbt.Utils._
object GatlingTasks {
val lastReport = inputKey[Unit]("Open last report in browser")
val allSimulationIds = taskKey[Set[String]]("List of simulation ids found in reports folder")
val allReports = taskKey[List[Report]]("List of all reports by simulation id and timestamp")
def findAllReports(reportsFolder: File): List[Report] = {
val allDirectories = (reportsFolder ** DirectoryFilter.&&(new PatternFilter(reportFolderRegex.pattern))).get
allDirectories.map(file => (file, reportFolderRegex.findFirstMatchIn(file.getPath).get)).map {
case (file, regexMatch) => Report(file, regexMatch.group(1), regexMatch.group(2))
}.toList
}
def findAllSimulationIds(allReports: Seq[Report]): Set[String] = allReports.map(_.simulationId).distinct.toSet
def openLastReport(allReports: List[Report], allSimulationIds: Set[String]): Unit = {
def simulationIdParser(allSimulationIds: Set[String]): Parser[Option[String]] =
DefaultParsers.ID.examples(allSimulationIds, check = true).?
def filterReportsIfSimulationIdSelected(allReports: List[Report], simulationId: Option[String]): List[Report] =
simulationId match {
case Some(id) => allReports.filter(_.simulationId == id)
case None => allReports
}
Def.inputTaskDyn {
val selectedSimulationId = simulationIdParser(allSimulationIds).parsed
val filteredReports = filterReportsIfSimulationIdSelected(allReports, selectedSimulationId)
val reportsSortedByDate = filteredReports.sorted.map(_.path)
Def.task(reportsSortedByDate.headOption.foreach(file => openInBrowser((file / "index.html").toURI)))
}
}
}
当然,openReport
使用的结果叫allReports
和allSimulationIds
任务。我认为我已经接近功能正常的输入任务,但是我仍然缺少一些东西...
Def.inputTaskDyn
返回类型的值,InputTask[T]
并且不执行任何副作用。结果需要绑定到InputKey
,如lastReport
。返回类型openLastReport
为Unit
,这意味着openLastReport
将构造一个将被丢弃的值,实际上无济于事。相反,有:
def openLastReport(...): InputTask[...] = ...
lastReport := openLastReport(...).evaluated
(或者,实现openLastReport
可以内联到的右侧:=
)
您可能不需要inputTaskDyn
,只是inputTask
。仅inputTaskDyn
在需要返回任务时才需要。否则,请使用inputTask
和删除Def.task
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句