2012-02-18 9 views
5

Esta pregunta comenzó here. Pero cambió significativamente a medida que aprendí más sobre Thor.Cómo registro un Thor :: Grupo como un subcomando con argumentos

Estoy tratando de crear un subcomando Thor :: Group que tome un argumento. Curiosamente, funciona si no hay argumentos.

¿Puedo utilizar un Thor :: Group como un comando secundario?

Esto funciona cuando escribo: foo counter

foo/bin/foo

module Foo 
    class CLI < Thor 
    register(Counter, 'counter', 'counter', 'Count up from the 1.') 
    end 

    class Counter < Thor::Group 
    desc "Prints 1 2" 

    def one 
     puts 1 
    end 

    def two 
     puts 2 
    end 

    end 

end 

Foo::CLI.start 

Pero esto no funciona cuando escribo: foo counter 5

module Foo 
    class CLI < Thor 
    register(Counter, 'counter', 'counter <number>', 'Count up from the input.') 
    end 

    class Counter < Thor::Group 
    argument :number, :type => :numeric, :desc => "The number to start counting" 
    desc "Prints 2 numbers based on input" 

    def one 
     puts number + 0 
    end 

    def two 
     puts number + 1 
    end 

    end 


end 

Foo::CLI.start 

Se responde: counter was called incorrectly. Call as foo counter number

Respuesta

3

Tengo una solución. En lugar de utilizar Thor :: Grupo estoy usando invocaciones

bin/foo es el siguiente:

#!/usr/bin/env ruby 

require 'foo' 

Foo::CLI.start 

lib/cli.rb - registros 'generan' como una subtarea de comando de la base, foo :

module Foo 
    class CLI < Thor 
    register(Generate, 'generate', 'generate [something]', 'Type foo generate for more help.') 
    end 
end 

lib/generate.rb se ve así:

module Foo 

    class Generate < Thor 

    desc "project [name]", "Prints the project making step" 
    def project(name) 
     puts "making first project file #{name}" 
     invoke :config 
     invoke :project_sub 
    end 

    desc "config [name]", "Prints the config making step" 
    def config(name) 
     puts "making first config file #{name}" 
     invoke :project_sub 
    end 

    desc "project_sub [name]", "Prints the project_sub making step" 
    def project_sub(name) 
     puts "making subsystem file #{name}" 
    end 

    def self.banner(task, namespace = false, subcommand = true) 
     task.formatted_usage(self, true, subcommand).split(':').join(' ') 
    end 

    end 

end 

Ahora puede escribir: foo generate project fred

y seria:

> making first project file fred 
> making first config file fred 
> making subsystem file fred 

Aviso la anulación de la bandera. Esto significa que escribiendo: foo generate project con argumentos inválidos o no dará la correcta mensaje de ayuda:

"project" was called incorrectly. Call as "foo generate project [name]". 

en contraposición a

"project" was called incorrectly. Call as "foo project [name]". 
Cuestiones relacionadas