digital-science/baton

View on GitHub
bin/batonize

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby

require 'rubygems'
require 'thor'
require 'fileutils'

module Baton
  class CLI < Thor
    include Thor::Actions

    desc "gem GEMNAME", "Creates a skeleton for creating a rubygem that extends Baton called baton-GEMNAME"

    method_option :bin, :type => :boolean, :default => false, :aliases => '-b', :banner => "Generate a binary for your library."

    def gem(name)
      name = "baton-#{name.chomp("/")}"
      target = File.join(Dir.pwd, name)
      constant_name = name.split('_').map{|p| p[0..0].upcase + p[1..-1] }.join
      constant_name = constant_name.split('-').map{|q| q[0..0].upcase + q[1..-1] }.join('::') if constant_name =~ /-/
      constant_array = constant_name.split('::')
      FileUtils.mkdir_p(File.join(target, 'config'))
      FileUtils.mkdir_p(File.join(target, 'lib', "baton"))
      FileUtils.mkdir_p(File.join(target, 'lib', 'baton', name))
      git_user_name = `git config user.name`.chomp
      git_user_email = `git config user.email`.chomp
      opts = {
        :name           => name,
        :constant_name  => constant_name,
        :constant_array => constant_array,
        :author         => git_user_name.empty? ? "TODO: Write your name" : git_user_name,
        :email          => git_user_email.empty? ? "TODO: Write your email address" : git_user_email
      }

      template(File.join("gem/Gemfile.tt"),                       File.join(target, "Gemfile"),                               opts)
      template(File.join("gem/Rakefile.tt"),                      File.join(target, "Rakefile"),                              opts)
      template(File.join("gem/LICENSE.tt"),                       File.join(target, "LICENSE"),                               opts)
      template(File.join("gem/README.md.tt"),                     File.join(target, "README.md"),                             opts)
      template(File.join("gem/gitignore.tt"),                     File.join(target, ".gitignore"),                            opts)
      template(File.join("gem/gem.gemspec.tt"),                   File.join(target, "#{name}.gemspec"),                       opts)
      template(File.join("gem/config/gem.cfg.tt"),                File.join(target, "config/#{name}.cfg"),                    opts)
      template(File.join("gem/lib/baton/gem.rb.tt"),              File.join(target, "lib/baton/#{name}.rb"),                  opts)
      template(File.join("gem/lib/baton/gem/version.rb.tt"),      File.join(target, "lib/baton/#{name}/version.rb"),          opts)
      template(File.join("gem/lib/baton/gem/gem-consumer.rb.tt"), File.join(target, "lib/baton/#{name}/#{name}-consumer.rb"), opts)
      template(File.join("gem/lib/baton/gem/gem-monitor.rb.tt"),  File.join(target, "lib/baton/#{name}/#{name}-monitor.rb"),  opts)
      template(File.join("gem/lib/baton/gem/gem-api.rb.tt"),      File.join(target, "lib/baton/#{name}/#{name}-api.rb"),      opts)
      if options[:bin]
        # Create the binaries' names
        baton_bin_name   = File.join(target, 'bin', name)
        monitor_bin_name = File.join(target, 'bin', "#{name}-monitor")
        # Create the files
        template(File.join("gem/bin/gem.tt"),          baton_bin_name,    opts)
        template(File.join("gem/bin/gem-monitor.tt"),  monitor_bin_name,  opts)
        # Make them executable
        FileUtils.chmod 0755, [baton_bin_name, monitor_bin_name]
      end

      Dir.chdir(target) { `git init`; `git add .` }
    end

    def self.source_root
      File.expand_path(File.join(File.dirname(__FILE__), '../lib/baton/templates'))
    end

  end
end

Baton::CLI.start