ramaze 0.1.0 → 0.1.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.
- 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
|