picnic 0.8.0 → 0.8.1

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