nitro 0.3.0 → 0.4.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.
Files changed (148) hide show
  1. data/ChangeLog +284 -0
  2. data/{LICENCE → LICENSE} +1 -1
  3. data/README +13 -17
  4. data/RELEASES +13 -1
  5. data/Rakefile +1 -9
  6. data/bin/cluster.rb +5 -5
  7. data/examples/blog/README +45 -0
  8. data/examples/blog/apache.conf +0 -0
  9. data/examples/blog/app.rb +21 -0
  10. data/examples/blog/config.rb +88 -0
  11. data/examples/blog/lib/blog.rb +104 -0
  12. data/examples/blog/log/app.log +117 -0
  13. data/examples/blog/root/comments.xhtml +38 -0
  14. data/examples/blog/root/entry_form.xhtml +18 -0
  15. data/examples/blog/root/index.xhtml +43 -0
  16. data/examples/blog/root/login.xhtml +24 -0
  17. data/examples/blog/root/m/bubbles.gif +0 -0
  18. data/examples/blog/root/m/comments_curve.gif +0 -0
  19. data/examples/blog/root/m/down.gif +0 -0
  20. data/examples/blog/root/m/footer_bg.gif +0 -0
  21. data/examples/blog/root/m/garrow.gif +0 -0
  22. data/examples/blog/root/m/gbull.gif +0 -0
  23. data/examples/blog/root/m/grbull.gif +0 -0
  24. data/examples/blog/root/m/h1_bg.gif +0 -0
  25. data/examples/blog/root/m/header_bg.gif +0 -0
  26. data/examples/blog/root/m/obull.gif +0 -0
  27. data/examples/blog/root/m/page_bg.gif +0 -0
  28. data/examples/blog/root/m/side_title_bg.gif +0 -0
  29. data/examples/blog/root/m/sidebar_bg.gif +0 -0
  30. data/examples/blog/root/recent_posts.xhtml +14 -0
  31. data/examples/blog/root/style.css +201 -0
  32. data/examples/blog/root/style.xsl +118 -0
  33. data/examples/blog/root/view_entry.xhtml +29 -0
  34. data/examples/og/run.rb +27 -29
  35. data/examples/tiny/README +3 -4
  36. data/examples/tiny/app.rb +6 -16
  37. data/examples/tiny/config.rb +30 -0
  38. data/examples/tiny/log/app.log +23 -0
  39. data/examples/tiny/root/{index.sx → index.xhtml} +3 -6
  40. data/lib/{n/std.rb → nitro.rb} +9 -4
  41. data/lib/{n → nitro}/application.rb +13 -7
  42. data/lib/{n → nitro}/config.rb +38 -8
  43. data/lib/{n → nitro}/events.rb +1 -1
  44. data/lib/{n → nitro}/l10n.rb +1 -1
  45. data/lib/{n → nitro}/logger.rb +8 -8
  46. data/lib/{n → nitro}/macros.rb +3 -3
  47. data/lib/{n → nitro}/mixins.rb +1 -1
  48. data/lib/nitro/properties.rb +301 -0
  49. data/lib/{n → nitro}/server.rb +2 -2
  50. data/lib/{n → nitro}/server/appserver.rb +14 -5
  51. data/lib/{n → nitro}/server/cluster.rb +5 -5
  52. data/lib/{n → nitro}/server/cookie.rb +1 -1
  53. data/lib/nitro/server/dispatcher.rb +66 -0
  54. data/lib/{n → nitro}/server/filters.rb +7 -7
  55. data/lib/{n → nitro}/server/filters/autologin.rb +3 -3
  56. data/lib/{n → nitro}/server/fragment.rb +3 -3
  57. data/lib/{n → nitro}/server/handlers.rb +3 -3
  58. data/lib/nitro/server/render.rb +200 -0
  59. data/lib/{n → nitro}/server/request.rb +6 -6
  60. data/lib/{n → nitro}/server/requestpart.rb +5 -5
  61. data/lib/{n → nitro}/server/script.rb +3 -3
  62. data/lib/{n → nitro}/server/server.rb +4 -4
  63. data/lib/{n → nitro}/server/session.rb +3 -3
  64. data/lib/nitro/server/shaders.rb +165 -0
  65. data/lib/{n → nitro}/server/user.rb +1 -1
  66. data/lib/nitro/server/webrick.rb +175 -0
  67. data/lib/nitro/service.rb +25 -0
  68. data/lib/{n → nitro}/sitemap.rb +2 -2
  69. data/lib/{n → nitro}/ui/date-select.rb +0 -0
  70. data/lib/{n → nitro}/ui/pager.rb +1 -1
  71. data/lib/{n → nitro}/ui/popup.rb +1 -1
  72. data/lib/{n → nitro}/ui/select.rb +1 -1
  73. data/lib/{n → nitro}/ui/tabs.rb +1 -1
  74. data/lib/{n → nitro}/utils/array.rb +1 -1
  75. data/lib/{n → nitro}/utils/cache.rb +1 -1
  76. data/lib/{n → nitro}/utils/gfx.rb +1 -1
  77. data/lib/{n → nitro}/utils/hash.rb +1 -1
  78. data/lib/{n → nitro}/utils/html.rb +1 -1
  79. data/lib/{n → nitro}/utils/http.rb +1 -1
  80. data/lib/{n → nitro}/utils/mail.rb +1 -1
  81. data/lib/{n → nitro}/utils/number.rb +1 -1
  82. data/lib/{n → nitro}/utils/pool.rb +1 -1
  83. data/lib/{n → nitro}/utils/string.rb +19 -95
  84. data/lib/{n → nitro}/utils/template.rb +0 -0
  85. data/lib/{n → nitro}/utils/time.rb +1 -1
  86. data/lib/{n → nitro}/utils/uri.rb +3 -3
  87. data/lib/nitro/version.rb +11 -0
  88. data/lib/{n/og.rb → og.rb} +61 -31
  89. data/lib/{n/og → og}/backend.rb +13 -7
  90. data/lib/{n/og → og}/backends/mysql.rb +43 -39
  91. data/lib/{n/og → og}/backends/psql.rb +42 -38
  92. data/lib/{n/og → og}/connection.rb +21 -9
  93. data/lib/{n/og → og}/meta.rb +18 -12
  94. data/lib/xsl/base.xsl +11 -88
  95. data/test/n/server/tc_cookie.rb +1 -1
  96. data/test/n/server/tc_filters.rb +1 -1
  97. data/test/n/server/tc_request.rb +3 -3
  98. data/test/n/server/tc_requestpart.rb +2 -2
  99. data/test/n/server/tc_session.rb +1 -1
  100. data/test/n/tc_events.rb +1 -1
  101. data/test/n/tc_og.rb +16 -18
  102. data/test/n/tc_properties.rb +22 -18
  103. data/test/n/tc_sitemap.rb +2 -2
  104. data/test/n/ui/tc_pager.rb +4 -4
  105. data/test/n/utils/tc_cache.rb +1 -1
  106. data/test/n/utils/tc_hash.rb +1 -1
  107. data/test/n/utils/tc_html.rb +1 -1
  108. data/test/n/utils/tc_http.rb +1 -1
  109. data/test/n/utils/tc_number.rb +1 -1
  110. data/test/n/utils/tc_strings.rb +1 -46
  111. data/test/n/utils/tc_uri.rb +1 -1
  112. metadata +101 -108
  113. data/examples/simple/README +0 -42
  114. data/examples/simple/app.rb +0 -31
  115. data/examples/simple/conf/apache.conf +0 -100
  116. data/examples/simple/conf/config.rb +0 -72
  117. data/examples/simple/conf/debug-config.rb +0 -26
  118. data/examples/simple/conf/live-config.rb +0 -26
  119. data/examples/simple/conf/requires.rb +0 -43
  120. data/examples/simple/ctl +0 -32
  121. data/examples/simple/env.rb +0 -32
  122. data/examples/simple/install.rb +0 -12
  123. data/examples/simple/lib/articles/entities.rb +0 -37
  124. data/examples/simple/lib/articles/lc-en.rb +0 -36
  125. data/examples/simple/lib/articles/methods.rb +0 -55
  126. data/examples/simple/lib/articles/part.rb +0 -57
  127. data/examples/simple/root/add-article.sx +0 -15
  128. data/examples/simple/root/article-form.ss +0 -20
  129. data/examples/simple/root/comments-form.ss +0 -16
  130. data/examples/simple/root/comments.si +0 -30
  131. data/examples/simple/root/index.sx +0 -44
  132. data/examples/simple/root/shader/shader.xsl +0 -100
  133. data/examples/simple/root/shader/style.css +0 -9
  134. data/examples/simple/root/view-article.sx +0 -29
  135. data/examples/tiny/conf/config.rb +0 -62
  136. data/examples/tiny/conf/requires.rb +0 -33
  137. data/examples/tiny/ctl +0 -16
  138. data/lib/n/parts.rb +0 -157
  139. data/lib/n/properties.rb +0 -199
  140. data/lib/n/server/dispatcher.rb +0 -55
  141. data/lib/n/server/handlers/code-handler.rb +0 -182
  142. data/lib/n/server/handlers/page-handler.rb +0 -612
  143. data/lib/n/server/webrick.rb +0 -283
  144. data/lib/n/shaders.rb +0 -166
  145. data/lib/n/sync/clc.rb +0 -110
  146. data/lib/n/sync/handler.rb +0 -229
  147. data/lib/n/sync/server.rb +0 -176
  148. data/lib/p/README +0 -1
