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/runner.rb DELETED
@@ -1,348 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'optparse'
4
-
5
- require 'glue/misc'
6
- require 'glue/configuration'
7
-
8
- require 'nitro/conf'
9
-
10
- module Nitro
11
-
12
- # The Runner is a helper class that encapsulates a web
13
- # application and is responsible for launching the
14
- # application in differnt modes.
15
- #
16
- # The runner provides default parsing of command line
17
- # and environment parameters.
18
- #
19
- # The default execution modes are:
20
- #
21
- # :debug, :stage, :live
22
- #
23
- # You can implement your own, custom version of the Runner
24
- # to run your custom web applications.
25
-
26
- class Runner
27
-
28
- # Execution mode = (:debug, :stage, :live)
29
- #
30
- # [:debug]
31
- # useful when debugging, extra debug information
32
- # is emmited, actions, templates and shaders are
33
- # reloaded, etc. The execution speed of the application
34
- # is impaired.
35
- #
36
- # [:stage]
37
- # test the application with live parameters
38
- # (typically on a staging server).
39
- #
40
- # [:live]
41
- # use the parameters for the live (production)
42
- # server. Optimized for speed.
43
- #
44
- # The default mode is :debug
45
-
46
- attr :mode
47
-
48
- # :start, :stop, :restart
49
-
50
- attr :action
51
-
52
- # The server used to run this web application.
53
- # :webrick, :nitro, :lhttp, :apache, :mod_apache
54
- #
55
- # At the moment only :webrick and :lhttp are available.
56
-
57
- attr :server
58
-
59
- # Run as daemon.
60
-
61
- attr :daemon
62
-
63
- # Spidering mode. Acceptable values are :crawl, :render
64
- # and false.
65
-
66
- attr :spider
67
-
68
- # Parse the command line arguments and the environment
69
- # parameters to setup the application.
70
-
71
- def setup
72
-
73
- @mode = :debug
74
- @action = :start
75
- @server = :webrick
76
- @daemon = false
77
- @spider = false
78
-
79
- parser = OptionParser.new do |opts|
80
-
81
- opts.banner = 'Usage: run.rb [options]'
82
- opts.separator ''
83
- opts.separator 'Specific options:'
84
-
85
- opts.on('-s', '--start', 'Start application.') do
86
- @action = :start
87
- end
88
-
89
- opts.on('-S', '--stop', 'Stop application.') do
90
- @action = :stop
91
- end
92
-
93
- opts.on('-r', '--restart', 'Restart application.') do
94
- @action = :restart
95
- end
96
-
97
- opts.on('-d', '--daemon', 'Run application as a daemon.') do
98
- @daemon = true
99
- end
100
-
101
- opts.on('-D', '--debug', 'Run application in debug mode.') do
102
- @mode = :debug
103
- end
104
-
105
- opts.on('-T', '--stage', 'Run application in stage mode.') do
106
- @mode = :stage
107
- end
108
-
109
- opts.on('-L', '--live', 'Run application in live mode.') do
110
- @mode = :live
111
- end
112
-
113
- opts.on('-w', '--webrick', 'Use a webrick server [default].') do
114
- @server = :webrick
115
- end
116
-
117
- opts.on('-l', '--lhttpd', 'Use a lighttpd server.') do
118
- @server = :lhttpd
119
- Logger.set(Logger.new('log/app.log'))
120
- end
121
-
122
- opts.on('-a', '--apache', 'Use an apache server.') do
123
- @server = :apache
124
- Logger.set(Logger.new('log/app.log'))
125
- end
126
-
127
- opts.on('--apache-cgi', 'Run as CGI (Apache)') do
128
- @server = :cgi
129
- Logger.set(Logger.new('log/app.log'))
130
- end
131
-
132
- opts.on('-C', '--console', 'Start a console attached to an instance of the application.') do
133
- if RUBY_PLATFORM =~ /mswin32/
134
- irb_name = 'irb.bat'
135
- else
136
- irb_name = 'irb'
137
- end
138
- ENV['NITRO_INVOKE'] = 'irb'
139
- conf_file = File.basename(caller.last.split(':').first)
140
- # exec "#{irb_name} -r #{conf_file} -r irb/completion --noinspect"
141
- exec "#{irb_name} -r #{conf_file} --noinspect"
142
- exit
143
- end
144
-
145
- opts.on('--crawl', 'Crawl the application.') do
146
- @server = :webrick
147
- @spider = :crawl
148
- end
149
-
150
- opts.on('--render', 'Crawl the application and render all pages as static html files.') do
151
- @server = :webrick
152
- @spider = :render
153
- end
154
-
155
- opts.on_tail('-v', '--version', 'Show version.') do
156
- puts "Nitro #{Nitro::Version}"
157
- exit
158
- end
159
-
160
- opts.on_tail('-h', '--help', 'Show this message.') do
161
- puts opts
162
- exit
163
- end
164
-
165
- end
166
-
167
- parser.parse!(ARGV)
168
-
169
- return self
170
- end
171
-
172
- # Run the application in the declared execution mode,
173
- # using the passed configuration parameters.
174
-
175
- def run(conf)
176
- if conf.is_a?(Hash)
177
- conf = Conf.new(conf)
178
- end
179
-
180
- case @mode
181
- when :debug
182
- setup_debug(conf)
183
-
184
- when :stage
185
- setup_stage(conf)
186
-
187
- when :live
188
- setup_live(conf)
189
- end
190
-
191
- if 'fcgi_proc' == ENV['NITRO_INVOKE']
192
- invoke_fcgi_proc(conf)
193
- elsif 'cgi_proc' == ENV['NITRO_INVOKE']
194
- invoke_cgi_proc(conf)
195
- elsif 'irb' == ENV['NITRO_INVOKE']
196
- invoke_irb(conf)
197
- else
198
- invoke_server(conf)
199
- end
200
-
201
- end
202
-
203
- def setup_debug(conf)
204
- $DBG = true
205
- Rendering.reload = :full
206
- require 'glue/autoreload'
207
- autoreload(3)
208
- Caching.caching_enabled = false
209
- end
210
-
211
- def setup_stage(conf)
212
- $DBG = false
213
- Rendering.reload = false
214
- Logger.set(Logger.new('log/app.log'))
215
- end
216
-
217
- def setup_live(conf)
218
- $DBG = false
219
- Rendering.reload = false
220
- Logger.set(Logger.new('log/app.log'))
221
- end
222
- alias_method :setup_production, :setup_live
223
-
224
- def invoke_fcgi_proc(conf)
225
- require 'nitro/adapter/fastcgi'
226
- FastCGI.start(conf)
227
- end
228
-
229
- def invoke_cgi_proc(conf)
230
- require 'nitro/adapter/cgi'
231
- Cgi.start(conf)
232
- end
233
-
234
- def invoke_irb(conf)
235
- $conf = conf
236
- end
237
-
238
- def invoke_server(conf)
239
- spider_thread = nil
240
-
241
- case @action
242
- when :start
243
-
244
- case @spider
245
- when :render
246
- spider_thread = Thread.new do
247
- sleep(6)
248
- `wget -k -m -p #{conf.host}:#{conf.port} -directory-prefix=rendered`
249
- end
250
- when :crawl
251
- spider_thread = Thread.new do
252
- sleep(6)
253
- `wget -m --spider #{conf.host}:#{conf.port}`
254
- end
255
- end
256
-
257
- puts "\n==> Listening at #{conf.host}:#{conf.port}.\n\n"
258
-
259
- case @server
260
- when :webrick
261
- require 'nitro/adapter/webrick'
262
- Webrick.start(conf)
263
-
264
- when :lhttpd
265
- require 'nitro/adapter/fastcgi'
266
- `lighttpd -f conf/lhttpd.conf`
267
-
268
- when :apache
269
- require 'nitro/adapter/fastcgi'
270
- `apachectl -d #{Dir.pwd} -f conf/apache.conf -k start`
271
-
272
- when :cgi
273
- require 'nitro/adapter/cgi'
274
- end
275
-
276
- when :stop
277
-
278
- case @server
279
- when :webrick
280
-
281
- when :lhttpd
282
-
283
- when :apache
284
- `apachectl -d #{Dir.pwd} -f conf/apache.conf -k stop`
285
- end
286
-
287
- end
288
- end
289
-
290
- def daemonize
291
- require 'daemons/daemonize'
292
- pwd = Dir.pwd
293
- Daemonize.daemonize(File.join(pwd, 'log/app.log'))
294
- # Restore the original pwd (daemonize sets the
295
- # pwd to '/').
296
- Dir.chdir(pwd)
297
- # Set the logger to a file (daemonize closes the
298
- # std streams).
299
- Logger.set(Logger.new('log/app.log'))
300
- end
301
-
302
- # Helper method.
303
-
304
- def self.run(conf)
305
- runner = Runner.new.setup.run(conf)
306
- end
307
-
308
- end
309
-
310
- # Helper method to start applications.
311
- #
312
- # === Example
313
- #
314
- # Nitro.run do |conf|
315
- # conf.port = 8080
316
- # conf.template_root = 'root'
317
- # end
318
- #
319
- # Nitro.run do |conf|
320
- # conf.update(
321
- # :template_root => root,
322
- # :port => 8080
323
- # )
324
- # end
325
-
326
- def self.run(conf = nil)
327
- runner = Runner.new.setup
328
- runner.daemonize if runner.daemon
329
- conf ||= Conf.new({})
330
- $nitro_environment = conf
331
- yield(conf) if block_given?
332
- runner.run(conf)
333
- end
334
-
335
- #--
336
- # Experimental.
337
- #++
338
-
339
- def self.start(controller)
340
- # require 'glue/autoreload'
341
- # autoreload(3)
342
- Server.run(controller)
343
- end
344
-
345
- end
346
-
347
- # * George Moschovitis <gm@navel.gr>
348
- # * James Britt <james_b@neurogami.com>
data/lib/nitro/shaders.rb DELETED
@@ -1,206 +0,0 @@
1
- require 'nitro/template'
2
- require 'nitro/element'
3
-
4
- module Nitro
5
-
6
- # A shader defines a transformation-pipeline that tansforms
7
- # the .xhtml files to actual ruby code ready for evaluation
8
- # (compilation) by the engine.
9
- #
10
- # Shaders employ a folded-filter design.
11
- #--
12
- # TODO: pipeline stage mixin to be reused in filters too.
13
- #++
14
-
15
- class Shader
16
-
17
- # the next stage in the Shader pipeline.
18
-
19
- attr :next_stage
20
-
21
- def initialize(next_stage = nil)
22
- @next_stage = next_stage
23
- end
24
-
25
- # Process the text and optionally update the hash.
26
- # The hash is a short, unique representation of the
27
- # input text, typically used as a caching key.
28
-
29
- def process(hash, text)
30
- process_next(hash, text)
31
- end
32
-
33
- # Set the next stage of the pipeline.
34
-
35
- def << (next_stage = nil)
36
- @next_stage = next_stage
37
- return self
38
- end
39
-
40
- # Process the next stage of the pipeline.
41
-
42
- def process_next(hash, text)
43
- if @next_stage
44
- return @next_stage.process(hash, text)
45
- else
46
- return hash, text
47
- end
48
- end
49
- end
50
-
51
- # Convert the xhtml script to actual Ruby code, ready
52
- # to be evaluated.
53
-
54
- class RubyShader < Shader
55
- include TemplateMixin
56
-
57
- # Convert the xhtml script to actual Ruby code, ready
58
- # to be evaluated.
59
- #--
60
- # Investigate:
61
- # perhaps xl:href should be used to be XLink compatible?
62
- #++
63
-
64
- def process(hash, text)
65
- text = compile_template(text)
66
- process_next(hash, text)
67
- end
68
-
69
- # Loads and statically includes a file.
70
-
71
- def load_statically_included(filename)
72
- Logger.debug "Statically including '#{filename}'" if $DBG
73
-
74
- text = File.read(filename)
75
- text.gsub!(/<\?xml.*\?>/, '')
76
- text.gsub!(/<\/?root(.*?)>/m, ' ');
77
-
78
- return text
79
- end
80
-
81
- end
82
-
83
- # Apply an XSL transformation to the script code.
84
- # There is no need to keep post xsl. I can reuse the
85
- # same xsl by calling transform again.
86
-
87
- class XSLTShader < Shader
88
-
89
- # The name
90
-
91
- attr :name
92
-
93
- # The xslt filename.
94
-
95
- attr :xsl_filename
96
-
97
- # The xslt transformer.
98
-
99
- attr :xslt
100
-
101
- # Last modified time of the xslt.
102
-
103
- attr :mtime
104
-
105
- def initialize(xsl_filename, next_stage = nil)
106
-
107
- # leave this require here. only inlcude the xslt
108
- # library if the project needs it.
109
-
110
- require "xml/xslt"
111
-
112
- @name = File.basename(xsl_filename, '.*')
113
- @xsl_filename = xsl_filename
114
- @xslt = XML::XSLT.new
115
- @next_stage = next_stage
116
- end
117
-
118
- # Transform the given text.
119
-
120
- def process(hash, text)
121
- parse_xsl()
122
- @xslt.xml = text
123
- hash += @name
124
- Logger.debug "Applying xsl '#{@xsl_filename}' to template" if $DBG
125
- process_next(hash, xslt.serve)
126
- end
127
-
128
- private
129
-
130
- # Parse the xsl.
131
-
132
- def parse_xsl
133
- Logger.debug "Parsing xsl '#{@xsl_filename}'" if $DBG
134
- @mtime = File.mtime(@xsl_filename)
135
- @xslt.xsl = File.read(@xsl_filename)
136
- end
137
-
138
- end
139
-
140
- # Compress the inline xhtml. Does not touch the ruby code.
141
-
142
- class CompressShader < Shader
143
-
144
- # Compress the inline xhtml. Does not touch the ruby code.
145
-
146
- def process(hash, text)
147
- text.gsub!(/\@out \<\< \%\^(.*?)\^/m) do |match|
148
- c = $1.gsub(/^(\s*)/m, '').squeeze(" \t").tr("\n", '').tr("\t", ' ')
149
- "@out << %{#{c}}"
150
- end
151
-
152
- process_next(hash, text)
153
- end
154
-
155
- end
156
-
157
- # MorphingShader
158
-
159
- class MorphingShader < Shader
160
-
161
- def process(hash, text)
162
-
163
- # <tag if="x">..</tag>
164
- # <tag unless="x">..</tag>
165
-
166
- text.gsub!(/<(\w*?)([^>]*?)(if|unless)=["|'](.*?)["|'](.*?)>(.*?)<\/\1>/m) do |match|
167
- %{<?r #$3 #$4 ?>
168
- <#$1#$2#$5>#$6</#$1>
169
- <?r end ?>}
170
- end
171
-
172
- # <tag times="x">..</tag>
173
-
174
- text.gsub!(/<(\w*?)([^>]*?)times=["|'](.*?)["|'](.*?)>(.*?)<\/\1>/m) do |match|
175
- %{<?r #$3.times do ?>
176
- <#$1#$2#$4>#$5</#$1>
177
- <?r end ?>}
178
- end
179
-
180
- # <tag each="x">..</tag>
181
-
182
- text.gsub!(/<(\w*?)([^>]*?)each=["|'](.*?)["|'](.*?)>(.*?)<\/\1>/m) do |match|
183
- %{<?r for #$3 ?>
184
- <#$1#$2#$4>#$5</#$1>
185
- <?r end ?>}
186
- end
187
-
188
- process_next(hash, text)
189
- end
190
-
191
- end
192
-
193
- # ElementsShader
194
-
195
- class ElementsShader < Shader
196
-
197
- def process(hash, text)
198
- text = ElementProcessor.render(text)
199
- process_next(hash, text)
200
- end
201
-
202
- end
203
-
204
- end
205
-
206
- # * George Moschovitis <gm@navel.gr>