nitro 0.10.0 → 0.11.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 (99) hide show
  1. data/AUTHORS +4 -1
  2. data/ChangeLog +290 -7
  3. data/README +3 -3
  4. data/RELEASES +94 -0
  5. data/Rakefile +7 -7
  6. data/benchmark/og/bench.rb +11 -10
  7. data/{ChangeLog.1 → doc/ChangeLog.1} +0 -0
  8. data/doc/apache.txt +9 -0
  9. data/doc/architecture.txt +1 -27
  10. data/doc/bugs.txt +11 -4
  11. data/doc/config.txt +22 -0
  12. data/doc/og_config.txt +35 -0
  13. data/doc/og_tutorial.txt +595 -0
  14. data/doc/tutorial.txt +22 -0
  15. data/examples/blog/conf/apache.conf +30 -0
  16. data/examples/blog/conf/lhttpd.conf +2 -2
  17. data/examples/blog/lib/blog/controller.rb +11 -2
  18. data/examples/blog/log/apache.error_log +5528 -0
  19. data/examples/blog/root/fcgi.rb +1 -1
  20. data/examples/blog/run.rb +9 -3
  21. data/examples/flash/run.rb +2 -2
  22. data/examples/no_xsl_blog/conf/apache.conf +30 -0
  23. data/examples/no_xsl_blog/conf/lhttpd.conf +1 -1
  24. data/examples/no_xsl_blog/lib/blog/controller.rb +2 -2
  25. data/examples/no_xsl_blog/log/apache.error_log +68 -0
  26. data/examples/no_xsl_blog/root/fcgi.rb +2 -2
  27. data/examples/no_xsl_blog/run.rb +3 -3
  28. data/examples/og/run.rb +1 -1
  29. data/examples/tiny/conf/apache.conf +29 -4
  30. data/examples/tiny/conf/lhttpd.conf +1 -1
  31. data/examples/tiny/log/apache.error_log +30 -0
  32. data/examples/tiny/root/fcgi.rb +2 -2
  33. data/examples/tiny/root/index.xhtml +1 -1
  34. data/examples/tiny/run.rb +3 -2
  35. data/examples/wee_style/run.rb +7 -9
  36. data/examples/why_wiki/README +5 -0
  37. data/examples/why_wiki/run.rb +57 -0
  38. data/examples/why_wiki/wiki.yml +6 -0
  39. data/examples/wiki.yml +1 -0
  40. data/lib/glue/array.rb +14 -33
  41. data/lib/glue/hash.rb +32 -53
  42. data/lib/glue/pool.rb +9 -12
  43. data/lib/glue/property.rb +31 -9
  44. data/lib/nitro.rb +30 -8
  45. data/lib/nitro/adapters/cgi.rb +23 -3
  46. data/lib/nitro/adapters/webrick.rb +9 -3
  47. data/lib/nitro/builders/form.rb +21 -13
  48. data/lib/nitro/builders/rss.rb +20 -9
  49. data/lib/nitro/builders/table.rb +69 -10
  50. data/lib/nitro/builders/xhtml.rb +13 -4
  51. data/lib/nitro/component.rb +15 -0
  52. data/lib/nitro/conf.rb +4 -3
  53. data/lib/nitro/context.rb +22 -14
  54. data/lib/nitro/controller.rb +63 -5
  55. data/lib/nitro/dispatcher.rb +11 -6
  56. data/lib/nitro/output.rb +28 -0
  57. data/lib/nitro/render.rb +78 -59
  58. data/lib/nitro/request.rb +5 -1
  59. data/lib/nitro/runner.rb +20 -6
  60. data/lib/nitro/session.rb +89 -18
  61. data/lib/nitro/session/drb.rb +31 -0
  62. data/lib/nitro/session/drbserver.rb +71 -0
  63. data/lib/nitro/session/memory.rb +13 -0
  64. data/lib/nitro/simple.rb +7 -0
  65. data/lib/nitro/ui/date-select.rb +2 -5
  66. data/lib/nitro/ui/pager.rb +4 -4
  67. data/lib/nitro/ui/tabs.rb +2 -4
  68. data/lib/nitro/uri.rb +7 -4
  69. data/lib/og.rb +20 -12
  70. data/lib/og/adapter.rb +40 -13
  71. data/lib/og/adapters/filesys.rb +121 -0
  72. data/lib/og/adapters/mysql.rb +10 -5
  73. data/lib/og/adapters/oracle.rb +374 -0
  74. data/lib/og/adapters/psql.rb +10 -23
  75. data/lib/og/adapters/sqlite.rb +3 -3
  76. data/lib/og/backend.rb +2 -2
  77. data/lib/og/connection.rb +6 -6
  78. data/lib/og/database.rb +5 -5
  79. data/lib/og/enchant.rb +6 -2
  80. data/lib/og/meta.rb +56 -26
  81. data/lib/og/mock.rb +1 -1
  82. data/lib/og/typemacros.rb +23 -0
  83. data/lib/parts/content.rb +4 -10
  84. data/test/nitro/adapters/tc_cgi.rb +1 -1
  85. data/test/nitro/builders/tc_rss.rb +1 -1
  86. data/test/nitro/builders/tc_table.rb +30 -0
  87. data/test/nitro/tc_context.rb +4 -0
  88. data/test/nitro/tc_controller.rb +9 -2
  89. data/test/og/tc_filesys.rb +83 -0
  90. data/test/og/tc_meta.rb +55 -0
  91. data/test/tc_og.rb +115 -36
  92. data/vendor/README +11 -5
  93. data/vendor/breakpoint.rb +35 -38
  94. data/vendor/breakpoint_client.rb +119 -80
  95. data/vendor/composite_sexp_processor.rb +43 -0
  96. data/vendor/parse_tree.rb +745 -0
  97. data/vendor/sexp_processor.rb +453 -0
  98. metadata +34 -7
  99. data/examples/no_xsl_blog/conf/app.conf.rb +0 -47
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: sqlite.rb 259 2005-02-15 08:54:54Z gmosx $
3
+ # $Id: sqlite.rb 263 2005-02-23 13:45:08Z gmosx $
4
4
 
