nitro 0.25.0 → 0.26.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 (76) hide show
  1. data/CHANGELOG +531 -1
  2. data/ProjectInfo +29 -5
  3. data/README +1 -1
  4. data/doc/AUTHORS +12 -6
  5. data/doc/RELEASES +114 -0
  6. data/lib/glue/sweeper.rb +71 -0
  7. data/lib/nitro.rb +19 -12
  8. data/lib/nitro/adapter/cgi.rb +4 -0
  9. data/lib/nitro/adapter/webrick.rb +4 -2
  10. data/lib/nitro/caching.rb +1 -0
  11. data/lib/nitro/caching/fragments.rb +7 -1
  12. data/lib/nitro/caching/output.rb +6 -1
  13. data/lib/nitro/caching/stores.rb +13 -1
  14. data/lib/nitro/cgi.rb +9 -1
  15. data/lib/nitro/cgi/request.rb +11 -3
  16. data/lib/nitro/cgi/utils.rb +24 -2
  17. data/lib/nitro/compiler.rb +89 -63
  18. data/lib/nitro/compiler/cleanup.rb +16 -0
  19. data/lib/nitro/compiler/elements.rb +117 -0
  20. data/lib/nitro/compiler/markup.rb +3 -1
  21. data/lib/nitro/compiler/morphing.rb +203 -73
  22. data/lib/nitro/compiler/script_generator.rb +14 -0
  23. data/lib/nitro/compiler/shaders.rb +1 -1
  24. data/lib/nitro/context.rb +5 -6
  25. data/lib/nitro/controller.rb +43 -21
  26. data/lib/nitro/dispatcher.rb +86 -37
  27. data/lib/nitro/element.rb +3 -105
  28. data/lib/nitro/helper/benchmark.rb +3 -0
  29. data/lib/nitro/helper/dojo.rb +0 -0
  30. data/lib/nitro/helper/form.rb +85 -255
  31. data/lib/nitro/helper/form/controls.rb +274 -0
  32. data/lib/nitro/helper/javascript.rb +86 -6
  33. data/lib/nitro/helper/pager.rb +5 -0
  34. data/lib/nitro/helper/prototype.rb +49 -0
  35. data/lib/nitro/helper/scriptaculous.rb +0 -0
  36. data/lib/nitro/helper/xhtml.rb +11 -8
  37. data/lib/nitro/helper/xml.rb +1 -1
  38. data/lib/nitro/routing.rb +8 -1
  39. data/lib/nitro/scaffolding.rb +344 -0
  40. data/lib/nitro/server.rb +5 -1
  41. data/lib/nitro/server/runner.rb +19 -15
  42. data/lib/nitro/session.rb +32 -56
  43. data/lib/nitro/session/drbserver.rb +1 -1
  44. data/lib/nitro/session/file.rb +34 -15
  45. data/lib/nitro/session/memory.rb +13 -4
  46. data/lib/nitro/session/og.rb +56 -0
  47. data/proto/public/js/controls.js +30 -1
  48. data/proto/public/js/dragdrop.js +211 -146
  49. data/proto/public/js/effects.js +261 -399
  50. data/proto/public/js/prototype.js +131 -72
  51. data/proto/public/scaffold/edit.xhtml +10 -3
  52. data/proto/public/scaffold/form.xhtml +1 -7
  53. data/proto/public/scaffold/index.xhtml +20 -0
  54. data/proto/public/scaffold/list.xhtml +15 -8
  55. data/proto/public/scaffold/new.xhtml +10 -3
  56. data/proto/public/scaffold/search.xhtml +28 -0
  57. data/proto/public/scaffold/view.xhtml +8 -0
  58. data/proto/run.rb +93 -1
  59. data/src/part/admin.rb +4 -2
  60. data/src/part/admin/controller.rb +62 -28
  61. data/src/part/admin/skin.rb +8 -8
  62. data/src/part/admin/system.css +135 -0
  63. data/src/part/admin/template/index.xhtml +8 -12
  64. data/test/nitro/caching/tc_stores.rb +17 -0
  65. data/test/nitro/tc_caching.rb +1 -4
  66. data/test/nitro/tc_dispatcher.rb +22 -10
  67. data/test/nitro/tc_element.rb +1 -1
  68. data/test/nitro/tc_session.rb +23 -11
  69. data/test/public/blog/another/very_litle/index.xhtml +1 -0
  70. metadata +29 -15
  71. data/lib/nitro/dispatcher/general.rb +0 -62
  72. data/lib/nitro/dispatcher/nice.rb +0 -57
  73. data/lib/nitro/scaffold.rb +0 -171
  74. data/proto/public/index.xhtml +0 -83
  75. data/proto/public/js/scaffold.js +0 -74
  76. data/proto/public/settings.xhtml +0 -66
