Quiero hacer aplicación interactiva donde el usuario lanza y puede hacer varios tarea de escribir los comandos (shell)

ejemplo:

./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)

He buscado, pero no podía encontrar cualquier ruby gems que yo podría usar especialmente para la consola de interacción, así que me voy a mi hacer mi propia…

Miré Thor, pero que no es exactamente como yo quiero, tal vez yo podría utilizar, pero no estoy seguro…

podría ser algo como:

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])

así que mi pregunta es, ¿qué gemas que podría utilizar para hacer tal clase console? tal vez alguien ya ha hecho algo similar?
I plan de uso de HighLine para la entrada/salida, sino en alguna otra sugerencia de lo que podría utilizar?

Debe ser de rubí o de su propia sintaxis?
¿qué quieres decir con ruby o propios de la sintaxis? 😐 si te refieres mediante IRB, entonces eso no es una opción…
¿Por qué no? Se le da Turing-integridad gratis.
debido a que se ejecuta el código de ruby, pero en mi caso, no está permitido sólo algunos específico de «Comandos», escribiendo sintaxis incorrecta no debería tirar excepciones y también, no hay manera de redefinir o anular los comandos…
Es un problema de seguridad? Y se puede conectar en pry errores de sintaxis. Y de la definición no debería ser un problema, usted necesita saber cómo funciona. Como usted espera que sus usuarios el uso de una línea de comandos en lugar de una interfaz gráfica de usuario en el momento actual de touchy feely cosas, me gustaría confiar en ellos con un poco de poder. Pero es tu elección, divertirse reimplementing un montón de cosas en lugar de llamar haga palanca en un objeto. Y usted consigue una API gratis.

OriginalEl autor davispuh | 2012-03-24

