picnic 0.8.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|