@@ -1,18 +1,25 @@
1
- <SystemPage name="List of %list_name%">
2
- <h2><a href="#@base/new_%name%">New %name%</a></h2>
3
- <form action="search">
4
- Search %list_name%: <input type="text" name="q" />&nbsp;<input type="submit" value="Search" /> (not implemented yet)
1
+ <SystemPage>
2
+ <?r base = "#{@base}/%base%" ?>
3
+ <h1><a href="/"> Home</a> > <a href="#@base">System</a> > #{"%plural%".humanize}</h1>
4
+ <a href="#{base}/new">New %name%</a>
5
+ <p>
6
+ <form action="#{base}/search">
7
+ Search %plural%: <input type="text" name="q" />&nbsp;<input type="submit" value="Search" />
5
8
  </form>
9
+ </p>
6
10
  <table>
7
- <?r for obj in @%list_name% ?>
11
+ <?r for obj in @list ?>
8
12
  <tr>
9
- <td width="100%"><a href="#@base/edit_%name%/#{obj.oid}">#{obj.to_s}</a></td>
13
+ <td width="100%"><a href="#{base}/edit/#{obj.oid}">#(obj.to_s)</a></td>
10
14
  <?r if obj.respond_to?(:update_time) ?>
11
15
  <td nowrap="1">#{obj.update_time.stamp(:db)}</td>
12
16
  <?r end ?>
13
- <td><a href="#@base/edit_%name%/#{obj.oid}">edit</a></td>
14
- <td><a href="#@base/delete_%name%/#{obj.oid}">del</a></td>
17
+ <td><a href="#{base}/edit/#{obj.oid}">edit</a></td>
18
+ <td><a href="#{base}/delete/#{obj.oid}" onclick="confirm('Are you sure?')">del</a></td>
15
19
  </tr>
16
20
  <?r end ?>
17
21
  </table>
22
+ <div class="pager" if="@pager and @pager.navigation?">
23
+ #{@pager.navigation}
24
+ </div>
18
25
  </SystemPage>
@@ -1,4 +1,11 @@
1
- <SystemPage name="Edit %name%">
2
- <h2><a href="#@base/%name_plural%">List of %name_plural%</a></h2>
3
- #{form_for(@%name%)}
1
+ <SystemPage>
2
+ <?r base = "#{@base}/%base%" ?>
3
+ <h1><a href="/"> Home</a> > <a href="#@base">System</a> > <a href="#{base}/list">#{"%plural%".humanize}</a> > New %name%</h1>
4
+ <?r if @all ?>
5
+ <a href="#{request.uri.gsub(/\/all$/, '')}">Show editable</a>
6
+ #{form_for @obj, :action => "#{base}/save", :cancel => "#{base}/list", :all => true}
7
+ <?r else ?>
8
+ <a href="#{request.uri}/all">Show all</a>
9
+ #{form_for @obj, :action => "#{base}/save", :cancel => "#{base}/list"}
10
+ <?r end ?>
4
11
  </SystemPage>
@@ -0,0 +1,28 @@
1
+ <SystemPage>
2
+ <?r base = "#{@base}/%base%" ?>
3
+ <h1><a href="/"> Home</a> > <a href="#@base">System</a> > <a href="#{base}/list">#{"%plural%".humanize}</a> > Search for '#@query'</h1>
4
+ <p>
5
+ <form action="#{base}/search">
6
+ Search %plural%: <input type="text" name="q" />&nbsp;<input type="submit" value="Search" />
7
+ </form>
8
+ </p>
9
+ <?r if @list.nil? ?>
10
+ <p>Search method is not implemented for this object</p>
11
+ <?r else ?>
12
+ <table>
13
+ <?r for obj in @list ?>
14
+ <tr>
15
+ <td width="100%"><a href="#{base}/edit/#{obj.oid}">#(obj.to_s)</a></td>
16
+ <?r if obj.respond_to?(:update_time) ?>
17
+ <td nowrap="1">#{obj.update_time.stamp(:db)}</td>
18
+ <?r end ?>
19
+ <td><a href="#{base}/edit/#{obj.oid}">edit</a></td>
20
+ <td><a href="#{base}/delete/#{obj.oid}">del</a></td>
21
+ </tr>
22
+ <?r end ?>
23
+ </table>
24
+ <div class="pager" if="@pager and @pager.navigation?">
25
+ #{@pager.navigation}
26
+ </div>
27
+ <?r end ?>
28
+ </SystemPage>
@@ -0,0 +1,8 @@
1
+ <SystemPage>
2
+ <?r base = "#{@base}/%base%" ?>
3
+ <h1>View %name%</h1>
4
+ <h2><a href="#{base}/list">List of %plural%</a></h2>
5
+ <code>
6
+ #{@obj.to_yaml}
7
+ </code>
8
+ </SystemPage>
@@ -2,4 +2,96 @@
2
2
 
