nitro 0.5.0 → 0.6.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 (50) hide show
  1. data/ChangeLog +4 -2201
  2. data/ChangeLog.1 +2344 -0
  3. data/README +4 -4
  4. data/RELEASES +22 -0
  5. data/bin/new_app.rb +17 -3
  6. data/bin/proto/README +34 -0
  7. data/bin/proto/apache.conf +1 -0
  8. data/bin/proto/app.rb +20 -0
  9. data/bin/proto/config.rb +77 -0
  10. data/bin/proto/root/index.xhtml +43 -0
  11. data/bin/proto/root/style.css +218 -0
  12. data/bin/proto/root/style.xsl +130 -0
  13. data/examples/blog/app.rb +1 -2
  14. data/examples/blog/config.rb +20 -18
  15. data/examples/blog/env.rb +22 -0
  16. data/examples/blog/lib/blog.rb +43 -15
  17. data/examples/blog/root/entry_form.xhtml +1 -1
  18. data/examples/blog/root/index.xhtml +5 -0
  19. data/examples/blog/root/login.xhtml +2 -0
  20. data/examples/blog/root/m/nitro.gif +0 -0
  21. data/examples/blog/root/style.css +83 -0
  22. data/examples/blog/root/style.xsl +7 -3
  23. data/examples/og/run.rb +41 -2
  24. data/examples/tiny/app.rb +1 -2
  25. data/examples/tiny/root/index.xhtml +8 -2
  26. data/examples/tiny/root/nitro-small.png +0 -0
  27. data/lib/glue.rb +1 -1
  28. data/lib/glue/property.rb +9 -3
  29. data/lib/nitro/application.rb +18 -1
  30. data/lib/nitro/builders/form.rb +84 -0
  31. data/lib/nitro/builders/rss.rb +4 -5
  32. data/lib/nitro/builders/table.rb +23 -0
  33. data/lib/nitro/filters.rb +157 -0
  34. data/lib/nitro/l10n.rb +11 -3
  35. data/lib/nitro/scaffold.rb +1 -1
  36. data/lib/nitro/server/render.rb +101 -4
  37. data/lib/nitro/server/shaders.rb +17 -5
  38. data/lib/nitro/service.rb +5 -5
  39. data/lib/nitro/ui/pager.rb +35 -11
  40. data/lib/nitro/version.rb +2 -2
  41. data/lib/og.rb +25 -17
  42. data/lib/og/backend.rb +15 -3
  43. data/lib/og/backends/mysql.rb +30 -3
  44. data/lib/og/backends/psql.rb +44 -3
  45. data/lib/og/meta.rb +117 -10
  46. data/lib/og/version.rb +1 -1
  47. data/lib/xsl/base.xsl +75 -6
  48. data/lib/xsl/ui.xsl +51 -0
  49. data/test/nitro/ui/tc_pager.rb +6 -0
  50. metadata +23 -2
