Report abuse

microrails.rb - Change the tinyrails for use of Mongrel e WEBrick


			
require 'action_controller'
require 'active_record'
require 'dispatcher'

Dependencies.mechanism = :require

ActionView::Base.cache_template_loading = true
ActionController::Base.view_paths = [File.join(File.dirname(__FILE__), "views")]
ActionController::Dispatcher.unprepared = false

class ActionController::Dispatcher
  def prepare_application
  end
end

def session(key, secret)
  ActionController::Base.session = { :session_key => key, :secret => secret }
end

def routes(&block)
  ActionController::Routing::Routes.draw do |map|
    map.instance_eval(&block)
  end
end

def controller(name, &block)
  ActionController::Routing.controller_paths << name

  klass = Object.const_set("#{name.camelize}Controller", Class.new(ActionController::Base))
  klass.class_eval(&block)
end

def start_webrick(host, port)
  require 'webrick'
  require 'webrick_server'

  puts
  puts "Booting WEBrick"

  puts "-- WEBrick listening at #{host}:#{port}"
  puts "-- Use CTRL-C to stop"

  DispatchServlet.dispatch(
    :port         => port,
    :ip           => host,
    :server_root  => File.dirname(__FILE__),
    :server_type  => WEBrick::SimpleServer,
    :charset      => "UTF-8",
    :mime_types   => WEBrick::HTTPUtils::DefaultMimeTypes,
    :debugger     => false)
end

def start_mongrel(host, port)
  require 'mongrel'
  require 'mongrel/rails'

  puts
  puts "Booting Mongrel"

  config = Mongrel::Configurator.new :host => host do
    listener :port => port do
      uri "/", :handler => Mongrel::Rails::RailsHandler.new(File.dirname(__FILE__))

      trap("INT") { stop }
      run
    end
  end

  puts "-- Mongrel listening at #{host}:#{port}"
  puts "-- Use CTRL-C to stop"

  config.join
end

def start(host, port)
  ActionController::Routing.use_controllers! ActionController::Routing.controller_paths

  begin
    require_library_or_gem 'mongrel'
  rescue Exception
    # Mongrel not available
  end

  if defined?(Mongrel)
    start_mongrel(host, port)
  else
    start_webrick(host, port)
  end
end

simple_test.rb


			
require 'microrails'

session("key", "secret" * 15)

routes do
  root :controller => 'home'
end

controller "home" do
  def index
    render :text => 'Hello World!'
  end
end

start "0.0.0.0", "5000"

microrest.rb - RESTfull test


			
if ARGV.length != 3
  STDERR.puts "usage: microrest.rb   "
  exit(1)
end

require 'microrails'

puts
puts "Starting Ruby On Rails"
puts "-- Establish connection"

ActiveRecord::Base.logger = Logger.new("#{File.dirname(__FILE__)}/microrest-ar.log")
ActiveRecord::Base.establish_connection(
  :adapter  => "sqlite3",
  :database => ARGV[2],
  :timeout  => 5000
)

puts "-- Setting secret key"

session(ARGV[2], ARGV[2] * 10)

puts "-- Mapping routes"

routes do
  ActiveRecord::Base.connection.tables.each do |t|
    resources t
  end
end

puts "-- Creating models and controllers"

ActiveRecord::Base.connection.tables.each do |t|
  class_name    = ActiveRecord::Base.class_name(t)
  singular_name = class_name.downcase
  plural_name   = t

  puts "-- -- Creating model #{class_name}"

  Object.const_set("#{class_name}", Class.new(ActiveRecord::Base))

  puts "-- -- Creating controller #{plural_name.camelize}Controller"

  controller t do
    module_eval <<-"end_eval"

      def index
        @#{plural_name} = #{class_name}.find(:all)

        respond_to do |format|
          format.html
          format.xml  { render :xml  => @#{plural_name} }
        end
      end

      def show
        @#{singular_name} = #{class_name}.find(params[:id])

        respond_to do |format|
          format.html
          format.xml  { render :xml  => @#{singular_name} }
        end
      end

      def new
        @#{singular_name} = #{class_name}.new

        respond_to do |format|
          format.html
          format.xml  { render :xml  => @#{singular_name} }
        end
      end

      def edit
        @#{singular_name} = #{class_name}.find(params[:id])
      end

      def create
        @#{singular_name} = #{class_name}.new(params[:#{singular_name}])

        puts
        params.each { |p| puts p.inspect }

        respond_to do |format|
          if @#{singular_name}.save
            flash[:notice] = '#{class_name} was successfully created.'

            format.html { redirect_to(@#{singular_name}) }
            format.xml  { render :xml  => @#{singular_name}, :status => :created, :location => @#{singular_name} }
          else
            format.html { render :action => "new" }
            format.xml  { render :xml  => @#{singular_name}.errors, :status => :unprocessable_entity }
          end
        end
      end

      def update
        @#{singular_name} = #{class_name}.find(params[:id])

        respond_to do |format|
          if @#{singular_name}.update_attributes(params[:#{singular_name}])
            flash[:notice] = '#{class_name} was successfully updated.'

            format.html { redirect_to(@#{singular_name} ) }
            format.xml  { head :ok }
          else
            format.html { render :action => "edit" }
            format.xml  { render :xml  => @#{singular_name}.errors, :status => :unprocessable_entity }
          end
        end
      end

      def destroy
        @#{singular_name} = #{class_name}.find(params[:id])
        @#{singular_name}.destroy

        respond_to do |format|
          format.html { redirect_to(@#{plural_name}_url) }
          format.xml  { head :ok }
        end
      end
    end_eval
  end
end

start(ARGV[0], ARGV[1])