nitro 0.20.0 → 0.21.0
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 +752 -543
- data/INSTALL +38 -38
- data/README +264 -225
- data/Rakefile +48 -49
- data/bin/nitro +3 -3
- data/bin/nitrogen +6 -6
- data/doc/AUTHORS +10 -10
- data/doc/CHANGELOG.1 +1939 -1939
- data/doc/CHANGELOG.2 +954 -954
- data/doc/LICENSE +3 -3
- data/doc/MIGRATION +28 -0
- data/doc/RELEASES +814 -643
- data/doc/config.txt +5 -5
- data/install.rb +7 -17
- data/lib/nitro.rb +38 -9
- data/lib/nitro/adapter/cgi.rb +311 -312
- data/lib/nitro/adapter/fastcgi.rb +18 -25
- data/lib/nitro/adapter/webrick.rb +128 -137
- data/lib/nitro/adapter/wee.rb +51 -0
- data/lib/nitro/caching.rb +20 -20
- data/lib/nitro/caching/actions.rb +43 -43
- data/lib/nitro/caching/fragments.rb +46 -46
- data/lib/nitro/caching/invalidation.rb +11 -11
- data/lib/nitro/caching/output.rb +65 -65
- data/lib/nitro/caching/stores.rb +67 -67
- data/lib/nitro/compiler.rb +262 -0
- data/lib/nitro/compiler/elements.rb +0 -0
- data/lib/nitro/compiler/errors.rb +65 -0
- data/lib/nitro/compiler/localization.rb +25 -0
- data/lib/nitro/compiler/markup.rb +19 -0
- data/lib/nitro/compiler/shaders.rb +206 -0
- data/lib/nitro/compiler/squeeze.rb +20 -0
- data/lib/nitro/compiler/xslt.rb +61 -0
- data/lib/nitro/context.rb +87 -88
- data/lib/nitro/controller.rb +151 -158
- data/lib/nitro/cookie.rb +34 -34
- data/lib/nitro/dispatcher.rb +195 -186
- data/lib/nitro/element.rb +132 -126
- data/lib/nitro/element/java_script.rb +6 -6
- data/lib/nitro/flash.rb +66 -66
- data/lib/nitro/mail.rb +192 -192
- data/lib/nitro/mixin/buffer.rb +66 -0
- data/lib/nitro/mixin/debug.rb +16 -16
- data/lib/nitro/mixin/form.rb +88 -0
- data/lib/nitro/mixin/helper.rb +2 -2
- data/lib/nitro/mixin/javascript.rb +108 -108
- data/lib/nitro/mixin/markup.rb +144 -0
- data/lib/nitro/mixin/pager.rb +202 -202
- data/lib/nitro/mixin/rss.rb +67 -0
- data/lib/nitro/mixin/table.rb +63 -0
- data/lib/nitro/mixin/xhtml.rb +75 -0
- data/lib/nitro/mixin/xml.rb +124 -0
- data/lib/nitro/render.rb +183 -359
- data/lib/nitro/request.rb +140 -140
- data/lib/nitro/response.rb +27 -27
- data/lib/nitro/routing.rb +21 -21
- data/lib/nitro/scaffold.rb +124 -118
- data/lib/nitro/server.rb +117 -80
- data/lib/nitro/server/runner.rb +341 -0
- data/lib/nitro/service.rb +12 -12
- data/lib/nitro/service/xmlrpc.rb +22 -22
- data/lib/nitro/session.rb +122 -120
- data/lib/nitro/session/drb.rb +9 -9
- data/lib/nitro/session/drbserver.rb +34 -34
- data/lib/nitro/template.rb +171 -155
- data/lib/nitro/testing/assertions.rb +90 -90
- data/lib/nitro/testing/context.rb +16 -16
- data/lib/nitro/testing/testcase.rb +34 -34
- data/proto/conf/lhttpd.conf +9 -9
- data/proto/public/error.xhtml +75 -75
- data/proto/public/index.xhtml +18 -18
- data/proto/public/js/behaviour.js +65 -65
- data/proto/public/js/controls.js +1 -1
- data/proto/public/js/prototype.js +3 -3
- data/proto/public/settings.xhtml +61 -61
- data/proto/run.rb +1 -5
- data/test/nitro/adapter/raw_post1.bin +0 -0
- data/test/nitro/adapter/tc_cgi.rb +57 -57
- data/test/nitro/adapter/tc_webrick.rb +4 -4
- data/test/nitro/mixin/tc_pager.rb +25 -25
- data/test/nitro/mixin/tc_rss.rb +24 -0
- data/test/nitro/mixin/tc_table.rb +31 -0
- data/test/nitro/mixin/tc_xhtml.rb +13 -0
- data/test/nitro/tc_caching.rb +10 -10
- data/test/nitro/tc_context.rb +8 -8
- data/test/nitro/tc_controller.rb +48 -48
- data/test/nitro/tc_cookie.rb +6 -6
- data/test/nitro/tc_dispatcher.rb +64 -64
- data/test/nitro/tc_element.rb +27 -27
- data/test/nitro/tc_flash.rb +31 -31
- data/test/nitro/tc_mail.rb +63 -63
- data/test/nitro/tc_server.rb +26 -26
- data/test/nitro/tc_session.rb +9 -9
- data/test/nitro/tc_template.rb +19 -19
- data/test/public/blog/list.xhtml +1 -1
- metadata +31 -37
- data/lib/nitro/buffering.rb +0 -45
- data/lib/nitro/builder/form.rb +0 -104
- data/lib/nitro/builder/rss.rb +0 -104
- data/lib/nitro/builder/table.rb +0 -80
- data/lib/nitro/builder/xhtml.rb +0 -132
- data/lib/nitro/builder/xml.rb +0 -131
- data/lib/nitro/conf.rb +0 -36
- data/lib/nitro/environment.rb +0 -21
- data/lib/nitro/errors.rb +0 -69
- data/lib/nitro/localization.rb +0 -153
- data/lib/nitro/markup.rb +0 -147
- data/lib/nitro/output.rb +0 -24
- data/lib/nitro/runner.rb +0 -348
- data/lib/nitro/shaders.rb +0 -206
- data/test/nitro/builder/tc_rss.rb +0 -23
- data/test/nitro/builder/tc_table.rb +0 -30
- data/test/nitro/builder/tc_xhtml.rb +0 -39
- data/test/nitro/builder/tc_xml.rb +0 -56
- data/test/nitro/tc_localization.rb +0 -49
data/lib/nitro/service.rb
CHANGED
|
@@ -3,19 +3,19 @@ require 'nitro/controller'
|
|
|
3
3
|
module Nitro
|
|
4
4
|
|
|
5
5
|
class Service < Nitro::Controller
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
6
|
+
|
|
7
|
+
def index
|
|
8
|
+
method, args = decode_request(request.raw_body)
|
|
9
|
+
|
|
10
|
+
res = send(method, *args)
|
|
11
|
+
|
|
12
|
+
response.content_type = 'text/xml'
|
|
13
|
+
|
|
14
|
+
print encode_response(method, res)
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
return :stop
|
|
17
|
+
end
|
|
18
|
+
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
end
|
data/lib/nitro/service/xmlrpc.rb
CHANGED
|
@@ -8,35 +8,35 @@ module Nitro
|
|
|
8
8
|
|
|
9
9
|
module XmlRpc
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
11
|
+
# === In
|
|
12
|
+
#
|
|
13
|
+
# [+request+]
|
|
14
|
+
# Raw request data.
|
|
15
|
+
#
|
|
16
|
+
# === Out
|
|
17
|
+
#
|
|
18
|
+
# [+method+]
|
|
19
|
+
# [+args+]
|
|
20
|
+
|
|
21
|
+
def decode_request(request)
|
|
22
|
+
method, args = XMLRPC::Marshal.load_call(request)
|
|
23
|
+
return method.gsub(/\./, '__'), args
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def encode_response(method_name, response)
|
|
27
|
+
XMLRPC::Marshal.dump_response(response)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
31
|
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
# The XML-RPC base service.
|
|
35
35
|
|
|
36
36
|
class XmlRpcService < Service
|
|
37
|
-
|
|
37
|
+
include XmlRpc
|
|
38
38
|
end
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
# * George Moschovitis <gm@navel.gr>
|
data/lib/nitro/session.rb
CHANGED
|
@@ -3,10 +3,12 @@ require 'webrick'
|
|
|
3
3
|
|
|
4
4
|
require 'glue/hash'
|
|
5
5
|
require 'glue/attribute'
|
|
6
|
+
require 'glue/configuration'
|
|
7
|
+
|
|
6
8
|
require 'nitro/cookie'
|
|
7
9
|
|
|
8
10
|
module Nitro
|
|
9
|
-
|
|
11
|
+
|
|
10
12
|
# A web application session.
|
|
11
13
|
#
|
|
12
14
|
# State is a neccessary evil but session variables
|
|
@@ -20,134 +22,134 @@ module Nitro
|
|
|
20
22
|
|
|
21
23
|
class Session < Hash
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
25
|
+
# Session id salt.
|
|
26
|
+
|
|
27
|
+
setting :session_id_salt, :default => 'SALT', :doc => 'Session id salt'
|
|
28
|
+
|
|
29
|
+
# The name of the cookie that stores the session id.
|
|
30
|
+
|
|
31
|
+
setting :cookie_name, :default => 'nsid', :doc => 'The name of the cookie that stores the session id'
|
|
32
|
+
|
|
33
|
+
# The sessions store. By default sessions are
|
|
34
|
+
# stored in memory.
|
|
35
|
+
|
|
36
|
+
cattr_accessor :store; @@store = Glue::SafeHash.new
|
|
37
|
+
|
|
38
|
+
# Set the session store. The following options are
|
|
39
|
+
# available:
|
|
40
|
+
#
|
|
41
|
+
# * :memory [default]
|
|
42
|
+
# * :drb
|
|
43
|
+
# * :memcached (not available yet)
|
|
44
|
+
# * :og (not available yet)
|
|
45
|
+
# * :file (not available yet)
|
|
46
|
+
|
|
47
|
+
def self.store_type=(store_type)
|
|
48
|
+
# gmosx: RDoc complains about this, so lets use an
|
|
49
|
+
# eval, AAAAAAAARGH!
|
|
50
|
+
# require "nitro/session/#{store_type}"
|
|
51
|
+
eval %{ require 'nitro/session/#{store_type}' }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Lookup the session in the store by using the session
|
|
55
|
+
# cookie value as a key. If the session does not exist
|
|
56
|
+
# creates a new session, inserts it in the store and
|
|
57
|
+
# appends a new session cookie in the response.
|
|
58
|
+
|
|
59
|
+
def self.lookup(context)
|
|
60
|
+
if session_id = context.cookies[Session.cookie_name]
|
|
61
|
+
session = Session.store[session_id]
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
unless session
|
|
65
|
+
# Create new session.
|
|
66
|
+
session = Session.new(context)
|
|
67
|
+
cookie = Cookie.new(Session.cookie_name, session.session_id)
|
|
68
|
+
context.add_cookie(cookie)
|
|
69
|
+
Session.store[session.session_id] = session
|
|
70
|
+
else
|
|
71
|
+
# Access ('touch') the existing session.
|
|
72
|
+
session.touch!
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
return session
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# The unique id of this session.
|
|
79
|
+
|
|
80
|
+
attr_reader :session_id
|
|
81
|
+
|
|
82
|
+
# The time this session was created.
|
|
83
|
+
|
|
84
|
+
attr_reader :ctime
|
|
85
|
+
alias_method :create_time, :ctime
|
|
86
|
+
|
|
87
|
+
# The time this session was last modified.
|
|
88
|
+
|
|
89
|
+
attr_accessor :mtime
|
|
90
|
+
alias_method :modify_time, :mtime
|
|
91
|
+
|
|
92
|
+
# The time this session was last accessed.
|
|
93
|
+
|
|
94
|
+
attr_accessor :atime
|
|
95
|
+
alias_method :access_time, :mtime
|
|
96
|
+
|
|
97
|
+
# Create the session for the given context.
|
|
98
|
+
|
|
99
|
+
def initialize(context = nil)
|
|
100
|
+
@session_id = create_id
|
|
101
|
+
@ctime = @mtime = @atime = Time.now
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Like the unix touch command, upadtes
|
|
105
|
+
# the atime to now.
|
|
106
|
+
|
|
107
|
+
def touch!
|
|
108
|
+
@atime = Time.now
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Synchronize the session store, by
|
|
112
|
+
# restoring this session. Especially useful
|
|
113
|
+
# in distributed and/or multiprocess setups.
|
|
114
|
+
|
|
115
|
+
def sync
|
|
116
|
+
Session.store[@session_id] = self
|
|
117
|
+
end
|
|
118
|
+
alias_method :restore, :sync
|
|
119
|
+
|
|
118
120
|
protected
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
121
|
+
|
|
122
|
+
# Calculates a unique id.
|
|
123
|
+
#
|
|
124
|
+
# The session id must be unique, a monotonically
|
|
125
|
+
# increasing function like time is appropriate.
|
|
126
|
+
# Random may produce equal ids? add a prefix
|
|
127
|
+
# (SALT) to stop hackers from creating session_ids.
|
|
128
|
+
|
|
129
|
+
def create_id
|
|
130
|
+
now = Time.now
|
|
131
|
+
md5 = Digest::MD5.new
|
|
132
|
+
md5.update(now.to_s)
|
|
133
|
+
md5.update(now.usec.to_s)
|
|
134
|
+
md5.update(rand(0).to_s)
|
|
135
|
+
md5.update(Session.session_id_salt)
|
|
136
|
+
md5.hexdigest
|
|
137
|
+
end
|
|
136
138
|
|
|
137
139
|
end
|
|
138
140
|
|
|
139
141
|
# Abstract class for a session store manager.
|
|
140
142
|
|
|
141
143
|
class SessionStore
|
|
142
|
-
|
|
143
|
-
|
|
144
|
+
def []=(sid, session)
|
|
145
|
+
end
|
|
144
146
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
+
def [](sid)
|
|
148
|
+
end
|
|
147
149
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
150
|
+
def delete(sid)
|
|
151
|
+
end
|
|
152
|
+
|
|
151
153
|
end
|
|
152
154
|
|
|
153
155
|
end
|
data/lib/nitro/session/drb.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# * George Moschovitis <gm@navel.gr>
|
|
2
2
|
# (c) 2004-2005 Navel, all rights reserved.
|
|
3
|
-
# $Id: drb.rb
|
|
3
|
+
# $Id: drb.rb 182 2005-07-22 10:07:50Z gmosx $
|
|
4
4
|
|
|
5
5
|
require 'drb'
|
|
6
6
|
|
|
@@ -12,20 +12,20 @@ Logger.debug 'Using Drb sessions.'
|
|
|
12
12
|
module Nitro
|
|
13
13
|
|
|
14
14
|
class Session
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
|
|
16
|
+
# The address of the Session DRb server.
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
cattr_accessor :drb_address, '127.0.0.1'
|
|
19
|
+
|
|
20
|
+
# The port of the Session DRb server.
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
cattr_accessor :drb_port, 9069
|
|
23
23
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
Session.store = DRbObject.new(
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
nil,
|
|
28
|
+
"druby://#{Session.drb_address}:#{Session.drb_port}"
|
|
29
29
|
)
|
|
30
30
|
|
|
31
31
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# * George Moschovitis <gm@navel.gr>
|
|
4
4
|
# (c) 2004-2005 Navel, all rights reserved.
|
|
5
|
-
# $Id: drbserver.rb
|
|
5
|
+
# $Id: drbserver.rb 182 2005-07-22 10:07:50Z gmosx $
|
|
6
6
|
|
|
7
7
|
require 'drb'
|
|
8
8
|
require 'optparse'
|
|
@@ -19,52 +19,52 @@ debug = false
|
|
|
19
19
|
|
|
20
20
|
parser = OptionParser.new do |opts|
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
opts.banner = 'Usage: drbserver.rb [options]'
|
|
23
|
+
opts.separator ''
|
|
24
|
+
opts.separator 'Specific options:'
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
opts.on('-a A', '--address A', 'Listening address.') do |a|
|
|
27
|
+
address = a
|
|
28
|
+
end
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
opts.on('-p P', '--port P', Integer, 'Listening port.') do |p|
|
|
31
|
+
port = p
|
|
32
|
+
end
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
34
|
+
opts.on('-D', '--debug', 'Run in debug mode.') do |p|
|
|
35
|
+
debug = true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
opts.on_tail('-h', '--help', 'Show this message.') do
|
|
39
|
+
puts opts
|
|
40
|
+
exit
|
|
41
|
+
end
|
|
42
|
+
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
begin
|
|
46
|
-
|
|
46
|
+
parser.parse!(ARGV)
|
|
47
47
|
rescue OptionParser::InvalidOption
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
puts 'Invalid option, pass the --help parameter to get help!'
|
|
49
|
+
exit
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
sessions = Glue::SafeHash.new
|
|
53
53
|
|
|
54
54
|
if debug
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
56
|
+
class << sessions
|
|
57
|
+
def []=(k, v)
|
|
58
|
+
puts "WRITE: #{k} = #{v}"
|
|
59
|
+
super
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def [](k)
|
|
63
|
+
puts "READ: #{k}"
|
|
64
|
+
super
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
DRb.start_service("druby://#{address}:#{port}", sessions)
|