@@ -0,0 +1,130 @@
1
+ <?xml version="1.0"?>
2
+
3
+ <!--
4
+ A Simple Shader
5
+
6
+ code:
7
+ * George Moschovitis <gm@navel.gr>
8
+
9
+ (c) 2004 Navel, all rights reserved.
10
+ $Id: style.xsl 188 2004-12-10 14:14:17Z gmosx $
11
+ -->
12
+
13
+ <!DOCTYPE shader
14
+ [
15
+ <!ENTITY nbsp "<![CDATA[&nbsp;]]>">
16
+ <!ENTITY copy "<![CDATA[&copy;]]>">
17
+ <!ENTITY euro "<![CDATA[&euro;]]>">
18
+ <!ENTITY laquo "<![CDATA[&laquo;]]>">
19
+ <!ENTITY raquo "<![CDATA[&raquo;]]>">
20
+ ]>
21
+
22
+ <xsl:stylesheet
23
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
24
+ xmlns:xl="http://www.w3.org/1999/xlink"
25
+ xmlns:x="http://www.navel.gr/xml/shader.xsd" version="1.0"
26
+ exclude-result-prefixes="x xl">
27
+
28
+ <xsl:include href="../nitro/lib/xsl/base.xsl" />
29
+
30
+ <xsl:output method="xml" indent="yes" encoding="iso-8859-1" />
31
+
32
+ <xsl:template name="x:head">
33
+ <head>
34
+ <title>#$name</title>
35
+ <meta name="title" content="Blog" />
36
+ <meta name="description" content="Example" />
37
+ <meta name="keywords" content="nitro, example, blog" />
38
+ <meta name="category" content="example" />
39
+ <meta name="robots" content="index, follow" />
40
+ <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
41
+
42
+ <xsl:apply-templates select="x:block[@id='meta']"/>
43
+
44
+ <base href="#$srv_url/" />
45
+ <link href="/style.css" rel="stylesheet" type="text/css" media="screen" />
46
+ <link rel="alternate" type="application/rss+xml" title="Latest Entries" href="#$srv_url/rest/list_entry" />
47
+ <link rel="alternate" type="application/rss+xml" title="Latest Comments" href="#$srv_url/rest/list_comment" />
48
+ <xsl:apply-templates select="x:cell[@id='head']"/>
49
+ </head>
50
+ </xsl:template>
51
+
52
+ <xsl:template name="x:header">
53
+ <div id="header">
54
+ <h1>#$name</h1>
55
+ </div>
56
+ </xsl:template>
57
+
58
+ <xsl:template name="x:footer">
59
+ <div id="footer">
60
+ </div>
61
+ </xsl:template>
62
+
63
+ <!--
64
+ can only include x:blocks, all other templates are ignored
65
+ -->
66
+ <xsl:template match="x:page">
67
+ <html>
68
+ <xsl:call-template name="x:head" />
69
+ <body>
70
+
71
+ <div id="page">
72
+
73
+ <xsl:call-template name="x:header" />
74
+
75
+ <xsl:apply-templates select="x:cell[@id='top']" />
76
+
77
+ <div class="block main">
78
+ <xsl:apply-templates select="x:cell[@id='main']" />
79
+ </div>
80
+
81
+ <div class="block side">
82
+ <h2>About</h2>
83
+ This is a simple blog powered by <a href="http://www.navel.gr/nitro">
84
+ Nitro</a> Web Engine. Have a look at the source code and enjoy
85
+ the power of Ruby.
86
+ <ruby>unless session['owner']</ruby>
87
+ <p><a href="login">Login</a> as owner.</p>
88
+ <ruby>else</ruby>
89
+ <p><a href="logout">Logout</a>.</p>
90
+ <ruby>end</ruby>
91
+
92
+ <xsl:apply-templates select="x:cell[@id='side']" />
93
+
94
+ <h2>Linkage</h2>
95
+ <ul>
96
+ <li><a target="_new" href="http://www.navel.gr">Navel Ltd</a></li>
97
+ <li><a target="_new" href="http://www.navel.gr/nitro">Nitro Web Engine</a></li>
98
+ <li><a target="_new" href="http://www.ruby-lang.org">Ruby</a></li>
99
+ <li><a target="_new" href="http://www.blogger.com">Blogger</a></li>
100
+ <li><a target="_new" href="http://www.w3c.org">W3 Consortium</a></li>
101
+ </ul>
102
+
103
+ <br />
104
+ <ul class="rss">
105
+ <li><a href="rest/list_entry">Latest entries</a></li>
106
+ <li><a href="rest/list_comment">Latest comments</a></li>
107
+ </ul>
108
+
109
+ <br />
110
+ <p>
111
+ powered by <b><a href="http://www.navel.gr/nitro">Nitro</a></b>
112
+ <br />
113
+ skin from <a href="http://www.blogger.com">Blogger.com</a>
114
+ </p>
115
+ </div>
116
+
117
+ <div class="clear">.</div>
118
+
119
+ <xsl:apply-templates select="x:cell[@id='bottom']" />
120
+
121
+ <xsl:call-template name="x:footer" />
122
+ </div>
123
+
124
+ <xsl:call-template name="x:rendering-errors" />
125
+
126
+ </body>
127
+ </html>
128
+ </xsl:template>
129
+
130
+ </xsl:stylesheet>
data/examples/blog/app.rb CHANGED
@@ -8,12 +8,11 @@
8
8
  # * George Moschovitis <gm@navel.gr>
9
9
  #
10
10
  # (c) 2004 Navel, all rights reserved.
11
- # $Id: app.rb 167 2004-11-23 14:03:10Z gmosx $
11
+ # $Id: app.rb 185 2004-12-10 13:29:09Z gmosx $
12
12
 
13
13
  # set to true for DEBUG mode.
14
14
  $DBG = true
15
15
 
16
- $LOAD_PATH.unshift "lib"
17
16
  $LOAD_PATH.unshift "../../lib"
18
17
 
19
18
  require "config"
@@ -11,30 +11,32 @@
11
11
  # * George Moschovitis <gm@navel.gr>
12
12
  #
13
13
  # (c) 2004 Navel, all rights reserved.
14
- # $Id: config.rb 167 2004-11-23 14:03:10Z gmosx $
14
+ # $Id: config.rb 185 2004-12-10 13:29:09Z gmosx $
15
15
 
