merb 0.0.8 → 0.0.9
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/README +64 -80
- data/Rakefile +25 -12
- data/bin/merb +2 -223
- data/examples/README_EXAMPLES +10 -0
- data/examples/skeleton.tar +0 -0
- data/lib/merb.rb +48 -21
- data/lib/merb/core_ext.rb +12 -2
- data/lib/merb/core_ext/merb_class.rb +21 -21
- data/lib/merb/core_ext/merb_kernel.rb +60 -0
- data/lib/merb/core_ext/merb_object.rb +14 -0
- data/lib/merb/core_ext/merb_string.rb +3 -13
- data/lib/merb/generators/merb_app/merb_app.rb +33 -0
- data/lib/merb/merb_constants.rb +7 -0
- data/lib/merb/merb_controller.rb +31 -23
- data/lib/merb/merb_drb_server.rb +6 -60
- data/lib/merb/merb_exceptions.rb +162 -2
- data/lib/merb/merb_handler.rb +8 -19
- data/lib/merb/merb_mailer.rb +60 -0
- data/lib/merb/merb_router.rb +1 -1
- data/lib/merb/merb_server.rb +240 -0
- data/lib/merb/merb_upload_handler.rb +1 -1
- data/lib/merb/merb_view_context.rb +11 -6
- data/lib/merb/mixins/basic_authentication_mixin.rb +11 -13
- data/lib/merb/mixins/controller_mixin.rb +12 -6
- data/lib/merb/mixins/form_control_mixin.rb +94 -0
- data/lib/merb/mixins/render_mixin.rb +50 -24
- data/lib/merb/mixins/view_context_mixin.rb +122 -0
- data/lib/merb/session/merb_ar_session.rb +13 -14
- data/lib/merb/session/merb_memory_session.rb +105 -0
- metadata +13 -132
- data/examples/app_skeleton/Rakefile +0 -82
- data/examples/app_skeleton/dist/app/helpers/global_helper.rb +0 -6
- data/examples/app_skeleton/dist/conf/merb.yml +0 -11
- data/examples/app_skeleton/dist/conf/merb_init.rb +0 -16
- data/examples/app_skeleton/dist/conf/mup.conf +0 -5
- data/examples/app_skeleton/dist/conf/router.rb +0 -19
- data/examples/app_skeleton/scripts/merb_stop +0 -13
- data/examples/app_skeleton/scripts/new_migration +0 -21
- data/examples/app_skeleton/test/test_helper.rb +0 -1
- data/examples/sample_app/Rakefile +0 -82
- data/examples/sample_app/dist/app/controllers/files.rb +0 -31
- data/examples/sample_app/dist/app/controllers/posts.rb +0 -71
- data/examples/sample_app/dist/app/controllers/test.rb +0 -40
- data/examples/sample_app/dist/app/helpers/global_helper.rb +0 -7
- data/examples/sample_app/dist/app/helpers/posts_helper.rb +0 -4
- data/examples/sample_app/dist/app/models/comment.rb +0 -3
- data/examples/sample_app/dist/app/models/post.rb +0 -4
- data/examples/sample_app/dist/app/views/files/progress.jerb +0 -3
- data/examples/sample_app/dist/app/views/files/start.herb +0 -62
- data/examples/sample_app/dist/app/views/files/upload.herb +0 -6
- data/examples/sample_app/dist/app/views/layout/application.herb +0 -61
- data/examples/sample_app/dist/app/views/layout/foo.herb +0 -6
- data/examples/sample_app/dist/app/views/posts/_comments.herb +0 -11
- data/examples/sample_app/dist/app/views/posts/comment.jerb +0 -1
- data/examples/sample_app/dist/app/views/posts/list.herb +0 -5
- data/examples/sample_app/dist/app/views/posts/new.herb +0 -37
- data/examples/sample_app/dist/app/views/posts/show.herb +0 -37
- data/examples/sample_app/dist/app/views/posts/xml_test.xerb +0 -3
- data/examples/sample_app/dist/app/views/shared/_test.herb +0 -1
- data/examples/sample_app/dist/app/views/test/foo.herb +0 -2
- data/examples/sample_app/dist/app/views/test/hello.herb +0 -5
- data/examples/sample_app/dist/app/views/test/json.jerb +0 -1
- data/examples/sample_app/dist/conf/merb.yml +0 -11
- data/examples/sample_app/dist/conf/merb_init.rb +0 -24
- data/examples/sample_app/dist/conf/mup.conf +0 -5
- data/examples/sample_app/dist/conf/router.rb +0 -19
- data/examples/sample_app/dist/public/images/bg.jpg +0 -0
- data/examples/sample_app/dist/public/images/book.gif +0 -0
- data/examples/sample_app/dist/public/images/booksmall.gif +0 -0
- data/examples/sample_app/dist/public/images/greenright.jpg +0 -0
- data/examples/sample_app/dist/public/images/louiecon.gif +0 -0
- data/examples/sample_app/dist/public/images/menu.gif +0 -0
- data/examples/sample_app/dist/public/images/menuleft.gif +0 -0
- data/examples/sample_app/dist/public/images/menuright.gif +0 -0
- data/examples/sample_app/dist/public/images/mountain.jpg +0 -0
- data/examples/sample_app/dist/public/images/n3.jpg +0 -0
- data/examples/sample_app/dist/public/images/nautica.jpg +0 -0
- data/examples/sample_app/dist/public/javascripts/application.js +0 -0
- data/examples/sample_app/dist/public/javascripts/effects.js +0 -975
- data/examples/sample_app/dist/public/javascripts/mup.js +0 -113
- data/examples/sample_app/dist/public/javascripts/prototype.js +0 -2264
- data/examples/sample_app/dist/public/stylesheets/merb.css +0 -277
- data/examples/sample_app/dist/public/test.html +0 -5
- data/examples/sample_app/dist/schema/migrations/001_add_comments_to_posts.rb +0 -22
- data/examples/sample_app/dist/schema/migrations/002_add_sessions_table.rb +0 -14
- data/examples/sample_app/dist/schema/schema.rb +0 -28
- data/examples/sample_app/foo.txt +0 -0
- data/examples/sample_app/log/merb.4000.pid +0 -1
- data/examples/sample_app/script/merb_stop +0 -13
- data/examples/sample_app/script/new_migration +0 -21
- data/examples/sample_app/test/test_helper.rb +0 -1
- data/lib/merb/mixins/javascript_mixin.rb +0 -147
- data/lib/merb/session/merb_drb_session.rb +0 -65
- data/test/test_helper.rb +0 -1
- data/test/unit/route_matcher_test.rb +0 -46
data/README
CHANGED
|
@@ -12,59 +12,18 @@ mongrel
|
|
|
12
12
|
erubis
|
|
13
13
|
json or fjson
|
|
14
14
|
mime-types
|
|
15
|
+
archive-tar-minitar
|
|
16
|
+
rspec
|
|
15
17
|
|
|
16
18
|
Install these gems first then you can build the merb gem from svn trunk like so:
|
|
17
|
-
$ sudo gem install mongrel erubis json mime-types --include-dependencies
|
|
18
|
-
$ svn co http://svn.devjavu.com/merb
|
|
19
|
+
$ sudo gem install mongrel erubis json mime-types archive-tar-minitar rspec --include-dependencies
|
|
20
|
+
$ svn co http://svn.devjavu.com/merb/trunk merb
|
|
19
21
|
$ cd merb
|
|
20
|
-
$
|
|
22
|
+
$ rake install
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
html -> .herb
|
|
25
|
-
js -> .jerb
|
|
26
|
-
xml -> .xerb
|
|
24
|
+
To generate a new merb app after the gem is installed:
|
|
25
|
+
$ merb -g myapp
|
|
27
26
|
|
|
28
|
-
You can change the extensions to anything you want in your config file in
|
|
29
|
-
yourapp/dist/conf/merb.yml. See the default settings in the sample app.
|
|
30
|
-
|
|
31
|
-
First you need to install the dependencies. Merb requires the follwing gems
|
|
32
|
-
|
|
33
|
-
erubis
|
|
34
|
-
|
|
35
|
-
json
|
|
36
|
-
|
|
37
|
-
fjson # will be used if present. requires C extension.
|
|
38
|
-
|
|
39
|
-
# fastthread will be used if present and is reccommended.
|
|
40
|
-
sudo gem install fastthread --source=http://mongrel.rubyforge.org/
|
|
41
|
-
|
|
42
|
-
If you have checked out merb trunk from svn you will want to build and install
|
|
43
|
-
the gem to use merb. Run this command from the root of the merb svn checkout
|
|
44
|
-
to do that:
|
|
45
|
-
|
|
46
|
-
$ sudo rake install
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
If you installed merb from gems then unpack the gem and grab the sample app
|
|
50
|
-
$ gem unpack merb
|
|
51
|
-
|
|
52
|
-
now with either the svn or the unpacked gem you can try out the sample app.
|
|
53
|
-
|
|
54
|
-
$ cd merb*
|
|
55
|
-
$ cd examples/sample_app
|
|
56
|
-
|
|
57
|
-
$ merb
|
|
58
|
-
|
|
59
|
-
You will need the mongrel_upload_progress gem installed to go to /files
|
|
60
|
-
so use the -f flag to load a config file for mongrel_upload_progress
|
|
61
|
-
$ merb -f dist/conf/mup.conf
|
|
62
|
-
|
|
63
|
-
then the sample app will be running on port 4000 in the foreground.
|
|
64
|
-
you can go to a few urls:
|
|
65
|
-
http://localhost:4000/files/start
|
|
66
|
-
|
|
67
|
-
http://localhost:4000/foo/123/baz/12234345
|
|
68
27
|
|
|
69
28
|
**FEATURES**
|
|
70
29
|
|
|
@@ -111,7 +70,7 @@ classes with built in render method and template handling
|
|
|
111
70
|
with instance vars available in the views automatically. Merb also supports
|
|
112
71
|
layouts. It will look for a layout named after your controller class first and
|
|
113
72
|
then fall back to application.herb if no layout exists named after your controller.
|
|
114
|
-
You can use render_no_layout or do layout :none
|
|
73
|
+
You can use render_no_layout or do render :layout => :none
|
|
115
74
|
|
|
116
75
|
|
|
117
76
|
class Test < Merb::Controller
|
|
@@ -122,28 +81,24 @@ class Test < Merb::Controller
|
|
|
122
81
|
end
|
|
123
82
|
end
|
|
124
83
|
|
|
125
|
-
<html>
|
|
126
|
-
<head>
|
|
127
|
-
<title>Hello, <%= @name %></title>
|
|
128
|
-
</head>
|
|
129
|
-
<body>
|
|
130
|
-
<%= @layout_content %>
|
|
131
|
-
</body>
|
|
132
|
-
</html>
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
<h1><%= params.inspect %></h1>
|
|
136
|
-
<h1><%= cookies.inspect %></h1>
|
|
137
|
-
<% 5.times do %>
|
|
138
|
-
<h1>Hello, <%= @name %>!</h1>
|
|
139
|
-
<% end %>
|
|
140
|
-
|
|
141
84
|
You can also render partials like so:
|
|
142
85
|
<%= partial(:comments) %>
|
|
143
|
-
|
|
144
86
|
This assumes a _comments.rhtml file in the same view dir as the current
|
|
145
87
|
controller/view
|
|
146
88
|
|
|
89
|
+
Partials compile the template ands returns a string. So you can also call
|
|
90
|
+
them and assign them to a var if you want:
|
|
91
|
+
|
|
92
|
+
def someaction
|
|
93
|
+
@one = partial(:one)
|
|
94
|
+
@two = partial(:two)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
partials can also render views from other controllers by specifying the path
|
|
98
|
+
|
|
99
|
+
partial('/shared/foo')
|
|
100
|
+
|
|
101
|
+
|
|
147
102
|
Merb also allows for returning javascript instead of html for ajax actions
|
|
148
103
|
You have to use the render_js instead of normal render
|
|
149
104
|
|
|
@@ -166,30 +121,65 @@ $('comments').update('<%=js partial(:posts) %>');
|
|
|
166
121
|
</ul>
|
|
167
122
|
|
|
168
123
|
|
|
169
|
-
*Controllers
|
|
124
|
+
*Controllers have powerful before and after filters*
|
|
170
125
|
|
|
171
126
|
Use the before method in your controllers. before accepts either a symbol
|
|
172
127
|
or a Proc/lambda object. If you give it a symbol it will call a method with
|
|
173
128
|
the same name as the symbol. If you give it a proc that takes one argument
|
|
174
|
-
it will call the proc with the current controller as that argument.
|
|
129
|
+
it will call the proc with the current controller as that argument. You can
|
|
130
|
+
use :only and :exclude as options to your filters to exclude or include actionsfrom certain filters. :only and :exclude take :symbols or [:sym, :sam]
|
|
131
|
+
array of symbols.
|
|
175
132
|
|
|
176
133
|
class Foo < Merb::Controller
|
|
177
134
|
|
|
178
|
-
before :setup_user
|
|
179
|
-
before lambda {|c| c.headers['X-Foo] = 'bar' }
|
|
135
|
+
before :setup_user, :only => :foo
|
|
136
|
+
before lambda {|c| c.headers['X-Foo] = 'bar' }, :exclude => [:foo, :baz]
|
|
180
137
|
|
|
181
138
|
def setup_user
|
|
182
139
|
# blah blah
|
|
183
140
|
end
|
|
184
141
|
|
|
142
|
+
def foo
|
|
143
|
+
# blah
|
|
144
|
+
end
|
|
145
|
+
|
|
185
146
|
def regular_action
|
|
186
147
|
# blah
|
|
187
148
|
end
|
|
188
149
|
|
|
189
150
|
end
|
|
190
151
|
|
|
191
|
-
|
|
192
|
-
|
|
152
|
+
To stop the before filter chain you use throw :halt with a few options:
|
|
153
|
+
|
|
154
|
+
# halts the filter chain and calls filters_halted which you can override
|
|
155
|
+
# in your controller to specialize it.
|
|
156
|
+
|
|
157
|
+
throw :halt
|
|
158
|
+
|
|
159
|
+
# halts the filters and calls the method named after the symbol:
|
|
160
|
+
|
|
161
|
+
throw :halt, :other_action
|
|
162
|
+
|
|
163
|
+
# halts the filter chain and returns the result of the Proc being called
|
|
164
|
+
|
|
165
|
+
throw :halt, Proc.new{ |c| c.redirect "/foo" }
|
|
166
|
+
|
|
167
|
+
# halts the chain and returns whatever is in the string
|
|
168
|
+
|
|
169
|
+
throw :halt, "<h1>You don't have permissions IDIOT!</h1>"
|
|
170
|
+
|
|
171
|
+
or even render templates:
|
|
172
|
+
|
|
173
|
+
throw :halt, render 'foo'
|
|
174
|
+
throw :halt, partial 'foo'
|
|
175
|
+
|
|
176
|
+
After filters only accept a Proc and call that proc with the controller:
|
|
177
|
+
|
|
178
|
+
after Proc.new {|c| Tidy.new(c.body) }, :only => :index
|
|
179
|
+
|
|
180
|
+
Sessions are available when you start merb with the sql_session set to true or the memory_session set to true. See generated app for migration too add session table.
|
|
181
|
+
|
|
182
|
+
Helpers: dist/app/helpers/global_helper.rb will be available to all of your views. Helpers named afdter your controller plus _helper.rb will be included in the views for that controller only.
|
|
193
183
|
|
|
194
184
|
|
|
195
185
|
*The merb server*
|
|
@@ -215,11 +205,7 @@ $merb -i
|
|
|
215
205
|
|
|
216
206
|
*File uploads*
|
|
217
207
|
This is one of the things that Merb was written for. Rails doesn't allow
|
|
218
|
-
multiple concurrent file uploads at once without blocking an entire rails backend
|
|
219
|
-
for each file upload. Merb allows multiple file uploads at once. Start the server
|
|
220
|
-
and browse to http://localhost:4000/files/start and you will get a file upload
|
|
221
|
-
form. This uses the mongrel_upload_progress gem so that must be installed first.
|
|
222
|
-
There is a very simple upload controller example that handles this upload with a
|
|
208
|
+
multiple concurrent file uploads at once without blocking an entire rails backend for each file upload. Merb allows multiple file uploads at once.
|
|
223
209
|
progress bar. When a file is uploaded with Merb, it gets put in a Tempfile. So
|
|
224
210
|
you just want to copy it to the right place on the filesystem.
|
|
225
211
|
|
|
@@ -242,13 +228,11 @@ and DIST_ROOT. MERB_ROOT is the root of the whole tree. And DISTROOT is MERB_ROO
|
|
|
242
228
|
You will cd into MERB_ROOT to run the merb command line. ANd when you deploy live you
|
|
243
229
|
will put the dist dir into another empty MERB_ROOT on the production server.
|
|
244
230
|
|
|
245
|
-
|
|
231
|
+
merb_app:
|
|
246
232
|
Rakefile
|
|
247
233
|
README
|
|
248
234
|
scripts
|
|
249
235
|
test
|
|
250
|
-
test_helper.rb
|
|
251
|
-
fixtures
|
|
252
236
|
spec
|
|
253
237
|
unit
|
|
254
238
|
plugins
|
data/Rakefile
CHANGED
|
@@ -6,11 +6,16 @@ require 'rake/testtask'
|
|
|
6
6
|
require 'spec/rake/spectask'
|
|
7
7
|
require 'code_statistics'
|
|
8
8
|
require 'fileutils'
|
|
9
|
-
|
|
9
|
+
def __DIR__
|
|
10
|
+
File.dirname(__FILE__)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
require __DIR__+'/tools/rakehelp'
|
|
10
14
|
include FileUtils
|
|
11
15
|
|
|
16
|
+
|
|
12
17
|
NAME = "merb"
|
|
13
|
-
VERS = "0.0.
|
|
18
|
+
VERS = "0.0.9"
|
|
14
19
|
CLEAN.include ['**/.*.sw?', '*.gem', '.config']
|
|
15
20
|
RDOC_OPTS = ['--quiet', '--title', "Merb Documentation",
|
|
16
21
|
"--opname", "index.html",
|
|
@@ -19,19 +24,15 @@ RDOC_OPTS = ['--quiet', '--title', "Merb Documentation",
|
|
|
19
24
|
"--inline-source"]
|
|
20
25
|
|
|
21
26
|
setup_clean [ "pkg", "lib/*.bundle", "*.gem",
|
|
22
|
-
"doc", ".config", "examples/sample_app/dist/public/files/**/*"]
|
|
27
|
+
"doc", ".config", "examples/sample_app/dist/public/files/**/*", 'examples/sample_app/log/*']
|
|
23
28
|
|
|
24
29
|
|
|
25
30
|
desc "Packages up Merb."
|
|
26
31
|
task :default => [:package]
|
|
27
|
-
task :
|
|
32
|
+
task :merb => [:clean, :rdoc, :package]
|
|
28
33
|
|
|
29
34
|
task :doc => [:rdoc]
|
|
30
35
|
|
|
31
|
-
task :really_clean do
|
|
32
|
-
rm_rf 'examples/sample_app/log/*'
|
|
33
|
-
end
|
|
34
|
-
|
|
35
36
|
|
|
36
37
|
Rake::RDocTask.new do |rdoc|
|
|
37
38
|
rdoc.rdoc_dir = 'doc/rdoc'
|
|
@@ -59,22 +60,20 @@ spec = Gem::Specification.new do |s|
|
|
|
59
60
|
s.add_dependency('mongrel')
|
|
60
61
|
s.add_dependency('erubis')
|
|
61
62
|
s.add_dependency('json')
|
|
62
|
-
s.add_dependency('mime-types')
|
|
63
63
|
s.required_ruby_version = '>= 1.8.4'
|
|
64
64
|
|
|
65
|
-
s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{
|
|
65
|
+
s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{bin,test,lib,examples}/**/*")
|
|
66
66
|
|
|
67
67
|
s.require_path = "lib"
|
|
68
68
|
s.bindir = "bin"
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
Rake::GemPackageTask.new(spec) do |p|
|
|
72
|
-
p.need_tar = true
|
|
72
|
+
#p.need_tar = true
|
|
73
73
|
p.gem_spec = spec
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
task :install do
|
|
77
|
-
sh %{rake clean}
|
|
78
77
|
sh %{rake package}
|
|
79
78
|
sh %{sudo gem install pkg/#{NAME}-#{VERS}}
|
|
80
79
|
end
|
|
@@ -90,6 +89,20 @@ task :doc_rforge do
|
|
|
90
89
|
sh %{scp -r -p doc/rdoc/* ezmobius@rubyforge.org:/var/www/gforge-projects/merb}
|
|
91
90
|
end
|
|
92
91
|
|
|
92
|
+
|
|
93
|
+
desc "Pack skeleton app as a tar.gz file"
|
|
94
|
+
task :skeleton do
|
|
95
|
+
require 'archive/tar/minitar'
|
|
96
|
+
include Archive::Tar
|
|
97
|
+
Find.find(File.join(__DIR__,'examples/skeleton')) do |f|
|
|
98
|
+
FileUtils.rm_rf(f) if /\.svn$/ =~ f
|
|
99
|
+
end
|
|
100
|
+
File.open(File.join(__DIR__,'examples/skeleton.tar'), 'wb') do |tar|
|
|
101
|
+
Dir.chdir 'examples/skeleton'
|
|
102
|
+
Minitar.pack('.', tar, true)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
93
106
|
desc 'Run unit tests'
|
|
94
107
|
Rake::TestTask.new('test_unit') do |t|
|
|
95
108
|
t.libs << 'test'
|
data/bin/merb
CHANGED
|
@@ -1,227 +1,6 @@
|
|
|
1
1
|
#!/usr/local/bin/ruby
|
|
2
|
-
require 'rubygems'
|
|
3
|
-
|
|
4
|
-
begin
|
|
5
|
-
require 'fastthread'
|
|
6
|
-
require 'thread'
|
|
7
|
-
puts 'Using FastThread'
|
|
8
|
-
rescue LoadError
|
|
9
|
-
puts "not using FastThread"
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
begin
|
|
13
|
-
require 'fjson'
|
|
14
|
-
puts "using fjson"
|
|
15
|
-
rescue LoadError
|
|
16
|
-
require 'json'
|
|
17
|
-
end
|
|
18
|
-
require 'optparse'
|
|
19
|
-
require 'ostruct'
|
|
20
|
-
require 'fileutils'
|
|
21
|
-
require 'yaml'
|
|
22
|
-
require 'erubis'
|
|
23
|
-
|
|
24
|
-
module Erubis
|
|
25
|
-
class MEruby < Erubis::Eruby
|
|
26
|
-
include PercentLineEnhancer
|
|
27
|
-
include StringBufferEnhancer
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
module Merb; end
|
|
32
|
-
|
|
33
|
-
class Merb::Config
|
|
34
|
-
def self.setup
|
|
35
|
-
defaults = {
|
|
36
|
-
:host => "0.0.0.0",
|
|
37
|
-
:port => "4000",
|
|
38
|
-
:allow_reloading => true,
|
|
39
|
-
:merb_root => Dir.pwd,
|
|
40
|
-
:template_ext => {:html => :herb, :js => :jerb, :xml => :xerb}
|
|
41
|
-
}
|
|
42
|
-
begin
|
|
43
|
-
options = defaults.merge(YAML.load(Erubis::MEruby.new(IO.read("#{defaults[:merb_root]}/dist/conf/merb.yml")).result))
|
|
44
|
-
rescue
|
|
45
|
-
options = defaults
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
options
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
class Merb::Server
|
|
53
|
-
|
|
54
|
-
def self.merb_config
|
|
55
|
-
options = Merb::Config.setup
|
|
56
|
-
|
|
57
|
-
opts = OptionParser.new do |opts|
|
|
58
|
-
opts.banner = "Usage: merb [fdcphmisl] [argument]"
|
|
59
|
-
opts.define_head "Merb Mongrel+ Erb. Lightweight replacement for ActionPack"
|
|
60
|
-
opts.separator '*'*80
|
|
61
|
-
opts.separator 'If no flags are given, Merb starts in the foreground on port 4000'
|
|
62
|
-
opts.separator '*'*80
|
|
63
|
-
|
|
64
|
-
opts.on("-f", "--config-file FILENAME", "This flag is for adding extra config files for things like the upload progress module") do |config|
|
|
65
|
-
options[:config] = config
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
opts.on("-d", "--daemonize", "This will run a single merb in the background") do |config|
|
|
69
|
-
options[:daemonize] = true
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
opts.on("-c", "--cluster-nodes NUM_MERBS", "Number of merb daemons to run") do |nodes|
|
|
73
|
-
options[:cluster] = nodes
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
opts.on("-p", "--port PORTNUM", "Port to run merb on, defaults to 4000") do |port|
|
|
77
|
-
options[:port] = port
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
opts.on("-h", "--host HOSTNAME", "Host to bind to(default is all IP's)") do |host|
|
|
81
|
-
options[:host] = host
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
opts.on("-m", "--merb-root MERB_ROOT", "the path to the MERB_ROOT for the app you want to run") do |merb_root|
|
|
85
|
-
options[:merb_root] = File.expand_path(merb_root)
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
opts.on("-i", "--irb-console", "This flag will start merb in irb console mode. All your models and other classes will be available for you in an irb session.") do |console|
|
|
89
|
-
options[:console] = true
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
opts.on("-s", "--session-drb-port PORTNUM", "This is the port number to run the drb daemon on for sessions and uplod progress monitoring.") do |drb_port|
|
|
93
|
-
options[:session] = drb_port
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
opts.on("-l", "--log-level LEVEL", "Log levels can be set to any of these options: DEBUG < INFO < WARN < ERROR < FATAL < UNKNOWN") do |loglevel|
|
|
97
|
-
options[:log_level] = loglevel
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
opts.on("-?", "--help", "Show this help message") do
|
|
101
|
-
puts opts
|
|
102
|
-
exit
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
opts.parse!(@@merb_raw_opts)
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
@@merb_opts = options
|
|
111
|
-
puts %{Merb started with these options:}
|
|
112
|
-
puts @@merb_opts.to_yaml; puts
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def self.initialize_merb
|
|
116
|
-
require 'merb'
|
|
117
|
-
require @@merb_opts[:merb_root]+'/dist/conf/router.rb'
|
|
118
|
-
require @@merb_opts[:merb_root]+'/dist/conf/merb_init.rb'
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
def self.run
|
|
122
|
-
@@merb_raw_opts = ARGV
|
|
123
|
-
merb_config
|
|
124
|
-
|
|
125
|
-
@@merb_opts[:dist_root] = @@merb_opts[:merb_root]+'/dist'
|
|
126
|
-
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/app/controllers') )
|
|
127
|
-
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/app/models') )
|
|
128
|
-
$LOAD_PATH.unshift( File.join(@@merb_opts[:dist_root] , '/lib') )
|
|
129
|
-
|
|
130
|
-
if @@merb_opts[:console]
|
|
131
|
-
initialize_merb
|
|
132
|
-
ARGV.clear # Avoid passing args to IRB
|
|
133
|
-
require 'irb'
|
|
134
|
-
require 'irb/completion'
|
|
135
|
-
def exit
|
|
136
|
-
exit!
|
|
137
|
-
end
|
|
138
|
-
if File.exists? ".irbrc"
|
|
139
|
-
ENV['IRBRC'] = ".irbrc"
|
|
140
|
-
end
|
|
141
|
-
IRB.start
|
|
142
|
-
exit!
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
if @@merb_opts[:session]
|
|
146
|
-
start(@@merb_opts[:session], :drbserver_start)
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
if @@merb_opts[:cluster]
|
|
150
|
-
delete_pidfiles
|
|
151
|
-
@@merb_opts[:port].to_i.upto(@@merb_opts[:port].to_i+@@merb_opts[:cluster].to_i-1) do |port|
|
|
152
|
-
puts "Starting merb server on port: #{port}"
|
|
153
|
-
start(port)
|
|
154
|
-
end
|
|
155
|
-
elsif @@merb_opts[:daemonize]
|
|
156
|
-
delete_pidfiles(@@merb_opts[:port])
|
|
157
|
-
start(@@merb_opts[:port])
|
|
158
|
-
else
|
|
159
|
-
initialize_merb
|
|
160
|
-
trap('TERM') { exit }
|
|
161
|
-
mongrel_start(@@merb_opts[:port])
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
def self.store_pid(pid,port)
|
|
167
|
-
File.open("#{@@merb_opts[:merb_root]}/log/merb.#{port}.pid", 'w'){|f| f.write("#{Process.pid}\n")}
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
def self.start(port,what=:mongrel_start)
|
|
171
|
-
fork do
|
|
172
|
-
Process.setsid
|
|
173
|
-
exit if fork
|
|
174
|
-
if what == :mongrel_start
|
|
175
|
-
store_pid(Process.pid, port)
|
|
176
|
-
else
|
|
177
|
-
store_pid(Process.pid, "drb.#{port}")
|
|
178
|
-
end
|
|
179
|
-
Dir.chdir @@merb_opts[:merb_root]
|
|
180
|
-
File.umask 0000
|
|
181
|
-
STDIN.reopen "/dev/null"
|
|
182
|
-
STDOUT.reopen "/dev/null", "a"
|
|
183
|
-
STDERR.reopen STDOUT
|
|
184
|
-
trap("TERM") { exit }
|
|
185
|
-
send(what, port)
|
|
186
|
-
end
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
def self.delete_pidfiles(portor_star='*')
|
|
190
|
-
Dir["#{@@merb_opts[:merb_root]}/log/merb.#{portor_star}.pid"].each do |pid|
|
|
191
|
-
FileUtils.rm(pid) rescue nil
|
|
192
|
-
end
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
def self.drbserver_start(port)
|
|
196
|
-
puts "Starting merb drb server on port: #{port}"
|
|
197
|
-
require 'merb/session/merb_drb_server'
|
|
198
|
-
DRb.start_service("druby://#{@@merb_opts[:host]}:#{port}", Merb::DRbSession.setup)
|
|
199
|
-
DRb.thread.join
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
def self.mongrel_start(port)
|
|
203
|
-
@@merb_opts[:port] = port
|
|
204
|
-
initialize_merb
|
|
205
|
-
|
|
206
|
-
config = Mongrel::Configurator.new :host => (@@merb_opts[:host]||"0.0.0.0"), :port => (port ||4000) do
|
|
207
|
-
config = YAML.load(Erubis::Eruby.new(IO.read(File.expand_path(@@merb_opts[:config]))).result) if @@merb_opts[:config]
|
|
208
|
-
listener do
|
|
209
|
-
uri( "/", :handler => MerbUploadHandler.new(config), :in_front => true) if @@merb_opts[:config]
|
|
210
|
-
uri "/", :handler => MerbHandler.new(@@merb_opts[:dist_root]+'/public')
|
|
211
|
-
uri "/favicon.ico", :handler => Mongrel::Error404Handler.new("")
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
trap("INT") { stop }
|
|
215
|
-
run
|
|
216
|
-
end
|
|
217
|
-
config.join
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
def self.config
|
|
221
|
-
@@merb_opts
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
end
|
|
225
2
|
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
require 'merb/merb_server'
|
|
226
5
|
|
|
227
6
|
Merb::Server.run
|