nitro 0.31.0 → 0.40.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 (174) hide show
  1. data/bin/nitro +135 -37
  2. data/doc/CHANGELOG.1 +108 -108
  3. data/doc/CHANGELOG.2 +89 -89
  4. data/doc/CHANGELOG.3 +105 -105
  5. data/{CHANGELOG → doc/CHANGELOG.4} +509 -509
  6. data/doc/{AUTHORS → CONTRIBUTORS} +49 -37
  7. data/doc/LIBRARIES +13 -0
  8. data/doc/LICENSE +2 -3
  9. data/doc/MIGRATION +45 -0
  10. data/doc/RELEASES +131 -11
  11. data/doc/TODO +67 -0
  12. data/lib/glue/magick.rb +0 -3
  13. data/lib/glue/sweeper.rb +30 -15
  14. data/lib/glue/thumbnails.rb +0 -2
  15. data/lib/glue/webfile.rb +23 -11
  16. data/lib/nitro.rb +37 -44
  17. data/lib/nitro/adapter/cgi.rb +0 -3
  18. data/lib/nitro/adapter/console.rb +0 -2
  19. data/lib/nitro/adapter/fastcgi.rb +6 -3
  20. data/lib/nitro/adapter/mongrel.rb +97 -58
  21. data/lib/nitro/adapter/script.rb +4 -6
  22. data/lib/nitro/adapter/webrick.rb +33 -87
  23. data/lib/nitro/adapter/webrick/vcr.rb +85 -0
  24. data/lib/nitro/caching.rb +0 -2
  25. data/lib/nitro/caching/actions.rb +0 -2
  26. data/lib/nitro/caching/fragments.rb +0 -2
  27. data/lib/nitro/caching/output.rb +45 -16
  28. data/lib/nitro/caching/proxy.rb +49 -0
  29. data/lib/nitro/cgi.rb +3 -6
  30. data/lib/nitro/cgi/cookie.rb +0 -3
  31. data/lib/nitro/cgi/request.rb +67 -24
  32. data/lib/nitro/cgi/response.rb +0 -2
  33. data/lib/nitro/cgi/{sendfile.rb → send_file.rb} +7 -6
  34. data/lib/nitro/compiler.rb +62 -55
  35. data/lib/nitro/compiler/cleanup.rb +0 -3
  36. data/lib/nitro/compiler/elements.rb +31 -28
  37. data/lib/nitro/compiler/errors.rb +2 -5
  38. data/lib/nitro/compiler/include.rb +10 -8
  39. data/lib/nitro/compiler/layout.rb +0 -2
  40. data/lib/nitro/compiler/localization.rb +0 -2
  41. data/lib/nitro/compiler/markup.rb +14 -6
  42. data/lib/nitro/compiler/morphing.rb +1 -5
  43. data/lib/nitro/compiler/script.rb +2 -4
  44. data/lib/nitro/compiler/squeeze.rb +0 -2
  45. data/lib/nitro/compiler/xslt.rb +0 -2
  46. data/lib/nitro/context.rb +10 -5
  47. data/lib/nitro/control.rb +18 -0
  48. data/lib/nitro/control/attribute.rb +88 -0
  49. data/lib/nitro/control/attribute/checkbox.rb +19 -0
  50. data/lib/nitro/control/attribute/datetime.rb +21 -0
  51. data/lib/nitro/control/attribute/file.rb +20 -0
  52. data/lib/nitro/control/attribute/fixnum.rb +26 -0
  53. data/lib/nitro/control/attribute/float.rb +26 -0
  54. data/lib/nitro/control/attribute/options.rb +38 -0
  55. data/lib/nitro/control/attribute/password.rb +16 -0
  56. data/lib/nitro/control/attribute/text.rb +16 -0
  57. data/lib/nitro/control/attribute/textarea.rb +16 -0
  58. data/lib/nitro/control/none.rb +16 -0
  59. data/lib/nitro/control/relation.rb +53 -0
  60. data/lib/nitro/control/relation/belongs_to.rb +0 -0
  61. data/lib/nitro/control/relation/has_many.rb +97 -0
  62. data/lib/nitro/control/relation/joins_many.rb +0 -0
  63. data/lib/nitro/control/relation/many_to_many.rb +0 -0
  64. data/lib/nitro/control/relation/refers_to.rb +29 -0
  65. data/lib/nitro/controller.rb +7 -296
  66. data/lib/nitro/dispatcher.rb +72 -34
  67. data/lib/nitro/element.rb +36 -10
  68. data/lib/nitro/element/javascript.rb +0 -2
  69. data/lib/nitro/flash.rb +23 -10
  70. data/lib/nitro/global.rb +36 -11
  71. data/lib/nitro/helper.rb +22 -8
  72. data/lib/nitro/helper/benchmark.rb +0 -2
  73. data/lib/nitro/helper/buffer.rb +0 -3
  74. data/lib/nitro/helper/css.rb +12 -0
  75. data/lib/nitro/helper/debug.rb +1 -3
  76. data/lib/nitro/helper/default.rb +1 -0
  77. data/lib/nitro/helper/feed.rb +400 -386
  78. data/lib/nitro/helper/form.rb +246 -116
  79. data/lib/nitro/helper/javascript.rb +28 -2
  80. data/lib/nitro/helper/javascript/morphing.rb +0 -2
  81. data/lib/nitro/helper/javascript/prototype.rb +0 -2
  82. data/lib/nitro/helper/javascript/scriptaculous.rb +0 -1
  83. data/lib/nitro/helper/layout.rb +0 -2
  84. data/lib/nitro/helper/navigation.rb +87 -0
  85. data/lib/nitro/helper/pager.rb +11 -22
  86. data/lib/nitro/helper/table.rb +9 -32
  87. data/lib/nitro/helper/url.rb +104 -0
  88. data/lib/nitro/helper/xhtml.rb +20 -4
  89. data/lib/nitro/helper/xml.rb +0 -2
  90. data/lib/nitro/markup.rb +131 -0
  91. data/lib/nitro/part.rb +52 -7
  92. data/lib/nitro/publishable.rb +328 -0
  93. data/lib/nitro/render.rb +30 -61
  94. data/lib/nitro/router.rb +12 -4
  95. data/lib/nitro/sanitize.rb +48 -0
  96. data/lib/nitro/scaffold.rb +9 -11
  97. data/lib/nitro/scaffold/controller.rb +25 -0
  98. data/lib/nitro/scaffold/model.rb +150 -0
  99. data/lib/nitro/scaffolding.rb +1 -3
  100. data/lib/nitro/server.rb +57 -32
  101. data/lib/nitro/server/drb.rb +16 -2
  102. data/lib/nitro/server/runner.rb +80 -102
  103. data/lib/nitro/service.rb +0 -1
  104. data/lib/nitro/service/xmlrpc.rb +0 -2
  105. data/lib/nitro/session.rb +26 -18
  106. data/lib/nitro/session/drb.rb +2 -16
  107. data/lib/nitro/session/memory.rb +0 -2
  108. data/lib/nitro/template.rb +219 -0
  109. data/lib/nitro/test/assertions.rb +1 -3
  110. data/lib/nitro/test/context.rb +0 -1
  111. data/lib/nitro/test/testcase.rb +0 -1
  112. data/lib/nitro/version.rb +6 -0
  113. data/lib/part/admin.rb +16 -0
  114. data/lib/part/admin/controller.rb +19 -0
  115. data/lib/part/admin/helper.rb +30 -0
  116. data/lib/part/admin/og/controller.rb +114 -0
  117. data/lib/part/admin/og/customize.rb +4 -0
  118. data/lib/part/admin/og/template/index.xhtml +27 -0
  119. data/lib/part/admin/og/template/list.xhtml +38 -0
  120. data/lib/part/admin/og/template/search.xhtml +20 -0
  121. data/lib/part/admin/og/template/update.xhtml +25 -0
  122. data/lib/part/admin/skin.rb +207 -0
  123. data/lib/part/admin/template/denied.xhtml +13 -0
  124. data/lib/part/admin/template/index.xhtml +12 -0
  125. data/lib/part/admin/todo.txt +2 -0
  126. data/proto/public/error.xhtml +4 -2
  127. data/proto/run.rb +0 -2
  128. data/test/glue/tc_webfile.rb +1 -0
  129. data/test/nitro/cgi/tc_request.rb +23 -0
  130. data/test/nitro/helper/tc_feed.rb +0 -3
  131. data/test/nitro/helper/tc_navbar.rb +74 -0
  132. data/test/nitro/helper/tc_table.rb +2 -0
  133. data/test/nitro/tc_cgi.rb +72 -19
  134. data/test/nitro/tc_controller.rb +35 -26
  135. data/test/nitro/tc_controller_aspect.rb +1 -0
  136. data/test/nitro/tc_controller_params.rb +864 -0
  137. data/test/nitro/tc_dispatcher.rb +2 -2
  138. data/test/nitro/tc_element.rb +16 -16
  139. data/test/nitro/tc_flash.rb +3 -3
  140. data/test/nitro/tc_markup.rb +31 -0
  141. data/test/nitro/tc_render.rb +12 -14
  142. data/test/nitro/tc_session.rb +9 -7
  143. data/test/nitro/tc_template.rb +34 -0
  144. metadata +217 -198
  145. data/INSTALL +0 -121
  146. data/ProjectInfo +0 -74
  147. data/README +0 -555
  148. data/doc/apache.txt +0 -9
  149. data/doc/config.txt +0 -28
  150. data/doc/faq.txt +0 -7
  151. data/doc/lhttpd.txt +0 -7
  152. data/lib/nitro/adapter/scgi.rb +0 -239
  153. data/lib/nitro/helper/form/builder.rb +0 -144
  154. data/lib/nitro/helper/form/controls.rb +0 -389
  155. data/lib/nitro/helper/rss.rb +0 -72
  156. data/proto/conf/apache.conf +0 -51
  157. data/proto/public/scaffold/advanced_search.xhtml +0 -30
  158. data/proto/public/scaffold/edit.xhtml +0 -11
  159. data/proto/public/scaffold/form.xhtml +0 -1
  160. data/proto/public/scaffold/index.xhtml +0 -20
  161. data/proto/public/scaffold/list.xhtml +0 -32
  162. data/proto/public/scaffold/new.xhtml +0 -11
  163. data/proto/public/scaffold/search.xhtml +0 -29
  164. data/proto/public/scaffold/view.xhtml +0 -8
  165. data/proto/script/scgi_ctl +0 -221
  166. data/proto/script/scgi_service +0 -128
  167. data/setup.rb +0 -1585
  168. data/src/part/admin.rb +0 -16
  169. data/src/part/admin/controller.rb +0 -81
  170. data/src/part/admin/skin.rb +0 -21
  171. data/src/part/admin/system.css +0 -135
  172. data/src/part/admin/template/denied.xhtml +0 -1
  173. data/src/part/admin/template/index.xhtml +0 -43
  174. data/test/nitro/helper/tc_rss.rb +0 -24