5
5
  require 'sqlite3'
6
6
  require 'fileutils'
@@ -9,7 +9,7 @@ require 'og/adapter'
9
9
  require 'og/connection'
10
10
  require 'glue/attribute'
11
11
 
12
- class Og
12
+ module Og
13
13
 
14
14
  # The SQLite adapter. This adapter communicates with
15
15
  # an SQLite3 rdbms. For extra documentation see
@@ -79,7 +79,7 @@ class SqliteAdapter < Adapter
79
79
  end
80
80
 
81
81
  def new_connection(db)
82
- return Og::SqliteConnection.new(db)
82
+ return SqliteConnection.new(db)
83
83
  end
84
84
 
85
85
  def calc_field_index(klass, db)
@@ -1,12 +1,12 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: backend.rb 249 2005-02-04 14:03:00Z gmosx $
3
+ # $Id: backend.rb 263 2005-02-23 13:45:08Z gmosx $
4
4
 
5
5
  require 'yaml'
6
6
 
7
7
  require 'og/connection'
8
8
 
9
- class Og
9
+ module Og
10
10
 
11
11
  # Abstract backend. A backend communicates with the RDBMS.
12
12
  # This is the base class for the various backend implementations.
@@ -1,8 +1,8 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: connection.rb 254 2005-02-10 12:44:05Z gmosx $
3
+ # $Id: connection.rb 265 2005-02-24 08:46:54Z gmosx $
4
4
 
5
- class Og;
5
+ module Og;
6
6
 
7
7
  require 'glue/property'
8
8
  require 'glue/array'
@@ -12,7 +12,7 @@ require 'glue/time'
12
12
  # functionality. A backend specific implementation file (driver)
13
13
  # implements all methods.
14
14
  #
15
- # == Future
15
+ # === Future
16
16
  #
17
17
  # - support caching.
18
18
  # - support prepared statements.
@@ -41,7 +41,6 @@ class Connection
41
41
  # Close the connection to the database.
42
42
 
43
43
  def close
44
- @store.close
45
44
  Logger.debug "Closed DB connection." if $DBG
46
45
  end
47
46
 
@@ -283,11 +282,12 @@ class Connection
283
282
  end
284
283
 
285
284
  # TODO: implement this as stored procedure? naaah.
285
+ # TODO: also handle many_to_many relations.
286
286
 
287
287
  transaction do |tx|
288
288
  tx.exec "DELETE FROM #{klass::DBTABLE} WHERE oid=#{oid}"
289
- if cascade and klass.__meta.include?(:has)
290
- klass.__meta[:has].each do |dclass, linkback|
289
+ if cascade and klass.__meta.include?(:descendants)
290
+ klass.__meta[:descendants].each do |dclass, linkback|
291
291
  tx.exec "DELETE FROM #{dclass::DBTABLE} WHERE #{linkback}=#{oid}"
