ramaze 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +4 -12
- data/bin/ramaze +95 -171
- data/doc/CHANGELOG +387 -4
- data/doc/README +81 -13
- data/doc/meta/announcement.txt +51 -8
- data/doc/meta/configuration.txt +17 -34
- data/doc/meta/internals.txt +34 -4
- data/doc/migrate/1110_to_1111.txt +131 -0
- data/doc/readme_chunks/features.txt +81 -12
- data/doc/readme_chunks/installing.txt +0 -1
- data/doc/tutorial/todolist.html +293 -65
- data/doc/tutorial/{todolist.txt → todolist.mkd} +251 -51
- data/examples/blog/main.rb +1 -1
- data/examples/blog/src/model.rb +0 -1
- data/examples/hello.rb +2 -5
- data/examples/templates/template/external.haml +5 -5
- data/examples/templates/template/external.liquid +1 -1
- data/examples/templates/template/external.mab +8 -8
- data/examples/templates/template/external.rem +30 -0
- data/examples/templates/template/external.rhtml +6 -7
- data/examples/templates/template/external.zmr +13 -9
- data/examples/templates/template_amrita2.rb +8 -8
- data/examples/templates/template_erubis.rb +11 -11
- data/examples/templates/template_ezamar.rb +9 -11
- data/examples/templates/template_haml.rb +13 -13
- data/examples/templates/template_liquid.rb +10 -10
- data/examples/templates/template_markaby.rb +13 -10
- data/examples/templates/template_remarkably.rb +59 -0
- data/examples/todolist/main.rb +1 -7
- data/examples/todolist/src/controller/main.rb +26 -13
- data/examples/todolist/src/element/page.rb +5 -0
- data/examples/whywiki/main.rb +1 -1
- data/lib/proto/main.rb +0 -8
- data/lib/proto/public/css/ramaze_error.css +12 -4
- data/lib/proto/public/error.zmr +6 -25
- data/lib/ramaze.rb +35 -245
- data/lib/ramaze/action.rb +21 -0
- data/lib/ramaze/adapter.rb +94 -29
- data/lib/ramaze/adapter/base.rb +57 -0
- data/lib/ramaze/adapter/mongrel.rb +12 -19
- data/lib/ramaze/adapter/webrick.rb +21 -20
- data/lib/ramaze/cache.rb +47 -3
- data/lib/ramaze/cache/memcached.rb +22 -0
- data/lib/ramaze/cache/yaml_store.rb +19 -0
- data/lib/ramaze/controller.rb +47 -271
- data/lib/ramaze/controller/error.rb +43 -0
- data/lib/ramaze/controller/render.rb +90 -0
- data/lib/ramaze/controller/resolve.rb +147 -0
- data/lib/ramaze/dispatcher.rb +41 -9
- data/lib/ramaze/dispatcher/file.rb +1 -1
- data/lib/ramaze/global.rb +73 -158
- data/lib/ramaze/global/dsl.rb +29 -0
- data/lib/ramaze/global/globalstruct.rb +90 -0
- data/lib/ramaze/helper.rb +1 -1
- data/lib/ramaze/helper/aspect.rb +39 -179
- data/lib/ramaze/helper/cache.rb +8 -9
- data/lib/ramaze/helper/cgi.rb +23 -0
- data/lib/ramaze/helper/file.rb +3 -0
- data/lib/ramaze/helper/inform.rb +3 -0
- data/lib/ramaze/helper/link.rb +56 -63
- data/lib/ramaze/helper/nitroform.rb +4 -0
- data/lib/ramaze/helper/redirect.rb +1 -1
- data/lib/ramaze/inform.rb +6 -2
- data/lib/ramaze/inform/analogger.rb +5 -1
- data/lib/ramaze/inform/hub.rb +1 -1
- data/lib/ramaze/inform/informing.rb +7 -0
- data/lib/ramaze/snippets/kernel/aquire.rb +2 -0
- data/lib/ramaze/snippets/kernel/constant.rb +2 -0
- data/lib/ramaze/snippets/kernel/pretty_inspect.rb +2 -0
- data/lib/ramaze/snippets/object/traits.rb +4 -0
- data/lib/ramaze/snippets/openstruct/temp.rb +3 -0
- data/lib/ramaze/snippets/string/DIVIDE.rb +2 -0
- data/lib/ramaze/snippets/string/camel_case.rb +2 -0
- data/lib/ramaze/snippets/string/color.rb +2 -0
- data/lib/ramaze/snippets/string/each.rb +2 -0
- data/lib/ramaze/snippets/string/snake_case.rb +3 -0
- data/lib/ramaze/snippets/struct/fill.rb +8 -2
- data/lib/ramaze/snippets/struct/values_at.rb +16 -0
- data/lib/ramaze/snippets/symbol/to_proc.rb +3 -0
- data/lib/ramaze/sourcereload.rb +89 -0
- data/lib/ramaze/template.rb +21 -12
- data/lib/ramaze/template/amrita2.rb +6 -6
- data/lib/ramaze/template/erubis.rb +4 -9
- data/lib/ramaze/template/ezamar.rb +13 -57
- data/lib/ramaze/template/ezamar/element.rb +10 -12
- data/lib/ramaze/template/ezamar/engine.rb +40 -101
- data/lib/ramaze/template/ezamar/morpher.rb +3 -3
- data/lib/ramaze/template/haml.rb +3 -6
- data/lib/ramaze/template/liquid.rb +4 -9
- data/lib/ramaze/template/markaby.rb +16 -22
- data/lib/ramaze/template/remarkably.rb +28 -0
- data/lib/ramaze/tool/mime.rb +2 -0
- data/lib/ramaze/tool/record.rb +6 -0
- data/lib/ramaze/trinity/request.rb +44 -54
- data/lib/ramaze/trinity/response.rb +1 -1
- data/lib/ramaze/trinity/session.rb +15 -37
- data/lib/ramaze/version.rb +1 -1
- data/rake_tasks/gem.rake +2 -2
- data/rake_tasks/maintaince.rake +42 -1
- data/rake_tasks/spec.rake +45 -0
- data/spec/examples/caching.rb +1 -1
- data/spec/examples/simple.rb +1 -1
- data/spec/examples/templates/template_amrita2.rb +1 -0
- data/spec/examples/templates/template_erubis.rb +2 -1
- data/spec/examples/templates/template_ezamar.rb +1 -1
- data/spec/examples/templates/template_haml.rb +2 -1
- data/spec/examples/templates/template_liquid.rb +2 -1
- data/spec/examples/templates/template_markaby.rb +2 -1
- data/spec/examples/templates/template_remarkably.rb +22 -0
- data/spec/examples/todolist.rb +125 -0
- data/spec/helper.rb +2 -23
- data/spec/helper/minimal.rb +20 -0
- data/spec/helper/mock_http.rb +24 -30
- data/spec/helper/simple_http.rb +2 -2
- data/spec/helper/wrap.rb +6 -9
- data/spec/ramaze/adapter.rb +1 -1
- data/spec/ramaze/adapter/record.rb +31 -0
- data/spec/ramaze/cache.rb +41 -54
- data/spec/ramaze/controller.rb +121 -137
- data/spec/ramaze/controller/template/list.xhtml +1 -0
- data/spec/ramaze/controller/template/other/greet/other.xhtml +1 -0
- data/spec/ramaze/controller/template_resolving.rb +27 -3
- data/spec/ramaze/element.rb +11 -7
- data/spec/ramaze/error.rb +1 -1
- data/spec/ramaze/gestalt.rb +2 -0
- data/spec/ramaze/helper/aspect.rb +30 -21
- data/spec/ramaze/helper/auth.rb +1 -1
- data/spec/ramaze/helper/cache.rb +2 -1
- data/spec/ramaze/helper/form.rb +14 -11
- data/spec/ramaze/helper/link.rb +18 -41
- data/spec/ramaze/localize.rb +29 -2
- data/spec/ramaze/morpher.rb +23 -12
- data/spec/ramaze/params.rb +46 -24
- data/spec/ramaze/request.rb +6 -2
- data/spec/ramaze/store/yaml.rb +5 -0
- data/spec/ramaze/template.rb +22 -27
- data/spec/ramaze/template/amrita2.rb +1 -2
- data/spec/ramaze/template/erubis.rb +1 -1
- data/spec/ramaze/template/ezamar.rb +1 -2
- data/spec/ramaze/template/haml.rb +2 -2
- data/spec/ramaze/template/haml/with_vars.haml +1 -1
- data/spec/ramaze/template/liquid.rb +1 -1
- data/spec/ramaze/template/markaby.rb +1 -1
- data/spec/ramaze/template/remarkably.rb +56 -0
- data/spec/ramaze/template/remarkably/external.rem +8 -0
- data/spec/ramaze/template/remarkably/sum.rem +1 -0
- metadata +38 -63
- data/doc/README.html +0 -637
- data/doc/allison/LICENSE +0 -184
- data/doc/allison/README +0 -37
- data/doc/allison/allison.css +0 -299
- data/doc/allison/allison.gif +0 -0
- data/doc/allison/allison.js +0 -307
- data/doc/allison/allison.rb +0 -287
- data/doc/allison/cache/BODY +0 -588
- data/doc/allison/cache/CLASS_INDEX +0 -4
- data/doc/allison/cache/CLASS_PAGE +0 -1
- data/doc/allison/cache/FILE_INDEX +0 -4
- data/doc/allison/cache/FILE_PAGE +0 -1
- data/doc/allison/cache/FONTS +0 -1
- data/doc/allison/cache/FR_INDEX_BODY +0 -1
- data/doc/allison/cache/IMGPATH +0 -1
- data/doc/allison/cache/INDEX +0 -1
- data/doc/allison/cache/JAVASCRIPT +0 -307
- data/doc/allison/cache/METHOD_INDEX +0 -4
- data/doc/allison/cache/METHOD_LIST +0 -1
- data/doc/allison/cache/SRC_PAGE +0 -1
- data/doc/allison/cache/STYLE +0 -321
- data/doc/allison/cache/URL +0 -1
- data/doc/changes.txt +0 -3375
- data/doc/changes.xml +0 -3378
- data/examples/todolist/conf/benchmark.yaml +0 -35
- data/examples/todolist/conf/debug.yaml +0 -34
- data/examples/todolist/conf/live.yaml +0 -33
- data/examples/todolist/conf/silent.yaml +0 -31
- data/examples/todolist/conf/stage.yaml +0 -33
- data/examples/todolist/public/css/coderay.css +0 -105
- data/examples/todolist/public/css/ramaze_error.css +0 -42
- data/lib/proto/conf/benchmark.yaml +0 -21
- data/lib/proto/conf/debug.yaml +0 -21
- data/lib/proto/conf/live.yaml +0 -21
- data/lib/proto/conf/silent.yaml +0 -21
- data/lib/proto/conf/stage.yaml +0 -21
- data/lib/proto/public/css/coderay.css +0 -105
- data/lib/ramaze/http_status.rb +0 -66
- data/lib/ramaze/snippets/hash/keys_to_sym.rb +0 -19
- data/lib/ramaze/snippets/kernel/method.rb +0 -26
- data/lib/ramaze/snippets/method/name.rb +0 -22
- data/lib/ramaze/snippets/ramaze/autoreload.rb +0 -135
- data/lib/ramaze/snippets/rdoc/usage_no_exit.rb +0 -65
- data/spec/all.rb +0 -32
- data/spec/ramaze/conf/locale_de.yaml +0 -6
- data/spec/ramaze/conf/locale_en.yaml +0 -6
- data/spec/ramaze/dependencies.rb +0 -16
- data/spec/ramaze/global.rb +0 -44
@@ -0,0 +1,59 @@
|
|
1
|
+
# Copyright (c) 2006 Michael Fellinger m.fellinger@gmail.com
|
2
|
+
# All files in this distribution are subject to the terms of the Ruby license.
|
3
|
+
|
4
|
+
require 'ramaze'
|
5
|
+
|
6
|
+
include Ramaze
|
7
|
+
|
8
|
+
class MainController < Controller
|
9
|
+
template_root File.expand_path((File.dirname(__FILE__)/'template'))
|
10
|
+
trait :engine => Template::Remarkably
|
11
|
+
|
12
|
+
include Remarkably::Common
|
13
|
+
|
14
|
+
def index
|
15
|
+
%{ #{A 'Home', :href => :/} | #{A(:internal)} | #{A(:external)} }
|
16
|
+
end
|
17
|
+
|
18
|
+
def internal *args
|
19
|
+
@place = :internal
|
20
|
+
html do
|
21
|
+
head do
|
22
|
+
title "Template::Remarkably internal"
|
23
|
+
end
|
24
|
+
body do
|
25
|
+
h1 "The #@place Template for Remarkably"
|
26
|
+
a("Home", :href => R(:/))
|
27
|
+
P do
|
28
|
+
text "Here you can pass some stuff if you like, parameters are just passed like this:"
|
29
|
+
br
|
30
|
+
a("#@place/one", :href => Rs( @place, :one))
|
31
|
+
br
|
32
|
+
a("#@place/one/two/three", :href => Rs( @place, :one, :two, :three))
|
33
|
+
br
|
34
|
+
a("#@place/one?foo=bar", :href => Rs( @place, :one, :foo => :bar))
|
35
|
+
br
|
36
|
+
end
|
37
|
+
div do
|
38
|
+
text "The arguments you have passed to this action are:"
|
39
|
+
if args.empty?
|
40
|
+
"none"
|
41
|
+
else
|
42
|
+
args.each do |arg|
|
43
|
+
span arg
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
div request.params.inspect
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def external *args
|
53
|
+
@args = args
|
54
|
+
@place = :external
|
55
|
+
@request = request
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
Ramaze.start
|
data/examples/todolist/main.rb
CHANGED
@@ -9,10 +9,4 @@ require 'src/controller/main'
|
|
9
9
|
require 'src/element/page'
|
10
10
|
require 'src/model'
|
11
11
|
|
12
|
-
|
13
|
-
# benchmark | debug | stage | live | silent
|
14
|
-
mode = 'debug'
|
15
|
-
|
16
|
-
Global.setup YAML.load_file("conf/#{mode}.yaml")
|
17
|
-
|
18
|
-
start
|
12
|
+
Ramaze.start
|
@@ -3,53 +3,66 @@
|
|
3
3
|
|
4
4
|
class MainController < Controller
|
5
5
|
|
6
|
-
|
6
|
+
helper :aspect
|
7
7
|
|
8
8
|
def index
|
9
9
|
@tasks = []
|
10
10
|
TodoList.original.each do |title, parameters|
|
11
11
|
if parameters[:done]
|
12
12
|
status = 'done'
|
13
|
-
toggle =
|
13
|
+
toggle = A('Open Task', :href => Rs(:open, title))
|
14
14
|
else
|
15
15
|
status = 'not done'
|
16
|
-
toggle =
|
16
|
+
toggle = A('Close Task', :href => Rs(:close, title))
|
17
17
|
end
|
18
|
-
delete =
|
18
|
+
delete = A('Delete', :href => Rs(:delete, title))
|
19
19
|
@tasks << [title, status, toggle, delete]
|
20
20
|
end
|
21
21
|
@tasks.sort!
|
22
22
|
end
|
23
23
|
|
24
24
|
def create
|
25
|
-
title = request['title']
|
26
|
-
|
27
|
-
|
25
|
+
if title = request['title']
|
26
|
+
title.strip!
|
27
|
+
if title.empty?
|
28
|
+
error("Please enter a title")
|
29
|
+
redirect '/new'
|
30
|
+
end
|
31
|
+
TodoList[title] = {:done => false}
|
32
|
+
end
|
28
33
|
end
|
29
34
|
|
30
35
|
def open title
|
31
36
|
task_status title, false
|
32
|
-
redirect R(self)
|
33
37
|
end
|
34
38
|
|
35
39
|
def close title
|
36
40
|
task_status title, true
|
37
|
-
redirect R(self)
|
38
41
|
end
|
39
42
|
|
40
43
|
def delete title
|
41
44
|
TodoList.delete title
|
42
|
-
redirect R(self)
|
43
45
|
end
|
44
46
|
|
45
|
-
|
46
|
-
|
47
|
+
after(:create, :open, :close, :delete){ redirect_index }
|
48
|
+
|
49
|
+
def redirect_index
|
50
|
+
redirect(Rs())
|
47
51
|
end
|
48
52
|
|
49
53
|
private
|
50
54
|
|
55
|
+
def error(message)
|
56
|
+
flash[:error] = message
|
57
|
+
end
|
58
|
+
|
51
59
|
def task_status title, status
|
52
|
-
|
60
|
+
p title
|
61
|
+
unless task = TodoList[title]
|
62
|
+
error "No such Task: `#{title}'"
|
63
|
+
redirect_referer
|
64
|
+
end
|
65
|
+
|
53
66
|
task[:done] = status
|
54
67
|
TodoList[title] = task
|
55
68
|
end
|
data/examples/whywiki/main.rb
CHANGED
data/lib/proto/main.rb
CHANGED
@@ -8,11 +8,3 @@ include Ramaze
|
|
8
8
|
require 'src/controller/main'
|
9
9
|
require 'src/element/page'
|
10
10
|
require 'src/model'
|
11
|
-
|
12
|
-
# mode selects the config-file.
|
13
|
-
# benchmark | debug | stage | live | silent
|
14
|
-
mode = 'debug'
|
15
|
-
|
16
|
-
Global.setup YAML.load_file("conf/#{mode}.yaml")
|
17
|
-
|
18
|
-
start
|
@@ -1,7 +1,3 @@
|
|
1
|
-
img#logo {
|
2
|
-
float:left;
|
3
|
-
}
|
4
|
-
|
5
1
|
h1.main {
|
6
2
|
text-align: center;
|
7
3
|
}
|
@@ -40,3 +36,15 @@ tr.source_container div table tr.source {
|
|
40
36
|
div.source {
|
41
37
|
background: #fff;
|
42
38
|
}
|
39
|
+
|
40
|
+
tr.source {
|
41
|
+
font-size: 1.0em;
|
42
|
+
}
|
43
|
+
|
44
|
+
tr.source td.lineno {
|
45
|
+
font-size: 0.8em;
|
46
|
+
}
|
47
|
+
|
48
|
+
tr.source td.code pre {
|
49
|
+
height: 0.1em;
|
50
|
+
}
|
data/lib/proto/public/error.zmr
CHANGED
@@ -1,17 +1,10 @@
|
|
1
1
|
<html>
|
2
2
|
<head>
|
3
3
|
<title>#{@title}</title>
|
4
|
-
<?r if @coderay ?>
|
5
|
-
<style>
|
6
|
-
#{CodeRay::Encoders[:html]::CSS.new.stylesheet}
|
7
|
-
</style>
|
8
|
-
<?r end ?>
|
9
4
|
<link rel="stylesheet" href="/css/ramaze_error.css" />
|
10
5
|
<script type="text/javascript" src="/js/jquery.js"></script>
|
11
6
|
</head>
|
12
7
|
<body>
|
13
|
-
<img id="logo" alt="Ramaze" src="/ramaze.png" />
|
14
|
-
|
15
8
|
<h1>#{@title}</h1>
|
16
9
|
|
17
10
|
<table class="main">
|
@@ -27,25 +20,13 @@
|
|
27
20
|
<div class="source">
|
28
21
|
<table style="width:100%;">
|
29
22
|
<tr>
|
30
|
-
<td colspan="2"
|
23
|
+
<td colspan="2">#{@editor} #{file} +#{lineno}</td>
|
31
24
|
</tr>
|
32
|
-
<?r
|
33
|
-
if
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
:line_numbers => :inline,
|
38
|
-
:line_number_start => (lineno.to_i - Global.backtrace_size)
|
39
|
-
}
|
40
|
-
?>
|
41
|
-
#{CodeRay.scan(code, :ruby).html(options)}
|
42
|
-
<?r else ?>
|
43
|
-
<?r lines.each do |llineno, lcode, lcurrent| ?>
|
44
|
-
<tr class="source" #{'style="background:#faa;"' if lcurrent}>
|
45
|
-
<td>#{llineno}</td>
|
46
|
-
<td><pre>#{lcode.to_s.rstrip}</pre></td>
|
47
|
-
</tr>
|
48
|
-
<?r end ?>
|
25
|
+
<?r lines.each do |llineno, lcode, lcurrent| ?>
|
26
|
+
<tr class="source" #{'style="background:#faa;"' if lcurrent}>
|
27
|
+
<td class="lineno">#{llineno}</td>
|
28
|
+
<td class="code"><pre>#{lcode.to_s.rstrip}</pre></td>
|
29
|
+
</tr>
|
49
30
|
<?r end ?>
|
50
31
|
</table>
|
51
32
|
</div>
|
data/lib/ramaze.rb
CHANGED
@@ -4,276 +4,66 @@
|
|
4
4
|
# The main namespace for Ramaze
|
5
5
|
module Ramaze
|
6
6
|
BASEDIR = File.dirname(File.expand_path(__FILE__))
|
7
|
+
$:.unshift BASEDIR
|
7
8
|
end
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
require 'timeout'
|
12
|
-
require 'ostruct'
|
13
|
-
require 'socket'
|
14
|
-
require 'yaml'
|
15
|
-
require 'set'
|
16
|
-
require 'pp'
|
10
|
+
Thread.abort_on_exception = true
|
17
11
|
|
12
|
+
# Bootstrap
|
13
|
+
require 'ramaze/version'
|
18
14
|
require 'ramaze/snippets'
|
19
|
-
require 'ramaze/error'
|
20
|
-
require 'ramaze/cache'
|
21
15
|
require 'ramaze/inform'
|
22
16
|
require 'ramaze/global'
|
23
|
-
require 'ramaze/
|
24
|
-
|
17
|
+
require 'ramaze/cache'
|
18
|
+
|
19
|
+
# Startup
|
25
20
|
require 'ramaze/controller'
|
26
|
-
require 'ramaze/
|
27
|
-
require 'ramaze/
|
28
|
-
require 'ramaze/gestalt'
|
29
|
-
require 'ramaze/version'
|
21
|
+
require 'ramaze/adapter'
|
22
|
+
require 'ramaze/sourcereload'
|
30
23
|
|
31
|
-
|
24
|
+
# Complete
|
25
|
+
require 'ramaze/dispatcher'
|
26
|
+
require 'ramaze/template/ezamar'
|
32
27
|
|
33
28
|
module Ramaze
|
34
29
|
|
35
|
-
#
|
36
|
-
# which in turn kickstart Ramaze into duty.
|
37
|
-
# additionally it starts up the autoreload , which reloads all the stuff every
|
38
|
-
# second in case it has changed.
|
39
|
-
# please note that Ramaze will catch SIGINT (^C) and kill the running adapter
|
40
|
-
# at that event, this provides a nice and clean way to shut down.
|
41
|
-
#
|
42
|
-
# The start might be a bit odd, but i think it is a quite decent hack, what
|
43
|
-
# it does is following.
|
44
|
-
# It looks up who called the start-method, and if the method that called it
|
45
|
-
# is not the file that was run first, it will return without doing anything
|
46
|
-
# The use of this is:
|
47
|
-
# If you start ramaze over the CLI, using ruby main.rb
|
48
|
-
# and the start-method is called in your main.rb, it will run, using the
|
49
|
-
# configuration from you without any modifcation (just with the defaults)
|
50
|
-
# In case you start it via the ramaze-command however, you may pass options
|
51
|
-
# that could be overwritten by your application, but you just want to use
|
52
|
-
# these options temporarily - in this case the start-call from your main.rb
|
53
|
-
# will simply be ignored, the start from bin/ramaze is invoked which in turn
|
54
|
-
# sets the options you passed on the commandline.
|
55
|
-
# If you pertout want to run with bin/ramaze, pass commandline-options _and_
|
56
|
-
# use the start-method your own application, use start(:force => true)
|
57
|
-
# This also applies if your start is in another file than the file you
|
58
|
-
# called first, therefor giving you the option to layout your application
|
59
|
-
# as it pleases you.
|
60
|
-
|
61
|
-
def start options = {}
|
62
|
-
starter = caller[0].split(':').first
|
63
|
-
return unless ($0 == starter or options.delete(:force))
|
64
|
-
|
65
|
-
init_global options
|
66
|
-
|
67
|
-
return if options.delete(:fake_start)
|
68
|
-
|
69
|
-
startup
|
70
|
-
end
|
71
|
-
|
72
|
-
alias run start
|
30
|
+
# Each of these classes will be called ::startup upon Ramaze.startup
|
73
31
|
|
74
|
-
|
32
|
+
trait :essentials => [
|
33
|
+
Global, Controller, Session, SourceReload, Adapter
|
34
|
+
]
|
75
35
|
|
76
|
-
|
77
|
-
start options.merge(:force => true)
|
78
|
-
end
|
79
|
-
|
80
|
-
alias force_run force_start
|
81
|
-
|
82
|
-
# Execute the tasks specified in Global.startup
|
83
|
-
# (where you can define your own tasks)
|
84
|
-
# and afterwards the ones in Global.ramaze_startup
|
85
|
-
# (reserved for the usage of Ramaze itself)
|
86
|
-
|
87
|
-
def startup
|
88
|
-
tasks = Global.startup + Global.ramaze_startup
|
89
|
-
execute(*tasks)
|
90
|
-
end
|
36
|
+
class << self
|
91
37
|
|
92
|
-
|
93
|
-
|
94
|
-
# and afterwards the ones in Global.ramaze_shutdown
|
95
|
-
# (reserved for the usage of Ramaze itself)
|
38
|
+
# The one place to start Ramaze, takes an Hash of options to pass on to
|
39
|
+
# each class in trait[:essentials] by calling ::startup on them.
|
96
40
|
|
97
|
-
|
98
|
-
|
99
|
-
execute(*tasks)
|
100
|
-
end
|
101
|
-
|
102
|
-
# executes a list of tasks, depending on the task-object, if it responds to
|
103
|
-
# :call it will be called upon, otherwise the task is sent to self ( the
|
104
|
-
# module Ramaze ).
|
105
|
-
|
106
|
-
def execute *tasks
|
107
|
-
tasks.flatten.each do |task|
|
108
|
-
begin
|
109
|
-
if task.respond_to?(:call)
|
110
|
-
task.call
|
111
|
-
else
|
112
|
-
send(task)
|
113
|
-
end
|
114
|
-
rescue Object => ex
|
115
|
-
exit if ex.is_a?(SystemExit)
|
116
|
-
Inform.error(ex)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
41
|
+
def startup options = {}
|
42
|
+
Inform.info("Starting up Ramaze (Version #{VERSION})")
|
120
43
|
|
121
|
-
|
44
|
+
starter = caller[0].split(':').first
|
45
|
+
return unless ($0 == starter or options.delete(:force))
|
122
46
|
|
123
|
-
|
124
|
-
|
125
|
-
Global.adapter_klass.stop rescue nil
|
126
|
-
(Thread.list - [Thread.main]).each do |thread|
|
127
|
-
Timeout.timeout(2) do
|
128
|
-
if thread[:adapter] and thread[:adapter].respond_to?(:shutdown)
|
129
|
-
thread[:adapter].shutdown
|
130
|
-
end
|
131
|
-
thread.kill
|
47
|
+
trait[:essentials].each do |obj|
|
48
|
+
obj.startup(options)
|
132
49
|
end
|
133
50
|
end
|
134
|
-
end
|
135
51
|
|
136
|
-
|
137
|
-
|
52
|
+
# This will be called when you hit ^C or send SIGINT.
|
53
|
+
# It sends ::shutdown to every class in trait[:essentials] and informs you
|
54
|
+
# when it is done
|
138
55
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
Global.mapping.dup.each do |route, controller|
|
143
|
-
Global.mapping[route] = constant(controller.to_s)
|
144
|
-
end
|
145
|
-
|
146
|
-
Global.controllers.each do |controller|
|
147
|
-
if map = controller.mapping
|
148
|
-
Global.mapping[map] ||= controller
|
149
|
-
Inform.debug("mapped #{map} => #{controller}")
|
56
|
+
def shutdown
|
57
|
+
trait[:essentials].each do |obj|
|
58
|
+
obj.shutdown if obj.respond_to?(:shutdown)
|
150
59
|
end
|
151
|
-
end
|
152
|
-
|
153
|
-
Inform.debug("found Controllers: #{Global.controllers.inspect}")
|
154
|
-
Inform.debug("mapped Controllers: #{Global.mapping.inspect}")
|
155
|
-
end
|
156
60
|
|
157
|
-
|
61
|
+
puts("Shutdown Ramaze (it's safe to kill me now if i hang)")
|
158
62
|
|
159
|
-
|
160
|
-
return unless Global.autoreload
|
161
|
-
Ramaze.autoreload Global.autoreload
|
162
|
-
end
|
163
|
-
|
164
|
-
# initialize the Global, setting a default-mapping if none is given yet.
|
165
|
-
#
|
166
|
-
# You may pass :force_setup => true in your options if you want your options
|
167
|
-
# to override everything else set till now.
|
168
|
-
|
169
|
-
def init_global options = {}
|
170
|
-
tmp_mapping = Global.mapping || {}
|
171
|
-
|
172
|
-
if options.delete(:force_setup)
|
173
|
-
Global.setup(options)
|
174
|
-
else
|
175
|
-
Global.update(options)
|
176
|
-
end
|
177
|
-
|
178
|
-
Global.mapping = tmp_mapping.merge(Global.mapping)
|
179
|
-
end
|
180
|
-
|
181
|
-
# Finally decide wether to use a main-thread to run Ramaze
|
182
|
-
# so that further stuff can be done outside (very useful for testcases)
|
183
|
-
# or we run it in standalone-mode, which is the default and waits
|
184
|
-
# until the adapter is finished. (hopefully never ;)
|
185
|
-
# change this behaviour by setting Global.run_loose = (true|false)
|
186
|
-
# In every case the running adapter-thread is assigned to
|
187
|
-
# Global.running_adapter
|
188
|
-
|
189
|
-
def init_adapter
|
190
|
-
unless Global.adapter
|
191
|
-
Inform.info "No adapter will be used."
|
192
|
-
return
|
193
|
-
end
|
194
|
-
|
195
|
-
(Thread.list - [Thread.current]).each do |thread|
|
196
|
-
thread.kill if thread[:task] == :adapter
|
197
|
-
end
|
198
|
-
|
199
|
-
Thread.new do
|
200
|
-
Thread.current.priority = 99
|
201
|
-
Thread.current[:task] = :adapter
|
202
|
-
Global.running_adapter = run_adapter
|
203
|
-
|
204
|
-
trap(Global.shutdown_trap){ shutdown } rescue nil
|
205
|
-
end
|
206
|
-
|
207
|
-
Timeout.timeout(3) do
|
208
|
-
sleep 0.1 until Global.running_adapter
|
209
|
-
end
|
210
|
-
Global.running_adapter.join unless Global.run_loose
|
211
|
-
rescue Object => ex
|
212
|
-
Inform.debug(ex.message) unless ex.is_a? Interrupt
|
213
|
-
shutdown
|
214
|
-
end
|
215
|
-
|
216
|
-
# This first picks the right adapter according to Global.adapter
|
217
|
-
# It also looks for Global.host and Global.port and passes it on
|
218
|
-
# to the class-method of the adapter ::start
|
219
|
-
|
220
|
-
def run_adapter
|
221
|
-
adapter, host, port = Global.values_at(:adapter, :host, :port)
|
222
|
-
require_adapter(adapter)
|
223
|
-
|
224
|
-
adapter_klass = Ramaze::Adapter.const_get(adapter.to_s.capitalize)
|
225
|
-
Global.adapter_klass = adapter_klass
|
226
|
-
|
227
|
-
Inform.info("Found adapter: #{adapter_klass}, trying to connect to #{host}:#{port} ...")
|
228
|
-
|
229
|
-
parse_port(port)
|
230
|
-
shutdown unless test_connections(host, Global.ports)
|
231
|
-
Inform.info("and we're running: #{host}:#{port}")
|
232
|
-
|
233
|
-
adapter_klass.start host, Global.ports
|
234
|
-
end
|
235
|
-
|
236
|
-
# require the specified adapter from 'ramaze/adapter/name.to_s.downcase'
|
237
|
-
|
238
|
-
def require_adapter adapter
|
239
|
-
require "ramaze/adapter" / adapter.to_s.downcase
|
240
|
-
rescue LoadError => ex
|
241
|
-
Inform.error(ex)
|
242
|
-
puts "Please make sure you have an adapter called #{adapter}"
|
243
|
-
shutdown
|
244
|
-
end
|
245
|
-
|
246
|
-
# convert ports given as string (7000..7007) to an actual range.
|
247
|
-
# sets Global.port to the first of the ports given
|
248
|
-
# sets Global.ports to the range (if one port given just a range from
|
249
|
-
# that to the same (7000..7000)
|
250
|
-
|
251
|
-
def parse_port port
|
252
|
-
from_port, to_port = port.to_s.split('..')
|
253
|
-
if from_port and to_port
|
254
|
-
Global.ports = (from_port.to_i..to_port.to_i)
|
255
|
-
else
|
256
|
-
Global.ports = (from_port.to_i..from_port.to_i)
|
63
|
+
exit!
|
257
64
|
end
|
258
|
-
Global.port = Global.ports.begin
|
259
|
-
end
|
260
|
-
|
261
|
-
# test if a connection can be made at the specified host/ports.
|
262
65
|
|
263
|
-
|
264
|
-
|
265
|
-
ports.map{|port| connection_possible(host, port) }.all?
|
266
|
-
end
|
267
|
-
|
268
|
-
# check connectivity to a specific host/port
|
269
|
-
|
270
|
-
def connection_possible host, port
|
271
|
-
Timeout.timeout(1) do
|
272
|
-
TCPServer.open(host, port){ true }
|
273
|
-
end
|
274
|
-
rescue => ex
|
275
|
-
Inform.error(ex)
|
276
|
-
false
|
66
|
+
alias start startup
|
67
|
+
alias stop shutdown
|
277
68
|
end
|
278
|
-
extend self
|
279
69
|
end
|