@@ -2,9 +2,9 @@
2
2
  # * George Moschovitis <gm@navel.gr>
3
3
  #
4
4
  # (c) 2004 Navel, all rights reserved.
5
- # $Id: server.rb 109 2004-10-27 09:12:45Z gmosx $
5
+ # $Id: server.rb 155 2004-11-13 20:32:12Z gmosx $
6
6
 
7
- require "n/application"
7
+ require "nitro/application"
8
8
 
9
9
  module N
10
10
 
@@ -2,13 +2,13 @@
2
2
  # * George Moschovitis <gm@navel.gr>
3
3
  #
4
4
  # (c) 2004 Navel, all rights reserved.
5
- # $Id: appserver.rb 117 2004-10-29 16:27:22Z gmosx $
5
+ # $Id: appserver.rb 155 2004-11-13 20:32:12Z gmosx $
6
6
 
7
7
  require "drb"
8
8
 
9
- require "n/application"
10
- require "n/server"
11
- require "n/server/session"
9
+ require "nitro/application"
10
+ require "nitro/server"
11
+ require "nitro/server/session"
12
12
 
13
13
  module N
14
14
 
@@ -19,6 +19,7 @@ module N
19
19
  module AppServerMixin
20
20
 
21
21
  def initialize_app
22
+
22
23
  if $drb_state
