nitro 0.31.0 → 0.40.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,4 @@
1
+ require 'nitro/scaffold/model'
2
+
3
+ module Nitro::Scaffold
4
+ end
@@ -0,0 +1,27 @@
1
+ <Page>
2
+
3
+ <SitePath>
4
+ <a href="/">#{Server.map['/'].ann.index[:title] || 'Home'}</a> /
5
+ <a href="#{AdminController.mount_point}">Admin</a> /
6
+ Og
7
+ </SitePath>
8
+
9
+ <?r
10
+ @headers = [ 'Class', 'Count', ' ', ' ', ' ', ' ', ' ' ]
11
+ @values = @classes.inject([]) do |v, c|
12
+ name = class_to_name(c)
13
+ v << [
14
+ %{<a href="#{R :list, :name, name}">#{c.name.gsub(/::/, ' ')}</a>},
15
+ c.count,
16
+ %{<a href="#{R :create, :name, name}">create</a>},
17
+ %{<a href="#{R :list, :name, name}">list</a>},
18
+ %{<a href="#{R :search, :name, name}">search</a>},
19
+ %{<a href="#{R :delete_class, :name, name}" onclick="confirm('Are you sure?')">delete</a>},
20
+ %{<a href="#{R :destroy_class, :name, name}" onclick="confirm('Are you sure?')">destroy</a>}
21
+ ]
22
+ end
23
+ ?>
24
+
25
+ #{table :headers => @headers, :values => @values, :alternating_rows => true, :class => :data}
26
+
27
+ </Page>
@@ -0,0 +1,38 @@
1
+ <Page>
2
+
3
+ <SitePath>
4
+ <a href="/">#{Server.map['/'].ann.index[:title] || 'Home'}</a> /
5
+ <a href="#{AdminController.mount_point}">Admin</a> /
6
+ <a href="#{OgAdminController.mount_point}">Og</a> /
7
+ <?r if action_name == 'list' ?>
8
+ #{@klass.name.gsub(/::/, ' ').plural}
9
+ <?r else ?>
10
+ Search results
11
+ <?r end ?>
12
+ </SitePath>
13
+
14
+ <?r
15
+ unless @objects.empty?
16
+ @headers = [ 'Name', ' ', ' ' ]
17
+ @values = @objects.inject([]) do |v, o|
18
+ v << [
19
+ %{<a href="#{R :update, :name, class_to_name(@klass), :oid, o.oid}">#{o}</a>},
20
+ %{<a href="#{R :update, :name, class_to_name(@klass), :oid, o.oid}">update</a>},
21
+ %{<a href="#{R :delete, :name, class_to_name(@klass), :oid, o.oid}" onclick="confirm('Are you sure?')">delete</a>}
22
+ ]
23
+ end
24
+ ?>
25
+
26
+ #{table :headers => @headers, :values => @values, :alternating_rows => true, :class => :data}
27
+
28
+ <div class="pager" if="@pager and @pager.navigation?">
29
+ #{@pager.navigation}
30
+ </div>
31
+
32
+ <?r else ?>
33
+
34
+ No objects.
35
+
36
+ <?r end ?>
37
+
38
+ </Page>
@@ -0,0 +1,20 @@
1
+ <Page>
2
+
3
+ <SitePath>
4
+ <a href="/">#{Server.map['/'].ann.index[:title] || 'Home'}</a> /
5
+ <a href="#{AdminController.mount_point}">Admin</a> /
6
+ <a href="#{OgAdminController.mount_point}">Og</a> /
7
+ <a href="#{R OgAdminController, :list, :name, @obj.class}">#{@obj.class.name.gsub(/::/, ' ').plural}</a> /
8
+ Search
9
+ </SitePath>
10
+
11
+ #{form :object => @obj, :action => "#{R :search_results}", :method => :post do |f|
12
+ f.form_errors
13
+ f.hidden :object_class_name, class_to_name(@obj.class)
14
+ f.attributes
15
+ f.br
16
+ f.submit 'Search'
17
+ f.text ' or <a href="' + R(:list, :name, class_to_name(@obj.class)) + '">Cancel</a>'
18
+ end}
19
+
20
+ </Page>
@@ -0,0 +1,25 @@
1
+ <Page>
2
+
3
+ <SitePath>
4
+ <a href="/">#{Server.map['/'].ann.index[:title] || 'Home'}</a> /
5
+ <a href="#{AdminController.mount_point}">Admin</a> /
6
+ <a href="#{OgAdminController.mount_point}">Og</a> /
7
+ <a href="#{R OgAdminController, :list, :name, @obj.class}">#{@obj.class.name.gsub(/::/, ' ').plural}</a> /
8
+ <?r if action_name == 'update' ?>
9
+ Update '#@obj'
10
+ <?r else ?>
11
+ Create new #{@obj.class.name.gsub(/::/, ' ')}
12
+ <?r end ?>
13
+ </SitePath>
14
+
15
+ #{form :object => @obj, :action => "#{R :save}", :method => :post, :enctype => "multipart/form-data" do |f|
16
+ f.form_errors
17
+ f.hidden :object_class_name, class_to_name(@obj.class)
18
+ f.attributes
19
+ f.relations
20
+ f.br
21
+ f.submit 'Save'
22
+ f.text ' or <a href="' + R(:list, :name, class_to_name(@obj.class)) + '">Cancel</a>'
23
+ end}
24
+
25
+ </Page>
@@ -0,0 +1,207 @@
1
+ module AdminSkin
2
+
3
+ class Page
4
+
5
+ def head
6
+ %~
7
+ <head>
8
+ <title>\#{sitepath}</title>
9
+ <meta name="generator" content="nitro" />
10
+ <meta name="title" content="\#{sitepath}" />
11
+ <meta name="description" content="Nitro Administration" />
12
+ <meta name="category" content="portal" />
13
+ <meta name="robots" content="index, nofollow" />
14
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
15
+ <!--
16
+ <link rel="stylesheet" href="/style.css" type="text/css" />
17
+ <link rel="alternate" type="application/rss+xml" title="Recent changes" href="\#{context.host_url}/feed" />
18
+ <script type="text/javascript" src="/js/dojo.js">
19
+ dojo.require('dojo.io.cookie');
20
+ </script>
21
+ <script type="text/javascript" src="/js/rounded_corners_lite.inc.js">//</script>
22
+ -->
23
+ #{css}
24
+ </head>
25
+ ~
26
+ end
27
+
28
+ def css
29
+ %~
30
+ <style>
31
+ label {
32
+ font-weight: bold;
33
+ display: block;
34
+ }
35
+
36
+ img {
37
+ border: none;
38
+ }
39
+
40
+ input {
41
+ border: 1px solid #ccc;
42
+ font-size: 12px;
43
+ background: #fff;
44
+ padding: 2px;
45
+ }
46
+
47
+ textarea {
48
+ border: 1px solid #ccc;
49
+ background: #fff;
50
+ padding: 2px;
51
+ }
52
+
53
+ input:hover, textarea:hover {
54
+ border: 1px solid #999;
55
+ }
56
+
57
+ input:focus, textarea:focus {
58
+ border: 1px solid #f00;
59
+ }
60
+
61
+ input.button {
62
+ color: #fff;
63
+ background: #999;
64
+ border: 1px solid #999;
65
+ font-weight: bold;
66
+ }
67
+
68
+ input.button:hover {
69
+ background: #f00;
70
+ border: 1px solid #f00;
71
+ }
72
+
73
+ select {
74
+ border: 1px solid #ccc;
75
+ }
76
+
77
+ a:hover {
78
+ color: #f00;
79
+ }
80
+
81
+ /* --- forms --- */
82
+
83
+ form dl {
84
+ width: 100%;
85
+ margin: 0px;
86
+ }
87
+
88
+ form dt {
89
+ display: block;
90
+ margin: 0px;
91
+ margin-right: 10px;
92
+ padding-bottom: 10px;
93
+ font-weight: bold;
94
+ }
95
+
96
+ form dd {
97
+ display: block;
98
+ margin: 0px;
99
+ padding-bottom: 10px;
100
+ }
101
+
102
+ /* --- tables ---*/
103
+
104
+ table.data {
105
+ border-collapse: collapse;
106
+ }
107
+
108
+ .data th {
109
+ border-bottom: 1px solid #ccc;
110
+ background: #eee;
111
+ font-weight: bold;
112
+ text-align: left;
113
+ padding: 5px;
114
+ }
115
+
116
+ .data td {
117
+ border-bottom: 1px solid #ccc;
118
+ padding: 5px;
119
+ }
120
+
121
+ /* --- pager --- */
122
+
123
+ .pager {
124
+ margin-top: 40px; margin-bottom: 50px;
125
+ border-top: 1px solid #ccc;
126
+ background-color: #f0f0f0;
127
+ }
128
+
129
+ .pager .first {
130
+ float: left;
131
+ padding: 5px;
132
+ }
133
+
134
+ .pager .previous {
135
+ float: left;
136
+ padding: 5px;
137
+ margin-left: 5px;
138
+ }
139
+
140
+ .pager .next {
141
+ float: right;
142
+ padding: 5px;
143
+ margin-right: 5px;
144
+ }
145
+
146
+ .pager .last {
147
+ float: right;
148
+ padding: 5px;
149
+ }
150
+
151
+ .pager ul {
152
+ float: left;
153
+ margin: 0px;
154
+ padding: 0px;
155
+ }
156
+
157
+ .pager li {
158
+ float: left;
159
+ display: inline;
160
+ padding: 5px;
161
+ padding-left: 10px;
162
+ padding-right: 10px;
163
+ background: none;
164
+ }
165
+
166
+ .pager li.active {
167
+ background-color: #ffa;
168
+ }
169
+
170
+ .noitems {
171
+ padding: 5px;
172
+ text-align: center;
173
+ }
174
+ </style>
175
+ ~
176
+ end
177
+
178
+ def footer
179
+ %~
180
+ <br /><br />
181
+ Powered by <strong><a href="http://www.nitroproject.org" target="_blank">Nitro</a></strong>.
182
+ ~
183
+ end
184
+
185
+ def render
186
+ %~
187
+ <html>
188
+ #{head}
189
+ <body>
190
+ #{content}
191
+ #{footer}
192
+ </body>
193
+ </html>
194
+ ~
195
+ end
196
+ end
197
+
198
+ class SitePath
199
+ def render
200
+ %~
201
+ <h1>#{content}</h1>
202
+ <br /><br />
203
+ ~
204
+ end
205
+ end
206
+
207
+ end
@@ -0,0 +1,13 @@
1
+ <Page>
2
+
3
+ <SitePath>
4
+ <a href="/">#{Server.map['/'].ann.index[:title] || 'Home'}</a> /
5
+ System / Access denied
6
+ </SitePath>
7
+
8
+ <p>
9
+ You don't have permission to access this page. Please, return
10
+ to the <a href="/">home page</a>.
11
+ </p>
12
+
13
+ </Page>
@@ -0,0 +1,12 @@
1
+ <Page>
2
+
3
+ <SitePath>
4
+ <a href="/">#{Server.map['/'].ann.index[:title] || 'Home'}</a> /
5
+ Admin
6
+ </SitePath>
7
+
8
+ <ul>
9
+ <li><a href="#{R OgAdminController, :index}">Og Administration</a></li>
10
+ </ul>
11
+
12
+ </Page>
@@ -0,0 +1,2 @@
1
+
2
+ - use system plugins.
@@ -44,10 +44,12 @@
44
44
  <h1>Error</h1>
45
45
 
46
46
  <?r
47
- if Run.mode == :debug
47
+ response.status = 501
48
+
49
+ if Nitro.mode == :debug
48
50
  require 'cgi'
49
51
  ?>
50
- <?r for error, path in @context.rendering_errors ?>
52
+ <?r for error, path in @context.rendering_errors ?>
51
53
  <div class="path"><strong>Path:</strong> #{path}</div>
52
54
  <div class="error"><strong>#{CGI.escapeHTML(error.to_s)}</strong></div>
53
55
  <div class="load">
@@ -95,5 +95,3 @@ class Proto
95
95
  end
96
96
 
97
97
  Nitro.run(Proto)
98
-
99
- # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1 @@
1
+ # Please add me!
@@ -10,6 +10,7 @@ class TC_Request < Test::Unit::TestCase # :nodoc: all
10
10
 
11
11
  def initialize
12
12
  @headers = {}
13
+ @params = {}
13
14
  end
14
15
  end
15
16
 
@@ -34,5 +35,27 @@ class TC_Request < Test::Unit::TestCase # :nodoc: all
34
35
  req.instance_variable_set '@post_format', nil
35
36
  req.headers['CONTENT_TYPE'] = 'text/xml'
36
37
  assert req.xml_post?
38
+
39
+ req['test'] = 'hello'
40
+ assert req['test']
41
+ assert_equal 'hello', req['test']
42
+ assert req.has?('test')
43
+
44
+ assert !req.has?('phantom')
45
+
46
+ req['bug'] = nil
47
+ assert !req.has?('bug')
48
+ end
49
+
50
+ def test_local_net?
51
+ req = DummyRequest.new
52
+
53
+ local_ips = ["192.168.1.1", "192.168.20.1", "192.168.99.1", "192.168.200.1", "192.168.21.245", "192.168.90.34", "192.168.254.254", "172.16.1.1", "172.18.1.1", "172.31.254.1", "172.21.1.254", "10.16.1.1", "10.0.1.1", "10.254.1.254", "10.192.1.192", "10.254.254.254", "10.10.10.10"]
54
+
55
+ not_local_ips = ["191.168.1.1", "192.169.20.1", "193.168.254.254", "172.15.1.1", "171.18.1.1", "172.32.0.0", "173.21.1.254", "11.16.1.1", "66.249.93.104", "72.14.221.104", "66.102.9.104", "17.254.3.183", "207.46.250.119", "207.46.130.108", "207.68.160.190", "65.54.240.126", "213.199.144.151", "65.55.238.126"]
56
+
57
+ assert_equal true, local_ips.map { |ip| req.local_net?(ip) }.all?
58
+ assert_equal true, not_local_ips.map { |ip| req.local_net?(ip) }.all?{|v|!v}
37
59
  end