16
- require "nitro"
17
- require "glue/logger"
18
- require "nitro/config"
16
+ require 'nitro'
17
+ require 'glue/logger'
18
+ require 'nitro/config'
19
19
 
20
- require "og"
21
- require "nitro/l10n"
22
- require "nitro/events"
23
- require "glue/mixins"
24
- require "nitro/sitemap"
20
+ require 'og'
21
+ require 'nitro/l10n'
22
+ require 'nitro/events'
23
+ require 'glue/mixins'
24
+ require 'nitro/sitemap'
25
25
 
26
- require "glue/number"
27
- require "glue/string"
28
- require "glue/array"
29
- require "glue/hash"
30
- require "nitro/html"
26
+ require 'glue/number'
27
+ require 'glue/string'
28
+ require 'glue/array'
29
+ require 'glue/hash'
30
+ require 'nitro/html'
31
31
 
32
- require "nitro/server/webrick"
33
- require "nitro/server/shaders"
32
+ require 'nitro/server/webrick'
33
+ require 'nitro/server/shaders'
34
34
 
35
- require "blog.rb"
35
+ require 'nitro/builders/form'
36
36
 
37
- $name = "Nitro Blog"
37
+ require 'lib/blog'
38
+
39
+ $name = 'Nitro Blog'
38
40
 
39
41
  $blog_username = 'George Moschovitis'
40
42
  $blog_password = 'navelrulez'
@@ -0,0 +1,22 @@
1
+ # = Environment injection.
2
+ #
3
+ # Require this file in your script to gain access to the full
4
+ # AppServer environment. Typically used to attach an irb session to
5
+ # a running application process:
6
+ #
7
+ # irb -r env
8
+ #
9
+ # code:
10
+ # * George Moschovitis <gm@navel.gr>
11
+ #
12
+ # (c) 2004 Navel, all rights reserved.
13
+ # $Id: env.rb 187 2004-12-10 13:34:28Z gmosx $
14
+
15
+ $DBG = true
16
+
17
+ $LOAD_PATH.unshift '../../lib'
18
+
19
+ require 'config'
20
+
21
+ $app = N::AppServer.new.exec()
22
+
@@ -2,13 +2,14 @@
2
2
  # * George Moschovitis <gm@navel.gr>
3
3
  #
4
4
  # (c) 2004 Navel, all rights reserved.
5
- # $Id: blog.rb 167 2004-11-23 14:03:10Z gmosx $
5
+ # $Id: blog.rb 185 2004-12-10 13:29:09Z gmosx $
6
6
 
7
7
  require 'nitro/service'
8
8
  require 'nitro/builders/rss'
9
+ require 'nitro/ui/pager'
9
10
 
10
- $blog_username = 'your user name'
11
- $blog_password = 'your password'
11
+ $blog_username = 'George Moschovitis'
12
+ $blog_password = 'mypassword'
12
13
 
13
14
  module N
14
15
 
@@ -19,11 +20,12 @@ module N
19
20
  class Common
20
21
  prop :create_time, Time
21
22
  prop_accessor :author, String
22
- prop_accessor :body, String
23
+ prop_accessor :body, String, :form => :textarea
23
24
 
24
25
  def initialize
25
26
  @create_time = Time.now
26
27
  end
28
+
27
29
  end
28
30
 
29
31
  class Comment < Common; end
@@ -32,7 +34,20 @@ class Comment < Common; end
32
34
  #
33
35
  class BlogEntry < Common
34
36
  prop_accessor :title, String
