class ModularizeSinatra::AppGenerator

Attributes

app_name[RW]
app_root[RW]
controller_module_name[RW]
controller_name[RW]
module_name[RW]
test_framework[RW]

Public Class Methods

new(app_name, controller_name) click to toggle source
# File lib/modularize_sinatra/app_generator.rb, line 5
def initialize app_name, controller_name
  @app_name = app_name
  @controller_name = controller_name
  @controller_module_name = controller_name.camelize
  @module_name = app_name.camelize
  @templates_path = File.join(File.expand_path(File.dirname(__FILE__)), 'templates')
  @test_framework = "rspec"
end

Public Instance Methods

add_dir(destination) click to toggle source

this method adds directory w.r.t root path of the app

# File lib/modularize_sinatra/app_generator.rb, line 43
def add_dir destination
  destination_path = full_path(destination)
  Dir.mkdir(destination_path) unless Dir.exists?(destination_path)
  puts "creating directory #{@app_name}/#{destination}"
end
add_file(source, destination) click to toggle source
# File lib/modularize_sinatra/app_generator.rb, line 18
def add_file source, destination
  destination_path = full_path(destination)
  input = File.read(File.join(@templates_path, source))
  eruby = Erubis::Eruby.new(input)
  
  already_exists = false
  overwrite = true

  if File.exists?(destination_path)
    print "File #{destination_path} already exists. Overwrite(Y/n)? "
    user_says = STDIN.gets.chomp
    overwrite = false unless user_says.downcase == 'y'
    already_exists = true
  end

  if overwrite
    puts "#{already_exists ? 'overwriting' : 'creating'}" << " #{destination_path}"
    File.open(destination_path, 'w') { |file| file.write(eruby.result(binding())) }
  else
    puts "skipping #{destination_path}"
  end

end
create_app_dir() click to toggle source
# File lib/modularize_sinatra/app_generator.rb, line 49
def create_app_dir
  Dir.mkdir(@app_name) unless Dir.exists?(@app_name)
  @app_root = File.join(Dir.pwd, @app_name)
end
full_path(destination) click to toggle source
# File lib/modularize_sinatra/app_generator.rb, line 14
def full_path destination
  File.join(@app_root, destination)
end
generate() click to toggle source
# File lib/modularize_sinatra/app_generator.rb, line 54
def generate
  # generate root directory
  create_app_dir

  # create all directories
  # order is important here
  dirs = [
    "config", 
    "lib", 
    "lib/controllers", 
    "lib/views", 
    "spec", 
    "spec/controllers"
  ]

  # if controller is not default
  if @controller_name != "ping"
    dirs << "lib/views/#{@controller_name.pluralize}"
  end

  dirs.each do |dir|
    add_dir(dir)
  end

  # create all files
  files = {
    "config/environment.rb" => "config/environment.rb",
    "lib/app.rb" => "lib/app.rb",
    "spec/spec_helper.rb" => "spec/spec_helper.rb",
    "config.ru" => "config.ru",
    "Gemfile" => "Gemfile",
    "module.rb" => "#{@app_name}.rb",
    "Rakefile" => "Rakefile"
  }

  # add default ping controller
  if @controller_name == "ping"
    files["lib/controllers/ping.rb"] = "lib/controllers/ping.rb"
    files["spec/controllers/ping_spec.rb"] = "spec/controllers/ping_spec.rb"
  else
    files["lib/controllers/controller.rb"] = "lib/controllers/#{@controller_name}.rb"
    files["lib/views/index.erb"] = "lib/views/#{@controller_name.pluralize}/index.erb"
    files["spec/controllers/controller_spec.rb"] = "spec/controllers/#{@controller_name}_spec.rb"
  end

  files.each do |src, dest|
    add_file src, dest
  end
end