class Ella::RackfileGenerator

The nature of Sinatra and Puma means that the config.ru file must initialize certain files. To make Ella work, this must be updated before the server is started. This is essentially a hack to deal with the fact that Sinatra was designed, apparently, to run one single controller file.

Public Instance Methods

run(mode = 'development') click to toggle source
# File lib/ella/generator/rackfile_generator.rb, line 10
def run(mode = 'development')
  @mode = mode
  Ella.find_root
  Log.info('Generating rack.ru...')
  write
end

Private Instance Methods

generate() click to toggle source
# File lib/ella/generator/rackfile_generator.rb, line 64
def generate
  "# WARNING: This file is autmatically generated by Ella, and may be rewritten\n" \
    "# at any time. Any changes you make here may vanish. The appropriate place for\n" \
    "# general changes is 'main.rb', which will never be overritten by Ella.)\n" \
    "require 'ella'\n\n" \
    "require './main'\n\n" \
    "#{require_all_models}\n" \
    "#{require_all_controllers}\n\n" \
    "#{use_all_controllers}\n\n" \
    "run #{project_name.pascal_case}\n"
end
get_controllers() click to toggle source
# File lib/ella/generator/rackfile_generator.rb, line 32
def get_controllers
  @controllers = Dir.entries('controllers').select { |e| e =~ /\.rb$/ }.map { |e| e[0..-4] }
rescue SystemCallError
  make_directory('controllers')
  retry
end
get_models() click to toggle source
# File lib/ella/generator/rackfile_generator.rb, line 39
def get_models
  @models = Dir.entries('models').select { |e| e =~ /\.rb$/ }.map { |e| e[0..-4] }
rescue SystemCallError
  make_directory('models')
  retry
end
main_project_file_content() click to toggle source
# File lib/ella/generator/rackfile_generator.rb, line 19
def main_project_file_content
  Ella.abort('Warning: "main.rb" not found. Aborting.') unless File.exist?('main.rb')
  @main_file_content ||= File.open('main.rb').read
  @main_file_content
end
project_name() click to toggle source

This looks bad, but adds a good deal of flexibility for the user, should they ever be desperate to change the project name of an already-generated project.

# File lib/ella/generator/rackfile_generator.rb, line 27
def project_name
  raw_project_name = main_project_file_content.scan(/class (.*) < Ella::Controller/).first.first
  NameFormatter.new(raw_project_name)
end
require_all_controllers() click to toggle source
# File lib/ella/generator/rackfile_generator.rb, line 51
def require_all_controllers
  get_controllers
  @controllers && @controllers.map { |e| "require_relative 'controllers/#{e}'" }.join("\n")
end
require_all_models() click to toggle source
# File lib/ella/generator/rackfile_generator.rb, line 46
def require_all_models
  get_models
  @models && @models.map { |e| "require_relative 'models/#{e}'" }.join("\n")
end
use_all_controllers() click to toggle source
# File lib/ella/generator/rackfile_generator.rb, line 56
def use_all_controllers
  @controllers && @controllers.map { |e| "use #{e.capitalize}Controller" }.join("\n")
end
write() click to toggle source
# File lib/ella/generator/rackfile_generator.rb, line 60
def write
  File.open('rack.ru', 'w') { |f| f.puts(generate) }
end