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