23
24
  # Cluster mode: use distributed Ruby objects.
24
25
  $lm = N::Cluster::Slm.new($drb_lm_server, "druby://:8000")
@@ -30,11 +31,19 @@ module AppServerMixin
30
31
  end
31
32
 
32
33
  # initialize app
33
- initialize_sitemap()
34
+ initialize_sitemap()
34
35
  initialize_shaders()
35
36
  initialize_events()
36
37
  end
37
38
 
39
+ def initialize_sitemap
40
+ end
41
+
42
+ def initialize_shaders
43
+ end
44
+
45
+ def initialize_events
46
+ end
38
47
  end
39
48
 
40
49
  # = AppServer
@@ -2,17 +2,17 @@
2
2
  # * George Moschovitis <gm@navel.gr>
3
3
  #
4
4
  # (c) 2004 Navel, all rights reserved.
5
- # $Id: cluster.rb 112 2004-10-27 10:59:55Z gmosx $
5
+ # $Id: cluster.rb 155 2004-11-13 20:32:12Z gmosx $
6
6
 
7
7
  $:.unshift "lib"
8
8
 
9
9
  require "drb"
10
10
  require "monitor"
11
11
 
12
- require "n/application"
13
- require "n/server"
14
- require "n/utils/cache"
15
- require "n/server/session"
12
+ require "nitro/application"
13
+ require "nitro/server"
14
+ require "nitro/utils/cache"
15
+ require "nitro/server/session"
16
16
 