292
292
  end
293
293
  end
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: database.rb 255 2005-02-10 12:45:32Z gmosx $
3
+ # $Id: database.rb 265 2005-02-24 08:46:54Z gmosx $
4
4
 
5
5
  require 'glue/logger'
6
6
  require 'glue/attribute'
@@ -13,7 +13,7 @@ require 'glue/pool'
13
13
  require 'og/enchant'
14
14
  require 'og/meta'
15
15
 
16
- class Og
16
+ module Og
17
17
 
18
18
  # Encapsulates an Og Database.
19
19
 
@@ -87,8 +87,8 @@ class Database
87
87
  end
88
88
  end
89
89
 
90
- Logger.info "Og auto manages the following classes:"
91
- Logger.info "#{classes_to_manage.inspect}"
90
+ Logger.debug "Og auto manages the following classes:"
91
+ Logger.debug "#{classes_to_manage.inspect}"
92
92
 
93
93
  manage_classes(*classes_to_manage)
94
94
  end
@@ -201,7 +201,7 @@ class Database
201
201
  }
202
202
 
203
203
  # Create the schema for this class if not available.
204
- @adapter.create_table(klass, self)
204
+ @adapter.create_table(klass, self) if Og.create_schema
205
205
 
206
206
  # Precompile some code that gets executed all the time.
207
207
  # Deletion code is not precompiled, because it is not used
@@ -1,8 +1,8 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: meta.rb 198 2004-12-22 11:26:59Z gmosx $
3
+ # $Id$
4
4
 
5
- class Og
5
+ module Og
6
6
 
7
7
  module Enchant
8
8
 
