Sbt 输入任务实现中的筛选选项卡完成
我目前正在为实现一个SBT插件。 它的一个功能是在SBT的新浏览器选项卡中打开最后生成的报告。 由于每次运行都可以有一个不同的“模拟ID”(基本上是一个简单的字符串),我想提供模拟ID上的制表符完成 例如: 运行Gatling SBT插件将在Sbt 输入任务实现中的筛选选项卡完成,sbt,tab-completion,Sbt,Tab Completion,我目前正在为实现一个SBT插件。 它的一个功能是在SBT的新浏览器选项卡中打开最后生成的报告。 由于每次运行都可以有一个不同的“模拟ID”(基本上是一个简单的字符串),我想提供模拟ID上的制表符完成 例如: 运行Gatling SBT插件将在target/Gatling中生成多个文件夹(命名为simulationId+报告生成日期),例如mysim-20140204234534,myothersim-20140203124534和yetanothersim-20140204234534 让我们调
target/Gatling
中生成多个文件夹(命名为simulationId+报告生成日期),例如mysim-20140204234534
,myothersim-20140203124534
和yetanothersim-20140204234534
让我们调用任务lastReport
。
如果有人开始键入lastReport my
,我想过滤掉标签完成,只建议mysim
和myothersim
获取模拟ID是件轻而易举的事,但是如何帮助解析器过滤出建议,使其只建议现有的模拟ID呢
总而言之,我想做testOnly
做的事情,在某种程度上:我只想建议在我的上下文中有意义的事情
提前感谢您的回答
皮埃尔
编辑:由于我最近一次尝试后有点卡住,以下是我的inputTask的代码,处于当前状态:
包io.gatling.sbt
进口sbt_
导入sbt.complete.{DefaultParsers,Parser}
导入io.gatling.sbt.Utils_
对象任务{
val lastReport=inputKey[单位](“在浏览器中打开上一个报告”)
val allSimulationIds=taskKey[Set[String]](“在报告文件夹中找到的模拟ID列表”)
val allReports=taskKey[List[Report]](“按模拟id和时间戳列出的所有报告”)
def findAllReports(报告文件夹:文件):列表[报告]={
val allDirectories=(reportsFolder**DirectoryFilter.&&(新模式过滤器(reportFolderRegex.pattern))).get
allDirectories.map(文件=>(文件,reportFolderRegex.findFirstMachin(文件.getPath.get)).map{
案例(文件,regexMatch)=>报告(文件,regexMatch.group(1),regexMatch.group(2))
}托利斯先生
}
def FINDALLSIMulationID(allReports:Seq[Report]):Set[String]=allReports.map(u.simulationId).distinct.toSet
def openLastReport(allReports:List[Report],AllSimulationId:Set[String]):单位={
def simulationIdParser(allSimulationIds:Set[String]):解析器[Option[String]]=
DefaultParsers.ID.examples(AllSimulationId,check=true)。?
def filterReportsIfSimulationIdSelected(所有报告:列表[报告],模拟ID:选项[字符串]):列表[报告]=
模拟ID匹配{
case Some(id)=>allReports.filter(u.simulationId==id)
案例无=>allReports
}
Def.inputaskdyn{
val selectedSimulationId=simulationIdParser(AllSimulationId)。已解析
val filteredReports=filterReportsIfSimulationIdSelected(所有报告,selectedSimulationId)
val ReportsOrderedByDate=filteredReports.sorted.map(uz.path)
Def.task(reportsSortedByDate.headOption.foreach(file=>openInBrowser((file/“index.html”).toURI)))
}
}
}
当然,openReport
是使用allReports
和allsimulationid
任务的结果调用的。
我想我已经接近一个正常的输入任务了,但是我仍然缺少一些东西
Def.inputAskdyn
返回类型为inputAsk[T]
的值,并且不执行任何副作用。结果需要绑定到InputKey
,如lastReport
。openLastReport
的返回类型是Unit
,这意味着openLastReport
将构造一个将被丢弃的值,实际上没有做任何有用的事情。相反,我们应该:
def openLastReport(...): InputTask[...] = ...
lastReport := openLastReport(...).evaluated
(或者,openLastReport
的实现可以内联到:=
的右侧)inputTaskDyn
,只需要inputTask
。如果需要返回任务,则只需输入askdyn。否则,请使用inputTask
并放下Def.task
你看过吗?当然,SBT的文档始终是我的第一站:)我还深入研究了
testOnly
和testQuick
实现,我发现我基本上是在寻找解析器的示例
方法。然而,我并没有设法让它工作,但我想我正在做一些事情。我会回来和大家分享我的解决方案。好吧,我这样问是因为如果你有一个可以工作的解析器(或者几乎可以工作的话),帮助会更容易。如果您尝试过使用制表符补全的方法,那么描述一下也会有所帮助。发布不起作用的代码是一个很好的开始-不需要一直尝试,直到它起作用!我在OP中添加了我当前不起作用的代码。我觉得这接近于一个有效的解决方案,但我总是被编译器咬(inputaskdyn
必须返回任务
,或者我得到非法动态引用
错误),或者我的任务根本不起作用。。。看起来它从未进入inputaskdyn
的主体。