camping 1.4.2 → 1.5
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/CHANGELOG +44 -1
- data/README +4 -11
- data/Rakefile +10 -10
- data/bin/camping +155 -97
- data/doc/camping.1.gz +0 -0
- data/examples/{blog/blog.rb → blog.rb} +45 -59
- data/examples/{campsh/campsh.rb → campsh.rb} +38 -39
- data/examples/tepee.rb +242 -0
- data/lib/camping-unabridged.rb +203 -131
- data/lib/camping.rb +49 -48
- data/lib/camping/db.rb +78 -0
- data/lib/camping/fastcgi.rb +198 -0
- data/lib/camping/reloader.rb +169 -0
- data/lib/camping/session.rb +1 -1
- data/lib/camping/webrick.rb +51 -6
- metadata +73 -72
- data/examples/charts/charts.rb +0 -89
- data/examples/charts/pie.rb +0 -70
- data/examples/tepee/tepee.rb +0 -149
data/CHANGELOG
CHANGED
|
@@ -1,8 +1,51 @@
|
|
|
1
|
+
= 1.5
|
|
2
|
+
=== 3rd Oct, 2006
|
|
3
|
+
|
|
4
|
+
* Camping::Apps stores an array of classes for all loaded apps.
|
|
5
|
+
* bin/camping can be given a directory. Like: <tt>camping examples/</tt>
|
|
6
|
+
* Console mode -- thank zimbatm. Use: camping -C yourapp.rb
|
|
7
|
+
* Call controllers with Camping.method_missing.
|
|
8
|
+
|
|
9
|
+
Tepee.get(:Index) #=> (Response)
|
|
10
|
+
Blog.post(:Delete, id) #=> (Response)
|
|
11
|
+
|
|
12
|
+
Blog.post(:Login, :input => {'username' => 'admin', 'password' => 'camping'})
|
|
13
|
+
#=> #<Blog::Controllers::Login @user=... >
|
|
14
|
+
|
|
15
|
+
Blog.get(:Info, :env => {:HTTP_HOST => 'wagon'})
|
|
16
|
+
#=> #<Blog::Controllers::Info @env={'HTTP_HOST'=>'wagon'} ...>
|
|
17
|
+
|
|
18
|
+
* Using \r\n instead of \n on output. FastCGI has these needs.
|
|
19
|
+
* ActiveRecord no longer required or installed.
|
|
20
|
+
* If you refer to Models::Base, however, ActiveRecord will be loaded with autoload. (see lib/camping/db.rb)
|
|
21
|
+
* new Camping::FastCGI.serve which will serve a whole directory of apps
|
|
22
|
+
(see http://code.whytheluckystiff.net/camping/wiki/TheCampingServer)
|
|
23
|
+
* ~/.campingrc can contain database connection info if you want your default to be something other than SQLite.
|
|
24
|
+
|
|
25
|
+
database:
|
|
26
|
+
adapter: mysql
|
|
27
|
+
username: camping
|
|
28
|
+
socket: /tmp/mysql.sock
|
|
29
|
+
password: NOFORESTFIRES
|
|
30
|
+
database: camping
|
|
31
|
+
|
|
32
|
+
* controllers are now *ordered*. uses the inherited hook to keep track of all
|
|
33
|
+
classes created with R. those classes are scanned, in order, when a request is
|
|
34
|
+
made. any other controllers are handled first. so if you plan on overriding the
|
|
35
|
+
urls method, be sure to subclass from R().
|
|
36
|
+
* Console mode will load .irbrc in the working directory, if present.
|
|
37
|
+
(for example, in my ~/git/balloon directory, i have this in the .irbrc:
|
|
38
|
+
include Balloon::Models
|
|
39
|
+
when camping -C balloon.rb gets run, the models all get included in main.)
|
|
40
|
+
* And, of course, many other bugfixes from myself and the loyal+kind zimbatm...
|
|
41
|
+
* Markaby updated to 0.5. (See its CHANGELOG.)
|
|
42
|
+
|
|
1
43
|
= 1.4.2
|
|
2
|
-
===
|
|
44
|
+
=== 18th May, 2006
|
|
3
45
|
|
|
4
46
|
* Efficient file uploads for multipart/form-data POSTs.
|
|
5
47
|
* Camping tool now uses Mongrel, if available. If not, sticks with WEBrick.
|
|
48
|
+
* Multiple apps can be loaded with the camping tool, each mounted according to their file name.
|
|
6
49
|
|
|
7
50
|
= 1.4.1
|
|
8
51
|
=== 3rd May, 2006
|
data/README
CHANGED
|
@@ -47,13 +47,6 @@ A skeletal Camping blog could look like this:
|
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
-
if __FILE__ == $0
|
|
51
|
-
Blog::Models::Base.establish_connection :adapter => 'sqlite3',
|
|
52
|
-
:database => 'blog3.db'
|
|
53
|
-
Blog::Models::Base.logger = Logger.new('camping.log')
|
|
54
|
-
puts Blog.run
|
|
55
|
-
end
|
|
56
|
-
|
|
57
50
|
Some things you might have noticed:
|
|
58
51
|
|
|
59
52
|
* Camping::Models uses ActiveRecord to do its work. We love ActiveRecord!
|
|
@@ -100,9 +93,9 @@ If you run them from the commandline, you'll probably just see a pile of HTML.
|
|
|
100
93
|
Camping comes with an tool for launching apps from the commandline:
|
|
101
94
|
|
|
102
95
|
* Run: <tt>camping blog.rb</tt>
|
|
103
|
-
* Visit http://localhost:3301/ to use the app.
|
|
96
|
+
* Visit http://localhost:3301/blog/ to use the app.
|
|
104
97
|
|
|
105
|
-
==
|
|
98
|
+
== How the Camping Tool Works
|
|
106
99
|
|
|
107
100
|
If your application isn't working with the <tt>camping</tt> tool, keep in mind
|
|
108
101
|
that the tool expects the following conventions to be used:
|
|
@@ -111,7 +104,7 @@ that the tool expects the following conventions to be used:
|
|
|
111
104
|
http://code.whytheluckystiff.net/camping/wiki/BeAlertWhenOnSqlite3 for instructions.)
|
|
112
105
|
2. If your script is called <tt>test.rb</tt>, Camping expects your application to
|
|
113
106
|
be stored in a module called <tt>Test</tt>. Case is not imporant, though. The
|
|
114
|
-
module can be called <tt>TeSt</tt> or any other
|
|
107
|
+
module can be called <tt>TeSt</tt> or any other permutation.
|
|
115
108
|
3. Your script's postamble (anything enclosed in <tt>if __FILE__ == $0</tt>) will be
|
|
116
109
|
ignored by the tool, since the tool will create an SQLite3 database at
|
|
117
110
|
<tt>~/.camping.db</tt>. Or, on Windows, <tt>$USER/Application Data/Camping.db</tt>.
|
|
@@ -120,7 +113,7 @@ that the tool expects the following conventions to be used:
|
|
|
120
113
|
|
|
121
114
|
== The Rules of Thumb
|
|
122
115
|
|
|
123
|
-
Once you've started writing your own Camping app, I'd highly recommend
|
|
116
|
+
Once you've started writing your own Camping app, I'd highly recommend that you become familiar
|
|
124
117
|
with the Camping Rules of Thumb which are listed on the wiki:
|
|
125
118
|
http://code.whytheluckystiff.net/camping/wiki/CampingRulesOfThumb
|
|
126
119
|
|
data/Rakefile
CHANGED
|
@@ -6,10 +6,10 @@ require 'fileutils'
|
|
|
6
6
|
include FileUtils
|
|
7
7
|
|
|
8
8
|
NAME = "camping"
|
|
9
|
-
|
|
9
|
+
REV = File.read(".svn/entries")[/committed-rev="(\d+)"/, 1] rescue nil
|
|
10
|
+
VERS = ENV['VERSION'] || ("1.5" + (REV ? ".#{REV}" : ""))
|
|
10
11
|
CLEAN.include ['**/.*.sw?', '*.gem', '.config']
|
|
11
12
|
RDOC_OPTS = ['--quiet', '--title', "Camping, the Documentation",
|
|
12
|
-
"--template", "extras/flipbook_rdoc.rb",
|
|
13
13
|
"--opname", "index.html",
|
|
14
14
|
"--line-numbers",
|
|
15
15
|
"--main", "README",
|
|
@@ -27,20 +27,20 @@ task :before_doc do
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
Rake::RDocTask.new do |rdoc|
|
|
30
|
-
rdoc.rdoc_dir = 'doc'
|
|
30
|
+
rdoc.rdoc_dir = 'doc/rdoc'
|
|
31
31
|
rdoc.options += RDOC_OPTS
|
|
32
32
|
rdoc.template = "extras/flipbook_rdoc.rb"
|
|
33
33
|
rdoc.main = "README"
|
|
34
34
|
rdoc.title = "Camping, the Documentation"
|
|
35
|
-
rdoc.rdoc_files.add ['README', 'CHANGELOG', 'COPYING', 'lib/camping.rb']
|
|
35
|
+
rdoc.rdoc_files.add ['README', 'CHANGELOG', 'COPYING', 'lib/camping.rb', 'lib/camping/*.rb']
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
task :after_doc do
|
|
39
39
|
mv "lib/camping.rb", "lib/camping-unabridged.rb"
|
|
40
40
|
mv "lib/camping-mural.rb", "lib/camping.rb"
|
|
41
|
-
cp "extras/Camping.gif", "doc/"
|
|
42
|
-
cp "extras/permalink.gif", "doc/"
|
|
43
|
-
sh %{scp -r doc/* #{ENV['USER']}@rubyforge.org:/var/www/gforge-projects/camping/}
|
|
41
|
+
cp "extras/Camping.gif", "doc/rdoc/"
|
|
42
|
+
cp "extras/permalink.gif", "doc/rdoc/"
|
|
43
|
+
sh %{scp -r doc/rdoc/* #{ENV['USER']}@rubyforge.org:/var/www/gforge-projects/camping/}
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
spec =
|
|
@@ -58,13 +58,13 @@ spec =
|
|
|
58
58
|
s.homepage = 'http://code.whytheluckystiff.net/camping/'
|
|
59
59
|
s.executables = ['camping']
|
|
60
60
|
|
|
61
|
-
s.add_dependency('
|
|
62
|
-
s.add_dependency('markaby', '>=0.
|
|
61
|
+
s.add_dependency('activesupport', '>=1.3.1')
|
|
62
|
+
s.add_dependency('markaby', '>=0.5')
|
|
63
63
|
s.add_dependency('metaid')
|
|
64
64
|
s.required_ruby_version = '>= 1.8.2'
|
|
65
65
|
|
|
66
66
|
s.files = %w(COPYING README Rakefile) +
|
|
67
|
-
Dir.glob("{bin,doc
|
|
67
|
+
Dir.glob("{bin,doc,test,lib,extras}/**/*") +
|
|
68
68
|
Dir.glob("ext/**/*.{h,c,rb}") +
|
|
69
69
|
Dir.glob("examples/**/*.rb") +
|
|
70
70
|
Dir.glob("tools/*.rb")
|
data/bin/camping
CHANGED
|
@@ -1,60 +1,58 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
|
-
# this line prevents other db adapters from being loaded (oci8 was
|
|
4
|
-
# causing some pain.)
|
|
5
|
-
unless Object.const_defined? :RAILS_CONNECTION_ADAPTERS
|
|
6
|
-
RAILS_CONNECTION_ADAPTERS = []
|
|
7
|
-
end
|
|
8
|
-
RAILS_CONNECTION_ADAPTERS.replace %w[sqlite]
|
|
9
|
-
|
|
10
3
|
require 'delegate'
|
|
11
4
|
require 'optparse'
|
|
5
|
+
require 'ostruct'
|
|
6
|
+
|
|
12
7
|
require 'stringio'
|
|
13
|
-
require 'rubygems'
|
|
14
8
|
require 'camping'
|
|
9
|
+
require 'camping/reloader'
|
|
10
|
+
require 'yaml'
|
|
15
11
|
|
|
16
|
-
|
|
17
|
-
port = 3301
|
|
12
|
+
conf = OpenStruct.new(:host => '0.0.0.0', :port => 3301)
|
|
18
13
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
14
|
+
# Setup paths
|
|
15
|
+
if home = ENV['HOME'] # POSIX
|
|
16
|
+
conf.db = File.join(home, '.camping.db')
|
|
17
|
+
conf.rc = File.join(home, '.campingrc')
|
|
18
|
+
elsif home = ENV['APPDATA'] # MSWIN
|
|
19
|
+
conf.db = File.join(home, 'Camping.db')
|
|
20
|
+
conf.rc = File.join(home, 'Campingrc')
|
|
25
21
|
end
|
|
26
22
|
|
|
23
|
+
# Load configuration if any
|
|
24
|
+
if conf.rc and File.exists?( conf.rc )
|
|
25
|
+
YAML.load_file(conf.rc).each do |k,v|
|
|
26
|
+
conf.send("#{k}=", v)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
27
29
|
|
|
30
|
+
# Parse options
|
|
28
31
|
opts = OptionParser.new do |opts|
|
|
29
32
|
opts.banner = "Usage: camping app1.rb, app2.rb..."
|
|
30
33
|
opts.define_head "#{File.basename($0)}, the microframework ON-button for ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
|
31
34
|
opts.separator ""
|
|
32
35
|
opts.separator "Specific options:"
|
|
33
36
|
|
|
34
|
-
opts.on("-h", "--host HOSTNAME", "Host for web server to bind to (default is all IPs)")
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
opts.on("-
|
|
39
|
-
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
opts.on("-d", "--database FILE", "Database file (defaults to #{db})") do |d|
|
|
43
|
-
db = d
|
|
44
|
-
end
|
|
37
|
+
opts.on("-h", "--host HOSTNAME", "Host for web server to bind to (default is all IPs)") { |conf.host| }
|
|
38
|
+
opts.on("-p", "--port NUM", "Port for web server (defaults to #{conf.port})") { |conf.port| }
|
|
39
|
+
opts.on("-d", "--database FILE", "Database file (defaults to #{conf.db})") { |conf.db| }
|
|
40
|
+
opts.on("-l", "--log FILE", "Start a database log ('-' for STDOUT)") { |conf.log| }
|
|
41
|
+
opts.on("-C", "--console", "Run in console mode with IRB") { conf.server = :console }
|
|
42
|
+
opts.on("-s", "--server NAME", "Server to force (mongrel, webrick, console)") { |s| conf.server = s.to_sym }
|
|
45
43
|
|
|
46
44
|
opts.separator ""
|
|
47
45
|
opts.separator "Common options:"
|
|
48
46
|
|
|
49
47
|
# No argument, shows at tail. This will print an options summary.
|
|
50
48
|
# Try it and see!
|
|
51
|
-
opts.on_tail("
|
|
49
|
+
opts.on_tail("-?", "--help", "Show this message") do
|
|
52
50
|
puts opts
|
|
53
51
|
exit
|
|
54
52
|
end
|
|
55
53
|
|
|
56
54
|
# Another typical switch to print the version.
|
|
57
|
-
opts.on_tail("--version", "Show version") do
|
|
55
|
+
opts.on_tail("-v", "--version", "Show version") do
|
|
58
56
|
class << Gem; attr_accessor :loaded_specs; end
|
|
59
57
|
puts Gem.loaded_specs['camping'].version
|
|
60
58
|
exit
|
|
@@ -67,63 +65,47 @@ if ARGV.length < 1
|
|
|
67
65
|
exit
|
|
68
66
|
end
|
|
69
67
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
68
|
+
# Default database
|
|
69
|
+
unless conf.database
|
|
70
|
+
unless conf.db
|
|
71
|
+
puts "!! No home directory found. Please specify a database file, see --help."; exit
|
|
72
|
+
end
|
|
73
|
+
conf.database = {:adapter => 'sqlite3', :database => conf.db}
|
|
74
|
+
end
|
|
74
75
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
# Load apps
|
|
77
|
+
PATHS = ARGV.dup
|
|
78
|
+
apps = PATHS.inject([]) do |apps, script|
|
|
79
|
+
if File.directory? script
|
|
80
|
+
apps.push(*Dir[File.join(script, '*.rb')])
|
|
81
|
+
else
|
|
82
|
+
apps << script
|
|
79
83
|
end
|
|
84
|
+
end
|
|
80
85
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
load @script
|
|
86
|
-
rescue Exception => e
|
|
87
|
-
puts "!! trouble loading #{title}: [#{e.class}] #{e.message}"
|
|
88
|
-
@klass = nil
|
|
89
|
-
return
|
|
90
|
-
end
|
|
86
|
+
Camping::Reloader.database = conf.database
|
|
87
|
+
Camping::Reloader.log = conf.log
|
|
88
|
+
apps.map! { |script| Camping::Reloader.new(script) }
|
|
89
|
+
abort("** No apps successfully loaded") unless apps.detect { |app| app.klass }
|
|
91
90
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
@klass.create if @klass.respond_to? :create
|
|
99
|
-
@klass
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Load the script, locate the module
|
|
103
|
-
def reload_app
|
|
104
|
-
newtime = File.mtime( @script )
|
|
105
|
-
return if @klass and @mtime and newtime <= @mtime
|
|
91
|
+
def apps.find_new_scripts
|
|
92
|
+
each { |app| app.reload_app }
|
|
93
|
+
PATHS.each do |path|
|
|
94
|
+
Dir[File.join(path, '*.rb')].each do |script|
|
|
95
|
+
smount = File.basename(script, '.rb')
|
|
96
|
+
next if detect { |x| x.mount == smount }
|
|
106
97
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
end
|
|
98
|
+
puts "** Discovered new #{script}"
|
|
99
|
+
app = Camping::Reloader.new(script)
|
|
100
|
+
next unless app
|
|
111
101
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
if @klass
|
|
115
|
-
@klass.run(*a)
|
|
116
|
-
else
|
|
117
|
-
Camping.run(*a)
|
|
102
|
+
yield app
|
|
103
|
+
self << app
|
|
118
104
|
end
|
|
119
105
|
end
|
|
120
|
-
|
|
121
|
-
def view_source
|
|
122
|
-
File.read(@script)
|
|
123
|
-
end
|
|
106
|
+
self.sort! { |x, y| x.mount <=> y.mount }
|
|
124
107
|
end
|
|
125
108
|
|
|
126
|
-
apps = ARGV.map { |script| CampingReloader.new(script) }
|
|
127
109
|
def apps.index_page
|
|
128
110
|
welcome = "You are Camping"
|
|
129
111
|
apps = self
|
|
@@ -161,15 +143,34 @@ def apps.index_page
|
|
|
161
143
|
b.to_s
|
|
162
144
|
end
|
|
163
145
|
|
|
164
|
-
|
|
146
|
+
# Check that mongrel exists
|
|
147
|
+
unless conf.server
|
|
148
|
+
begin
|
|
149
|
+
require 'mongrel'
|
|
150
|
+
require 'mongrel/camping'
|
|
151
|
+
conf.server = :mongrel
|
|
152
|
+
rescue LoadError
|
|
153
|
+
conf.server = :webrick
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Running the selected server
|
|
158
|
+
case conf.server.to_s
|
|
159
|
+
when 'mongrel'
|
|
165
160
|
require 'mongrel'
|
|
166
161
|
require 'mongrel/camping'
|
|
162
|
+
|
|
167
163
|
class IndexHandler < Mongrel::HttpHandler
|
|
168
|
-
def initialize(apps)
|
|
164
|
+
def initialize(apps, server)
|
|
169
165
|
@apps = apps
|
|
166
|
+
@server = server
|
|
170
167
|
end
|
|
171
168
|
def process(req, res)
|
|
172
169
|
res.start(200) do |head, out|
|
|
170
|
+
@apps.find_new_scripts do |app|
|
|
171
|
+
@server.register "/#{app.mount}", Mongrel::Camping::CampingHandler.new(app)
|
|
172
|
+
@server.register "/code/#{app.mount}", ViewSource.new(app)
|
|
173
|
+
end
|
|
173
174
|
out << @apps.index_page
|
|
174
175
|
end
|
|
175
176
|
end
|
|
@@ -185,37 +186,94 @@ begin
|
|
|
185
186
|
end
|
|
186
187
|
end
|
|
187
188
|
end
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
189
|
+
begin
|
|
190
|
+
config = Mongrel::Configurator.new :host => conf.host do
|
|
191
|
+
listener :port => conf.port do
|
|
192
|
+
if apps.length > 1
|
|
193
|
+
apps.each do |app|
|
|
194
|
+
uri "/#{app.mount}", :handler => Mongrel::Camping::CampingHandler.new(app)
|
|
195
|
+
uri "/code/#{app.mount}", :handler => ViewSource.new(app)
|
|
196
|
+
end
|
|
197
|
+
uri "/", :handler => IndexHandler.new(apps, @listener)
|
|
198
|
+
else
|
|
199
|
+
uri "/", :handler => Mongrel::Camping::CampingHandler.new(apps.first)
|
|
200
|
+
end
|
|
201
|
+
uri "/favicon.ico", :handler => Mongrel::Error404Handler.new("")
|
|
202
|
+
trap("INT") { stop }
|
|
203
|
+
run
|
|
193
204
|
end
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
puts "** Camping running on #{conf.host}:#{conf.port}."
|
|
208
|
+
config.join
|
|
209
|
+
rescue Errno::EADDRINUSE
|
|
210
|
+
puts "** ERROR : address #{conf.host}:#{conf.port} already in use."
|
|
199
211
|
end
|
|
200
|
-
|
|
201
|
-
rescue LoadError
|
|
212
|
+
when 'webrick'
|
|
202
213
|
require 'webrick/httpserver'
|
|
203
214
|
require 'camping/webrick'
|
|
204
215
|
|
|
205
216
|
# Mount the root
|
|
206
|
-
s = WEBrick::HTTPServer.new(:BindAddress => host, :Port => port)
|
|
207
|
-
apps.
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
217
|
+
s = WEBrick::HTTPServer.new(:BindAddress => conf.host, :Port => conf.port)
|
|
218
|
+
if apps.length > 1
|
|
219
|
+
apps.each do |app|
|
|
220
|
+
s.mount "/#{app.mount}", WEBrick::CampingHandler, app
|
|
221
|
+
s.mount_proc("/code/#{app.mount}") do |req, resp|
|
|
222
|
+
resp['Content-Type'] = 'text/plain'
|
|
223
|
+
resp.body = app.view_source
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
s.mount_proc("/") do |req, resp|
|
|
227
|
+
apps.find_new_scripts do |app|
|
|
228
|
+
s.mount "/#{app.mount}", WEBrick::CampingHandler, app
|
|
229
|
+
s.mount_proc("/code/#{app.mount}") do |req, resp|
|
|
230
|
+
resp['Content-Type'] = 'text/plain'
|
|
231
|
+
resp.body = app.view_source
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
resp.body = apps.index_page
|
|
212
235
|
end
|
|
236
|
+
else
|
|
237
|
+
s.mount "/", WEBrick::CampingHandler, apps.first
|
|
213
238
|
end
|
|
214
|
-
s.mount_proc("/") { |req, resp| resp.body = apps.index_page }
|
|
215
239
|
|
|
216
240
|
# Server up
|
|
217
241
|
trap(:INT) do
|
|
218
242
|
s.shutdown
|
|
219
243
|
end
|
|
220
244
|
s.start
|
|
245
|
+
when 'lighttpd'
|
|
246
|
+
require 'rbconfig'
|
|
247
|
+
ruby = File.join(Config::CONFIG['bindir'], Config::CONFIG['RUBY_INSTALL_NAME'])
|
|
248
|
+
dispatcher =<<SCRIPT
|
|
249
|
+
#!#{ruby}
|
|
250
|
+
require 'rubygems'
|
|
251
|
+
require 'camping/fastcgi'
|
|
252
|
+
Camping::Models::Base.establish_connection(Marshal.load(#{Marshal.dump(conf.database).dump}))
|
|
253
|
+
Camping::FastCGI.serve("")
|
|
254
|
+
SCRIPT
|
|
255
|
+
lighttpd_conf =<<CONF
|
|
256
|
+
server.port = #{conf.port}
|
|
257
|
+
server.bind = "#{conf.host}"
|
|
258
|
+
server.modules = ( "mod_fastcgi" )
|
|
259
|
+
server.document-root = "/dont/need/one"
|
|
260
|
+
|
|
261
|
+
#### fastcgi module
|
|
262
|
+
fastcgi.server = ( "/" => (
|
|
263
|
+
"localhost" => (
|
|
264
|
+
"socket" => "/tmp/camping-blog.socket",
|
|
265
|
+
"bin-path" => "#{conf.dispatcher}",
|
|
266
|
+
"check-local" => "disable",
|
|
267
|
+
"max-procs" => 1 ) ) )
|
|
268
|
+
CONF
|
|
269
|
+
|
|
270
|
+
when 'console'
|
|
271
|
+
ARGV.clear # Avoid passing args to IRB
|
|
272
|
+
|
|
273
|
+
require 'irb'
|
|
274
|
+
require 'irb/completion'
|
|
275
|
+
if File.exists? ".irbrc"
|
|
276
|
+
ENV['IRBRC'] = ".irbrc"
|
|
277
|
+
end
|
|
278
|
+
IRB.start
|
|
221
279
|
end
|