6 Comentarios

  1. 18

    Lo que desea es una REPLRead → Evaluate → Print Loop.

    IRB, por ejemplo, implementa un REPL para el lenguaje Ruby.

    Aquí tienes una muy sencilla aplicación de la aplicación de la 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

    \A y \z coincidir con el comienzo de la cadena y el final de la cadena, respectivamente.

    bueno gracias por mostrar uno de la forma de cómo se podría implementar la clase console método «start» 🙂
    Me olvidé de la petición – respuesta actualizada con una mejora de la aplicación. Su start método sólo debe contener el bucle.
    He aceptado esta respuesta, porque se recomienda hacer yo mismo mostrando parte de la implementación así que voy a hacer mi propia CLI, especialmente para todas mis necesidades…
    Es Console una clase que viene con Ruby? Si es así, ¿qué necesito para conseguirlo?
    no, esa clase es parte de un API que he hecho para esta respuesta. Imagina que Console contiene todo el código de la aplicación relativa a la interconexión con un emulador de terminal y que prompt es un lector método que devuelve el REPL configurado del sistema.

    OriginalEl autor Matheus Moreira

  2. 5

    También se podría tratar de ripl. (a partir de la documentación):
    La creación y el inicio de una shell personalizado es tan simple como:

    require 'ripl'
    # Define plugins, load files, etc...
    Ripl.start

    No es una lista completa de plugins para ripl, así como la lista de aplicaciones de consola utilizando ripl en la página web de proyectos.

    esto se parece más prometedor, pero aún es necesario hacer algunos cambios en la configuración, y otra vez lo mismo «características» no necesito como pry/irb, también creo que no hay necesidad prácticamente de cambios y configuración de…
    Para ser honesto, yo no lo uso ripl hasta ahora, pero la escritura de su propia solución desde el suelo no parece ser la mejor idea. Sólo cuenta el movimiento con la tecla de flecha – sin readline apoyar a los usuarios se jura.
    en windows, el historial de comandos que está trabajando (flechas Arriba/Abajo), solo me falta hacer la auto-realización de la ficha, pero al iniciar me podría incluso vivir sin eso…
    No es sólo acerca de la historia y de finalización. Readline proporciona con emacs/vi-como los enlaces en la shell que una gran cantidad de usuarios están muy habituados a y damos por sentado porque están disponibles en Bash/Zsh por defecto.

    OriginalEl autor Aleksander Pohl

  3. 5

    ok, así que he hecho esta biblioteca para la creación de aplicaciones de consola en ruby. En realidad se trataba de algún tiempo atrás, pero sólo decidió liberarlo. Soporta la función de finalización automática si se utiliza con el HighLine y Readline.

    Cuando lo escribí no había ningún tipo de documentación ni pruebas/specs, pero ahora he hecho algunos. Todavía no es mucho, pero para empezar se debe aceptar.

    Así joya cli-consola y
    el código está en GitHub, aquí ejemplo de uso

    OriginalEl autor davispuh

  4. 5

    TTY es realmente una buena joya para fácilmente haciendo este tipo de cosas. Usted tiene un montón de herramientas que pueden trabajar solos o con el completo kit de herramientas. Usted puede utilizar los colores, mensajes, ejecutar shell nativos, interactuar con la pantalla, imprimir tablas, progressbars y muchos otros elementos útiles de líneas de comandos con la facilidad de un pegote de la api.

    Particularmente tty-símbolo del sistema es realmente útil a la hora de pedir la entrada del usuario.

    Un breve ejemplo para el caso de que usted propone:

    require 'tty-prompt'
    require 'pastel'
    
    prompt = TTY::Prompt.new
    loop do
      cmd, parms* = prompt.ask('[email protected]$ ').split /\s/
      case cmd
        when "hola"
          puts "Hola amigo " parms
        when "exit"
          break if prompt.yes?('Do you really want to exit?')
      end
    end
    Gracias por el comentario. Yo estaba a punto de añadir el ejemplo.
    No es exactamente lo que estaba buscando, esta es una biblioteca que puede ser utilizada para implementar dicha consola como se mostró. También por la forma en que cuando le hice esta pregunta, entonces todavía no existía entonces 😀 he implementado mi CLI-Consola mediante el uso de github.com/JEG2/highline que hace algo muy similar.

    OriginalEl autor David Goitia

  5. 4

    Echa un vistazo a cliqr gema de ruby. Parece exactamente lo que usted necesita. Aquí está el enlace de github con un descriptivo léame: https://github.com/anshulverma/cliqr

    Pueden ejecutar los comandos directamente o dentro de un intrínseca shell.

    Aquí es un caso de prueba desde su repositorio git:

        it 'can execute a sub action from shell' do
          cli = Cliqr.interface do
            name 'my-command'
            handler do
              puts 'base command executed'
            end
    
            action :foo do
              handler do
                puts 'foo executed'
              end
    
              action :bar do
                handler do
                  puts 'bar executed'
                end
              end
            end
          end
    
          with_input(['', 'my-command', 'foo', 'foo bar', 'foo bar help']) do
            result = cli.execute %w(my-command shell), output: :buffer
            expect(result[:stdout]).to eq <<-EOS
    Starting shell for command "my-command"
    my-command > .
    base command executed
    my-command > my-command.
    base command executed
    my-command > foo.
    foo executed
    my-command > foo bar.
    bar executed
    my-command > foo bar help.
    my-command foo bar
    
    USAGE:
        my-command foo bar [actions] [options] [arguments]
    
    Available options:
    
        --help, -h  :  Get helpful information for action "my-command foo bar" along with its usage information.
    
    Available actions:
    [ Type "my-command foo bar help [action-name]" to get more information about that action ]
    
        help -- The help action for command "my-command foo bar" which provides details and usage information on how to use the command.
    my-command > exit.
    shell exited with code 0
            EOS
          end
        end

    OriginalEl autor nuaavee

  6. 2
    class MyAPI
      def self.__is__(text)
        @__is__ = text
      end
    
      def self.method_added(method)
        @__help__ ||= {}
        @__help__[method.to_s] = @__is__
        @__is__ = nil
      end
    
      def self.help(of)
        @__help__[of]
      end
    
      __is__ "open file <file>"
      def open(file)
        #...
      end
    
      __is__ "do X"
      def do(*params)
        #...
      end
    
      __is__ "calls help, use help <command>"
      def help(*args, &block)
        self.class.help(*args, &block)
      end
    end
    
    MyAPI.new(...).pry

    O usted podría utilizar la palanca de comandos, pero el que se vence el
    turing-completo. La ayuda puede ser implementado utilizando los comandos, como estoy
    no está seguro de lo bien que mi método funciona. Los métodos tienen que ser
    codificado a la defensiva. No recuerdo cómo utilizar las variables de la clase :-/

    se requiere una gran cantidad de cambios y configuración para que funcione como necesito… también me gustaría utilizar para la tarea que no fue hecho por y para la que tienen «características» ni siquiera tengo…
    te han dado cliqr (arriba) un tiro? No se requiere de mucho configuración y casi funciona fuera de la caja.
    cuando escribí esta pregunta no exsist, a continuación, todavía, pero sí se ve algo muy similar a lo que yo necesitaba, a continuación, sólo 3 años antes de lo que fue creada 😀

    OriginalEl autor Reactormonk

Dejar respuesta

Please enter your comment!
Please enter your name here