camping 1.1 → 1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|