From 1109984fe9c2893f53fcc3ac70737f0d20a07bef Mon Sep 17 00:00:00 2001 From: _why Date: Thu, 6 Jul 2006 06:56:11 +0000 Subject: [PATCH] * lib/camping.rb: experimenting with Camping.method_missing as an answer to #33. (stuff like Tepee.get(:Index) or Blog.post(:Delete, id) and so on.) --- lib/camping-unabridged.rb | 18 +++++++++++++++- lib/camping.rb | 43 +++++++++++++++++++++------------------ 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/lib/camping-unabridged.rb b/lib/camping-unabridged.rb index dbd4ee3..6a7b714 100644 --- a/lib/camping-unabridged.rb +++ b/lib/camping-unabridged.rb @@ -594,6 +594,12 @@ def qs_parse(qs, d = '&;') # Parses a string of cookies from the Cookie header. def kp(s); c = qs_parse(s, ';,'); end + def method_missing(m, c, *a) + k = X.const_get(c) + k.send :include, C, Base, Models + k.allocate.method(m, *a) + end + # Fields a request through Camping. For traditional CGI applications, the method can be # executed without arguments. # @@ -626,11 +632,21 @@ def kp(s); c = qs_parse(s, ';,'); end # def run(r=$stdin,e=ENV) k, a = Controllers.D un("/#{e['PATH_INFO']}".gsub(%r!/+!,'/')) - k.send :include, C, Base, Models + i k k.new(r,e,(m=e['REQUEST_METHOD']||"GET")).service(*a) rescue Exception => x Controllers::ServerError.new(r,e,'get').service(k,m,x) end + + def method_missing(m, c, *a) + k = Controllers.const_get(c) + i k + k.new(nil,H['HTTP_HOST','','SCRIPT_NAME','','HTTP_COOKIE',''],m.to_s).service(*a) + end + + def i k + k.send(:include, C, Base, Models) if !(kURL(*a) end;def initialize r,e,m;e=H[e.to_hash] -@status,@method,@env,@headers,@root=200,m.downcase,e,{'Content-Type'=>"text/htm\ -l"},e.SCRIPT_NAME.sub(/\/$/,'');@k=C.kp e.HTTP_COOKIE;q=C.qs_parse e.QUERY_STRING -@in=r;if %r|\Amultipart/form-.*boundary=\"?([^\";,]+)|n.match e.CONTENT_TYPE;b= +P="Cam\ping Problem!";module Helpers;def R c,*args;p=/\(.+?\)/;args.inject(c. +urls.find{|x|x.scan(p).size==args.size}.dup){|str,a|str.sub(p,C.escape((a. +__send__(a.class.primary_key)rescue a)))}end;def URL c='/',*a;c=R(c,*a)if c. +respond_to?:urls;c=self/c;c="//"+@env.HTTP_HOST+c if c[/^\//];URI(c) end;def / p +p[/^\//]?@root+p : p end;def errors_for o;ul.errors{o.errors.each_full{|x|li x} +}if o.errors.any?end end;module Base;include Helpers;attr_accessor :input, +:cookies,:env,:headers,:body,:status,:root;def method_missing m,*a,&b +s=m==:render ? markaview(*a,&b):eval("markaby.#{m}(*a,&b)");s=markaview(:layout +){s} if Views.method_defined?:layout;s end;def r s,b,h={};@status=s;@headers. +merge! h;@body=b end;def redirect *a;r 302,'','Location'=>URL(*a)end;def +initialize r,e,m;e=H[e.to_hash];@status,@method,@env,@headers,@root=200,m. +downcase,e,{'Content-Type'=>"text/html"},e.SCRIPT_NAME.sub(/\/$/,'') +@k=C.kp e.HTTP_COOKIE;q=C.qs_parse e.QUERY_STRING;@in=r +if %r|\Amultipart/form-.*boundary=\"?([^\";,]+)|n.match e.CONTENT_TYPE;b= /(?:\r?\n|\A)#{Regexp::quote("--#$1")}(?:--)?\r$/;until @in.eof?;fh=H[];for l in @in;case l;when "\r\n":break;when /^Content-Disposition: form-data;/:fh.u H[*$'. scan(/(?:\s(\w+)="([^"]+)")/).flatten];when /^Content-Type: (.+?)(\r$|\Z)/m;fh[ @@ -27,23 +27,26 @@ module Base;include Helpers;attr_accessor :input,:cookies,:env,:headers,:body, |k,v|[*v].map{|x|"#{k}: #{x}"}}*"\r\n"}\r\n\r\n#{@body}" end;def markaby;Mab.new( instance_variables.map{|iv|[iv[1..-1],instance_variable_get(iv)]}) end;def markaview m,*a,&b;h=markaby;h.send m,*a,&b;h.to_s end end -module Controllers;class NotFound;def get p;r(404,div{h1 P +X=module Controllers;class NotFound;def get p;r(404,div{h1 P h2 p+" not found"}) end end;class ServerError;include Base;def get k,m,e;r(500, Mab.new{h1 P;h2 "#{k}.#{m}";h3 "#{e.class} #{e.message}:";ul{ e.backtrace.each{|bt|li(bt)}}}.to_s)end end;class<x;Controllers::ServerError.new(r,e,'get').service( -k,m,x)end end;module Views;include Controllers,Helpers end;module Models;A= +qs_parse(s,';,')end;def run r=$stdin,e=ENV;k,a=X.D un("/#{e['PATH_INFO'] +}".gsub(/\/+/,'/'));i k;k.new(r,e,(m=e['REQUEST_METHOD' +]||"GET")).service *a;rescue Exception=>x;X::ServerError.new(r,e,'get').service( +k,m,x)end;def method_missing m,c,*a;k=X.const_get c;i k;k.new('', +H['HTTP_HOST','','SCRIPT_NAME','','HTTP_COOKIE',''],m.to_s).service *a;end +def i k;k.send(:include,C,Base,Models)if !(k