lib/lita/cli.rb in lita-2.2.1 vs lib/lita/cli.rb in lita-2.3.0

- old
+ new

@@ -1,55 +1,60 @@ require "thor" require "lita/daemon" +require "lita/version" module Lita # The command line interface for Lita. class CLI < Thor include Thor::Actions def self.source_root - File.expand_path("../../..", __FILE__) + File.expand_path("../../../templates", __FILE__) end default_task :start - class_option :config, + desc "start", "Starts Lita" + option :config, aliases: "-c", banner: "PATH", default: File.expand_path("lita_config.rb", Dir.pwd), desc: "Path to the configuration file to use" - - class_option :daemonize, + option :daemonize, aliases: "-d", default: false, desc: "Run Lita as a daemon", type: :boolean - - class_option :log_file, + option :log_file, aliases: "-l", banner: "PATH", default: Process.euid == 0 ? "/var/log/lita.log" : File.expand_path("lita.log", ENV["HOME"]), desc: "Path where the log file should be written when daemonized" - - class_option :pid_file, + option :pid_file, aliases: "-p", banner: "PATH", default: Process.euid == 0 ? "/var/run/lita.pid" : File.expand_path("lita.pid", ENV["HOME"]), desc: "Path where the PID file should be written when daemonized" - - class_option :kill, + option :kill, aliases: "-k", default: false, desc: "Kill existing Lita processes when starting the daemon", type: :boolean - - desc "start", "Starts Lita" def start - Bundler.require + begin + Bundler.require + rescue Bundler::GemfileNotFound + no_gemfile_warning = <<-WARN.chomp +The default command "start" must be run inside a Lita project. Try running \ +`lita new` to generate a new Lita project or `lita help` to see all commands. +WARN + say no_gemfile_warning, :red + abort + end if options[:daemonize] Daemon.new( options[:pid_file], options[:log_file], @@ -60,9 +65,110 @@ Lita.run(options[:config]) end desc "new NAME", "Generates a new Lita project (default name: lita)" def new(name = "lita") - directory "skeleton", name + directory "robot", name + end + + desc "adapter NAME", "Generates a new Lita adapter" + def adapter(name) + generate_templates(generate_config(name, "adapter")) + end + + desc "handler NAME", "Generates a new Lita handler" + def handler(name) + generate_templates(generate_config(name, "handler")) + end + + desc "version", "Outputs the current version of Lita" + def version + puts VERSION + end + map %w(-v --version) => :version + + private + + def generate_config(name, plugin_type) + name, gem_name = normalize_names(name) + constant_name = name.split(/_/).map { |p| p.capitalize }.join + namespace = "#{plugin_type}s" + constant_namespace = namespace.capitalize + spec_type = plugin_type == "handler" ? "lita_handler" : "lita" + required_lita_version = Lita::VERSION.split(/\./)[0...-1].join(".") + + { + name: name, + gem_name: gem_name, + constant_name: constant_name, + plugin_type: plugin_type, + namespace: namespace, + constant_namespace: constant_namespace, + spec_type: spec_type, + required_lita_version: required_lita_version + }.merge(generate_user_config).merge(optional_content) + end + + def generate_user_config + git_user = `git config user.name`.chomp + git_user = "TODO: Write your name" if git_user.empty? + git_email = `git config user.email`.chomp + git_email = "TODO: Write your email address" if git_email.empty? + + { + author: git_user, + email: git_email + } + end + + def generate_templates(config) + name = config[:name] + gem_name = config[:gem_name] + namespace = config[:namespace] + travis = config[:travis] + + target = File.join(Dir.pwd, gem_name) + + template( + "plugin/lib/lita/plugin_type/plugin.tt", + "#{target}/lib/lita/#{namespace}/#{name}.rb", + config + ) + template("plugin/lib/plugin.tt", "#{target}/lib/#{gem_name}.rb", config) + template( + "plugin/spec/lita/plugin_type/plugin_spec.tt", + "#{target}/spec/lita/#{namespace}/#{name}_spec.rb", + config + ) + template( + "plugin/spec/spec_helper.tt", + "#{target}/spec/spec_helper.rb", + config + ) + copy_file("plugin/Gemfile", "#{target}/Gemfile") + template("plugin/gemspec.tt", "#{target}/#{gem_name}.gemspec", config) + copy_file("plugin/gitignore", "#{target}/.gitignore") + copy_file("plugin/travis.yml", "#{target}/.travis.yml") if travis + template("plugin/LICENSE.tt", "#{target}/LICENSE", config) + copy_file("plugin/Rakefile", "#{target}/Rakefile") + template("plugin/README.tt", "#{target}/README.md", config) + end + + def normalize_names(name) + name = name.downcase.sub(/^lita[_-]/, "") + gem_name = "lita-#{name}" + name = name.tr("-", "_") + [name, gem_name] + end + + def optional_content + coveralls_question = <<-Q.chomp +Do you want to generate code coverage information with SimpleCov \ +and Coveralls.io? +Q + { + travis: yes?("Do you want to test your plugin on Travis CI?"), + coveralls: yes?(coveralls_question) + } end end end