lib/camping.rb in camping-2.1.532 vs lib/camping.rb in camping-3.0.0

- old
+ new

@@ -1,55 +1,86 @@ -require "uri";require "rack";class Object;def meta_def m,&b;(class<<self;self -end).send:define_method,m,&b end end;module Camping;C=self;S=IO.read(__FILE__ -)rescue nil;P="<h1>Cam\ping Problem!</h1><h2>%s</h2>";U=Rack::Utils;O={};Apps=[]; -SK=:camping;class H<Hash;def method_missing m,*a;m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m. -to_s]:super end;undef id,type if ??==63 end;class Cookies<H;attr_accessor :_p; -def _n;@n||={}end;alias :_s :[]=;def set k,v,o={};_s(j=k.to_s,v);_n[j]= -{:value=>v,:path=>_p}.update o;end;def []=(k,v)set(k,v,v.is_a?(Hash)?v:{})end -end;module Helpers;def R c,*g;p,h= -/\(.+?\)/,g.grep(Hash);g-=h;raise"bad route"unless u=c.urls.find{|x|break x if +require "cam\ping/loads";E||="content-type";Z||="text/html" +class Object;def meta_def m,&b;(class<<self;self +end).send:define_method,m,&b end;end +module Camping;C=self;S=IO.read(__FILE__)rescue nil +P="<h1>Cam\ping Problem!</h1><h2>%s</h2>";U=Rack::Utils;Apps=[];SK="camping";G=[] +class H<Hash;def method_missing m,*a;m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m +.to_s]:super end;undef id,type if ??==63;end;O=H.new;O[:url_prefix]="" +class Cookies<H;attr_accessor :_p +def _n;@n||={}end;alias _s []=;def set k,v,o={};_s(j=k.to_s,v);_n[j] = +{:value=>v,:path=>_p}.update o;end;def []=(k,v)set k,v,v.is_a?(Hash)?v:{} end +end +module Helpers;def R c,*g;p,h= +/\(.+?\)/,g.grep(Hash);g-=h;raise"bad route"if !u=c.urls.find{|x|break x if x.scan(p).size==g.size&&/^#{x}\/?$/=~(x=g.inject(x){|x,a|x.sub p,U.escape((a. -to_param rescue a))}.gsub(/\\(.)/){$1})};h.any?? u+"?"+U.build_query(h[0]):u -end;def / p;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 +to_param rescue a))}.gsub(CampTools.descape){$1})};h.any?? u+"?"+U.build_query(h[0]) : u +end;def /(p) p[0]==?/ ?(@root+@url_prefix.dup.prepend("/").chop+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 +def app_name;"Camping"end end module Base;attr_accessor:env,:request,:root,:input,:cookies,:state,:status, -:headers,:body;T={};L=:layout;def lookup n;T.fetch(n.to_sym){|k|t=Views. +:headers,:body,:url_prefix;T={};L=:layout +def lookup n;T.fetch(n.to_sym){|k|t=Views. method_defined?(k)||(t=O[:_t].keys.grep(/^#{n}\./)[0]and Template[t].new{ O[:_t][t]})||(f=Dir[[O[:views]||"views","#{n}.*"]*'/'][0])&&Template. -new(f,O[f[/\.(\w+)$/,1].to_sym]||{});O[:dynamic_templates]?t:T[k]=t} end -def render v,*a,&b;if t=lookup(v);r,@_r=@_r,o=Hash===a[-1]?a.pop: {};s=(t==true)?mab{ +new(f,O[f[/\.(\w+)$/,1].to_sym]||{});O[:dynamic_templates]?t: T[k]=t}end +def render v,*a,&b;if t=lookup(v);r=@_r;@_r=o=Hash===a[-1]?a.pop: {};s=(t==true)?mab{ send v,*a,&b}: t.render(self,o[:locals]||{},&b);s=render(L,o.merge(L=>false)){s -}if o[L]or o[L].nil?&&lookup(L)&&!r&&v.to_s[0]!=?_;s;else;raise"no template: #{v}" -end;end;def mab &b;extend(Mab);mab(&b) 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;P%"#{p} not found"end;def r500 k,m,e -raise e end;def r501 m;P%"#{m.upcase} not implemented"end;def serve(p,c) -(t=Rack::Mime.mime_type p[/\..*$/],"text/html")&&@headers["Content-Type"]=t;c;end;def to_a;@env[ -'rack.session'][SK]=Hash[@state];r=Rack::Response.new(@body,@status,@headers) -@cookies._n.each{|k,v|r.set_cookie k,v};r.to_a end;def initialize env,m -r=@request=Rack:: Request.new(@env=env);@root,@input,@cookies,@state,@headers, -@status,@method=r.script_name.sub(/\/$/,''),n(r.params),Cookies[r.cookies], -H[r.session[SK]||{}],{'Content-Type'=>'text/html'},m=~/r(\d+)/?$1.to_i: 200,m;@cookies._p=self/"/" end -def n h;Hash===h ?h.inject(H[]){|m,(k,v)|m[k]= -n(v);m}: h end;def service *a;r=catch(:halt){send(@method,*a)};@body||=r;self -end end;module Controllers;@r=[];class<<self;def R *u;r=@r;Class. -new{meta_def(:urls){u};meta_def(:inherited){|x|r<<x}}end;def D p,m,e;p='/'if +} if o[L] or o[L].nil?&&lookup(L)&&!r&&v.to_s[0]!=?_;s else raise "no template: #{v}" +end end +def mab &b;extend Mab;mab &b;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;P%"#{p} not found"end +def r500 k,m,e;raise e end +def r501 m;P % "#{m.upcase} not implemented"end +def serve p,c;t=Rack::Mime.mime_type(p[/\..*$/], Z)and@headers[E]=t;c;end +def to_a;@env['rack.session'][SK]=Hash[@state];r=Rack::Response.new(@body, +@status,@headers);@cookies._n.each{|k,v|r.set_cookie k,v};r.to_a end +def initialize env,m,p +r=@request=Rack::Request.new(@env=env);@root,@input,@cookies,@state,@headers, +@status,@method,@url_prefix=r.script_name.sub(/\/$/,''),n(r.params), +Cookies[r.cookies],H[r.session[SK]||{}],{E=>Z},m=~/r(\d+)/?$1.to_i: 200,m,p +@cookies._p=self/"/";end +def n h;Hash===h ?h.inject(H[]){|m,(k,v)|m[k]=n(v);m}: h end +def service *a;r=catch(:halt){send(@method,*a)};@body||=r;self end end +module Controllers;@r=[];class Camper end;class<<self +def R *u;r,uf=@r,u.first;Class.new((uf.is_a?(Class)&& +(uf.ancestors.include?(Camper))) ? u.shift : Camper) { +meta_def(:urls){u};meta_def(:inherited){|x|r<< x} } end +def v;@r.map(&:urls);end +def D p,m,e;p='/'if !p||!p[0];(a=O[:_t].find{|n,_|n==p}) and return [I,:serve,*a] @r.map{|k|k.urls.map{|x|return(k.method_defined? m)?[k,m,*$~[1..-1].map{|x|U.unescape x}]: -[I, 'r501',m]if p=~/^#{x}\/?$/}};[I,'r404',p] end;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,X,Base,Helpers,Models -@r=[k]+@r if @r-[k]==@r;k.meta_def(:urls){["/#{c.to_s.scan(/.[^A-Z]*/).map(& -N.method(:[]))*'/'}"]}if !k.respond_to?:urls}end end;I=R()end;X= -Controllers;class<<self;def -goes m,g=TOPLEVEL_BINDING;Apps<<a=eval(S.gsub(/Camping/,m.to_s),g);caller[0]=~/:/ -IO.read(a.set:__FILE__,$`)=~/^__END__/&&(b=$'.split /^@@\s*(.+?)\s*\r?\n/m).shift rescue nil -a.set :_t,H[*b||[]];end;def call e;X.M -k,m,*a=X.D e["PATH_INFO"],e['REQUEST_METHOD']. -downcase,e;k.new(e,m).service(*a).to_a;rescue;r500(:I,k,m,$!,:env=>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.delete(:env)||{})];k=X.const_get(c).new(e,m.to_s);h.each{|i,v|k. -send"#{i}=",v};k.service(*a) end;def use*a,&b;m=a.shift.new(method(:call),*a,&b) -meta_def(:call){|e|m.call(e)}end;def options;O end;def set k,v;O[k]=v end end -module Views;include X,Helpers end;module Models;autoload:Base,'camping/ar' +[I, 'r501',m]if p=~/^#{x}\/?$/}};[I,'r404',p] end; +A=->(c,u,p){d=p.dup;d.chop! if u=='';u.prepend("/"+d) if !["I"]. +include? c.to_s +if c.to_s=="Index";while d[-1]=="/";d.chop! end;u.prepend("/"+d)end;u} +N=H.new{|_,x|x.downcase}.merge! "N"=>'(\d+)',"X"=>'([^/]+)',"Index"=>'' +def M p;def M p;end +constants.filter{|c|c.to_s!='Camper'}.map{|c|k=const_get(c); +k.send:include,C,X,Base,Helpers,Models +@r=[k]+@r if @r-[k]==@r;mu=false;ka=k.ancestors +if (k.respond_to?(:urls) && ka[1].respond_to?(:urls)) && (k.urls == ka[1].urls) +mu = true unless ka[1].name == nil end +k.meta_def(:urls){[A.(k,"#{c.to_s.scan(/.[^A-Z]*/).map(&N.method(:[]))*'/'}",p)]} if (!k +.respond_to?(:urls) || mu==true)};end end;I=R()end;X=Controllers +class<<self;def make_camp;X.M prx;Apps.map(&:make_camp) end;def routes;(Apps.map(&:routes)<<X.v).flatten end +def prx;@_prx||=CampTools.normalize_slashes(O[:url_prefix])end +def call e;make_camp;k,m,*a=X.D e["PATH_INFO"],e['REQUEST_METHOD']. +downcase,e;k.new(e,m,prx).service(*a).to_a;rescue;r500(:I,k,m,$!,:env=>e).to_a end +def method_missing m,c,*a;h=Hash===a[-1]?a.pop : {};e=H[Rack::MockRequest. +env_for('',h.delete(:env)||{})];k=X.const_get(c).new(e,m.to_s,prx);h.each{|i,v| +k.send"#{i}=",v};k.service(*a)end +def use*a,&b;m=a.shift.new(method(:call),*a,&b);meta_def(:call){|e|m.call(e)}end +def pack*a,&b;G<< g=a.shift;include g;g.setup(self,*a,&b)end +def gear;G end;def options;O;end;def set k,v;O[k]=v end +def goes m,g=TOPLEVEL_BINDING;sp=caller[0].split('`')[0].split(":");fl,ln,pr= +sp[0],sp[1].to_i,nil;Apps<< a=eval(S.gsub(/Camping/,m.to_s),g,fl,ln);caller[0]=~/:/ +IO.read(a.set:__FILE__,$`)=~/^__END__/&&(b=$'.split(/^@@\s*(.+?)\s*\r?\n/m) +).shift rescue nil;a.set :_t,H[*b||[]] +a.set :_meta, H[file: fl, line_number: ln, parent: self, +root: (name != "Cam\ping" ? '/' + CampTools.to_snake(name) : '/')];C.configure(a)end end +module Views;include X,Helpers end;module Models Helpers.send:include,X,self end;autoload:Mab,'camping/mab' -autoload:Template,'camping/template';C end +autoload:Template,'camping/template';pack Gear::Inspection;pack Gear::Filters +pack Gear::Nancy;pack Gear::Kuddly;C end