nitro 0.8.0 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (198) hide show
  1. data/AUTHORS +3 -4
  2. data/ChangeLog +418 -0
  3. data/LICENSE +1 -1
  4. data/README +157 -89
  5. data/RELEASES +50 -0
  6. data/Rakefile +5 -7
  7. data/benchmark/nitro/bench.rb +5 -0
  8. data/benchmark/nitro/simple-webrick-n-200.txt +44 -0
  9. data/benchmark/nitro/static-webrick-n-200.txt +43 -0
  10. data/benchmark/nitro/tiny-lhttpd-n-200-c-5.txt +43 -0
  11. data/benchmark/nitro/tiny-webrick-n-200-c-5.txt +44 -0
  12. data/benchmark/nitro/tiny-webrick-n-200.txt +44 -0
  13. data/benchmark/nitro/tiny2-webrick-n-200.txt +44 -0
  14. data/{lib/nitro/server/cluster.rb → bin/cluster} +26 -30
  15. data/bin/proto/README +2 -2
  16. data/bin/proto/{apache.conf → conf/apache.conf} +0 -0
  17. data/bin/proto/conf/app.conf.rb +22 -0
  18. data/bin/proto/conf/lhttpd.conf +236 -0
  19. data/bin/proto/ctl +4 -0
  20. data/bin/proto/lib/README +5 -0
  21. data/bin/proto/log/README +3 -0
  22. data/bin/proto/root/fcgi.rb +6 -0
  23. data/bin/proto/root/index.xhtml +65 -7
  24. data/bin/proto/root/m/nitro.png +0 -0
  25. data/examples/blog/README +7 -5
  26. data/examples/blog/{apache.conf → conf/apache.conf} +0 -0
  27. data/examples/blog/conf/app.conf.rb +56 -0
  28. data/examples/blog/conf/lhttpd.conf +236 -0
  29. data/examples/blog/ctl +4 -0
  30. data/examples/blog/lib/blog.rb +11 -136
  31. data/examples/blog/lib/blog/controller.rb +99 -0
  32. data/examples/blog/lib/blog/model.rb +39 -0
  33. data/examples/blog/log/README +3 -0
  34. data/examples/blog/root/comments.xhtml +2 -2
  35. data/examples/blog/root/fcgi.rb +6 -0
  36. data/examples/blog/root/index.xhtml +4 -5
  37. data/examples/blog/root/login.xhtml +2 -2
  38. data/examples/blog/root/style.xsl +9 -9
  39. data/examples/blog/root/view_entry.xhtml +2 -2
  40. data/examples/flash/conf/app.conf.rb +23 -0
  41. data/examples/flash/ctl +4 -0
  42. data/examples/flash/log/README +3 -0
  43. data/examples/flash/root/index.xhtml +0 -9
  44. data/examples/flash/root/show_inline_text.xhtml +10 -5
  45. data/examples/no_xsl_blog/README +12 -0
  46. data/examples/no_xsl_blog/conf/apache.conf +0 -0
  47. data/examples/no_xsl_blog/conf/app.conf.rb +57 -0
  48. data/examples/no_xsl_blog/conf/lhttpd.conf +236 -0
  49. data/examples/no_xsl_blog/ctl +4 -0
  50. data/examples/no_xsl_blog/lib/blog.rb +20 -0
  51. data/examples/no_xsl_blog/lib/blog/controller.rb +102 -0
  52. data/examples/no_xsl_blog/lib/blog/model.rb +39 -0
  53. data/examples/no_xsl_blog/lib/blog/template.rb +134 -0
  54. data/examples/no_xsl_blog/log/README +3 -0
  55. data/examples/no_xsl_blog/root/comments.xhtml +41 -0
  56. data/examples/no_xsl_blog/root/entry_form.xhtml +22 -0
  57. data/examples/no_xsl_blog/root/fcgi.rb +6 -0
  58. data/examples/no_xsl_blog/root/index.xhtml +39 -0
  59. data/examples/no_xsl_blog/root/login.xhtml +21 -0
  60. data/examples/no_xsl_blog/root/m/bubbles.gif +0 -0
  61. data/examples/no_xsl_blog/root/m/comments_curve.gif +0 -0
  62. data/examples/no_xsl_blog/root/m/down.gif +0 -0
  63. data/examples/no_xsl_blog/root/m/footer_bg.gif +0 -0
  64. data/examples/no_xsl_blog/root/m/garrow.gif +0 -0
  65. data/examples/no_xsl_blog/root/m/gbull.gif +0 -0
  66. data/examples/no_xsl_blog/root/m/grbull.gif +0 -0
  67. data/examples/no_xsl_blog/root/m/h1_bg.gif +0 -0
  68. data/examples/no_xsl_blog/root/m/header_bg.gif +0 -0
  69. data/examples/no_xsl_blog/root/m/nitro.gif +0 -0
  70. data/examples/no_xsl_blog/root/m/obull.gif +0 -0
  71. data/examples/no_xsl_blog/root/m/page_bg.gif +0 -0
  72. data/examples/no_xsl_blog/root/m/rss.gif +0 -0
  73. data/examples/no_xsl_blog/root/m/side_title_bg.gif +0 -0
  74. data/examples/no_xsl_blog/root/m/sidebar_bg.gif +0 -0
  75. data/examples/no_xsl_blog/root/recent_posts.xhtml +14 -0
  76. data/examples/no_xsl_blog/root/style.css +301 -0
  77. data/examples/no_xsl_blog/root/view_entry.xhtml +25 -0
  78. data/examples/no_xsl_blog/root/view_entry.xml +12 -0
  79. data/examples/og/run.rb +2 -2
  80. data/examples/tiny/README +2 -2
  81. data/examples/tiny/conf/apache.conf +5 -0
  82. data/examples/tiny/conf/app.conf.rb +21 -0
  83. data/examples/tiny/conf/lhttpd.conf +236 -0
  84. data/examples/tiny/ctl +4 -0
  85. data/examples/tiny/log/README +3 -0
  86. data/examples/tiny/root/fcgi.rb +6 -0
  87. data/examples/tiny/root/index.xhtml +7 -4
  88. data/examples/tiny/root/nitro.png +0 -0
  89. data/lib/glue.rb +13 -9
  90. data/lib/glue/array.rb +1 -1
  91. data/lib/glue/cache.rb +1 -1
  92. data/lib/glue/flexob.rb +12 -0
  93. data/lib/glue/hash.rb +1 -1
  94. data/lib/glue/inflector.rb +2 -2
  95. data/lib/glue/logger.rb +4 -8
  96. data/lib/glue/misc.rb +14 -0
  97. data/lib/glue/number.rb +1 -1
  98. data/lib/glue/object.rb +26 -0
  99. data/lib/glue/pool.rb +1 -1
  100. data/lib/glue/property.rb +84 -91
  101. data/lib/glue/string.rb +1 -1
  102. data/lib/glue/time.rb +1 -1
  103. data/lib/glue/validation.rb +1 -1
  104. data/lib/nitro.rb +18 -6
  105. data/lib/nitro/adaptors/cgi.rb +291 -0
  106. data/lib/nitro/adaptors/fastcgi.rb +42 -0
  107. data/lib/nitro/adaptors/runner.rb +123 -0
  108. data/lib/nitro/adaptors/webrick.rb +110 -0
  109. data/lib/nitro/buffering.rb +43 -0
  110. data/lib/nitro/builders/form.rb +1 -1
  111. data/lib/nitro/builders/rss.rb +1 -1
  112. data/{bin → lib/nitro}/cluster.rb +26 -30
  113. data/lib/nitro/context.rb +82 -0
  114. data/lib/nitro/controller.rb +50 -0
  115. data/lib/nitro/cookie.rb +46 -0
  116. data/lib/nitro/dispatcher.rb +105 -0
  117. data/lib/nitro/filters.rb +9 -10
  118. data/lib/nitro/localization.rb +42 -0
  119. data/lib/nitro/mail.rb +11 -14
  120. data/lib/nitro/render.rb +275 -0
  121. data/lib/nitro/request.rb +128 -0
  122. data/lib/nitro/response.rb +38 -0
  123. data/lib/nitro/scaffold.rb +11 -11
  124. data/lib/nitro/session.rb +84 -0
  125. data/lib/nitro/{server/shaders.rb → shaders.rb} +56 -36
  126. data/lib/nitro/ui/pager.rb +23 -26
  127. data/lib/nitro/{sitemap.rb → ui/sitemap.rb} +4 -12
  128. data/lib/nitro/uri.rb +1 -1
  129. data/lib/nitro/version.rb +10 -8
  130. data/lib/og.rb +66 -65
  131. data/lib/og/backend.rb +1 -1
  132. data/lib/og/backends/mysql.rb +48 -52
  133. data/lib/og/backends/psql.rb +34 -37
  134. data/lib/og/connection.rb +15 -15
  135. data/lib/og/enchant.rb +16 -9
  136. data/lib/og/meta.rb +127 -54
  137. data/lib/og/mock.rb +18 -18
  138. data/lib/og/version.rb +6 -4
  139. data/lib/parts/content.rb +4 -8
  140. data/test/glue/tc_logger.rb +3 -0
  141. data/test/glue/tc_property.rb +19 -3
  142. data/test/nitro/adaptors/tc_cgi.rb +63 -0
  143. data/test/nitro/adaptors/tc_webrick.rb +15 -0
  144. data/test/nitro/builders/tc_xml.rb +2 -2
  145. data/test/nitro/tc_context.rb +13 -0
  146. data/test/nitro/tc_controller.rb +47 -0
  147. data/test/nitro/tc_dispatcher.rb +64 -0
  148. data/test/nitro/tc_session.rb +20 -0
  149. data/test/nitro/{tc_sitemap.rb → ui/tc_sitemap.rb} +1 -1
  150. data/test/root/blog/list.xhtml +6 -0
  151. data/test/tc_og.rb +41 -4
  152. metadata +115 -59
  153. data/bin/proto/app.rb +0 -20
  154. data/bin/proto/config.rb +0 -77
  155. data/examples/blog/app.rb +0 -21
  156. data/examples/blog/config.rb +0 -95
  157. data/examples/blog/env.rb +0 -22
  158. data/examples/flash/README +0 -34
  159. data/examples/flash/app.rb +0 -20
  160. data/examples/flash/config.rb +0 -38
  161. data/examples/flash/lib/flash.rb +0 -40
  162. data/examples/flash/tmp.swf +0 -0
  163. data/examples/tiny/app.rb +0 -19
  164. data/examples/tiny/config.rb +0 -29
  165. data/examples/tiny/root/nitro-small.png +0 -0
  166. data/lib/nitro/application.rb +0 -217
  167. data/lib/nitro/config.rb +0 -128
  168. data/lib/nitro/events.rb +0 -122
  169. data/lib/nitro/html.rb +0 -151
  170. data/lib/nitro/http.rb +0 -102
  171. data/lib/nitro/l10n.rb +0 -30
  172. data/lib/nitro/server.rb +0 -59
  173. data/lib/nitro/server/appserver.rb +0 -67
  174. data/lib/nitro/server/cookie.rb +0 -87
  175. data/lib/nitro/server/dispatcher.rb +0 -62
  176. data/lib/nitro/server/filters.rb +0 -75
  177. data/lib/nitro/server/filters/autologin.rb +0 -51
  178. data/lib/nitro/server/fragment.rb +0 -70
  179. data/lib/nitro/server/handlers.rb +0 -127
  180. data/lib/nitro/server/render.rb +0 -426
  181. data/lib/nitro/server/request.rb +0 -658
  182. data/lib/nitro/server/requestpart.rb +0 -54
  183. data/lib/nitro/server/script.rb +0 -387
  184. data/lib/nitro/server/server.rb +0 -57
  185. data/lib/nitro/server/session.rb +0 -220
  186. data/lib/nitro/server/user.rb +0 -46
  187. data/lib/nitro/server/webrick.rb +0 -180
  188. data/lib/nitro/service.rb +0 -26
  189. data/lib/xsl/ui.xsl +0 -51
  190. data/lib/xsl/xforms.xsl +0 -28
  191. data/test/nitro/server/tc_cookie.rb +0 -34
  192. data/test/nitro/server/tc_filters.rb +0 -38
  193. data/test/nitro/server/tc_request.rb +0 -70
  194. data/test/nitro/server/tc_requestpart.rb +0 -28
  195. data/test/nitro/server/tc_session.rb +0 -34
  196. data/test/nitro/tc_events.rb +0 -44
  197. data/test/nitro/tc_html.rb +0 -79
  198. data/test/nitro/tc_http.rb +0 -18
