Module | Camping |
In: |
lib/camping-unabridged.rb
lib/camping/ar.rb lib/camping/reloader.rb lib/camping/server.rb lib/camping/session.rb |
Camping includes a pretty nifty server which is built for development. It follows these rules:
Run it like this:
camping examples/ # Mounts all apps in that directory camping blog.rb # Mounts Blog at /
And visit localhost:3301/ in your browser.
C | = | self |
S | = | IO.read(__FILE__) rescue nil |
P | = | "<h1>Cam\ping Problem!</h1><h2>%s</h2>" |
U | = | Rack::Utils |
O | = | {} |
Apps | = | [] |
X | = | Controllers |
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
# File lib/camping-unabridged.rb, line 634 634: def call(e) 635: X.M 636: k,m,*a=X.D e['PATH_INFO'],e['REQUEST_METHOD'].downcase,e 637: k.new(e,m).service(*a).to_a 638: rescue 639: r500(:I, k, m, $!, :env => e).to_a 640: 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.
# File lib/camping-unabridged.rb, line 621 621: def goes(m) 622: Apps << a = eval(S.gsub(/Camping/,m.to_s), TOPLEVEL_BINDING) 623: caller[0]=~/:/ 624: IO.read(a.set:__FILE__,$`)=~/^__END__/ && 625: (b=$'.split(/^@@\s*(.+?)\s*\r?\n/m)).shift rescue nil 626: a.set :_t,H[*b||[]] 627: 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'} ...>
# File lib/camping-unabridged.rb, line 660 660: def method_missing(m, c, *a) 661: X.M 662: h = Hash === a[-1] ? a.pop : {} 663: e = H[Rack::MockRequest.env_for('',h.delete(:env)||{})] 664: k = X.const_get(c).new(e,m.to_s) 665: h.each { |i, v| k.send("#{i}=", v) } 666: k.service(*a) 667: end