17
17
  module N
18
18
 
@@ -2,7 +2,7 @@
2
2
  # * George Moschovitis <gm@navel.gr>
3
3
  #
4
4
  # (c) 2004 Navel, all rights reserved.
5
- # $Id: cookie.rb 112 2004-10-27 10:59:55Z gmosx $
5
+ # $Id: cookie.rb 152 2004-11-13 20:02:35Z gmosx $
6
6
 
7
7
  require "cgi"
8
8
 
@@ -0,0 +1,66 @@
1
+ # code:
2
+ # * George Moschovitis <gm@navel.gr>
3
+ #
4
+ # (c) 2004 Navel, all rights reserved.
5
+ # $Id: dispatcher.rb 155 2004-11-13 20:32:12Z gmosx $
6
+
7
+ require 'nitro/server/render'
8
+
9
+ module N
10
+
11
+ # = Dispatcher
12
+ #
13
+ module Dispatcher
14
+ include N::Render
15
+
16
+ def process(request, response)
17
+ begin
18
+ $og.get_connection if $og
19
+
20
+ session = create_session(request, response)
21
+ render(request.request_uri.path, request, response, session)
22
+
23
+ unless response.header['Content-Type']
24
+ response.header['Content-Type'] = $default_content_type
25
+ end
26
+ response.body = @out
27
+ rescue Exception, StandardError => e
28
+ $log.error "error while handling the request #{request.request_uri}"
29
+ $log.error pp_exception(e)
30
+
31
+ if $error_page_url
32
+ # internal redirect to error page.
33
+ request.request_uri.path = $error_page_url
34
+ retry
35
+ else
36
+ # no custom error page defined. Presen a simple yet
37
+ # useful error screen.
38
+ response.header['Content-Type'] = 'text/html'
39
+ body = %{
40
+ <h1>ERROR</h1>
41
+ <p>Click <a href="#{request.referer}">here</a> to return
42
+ to the previous page.</p>
43
+ }
44
+ =begin
45
+ if request.error_log
46
+ body << %{
47
+ <h3>Request error log</h3>
48
+ <pre>#{request.error_log.join("\n")}</pre>
49
+ }
50
+ end
51
+ =end
52
+ body << %{
53
+ <h3>Exception</h3>
54
+ <pre>#{pp_exception(e)}</pre>
55
+ }
56
+ response.body = body
57
+ end
58
+ ensure
59
+ $og.put_connection if $og
60
+ end
61
+ end
62
+
63
+ end
64
+
65
+ end # module
66
+
@@ -2,7 +2,7 @@
2
2
  # * George Moschovitis <gm@navel.gr>
3
3
  #
4
4
  # (c) 20024 Navel, all rights reserved.
5
- # $Id: filters.rb 111 2004-10-27 09:30:19Z gmosx $
5
+ # $Id: filters.rb 152 2004-11-13 20:02:35Z gmosx $
6
6
 
7
7
  require "socket"
8
8
  require "thread"
@@ -33,7 +33,7 @@ class ServerFilter
33
33
  #
34
34
  # example:
35
35
  # LogFilter.new(TimeFilter.new(PageFilter.new))
36
-
36
+ #
37
37
  def initialize(next_filter = nil)
38
38
  @next_filter = next_filter
39
39
  end
@@ -42,13 +42,13 @@ class ServerFilter
42
42
  #
43
43
  # example:
44
44
  # LogFilter.new << TimeFilter.new << PageFilter.new
45
-
45
+ #
46
46
  def << (next_filter = nil)
47
47
  @next_filter = next_filter
48
48
  end
49
49
 
50
- # override this method to implement your filter.
51
-
50
+ # Override this method to implement your filter.
51
+ #
52
52
  def process(request)