@@ -1,3 +1,6 @@
1
+ require 'cgi'
2
+ require 'facet/dictionary'
3
+
1
4
  module Nitro
2
5
 
3
6
  # Router mixin. Typically used to generate 'nice' urls.
@@ -38,6 +41,9 @@ module Nitro
38
41
  module Router
39
42
 
40
43
  # Strip the beginning of the path, used by cgi adapter.
44
+ #--
45
+ # gmosx: !?! remove!
46
+ #++
41
47
 
42
48
  setting :strip_path, :default => nil, :doc => 'Strip the beginning of the path, used by cgi adapter'
43
49
 
@@ -62,14 +68,18 @@ module Router
62
68
  # Returns false if no decoding is possible.
63
69
 
64
70
  def decode_route(url)
71
+ # Front end server (for example Apache) some times escape
72
+ # the url.
73
+ url = CGI.unescape(url)
74
+
65
75
  for rule in @rules
66
76
  if md = url.match(rule[:match])
67
77
  params = nil
68
78
  if param_names = rule[:params] || rule[:param]
69
79
  param_names = [ param_names ] unless param_names.is_a?(Array)
70
- params = {}
80
+ params = Dictionary.new
71
81
  md.captures.each_with_index do |val, idx|
72
- params[param_names[idx].to_s] = val
82
+ params << [param_names[idx].to_s, val]
73
83
  end