3
3
  require 'nitro'
4
4
 
5
- Nitro.run
5
+ # The prototype controller.
6
+
7
+ class Proto
8
+ def index
9
+ %{
10
+ <html>
11
+ <head>
12
+ <title>Nitro, Feel the magic!</title>
13
+ <style>
14
+ body { margin: 10px; background-color: #fff; color: #333; }
15
+
16
+ body, p, ol, ul, td {
17
+ font-family: verdana, arial, helvetica, sans-serif;
18
+ font-size: 12px;
19
+ line-height: 18px;
20
+ }
21
+
22
+ h1 { margin-top: 15px; margin-bottom: 45px; }
23
+
24
+ li {
25
+ margin-bottom: 7px;
26
+ }
27
+
28
+ pre {
29
+ background-color: #eee;
30
+ padding: 10px;
31
+ font-size: 11px;
32
+ }
33
+
34
+ a { color: #000; }
35
+ a:visited { color: #666; }
36
+ a:hover { color: #fff; background-color:#000; }
37
+
38
+ img { border: none; }
39
+ </style>
40
+ </head>
41
+ <body>
42
+
43
+ <a href="http://nitro.rubyforge.org" target="_blank"><img src="media/nitro.png" /></a>
44
+
45
+ <h1>You have successfully installed Nitro!</h1>
46
+
47
+ <p><b>Before you move on</b>, verify that the following conditions have been met:</p>
48
+
49
+ <ol>
50
+ <li>The log directory and the empty log files must be writable to the web server (<code>chmod -R 666 log/*</code>).</li>
51
+ <li>
52
+ The shebang line in the ctl file must reference your Ruby installation. <br/>
53
+ You might need to change it to <code>#!/usr/bin/env ruby</code> or point directly at the installation.
54
+ </li>
55
+ </ol>
56
+
57
+ <p>Have a look at the <b>examples</b>:</p>
58
+
59
+ <ol>
60
+ <li><b>examples/blog</b>: A simple Blog, featuring a nice XSLT based template.</li>
61
+ <li><b>examples/no_xsl_blog</b>: The same example without using XSLT (easier to setup under Windows).</li>
62
+ <li><b>examples/why_wiki</b>: A conversion of why_'s wiki.</li>
63
+ <li><b>examples/wee_style</b>: A Wee-style (ruby code only) example.</li>
64
+ <li><b>examples/ajax</b>: Implement Google suggest-style functionality using ajax techniques.</li>
65
+ <li><b>examples/tiny</b>: A small example to verify your installation.</li>
66
+ </ol>
67
+
68
+ <p>Here is <b>what do next</b>:</p>
69
+
70
+ <ol>
71
+ <li>Add your xhtml files in the 'public' directory. Those files are
72
+ automagically converted to controller actions by Nitro
73
+ </li>
74
+ <li>Place additional media files, css, or xsl files in the public directory.</li>
75
+ <li>Create your models and controllers.</li>
76
+ <li>Develop your application utilizing Nitro's powerful features.</li>
77
+ </ol>
78
+
79
+ <br />
80
+
81
+ <p>
82
+ <b>Having problems getting up and running?</b><br />
83
+ First try debugging it yourself by looking at the log files.
84
+ If you get stuck, post your problem to the <a href="http://rubyforge.org/mailman/listinfo/nitro-general">Nitro Mailing
85
+ List</a> at <a href="http://www.rubyforge.com">Rubyforge</a>.
86
+ </p>
87
+
88
+ <br /><br />
89
+ </body>
90
+ </html>
91
+ }
92
+ end
93
+ end
94
+
95
+ Nitro.run(Proto)
96
+
97
+ # * George Moschovitis <gm@navel.gr>
@@ -1,8 +1,10 @@
1
- require 'nano/time/stamp'
2
-
3
1
  require 'nitro/server'
4
2
 
5
3
  require 'part/admin/controller'
6
4
  require 'part/admin/skin'
7
5
 
8
6
  Nitro::Server.map['/admin'] = AdminController
7
+
8
+ # The admin part.
9
+
10
+ # * George Moschovitis <gm@navel.gr>
@@ -1,47 +1,81 @@
1
+ require 'nano/kernel/constant'
2
+ require 'nano/time/stamp'
3
+
1
4
  require 'nitro/controller'
2
- require 'nitro/helper/form'
5
+
3
6
 
4
7
  # Provides an automatically generated Administration
5
8
  # interface.
6
9
 
7
10
  class AdminController < Nitro::Controller
8
- helper :form
11
+
12
+ # Run a simple security check function before each action
13
+
14
+ before :check_security, :except => [ :denied ]
15
+
16
+ # scaffold all the classes
17
+
18
+ scaffold_all
19
+
20
+ # Default to views in part dir
9
21
 
10
22
  def self.template_root
11
23
  File.join(File.dirname(__FILE__), 'template')
12
24
  end
13
25
 
26
+ # default method for controller
27
+
14
28
  def index
15
- @classes = self.class.managed_classes
29
+ @classes = self.class.scaffolding_classes.keys
16
30
  end
17
-
18
- class << self
19
- # The managed classes of this application.
20
-
21
- attr_accessor :managed_classes
22
-
23
- # Called when this controller is mounted.
24
-
25
- def mounted(path)
26
- @managed_classes = Og.manager.manageable_classes
27
- @managed_classes.each { |c| scaffold(c) }
28
- add_security()
29
- end
30
-
31
- # Overload in your application to suit your
32
- # needs. The default implementation does NOT apply security
33
- # in debug mode.The default implementation requires the
34
- # existense of an :ADMIN key in the session, so you can
35
- # easily integrate this in your user/roles management code.
36
-
37
- def add_security
38
- unless Runner.mode == :debug
39
- before %{ redirect 'denied' unless session[:ADMIN] }, :except => [ :denied ]
31
+
32
+ # Delete all instances of the class.
33
+ # Useful in development mode.
34
+
35
+ def delete_all(klass)
36
+ constant(klass).delete_all
37
+ redirect_to_referer
38
+ end
39
+
40
+ # Drop the schema (typically the DB tables) used to
41
+ # store the class instances.
42
+
43
+ def destroy(klass)
44
+ constant(klass).delete_all
45
+ redirect_to_referer
46
+ end
47
+
48
+ # fetch the css for this controller
49
+ # checks for a /system.css file and uses that if available
50
+ # otherwise uses system.css from the part/admin dir
51
+
52
+ def stylesheet(sheet='system')
53
+ sheet << ".css"
54
+ [Server.public_root, File.dirname(__FILE__)].each do |path|
55
+ css_file = File.join(path, sheet)
56
+ if File.exists? css_file
57
+ response.content_type = 'text/css'
58
+ @out << File.read(css_file)
59
+ raise RenderExit
40
60
  end
41
- end
61
+ end
62
+ raise "stylesheet not found"
63
+ end
64
+ alias_action :stylesheets, :stylesheet
65
+
66
+ private
67
+
68
+ # Overload in your application to suit your
69
+ # needs. The default implementation does NOT apply security
70
+ # in debug mode.The default implementation requires the
71
+ # existense of an :ADMIN key in the session, so you can
72
+ # easily integrate this in your user/roles management code.
42
73
 
74
+ def check_security
75
+ return true if Nitro::Runner.mode == :debug
76
+ redirect 'denied' unless session[:ADMIN]
43
77
  end
44
78
 
45
79
  end
46
80
 
47
- # * George Moschovitis <gm@navel.gr>
81
+ # * George Moschovitis <gm@navel.gr>
@@ -5,23 +5,23 @@ class SystemPage < Nitro::Element
5
5
  %~
6
6
  <html>
7
7
  <head>
8
- <title>#@name</title>
9
- <base href="\#{context.host_url}/" />
10
- <link rel="stylesheet" href="/system.css" type="text/css" media="screen" />
8
+ <title>System</title>
9
+ <base href="\#{context.host_url}\#{base}/" />
10
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
11
+ <!--
11
12
  <script src="/js/behaviour.js" type="text/javascript"> </script>
12
13
  <script src="/js/prototype.js" type="text/javascript"> </script>
13
14
  <script src="/js/effects.js" type="text/javascript"> </script>
14
15
  <script src="/js/dragdrop.js" type="text/javascript"> </script>
15
16
  <script src="/js/controls.js" type="text/javascript"> </script>
16
- <script src="/js/scaffold.js" type="text/javascript"> </script>
17
+ -->
18
+ <link rel="stylesheet" href="stylesheet/system" type="text/css" media="screen" />
17
19
  </head>
18
20
  <body>
19
- <h1><a href="/">Home</a> / #@name</h1>
21
+ <h1>#@title</h1>
20
22
  #{content}
21
- <br />
22
- Powered by <a href="http://www.nitrohq.com">Nitro</a> version #{Nitro::Version}
23
+ <p>Powered by <a href="http://www.nitrohq.com">Nitro</a> version #{Nitro::Version}</p>
23
24
  </body>
24
- <script type="text/javascript" src="js/scaffold.js" />
25
25
  </html>
26
26
  ~
27
27
  end
@@ -0,0 +1,135 @@
1
+ img {
2
+ border: none;
3
+ }
4
+
5
+ input {
6
+ border: 1px solid #ccc;
7
+ font-size: 12px;
8
+ background: #fff;
9
+ padding: 2px;
10
+ }
11
+
12
+ textarea {
13
+ border: 1px solid #ccc;
14
+ background: #fff;
15
+ padding: 2px;
16
+ }
17
+
18
+ input:hover, textarea:hover {
19
+ border: 1px solid #999;
20
+ }
21
+
22
+ input:focus, textarea:focus {
23
+ border: 1px solid #f00;
24
+ }
25
+
26
+ input.button {
27
+ color: #fff;
28
+ background: #999;
29
+ border: 1px solid #999;
30
+ font-weight: bold;
31
+ }
32
+
33
+ input.button:hover {
34
+ background: #f00;
35
+ border: 1px solid #f00;
36
+ }
37
+
38
+ select {
39
+ border: 1px solid #ccc;
40
+ }
41
+
42
+ table {
43
+ width: 100%;
44
+ border-collapse: collapse;
45
+ }
46
+
47
+ table th {
48
+ padding: 5px;
49
+ background: #eee;
50
+ border: 1px solid #ccc;
51
+ }
52
+
53
+ table td {
54
+ padding: 5px;
55
+ border: 1px solid #ccc;
56
+ }
57
+
58
+ /* --- forms --- */
59
+
60
+ form dl {
61
+ width: 100%;
62
+ margin: 0px;
63
+ }
64
+
65
+ form dt {
66
+ display: block;
67
+ margin: 0px;
68
+ margin-right: 10px;
69
+ padding-bottom: 10px;
70
+ font-weight: bold;
71
+ }
72
+
73
+ form dd {
74
+ display: block;
75
+ margin: 0px;
76
+ padding-bottom: 10px;
77
+ }
78
+
79
+ input {
80
+ border: 1px solid #ccc;
81
+ }
82
+
83
+ textarea {
84
+ width: 90%;
85
+ height: 200px;
86
+ }
87
+
88
+ /* --- pager --- */
89
+
90
+ .pager {
91
+ margin-top: 40px; margin-bottom: 50px;
92
+ border-top: 1px solid #ccc;
93
+ background-color: #f0f0f0;
94
+ }
95
+
96
+ .pager .first {
97
+ float: left;
98
+ padding: 5px;
99
+ }
100
+
101
+ .pager .previous {
102
+ float: left;
103
+ padding: 5px;
104
+ margin-left: 5px;
105
+ }
106
+
107
+ .pager .next {
108
+ float: right;
109
+ padding: 5px;
110
+ margin-right: 5px;
111
+ }
112
+
113
+ .pager .last {
114
+ float: right;
115
+ padding: 5px;
116
+ }
117
+
118
+ .pager ul {
119
+ float: left;
120
+ margin: 0px;
121
+ padding: 0px;
122
+ }
123
+
124
+ .pager li {
125
+ float: left;
126
+ display: inline;
127
+ padding: 5px;
128
+ padding-left: 10px;
129
+ padding-right: 10px;
130
+ background: none;
131
+ }
132
+
133
+ .pager li.active {
134
+ background-color: #ffa;
135
+ }