dav*_*puh 14 ruby console interactive
我想制作用户启动它的交互式应用程序,并可以通过键入命令(某种shell)来完成各种任务
例:
./myapp.rb
App says Hi
Commands:
help - display help about command
open - open task
do - do action
Start>help open
open <TaskName>
opens specified task
Start>open Something
Something>do SomeAction
Success!
Something> (blinking cursor here)
Run Code Online (Sandbox Code Playgroud)
我搜索但找不到任何我可以专门用于控制台互动的红宝石宝石,所以我要自己制作...
我看着托尔,但那不是我想要的,也许我可以用它,但不确定......
它可能看起来像:
class Tasks
attr_reader :opened_task
desc "open <TaskName>", "opens specified task"
def open(params)
end
desc "do <ActionName>", "do specified action"
def do(params)
end
end
tasks = Tasks.new
# theoretical Console class
console = Console.new
console.addCommand("open",tasks.method(:open),"open task")
console.addCommand("do",tasks.method(:do),"do action")
console.start("%s>",[*tasks.opened_task])
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,我可以使用什么宝石制作这样的控制台类?也许有人已经做了类似的事情?我计划使用HighLine输入/输出,但任何其他建议我可以使用什么?
Mat*_*ira 18
你想要的是一个REPL - Read ? Evaluate ? Print Loop.
例如,IRB为Ruby语言实现了一个REPL.
这是应用程序REPL的一个非常简单的实现:
loop do
Application::Console.prompt.display
input = gets.chomp
command, *params = input.split /\s/
case command
when /\Ahelp\z/i
puts Application::Console.help_text
when /\Aopen\z/i
Application::Task.open params.first
when /\Ado\z/i
Application::Action.perform *params
else puts 'Invalid command'
end
end
Run Code Online (Sandbox Code Playgroud)
\A并分别\z匹配字符串的开头和字符串的结尾.
你也可以试试ripl.(来自文档):创建和启动自定义shell非常简单:
require 'ripl'
# Define plugins, load files, etc...
Ripl.start
Run Code Online (Sandbox Code Playgroud)
ripl的插件列表以及项目网站上使用ripl的控制台应用程序列表.
好的,所以我创建了这个库,用于在ruby中创建控制台应用程序.实际上它是在不久前,但只是决定释放它.如果与HighLine和Readline一起使用,它确实支持自动完成.
当我写它时,没有任何文档或测试/规格,但现在我做了一些.仍然不多,但开始应该没问题.
所以gem cli-console和代码在GitHub,这是用例
TTY是一个很容易做这类事情的好宝石.你有很多工具可以单独使用或使用完整的toolKit.您可以使用颜色,提示,执行shell本机,与屏幕交互,打印表格,进度条以及命令行的许多其他有用元素,这些都是goop api的简单方法.
特别是tty-prompt对于询问用户输入非常有用.
您提出的案例的简要示例:
require 'tty-prompt'
require 'pastel'
prompt = TTY::Prompt.new
loop do
cmd, parms* = prompt.ask('user@machine$ ').split /\s/
case cmd
when "hola"
puts "Hola amigo " parms
when "exit"
break if prompt.yes?('Do you really want to exit?')
end
end
Run Code Online (Sandbox Code Playgroud)