zuk-picnic 0.8.0.20090318 → 0.8.0.20090427
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +26 -27
- data/lib/picnic/cli.rb +2 -0
- data/lib/picnic/conf.rb +21 -5
- data/lib/picnic.rb +1 -1
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/CHANGELOG +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/COPYING +0 -0
- data/vendor/camping-2.0.20090421/README +82 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/Rakefile +9 -3
- data/vendor/camping-2.0.20090421/bin/camping +97 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/doc/camping.1.gz +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/examples/README +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/examples/blog.rb +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/examples/campsh.rb +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/examples/tepee.rb +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/extras/Camping.gif +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/extras/permalink.gif +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/lib/camping/ar/session.rb +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/lib/camping/ar.rb +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/lib/camping/mab.rb +0 -0
- data/vendor/camping-2.0.20090421/lib/camping/reloader.rb +184 -0
- data/vendor/camping-2.0.20090421/lib/camping/server.rb +159 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/lib/camping/session.rb +1 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/lib/camping-unabridged.rb +53 -61
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/lib/camping.rb +23 -25
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/setup.rb +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/test/apps/env_debug.rb +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/test/apps/forms.rb +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/test/apps/misc.rb +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/test/apps/sessions.rb +0 -0
- data/vendor/{camping-2.0.20090212 → camping-2.0.20090421}/test/test_camping.rb +0 -0
- metadata +28 -29
- data/vendor/camping-2.0.20090212/README +0 -119
- data/vendor/camping-2.0.20090212/bin/camping +0 -99
- data/vendor/camping-2.0.20090212/extras/flipbook_rdoc.rb +0 -491
- data/vendor/camping-2.0.20090212/lib/camping/reloader.rb +0 -163
- data/vendor/camping-2.0.20090212/lib/camping/server.rb +0 -158
@@ -0,0 +1,159 @@
|
|
1
|
+
require 'irb'
|
2
|
+
require 'rack'
|
3
|
+
require 'camping/reloader'
|
4
|
+
|
5
|
+
# TODO: I guess we should documentate this too...
|
6
|
+
class Camping::Server
|
7
|
+
attr_reader :reloader
|
8
|
+
attr_accessor :conf
|
9
|
+
|
10
|
+
def initialize(conf, paths)
|
11
|
+
@conf = conf
|
12
|
+
@paths = paths
|
13
|
+
@reloader = Camping::Reloader.new
|
14
|
+
connect(@conf.database) if @conf.database
|
15
|
+
end
|
16
|
+
|
17
|
+
def connect(db)
|
18
|
+
unless Camping.autoload?(:Models)
|
19
|
+
Camping::Models::Base.establish_connection(db)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def find_scripts
|
24
|
+
scripts = @paths.map do |path|
|
25
|
+
case
|
26
|
+
when File.file?(path)
|
27
|
+
path
|
28
|
+
when File.directory?(path)
|
29
|
+
Dir[File.join(path, '*.rb')]
|
30
|
+
end
|
31
|
+
end.flatten.compact
|
32
|
+
@reloader.update(*scripts)
|
33
|
+
end
|
34
|
+
|
35
|
+
def index_page(apps)
|
36
|
+
welcome = "You are Camping"
|
37
|
+
header = <<-HTML
|
38
|
+
<html>
|
39
|
+
<head>
|
40
|
+
<title>#{welcome}</title>
|
41
|
+
<style type="text/css">
|
42
|
+
body {
|
43
|
+
font-family: verdana, arial, sans-serif;
|
44
|
+
padding: 10px 40px;
|
45
|
+
margin: 0;
|
46
|
+
}
|
47
|
+
h1, h2, h3, h4, h5, h6 {
|
48
|
+
font-family: utopia, georgia, serif;
|
49
|
+
}
|
50
|
+
</style>
|
51
|
+
</head>
|
52
|
+
<body>
|
53
|
+
<h1>#{welcome}</h1>
|
54
|
+
HTML
|
55
|
+
footer = '</body></html>'
|
56
|
+
main = if apps.empty?
|
57
|
+
"<p>Good day. I'm sorry, but I could not find any Camping apps."\
|
58
|
+
"You might want to take a look at the console to see if any errors"\
|
59
|
+
"have been raised</p>"
|
60
|
+
else
|
61
|
+
"<p>Good day. These are the Camping apps you've mounted.</p><ul>" +
|
62
|
+
apps.map do |mount, app|
|
63
|
+
"<li><h3 style=\"display: inline\"><a href=\"/#{mount}\">#{app}</a></h3><small> / <a href=\"/code/#{mount}\">View source</a></small></li>"
|
64
|
+
end.join("\n") + '</ul>'
|
65
|
+
end
|
66
|
+
|
67
|
+
header + main + footer
|
68
|
+
end
|
69
|
+
|
70
|
+
def app
|
71
|
+
reload!
|
72
|
+
all_apps = apps
|
73
|
+
rapp = case all_apps.length
|
74
|
+
when 0
|
75
|
+
proc{|env|[200,{'Content-Type'=>'text/html'},index_page([])]}
|
76
|
+
when 1
|
77
|
+
apps.values.first
|
78
|
+
else
|
79
|
+
hash = {
|
80
|
+
"/" => proc {|env|[200,{'Content-Type'=>'text/html'},index_page(all_apps)]}
|
81
|
+
}
|
82
|
+
all_apps.each do |mount, wrapp|
|
83
|
+
# We're doing @reloader.reload! ourself, so we don't need the wrapper.
|
84
|
+
app = wrapp.app
|
85
|
+
hash["/#{mount}"] = app
|
86
|
+
hash["/code/#{mount}"] = proc do |env|
|
87
|
+
[200,{'Content-Type'=>'text/plain','X-Sendfile'=>wrapp.script.file},'']
|
88
|
+
end
|
89
|
+
end
|
90
|
+
Rack::URLMap.new(hash)
|
91
|
+
end
|
92
|
+
rapp = Rack::ContentLength.new(rapp)
|
93
|
+
rapp = Rack::Lint.new(rapp)
|
94
|
+
rapp = XSendfile.new(rapp)
|
95
|
+
rapp = Rack::ShowExceptions.new(rapp)
|
96
|
+
end
|
97
|
+
|
98
|
+
def apps
|
99
|
+
@reloader.apps.inject({}) do |h, (mount, wrapp)|
|
100
|
+
h[mount.to_s.downcase] = wrapp
|
101
|
+
h
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def call(env)
|
106
|
+
app.call(env)
|
107
|
+
end
|
108
|
+
|
109
|
+
def start
|
110
|
+
handler, conf = case @conf.server
|
111
|
+
when "console"
|
112
|
+
puts "** Starting console"
|
113
|
+
reload!
|
114
|
+
this = self; eval("self", TOPLEVEL_BINDING).meta_def(:reload!) { this.reload!; nil }
|
115
|
+
ARGV.clear
|
116
|
+
IRB.start
|
117
|
+
exit
|
118
|
+
when "mongrel"
|
119
|
+
puts "** Starting Mongrel on #{@conf.host}:#{@conf.port}"
|
120
|
+
[Rack::Handler::Mongrel, {:Port => @conf.port, :Host => @conf.host}]
|
121
|
+
when "webrick"
|
122
|
+
puts "** Starting WEBrick on #{@conf.host}:#{@conf.port}"
|
123
|
+
[Rack::Handler::WEBrick, {:Port => @conf.port, :BindAddress => @conf.host}]
|
124
|
+
end
|
125
|
+
|
126
|
+
handler.run(self, conf)
|
127
|
+
end
|
128
|
+
|
129
|
+
def reload!
|
130
|
+
find_scripts
|
131
|
+
@reloader.reload!
|
132
|
+
end
|
133
|
+
|
134
|
+
# A Rack middleware for reading X-Sendfile. Should only be used in
|
135
|
+
# development.
|
136
|
+
class XSendfile
|
137
|
+
|
138
|
+
HEADERS = [
|
139
|
+
"X-Sendfile",
|
140
|
+
"X-Accel-Redirect",
|
141
|
+
"X-LIGHTTPD-send-file"
|
142
|
+
]
|
143
|
+
|
144
|
+
def initialize(app)
|
145
|
+
@app = app
|
146
|
+
end
|
147
|
+
|
148
|
+
def call(env)
|
149
|
+
status, headers, body = @app.call(env)
|
150
|
+
headers = Rack::Utils::HeaderHash.new(headers)
|
151
|
+
if header = HEADERS.detect { |header| headers.include?(header) }
|
152
|
+
path = headers[header]
|
153
|
+
body = File.read(path)
|
154
|
+
headers['Content-Length'] = body.length.to_s
|
155
|
+
end
|
156
|
+
[status, headers, body]
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -9,23 +9,6 @@
|
|
9
9
|
# nicely with piles of documentation everywhere. This documentation is entirely
|
10
10
|
# generated from lib/camping-unabridged.rb using RDoc and our "flipbook" template
|
11
11
|
# found in the extras directory of any camping distribution.
|
12
|
-
#
|
13
|
-
# == Requirements
|
14
|
-
#
|
15
|
-
# Camping requires at least Ruby 1.8.2.
|
16
|
-
#
|
17
|
-
# Camping depends on the following libraries. If you install through RubyGems,
|
18
|
-
# these will be automatically installed for you.
|
19
|
-
#
|
20
|
-
# * ActiveRecord, used in your models.
|
21
|
-
# ActiveRecord is an object-to-relational database mapper with adapters
|
22
|
-
# for SQLite3, MySQL, PostgreSQL, SQL Server and more.
|
23
|
-
# * Markaby, used in your views to describe HTML in plain Ruby.
|
24
|
-
#
|
25
|
-
# Camping also works well with Mongrel, the swift Ruby web server.
|
26
|
-
# http://rubyforge.org/projects/mongrel Mongrel comes with examples
|
27
|
-
# in its <tt>examples/camping</tt> directory.
|
28
|
-
#
|
29
12
|
%w[uri stringio rack].map { |l| require l }
|
30
13
|
|
31
14
|
class Object #:nodoc:
|
@@ -34,7 +17,11 @@ class Object #:nodoc:
|
|
34
17
|
end
|
35
18
|
end
|
36
19
|
|
37
|
-
# == Camping
|
20
|
+
# == Camping
|
21
|
+
# TODO: Tutorial: Camping.goes, MVC (link to Controllers, Models, Views where
|
22
|
+
# they're described in detail), Camping Server (for development), Rack
|
23
|
+
# (for production). the create-method. Service overload too, perhaps?
|
24
|
+
# Overriding r404, r500 and r501.
|
38
25
|
#
|
39
26
|
# The camping module contains three modules for separating your application:
|
40
27
|
#
|
@@ -47,6 +34,7 @@ end
|
|
47
34
|
# * Camping::Helpers which can be used in controllers and views.
|
48
35
|
#
|
49
36
|
# == The Camping Server
|
37
|
+
# TODO: Only for development.
|
50
38
|
#
|
51
39
|
# How do you run Camping apps? Oh, uh... The Camping Server!
|
52
40
|
#
|
@@ -84,6 +72,7 @@ end
|
|
84
72
|
# end
|
85
73
|
# end
|
86
74
|
#
|
75
|
+
# TODO: Wiki is down.
|
87
76
|
# For more tips, see http://code.whytheluckystiff.net/camping/wiki/GiveUsTheCreateMethod.
|
88
77
|
module Camping
|
89
78
|
C = self
|
@@ -91,6 +80,7 @@ module Camping
|
|
91
80
|
P = "<h1>Cam\ping Problem!</h1><h2>%s</h2>"
|
92
81
|
U = Rack::Utils
|
93
82
|
Apps = []
|
83
|
+
# TODO: @input[:page] != @input['page']
|
94
84
|
# An object-like Hash.
|
95
85
|
# All Camping query string and cookie variables are loaded as this.
|
96
86
|
#
|
@@ -125,7 +115,8 @@ module Camping
|
|
125
115
|
end
|
126
116
|
undef id, type
|
127
117
|
end
|
128
|
-
|
118
|
+
|
119
|
+
# TODO: Fair enough. Maybe complete the ActionPack example?
|
129
120
|
# Helpers contains methods available in your controllers and views. You may add
|
130
121
|
# methods of your own to this module, including many helper methods from Rails.
|
131
122
|
# This is analogous to Rails' <tt>ApplicationHelper</tt> module.
|
@@ -190,7 +181,7 @@ module Camping
|
|
190
181
|
# is assigned to route <tt>/logout</tt>. The HTML will come out as:
|
191
182
|
#
|
192
183
|
# <div id="menu">
|
193
|
-
# <a href="
|
184
|
+
# <a href="http://localhost:3301/frodo/">Home</a>
|
194
185
|
# <a href="/frodo/profile">Profile</a>
|
195
186
|
# <a href="/frodo/logout">Logout</a>
|
196
187
|
# <a href="http://google.com">Google</a>
|
@@ -251,6 +242,7 @@ module Camping
|
|
251
242
|
# Forgivable, considering that it's only really a handful of methods and accessors.
|
252
243
|
#
|
253
244
|
# == Treating controller methods like Response objects
|
245
|
+
# TODO: I don't think this belongs here. Either Controllers or Camping.
|
254
246
|
#
|
255
247
|
# Camping originally came with a barebones Response object, but it's often much more readable
|
256
248
|
# to just use your controller as the response.
|
@@ -279,6 +271,7 @@ module Camping
|
|
279
271
|
#
|
280
272
|
module Base
|
281
273
|
attr_accessor :input, :cookies, :headers, :body, :status, :root
|
274
|
+
M = proc { |_, o, n| o.merge(n, &M) }
|
282
275
|
|
283
276
|
# Display a view, calling it by its method name +m+. If a <tt>layout</tt>
|
284
277
|
# method is found in Camping::Views, it will be used to wrap the HTML.
|
@@ -328,6 +321,7 @@ module Camping
|
|
328
321
|
# You can also switch the body and the header in order to support Rack:
|
329
322
|
#
|
330
323
|
# r(302, {'Location' => self / "/view/12"}, '')
|
324
|
+
# r(another_app.call(@env))
|
331
325
|
#
|
332
326
|
# See also: #r404, #r500 and #r501
|
333
327
|
def r(s, b, h = {})
|
@@ -367,8 +361,8 @@ module Camping
|
|
367
361
|
# end
|
368
362
|
#
|
369
363
|
# See: I
|
370
|
-
def r404(p
|
371
|
-
|
364
|
+
def r404(p)
|
365
|
+
P % "#{p} not found"
|
372
366
|
end
|
373
367
|
|
374
368
|
# If there is a parse error in Camping or in your application's source code, it will not be caught
|
@@ -378,15 +372,15 @@ module Camping
|
|
378
372
|
# You can overide it, but if you have an error in here, it will be uncaught !
|
379
373
|
#
|
380
374
|
# See: I
|
381
|
-
def r500(k,m,
|
382
|
-
|
375
|
+
def r500(k,m,e)
|
376
|
+
raise e
|
383
377
|
end
|
384
378
|
|
385
379
|
# Called if an undefined method is called on a Controller, along with the request method +m+ (GET, POST, etc.)
|
386
380
|
#
|
387
381
|
# See: I
|
388
|
-
def r501(m
|
389
|
-
|
382
|
+
def r501(m)
|
383
|
+
P % "#{m.upcase} not implemented"
|
390
384
|
end
|
391
385
|
|
392
386
|
# Turn a controller into an array. This is designed to be used to pipe
|
@@ -401,46 +395,41 @@ module Camping
|
|
401
395
|
# end
|
402
396
|
# end
|
403
397
|
def to_a
|
404
|
-
|
405
|
-
@response.status = @status
|
406
|
-
@response.headers.merge!(@headers)
|
398
|
+
r = Rack::Response.new(@body, @status, @headers)
|
407
399
|
@cookies.each do |k, v|
|
408
400
|
v = {:value => v, :path => self / "/"} if String===v
|
409
|
-
|
401
|
+
r.set_cookie(k, v)
|
410
402
|
end
|
411
|
-
|
403
|
+
r.to_a
|
412
404
|
end
|
413
405
|
|
414
|
-
def initialize(env) #:nodoc:
|
415
|
-
@request
|
416
|
-
|
417
|
-
@
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
if k[-2..-1] == "[]"
|
425
|
-
@input[k[0..-3]] = @input.delete(k)
|
426
|
-
elsif k =~ /(.*)\[([^\]]+)\]$/
|
427
|
-
(@input[$1] ||= H[])[$2] = @input.delete(k)
|
428
|
-
end
|
406
|
+
def initialize(env, m) #:nodoc:
|
407
|
+
r = @request = Rack::Request.new(@env = env)
|
408
|
+
@root, p, @cookies,
|
409
|
+
@headers, @status, @method =
|
410
|
+
(env.SCRIPT_NAME||'').sub(/\/$/,''),
|
411
|
+
H[r.params], H[r.cookies],
|
412
|
+
{}, m =~ /r(\d+)/ ? $1.to_i : 200, m
|
413
|
+
|
414
|
+
@input = p.inject(H[]) do |h, (k, v)|
|
415
|
+
h.merge(k.split(/[\]\[]+/).reverse.inject(v) { |x, i| H[i => x] }, &M)
|
429
416
|
end
|
430
417
|
end
|
431
418
|
|
419
|
+
# TODO: The wiki is down. Service overload should probably go in Camping.
|
432
420
|
# All requests pass through this method before going to the controller. Some magic
|
433
421
|
# in Camping can be performed by overriding this method.
|
434
422
|
#
|
435
423
|
# See http://code.whytheluckystiff.net/camping/wiki/BeforeAndAfterOverrides for more
|
436
424
|
# on before and after overrides with Camping.
|
437
425
|
def service(*a)
|
438
|
-
r = catch(:halt){send(@
|
426
|
+
r = catch(:halt){send(@method, *a)}
|
439
427
|
@body ||= r
|
440
428
|
self
|
441
429
|
end
|
442
430
|
end
|
443
|
-
|
431
|
+
|
432
|
+
# TODO: @input & @cookies at least.
|
444
433
|
# Controllers is a module for placing classes which handle URLs. This is done
|
445
434
|
# by defining a route to each class using the Controllers::R method.
|
446
435
|
#
|
@@ -510,7 +499,7 @@ module Camping
|
|
510
499
|
[I, 'r404', p]
|
511
500
|
end
|
512
501
|
|
513
|
-
N = H.new { |_,x| x.downcase }.merge! "N" => '(\d+)', "X" => '(
|
502
|
+
N = H.new { |_,x| x.downcase }.merge! "N" => '(\d+)', "X" => '([^/]+)', "Index" => ''
|
514
503
|
# The route maker, this is called by Camping internally, you shouldn't need to call it.
|
515
504
|
#
|
516
505
|
# Still, it's worth know what this method does. Since Ruby doesn't keep track of class
|
@@ -533,8 +522,7 @@ module Camping
|
|
533
522
|
end
|
534
523
|
|
535
524
|
# Internal controller with no route. Used by #D and C.call to show internal messages.
|
536
|
-
|
537
|
-
end
|
525
|
+
I = R()
|
538
526
|
end
|
539
527
|
X = Controllers
|
540
528
|
|
@@ -559,10 +547,12 @@ module Camping
|
|
559
547
|
# And array with [statuc, headers, body] is expected at the output.
|
560
548
|
def call(e)
|
561
549
|
X.M
|
562
|
-
e = H[e
|
563
|
-
|
564
|
-
e.REQUEST_METHOD
|
565
|
-
k.new(e).service(*a).to_a
|
550
|
+
e = H[e]
|
551
|
+
p = e.PATH_INFO = U.unescape(e.PATH_INFO)
|
552
|
+
k,m,*a=X.D p,(e.REQUEST_METHOD||'get').downcase
|
553
|
+
k.new(e,m).service(*a).to_a
|
554
|
+
rescue
|
555
|
+
r500(:I, k, m, $!, :env => e).to_a
|
566
556
|
end
|
567
557
|
|
568
558
|
# The Camping scriptable dispatcher. Any unhandled method call to the app module will
|
@@ -585,14 +575,15 @@ module Camping
|
|
585
575
|
#
|
586
576
|
def method_missing(m, c, *a)
|
587
577
|
X.M
|
588
|
-
h=Hash===a[-1]?
|
589
|
-
e=H[h[:env]||{}]
|
590
|
-
k = X.const_get(c).new(
|
591
|
-
k.send("input=",h[:input]) if h[:input]
|
578
|
+
h = Hash === a[-1] ? a.pop : {}
|
579
|
+
e = H[Rack::MockRequest.env_for('',h[:env]||{})]
|
580
|
+
k = X.const_get(c).new(e,m.to_s)
|
581
|
+
k.send("input=", h[:input]) if h[:input]
|
592
582
|
k.service(*a)
|
593
583
|
end
|
594
584
|
end
|
595
|
-
|
585
|
+
|
586
|
+
# TODO: More examples.
|
596
587
|
# Views is an empty module for storing methods which create HTML. The HTML is described
|
597
588
|
# using the Markaby language.
|
598
589
|
#
|
@@ -601,7 +592,8 @@ module Camping
|
|
601
592
|
# If your Views module has a <tt>layout</tt> method defined, it will be called with a block
|
602
593
|
# which will insert content from your view.
|
603
594
|
module Views; include X, Helpers end
|
604
|
-
|
595
|
+
|
596
|
+
# TODO: Migrations
|
605
597
|
# Models is an empty Ruby module for housing model classes derived
|
606
598
|
# from ActiveRecord::Base. As a shortcut, you may derive from Base
|
607
599
|
# which is an alias for ActiveRecord::Base.
|
@@ -11,44 +11,42 @@ h.any?? u+"?"+U.build_query(h[0]):u end;def / p
|
|
11
11
|
p[0]==?/?@root+p:p end;def URL c='/',*a;c=R(c, *a) if c.respond_to?:urls
|
12
12
|
c=self/c;c=@request.url[/.{8,}?(?=\/)/]+c if c[0]==?/;URI c end
|
13
13
|
end;module Base;attr_accessor:input,:cookies,:headers,:body,:status,:root
|
14
|
+
M=proc{|_,o,n|o.merge(n,&M)}
|
14
15
|
def render v,*a,&b;mab(/^_/!~v.to_s){send(v,*a,&b)} end
|
15
16
|
def mab l=nil,&b;m=Mab.new({},self);s=m.capture(&b)
|
16
17
|
s=m.capture{layout{s}} if l && m.respond_to?(:layout);s end
|
17
18
|
def r s,b,h={};b,h=h,b if Hash===b;@status=s;
|
18
19
|
@headers.merge!(h);@body=b;end;def redirect *a;r 302,'','Location'=>URL(*a).
|
19
|
-
to_s;end;def r404 p
|
20
|
-
|
21
|
-
|
22
|
-
r 501,P%"#{m.upcase} not implemented"end;def to_a
|
23
|
-
@response.body=@body.respond_to?(:each)?@body:""
|
24
|
-
@response.status=@status;@response.headers.merge!(@headers)
|
20
|
+
to_s;end;def r404 p;P%"#{p} not found"end;def r500 k,m,e;raise e;end
|
21
|
+
def r501 m;P%"#{m.upcase} not implemented"end;def to_a
|
22
|
+
r=Rack::Response.new(@body,@status,@headers)
|
25
23
|
@cookies.each{|k,v|v={:value=>v,:path=>self/"/"} if String===v
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
@root,@
|
30
|
-
|
31
|
-
H[
|
32
|
-
@input.
|
33
|
-
|
34
|
-
(
|
35
|
-
r=catch(:halt){send(@env.REQUEST_METHOD.downcase,*a)};@body||=r
|
24
|
+
r.set_cookie(k,v)}
|
25
|
+
r.to_a;end;def initialize(env,m)
|
26
|
+
r=@request=Rack::Request.new(@env=env)
|
27
|
+
@root,p,@cookies,@headers,@status,@method=
|
28
|
+
(env.SCRIPT_NAME||'').sub(/\/$/,''),H[r.params],
|
29
|
+
H[r.cookies],{},m=~/r(\d+)/?$1.to_i: 200,m
|
30
|
+
@input=p.inject(H[]){|h,(k,v)|h.merge k.split(/[\]\[]+/).reverse.inject(v){|x,i|
|
31
|
+
H[i=>x]},&M};end;def service *a
|
32
|
+
r=catch(:halt){send(@method,*a)};@body||=r
|
36
33
|
self;end;end;module Controllers;@r=[];class<<self;def r;@r end;def R *u;r=@r
|
37
34
|
Class.new{meta_def(:urls){u};meta_def(:inherited){|x|r<<x}}end
|
38
35
|
def D p,m;p='/'if !p||!p[0]
|
39
36
|
r.map{|k|k.urls.map{|x|return(k.instance_method(m)rescue nil)?
|
40
37
|
[k,m,*$~[1..-1]]:[I,'r501',m]if p=~/^#{x}\/?$/}};[I,'r404',p] end
|
41
|
-
N=H.new{|_,x|x.downcase}.merge! "N"=>'(\d+)',"X"=>'(
|
38
|
+
N=H.new{|_,x|x.downcase}.merge! "N"=>'(\d+)',"X"=>'([^/]+)',"Index"=>''
|
42
39
|
def M;def M;end;constants.map{|c|k=const_get(c)
|
43
40
|
k.send:include,C,Base,Helpers,Models;@r=[k]+r if r-[k]==r
|
44
41
|
k.meta_def(:urls){["/#{c.scan(/.[^A-Z]*/).map(&N.method(:[]))*'/'}"]
|
45
|
-
}if !k.respond_to?:urls}end end;
|
46
|
-
end;
|
47
|
-
Apps<<eval(S.gsub(/Camping/,m.to_s),TOPLEVEL_BINDING) end;def call
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
42
|
+
}if !k.respond_to?:urls}end end;I=R()
|
43
|
+
end;X=Controllers;class<<self;def goes m
|
44
|
+
Apps<<eval(S.gsub(/Camping/,m.to_s),TOPLEVEL_BINDING) end;def call e
|
45
|
+
X.M;e=H[e];p=e.PATH_INFO=U.unescape(e.PATH_INFO)
|
46
|
+
k,m,*a=X.D p,(e.REQUEST_METHOD||'get').downcase
|
47
|
+
k.new(e,m).service(*a).to_a;rescue;r500(:I,k,m,$!,:env=>e).to_a;end
|
48
|
+
def method_missing m,c,*a;X.M;h=Hash===a[-1]?a.pop: {}
|
49
|
+
e=H[Rack::MockRequest.env_for('',h[:env]||{})]
|
50
|
+
k=X.const_get(c).new(e,m.to_s);k.send("input=",h[:input])if h[:input]
|
53
51
|
k.service(*a);end;end;module Views;include X,Helpers end;module Models
|
54
52
|
autoload:Base,'camping/ar';def Y;self;end end;autoload:Mab,'camping/mab';C end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zuk-picnic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.0.
|
4
|
+
version: 0.8.0.20090427
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Zukowski
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-04-27 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -83,33 +83,32 @@ files:
|
|
83
83
|
- setup.rb
|
84
84
|
- test/picnic_test.rb
|
85
85
|
- test/test_helper.rb
|
86
|
-
- vendor/camping-2.0.
|
87
|
-
- vendor/camping-2.0.
|
88
|
-
- vendor/camping-2.0.
|
89
|
-
- vendor/camping-2.0.
|
90
|
-
- vendor/camping-2.0.
|
91
|
-
- vendor/camping-2.0.
|
92
|
-
- vendor/camping-2.0.
|
93
|
-
- vendor/camping-2.0.
|
94
|
-
- vendor/camping-2.0.
|
95
|
-
- vendor/camping-2.0.
|
96
|
-
- vendor/camping-2.0.
|
97
|
-
- vendor/camping-2.0.
|
98
|
-
- vendor/camping-2.0.
|
99
|
-
- vendor/camping-2.0.
|
100
|
-
- vendor/camping-2.0.
|
101
|
-
- vendor/camping-2.0.
|
102
|
-
- vendor/camping-2.0.
|
103
|
-
- vendor/camping-2.0.
|
104
|
-
- vendor/camping-2.0.
|
105
|
-
- vendor/camping-2.0.
|
106
|
-
- vendor/camping-2.0.
|
107
|
-
- vendor/camping-2.0.
|
108
|
-
- vendor/camping-2.0.
|
109
|
-
- vendor/camping-2.0.
|
110
|
-
- vendor/camping-2.0.
|
111
|
-
- vendor/camping-2.0.
|
112
|
-
- vendor/camping-2.0.20090212/test/test_camping.rb
|
86
|
+
- vendor/camping-2.0.20090421/CHANGELOG
|
87
|
+
- vendor/camping-2.0.20090421/COPYING
|
88
|
+
- vendor/camping-2.0.20090421/README
|
89
|
+
- vendor/camping-2.0.20090421/Rakefile
|
90
|
+
- vendor/camping-2.0.20090421/bin/camping
|
91
|
+
- vendor/camping-2.0.20090421/doc/camping.1.gz
|
92
|
+
- vendor/camping-2.0.20090421/examples/README
|
93
|
+
- vendor/camping-2.0.20090421/examples/blog.rb
|
94
|
+
- vendor/camping-2.0.20090421/examples/campsh.rb
|
95
|
+
- vendor/camping-2.0.20090421/examples/tepee.rb
|
96
|
+
- vendor/camping-2.0.20090421/extras/Camping.gif
|
97
|
+
- vendor/camping-2.0.20090421/extras/permalink.gif
|
98
|
+
- vendor/camping-2.0.20090421/lib/camping-unabridged.rb
|
99
|
+
- vendor/camping-2.0.20090421/lib/camping.rb
|
100
|
+
- vendor/camping-2.0.20090421/lib/camping/ar.rb
|
101
|
+
- vendor/camping-2.0.20090421/lib/camping/ar/session.rb
|
102
|
+
- vendor/camping-2.0.20090421/lib/camping/mab.rb
|
103
|
+
- vendor/camping-2.0.20090421/lib/camping/reloader.rb
|
104
|
+
- vendor/camping-2.0.20090421/lib/camping/server.rb
|
105
|
+
- vendor/camping-2.0.20090421/lib/camping/session.rb
|
106
|
+
- vendor/camping-2.0.20090421/setup.rb
|
107
|
+
- vendor/camping-2.0.20090421/test/apps/env_debug.rb
|
108
|
+
- vendor/camping-2.0.20090421/test/apps/forms.rb
|
109
|
+
- vendor/camping-2.0.20090421/test/apps/misc.rb
|
110
|
+
- vendor/camping-2.0.20090421/test/apps/sessions.rb
|
111
|
+
- vendor/camping-2.0.20090421/test/test_camping.rb
|
113
112
|
has_rdoc: true
|
114
113
|
homepage: http://picnic.rubyforge.org
|
115
114
|
post_install_message:
|