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.
- data/bin/nitro +135 -37
- data/doc/CHANGELOG.1 +108 -108
- data/doc/CHANGELOG.2 +89 -89
- data/doc/CHANGELOG.3 +105 -105
- data/{CHANGELOG → doc/CHANGELOG.4} +509 -509
- data/doc/{AUTHORS → CONTRIBUTORS} +49 -37
- data/doc/LIBRARIES +13 -0
- data/doc/LICENSE +2 -3
- data/doc/MIGRATION +45 -0
- data/doc/RELEASES +131 -11
- data/doc/TODO +67 -0
- data/lib/glue/magick.rb +0 -3
- data/lib/glue/sweeper.rb +30 -15
- data/lib/glue/thumbnails.rb +0 -2
- data/lib/glue/webfile.rb +23 -11
- data/lib/nitro.rb +37 -44
- data/lib/nitro/adapter/cgi.rb +0 -3
- data/lib/nitro/adapter/console.rb +0 -2
- data/lib/nitro/adapter/fastcgi.rb +6 -3
- data/lib/nitro/adapter/mongrel.rb +97 -58
- data/lib/nitro/adapter/script.rb +4 -6
- data/lib/nitro/adapter/webrick.rb +33 -87
- data/lib/nitro/adapter/webrick/vcr.rb +85 -0
- data/lib/nitro/caching.rb +0 -2
- data/lib/nitro/caching/actions.rb +0 -2
- data/lib/nitro/caching/fragments.rb +0 -2
- data/lib/nitro/caching/output.rb +45 -16
- data/lib/nitro/caching/proxy.rb +49 -0
- data/lib/nitro/cgi.rb +3 -6
- data/lib/nitro/cgi/cookie.rb +0 -3
- data/lib/nitro/cgi/request.rb +67 -24
- data/lib/nitro/cgi/response.rb +0 -2
- data/lib/nitro/cgi/{sendfile.rb → send_file.rb} +7 -6
- data/lib/nitro/compiler.rb +62 -55
- data/lib/nitro/compiler/cleanup.rb +0 -3
- data/lib/nitro/compiler/elements.rb +31 -28
- data/lib/nitro/compiler/errors.rb +2 -5
- data/lib/nitro/compiler/include.rb +10 -8
- data/lib/nitro/compiler/layout.rb +0 -2
- data/lib/nitro/compiler/localization.rb +0 -2
- data/lib/nitro/compiler/markup.rb +14 -6
- data/lib/nitro/compiler/morphing.rb +1 -5
- data/lib/nitro/compiler/script.rb +2 -4
- data/lib/nitro/compiler/squeeze.rb +0 -2
- data/lib/nitro/compiler/xslt.rb +0 -2
- data/lib/nitro/context.rb +10 -5
- data/lib/nitro/control.rb +18 -0
- data/lib/nitro/control/attribute.rb +88 -0
- data/lib/nitro/control/attribute/checkbox.rb +19 -0
- data/lib/nitro/control/attribute/datetime.rb +21 -0
- data/lib/nitro/control/attribute/file.rb +20 -0
- data/lib/nitro/control/attribute/fixnum.rb +26 -0
- data/lib/nitro/control/attribute/float.rb +26 -0
- data/lib/nitro/control/attribute/options.rb +38 -0
- data/lib/nitro/control/attribute/password.rb +16 -0
- data/lib/nitro/control/attribute/text.rb +16 -0
- data/lib/nitro/control/attribute/textarea.rb +16 -0
- data/lib/nitro/control/none.rb +16 -0
- data/lib/nitro/control/relation.rb +53 -0
- data/lib/nitro/control/relation/belongs_to.rb +0 -0
- data/lib/nitro/control/relation/has_many.rb +97 -0
- data/lib/nitro/control/relation/joins_many.rb +0 -0
- data/lib/nitro/control/relation/many_to_many.rb +0 -0
- data/lib/nitro/control/relation/refers_to.rb +29 -0
- data/lib/nitro/controller.rb +7 -296
- data/lib/nitro/dispatcher.rb +72 -34
- data/lib/nitro/element.rb +36 -10
- data/lib/nitro/element/javascript.rb +0 -2
- data/lib/nitro/flash.rb +23 -10
- data/lib/nitro/global.rb +36 -11
- data/lib/nitro/helper.rb +22 -8
- data/lib/nitro/helper/benchmark.rb +0 -2
- data/lib/nitro/helper/buffer.rb +0 -3
- data/lib/nitro/helper/css.rb +12 -0
- data/lib/nitro/helper/debug.rb +1 -3
- data/lib/nitro/helper/default.rb +1 -0
- data/lib/nitro/helper/feed.rb +400 -386
- data/lib/nitro/helper/form.rb +246 -116
- data/lib/nitro/helper/javascript.rb +28 -2
- data/lib/nitro/helper/javascript/morphing.rb +0 -2
- data/lib/nitro/helper/javascript/prototype.rb +0 -2
- data/lib/nitro/helper/javascript/scriptaculous.rb +0 -1
- data/lib/nitro/helper/layout.rb +0 -2
- data/lib/nitro/helper/navigation.rb +87 -0
- data/lib/nitro/helper/pager.rb +11 -22
- data/lib/nitro/helper/table.rb +9 -32
- data/lib/nitro/helper/url.rb +104 -0
- data/lib/nitro/helper/xhtml.rb +20 -4
- data/lib/nitro/helper/xml.rb +0 -2
- data/lib/nitro/markup.rb +131 -0
- data/lib/nitro/part.rb +52 -7
- data/lib/nitro/publishable.rb +328 -0
- data/lib/nitro/render.rb +30 -61
- data/lib/nitro/router.rb +12 -4
- data/lib/nitro/sanitize.rb +48 -0
- data/lib/nitro/scaffold.rb +9 -11
- data/lib/nitro/scaffold/controller.rb +25 -0
- data/lib/nitro/scaffold/model.rb +150 -0
- data/lib/nitro/scaffolding.rb +1 -3
- data/lib/nitro/server.rb +57 -32
- data/lib/nitro/server/drb.rb +16 -2
- data/lib/nitro/server/runner.rb +80 -102
- data/lib/nitro/service.rb +0 -1
- data/lib/nitro/service/xmlrpc.rb +0 -2
- data/lib/nitro/session.rb +26 -18
- data/lib/nitro/session/drb.rb +2 -16
- data/lib/nitro/session/memory.rb +0 -2
- data/lib/nitro/template.rb +219 -0
- data/lib/nitro/test/assertions.rb +1 -3
- data/lib/nitro/test/context.rb +0 -1
- data/lib/nitro/test/testcase.rb +0 -1
- data/lib/nitro/version.rb +6 -0
- data/lib/part/admin.rb +16 -0
- data/lib/part/admin/controller.rb +19 -0
- data/lib/part/admin/helper.rb +30 -0
- data/lib/part/admin/og/controller.rb +114 -0
- data/lib/part/admin/og/customize.rb +4 -0
- data/lib/part/admin/og/template/index.xhtml +27 -0
- data/lib/part/admin/og/template/list.xhtml +38 -0
- data/lib/part/admin/og/template/search.xhtml +20 -0
- data/lib/part/admin/og/template/update.xhtml +25 -0
- data/lib/part/admin/skin.rb +207 -0
- data/lib/part/admin/template/denied.xhtml +13 -0
- data/lib/part/admin/template/index.xhtml +12 -0
- data/lib/part/admin/todo.txt +2 -0
- data/proto/public/error.xhtml +4 -2
- data/proto/run.rb +0 -2
- data/test/glue/tc_webfile.rb +1 -0
- data/test/nitro/cgi/tc_request.rb +23 -0
- data/test/nitro/helper/tc_feed.rb +0 -3
- data/test/nitro/helper/tc_navbar.rb +74 -0
- data/test/nitro/helper/tc_table.rb +2 -0
- data/test/nitro/tc_cgi.rb +72 -19
- data/test/nitro/tc_controller.rb +35 -26
- data/test/nitro/tc_controller_aspect.rb +1 -0
- data/test/nitro/tc_controller_params.rb +864 -0
- data/test/nitro/tc_dispatcher.rb +2 -2
- data/test/nitro/tc_element.rb +16 -16
- data/test/nitro/tc_flash.rb +3 -3
- data/test/nitro/tc_markup.rb +31 -0
- data/test/nitro/tc_render.rb +12 -14
- data/test/nitro/tc_session.rb +9 -7
- data/test/nitro/tc_template.rb +34 -0
- metadata +217 -198
- data/INSTALL +0 -121
- data/ProjectInfo +0 -74
- data/README +0 -555
- data/doc/apache.txt +0 -9
- data/doc/config.txt +0 -28
- data/doc/faq.txt +0 -7
- data/doc/lhttpd.txt +0 -7
- data/lib/nitro/adapter/scgi.rb +0 -239
- data/lib/nitro/helper/form/builder.rb +0 -144
- data/lib/nitro/helper/form/controls.rb +0 -389
- data/lib/nitro/helper/rss.rb +0 -72
- data/proto/conf/apache.conf +0 -51
- data/proto/public/scaffold/advanced_search.xhtml +0 -30
- data/proto/public/scaffold/edit.xhtml +0 -11
- data/proto/public/scaffold/form.xhtml +0 -1
- data/proto/public/scaffold/index.xhtml +0 -20
- data/proto/public/scaffold/list.xhtml +0 -32
- data/proto/public/scaffold/new.xhtml +0 -11
- data/proto/public/scaffold/search.xhtml +0 -29
- data/proto/public/scaffold/view.xhtml +0 -8
- data/proto/script/scgi_ctl +0 -221
- data/proto/script/scgi_service +0 -128
- data/setup.rb +0 -1585
- data/src/part/admin.rb +0 -16
- data/src/part/admin/controller.rb +0 -81
- data/src/part/admin/skin.rb +0 -21
- data/src/part/admin/system.css +0 -135
- data/src/part/admin/template/denied.xhtml +0 -1
- data/src/part/admin/template/index.xhtml +0 -43
- data/test/nitro/helper/tc_rss.rb +0 -24
data/lib/nitro/router.rb
CHANGED
|
@@ -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
|
|
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(/</, "<")
|
|
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(/</, "<")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
html = new_text
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
html
|
|
47
|
+
end
|
|
48
|
+
end
|
data/lib/nitro/scaffold.rb
CHANGED
|
@@ -44,9 +44,9 @@ module Scaffold
|
|
|
44
44
|
def enchant_class klass
|
|
45
45
|
# to_s
|
|
46
46
|
|
|
47
|
-
if klass.
|
|
47
|
+
if klass.instance_methods.include? 'title'
|
|
48
48
|
define_instance_method klass, :to_s, %{ title }, force = true
|
|
49
|
-
elsif klass.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
data/lib/nitro/scaffolding.rb
CHANGED
|
@@ -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>
|
data/lib/nitro/server.rb
CHANGED
|
@@ -11,11 +11,11 @@ class Server
|
|
|
11
11
|
|
|
12
12
|
# The server listening port.
|
|
13
13
|
|
|
14
|
-
setting :port, :default =>
|
|
14
|
+
setting :port, :default => 9000, :doc => 'The server listening port'
|
|
15
15
|
|
|
16
|
-
# The map.
|
|
16
|
+
# The controller map.
|
|
17
17
|
|
|
18
|
-
setting :
|
|
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 =>
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|