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.
Files changed (41) hide show
  1. data/History.txt +10 -0
  2. data/Manifest.txt +27 -27
  3. data/lib/picnic.rb +1 -1
  4. data/lib/picnic/cli.rb +2 -0
  5. data/lib/picnic/conf.rb +30 -6
  6. data/lib/picnic/server.rb +18 -21
  7. data/lib/picnic/version.rb +1 -1
  8. data/picnic.gemspec +3 -3
  9. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/CHANGELOG +0 -0
  10. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/COPYING +0 -0
  11. data/vendor/zuk-camping-2.0.20090429/README +82 -0
  12. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/Rakefile +9 -3
  13. data/vendor/zuk-camping-2.0.20090429/bin/camping +97 -0
  14. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/doc/camping.1.gz +0 -0
  15. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/examples/README +0 -0
  16. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/examples/blog.rb +0 -0
  17. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/examples/campsh.rb +0 -0
  18. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/examples/tepee.rb +0 -0
  19. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/extras/Camping.gif +0 -0
  20. data/vendor/zuk-camping-2.0.20090429/extras/flipbook.rb +357 -0
  21. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/extras/permalink.gif +0 -0
  22. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/lib/camping-unabridged.rb +53 -61
  23. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/lib/camping.rb +23 -25
  24. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/lib/camping/ar.rb +0 -0
  25. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/lib/camping/ar/session.rb +0 -0
  26. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/lib/camping/mab.rb +0 -0
  27. data/vendor/zuk-camping-2.0.20090429/lib/camping/reloader.rb +188 -0
  28. data/vendor/zuk-camping-2.0.20090429/lib/camping/server.rb +159 -0
  29. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/lib/camping/session.rb +1 -0
  30. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/setup.rb +0 -0
  31. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/test/apps/env_debug.rb +0 -0
  32. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/test/apps/forms.rb +0 -0
  33. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/test/apps/misc.rb +0 -0
  34. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/test/apps/sessions.rb +0 -0
  35. data/vendor/{camping-2.0.20090212 → zuk-camping-2.0.20090429}/test/test_camping.rb +0 -0
  36. metadata +29 -29
  37. data/vendor/camping-2.0.20090212/README +0 -119
  38. data/vendor/camping-2.0.20090212/bin/camping +0 -99
  39. data/vendor/camping-2.0.20090212/extras/flipbook_rdoc.rb +0 -491
  40. data/vendor/camping-2.0.20090212/lib/camping/reloader.rb +0 -163
  41. 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=env.PATH;r 404,P%"#{p} not found"end;def r500 k,m,x
20
- r 500,P%"#{k}.#{m}"+"<h3>#{x.class} #{x.message}: <ul>#{x.
21
- backtrace.map{|b|"<li>#{b}</li>"}}</ul></h3>"end;def r501 m=@method
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
- @response.set_cookie(k,v) if @request.cookies[k]!=v}
27
- @response.to_a;end;def initialize(env)
28
- @request,@response,@env=Rack::Request.new(env),Rack::Response.new,env
29
- @root,@input,@cookies,@headers,@status=
30
- @env.SCRIPT_NAME.sub(/\/$/,''),H[@request.params],
31
- H[@request.cookies],@response.headers,@response.status
32
- @input.each{|k,v|if k[-2..-1]=="[]";@input[k[0..-3]]=
33
- @input.delete(k)elsif k=~/(.*)\[([^\]]+)\]$/
34
- (@input[$1]||=H[])[$2]=@input.delete(k)end};end;def service *a
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"=>'(\w+)',"Index"=>''
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;class I<R()
46
- end; end;X=Controllers;class<<self;def goes m
47
- Apps<<eval(S.gsub(/Camping/,m.to_s),TOPLEVEL_BINDING) end;def call(
48
- e)X.M;e=H[e.to_hash];k,m,*a=X.D e.PATH_INFO,(e.REQUEST_METHOD||'get').downcase
49
- e.REQUEST_METHOD=m;k.new(e).service(*a).to_a;end
50
- def method_missing m,c,*a;X.M;h=Hash===a[-1]?H[a.pop]:{};e=
51
- H[h[:env]||{}].merge!({'rack.input'=>StringIO.new,'REQUEST_METHOD'=>m.to_s})
52
- k=X.const_get(c).new(H[e]);k.send("input=",h[:input])if h[:input]
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
@@ -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
@@ -1,4 +1,5 @@
1
1
  # == About camping/session.rb
2
+ # TODO: Clean everything up. Lots of just plain wrong stuff in here.
2
3
  #
3
4
  # This file contains two modules which supply basic sessioning to your Camping app.
4
5
  # Again, we're dealing with a pretty little bit of code: approx. 60 lines.
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.0
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-03-18 00:00:00 -04:00
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.20090212/CHANGELOG
88
- - vendor/camping-2.0.20090212/COPYING
89
- - vendor/camping-2.0.20090212/README
90
- - vendor/camping-2.0.20090212/Rakefile
91
- - vendor/camping-2.0.20090212/bin/camping
92
- - vendor/camping-2.0.20090212/doc/camping.1.gz
93
- - vendor/camping-2.0.20090212/examples/README
94
- - vendor/camping-2.0.20090212/examples/blog.rb
95
- - vendor/camping-2.0.20090212/examples/campsh.rb
96
- - vendor/camping-2.0.20090212/examples/tepee.rb
97
- - vendor/camping-2.0.20090212/extras/Camping.gif
98
- - vendor/camping-2.0.20090212/extras/flipbook_rdoc.rb
99
- - vendor/camping-2.0.20090212/extras/permalink.gif
100
- - vendor/camping-2.0.20090212/lib/camping-unabridged.rb
101
- - vendor/camping-2.0.20090212/lib/camping.rb
102
- - vendor/camping-2.0.20090212/lib/camping/ar.rb
103
- - vendor/camping-2.0.20090212/lib/camping/ar/session.rb
104
- - vendor/camping-2.0.20090212/lib/camping/mab.rb
105
- - vendor/camping-2.0.20090212/lib/camping/reloader.rb
106
- - vendor/camping-2.0.20090212/lib/camping/server.rb
107
- - vendor/camping-2.0.20090212/lib/camping/session.rb
108
- - vendor/camping-2.0.20090212/setup.rb
109
- - vendor/camping-2.0.20090212/test/apps/env_debug.rb
110
- - vendor/camping-2.0.20090212/test/apps/forms.rb
111
- - vendor/camping-2.0.20090212/test/apps/misc.rb
112
- - vendor/camping-2.0.20090212/test/apps/sessions.rb
113
- - vendor/camping-2.0.20090212/test/test_camping.rb
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: