og 0.9.3 → 0.9.5

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/ChangeLog CHANGED
@@ -1,6 +1,70 @@
1
1
 
2
+ 04-02-2005 George Moschovitis <gm@navel.gr>
3
+
4
+ * lib/nitro/adaptors/fastcgi.rb: convert conf to Flexob.
5
+
6
+ * lib/nitro/adaptors/webrick.rb: added REQUEST_MUTEX to temp-fix windows bug.
7
+
8
+ 03-02-2005 George Moschovitis <gm@navel.gr>
9
+
10
+ * lib/glue/*: cleaned up some files.
11
+
12
+ * lib/og/*: cleaned up some files.
13
+
14
+ * lib/nitro/dispatchers.rb (#initialize): accept class as input.
15
+
16
+ * Updated all examples.
17
+
18
+ * lib/nitro/context.rb: out == XhtmlString to allow convienient
19
+ access to the programmatic rendering functionality and make
20
+ the wee example cooler.
21
+
22
+ * lib/nitro/adaptors/webrick.rb (#start): better handling of conf parameters,
23
+ better handling of logging,
24
+ autoconvert conf to Flexob if needed.
25
+
26
+ * examples/wee_style/wee.rb: implemented,
27
+ looks cool (but useles? :-))
28
+
29
+ * examples/wee_style/README: introduced.
30
+
31
+ * examples/wee_style/*: introduced wee-style example.
32
+
33
+ * examples/blog/lib/blog.rb: updated for new RSS.
34
+
35
+ * test/nitro/builders/tc_rss.rb: introduced.
36
+
37
+ * lib/nitro/builders/rss.rb: pass parameters,
38
+ (#render): now alias for render_0_9
39
+
40
+ * lib/og/meta.rb (#joins): introduced new metadata macro.
41
+
42
+ 02-02-2005 George Moschovitis <gm@navel.gr>
43
+
44
+ * --- VERSION 0.9.4 ---
45
+
46
+ * lib/og/backends/sqlite.rb: introduced.
47
+
48
+ * lib/og/backends/psql.rb: minor cleanup.
49
+
50
+ * examples/blog/root/style.css: fixes for IE, more needed.
51
+
52
+ * lib/nitro/adaptors/fastcgi.rb (#handle): restore Og connection.
53
+
54
+ * lib/nitro/adaptors/webrick.rb (#handle): restore Og connection, fixes
55
+ Windows deadlock. [james_b]
56
+
57
+ * examples/no_xsl_blog/lib/blog/template.rb: fixed ruby in template (login).
58
+
59
+ * changed default port to 8069, to avoid conflicts with
60
+ other servers (8080 was too common). [james_b]
61
+
2
62
  01-02-2005 George Moschovitis <gm@navel.gr>
3
63
 
64
+ * updated Rubyforge page, added wiki.
65
+
66
+ * --- VERSION 0.9.3 ---
67
+
4
68
  * small fixes to make tests pass again.
5
69
 
6
70
  * lib/nitro/adaptors/webrick.rb: update headers with req.meta_vars.
data/README.og CHANGED
@@ -1,4 +1,4 @@
1
- = Og 0.9.0
1
+ = Og 0.9.3
2
2
 
3
3
  Nitro integrates the Og (ObjectGraph) object-relational mapping
4
4
  library. Og provides transparent serialization of object graphs to a RDBMS
@@ -18,7 +18,7 @@ PostgreSQL and MySQL are included.
18
18
 
19
19
  Og is part of the Nitro project, released as a stand-alone library
20
20
  due to popular demand. You can find the ChangeLog in the Nitro
21
- distribution (http://www.navel.gr/nitro).
21
+ distribution (http://www.rubyforge.com/projects/nitro).
22
22
 
23
23
 
24
24
  == Features
@@ -3,10 +3,8 @@
3
3
  # A simple example to demonstrate how to mock Og.
4
4
  # Very useful in test units.
5
5
  #
6
- # code:
7
6
  # * George Moschovitis <gm@navel.gr>
8
- #
9
- # (c) 2004 Navel, all rights reserved.
7
+ # (c) 2004-2005 Navel, all rights reserved.
10
8
  # $Id: run.rb 185 2004-12-10 13:29:09Z gmosx $
11
9
 
12
10
  $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
@@ -52,4 +50,3 @@ class SimpleTest < Test::Unit::TestCase
52
50
  end
53
51
 
54
52
  end
55
-
@@ -7,10 +7,8 @@
7
7
  #
8
8
  # Og makes it easier to switch to a REAL database :)
9
9
  #
10
- # code:
11
10
  # * George Moschovitis <gm@navel.gr>
12
- #
13
- # (c) 2004 Navel, all rights reserved.
11
+ # (c) 2004-2005 Navel, all rights reserved.
14
12
  # $Id$
15
13
 
16
14
  raise 'WARNING, this example does not work yet, for the moment ' +
@@ -22,7 +20,7 @@ require 'og'
22
20
 
23
21
  # An example managed object.
24
22
  # Looks like an ordinary Ruby object.
25
- #
23
+
26
24
  class Article
27
25
  prop_accessor :name, :body, String
28
26
 
data/lib/glue/cache.rb CHANGED
@@ -1,14 +1,10 @@
1
- # code:
2
1
  # * George Moschovitis <gm@navel.gr>
3
2
  # * Anastasios Koutoumanos <ak@navel.gr>
4
- #
5
- # (c) 2004 Navel, all rights reserved.
3
+ # (c) 2004-2005 Navel, all rights reserved.
6
4
  # $Id: cache.rb 202 2005-01-17 10:44:13Z gmosx $
7
5
 
8
- module N;
6
+ module N
9
7
 
10
- # = LRUCache
11
- #
12
8
  # A cache utilizing a simple LRU (Least Recently Used) policy.
13
9
  # The items managed by this cache must respond to the #key method.
14
10
  # Attempts to optimize reads rather than inserts!
@@ -16,36 +12,38 @@ module N;
16
12
  # LRU semantics are enforced by inserting the items in a queue.
17
13
  # The lru item is always at the tail. Two special sentinels
18
14
  # (head, tail) are used to simplify (?) the code.
19
- #
15
+
20
16
  class LRUCache < Hash
21
17
 
22
18
  # Mix this in your class to make LRU-managable.
23
- #
19
+
24
20
  module Item
25
21
  attr_accessor :lru_key, :lru_prev, :lru_next
26
22
  end
27
23
 
28
24
  # head-tail sentinels
29
- #
25
+
30
26
  class Sentinel; include Item; end
31
27
 
32
- # the maximum number of items in the cache
28
+ # the maximum number of items in the cache.
29
+
33
30
  attr_accessor :max_items
34
31
 
35
32
  # the head sentinel
33
+
36
34
  attr :head
35
+
37
36
  # the tail sentinel, tail.prev points to the lru item.
37
+
38
38
  attr :tail
39
39
 
40
- #
41
- #
42
40
  def initialize(max_items)
43
41
  @max_items = max_items
44
42
  lru_clear()
45
43
  end
46
44
 
47
- # Lookup an item in the cache
48
- #
45
+ # Lookup an item in the cache.
46
+
49
47
  def [](key)
50
48
  if item = super
51
49
  return lru_touch(item)
@@ -53,36 +51,36 @@ class LRUCache < Hash
53
51
  end
54
52
 
55
53
  # The inserted item is considered mru!
56
- #
54
+
57
55
  def []=(key, item)
58
56
  item = super
59
57
  item.lru_key = key
60
58
  lru_insert(item)
61
59
  end
62
60
 
63
- # Delete an item from the cache
64
- #
61
+ # Delete an item from the cache.
62
+
65
63
  def delete(key)
66
64
  if item = super
67
65
  lru_delete(item)
68
66
  end
69
67
  end
70
68
 
71
- # Clear the cache
72
- #
69
+ # Clear the cache.
70
+
73
71
  def clear
74
72
  super
75
73
  lru_clear()
76
74
  end
77
75
 
78
- # The first (mru) element in the cache
79
- #
76
+ # The first (mru) element in the cache.
77
+
80
78
  def first
81
79
  @head.lru_next
82
80
  end
83
81
 
84
- # The last (lru) element in the cache
85
- #
82
+ # The last (lru) element in the cache.
83
+
86
84
  def last
87
85
  @tail.lru_prev
88
86
  end
@@ -91,15 +89,15 @@ class LRUCache < Hash
91
89
  private
92
90
 
93
91
  # Delete an item from the lru list.
94
- #
92
+
95
93
  def lru_delete(item)
96
94
  lru_join(item.lru_prev, item.lru_next)
97
95
  return item
98
96
  end
99
97
 
100
- # Join two items in the lru list
101
- # Return y to allow for chaining
102
- #
98
+ # Join two items in the lru list.
99
+ # Return y to allow for chaining.
100
+
103
101
  def lru_join(x, y)
104
102
  x.lru_next = y
105
103
  y.lru_prev = x
@@ -108,28 +106,28 @@ class LRUCache < Hash
108
106
 
109
107
  # Append a child item to a parent item in the lru list
110
108
  # (Re)inserts the child in the list.
111
- #
109
+
112
110
  def lru_append(parent, child)
113
111
  lru_join(child, parent.lru_next)
114
112
  lru_join(parent, child)
115
113
  end
116
114
 
117
115
  # Insert an item
118
- #
116
+
119
117
  def lru_insert(item)
120
118
  delete(last.lru_key) if size() > @max_items
121
119
  lru_append(@head, item)
122
120
  end
123
121
 
124
122
  # Touch an item, make mru!
125
- # Returns the item
126
- #
123
+ # Returns the item.
124
+
127
125
  def lru_touch(item)
128
126
  lru_append(@head, lru_delete(item))
129
127
  end
130
128
 
131
- # Clear the lru
132
- #
129
+ # Clear the lru.
130
+
133
131
  def lru_clear
134
132
  @head = Sentinel.new
135
133
  @tail = Sentinel.new
@@ -137,4 +135,4 @@ class LRUCache < Hash
137
135
  end
138
136
  end
139
137
 
140
- end # module
138
+ end
data/lib/glue/number.rb CHANGED
@@ -1,20 +1,14 @@
1
- # code:
2
1
  # * George Moschovitis <gm@navel.gr>
3
- #
4
- # (c) 2004 Navel, all rights reserved.
2
+ # (c) 2004-2005 Navel, all rights reserved.
5
3
  # $Id: number.rb 202 2005-01-17 10:44:13Z gmosx $
6
4
 
7
5
  module N;
8
6
 
9
- # = NumberUtils
10
- #
11
- # === Design:
12
- #
13
7
  # Implement as a module to avoid class polution. You can
14
8
  # still use Ruby's advanced features to include the module in your
15
9
  # class. Passing the object to act upon allows to check for nil,
16
10
  # which isn't possible if you use self.
17
- #
11
+
18
12
  module NumberUtils
19
13
 
20
14
  # Returns the multiple ceil of a number
@@ -27,4 +21,4 @@ module NumberUtils
27
21
 
28
22
  end
29
23
 
30
- end # module
24
+ end
data/lib/glue/time.rb CHANGED
@@ -1,29 +1,23 @@
1
- # code:
2
1
  # * George Moschovitis <gm@navel.gr>
3
- #
4
- # (c) 2004 Navel, all rights reserved.
2
+ # (c) 2004-2005 Navel, all rights reserved.
5
3
  # $Id: time.rb 202 2005-01-17 10:44:13Z gmosx $
6
4
 
7
5
  require "time.rb"
8
6
 
9
7
  module N;
10
8
 
11
- # = Time
12
- #
13
9
  # General time utilities collection
14
10
  #
15
- # === Design:
16
- #
17
11
  # Implement as a module to avoid class polution. You can
18
12
  # still Ruby's advanced features to include the module in your
19
13
  # class. Passing the object to act upon allows to check for nil,
20
14
  # which isn't possible if you use self.
21
15
  #
22
- # === TODO:
16
+ # == TODO
23
17
  #
24
18
  # - SOS: add test units.
25
19
  # - add aliases for those methods in Kernel ?
26
- #
20
+
27
21
  module TimeUtils
28
22
 
29
23
  NOW = Time.now
@@ -31,13 +25,13 @@ module TimeUtils
31
25
  ZERO = Time.mktime(1972)
32
26
 
33
27
  # Convert the time to a nice String representation.
34
- #
28
+
35
29
  def self.date_time(time)
36
30
  return nil unless time
37
31
  return time.strftime("%d-%m-%Y %H:%M")
38
32
  end
39
33
 
40
- # this method calculates the days extrema given two time objects.
34
+ # This method calculates the days extrema given two time objects.
41
35
  # start time is the given time1 at 00:00:00
42
36
  # end time is the given time2 at 23:59:59:999
43
37
  #
@@ -48,7 +42,7 @@ module TimeUtils
48
42
  # Output
49
43
  # - the time range. you can get the start/end times using
50
44
  # range methods.
51
- #
45
+
52
46
  def self.days_extrema(time1, time2=nil)
53
47
  time2 = time1 if (not time2.valid? Time)
54
48
  time2 = NEVER if (time2 <= time1)
@@ -57,24 +51,23 @@ module TimeUtils
57
51
  return (start_time..end_time)
58
52
  end
59
53
 
60
- #
61
- # set time to start of day
62
- #
54
+ # Set time to start of day
55
+
63
56
  def self.start_of_day(time)
64
57
  return Time.mktime(time.year, time.month, time.day, 0, 0, 0, 0)
65
58
  end
66
59
 
67
- #
68
- # set time to end of day
69
- #
60
+
61
+ # Set time to end of day
62
+
70
63
  def self.end_of_day(time)
71
64
  return Time.mktime(time.year, time.month, time.day, 23, 59, 59, 999)
72
65
  end
73
66
 
74
67
 
75
- # returns true only if day of time is included in the
68
+ # Returns true only if day of time is included in the
76
69
  # range (stime..etime). Only year days are checked.
77
- #
70
+
78
71
  def self.time_in_day_range(time, stime=ZERO, etime=NEVER)
79
72
  if (etime <= stime)
80
73
  Logger.debug "Invalid end time (#{etime} < #{stime})" if $DBG
@@ -89,5 +82,4 @@ module TimeUtils
89
82
 
90
83
  end
91
84
 
92
- end # module
93
-
85
+ end
@@ -1,11 +1,9 @@
1
- # George Moschovitis <gm@navel.gr>
2
- # (c) 2005 Navel, all rights reserved.
1
+ # * George Moschovitis <gm@navel.gr>
2
+ # (c) 2004-2005 Navel, all rights reserved.
3
3
  # $Id$
4
4
 
5
5
  module N
6
6
 
7
- # = Validation
8
- #
9
7
  # Implements a meta-language for validating managed
10
8
  # objects. Typically used in Validator objects but can be
11
9
  # included in managed objects too.
data/lib/og/backend.rb CHANGED
@@ -1,73 +1,69 @@
1
- # code:
2
1
  # * George Moschovitis <gm@navel.gr>
3
- #
4
- # (c) 2004 Navel, all rights reserved.
2
+ # (c) 2004-2005 Navel, all rights reserved.
5
3
  # $Id: backend.rb 202 2005-01-17 10:44:13Z gmosx $
6
4
 
7
- require "yaml"
5
+ require 'yaml'
8
6
 
9
- require "og/connection"
7
+ require 'og/connection'
10
8
 
11
9
  class Og
12
10
 
13
- # = Backend
14
- #
15
11
  # Abstract backend. A backend communicates with the RDBMS.
16
12
  # This is the base class for the various backend implementations.
17
- #
13
+
18
14
  class Backend
19
15
 
20
16
  # The actual connection to the database
21
17
  attr_accessor :conn
22
18
 
23
19
  # Intitialize the connection to the RDBMS.
24
- #
20
+
25
21
  def initialize(config)
26
22
  raise "Not implemented"
27
23
  end
28
24
 
29
25
  # Close the connection to the RDBMS.
30
- #
26
+
31
27
  def close()
32
28
  @conn.close()
33
29
  end
34
30
 
35
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
36
- # Utilities
31
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
32
+ # :section: Utilities
37
33
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
38
34
 
39
35
  # Encode the name of the klass as an sql safe string.
40
36
  # The Module separators are replaced with _ and NOT stripped
41
37
  # out so that we can convert back to the original notation if
42
38
  # needed. The leading module if available is removed.
43
- #
39
+
44
40
  def self.encode(klass)
45
41
  "#{klass.name.gsub(/^.*::/, "")}".gsub(/::/, "_").downcase
46
42
  end
47
43
 
48
44
  # The name of the SQL table where objects of this class
49
45
  # are stored.
50
- #
46
+
51
47
  def self.table(klass)
52
48
  "_#{Og.table_prefix}#{encode(klass)}"
53
49
  end
54
50
 
55
51
  # The name of the join table for the two given classes.
56
- #
52
+
57
53
  def self.join_table(klass1, klass2)
58
54
  "_#{Og.table_prefix}j_#{encode(klass1)}_#{encode(klass2)}"
59
55
  end
60
56
 
61
57
  # Returns the props that will be included in the insert query.
62
58
  # For some backends the oid should be stripped.
63
- #
59
+
64
60
  def self.props_for_insert(klass)
65
61
  klass.__props
66
62
  end
67
63
 
68
64
  # Precompile the insert code for the given class.
69
65
  # The generated code sets the oid when inserting!
70
- #
66
+
71
67
  def self.eval_og_insert(klass)
72
68
  props = props_for_insert(klass)
73
69
 
@@ -104,7 +100,7 @@ class Backend
104
100
 
105
101
  # Precompile the update code for the given class.
106
102
  # Ignore the oid when updating!
107
- #
103
+
108
104
  def self.eval_og_update(klass)
109
105
  props = klass.__props.reject { |p| :oid == p.symbol }
110
106
 
@@ -146,7 +142,7 @@ class Backend
146
142
  # Precompile the code to read objects of the given class
147
143
  # from the backend. In order to allow for changing
148
144
  # field/attribute orders we have to use a field mapping hash.
149
- #
145
+
150
146
  def self.eval_og_deserialize(klass, og)
151
147
  calc_field_index(klass, og)
152
148
 
@@ -169,67 +165,67 @@ class Backend
169
165
  end
170
166
 
171
167
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
172
- # Connection methods.
168
+ # :section: Connection methods.
173
169
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
174
170
 
175
171
  # Create the database.
176
- #
172
+
177
173
  def self.create_db(database, user = nil, password = nil)
178
174
  Logger.info "Creating database '#{database}'."
179
175
  end
180
176
 
181
177
  # Drop the database.
182
- #
178
+
183
179
  def self.drop_db(database, user = nil, password = nil)
184
180
  Logger.info "Dropping database '#{database}'."
185
181
  end
186
182
 
187
183
  # Execute an SQL query and return the result.
188
- #
184
+
189
185
  def query(sql)
190
186
  raise "Not implemented"
191
187
  end
192
188
 
193
189
  # Execute an SQL query, no result returned.
194
- #
190
+
195
191
  def exec(sql)
196
192
  raise "Not implemented"
197
193
  end
198
194
 
199
195
  # Execute an SQL query and return the result. Wrapped in a
200
196
  # rescue block.
201
- #
197
+
202
198
  def safe_query(sql)
203
199
  raise "Not implemented"
204
200
  end
205
201
 
206
202
  # Execute an SQL query, no result returned. Wrapped in a
207
203
  # rescue block.
208
- #
204
+
209
205
  def safe_exec(sql)
210
206
  raise "Not implemented"
211
207
  end
212
208
 
213
209
  # Check if it is a valid resultset.
214
- #
210
+
215
211
  def valid?(res)
216
212
  raise "Not implemented"
217
213
  end
218
214
 
219
215
  # Start a new transaction.
220
- #
216
+
221
217
  def start
222
218
  exec "START TRANSACTION"
223
219
  end
224
220
 
225
221
  # Commit a transaction.
226
- #
222
+
227
223
  def commit
228
224
  exec "COMMIT"
229
225
  end
230
226
 
231
227
  # Rollback transaction.
232
- #
228
+
233
229
  def rollback
234
230
  exec "ROLLBACK"
235
231
  end
@@ -239,7 +235,7 @@ class Backend
239
235
  # If the property has an :sql metadata this overrides the
240
236
  # default mapping. If the property has an :extra_sql metadata
241
237
  # the extra sql is appended after the default mapping.
242
- #
238
+
243
239
  def create_fields(klass, typemap)
244
240
  fields = []
245
241
 
@@ -267,35 +263,35 @@ class Backend
267
263
  # Create the managed object table. The properties of the
268
264
  # object are mapped to the table columns. Additional sql relations
269
265
  # and constrains are created (indicices, sequences, etc).
270
- #
266
+
271
267
  def create_table(klass)
272
268
  return if query("SELECT * FROM #{klass::DBTABLE} LIMIT 1")
273
269
  end
274
270
 
275
271
  # Drop the managed object table
276
- #
272
+
277
273
  def drop_table(klass)
278
274
  exec "DROP TABLE #{klass::DBTABLE}"
279
275
  end
280
276
 
281
277
  # Deserialize one row of the resultset.
282
- #
278
+
283
279
  def deserialize_one(res, klass)
284
- raise "Not implemented"
280
+ raise 'Not implemented'
285
281
  end
286
282
 
287
283
  # Deserialize all rows of the resultset.
288
- #
284
+
289
285
  def deserialize_all(res, klass)
290
- raise "Not implemented"
286
+ raise 'Not implemented'
291
287
  end
292
288
 
293
289
  # Return a single integer value from the resultset.
294
- #
290
+
295
291
  def get_int(res, idx = 0)
296
- raise "Not implemented"
292
+ raise 'Not implemented'
297
293
  end
298
294
 
299
295
  end
300
296
 
301
- end # namespace
297
+ end