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.
- data/AUTHORS +4 -1
- data/ChangeLog +290 -7
- data/README +3 -3
- data/RELEASES +94 -0
- data/Rakefile +7 -7
- data/benchmark/og/bench.rb +11 -10
- data/{ChangeLog.1 → doc/ChangeLog.1} +0 -0
- data/doc/apache.txt +9 -0
- data/doc/architecture.txt +1 -27
- data/doc/bugs.txt +11 -4
- data/doc/config.txt +22 -0
- data/doc/og_config.txt +35 -0
- data/doc/og_tutorial.txt +595 -0
- data/doc/tutorial.txt +22 -0
- data/examples/blog/conf/apache.conf +30 -0
- data/examples/blog/conf/lhttpd.conf +2 -2
- data/examples/blog/lib/blog/controller.rb +11 -2
- data/examples/blog/log/apache.error_log +5528 -0
- data/examples/blog/root/fcgi.rb +1 -1
- data/examples/blog/run.rb +9 -3
- data/examples/flash/run.rb +2 -2
- data/examples/no_xsl_blog/conf/apache.conf +30 -0
- data/examples/no_xsl_blog/conf/lhttpd.conf +1 -1
- data/examples/no_xsl_blog/lib/blog/controller.rb +2 -2
- data/examples/no_xsl_blog/log/apache.error_log +68 -0
- data/examples/no_xsl_blog/root/fcgi.rb +2 -2
- data/examples/no_xsl_blog/run.rb +3 -3
- data/examples/og/run.rb +1 -1
- data/examples/tiny/conf/apache.conf +29 -4
- data/examples/tiny/conf/lhttpd.conf +1 -1
- data/examples/tiny/log/apache.error_log +30 -0
- data/examples/tiny/root/fcgi.rb +2 -2
- data/examples/tiny/root/index.xhtml +1 -1
- data/examples/tiny/run.rb +3 -2
- data/examples/wee_style/run.rb +7 -9
- data/examples/why_wiki/README +5 -0
- data/examples/why_wiki/run.rb +57 -0
- data/examples/why_wiki/wiki.yml +6 -0
- data/examples/wiki.yml +1 -0
- data/lib/glue/array.rb +14 -33
- data/lib/glue/hash.rb +32 -53
- data/lib/glue/pool.rb +9 -12
- data/lib/glue/property.rb +31 -9
- data/lib/nitro.rb +30 -8
- data/lib/nitro/adapters/cgi.rb +23 -3
- data/lib/nitro/adapters/webrick.rb +9 -3
- data/lib/nitro/builders/form.rb +21 -13
- data/lib/nitro/builders/rss.rb +20 -9
- data/lib/nitro/builders/table.rb +69 -10
- data/lib/nitro/builders/xhtml.rb +13 -4
- data/lib/nitro/component.rb +15 -0
- data/lib/nitro/conf.rb +4 -3
- data/lib/nitro/context.rb +22 -14
- data/lib/nitro/controller.rb +63 -5
- data/lib/nitro/dispatcher.rb +11 -6
- data/lib/nitro/output.rb +28 -0
- data/lib/nitro/render.rb +78 -59
- data/lib/nitro/request.rb +5 -1
- data/lib/nitro/runner.rb +20 -6
- data/lib/nitro/session.rb +89 -18
- data/lib/nitro/session/drb.rb +31 -0
- data/lib/nitro/session/drbserver.rb +71 -0
- data/lib/nitro/session/memory.rb +13 -0
- data/lib/nitro/simple.rb +7 -0
- data/lib/nitro/ui/date-select.rb +2 -5
- data/lib/nitro/ui/pager.rb +4 -4
- data/lib/nitro/ui/tabs.rb +2 -4
- data/lib/nitro/uri.rb +7 -4
- data/lib/og.rb +20 -12
- data/lib/og/adapter.rb +40 -13
- data/lib/og/adapters/filesys.rb +121 -0
- data/lib/og/adapters/mysql.rb +10 -5
- data/lib/og/adapters/oracle.rb +374 -0
- data/lib/og/adapters/psql.rb +10 -23
- data/lib/og/adapters/sqlite.rb +3 -3
- data/lib/og/backend.rb +2 -2
- data/lib/og/connection.rb +6 -6
- data/lib/og/database.rb +5 -5
- data/lib/og/enchant.rb +6 -2
- data/lib/og/meta.rb +56 -26
- data/lib/og/mock.rb +1 -1
- data/lib/og/typemacros.rb +23 -0
- data/lib/parts/content.rb +4 -10
- data/test/nitro/adapters/tc_cgi.rb +1 -1
- data/test/nitro/builders/tc_rss.rb +1 -1
- data/test/nitro/builders/tc_table.rb +30 -0
- data/test/nitro/tc_context.rb +4 -0
- data/test/nitro/tc_controller.rb +9 -2
- data/test/og/tc_filesys.rb +83 -0
- data/test/og/tc_meta.rb +55 -0
- data/test/tc_og.rb +115 -36
- data/vendor/README +11 -5
- data/vendor/breakpoint.rb +35 -38
- data/vendor/breakpoint_client.rb +119 -80
- data/vendor/composite_sexp_processor.rb +43 -0
- data/vendor/parse_tree.rb +745 -0
- data/vendor/sexp_processor.rb +453 -0
- metadata +34 -7
- data/examples/no_xsl_blog/conf/app.conf.rb +0 -47
data/lib/og/adapters/sqlite.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# * George Moschovitis <gm@navel.gr>
|
2
2
|
# (c) 2004-2005 Navel, all rights reserved.
|
3
|
-
# $Id: sqlite.rb
|
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
|
-
|
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
|
82
|
+
return SqliteConnection.new(db)
|
83
83
|
end
|
84
84
|
|
85
85
|
def calc_field_index(klass, db)
|
data/lib/og/backend.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# * George Moschovitis <gm@navel.gr>
|
2
2
|
# (c) 2004-2005 Navel, all rights reserved.
|
3
|
-
# $Id: backend.rb
|
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
|
-
|
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.
|
data/lib/og/connection.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# * George Moschovitis <gm@navel.gr>
|
2
2
|
# (c) 2004-2005 Navel, all rights reserved.
|
3
|
-
# $Id: connection.rb
|
3
|
+
# $Id: connection.rb 265 2005-02-24 08:46:54Z gmosx $
|
4
4
|
|
5
|
-
|
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
|
-
#
|
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?(:
|
290
|
-
klass.__meta[:
|
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
|
data/lib/og/database.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# * George Moschovitis <gm@navel.gr>
|
2
2
|
# (c) 2004-2005 Navel, all rights reserved.
|
3
|
-
# $Id: database.rb
|
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
|
-
|
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.
|
91
|
-
Logger.
|
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
|
data/lib/og/enchant.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# * George Moschovitis <gm@navel.gr>
|
2
2
|
# (c) 2004-2005 Navel, all rights reserved.
|
3
|
-
# $Id
|
3
|
+
# $Id$
|
4
4
|
|
5
|
-
|
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
|
data/lib/og/meta.rb
CHANGED
@@ -1,17 +1,29 @@
|
|
1
1
|
# * George Moschovitis <gm@navel.gr>
|
2
2
|
# (c) 2004-2005 Navel, all rights reserved.
|
3
|
-
# $Id: meta.rb
|
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
|
-
|
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 :
|
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 :
|
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 :
|
160
|
+
# has_many :articles, Article
|
145
161
|
# end
|
146
162
|
#
|
147
163
|
# creates the code:
|
148
164
|
#
|
149
|
-
#
|
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 :
|
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
|
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
|
-
#
|
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,
|
245
|
+
meta :sql_join, klass, options
|
246
|
+
|
247
|
+
# FIXME: should add metadata for cascading delete.
|
222
248
|
|
223
|
-
meta :
|
224
|
-
klass.meta :
|
249
|
+
meta :props_and_relations, ManyToMany.new(prop_o, klass)
|
250
|
+
klass.meta :props_and_relations, ManyToMany.new(prop_m, self)
|
225
251
|
|
226
|
-
#
|
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)}
|
231
|
-
|
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)}
|
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
|
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
|
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)}
|
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)}
|
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
|
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
|
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 :
|
304
|
-
klass.meta :
|
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,
|
354
|
+
meta :joins, klass, options
|
325
355
|
end
|
326
356
|
|
327
357
|
end
|
data/lib/og/mock.rb
CHANGED
@@ -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
|
data/lib/parts/content.rb
CHANGED
@@ -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
|
-
#
|
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
|
-
#
|
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 = "
|
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.
|
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
|