diff --git a/lib/camping.rb b/lib/camping.rb index a2f0562..d03b80b 100644 --- a/lib/camping.rb +++ b/lib/camping.rb @@ -11,45 +11,42 @@ def method_missing m,*a;m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m.to_s]:super end p[0]==?/?@root+p:p end;def URL c='/',*a;c=R(c, *a) if c.respond_to?:urls c=self/c;c=@request.url[/.{8,}?(?=\/)/]+c if c[0]==?/;URI c end end;module Base;attr_accessor:input,:cookies,:headers,:body,:status,:root +M=proc{|_,o,n|o.merge(n,&M)} def render v,*a,&b;mab(/^_/!~v.to_s){send(v,*a,&b)} end def mab l=nil,&b;m=Mab.new({},self);s=m.capture(&b) s=m.capture{layout{s}} if l && m.respond_to?(:layout);s end def r s,b,h={};b,h=h,b if Hash===b;@status=s; @headers.merge!(h);@body=b;end;def redirect *a;r 302,'','Location'=>URL(*a). -to_s;end;def r404 p=env.PATH;r 404,P%"#{p} not found"end;def r500 k,m,x -r 500,P%"#{k}.#{m}"+"

#{x.class} #{x.message}:

"end;def r501 m=@method -r 501,P%"#{m.upcase} not implemented"end;def to_a -@response.body=@body.respond_to?(:each)?@body:"" -@response.status=@status;@response.headers.merge!(@headers) +to_s;end;def r404 p;P%"#{p} not found"end;def r500 k,m,e;raise e;end +def r501 m;P%"#{m.upcase} not implemented"end;def to_a +r=Rack::Response.new(@body,@status,@headers) @cookies.each{|k,v|v={:value=>v,:path=>self/"/"} if String===v -@response.set_cookie(k,v) if @request.cookies[k]!=v} -@response.to_a;end;def initialize(env) -@request,@response,@env=Rack::Request.new(env),Rack::Response.new,env -@root,@input,@cookies,@headers,@status= -(@env.SCRIPT_NAME||'').sub(/\/$/,''),H[@request.params], -H[@request.cookies],@response.headers,@response.status -@input.each{|k,v|if k[-2..-1]=="[]";@input[k[0..-3]]= -@input.delete(k)elsif k=~/(.*)\[([^\]]+)\]$/ -(@input[$1]||=H[])[$2]=@input.delete(k)end};end;def service *a -r=catch(:halt){send(@env.REQUEST_METHOD.downcase,*a)};@body||=r +r.set_cookie(k,v)} +r.to_a;end;def initialize(env,m) +r=@request=Rack::Request.new(@env=env) +@root,p,@cookies,@headers,@status,@method= +(env.SCRIPT_NAME||'').sub(/\/$/,''),H[r.params], +H[r.cookies],{},m=~/r(\d+)/?$1.to_i: 200,m +@input=p.inject(H[]){|h,(k,v)|h.merge k.split(/[\]\[]+/).reverse.inject(v){|x,i| +H[i=>x]},&M};end;def service *a +r=catch(:halt){send(@method,*a)};@body||=r self;end;end;module Controllers;@r=[];class<'(\d+)',"X"=>'(\w+)',"Index"=>'' +N=H.new{|_,x|x.downcase}.merge! "N"=>'(\d+)',"X"=>'([^/]+)',"Index"=>'' def M;def M;end;constants.map{|c|k=const_get(c) k.send:include,C,Base,Helpers,Models;@r=[k]+r if r-[k]==r k.meta_def(:urls){["/#{c.scan(/.[^A-Z]*/).map(&N.method(:[]))*'/'}"] -}if !k.respond_to?:urls}end end;class IStringIO.new,'REQUEST_METHOD'=>m.to_s}) -k=X.const_get(c).new(H[e]);k.send("input=",h[:input])if h[:input] +}if !k.respond_to?:urls}end end;I=R() +end;X=Controllers;class<e).to_a;end +def method_missing m,c,*a;X.M;h=Hash===a[-1]?a.pop: {} +e=H[Rack::MockRequest.env_for('',h[:env]||{})] +k=X.const_get(c).new(e,m.to_s);k.send("input=",h[:input])if h[:input] k.service(*a);end;end;module Views;include X,Helpers end;module Models autoload:Base,'camping/ar';def Y;self;end end;autoload:Mab,'camping/mab';C end