74
84
  end
75
85
  Logger.debug "Rewriting '#{url}' to '#{rule[:controller]}##{rule[:action]}(#{params.values.join(', ')})." if $DBG
@@ -119,5 +129,3 @@ module Router
119
129
  end
120
130
 
121
131
  end
122
-
123
- # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1,48 @@
1
+ # Code from rubyonrails project (http://www.rubyonrails.com)
2
+ # Temporarily here.
3
+
4
+ require 'html/tokenizer'
5
+ require 'html/node'
6
+
7
+ VERBOTEN_TAGS = %w(form script) unless defined?(VERBOTEN_TAGS)
8
+ VERBOTEN_ATTRS = /^on/i unless defined?(VERBOTEN_ATTRS)
9
+
10
+ class String
11
+ # Sanitizes the given HTML by making form and script tags into regular
12
+ # text, and removing all "onxxx" attributes (so that arbitrary Javascript
13
+ # cannot be executed). Also removes href attributes that start with
14
+ # "javascript:".
15
+ #
16
+ # Returns the sanitized text.
17
+ def self.sanitize(html)
18
+ # only do this if absolutely necessary
19
+ if html.index("<")
20
+ tokenizer = HTML::Tokenizer.new(html)
21
+ new_text = ""
22
+
23
+ while token = tokenizer.next
24
+ node = HTML::Node.parse(nil, 0, 0, token, false)
25
+ new_text << case node
26
+ when HTML::Tag
27
+ if VERBOTEN_TAGS.include?(node.name)
28
+ node.to_s.gsub(/</, "&lt;")
29
+ else
30
+ if node.closing != :close
31
+ node.attributes.delete_if { |attr,v| attr =~ VERBOTEN_ATTRS }
32
+ if node.attributes["href"] =~ /^javascript:/i
33
+ node.attributes.delete "href"
34
+ end
35
+ end
36
+ node.to_s
37
+ end
38
+ else
39
+ node.to_s.gsub(/</, "&lt;")
40
+ end
41
+ end
42
+
43
+ html = new_text
44
+ end
45
+
46
+ html
47
+ end
48
+ end
@@ -44,9 +44,9 @@ module Scaffold
44
44
  def enchant_class klass
