lib/camping.rb in camping-1.2 vs lib/camping.rb in camping-1.3
- old
+ new
@@ -1,49 +1,53 @@
-%w[rubygems active_record markaby metaid ostruct tempfile].each{|l|require l}
-module Camping;C=self;S=File.read(__FILE__).gsub(/_{2}FILE_{2}/,__FILE__.dump)
-module Helpers;def R c,*args;p=/\(.+?\)/;args.inject(c.urls.detect{|x|x.scan(p
-).size==args.size}.dup){|str,a|str.sub(p,(a.method(a.class.primary_key)[]rescue
+%w[rubygems active_record markaby metaid tempfile].each{|l|require l}
+module Camping;C=self;F=__FILE__;S=IO.read(F).gsub(/_+FILE_+/,F.dump)
+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,(a.__send__(a.class.primary_key)rescue
a).to_s)};end;def / p;p[/^\//]?@root+p:p end;def errors_for(o);ul.errors{o.
errors.each_full{|er|li er}}unless o.errors.empty?;end;end;module Controllers
-module Base; include Helpers;attr_accessor :input,:cookies,:headers,:body,
-:status,:root;def method_missing(m,*args,&blk);str=m==:render ? markaview(*args,
-&blk):eval("markaby.#{m}(*args,&blk)");str=markaview(:layout){str}rescue nil;r(
+module Base; include Helpers;attr_accessor :input,:cookies,:env,:headers,:body,
+:status,:root;def method_missing(m,*a,&b);str=m==:render ? markaview(*a,
+&b):eval("markaby.#{m}(*a,&b)");str=markaview(:layout){str} if Views.method_defined? :layout;r(
200,str.to_s);end;def r(s,b,h={});@status=s;@headers.merge!(h);@body=b;end;def
redirect(c,*args);c=R(c,*args)if c.respond_to?:urls;r(302,'','Location'=>self/c)
-end;def service(r,e,m,a)@status,@headers,@root=200,{},e['SCRIPT_NAME'];cook=C.kp(
-e['HTTP_COOKIE']);qs=C.qs_parse(e['QUERY_STRING']);if "POST"==m;inp=r.read(e[
+end;def service(r,e,m,a)@status,@env,@headers,@root=200,e,{'Content-Type'=>'text/html'},e['SCRIPT_NAME'];cook=C.kp(
+e['HTTP_COOKIE']);qs=C.qs_parse(e['QUERY_STRING']);if "post"==m;inp=r.read(e[
'CONTENT_LENGTH'].to_i);if %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)|n.
match(e['CONTENT_TYPE']);b="--#$1";inp.split(/(?:\r?\n|\A)#{Regexp::quote(
b)}(?:--)?\r\n/m).each{|pt|h,v=pt.split("\r\n\r\n",2);fh={};[:name,:filename].
each{|x|fh[x]=$1 if h=~/^Content-Disposition: form-data;.*(?:\s#{x}="([^"]+)")\
/m};fn=fh[:name];if fh[:filename];fh[:type]=$1 if h =~ /^Content-Type: (.+?)(\
-\r\n|\Z)/m;fh[:tempfile]=Tempfile.new("#{C}").instance_eval{binmode;write v
+\r\n|\Z)/m;fh[:tempfile]=Tempfile.new("C").instance_eval{binmode;write v
rewind;self};else;fh=v;end;qs[fn]=fh if fn};else;qs.merge!(C.qs_parse(inp));end
-end;@cookies,@input=[cook,qs].map{|_|OpenStruct.new(_)};@body=method(m.downcase
-).call(*a);@headers["Set-Cookie"]=@cookies.marshal_dump.map{|k,v|"#{k}=#{C.
-escape(v)}; path=/" if v != cook[k]}.compact;self;end;def to_s;"Status: #{
-@status}\n#{{'Content-Type'=>'text/html'}.merge(@headers).map{|k,v|v.to_a.map{
-|v2|"#{k}: #{v2}"}}.flatten.join("\n")}\n\n#{@body}";end;def markaby;Mab.new(
-instance_variables.map{|iv|[iv[1..-1],instance_variable_get(iv)]},{});end;def
-markaview(m,*args,&blk);b=markaby;b.method(m).call(*args, &blk);b.to_s
+end;@cookies, @input = cook.dup, qs.dup;@body=send(m,*a) if respond_to? m;@headers["Set-Cookie"]=@cookies.map{|k,v|"#{k}=#{C.
+escape(v)}; path=#{self/"/"}" if v != cook[k]}.compact;self;end;def to_s;"Status: #{
+@status}\n#{@headers.map{|k,v|[*v].map{
+|x|"#{k}: #{x}"}*"\n"}*"\n"}\n\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;class R;include Base end;class
-NotFound;def get(p);r(404,div{h1("#{C} Problem!")+h2("#{p} not found")});end
-end;class ServerError;include Base;def get(k,m,e);r(500,markaby.div{h1 "#{C} Problem!"
-h2 "#{k}.#{m}";h3 "#{e.class} #{e.message}:";ul{e.backtrace.each{|bt|li(bt)}}}
-)end end;class<<self;def R(*urls);Class.new(R){meta_def(:inherited){|c|c.
-meta_def(:urls){urls}}};end;def D(path);constants.inject(nil){|d,c|k=
+NotFound;def get(p);r(404,div{h1("Cam\ping Problem!")+h2("#{p} not found")});end
+end;class ServerError;include Base;def get(k,m,e);r(500,Mab.new{h1 "Cam\ping Problem!"
+h2 "#{k}.#{m}";h3 "#{e.class} #{e.message}:";ul{e.backtrace.each{|bt|li(bt)}}}.to_s
+)end end;class<<self;def R(*urls);Class.new(R){meta_def(:urls){urls}};end;def
+D(path);constants.inject(nil){|d,c|k=
const_get(c);k.meta_def(:urls){["/#{c.downcase}"]}if !(k<R);d||([k, $~[1..-1]
] if k.urls.find { |x| path =~ /^#{x}\/?$/ })}||[NotFound, [path]];end end end
class<<self;def goes m;eval(S.gsub(/Camping/,m.to_s),TOPLEVEL_BINDING)end;def
escape s;s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n){'%'+$1.unpack('H2'*$1.size).join(
'%').upcase}.tr(' ','+') end;def unescape(s);s.tr('+', ' ').gsub(/((?:%[0-9a-f\
-A-F]{2})+)/n){[$1.delete('%')].pack('H*')} end;def qs_parse(qs,d ='&;');(qs||''
-).split(/[#{d}] */n).inject({}){|hsh, p|k,v=p.split('=',2).map{|v|unescape(v)}
-hsh[k]=v unless v.blank?;hsh} end; def kp(s);c=qs_parse(s,';,') end
-def run(r=$stdin,w=$stdout);w<<begin;k,a=Controllers.D "/#{ENV['PATH_INFO']}".
-gsub(%r!/+!,'/');m=ENV['REQUEST_METHOD']||"GET";k.class_eval{include C
-include Controllers::Base;include Models};o=k.new;o.service(r,ENV,m,a);rescue\
-=>e;Controllers::ServerError.new.service(r,ENV,"GET",[k,m,e]);end;end;end
-module Views; include Controllers; include Helpers end;module Models;end
-Models::Base=ActiveRecord::Base;class Mab<Markaby::Builder;include Views
+A-F]{2})+)/n){[$1.delete('%')].pack('H*')} end;def qs_parse qs,d='&;';m=proc{
+|_,o,n|o.merge(n,&m)rescue([*o]<<n)};qs.to_s.split(/[#{d}] */n).inject(H[]){
+|h,p|k,v=unescape(p).split('=',2);h.merge(k.split(/[\]\[]+/).reverse.inject(v){
+|x,i|H[i,x]},&m)}end;def kp(s);c=qs_parse(s,';,');end
+def run(r=$stdin,e=ENV);begin;k,a=Controllers.D "/#{e['PATH_INFO']}".
+gsub(%r!/+!,'/');m=e['REQUEST_METHOD']||"GET";k.send :include,C,Controllers::Base,
+Models;o=k.new;o.service(r,e,m.downcase,a);rescue\
+=>x;Controllers::ServerError.new.service(r,e,"get",[k,m,x]);end;end;end
+module Views; include Controllers,Helpers end;module Models
+A=ActiveRecord;Base=A::Base;def Base.table_name_prefix;"#{name[/^(\w+)/,1]}_".
+downcase.sub(/^(#{A}|camping)_/i,'');end;end
+class Mab<Markaby::Builder;include Views
def tag!(*g,&b);h=g[-1];[:href,:action].each{|a|(h[a]=self/h[a])rescue 0}
-super;end;end;end
+super;end;end;class H<HashWithIndifferentAccess;def method_missing(m,*a)
+if m.to_s=~/=$/;self[$`]=a[0];elsif a.empty?;self[m];else;raise NoMethodError,
+"#{m}";end;end;end;end