53
53
  # preprocessing comes here...
54
54
 
@@ -60,8 +60,8 @@ class ServerFilter
60
60
  # return the result...
61
61
  end
62
62
 
63
- # process the next filter in the pipeline
64
-
63
+ # Process the next filter in the pipeline
64
+ #
65
65
  def process_next(request)
66
66
  if @next_filter
67
67
  return @next_filter.process(request)
@@ -2,10 +2,10 @@
2
2
  # * George Moschovitis
3
3
  #
4
4
  # (c) 2004 Navel, all rights reserved.
5
- # $Id: autologin.rb 124 2004-11-01 12:34:17Z gmosx $
5
+ # $Id: autologin.rb 155 2004-11-13 20:32:12Z gmosx $
6
6
 
7
- require "n/utils/string"
8
- require "n/server/filters"
7
+ require "nitro/utils/string"
8
+ require "nitro/server/filters"
9
9
 
10
10
  require_part "users"
11
11
 
@@ -2,10 +2,10 @@
2
2
  # * George Moschovitis <gm@navel.gr>
3
3
  #
4
4
  # (c) 2004 Navel, all rights reserved.
5
- # $Id: fragment.rb 112 2004-10-27 10:59:55Z gmosx $
5
+ # $Id: fragment.rb 155 2004-11-13 20:32:12Z gmosx $
6
6
 
7
- require "n/utils/cache"
8
- require "n/mixins"
7
+ require "nitro/utils/cache"
8
+ require "nitro/mixins"
9
9
 
10
10
  module N
11
11
 
@@ -2,10 +2,10 @@
2
2
  # * George Moschovitis <gm@navel.gr>
3
3
  #
4
4
  # (c) 2004 Navel, all rights reserved.
5
- # $Id: handlers.rb 112 2004-10-27 10:59:55Z gmosx $
5
+ # $Id: handlers.rb 155 2004-11-13 20:32:12Z gmosx $
6
6
 
7
- require "n/utils/cache"
8
- require "n/server/filters"
7
+ require "nitro/utils/cache"
8
+ require "nitro/server/filters"
9
9
 
10
10
  module N
11
11
 
