Sbt 输入任务实现中的筛选选项卡完成

Sbt 输入任务实现中的筛选选项卡完成,sbt,tab-completion,Sbt,Tab Completion,我目前正在为实现一个SBT插件。 它的一个功能是在SBT的新浏览器选项卡中打开最后生成的报告。 由于每次运行都可以有一个不同的“模拟ID”(基本上是一个简单的字符串),我想提供模拟ID上的制表符完成 例如: 运行Gatling SBT插件将在target/Gatling中生成多个文件夹(命名为simulationId+报告生成日期),例如mysim-20140204234534,myothersim-20140203124534和yetanothersim-20140204234534 让我们调

我目前正在为实现一个SBT插件。 它的一个功能是在SBT的新浏览器选项卡中打开最后生成的报告。 由于每次运行都可以有一个不同的“模拟ID”(基本上是一个简单的字符串),我想提供模拟ID上的制表符完成

例如:

运行Gatling SBT插件将在
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
    的主体。