45
45
  # to_s
46
46
 
47
- if klass.respond_to? :title
47
+ if klass.instance_methods.include? 'title'
48
48
  define_instance_method klass, :to_s, %{ title }, force = true
49
- elsif klass.respond_to? :name
49
+ elsif klass.instance_methods.include? 'name'
50
50
  define_instance_method klass, :to_s, %{ name }, force = true
51
51
  end
52
52
 
@@ -54,7 +54,7 @@ module Scaffold
54
54
  # ex: blog/articles/23
55
55
 
56
56
  define_instance_method klass, :to_href, %{
57
- "\#{self.class.ann.self.controller.mount_path}/\#{self.class.name.underscore.pluralize}/\#{oid}"
57
+ "\#{self.class.ann.self.controller.mount_path}/\#{self.class.name.demodulize.underscore.pluralize}/\#{oid}"
58
58
  }
59
59
 
60
60
  # to_link
@@ -68,7 +68,7 @@ module Scaffold
68
68
  # ex: admin/articles/edit/23
69
69
 
70
70
  define_instance_method klass, :to_admin_href, %{
71
- "\#{AdminController.mount_path}/\#{self.class.name.underscore.pluralize}/edit/\#{oid}"
71
+ "\#{AdminController.mount_path}/\#{self.class.name.underscore.gsub(/::/, '_').pluralize}/edit/\#{oid}"
72
72
  }
