Module Camping
In: lib/camping-unabridged.rb
lib/camping/ar.rb
lib/camping/reloader.rb
lib/camping/session.rb

If you‘re new to Camping, you should probably start by reading the first chapters of The Camping Book.

Okay. So, the important thing to remember is that Camping.goes :Nuts copies the Camping module into Nuts. This means that you should never use any of these methods/classes on the Camping module, but rather on your own app. Here‘s a short explanation on how Camping is organized:

Camping also ships with:

More importantly, Camping also installs The Camping Server, please see Camping::Server.

Methods

call   goes   method_missing   use  

Classes and Modules

Module Camping::Base
Module Camping::Controllers
Module Camping::Helpers
Module Camping::Models
Module Camping::Session
Module Camping::Views
Class Camping::H
Class Camping::Reloader
Class Camping::Server

Constants

C = self
S = IO.read(__FILE__) rescue nil
P = "<h1>Cam\ping Problem!</h1><h2>%s</h2>"
U = Rack::Utils
Apps = []
X = Controllers

Public Class methods

Ruby web servers use this method to enter the Camping realm. The e argument is the environment variables hash as per the Rack specification. And array with [status, headers, body] is expected at the output.

See: rack.rubyforge.org/doc/SPEC.html

[Source]

     # File lib/camping-unabridged.rb, line 584
584:     def call(e)
585:       X.M
586:       p = e['PATH_INFO'] = U.unescape(e['PATH_INFO'])
587:       k,m,*a=X.D p,e['REQUEST_METHOD'].downcase
588:       k.new(e,m).service(*a).to_a
589:     rescue
590:       r500(:I, k, m, $!, :env => e).to_a
591:     end

When you are running many applications, you may want to create independent modules for each Camping application. Camping::goes defines a toplevel constant with the whole MVC rack inside:

  require 'camping'
  Camping.goes :Nuts

  module Nuts::Controllers; ... end
  module Nuts::Models;      ... end
  module Nuts::Views;       ... end

All the applications will be available in Camping::Apps.

[Source]

     # File lib/camping-unabridged.rb, line 575
575:     def goes(m)
576:       Apps << eval(S.gsub(/Camping/,m.to_s), TOPLEVEL_BINDING)
577:     end

The Camping scriptable dispatcher. Any unhandled method call to the app module will be sent to a controller class, specified as an argument.

  Blog.get(:Index)
  #=> #<Blog::Controllers::Index ... >

The controller object contains all the @cookies, @body, @headers, etc. formulated by the response.

You can also feed environment variables and query variables as a hash, the final argument.

  Blog.post(:Login, :input => {'username' => 'admin', 'password' => 'camping'})
  #=> #<Blog::Controllers::Login @user=... >

  Blog.get(:Info, :env => {'HTTP_HOST' => 'wagon'})
  #=> #<Blog::Controllers::Info @headers={'HTTP_HOST'=>'wagon'} ...>

[Source]

     # File lib/camping-unabridged.rb, line 611
611:     def method_missing(m, c, *a)
612:       X.M
613:       h = Hash === a[-1] ? a.pop : {}
614:       e = H[Rack::MockRequest.env_for('',h.delete(:env)||{})]
615:       k = X.const_get(c).new(e,m.to_s)
616:       h.each { |i, v| k.send("#{i}=", v) }
617:       k.service(*a)
618:     end

Injects a middleware:

  module Blog
    use Rack::MethodOverride
    use Rack::Session::Memcache, :key => "session"
  end

[Source]

     # File lib/camping-unabridged.rb, line 626
626:     def use(*a, &b)
627:       m = a.shift.new(method(:call), *a, &b)
628:       meta_def(:call) { |e| m.call(e) }
629:     end

[Validate]