require 'trollop' module Bourdain class Resource attr_reader :status, :spec, :opts, :raw_usage, :resource_name def self.log= log ; @@log = log end def self.resource_name ; raise 'not implemented' end def self.raw_usage ; raise 'not implemented' end def self.usage type, raw_usage type = type.to_s metaclass = class << self ; self ; end metaclass.send(:define_method, 'raw_usage') do raw_usage.gsub(/^ +/, '') end metaclass.send(:define_method, 'resource_name') do raw_usage.lines.to_a[1].split(' ').first end metaclass.send(:define_method, 'resource_type') do type end metaclass.send(:define_method, 'spec') do self.spec ||= Bourdain::Helpers::UsageParser.parse(self.class.raw_usage) end Bourdain::Registry.register(type, self) end def initialize argv @status = 0 @spec = Bourdain::Helpers::UsageParser.parse(self.class.raw_usage) @opts = trollop_with_spec(self.class.resource_type, argv, @spec) end protected def log ; @@log ||= Bourdain::Logger.new end def error! ; @status = 1 end def fatal! ; @status = 2 ; exit @status end def require_versionfile! return true if File::exists?('VERSION') log.fatal "I don't see any VERSION file around here..." @status = 1 false end def require_cookbook! return true if File::exists?('metadata.rb') log.fatal "I don't see any metadata around here, is this a cookbook?" @status = 1 false end def require_kitchen! return true if File::exists?('Howto.md') log.fatal "Hm, things don't look quite right, is this the root of the Kitchen?" @status = 1 false end def trollop_with_spec subcommand, argv, spec subcommand = " #{subcommand}" unless subcommand.nil? Trollop::options(argv) do banner Bourdain::ART + "\n\n" + <<-EOS.gsub(/^ /, '') #{spec[:desc]} Usage: tony#{subcommand} #{spec[:usage]} #{format_resources spec[:resources]} Options: EOS spec[:opts].each do |opt| send(:opt, opt[:long], opt[:desc], opt[:opts]) end end end end end module Trollop class Parser def format_resources rs rs.map do |r| "\n#{r.capitalize}s:\n" + Bourdain::Registry.details(r) * "\n" + "\n" end.join("\n") end end end require_relative 'resources/checks' require_relative 'resources/commands' require_relative 'resources/generators'