35
- has_many :comments, N::Comment, :linkback => 'entry_oid'
37
+ has_many :comments, N::Comment, :linkback => 'entry_oid'
38
+
39
+ # Play a bit with the text the user enters.
40
+ #
41
+ def body=(str)
42
+ if str
43
+ str.gsub!(/</, '&lt;')
44
+ str.gsub!(/>/, '&gt;')
45
+ str.gsub!(/"/, '&quot;')
46
+ str.gsub!(/'/, '&#39;')
47
+ str.gsub!(/\r\n/, ' <br />')
48
+ @body = str
49
+ end
50
+ end
36
51
  end
37
52
 
38
53
  # = Comment
@@ -41,13 +56,22 @@ class Comment < Common
41
56
  belongs_to :entry, N::BlogEntry
42
57
  end
43
58
 
44
- # = BlogMethods
59
+ # = BlogService
45
60
  #
46
- module BlogMethods
47
- include N::Scaffolding
48
-
61
+ class BlogService < N::Service
62
+ SOURCE_FILE = __FILE__
63
+
64
+ before_filter :audit
65
+ after_filter :cache
66
+
49
67
  scaffold N::BlogEntry, :name => 'entry', :index => true
50
68
  scaffold N::Comment
69
+
70
+ def list_entry
71
+ @pager = N::UI::Pager.new('entries', @request, 3)
72
+ @entries = N::BlogEntry.all("ORDER BY oid DESC #{@pager.sql_limit}")
73
+ @pager.set(N::BlogEntry.count)
74
+ end
51
75
 
52
76
  def new_entry
53
77
  entry = request.fill(N::BlogEntry.new)
@@ -84,14 +108,18 @@ module BlogMethods
84
108
 
85
109
  def logout
86
110
  session['owner'] = session['username'] = nil
87
- end
111
+ end
88
112
 
89
- end
113
+ private
90
114
 
91
- # = BlogService
92
- #
93
- class BlogService < N::Service
94
- include BlogMethods
115
+ def audit
116
+ puts "audit (before filter example)"
117
+ end
118
+
119
+ def cache
120
+ puts "cache (after filter example)"
121
+ end
122
+
95
123
  end
96
124
 
97
125
  end # module
@@ -11,7 +11,7 @@
11
11
  <p>
12
12
  <b>Body:</b><br />
13
13
  <textarea name="body" style="width: 90%; height: 100px">#{}</textarea>
14
- </p>
14
+ </p>
15
15
  <input type="submit" value="Post" />
16
16
  </form>
17
17
  </div>
@@ -29,6 +29,11 @@
29
29
  no entries
30
30
  <?r end ?>
31
31
 
32
+ <div class="pager">
33
+ #{@pager.navigation}
34
+ <div class="clear">.</div>
35
+ </div>
36
+
32
37
  <?r if session['owner'] ?>
33
38
  <include href="entry_form" />
34
39
  <?r end ?>
@@ -6,6 +6,8 @@
6
6
 
7
7
  <p>
8
8
  Please login as an author by entering the blog password.
9
+ <br />
10
+ The password is: <b>#$blog_password</b>.
9
11
  </p>
10
12
 
11
13
  <div class="error">#@error</div>
Binary file
@@ -49,6 +49,11 @@ input, textarea {
49
49
  background: url(m/h1_bg.gif) no-repeat bottom left;
50
50
  }
51
51
 
52
+ #header h1 a {
53
+ color: #fff;
54
+ text-decoration: none;
55
+ }
56
+
52
57
  #footer {
53
58
  height: 40px;
54
59
  color: #fff;
@@ -216,3 +221,81 @@ h2.date {
216
221
  background: url(m/rss.gif) no-repeat 0 6px;
217
222
  }
218
223
 
224
+ /* --- pager --- */
225
+
226
+ .pager {
227
+ margin-top: 40px; margin-bottom: 50px;
228
+ border-top: 1px solid #ccc;
229
+ background-color: #f0f0f0;
230
+ }
231
+
232
+ .pager .first {
233
+ float: left;
234
+ padding: 5px;
235
+ }
236
+
237
+ .pager .previous {
238
+ float: left;
239
+ padding: 5px;
240
+ margin-left: 5px;
241
+ }
242
+
243
+ .pager .next {
244
+ float: right;
245
+ padding: 5px;
246
+ margin-right: 5px;
247
+ }
248
+
249
+ .pager .last {
250
+ float: right;
251
+ padding: 5px;
252
+ }
253
+
254
+ .pager ul {
255
+ float: left;
256
+ margin: 0px;
257
+ padding: 0px;
258
+ }
259
+
260
+ .pager li {
261
+ float: left;
262
+ display: inline;
263
+ padding: 5px;
264
+ padding-left: 10px;
265
+ padding-right: 10px;
266
+ background: none;
267
+ }
268
+
269
+ .pager li.active {
270
+ background-color: #ffa;
271
+ }
272
+
273
+ .noitems {
274
+ padding: 5px;
275
+ text-align: center;
276
+ }
277
+
278
+ /* --- forms --- */
279
+
280
+ dl {
281
+ margin: 0px;
282
+ }
283
+
284
+ dt {
285
+ display: block;
286
+ margin: 0px;
287
+ margin-right: 10px;
288
+ padding-bottom: 10px;
289
+ font-weight: bold;
290
+ }
291
+
292
+ dd {
293
+ display: block;
294
+ margin: 0px;
295
+ padding-bottom: 10px;
296
+ }
297
+
298
+ textarea {
299
+ width: 90%;
300
+ height: 150px;
301
+ }