@@ -60,6 +60,10 @@ module Enchant
60
60
  Og.db.delete(obj_or_oid, #{klass})
61
61
  end
62
62
 
63
+ def self.properties_and_relations
64
+ @@__meta[:props_and_relations]
65
+ end
66
+
63
67
  def each(&block)
64
68
  all.each(&block)
65
69
  end
@@ -1,17 +1,29 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: meta.rb 254 2005-02-10 12:44:05Z gmosx $
3
+ # $Id: meta.rb 266 2005-02-28 14:50:48Z gmosx $
4
4
  #--
5
5
  # TODO:
6
6
  # - precreate the meta sql statements as much as possible to
7
7
  # avoid string interpolations.
8
8
  #++
9
9
 
10
- require 'og/adapter'
11
10
  require 'glue/inflector'
11
+ require 'og/adapter'
12
+ require 'og/typemacros'
12
13
 
13
- class Og
14
+ module Og
14
15
 
16
+ class Relation < N::Property
17
+ alias foreign_class klass
18
+ end
19
+
20
+ class Has < Relation; end
21
+ class HasMany < Has; end
22
+ class HasOne < Has; end
23
+ class ManyToMany < Has; end
24
+ class BelongsTo < Relation; end
25
+ class RefersTo < Relation; end
26
+
15
27
  # Some useful meta-language utilities.
16
28
 
17
29
  module MetaUtils # :nodoc: all
@@ -31,6 +43,9 @@ module MetaUtils # :nodoc: all
31
43
  # in order to avoid forward declarations a symbol is given instead
32
44
  # of a class. Other times on class is given at all, and
33
45
  # the inflection mechanism is used to infer the class name.
46
+ #--
47
+ # This is not used yet.
48
+ #++
34
49
 
35
50
  def self.resolve_class(name, klass)
36
51
  klass ||= N::Inflector.camelize(name)
@@ -86,7 +101,7 @@ module MetaLanguage
86
101
  prop_eval << ", :sql => '#{options[:sql]}'" if options[:sql]
87
102
  prop_eval << ", :extra_sql => '#{options[:extra_sql]}'" if options[:extra_sql]
88
103
 
89
- meta :belongs_to, klass
104
+ meta :props_and_relations, BelongsTo.new(name, klass, :property => "#{name}_oid".intern)
90
105
 
91
106
  module_eval %{
92
107
  #{prop_eval}
@@ -122,7 +137,8 @@ module MetaLanguage
122
137
 
123
138
  linkback = options[:linkback] || "#{MetaUtils.expand(self)}_oid"
124
139
 
125
- meta :has, [klass, linkback]
140
+ meta :descendants, klass, linkback
141
+ meta :props_and_relations, HasOne.new(name, klass, :linkback => linkback)
126
142
 
127
143
  module_eval %{
128
144
  def #{name}(extrasql = nil)
@@ -141,12 +157,17 @@ module MetaLanguage
141
157
  # Example:
142
158
  #
143
159
  # class MyObject
144
- # has_many :children, AnotherObject
160
+ # has_many :articles, Article
145
161
  # end
146
162
  #
147
163
  # creates the code:
148
164
  #
149
- # def children; ... end
165
+ # obj.articles
166
+ # obj.add_article(article)
167
+ # obj.add_article do |a|
168
+ # a.title = 'Title'
169
+ # a.body = 'Body'
170
+ # end
150
171
 
151
172
  def has_many(name, klass, options = {})
152
173
  name_s = N::Inflector.singularize(name.to_s)
@@ -159,7 +180,8 @@ module MetaLanguage
159
180
  # keep belongs to metadata, useful for
160
181
  # reflection/scaffolding.
161
182
 
162
- meta :has, [klass, linkback]
183
+ meta :descendants, klass, linkback
184
+ meta :props_and_relations, HasMany.new(name, klass, :linkback => linkback)
163
185
 
164
186
  module_eval %{
165
187
  def #{name}(extrasql = nil)
@@ -170,7 +192,8 @@ module MetaLanguage
170
192
  Og.db.count("SELECT COUNT(*) FROM #{Og::Adapter.table(klass)} WHERE #{linkback}=\#\@oid \#\{extrasql\}")
171
193
  end
172
194
 
173
- def add_#{name_s}(obj, extra = nil)
195
+ def add_#{name_s}(obj = nil)
196
+ yield(obj = #{klass}.new) unless obj
174
197
  obj.#{linkback} = @oid
175
198
  obj.save!
176
199
  end
@@ -196,6 +219,7 @@ module MetaLanguage
196
219
  # article.categories
197
220
  # article.del_category
198
221
  # article.add_category
222
+ # article.add_category { |c| ... }
199
223
  # article.clear_categories
200
224
  #
201
225
  # category.articles
@@ -210,7 +234,7 @@ module MetaLanguage
210
234
  list_m = options[:linkback] || N::Inflector.plural_name(self)
211
235
  prop_m = N::Inflector.singularize(list_m)
212
236
 
213
- # exit if the class is allready indirectly 'enchanted' from the
237
+ # Exit if the class is allready indirectly 'enchanted' from the
214
238
  # other class of the many_to_many relation.
215
239
 
216
240
  return if self.respond_to?(prop_m)
@@ -218,27 +242,31 @@ module MetaLanguage
218
242
  # Add some metadata to the class to allow for automatic join table
219
243
  # calculation.
220
244
 
221
- meta :sql_join, [klass, options]
245
+ meta :sql_join, klass, options
246
+
247
+ # FIXME: should add metadata for cascading delete.
222
248
 
223
- meta :many_to_many, klass
224
- klass.meta :many_to_many, self
249
+ meta :props_and_relations, ManyToMany.new(prop_o, klass)
250
+ klass.meta :props_and_relations, ManyToMany.new(prop_m, self)
225
251
 
226
- # enchant this class
252
+ # Enchant this class
227
253
 
228
254
  module_eval %{
229
255
  def #{list_o}(extrasql = nil)
230
- Og.db.select("SELECT d.* FROM #{Og::Adapter.table(klass)} AS d, #{Og::Adapter.join_table(self, klass)} AS j WHERE j.key1=\#\@oid AND j.key2=d.oid \#\{extrasql\}", #{klass})
231
- end
256
+ Og.db.select("SELECT d.* FROM #{Og::Adapter.table(klass)} d, #{Og::Adapter.join_table(self, klass)} j WHERE j.key1=\#\@oid AND j.key2=d.oid \#\{extrasql\}", #{klass})
257
+ end
232
258
 
233
259
  def #{list_o}_count(extrasql = nil)
234
- Og.db.select("SELECT COUNT(*) FROM #{Og::Adapter.table(klass)} AS d, #{Og::Adapter.join_table(self, klass)} AS j WHERE j.key1=\#\@oid AND j.key2=d.oid \#\{extrasql\}", #{klass})
260
+ Og.db.select("SELECT COUNT(*) FROM #{Og::Adapter.table(klass)} d, #{Og::Adapter.join_table(self, klass)} j WHERE j.key1=\#\@oid AND j.key2=d.oid \#\{extrasql\}", #{klass})
235
261
  end
236
262
 
237
- def add_#{prop_o}(obj, extra = nil)
263
+ def add_#{prop_o}(obj = nil)
264
+ yield(obj = #{klass}.new) unless obj
265
+ obj.save! unless obj.oid
238
266
  Og.db.exec("INSERT INTO #{Og::Adapter.join_table(self, klass)} (key1, key2) VALUES (\#\@oid, \#\{obj.oid\})")
239
267
  end
240
268
 
241
- def delete_#{prop_o}(obj_or_oid, extra = nil)
269
+ def delete_#{prop_o}(obj_or_oid)
242
270
  Og.db.exec("DELETE FROM #{Og::Adapter.join_table(self, klass)} WHERE key2=\#\{obj_or_oid.to_i\}")
243
271
  end
244
272
 
@@ -251,18 +279,20 @@ module MetaLanguage
251
279
 
252
280
  klass.module_eval %{
253
281
  def #{list_m}(extrasql = nil)
254
- Og.db.select("SELECT s.* FROM #{Og::Adapter.table(self)} AS s, #{Og::Adapter.join_table(self, klass)} AS j WHERE j.key2=\#\@oid AND j.key1=s.oid \#\{extrasql\}", #{self})
282
+ Og.db.select("SELECT s.* FROM #{Og::Adapter.table(self)} s, #{Og::Adapter.join_table(self, klass)} j WHERE j.key2=\#\@oid AND j.key1=s.oid \#\{extrasql\}", #{self})
255
283
  end
256
284
 
257
285
  def #{list_m}_count(extrasql = nil)
258
- Og.db.select("SELECT COUNT(*) FROM #{Og::Adapter.table(self)} AS s, #{Og::Adapter.join_table(self, klass)} AS j WHERE j.key2=\#\@oid AND j.key1=s.oid \#\{extrasql\}", #{self})
286
+ Og.db.select("SELECT COUNT(*) FROM #{Og::Adapter.table(self)} s, #{Og::Adapter.join_table(self, klass)} j WHERE j.key2=\#\@oid AND j.key1=s.oid \#\{extrasql\}", #{self})
259
287
  end
260
288
 
261
- def add_#{prop_m}(obj, extra = nil)
289
+ def add_#{prop_m}(obj = nil)
290
+ yield(obj = #{self}.new) unless obj
291
+ obj.save! unless obj.oid
262
292
  Og.db.exec("INSERT INTO #{Og::Adapter.join_table(self, klass)} (key1, key2) VALUES (\#\{obj.oid\}, \#\@oid)")
263
293
  end
264
294
 
265
- def delete_#{prop_m}(obj_or_oid, extra = nil)
295
+ def delete_#{prop_m}(obj_or_oid)
266
296
  Og.db.exec("DELETE FROM #{Og::Adapter.join_table(self, klass)} WHERE key1=\#\{obj_or_oid.to_i\}")
267
297
  end
268
298
 
@@ -300,8 +330,8 @@ module MetaLanguage
300
330
  prop_eval << ", :sql => '#{options[:sql]}'" if options[:sql]
301
331
  prop_eval << ", :extra_sql => '#{options[:extra_sql]}'" if options[:extra_sql]
302
332
 
303
- meta :refers_to, klass
304
- klass.meta :has, [self, "#{name}_oid"]
333
+ meta :props_and_relations, RefersTo.new(name, klass, :property => "#{name}_oid".intern)
334
+ klass.meta :descendants, self, "#{name}_oid".intern
305
335
 
306
336
  module_eval %{
307
337
  #{prop_eval}
@@ -321,7 +351,7 @@ module MetaLanguage
321
351
  # methods are generated.
322
352
 
323
353
  def joins(klass, options = {})
324
- meta :joins, [klass, options]
354
+ meta :joins, klass, options
325
355
  end
326
356
 
327
357
  end
@@ -7,7 +7,7 @@ require 'flexmock'
7
7
 
8
8
  require 'og'
9
9
 
10
- class Og
10
+ module Og
11
11
 
12
12
  # A utility object to Mock a Database in test units.
13
13
  # Extends the standard FlexMock object.
@@ -0,0 +1,23 @@
1
+ # * George Moschovitis <gm@navel.gr>
2
+ # (c) 2004-2005 Navel, all rights reserved.
3
+ # $Id: typemacros.rb 267 2005-02-28 14:52:41Z gmosx $
4
+
5
+ module Og
6
+
7
+ # Some useful type macros to help when defining managed
8
+ # objects. You can easily code your own type macros.
9
+ # Just return the array that should be passed
10
+ #
11
+ # === Example
12
+ #
13
+ # property :name, Og.VarChar(30)
14
+
15
+ def VarChar(size)
16
+ return String, :sql => "VARCHAR(#{size})"
17
+ end
18
+
19
+ NotNull = {:sql => "NOT NULL"}.freeze
20
+
21
+ Null = {:sql => "NULL"}.freeze
22
+
23
+ end
@@ -6,10 +6,8 @@ require 'nitro/markup'
6
6
 
7
7
  module N
8
8
 
9
- # = BaseContent
10
- #
11
9
  # The foundamental Content Unit.
12
- #
10
+
13
11
  module BaseContent
14
12
  include Markup
15
13
 
@@ -17,8 +15,8 @@ module BaseContent
17
15
  prop_accessor :body, String, :markup => true, :ui => :textarea
18
16
  end
19
17
 
20
- # = CreateTime mixin.
21
- #
18
+ # CreateTime mixin.
19
+
22
20
  module CreateTime
23
21
  prop_accessor :create_time, Time
24
22
  prop_accessor :update_time, Time
@@ -32,8 +30,6 @@ module CreateTime
32
30
  end
33
31
  end
34
32
 
35
- # = Content
36
- #
37
33
  # The foundamental Content Unit.
38
34
  #--
39
35
  # THINK: rename this to Entity?
@@ -50,14 +46,12 @@ module Content
50
46
  end
51
47
  end
52
48
 
53
- # = Category
49
+ # A Category.
54
50
 
55
51
  class Category
56
52
  include BaseContent
57
53
  end
58
54
 
59
- # = ACL
60
- #
61
55
  # Unix style permissions.
62
56
 
63
57
  module ACL
@@ -57,7 +57,7 @@ class TC_AdaptersCgi < Test::Unit::TestCase # :nodoc: all
57
57
  'Content-Type' => 'text/html'
58
58
  }
59
59
 
60
- res = "HTTP/1.1 200 OK \r\nContent-Type: text/html\r\nSet-Cookie: nauthnauth=gmosx\r\nSet-Cookie: nsidnsid=1233\r\n\r\n"
60
+ res = "Status: 200 OK\r\nContent-Type: text/html\r\nSet-Cookie: nauthnauth=gmosx\r\nSet-Cookie: nsidnsid=1233\r\n\r\n"
61
61
  assert_equal res, CgiUtils.response_headers(ctx)
62
62
  end
63
63
  =begin
@@ -13,7 +13,7 @@ class TC_BuildersRss < Test::Unit::TestCase # :nodoc: all
13
13
  blogs << Blog.new('Hello2', 'World2', 'uri2');
14
14
  blogs << Blog.new('Hello3', 'World3', 'uri3');
15
15
 
16
- rss = N::RssBuilder.render(blogs, :link => 'http://www.navel.gr')
16
+ rss = N::RssBuilder.build(blogs, :link => 'http://www.navel.gr')
17
17
 
18
18
  assert_match %r{<link>http://www.navel.gr/uri1</link>}, rss
19
19
  assert_match %r{<link>http://www.navel.gr/uri2</link>}, rss
@@ -0,0 +1,30 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib')
2
+
3
+ require 'test/unit'
4
+ require 'nitro/builders/table'
5
+
6
+ class TC_BuildersTable < Test::Unit::TestCase # :nodoc: all
7
+ include N
8
+
9
+ User = Struct.new(:name, :password, :email)
10
+
11
+ def setup
12
+ @headers = %w{Name Password Email}
13
+ @users = [
14
+ User.new('gmosx', 'huh?', 'gm@nowhere.com'),
15
+ User.new('renos', 'nah', 'renos@nowhere.com'),
16
+ User.new('stella', 'hoh', 'stella@love.com')
17
+ ]
18
+ end
19
+
20
+ def teardown
21
+ @users = nil
22
+ end
23
+
24
+ def test_table
25
+ values = @users.collect { |u| [u.name, u.password, u.email] }
26
+ table = TableBuilder.build(:id => 'test', :headers => @headers, :values => values)
27
+ res = %|<table id="test"><tr><th>Name</th><th>Password</th><th>Email</th></tr><tr><td>gmosx</td><td>huh?</td><td>gm@nowhere.com</td></tr><tr><td>renos</td><td>nah</td><td>renos@nowhere.com</td></tr><tr><td>stella</td><td>hoh</td><td>stella@love.com</td></tr></table>|
28
+ assert_equal res, table
29
+ end
30
+ end