class MkSpec

Attributes

config[R]

Public Class Methods

main() click to toggle source
# File lib/mspec/commands/mkspec.rb, line 149
def self.main
  ENV['MSPEC_RUNNER'] = '1'

  script = new
  script.options
  script.run
end
new() click to toggle source
# File lib/mspec/commands/mkspec.rb, line 15
def initialize
  @config = {
    :constants => [],
    :requires  => [],
    :base      => "core",
    :version   => nil
  }
  @map = NameMap.new true
end

Public Instance Methods

create_directory(mod) click to toggle source
# File lib/mspec/commands/mkspec.rb, line 59
def create_directory(mod)
  subdir = @map.dir_name mod, config[:base]

  if File.exist? subdir
    unless File.directory? subdir
      puts "#{subdir} already exists and is not a directory."
      return nil
    end
  else
    FileUtils.mkdir_p subdir
  end

  subdir
end
create_file(dir, mod, meth, name) click to toggle source
# File lib/mspec/commands/mkspec.rb, line 116
def create_file(dir, mod, meth, name)
  file = File.join dir, @map.file_name(meth, mod)
  exists = File.exist? file

  write_requires dir, file unless exists
  write_spec file, name, exists
end
options(argv=ARGV) click to toggle source
# File lib/mspec/commands/mkspec.rb, line 25
def options(argv=ARGV)
  options = MSpecOptions.new "mkspec [options]", 32

  options.on("-c", "--constant", "CONSTANT",
             "Class or Module to generate spec stubs for") do |name|
    config[:constants] << name
  end
  options.on("-b", "--base", "DIR",
             "Directory to generate specs into") do |directory|
    config[:base] = File.expand_path directory
  end
  options.on("-r", "--require", "LIBRARY",
             "A library to require") do |file|
    config[:requires] << file
  end
  options.on("-V", "--version-guard", "VERSION",
             "Specify version for ruby_version_is guards") do |version|
    config[:version] = version
  end
  options.version MSpec::VERSION
  options.help

  options.doc "\n How might this work in the real world?\n"
  options.doc "   1. To create spec stubs for every class or module in Object\n"
  options.doc "     $ mkspec\n"
  options.doc "   2. To create spec stubs for Fixnum\n"
  options.doc "     $ mkspec -c Fixnum\n"
  options.doc "   3. To create spec stubs for Complex in 'superspec/complex'\n"
  options.doc "     $ mkspec -c Complex -r complex -b superspec"
  options.doc ""

  options.parse argv
end
ruby() click to toggle source

Determine and return the path of the ruby executable.

# File lib/mspec/commands/mkspec.rb, line 140
def ruby
  ruby = File.join(RbConfig::CONFIG['bindir'],
                   RbConfig::CONFIG['ruby_install_name'])

  ruby.gsub! File::SEPARATOR, File::ALT_SEPARATOR if File::ALT_SEPARATOR

  return ruby
end
run() click to toggle source
# File lib/mspec/commands/mkspec.rb, line 124
def run
  config[:requires].each { |lib| require lib }
  constants = config[:constants]
  constants = Object.constants if constants.empty?

  @map.map({}, constants).each do |mod, methods|
    name = mod.chop
    next unless dir = create_directory(name)

    methods.each { |method| create_file dir, name, method, mod + method }
  end
end
write_requires(dir, file) click to toggle source
# File lib/mspec/commands/mkspec.rb, line 74
def write_requires(dir, file)
  /\A#{Regexp.escape config[:base]}\/?(.*)/ =~ dir
  parents = '../' * ($1.split('/').length + 1)

  File.open file, 'w' do |f|
    f.puts "require File.expand_path('../#{parents}spec_helper', __FILE__)"
    config[:requires].each do |lib|
      f.puts "require '#{lib}'"
    end
  end
end
write_spec(file, meth, exists) click to toggle source
# File lib/mspec/commands/mkspec.rb, line 97
  def write_spec(file, meth, exists)
    if exists
      out = %x`#{ruby} #{MSPEC_HOME}/bin/mspec-run --dry-run -fs -e '#{meth}' #{file}`
      return if out =~ /#{Regexp.escape meth}/
    end

    File.open file, 'a' do |f|
      write_version(f) do |indent|
        f.puts <<-EOS
#{indent}describe "#{meth}" do
#{indent}  it "needs to be reviewed for spec completeness"
#{indent}end
EOS
      end
    end

    puts file
  end
write_version(f) { |" "| ... } click to toggle source
# File lib/mspec/commands/mkspec.rb, line 86
def write_version(f)
  f.puts ""
  if version = config[:version]
    f.puts "ruby_version_is #{version} do"
    yield "  "
    f.puts "end"
  else
    yield ""
  end
end