@@ -0,0 +1,200 @@
1
+ # code:
2
+ # * George Moschovitis <gm@navel.gr>
3
+ #
4
+ # (c) 2004 Navel, all rights reserved.
5
+ # $Id: render.rb 152 2004-11-13 20:02:35Z gmosx $
6
+
7
+ module N
8
+
9
+ # = RenderUtils
10
+ #
11
+ # Various render related utilities.
12
+ #
13
+ module RenderUtils
14
+
15
+ # Split the path to base, render_class and method.
16
+ #
17
+ # Examples:
18
+ #
19
+ # / -> nil, index, nil
20
+ # /add_user -> nil, add_user, nil
21
+ # /add_user?user=gmosx -> nil, add_user, user=gmosx
22
+ # /blog/new_entry -> blog, new_entry
23
+ # /blog -> blog, index, nil
24
+ #
25
+ def self.split_path(path)
26
+ parts = path.split('/')
27
+
28
+ case parts.size
29
+ when 0
30
+ base = ''
31
+ render_class = $services[:index]
32
+ meth = 'index'
33
+ when 2
34
+ if render_class = $services[parts[1]]
35
+ base = parts[1]
36
+ meth = 'index'
37
+ else
38
+ base = ''
39
+ render_class = $services[:index]
40
+ meth = parts[1]
41
+ end
42
+ when 3
43
+ base = parts[1]
44
+ render_class = $services[parts[1]]
45
+ meth = parts[2]
46
+ end
47
+
48
+ return base, render_class, meth
49
+ end
50
+
51
+ # Transform an xhtml file to ruby rendering code.
52
+ #
53
+ def self.transform_xhtml(path)
54
+ $log.debug "Transforming '#{path}'" if $DBG
55
+
56
+ text = File.read(path)
57
+ hash, text = $shader.process(path, text)
58
+ return text
59
+ end
60
+
61
+ # Compile a rendering method.
62
+ #
63
+ def self.compile_method(klass, base, meth)
64
+ $log.debug "Compiling '#{klass}:#{meth}'" if $DBG
65
+
66
+ xhtml_path = "#$root_dir/#{base}/#{meth}.xhtml".squeeze('/')
67
+
68
+ code = %{
69
+ def __#{meth}
70
+ @out ||= ''
71
+ }
72
+
73
+ if klass.instance_methods.include?(meth)
74
+ code << %{
75
+ #{meth}();
76
+ }
77
+ end
78
+
79
+ if klass.instance_methods.include?("#{meth}_xhtml")
80
+ code << %{
81
+ #{meth}_xhtml();
82
+ }
83
+ end
84
+
85
+ if xhtml_exists = File.exist?(xhtml_path)
86
+ code << %{
87
+ __#{meth}_xhtml();
88
+ }
89
+ end
90
+
91
+ code << %{
92
+ redirect_referer if @out.empty?
93
+ end
94
+ }
95
+
96
+ if xhtml_exists = File.exist?(xhtml_path)
97
+ code << %{
98
+ def __#{meth}_xhtml
99
+ #{transform_xhtml(xhtml_path)}
100
+ end
101
+ }
102
+ end
103
+
104
+ klass.class_eval(code)
105
+
106
+ return "__#{meth}"
107
+ end
108
+
109
+ end
110
+
111
+ # = Render
112
+ #
113
+ module Render
114
+ # The outbut buffer. The output of a script/action is accumulated
115
+ # in this buffer.
116
+ attr :out
117
+
118
+ # The parameters of this request as Hash.
119
+ attr_accessor :params
120
+
121
+ # The request.
122
+ attr_accessor :request
123
+
124
+ # The response.
125
+ attr_accessor :response
126
+
127
+ # The session contains variables that stay alive for the full
128
+ # user session.
129
+ attr_accessor :session
130
+
131
+ def initialize(base_path = '', request = nil, response = nil, session = nil)
132
+ @base_path = base_path
133
+ @request = request
134
+ @response = response
135
+ @session = session
136
+ @params = request.query
137
+ end
138
+
139
+ # Returns the output of the rendering as string.
140
+ #
141
+ def render(path, request = nil, response = nil, session = nil)
142
+ path, query_string = path.split('?')
143
+
144
+ @request ||= request
145
+ @response ||= response
146
+ @session ||= session
147
+
148
+ @params = @request.set_query(query_string) if query_string
149
+
150
+ base, render_class, meth = $methods[path]
151
+
152
+ unless meth
153
+ base, render_class, meth = RenderUtils.split_path(path)
154
+ meth = RenderUtils.compile_method(render_class, base, meth)
155
+ $methods[path] = [base, render_class, meth] unless $reload_scripts
156
+ end
157
+
158
+ if self.class == render_class
159
+ self.send(meth)
160
+ else
161
+ r = render_class.new(base, @request, @response, @session)
162
+ r.send(meth)
163
+ @out = r.out
164
+ end
165
+
166
+ # stop the filter pipeline
167
+ return false
168
+ end
169
+
170
+ # Render the referer of this method.
171
+ #
172
+ def render_referer
173
+ render(@request.referer.gsub(/#$srv_url/, ''))
174
+ end
175
+
176
+ # Send a redirect response.
177
+ #
178
+ def redirect(url, status = 303)
179
+ begin
180
+ # url = "#$srv_url/#{url}".squeeze('/') unless url =~ /^http/
181
+ @response.status = status
182
+ @response.set_redirect(status, url)
183
+ rescue Exception, StandardError => ex
184
+ # drink it!
185
+ end
186
+
187
+ # stop the filter pipeline
188
+ return false
189
+ end
190
+
191
+ # Redirect to the referer of this method.
192
+ #
193
+ def redirect_referer(status = 303)
194
+ redirect(@request.referer, status)
195
+ end
196
+
197
+ end
198
+
199
+ end # module
200
+