picnic 0.8.0 → 0.8.1
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/History.txt +10 -0
- data/Manifest.txt +27 -27
- data/lib/picnic.rb +1 -1
- data/lib/picnic/cli.rb +2 -0
- data/lib/picnic/conf.rb +30 -6
- data/lib/picnic/server.rb +18 -21
- data/lib/picnic/version.rb +1 -1
- data/picnic.gemspec +3 -3
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/CHANGELOG +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/COPYING +0 -0
- data/vendor/zuk-camping-2.0.20090429/README +82 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/Rakefile +9 -3
- data/vendor/zuk-camping-2.0.20090429/bin/camping +97 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/doc/camping.1.gz +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/examples/README +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/examples/blog.rb +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/examples/campsh.rb +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/examples/tepee.rb +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/extras/Camping.gif +0 -0
- data/vendor/zuk-camping-2.0.20090429/extras/flipbook.rb +357 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/extras/permalink.gif +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/lib/camping-unabridged.rb +53 -61
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/lib/camping.rb +23 -25
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/lib/camping/ar.rb +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/lib/camping/ar/session.rb +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/lib/camping/mab.rb +0 -0
- data/vendor/zuk-camping-2.0.20090429/lib/camping/reloader.rb +188 -0
- data/vendor/zuk-camping-2.0.20090429/lib/camping/server.rb +159 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/lib/camping/session.rb +1 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/setup.rb +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/test/apps/env_debug.rb +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/test/apps/forms.rb +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/test/apps/misc.rb +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/test/apps/sessions.rb +0 -0
- data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/test/test_camping.rb +0 -0
- metadata +29 -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
@@ -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
|
@@ -0,0 +1,188 @@
|
|
1
|
+
module Camping
|
2
|
+
# == The Camping Reloader
|
3
|
+
#
|
4
|
+
# Camping apps are generally small and predictable. Many Camping apps are
|
5
|
+
# contained within a single file. Larger apps are split into a handful of
|
6
|
+
# other Ruby libraries within the same directory.
|
7
|
+
#
|
8
|
+
# Since Camping apps (and their dependencies) are loaded with Ruby's require
|
9
|
+
# method, there is a record of them in $LOADED_FEATURES. Which leaves a
|
10
|
+
# perfect space for this class to manage auto-reloading an app if any of its
|
11
|
+
# immediate dependencies changes.
|
12
|
+
#
|
13
|
+
# == Wrapping Your Apps
|
14
|
+
#
|
15
|
+
# Since bin/camping and the Camping::Server class already use the Reloader,
|
16
|
+
# you probably don't need to hack it on your own. But, if you're rolling your
|
17
|
+
# own situation, here's how.
|
18
|
+
#
|
19
|
+
# Rather than this:
|
20
|
+
#
|
21
|
+
# require 'yourapp'
|
22
|
+
#
|
23
|
+
# Use this:
|
24
|
+
#
|
25
|
+
# require 'camping/reloader'
|
26
|
+
# reloader = Camping::Reloader.new('/path/to/yourapp.rb')
|
27
|
+
# blog = reloader.apps[:Blog]
|
28
|
+
# wiki = reloader.apps[:Wiki]
|
29
|
+
#
|
30
|
+
# The <tt>blog</tt> and <tt>wiki</tt> objects will behave exactly like your
|
31
|
+
# Blog and Wiki, but they will update themselves if yourapp.rb changes.
|
32
|
+
#
|
33
|
+
# You can also give Reloader more than one script.
|
34
|
+
class Reloader
|
35
|
+
attr_reader :scripts
|
36
|
+
|
37
|
+
# This is a simple wrapper which causes the script to reload (if needed)
|
38
|
+
# on any method call. Then the method call will be forwarded to the
|
39
|
+
# app.
|
40
|
+
class App # :nodoc:
|
41
|
+
instance_methods.each { |m| undef_method m unless m =~ /^__/ }
|
42
|
+
attr_accessor :app, :script
|
43
|
+
|
44
|
+
def initialize(script)
|
45
|
+
@script = script
|
46
|
+
end
|
47
|
+
|
48
|
+
# Reloads if needed, before calling the method on the app.
|
49
|
+
def method_missing(meth, *args, &blk)
|
50
|
+
@script.reload!
|
51
|
+
@app.send(meth, *args, &blk)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# This class is doing all the hard work; however, it only works on
|
56
|
+
# single files. Reloader just wraps up support for multiple scripts
|
57
|
+
# and hides away some methods you normally won't need.
|
58
|
+
class Script # :nodoc:
|
59
|
+
attr_reader :apps, :file, :dir, :extras
|
60
|
+
|
61
|
+
def initialize(file)
|
62
|
+
@file = File.expand_path(file)
|
63
|
+
@dir = File.dirname(@file)
|
64
|
+
@extras = File.join(@dir, File.basename(@file, ".rb"))
|
65
|
+
@mtime = Time.at(0)
|
66
|
+
@requires = []
|
67
|
+
@apps = {}
|
68
|
+
end
|
69
|
+
|
70
|
+
# Loads the apps availble in this script. Use <tt>apps</tt> to get
|
71
|
+
# the loaded apps.
|
72
|
+
def load_apps
|
73
|
+
all_requires = $LOADED_FEATURES.dup
|
74
|
+
all_apps = Camping::Apps.dup
|
75
|
+
|
76
|
+
begin
|
77
|
+
load(@file)
|
78
|
+
rescue Exception => e
|
79
|
+
puts "!! Error loading #{@file}:"
|
80
|
+
puts "#{e.class}: #{e.message}"
|
81
|
+
puts e.backtrace
|
82
|
+
puts "!! Error loading #{@file}, see backtrace above"
|
83
|
+
end
|
84
|
+
|
85
|
+
@requires = ($LOADED_FEATURES - all_requires).map do |req|
|
86
|
+
full = full_path(req)
|
87
|
+
full if full == @file or full.index(@extras) == 0
|
88
|
+
end
|
89
|
+
|
90
|
+
@mtime = mtime
|
91
|
+
|
92
|
+
new_apps = (Camping::Apps - all_apps)
|
93
|
+
old_apps = @apps.dup
|
94
|
+
@apps = new_apps.inject({}) do |hash, app|
|
95
|
+
key = app.name.to_sym
|
96
|
+
hash[key] = (old = old_apps[key]) || App.new(self)
|
97
|
+
hash[key].app = app
|
98
|
+
app.create if app.respond_to?(:create) && !old
|
99
|
+
hash
|
100
|
+
end
|
101
|
+
self
|
102
|
+
end
|
103
|
+
|
104
|
+
# Removes all the apps defined in this script.
|
105
|
+
def remove_apps
|
106
|
+
@apps.each do |name, app|
|
107
|
+
Camping::Apps.delete(app.app)
|
108
|
+
Object.send :remove_const, name
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# Reloads the file if needed. No harm is done by calling this multiple
|
113
|
+
# times, so feel free call just to be sure.
|
114
|
+
def reload!
|
115
|
+
return if @mtime >= mtime
|
116
|
+
remove_apps
|
117
|
+
load_apps
|
118
|
+
end
|
119
|
+
|
120
|
+
# Checks if both scripts watches the same file.
|
121
|
+
def ==(other)
|
122
|
+
@file == other.file
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def mtime
|
128
|
+
(@requires + [@file]).compact.map do |fname|
|
129
|
+
File.mtime(fname)
|
130
|
+
end.reject{|t| t > Time.now }.max
|
131
|
+
end
|
132
|
+
|
133
|
+
# Figures out the full path of a required file.
|
134
|
+
def full_path(req)
|
135
|
+
dir = $LOAD_PATH.detect { |l| File.exists?(File.join(l, req)) }
|
136
|
+
if dir
|
137
|
+
File.join(File.expand_path(dir), req)
|
138
|
+
else
|
139
|
+
req
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# Creates the reloader, assigns a +script+ to it and initially loads the
|
145
|
+
# application. Pass in the full path to the script, otherwise the script
|
146
|
+
# will be loaded relative to the current working directory.
|
147
|
+
def initialize(*scripts)
|
148
|
+
@scripts = []
|
149
|
+
update(*scripts)
|
150
|
+
end
|
151
|
+
|
152
|
+
# Updates the reloader to only use the scripts provided:
|
153
|
+
#
|
154
|
+
# reloader.update("examples/blog.rb", "examples/wiki.rb")
|
155
|
+
def update(*scripts)
|
156
|
+
old = @scripts.dup
|
157
|
+
clear
|
158
|
+
@scripts = scripts.map do |script|
|
159
|
+
s = Script.new(script)
|
160
|
+
if pos = old.index(s)
|
161
|
+
# We already got a script, so we use the old (which might got a mtime)
|
162
|
+
old[pos]
|
163
|
+
else
|
164
|
+
s.load_apps
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# Removes all the scripts from the reloader.
|
170
|
+
def clear
|
171
|
+
@scrips = []
|
172
|
+
end
|
173
|
+
|
174
|
+
# Simply calls reload! on all the Script objects.
|
175
|
+
def reload!
|
176
|
+
@scripts.each { |script| script.reload! }
|
177
|
+
end
|
178
|
+
|
179
|
+
# Returns a Hash of all the apps available in the scripts, where the key
|
180
|
+
# would be the name of the app (the one you gave to Camping.goes) and the
|
181
|
+
# value would be the app (wrapped inside App).
|
182
|
+
def apps
|
183
|
+
@scripts.inject({}) do |hash, script|
|
184
|
+
hash.merge(script.apps)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
@@ -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
|
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: picnic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.1
|
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-05-01 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -84,33 +84,33 @@ files:
|
|
84
84
|
- setup.rb
|
85
85
|
- test/picnic_test.rb
|
86
86
|
- test/test_helper.rb
|
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.
|
113
|
-
- vendor/camping-2.0.
|
87
|
+
- vendor/zuk-camping-2.0.20090429/CHANGELOG
|
88
|
+
- vendor/zuk-camping-2.0.20090429/COPYING
|
89
|
+
- vendor/zuk-camping-2.0.20090429/README
|
90
|
+
- vendor/zuk-camping-2.0.20090429/Rakefile
|
91
|
+
- vendor/zuk-camping-2.0.20090429/bin/camping
|
92
|
+
- vendor/zuk-camping-2.0.20090429/doc/camping.1.gz
|
93
|
+
- vendor/zuk-camping-2.0.20090429/examples/README
|
94
|
+
- vendor/zuk-camping-2.0.20090429/examples/blog.rb
|
95
|
+
- vendor/zuk-camping-2.0.20090429/examples/campsh.rb
|
96
|
+
- vendor/zuk-camping-2.0.20090429/examples/tepee.rb
|
97
|
+
- vendor/zuk-camping-2.0.20090429/extras/Camping.gif
|
98
|
+
- vendor/zuk-camping-2.0.20090429/extras/flipbook.rb
|
99
|
+
- vendor/zuk-camping-2.0.20090429/extras/permalink.gif
|
100
|
+
- vendor/zuk-camping-2.0.20090429/lib/camping-unabridged.rb
|
101
|
+
- vendor/zuk-camping-2.0.20090429/lib/camping.rb
|
102
|
+
- vendor/zuk-camping-2.0.20090429/lib/camping/ar.rb
|
103
|
+
- vendor/zuk-camping-2.0.20090429/lib/camping/ar/session.rb
|
104
|
+
- vendor/zuk-camping-2.0.20090429/lib/camping/mab.rb
|
105
|
+
- vendor/zuk-camping-2.0.20090429/lib/camping/reloader.rb
|
106
|
+
- vendor/zuk-camping-2.0.20090429/lib/camping/server.rb
|
107
|
+
- vendor/zuk-camping-2.0.20090429/lib/camping/session.rb
|
108
|
+
- vendor/zuk-camping-2.0.20090429/setup.rb
|
109
|
+
- vendor/zuk-camping-2.0.20090429/test/apps/env_debug.rb
|
110
|
+
- vendor/zuk-camping-2.0.20090429/test/apps/forms.rb
|
111
|
+
- vendor/zuk-camping-2.0.20090429/test/apps/misc.rb
|
112
|
+
- vendor/zuk-camping-2.0.20090429/test/apps/sessions.rb
|
113
|
+
- vendor/zuk-camping-2.0.20090429/test/test_camping.rb
|
114
114
|
has_rdoc: true
|
115
115
|
homepage: http://picnic.rubyforge.org
|
116
116
|
post_install_message:
|