73
73
 
74
74
  if defined? AdminController
@@ -76,14 +76,14 @@ module Scaffold
76
76
  # ex: admin/articles/list
77
77
 
78
78
  define_instance_method klass, :to_admin_href, %{
79
- "\#{AdminController.mount_path}/\#{self.class.name.underscore.pluralize}/list"
79
+ "\#{AdminController.mount_path}/\#{self.class.name.underscore.gsub(/::/, '_').pluralize}/list"
80
80
  }
81
81
 
82
82
  # to_admin_href
83
83
  # ex: admin/articles/list
84
84
 
85
85
  define_class_method klass, :to_admin_href, %{
86
- "\#{AdminController.mount_path}/\#{self.name.underscore.pluralize}/list"
86
+ "\#{AdminController.mount_path}/\#{self.name.underscore.gsub(/::/, '_').pluralize}/list"
87
87
  }
88
88
  end
89
89
  end
@@ -97,7 +97,7 @@ module Scaffold
97
97
  #++
98
98
 
99
99
  def define_instance_method klass, meth, body, force = false
100
- unless force or klass.instance_methods.include? meth.to_s
100
+ if force or (!klass.instance_methods.include? meth.to_s)
101
101
  klass.module_eval %{
102
102
  def #{meth}
103
103
  #{body}
@@ -112,8 +112,8 @@ module Scaffold
112
112
  # does not already respond to it.
113
113
  #++
114
114
 
115
- def define_class_method klass, meth, body
116
- unless klass.respond_to? meth.to_s
115
+ def define_class_method klass, meth, body, force = false
116
+ if force or (!klass.respond_to? meth.to_s)
117
117
  klass.module_eval %{
118
118
  def self.#{meth}
119
119
  #{body}
@@ -137,5 +137,3 @@ module Scaffold
137
137
  end
138
138
 
139
139
  end
140
-
141
- # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1,25 @@
1
+ module Nitro
2
+
3
+ module Scaffold
4
+
5
+ # Automatically creates a scaffold controller to handle the
6
+ # given models.
7
+
8
+ def self.controller(*models)
9
+ for m in models
10
+ scaffold_controller(m)
11
+ end
12
+ end
13
+
14
+ def self.enchant_controller(model)
15
+ eval %{
16
+
17
+ }
18
+ end
19
+
20
+ end
21
+
22
+ class Controller
23
+ end
24
+
25
+ end
@@ -0,0 +1,150 @@
1
+ module Nitro
2
+
3
+ # Scaffolding is one facet of Nitro's Rapid Application
4
+ # Develpoment (RAD) features. The scaffolder automatically
5
+ # generates common code for managed object and their
6
+ # controllers.
7
+
8
+ module Scaffold
9
+
10
+ # Automatically enchant all models ?
11
+
12
+ setting :enchant_all_models, :default => true, :doc => 'Automatically enchant all models?'
13
+
14
+ # 'Enchant' a model class (typically a managed class,
15
+ # entity). A collection of useful methods are magically
16
+ # added to the class and/or the class instances.
17
+ #
18
+ # * to_s
19
+ # * to_href
20
+ # * to_link
21
+ # * to_edit_href
22
+ # * to_admin_href
23
+ #--
24
+ # to_xxx is used instead of xxx in an attempt to avoid
25
+ # colisions with user defined methods.
26
+ #++
27
+
28
+ def self.model(*classes)
29
+ for c in classes
30
+ enchant_model c
31
+ end
32
+ end
33
+
34
+ #--
35
+ # Actually enchant the given class. Override this method
36
+ # to customize for your application. The string calculation
37
+ # code is deliberatly dynamic to work with Ruby's OO
38
+ # features.
39
+ #++
40
+
41
+ def self.enchant_model(klass)
42
+ # Find the controller that handles this model. Unless no
43
+ # controller annotation is defined, try to find a controller
44
+ # of the form: Model::Controller. Some examples:
45
+ #
46
+ # class Ticket
47
+ # ann self, :controller => SpecialTicketController
48
+ # ..
49
+ # end
50
+ #
51
+ # or try to find a Ticket::Controller class.
52
+
53
+ controller = klass.ann.self[:controller] || klass.constant('Controller')
54
+
55
+ # If the class defines a text_key use it to create more
56
+ # readable (and SEO friendly) urls.
57
+
58
+ key = klass.ann.self[:text_key] || 'oid'
59
+
60
+ # to_s
61
+
62
+ if klass.instance_methods.include? 'title'
63
+ define_instance_method klass, :to_s, %{ title }, force = true
64
+ elsif klass.instance_methods.include? 'name'
65
+ define_instance_method klass, :to_s, %{ name }, force = true
66
+ end
67
+
68
+ # to_href
69
+ # ex: /articles/23
70
+
71
+ define_instance_method klass, :to_href, %{
72
+ "\#{#{controller}.mount_path}/read/\#{#{key}}".squeeze('/')
73
+ }
74
+
75
+ # to_link
76
+ # ex: <a href="/articles/23">The article's title</a>
77
+
78
+ define_instance_method klass, :to_link, %{
79
+ %|<a href="\#{to_href}">\#{to_s}</a>|
80
+ }
81
+
82
+ # to_link
83
+ # ex: <a href="/articles/23">The article's title</a>
84
+
85
+ define_class_method klass, :controller, %{
86
+ #{controller}
87
+ }
88
+
89
+ if defined? OgSystemController
90
+ self.extend(OgSystemHelper)
91
+
92
+ # to_edit_href
93
+ # ex: admin/update/Article/23
94
+
95
+ define_instance_method klass, :to_edit_href, %{
96
+ "\#{OgSystemController.mount_path}/update/#{class_to_name(klass)}/\#{oid}"
97
+ }
98
+
99
+ # to_admin_href
100
+ # ex: admin/list/Article
101
+
102
+ define_instance_method klass, :to_admin_href, %{
103
+ "\#{AdminController.mount_path}/list/#{class_to_name(klass)}"
104
+ }
105
+
106
+ # to_admin_href
107
+ # ex: admin/list/Article
108
+
109
+ define_class_method klass, :to_admin_href, %{
110
+ "\#{AdminController.mount_path}/list/#{class_to_name(klass)}"
111
+ }
112
+ end
113
+ end
114
+
115
+
116
+ #--
117
+ # This helper defines an instance method for the
118
+ # scaffolded class. The method is only defined if the klass
119
+ # does not already respond to it.
120
+ #++
121
+
122
+ def self.define_instance_method(klass, meth, body, force = false)
123
+ if force or (!klass.instance_methods.include? meth.to_s)
124
+ klass.module_eval %{
125
+ def #{meth}
126
+ #{body}
127
+ end
128
+ }
129
+ end
130
+ end
131
+
132
+ #--
133
+ # This helper defines an class method for the
134
+ # scaffolded class. The method is only defined if the klass
135
+ # does not already respond to it.
136
+ #++
137
+
138
+ def self.define_class_method(klass, meth, body, force = false)
139
+ if force or (!klass.respond_to? meth.to_s)
140
+ klass.module_eval %{
141
+ def self.#{meth}
142
+ #{body}
143
+ end
144
+ }
145
+ end
146
+ end
147
+
148
+ end
149
+
150
+ end
@@ -261,7 +261,7 @@ module Scaffolding
261
261
  end
262
262
 
263
263
  def action_path(sym)
264
- action = "#{@base}/#{sym}"
264
+ action = "#{AdminController.mount_path}/#{@base}/#{sym}"
265
265
  action << @suffix unless @suffix.nil? or sym == :index
266
266
  return action
267
267
  end
@@ -389,5 +389,3 @@ module Scaffolding
389
389
  end
390
390
 
391
391
  end
392
-
393
- # * George Moschovitis <gm@navel.gr>
@@ -11,11 +11,11 @@ class Server
11
11
 
12
12
  # The server listening port.
13
13
 
14
- setting :port, :default => 9999, :doc => 'The server listening port'
14
+ setting :port, :default => 9000, :doc => 'The server listening port'
15
15
 
16
- # The map.
16
+ # The controller map.
17
17
 
18
- setting :map, :default => { '/' => Controller }, :doc => 'The server map'
18
+ setting :controller_map, :default => { '/' => Controller }, :doc => 'The controller map'
19
19
 
20
20
  # The public files root directory.
21
21
 
@@ -28,8 +28,16 @@ class Server
28
28
  # Additional server options. Useful to pass options to
29
29
  # Webrick for example.
30
30
 
31
- setting :options, :default => {}, :doc => "Additional server options"
31
+ setting :options, :default => {}, :doc => 'Additional server options'
32
32
 
33
+ # Handle static files? Typically this setting is true while
34
+ # debuging and when the server is running in stand alone mode.
35
+ # In production environments, the webapplication runs behind
36
+ # a front end proxy (for example apache, lighttpd, etc) that
37
+ # should handle static files.
38
+
39
+ setting :handle_static_files, :default => true, :doc => 'Handle static files?'
40
+
33
41
  # The name of the application.
34
42
 
35
43
  attr_accessor :name
@@ -87,7 +95,8 @@ class Server
87
95
  def start(options = {})
88
96
  @map['/'] = options[:controller] if options[:controller]
89
97
  @dispatcher = options[:dispatcher] || Dispatcher.new(@map)
90
-
98
+ @dispatcher.server = self
99
+
91
100
  return self
92
101
  end
93
102
 
@@ -99,37 +108,53 @@ class Server
99
108
  Mounter.new(self)
100
109
  end
101
110
 
102
- # Helper method.
103
- #
104
- # Available options:
105
- #
106
- # :dispatcher, :controller
107
- #
108
- # Altetnatively you can pass a single Controller class instead
109
- # of the options hash.
110
-
111
- def self.run(options = {})
112
- unless options.is_a?(Hash)
113
- options = { :controller => options }
111
+ class << self
112
+
113
+ # Helper to set the default controller map for a Server.
114
+
115
+ def map(ctrl_map = nil)
116
+ unless ctrl_map
117
+ Server.controller_map
118
+ else
119
+ Server.controller_map ||= {}
120
+ Server.controller_map.update(ctrl_map)
121
+ end
114
122
  end
123
+ alias map= map
124
+
125
+ # Helper method.
126
+ #
127
+ # Available options:
128
+ #
129
+ # :dispatcher, :controller
130
+ #
131
+ # Altetnatively you can pass a single Controller class instead
132
+ # of the options hash.
133
+
134
+ def run(options = {})
135
+ unless options.is_a?(Hash)
136
+ options = { :controller => options }
137
+ end
115
138
 
116
- runner = Runner.new
117
- runner.setup_options
118
- runner.setup_mode
119
- runner.daemonize if runner.daemon
120
-
121
- unless Session.cache
122
- require 'nitro/session/memory'
139
+ runner = Runner.new
140
+ runner.setup_options
141
+ runner.setup_mode
142
+ runner.daemonize if runner.daemon
143
+
144
+ Global.setup
145
+ Session.setup
146
+ Part.setup
147
+
148
+ server = Server.new
149
+ server.start(options)
150
+
151
+ runner.invoke(server) unless $NITRO_NO_INVOKE
152
+
153
+ return server
123
154
  end
124
-
125
- server = Server.new
126
- server.start(options)
127
-
128
- runner.invoke(server) unless $NITRO_NO_INVOKE
129
-
130
- return server
155
+
131
156
  end
132
-
157
+
133
158
  # A Helper class used for CherryPy-style publishing.
134
159
 
135
160
  class Mounter # :nodoc: all