@@ -1,220 +0,0 @@
1
- # code:
2
- # * George Moschovitis <gm@navel.gr>
3
- #
4
- # (c) 2002-2003 Navel, all rights reserved.
5
- # $Id: session.rb 167 2004-11-23 14:03:10Z gmosx $
6
-
7
- require "md5"
8
-
9
- require "glue/hash"
10
- require "nitro/server/user"
11
-
12
- module N
13
-
14
- # = SessionManager
15
- #
16
- # This object manages session objects. Several utility methods
17
- # are also provided.
18
- #
19
- # === WARNING:
20
- #
21
- # This object is typically called in a distributed configuration.
22
- # Avoid writting methods that accept or return big objects!
23
- #
24
- # SOS: This object lives in the Cluster!
25
- #
26
- class SessionManager < N::SafeHash
27
- # the collection of online users.
28
- attr_reader :online
29
-
30
- def initialize
31
- super
32
- @online = N::SafeHash.new
33
- end
34
-
35
- # Return the number of anonymous sessions.
36
- #
37
- def anonymous_count
38
- return self.size - @online.size
39
- end
40
-
41
- # Login a named user.
42
- # The caller may pass user.to_html instead of the user name.
43
- # this method is distributed keep a lightweight
44
- # signature. By using @online.keys i get access to the
45
- # oids and in this way to the full objects.
46
- #
47
- def login(user_oid, user_name)
48
- @online[user_oid] = user_name
49
- end
50
-
51
- # Logout a named user.
52
- #
53
- def logout(user_oid)
54
- @online.delete(user_oid)
55
- end
56
-
57
- # Returns the session for the given user.
58
- #
59
- def session_for_user(user)
60
- return values().find { |s| user.oid == s.user.oid }
61
- end
62
-
63
- # Returns the session for the given user.
64
- #
65
- def session_for_name(name)
66
- return values().find { |s| name == s.user.name }
67
- end
68
-
69
- # garbage collect stale sessions
70
- #
71
- # === TODO:
72
- #
73
- # - add unit testing.
74
- #
75
- def self.garbage_collect!
76
- # gmosx: the only way to get it to ruby with
77
- # druby, aaarghhh!! Rethink this though! perhaps some
78
- # fixes i made allow for recoding this.
79
- for key in $sessions.keys()
80
- begin
81
- session = $sessions[key]
82
- if session.stale?
83
- Logger.debug "Session finalized: logging out idle user '#{session.user}'" if $DBG
84
- session.logout()
85
- $sessions.delete(key)
86
- end
87
- rescue Exception, StandardError => e
88
- Logger.error "Session gc errror #$!"
89
- end
90
- end
91
- end
92
- end
93
-
94
- # = Session
95
- #
96
- # This object encapsulates a session.
97
- #
98
- # === Design:
99
- #
100
- # The session should be persistable to survive server shutdowns.
101
- #
102
- # === Usage
103
- #
104
- # State is a neccessary evil but try to avoid using session
105
- # variables as much as possible. Session state is typically
106
- # distributed to many servers so avoid storing complete objects
107
- # in session variables, only store oids and integer/strings.
108
- #
109
- class Session < Hash
110
- COOKIE_NAME = "nsid"
111
-
112
- attr_reader :session_id
113
-
114
- # keep the user to allow for session lookup based on user.
115
- # also do NOT keep the full user as an object in the session hash
116
- # to optimize druby usage!
117
- #
118
- attr_accessor :user
119
-
120
- # the last touch time
121
- attr_accessor :touch_time
122
-
123
- # Initializs the session.
124
- #
125
- def initialize(sid, request = nil)
126
- super()
127
- @session_id = sid
128
- @touch_time = Time.now
129
- @user = N::AnonymousUser.instance()
130
- end
131
-
132
- # Login a user
133
- #
134
- # Returns false for banned users.
135
- #
136
- def login(request, user)
137
- return false if user.banned?
138
- @user = user
139
- @user.login(request)
140
- $sessions.login(@user.oid, @user.name)
141
- Logger.info "User '#{user}' logged in!"
142
- return true
143
- end
144
-
145
- # Logout a user
146
- #
147
- def logout()
148
- self.clear()
149
- @user.logout()
150
- $sessions.logout(@user.oid)
151
- Logger.info "User '#{user}' logged out!"
152
- @user = N::AnonymousUser.instance
153
- end
154
-
155
- #
156
- #
157
- def touch
158
- @touch_time = Time.now
159
- end
160
-
161
- #
162
- #
163
- def stale?
164
- timeout = @user.anonymous? ? $srv_anon_session_timeout : $srv_session_timeout
165
- return (Time.now - @touch_time > timeout)
166
- end
167
-
168
- # call this method to synchronize the session with other servers
169
- # in the cluster.
170
- #
171
- def synchronize!
172
- # gmosx: TODO, add a check if the session is allready
173
- # synchronized.
174
- $sessions[@session_id] = self
175
- end
176
-
177
- # Refresh session entities.
178
- #
179
- # Call this when you manually change entities stored in the
180
- # session. A typical scenario is when you change an online user.
181
- #
182
- # === Warning: the current version only refreshes the "USER" entity.
183
- #
184
- def refresh!
185
- @user = $og.load(@user.oid, @user.class) if @user
186
- end
187
-
188
- # Calculates a unique id.
189
- #
190
- # The session id must be unique, a monotonically increasing function
191
- # like time is appropriate. Random may produce equal ids? add a prefix
192
- # (SALT) to stop hackers from creating session_ids.
193
- #
194
- # TODO:
195
- # make the prefix configurable
196
- #
197
- def self.calculate_id
198
- time = Time.now
199
- # FIXME: make this more random?
200
- id = Digest::MD5.md5("SALT#{time.to_i} #{time.tv_usec}").to_s
201
- return id
202
- end
203
-
204
- # Initialize sessions garbage collection.
205
- #
206
- # WARNING: this is not used yet!
207
- #
208
- def self.initialize_gc(session_manager, interval)
209
- # gmosx, FIXME: store this in a variable.
210
- Thread.new {
211
- loop do
212
- sleep(interval)
213
- garbage_collect(session_manager.sessions)
214
- end
215
- }
216
- end
217
-
218
- end
219
-
220
- end # module
@@ -1,46 +0,0 @@
1
- # code:
2
- # * George Moschovitis <gm@navel.gr>
3
- #
4
- # (c) 2004 Navel, all rights reserved.
5
- # $Id: user.rb 99 2004-10-22 09:50:28Z gmosx $
6
-
7
- require "singleton"
8
-
9
- module N
10
-
11
- # = Anonymous User
12
- #
13
- # An anonymous user of the Web Application. This is a base
14
- # object, typically extended by the users part.
15
- #
16
- # Implemented as singleton.
17
- #
18
- class AnonymousUser
19
- include Singleton
20
-
21
- attr_accessor :name
22
- attr_accessor :locale
23
- attr_accessor :shader
24
-
25
- def initialize
26
- super
27
- @name = "anonymous"
28
- @locale = "en"
29
- @shader = $default_shader
30
- end
31
-
32
- def anonymous?
33
- true
34
- end
35
-
36
- def login
37
- # nop
38
- end
39
-
40
- def logout
41
- # nop
42
- end
43
-
44
- end
45
-
46
- end # module
@@ -1,180 +0,0 @@
1
- # code:
2
- # * George Moschovitis <gm@navel.gr>
3
- #
4
- # (c) 2004 Navel, all rights reserved.
5
- # $Id: webrick.rb 200 2004-12-27 11:24:41Z gmosx $
6
-
7
- require "webrick"
8
-
9
- require "nitro/server/appserver"
10
- require "nitro/server/dispatcher"
11
- require "nitro/server/render"
12
-
13
- # Override WEBrick to suit our needs.
14
- # Did I mention that WEBrick SUCKS ?
15
- #
16
- module WEBrick
17
-
18
- class HTTPRequest
19
-
20
- # Allow external setting of cookies.
21
- #
22
- def cookies=(val)
23
- @cookies = val
24
- end
25
-
26
- # Allow external setting of query.
27
- #
28
- def set_query(query_string)
29
- @query_string = query_string
30
- @query = WEBrick::HTTPUtils::parse_query(query_string)
31
- end
32
-
33
- # Return the referer to this resource. For the initial page in the
34
- # clickstream there is no referer, set "/" by default.
35
- #
36
- def referer
37
- return @header["referer"][0] || "/"
38
- end
39
- alias_method :referrer, :referer
40
-
41
- # Populate an object from request parameters.
42
- # This is a truly dangerous method.
43
- #
44
- EXCLUDED_PARAMETERS = %w{ oid name }
45
- def fill(obj, name = nil)
46
- # if an object is passed create an instance.
47
- obj = obj.new if obj.is_a?(Class)
48
-
49
- @query.each do |param, val|
50
- begin
51
- # gmosx: DO NOT escape by default !!!
52
- if not EXCLUDED_PARAMETERS.include?(param)
53
- obj.send("__force_#{param}", val)
54
- end
55
- rescue NameError
56
- next
57
- end
58
- end
59
-
60
- return obj
61
- end
62
- alias_method :populate, :fill
63
-
64
- end
65
-
66
- end # module
67
-
68
- module N
69
-
70
- # = WebrickServer
71
- #
72
- # The Application Server. Handles dynamic requests in a web application.
73
- # Dont keepalive (or use a VERY SMALL keepalive). Typically this server
74
- # is used along with a standard http server that handles static
75
- # resources like images, css.
76
- #
77
- # Used temporarily unitl we build our own app server.
78
- #
79
- class WebrickServer < N::AppServer
80
- include WEBrick
81
-
82
- # the integrated webrick server.
83
- attr_accessor :webrick
84
-
85
- def initialize(name = "WebrickServer")
86
- super
87
- end
88
-
89
- # Start the application server.
90
- #
91
- def start
92
- Socket.do_not_reverse_lookup = true # patch for OS X
93
-
94
- =begin
95
- accesslog = WEBrick::BasicLog::new('/dev/null')
96
- referer = WEBrick::BasicLog::new('/dev/null')
97
- =end
98
-
99
- accesslog = WEBrick::BasicLog::new('log/access.log')
100
- referer = WEBrick::BasicLog::new('log/referer.log')
101
-
102
- @webrick = WEBrick::HTTPServer.new(
103
- :BindAddress => $appsrv_address,
104
- :Port => $appsrv_port,
105
- :DocumentRoot => $root_dir,
106
- :AccessLog => [
107
- [accesslog, AccessLog::COMMON_LOG_FORMAT],
108
- [referer, AccessLog::REFERER_LOG_FORMAT]
109
- ]
110
- )
111
-
112
- @webrick.mount('/', N::WebrickDispatcher)
113
-
114
- trap("INT") { @webrick.shutdown }
115
- @webrick.start
116
- end
117
-
118
- # Stop the application server.
119
- #
120
- def stop
121
- @webrick.stop
122
- end
123
-
124
- end
125
-
126
- # = WebrickDispatcher
127
- #
128
- class WebrickDispatcher < WEBrick::HTTPServlet::AbstractServlet
129
- include N::Dispatcher
130
-
131
- def initialize(server)
132
- # Handles static resources. Useful when running a standalone
133
- # webrick server.
134
- @file_handler = WEBrick::HTTPServlet::FileHandler.new(server, $root_dir, {:FancyIndexing => true })
135
- end
136
-
137
- def do_GET(request, response)
138
- path = request.request_uri.path
139
-
140
- # rationalize cookies, WEBrick just SUCKS!!
141
- tmp = {}
142
- request.cookies.each { |c|
143
- tmp[c.name] = c
144
- }
145
- request.cookies = tmp
146
-
147
- if path =~ /\./
148
- @file_handler.do_GET(request, response)
149
- else
150
- process(request, response)
151
- end
152
- end
153
-
154
- alias :do_POST :do_GET
155
-
156
-
157
- # Create session
158
- #
159
- def create_session(request, response)
160
- session = nil
161
-
162
- if cookie = request.cookies[N::Session::COOKIE_NAME]
163
- session = $sessions[cookie.value]
164
- end
165
-
166
- unless session
167
- Logger.debug 'Creating new session.' if $DBG
168
- # no session cookie or stale session (garbage collected).
169
- session_id = N::Session.calculate_id()
170
- cookie = WEBrick::Cookie.new(N::Session::COOKIE_NAME, session_id)
171
- response.cookies << cookie
172
- session = $sessions[session_id] = N::Session.new(session_id)
173
- end
174
-
175
- return session
176
- end
177
-
178
- end
179
-
180
- end # module
@@ -1,26 +0,0 @@
1
- # code:
2
- # * George Moschovitis <gm@navel.gr>
3
- #
4
- # (c) 2004 Navel, all rights reserved.
5
- # $Id: service.rb 185 2004-12-10 13:29:09Z gmosx $
6
-
7
- require 'nitro/server/render'
8
- require 'nitro/scaffold'
9
- require 'nitro/filters'
10
-
11
- module N
12
-
13
- # = Service
14
- #
15
- # Defines an application service.
16
- #
17
- class Service
18
- include N::Render
19
- include N::Scaffolding
20
- include N::Filtering
21
-
22
- # The base path of the service, essentially the mount point.
23
- attr :base_path
24
- end
25
-
26
- end # module