camping 1.1 → 1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +69 -0
- data/examples/blog/blog.rb +45 -24
- data/examples/charts/charts.rb +89 -0
- data/examples/charts/pie.rb +70 -0
- data/examples/charts/start +6 -0
- data/examples/serve +57 -0
- data/examples/tepee/start +6 -0
- data/examples/tepee/tepee.rb +137 -0
- data/lib/camping-unabridged.rb +468 -0
- data/lib/camping.rb +49 -105
- metadata +31 -12
- data/lib/camping-mural.rb +0 -43
data/lib/camping.rb
CHANGED
@@ -1,105 +1,49 @@
|
|
1
|
-
%w[rubygems active_record markaby metaid ostruct].each
|
2
|
-
|
3
|
-
module
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
private
|
51
|
-
def markaby
|
52
|
-
Markaby::Builder.new( instance_variables.map { |iv|
|
53
|
-
[iv[1..-1].intern, instance_variable_get(iv)] }, {} )
|
54
|
-
end
|
55
|
-
def markaview(m, *args, &blk)
|
56
|
-
markaby.instance_eval { Views.instance_method(m).bind(self).call(*args, &blk); self }.to_s
|
57
|
-
end
|
58
|
-
end
|
59
|
-
class R; include RM end
|
60
|
-
class NotFound < R; def get; r(404, h1('Camping Problem!') + h2('Not Found')); end end
|
61
|
-
|
62
|
-
class << self
|
63
|
-
def R(*urls); Class.new(R) { meta_def(:inherited) { |c| c.meta_def(:urls) { urls } } }; end
|
64
|
-
def D(path)
|
65
|
-
constants.each do |c|
|
66
|
-
k = const_get(c)
|
67
|
-
return k, $~[1..-1] if (k.urls rescue "/#{c.downcase}").find { |x| path =~ /^#{x}\/?$/ }
|
68
|
-
end
|
69
|
-
[NotFound, []]
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
class Response; include Controllers::RM
|
75
|
-
def initialize(s = 200, &blk)
|
76
|
-
@headers, @body, @status = {}, "", s
|
77
|
-
instance_eval &blk
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
class << self
|
82
|
-
def escape(s); s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n){'%'+$1.unpack('H2'*$1.size).join('%').upcase}.tr(' ', '+') end
|
83
|
-
def unescape(s); s.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n){[$1.delete('%')].pack('H*')} end
|
84
|
-
def qs_parse(qs, d = '&;'); OpenStruct.new((qs||'').split(/[#{d}] */n).
|
85
|
-
inject({}){|hsh, p|k, v = p.split('=',2).map {|v| unescape(v)}; hsh[k] = v unless v.empty?; hsh}) end
|
86
|
-
def cookie_parse(s); c = qs_parse(s, ';,'); end
|
87
|
-
def run(r=$stdin,w=$stdout)
|
88
|
-
begin
|
89
|
-
k, a, m = Controllers.D(ENV['PATH_INFO']) + [ENV['REQUEST_METHOD'] || "GET"]
|
90
|
-
k.class_eval { include Controllers::RM }
|
91
|
-
o = k.new
|
92
|
-
o.class.class_eval do
|
93
|
-
Models.constants.each do |c|
|
94
|
-
g = Models.const_get(c)
|
95
|
-
remove_const c if const_defined? c
|
96
|
-
const_set c, g
|
97
|
-
end
|
98
|
-
end
|
99
|
-
w << o.service(r, ENV, m, a)
|
100
|
-
rescue => e
|
101
|
-
w << Response.new(200) { @headers['Content-Type'] = 'text/html'; @body = Markaby::Builder.new({}, {}) { h1 'Camping Problem!'; h2 "#{k}.#{m}"; h3 "#{e.class} #{e.message}:"; ul { e.backtrace.each { |bt| li bt } } }.to_s }
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
1
|
+
%w[rubygems active_record markaby metaid ostruct tempfile].each{|l|require l}
|
2
|
+
module Camping;C=self;S=File.read(__FILE__).gsub(/_{2}FILE_{2}/,__FILE__.dump)
|
3
|
+
module Helpers;def R c,*args;p=/\(.+?\)/;args.inject(c.urls.detect{|x|x.scan(p
|
4
|
+
).size==args.size}.dup){|str,a|str.sub(p,(a.method(a.class.primary_key)[]rescue
|
5
|
+
a).to_s)};end;def / p;p[/^\//]?@root+p:p end;def errors_for(o);ul.errors{o.
|
6
|
+
errors.each_full{|er|li er}}unless o.errors.empty?;end;end;module Controllers
|
7
|
+
module Base; include Helpers;attr_accessor :input,:cookies,:headers,:body,
|
8
|
+
:status,:root;def method_missing(m,*args,&blk);str=m==:render ? markaview(*args,
|
9
|
+
&blk):eval("markaby.#{m}(*args,&blk)");str=markaview(:layout){str}rescue nil;r(
|
10
|
+
200,str.to_s);end;def r(s,b,h={});@status=s;@headers.merge!(h);@body=b;end;def
|
11
|
+
redirect(c,*args);c=R(c,*args)if c.respond_to?:urls;r(302,'','Location'=>self/c)
|
12
|
+
end;def service(r,e,m,a)@status,@headers,@root=200,{},e['SCRIPT_NAME'];cook=C.kp(
|
13
|
+
e['HTTP_COOKIE']);qs=C.qs_parse(e['QUERY_STRING']);if "POST"==m;inp=r.read(e[
|
14
|
+
'CONTENT_LENGTH'].to_i);if %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)|n.
|
15
|
+
match(e['CONTENT_TYPE']);b="--#$1";inp.split(/(?:\r?\n|\A)#{Regexp::quote(
|
16
|
+
b)}(?:--)?\r\n/m).each{|pt|h,v=pt.split("\r\n\r\n",2);fh={};[:name,:filename].
|
17
|
+
each{|x|fh[x]=$1 if h=~/^Content-Disposition: form-data;.*(?:\s#{x}="([^"]+)")\
|
18
|
+
/m};fn=fh[:name];if fh[:filename];fh[:type]=$1 if h =~ /^Content-Type: (.+?)(\
|
19
|
+
\r\n|\Z)/m;fh[:tempfile]=Tempfile.new("#{C}").instance_eval{binmode;write v
|
20
|
+
rewind;self};else;fh=v;end;qs[fn]=fh if fn};else;qs.merge!(C.qs_parse(inp));end
|
21
|
+
end;@cookies,@input=[cook,qs].map{|_|OpenStruct.new(_)};@body=method(m.downcase
|
22
|
+
).call(*a);@headers["Set-Cookie"]=@cookies.marshal_dump.map{|k,v|"#{k}=#{C.
|
23
|
+
escape(v)}; path=/" if v != cook[k]}.compact;self;end;def to_s;"Status: #{
|
24
|
+
@status}\n#{{'Content-Type'=>'text/html'}.merge(@headers).map{|k,v|v.to_a.map{
|
25
|
+
|v2|"#{k}: #{v2}"}}.flatten.join("\n")}\n\n#{@body}";end;def markaby;Mab.new(
|
26
|
+
instance_variables.map{|iv|[iv[1..-1],instance_variable_get(iv)]},{});end;def
|
27
|
+
markaview(m,*args,&blk);b=markaby;b.method(m).call(*args, &blk);b.to_s
|
28
|
+
end;end;class R;include Base end;class
|
29
|
+
NotFound;def get(p);r(404,div{h1("#{C} Problem!")+h2("#{p} not found")});end
|
30
|
+
end;class ServerError;include Base;def get(k,m,e);r(500,markaby.div{h1 "#{C} Problem!"
|
31
|
+
h2 "#{k}.#{m}";h3 "#{e.class} #{e.message}:";ul{e.backtrace.each{|bt|li(bt)}}}
|
32
|
+
)end end;class<<self;def R(*urls);Class.new(R){meta_def(:inherited){|c|c.
|
33
|
+
meta_def(:urls){urls}}};end;def D(path);constants.inject(nil){|d,c|k=
|
34
|
+
const_get(c);k.meta_def(:urls){["/#{c.downcase}"]}if !(k<R);d||([k, $~[1..-1]
|
35
|
+
] if k.urls.find { |x| path =~ /^#{x}\/?$/ })}||[NotFound, [path]];end end end
|
36
|
+
class<<self;def goes m;eval(S.gsub(/Camping/,m.to_s),TOPLEVEL_BINDING)end;def
|
37
|
+
escape s;s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n){'%'+$1.unpack('H2'*$1.size).join(
|
38
|
+
'%').upcase}.tr(' ','+') end;def unescape(s);s.tr('+', ' ').gsub(/((?:%[0-9a-f\
|
39
|
+
A-F]{2})+)/n){[$1.delete('%')].pack('H*')} end;def qs_parse(qs,d ='&;');(qs||''
|
40
|
+
).split(/[#{d}] */n).inject({}){|hsh, p|k,v=p.split('=',2).map{|v|unescape(v)}
|
41
|
+
hsh[k]=v unless v.blank?;hsh} end; def kp(s);c=qs_parse(s,';,') end
|
42
|
+
def run(r=$stdin,w=$stdout);w<<begin;k,a=Controllers.D "/#{ENV['PATH_INFO']}".
|
43
|
+
gsub(%r!/+!,'/');m=ENV['REQUEST_METHOD']||"GET";k.class_eval{include C
|
44
|
+
include Controllers::Base;include Models};o=k.new;o.service(r,ENV,m,a);rescue\
|
45
|
+
=>e;Controllers::ServerError.new.service(r,ENV,"GET",[k,m,e]);end;end;end
|
46
|
+
module Views; include Controllers; include Helpers end;module Models;end
|
47
|
+
Models::Base=ActiveRecord::Base;class Mab<Markaby::Builder;include Views
|
48
|
+
def tag!(*g,&b);h=g[-1];[:href,:action].each{|a|(h[a]=self/h[a])rescue 0}
|
49
|
+
super;end;end;end
|
metadata
CHANGED
@@ -3,19 +3,19 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: camping
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "1.
|
7
|
-
date: 2006-01-
|
6
|
+
version: "1.2"
|
7
|
+
date: 2006-01-23 00:00:00 -07:00
|
8
8
|
summary: miniature rails for stay-at-home moms
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: why@ruby-lang.org
|
12
|
-
homepage: http://whytheluckystiff.net/camping/
|
13
|
-
rubyforge_project:
|
12
|
+
homepage: http://code.whytheluckystiff.net/camping/
|
13
|
+
rubyforge_project: camping
|
14
14
|
description:
|
15
15
|
autorequire: camping
|
16
16
|
default_executable:
|
17
17
|
bindir: bin
|
18
|
-
has_rdoc:
|
18
|
+
has_rdoc: true
|
19
19
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
20
|
requirements:
|
21
21
|
- - ">"
|
@@ -28,19 +28,38 @@ cert_chain:
|
|
28
28
|
authors:
|
29
29
|
- why the lucky stiff
|
30
30
|
files:
|
31
|
+
- README
|
32
|
+
- examples/tepee
|
31
33
|
- examples/blog
|
32
|
-
- examples/
|
33
|
-
- examples/
|
34
|
+
- examples/charts
|
35
|
+
- examples/serve
|
36
|
+
- examples/tepee/tepee.rb
|
37
|
+
- examples/tepee/start
|
34
38
|
- examples/blog/styles.css
|
39
|
+
- examples/blog/blog.rb
|
40
|
+
- examples/blog/blog.sqlite3
|
35
41
|
- examples/blog/start
|
36
|
-
-
|
42
|
+
- examples/charts/charts
|
43
|
+
- examples/charts/pie.rb
|
44
|
+
- examples/charts/charts.rb
|
45
|
+
- examples/charts/start
|
37
46
|
- lib/camping.rb
|
47
|
+
- lib/camping-unabridged.rb
|
38
48
|
test_files: []
|
39
49
|
|
40
|
-
rdoc_options:
|
41
|
-
|
42
|
-
|
43
|
-
|
50
|
+
rdoc_options:
|
51
|
+
- --title
|
52
|
+
- Camping Documentation
|
53
|
+
- --line-numbers
|
54
|
+
- --inline-source
|
55
|
+
- --main
|
56
|
+
- README
|
57
|
+
- --exclude
|
58
|
+
- ^examples/
|
59
|
+
- --exclude
|
60
|
+
- lib/camping.rb
|
61
|
+
extra_rdoc_files:
|
62
|
+
- README
|
44
63
|
executables: []
|
45
64
|
|
46
65
|
extensions: []
|
data/lib/camping-mural.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
%w[rubygems active_record markaby metaid ostruct].each {|lib| require lib}
|
2
|
-
module Camping;C=self;module Models;Base=ActiveRecord::Base;end;module Views
|
3
|
-
end;Markaby::Builder.class_eval{include Views};module Controllers;module RM
|
4
|
-
attr_accessor :input,:cookies,:headers,:body,:status;def method_missing(m,
|
5
|
-
*args, &blk);str=eval("markaby.#{m}(*args, &blk)");str=markaview(:layout){
|
6
|
-
str}rescue nil;r(200,str.to_s,'Content-Type'=>'text/html');end;def render(m)
|
7
|
-
str=markaview(m);str=markaview(:layout){ str }rescue nil;r(200, str,
|
8
|
-
"Content-Type" => 'text/html');end;def redirect(*args);c, *args = args;if \
|
9
|
-
c.respond_to? :urls;c=c.urls.first.gsub(/\(.+?\)/){a=args.shift;a.
|
10
|
-
method(a.class.primary_key)[] rescue a};end;r(302,'','Location' => c);end
|
11
|
-
def r(s,b,h={});@status=s;@headers.merge!(h);@body = b;end;def service(
|
12
|
-
r,e,m,a);@status,@headers=200,{'Content-Type' => 'text/html'};@cookies=
|
13
|
-
C.cookie_parse(e['COOKIE']||e['HTTP_COOKIE']);cook=@cookies.marshal_dump.
|
14
|
-
dup;if (e['REQUEST_METHOD']=='POST')and %r|\Amultipart/form-data.*boundar\
|
15
|
-
y=\"?.+?\"?|n=~e['CONTENT_TYPE'];return r(500, "Urgh, multipart/form-data\
|
16
|
-
not yet supported.");else;@input=C.qs_parse(e['REQUEST_METHOD']!="POST" ?
|
17
|
-
e['QUERY_STRING']:r.read(e['CONTENT_LENGTH'].to_i));end;@body=method(m.
|
18
|
-
downcase).call(*a);@headers['Set-Cookie']=@cookies.marshal_dump.map{|k,v|
|
19
|
-
"#{k}=#{C.escape(v)};path=/"if v != cook[k]}.compact;self;end;def to_s;
|
20
|
-
"Status: #{@status}\n#{@headers.map{|k,v|v.to_a.map{|v2|"#{k}: #{v2}"}}.
|
21
|
-
flatten.join("\n")}\n\n#{@body}";end;private;def markaby;Markaby::Builder.
|
22
|
-
new( instance_variables.map{|iv|[iv[1..-1].intern,instance_variable_get(
|
23
|
-
iv)]},{});end;def markaview(m,*args,&blk);markaby.instance_eval{Views.
|
24
|
-
instance_method(m).bind(self).call(*args, &blk);self}.to_s;end;end;class R
|
25
|
-
include RM end;class NotFound < R;def get;r(404,h1('#{C} Problem!')+h2(
|
26
|
-
'Not Found'))end end;class<<self;def R(*urls);Class.new(R){meta_def(
|
27
|
-
:inherited){|c|c.meta_def(:urls){urls}}}end;def D(path);constants.each{|c|
|
28
|
-
k=const_get(c);return k,$~[1..-1]if (k.urls rescue "/#{c.downcase}").find{
|
29
|
-
|x|path=~/^#{x}\/?$/ };};[NotFound, []]end end end;class Response; include
|
30
|
-
Controllers::RM;def initialize(s=200,&blk);@headers,@body,@status={},"",s
|
31
|
-
instance_eval &blk end end;class << self;def escape(s); s.to_s.gsub(/([^ \
|
32
|
-
a-zA-Z0-9_.-]+)/n){'%'+$1.unpack('H2'*$1.size).join('%').upcase}.tr(' ','+')
|
33
|
-
end;def unescape(s);s.tr('+',' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n){[$1.delete(
|
34
|
-
'%')].pack('H*')}end;def qs_parse(qs,d='&;');OpenStruct.new((qs||'').split(
|
35
|
-
/[#{d}] */n).inject({}){|hsh, p|k,v=p.split('=',2).map{|v|unescape(v)};hsh[
|
36
|
-
k]=v unless v.empty?;hsh}) end;def cookie_parse(s);c=qs_parse(s,';,') end
|
37
|
-
def run(r=$stdin,w=$stdout);begin;k,a,m=Controllers.D(ENV['PATH_INFO'])+[
|
38
|
-
ENV['REQUEST_METHOD']||"GET"];k.class_eval{include Controllers::RM};o=k.new
|
39
|
-
o.class.class_eval{Models.constants.each{|c|g=Models.const_get(c)
|
40
|
-
remove_const c if const_defined? c;const_set c,g}};w<<o.service(r,ENV,m,a)
|
41
|
-
rescue=>e;w<<Response.new(200){@headers['Content-Type']='text/html';@body=
|
42
|
-
Markaby::Builder.new({},{}){h1'#{C} Problem!';h2"#{k}.#{m}";h3"#{e.class} \
|
43
|
-
#{e.message}:";ul{e.backtrace.each{|bt|li bt}}}.to_s};end end end end
|