60
+
38
61
  end
@@ -133,6 +133,3 @@ class TC_FeedHelper < Test::Unit::TestCase # :nodoc: all
133
133
  end # test_opml
134
134
 
135
135
  end
136
-
137
- # * Fabian Buch <fabian@fabian-buch.de>
138
- # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1,74 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
2
+
3
+ require 'test/unit'
4
+ require 'nitro/helper/navigation'
5
+
6
+
7
+ class TC_NavigationHelper < Test::Unit::TestCase # :nodoc: all
8
+ include Nitro
9
+ include NavigationHelper
10
+ FirstController = Class.new(Controller) do
11
+ def self.mount_path() "controller1" end
12
+ end
13
+ Second = Class.new(Controller) do
14
+ def self.mount_path() "controller2" end
15
+ end
16
+ MockRequest=Struct.new(:path)
17
+ attr :request
18
+ def setup
19
+ @request=MockRequest.new("controller1")
20
+ end
21
+ def check_div(text)
22
+ #offsets accomodate \n
23
+ assert_equal '<div id="navcontainer">',text[0,23]
24
+ assert_equal '</div>',text[-8,6]
25
+ end
26
+ def check_ul(text)
27
+ assert_equal '<ul id="navlist">',text[25,17]
28
+ assert_equal '</ul>',text[-14,5]
29
+ end
30
+ def test_navfor_around_html
31
+ text= menu_for(FirstController)
32
+ check_div(text)
33
+ check_ul(text)
34
+ end
35
+
36
+ def test_navfor_inner_html_single
37
+ text= menu_for(FirstController)
38
+ text.gsub!(%r{</?(div|ul).*?>},'')
39
+ text.gsub!("\n",'')
40
+ assert_equal '<li id="active"><a href="controller1" id="current"> TC_NavigationHelper::First </a></li>',
41
+ text.strip
42
+ end
43
+ def test_navfor_inner_html_many
44
+ text = menu_for(FirstController,Second)
45
+ assert_match %r|href="controller1" id="current">| , text
46
+ assert_match %r|href="controller2">| , text
47
+ assert_match %r| TC_NavigationHelper::First | , text
48
+ assert_match %r| TC_NavigationHelper::Second |, text
49
+ end
50
+
51
+ def test_navfor_yielding
52
+ text= menu_for(FirstController,Second) do |controller|
53
+ controller==FirstController ? 'first' : 'second'
54
+ end
55
+ assert_match %r|<a href="controller1".*first </a>|,text
56
+ assert_match %r|<a href="controller2".*second </a>|,text
57
+ end
58
+ def test_navforhash_around_html
59
+ text= menu_from_hash('path'=>'text')
60
+ check_div(text)
61
+ check_ul(text)
62
+ end
63
+
64
+ def test_navforhash_inner_html_single
65
+ text= menu_from_hash('link'=>'text')
66
+ text.gsub!(%r{</?(div|ul).*?>},'')
67
+ text.gsub!("\n",'')
68
+ assert_equal '<li><a href="link"> text </a></li>',
69
+ text.strip
70
+ end
71
+
72
+
73
+
74
+ end