og 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'rake/rdoctask'
6
6
  require 'rake/testtask'
7
7
  require 'rake/gempackagetask'
8
8
 
9
- og = true
9
+ og = true
10
10
 
11
11
  task :default => :package
12
12
 
@@ -14,7 +14,7 @@ task :default => :package
14
14
 
15
15
  Rake::TestTask.new do |t|
16
16
  t.libs << 'test'
17
- t.test_files = FileList['test/**/tc*.rb'].exclude('**/tc*og*.rb')
17
+ t.test_files = FileList['test/**/tc*.rb'].exclude('**/tc*og*.rb').exclude('test/og/**/*')
18
18
  t.verbose = true
19
19
  end
20
20
 
@@ -30,8 +30,8 @@ end
30
30
 
31
31
  Rake::RDocTask.new do |rd|
32
32
  rd.main = 'README'
33
- rd.rdoc_dir = 'rdoc'
34
- rd.rdoc_files.include('README', 'INSTALL', 'lib/**/*.rb')
33
+ rd.rdoc_dir = 'doc/rdoc'
34
+ rd.rdoc_files.include('README', 'INSTALL', 'doc/og_config.txt', 'doc/og_tutorial.txt', 'lib/**/*.rb')
35
35
  rd.options << '--all --inline-source'
36
36
  end
37
37
 
@@ -91,11 +91,11 @@ spec = Gem::Specification.new do |s|
91
91
  s.summary = 'Nitro Web Engine'
92
92
  s.description =
93
93
  'An efficient, multiparadigm and flexible platform for rapid ' +
94
- 'web application development. Implements a full development stack ' +
95
- '(Model, View, Controller).'
96
-
94
+ 'web application development. Implements a full development stack.'
95
+
97
96
  # s.add_dependency 'postgres-pr', '>= 0.3.0'
98
97
  # s.add_dependency 'postgres', '>= 0.7.1'
98
+ # s.add_dependency 'ParseTree', '>= 1.3.3'
99
99
  s.add_dependency 'extensions', '>= 0.5'
100
100
  # s.add_dependency 'sqlite3-ruby', '>= 1.0.0'
101
101
  # s.add_dependency 'mysql', '>= 2.5.1'
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # * George Moschovitis <gm@navel.gr>
4
4
  # (c) 2004 Navel, all rights reserved.
5
- # $Id: run.rb 256 2005-02-11 16:22:33Z gmosx $
5
+ # $Id: run.rb 263 2005-02-23 13:45:08Z gmosx $
6
6
 
7
7
  require 'og'
8
8
 
@@ -1,15 +1,14 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2002-2005 Navel, all rights reserved.
3
- # $Id: array.rb 259 2005-02-15 08:54:54Z gmosx $
3
+ # $Id: array.rb 266 2005-02-28 14:50:48Z gmosx $
4
4
 
5
5
  require 'sync'
6
6
 
7
7
  module N
8
8
 
9
- # A thread-safe array. We use a sync object instead of a mutex,
10
- # because it is re-entrant.
11
- # An exclusive lock is needed when writing, a shared lock IS NEEDED
12
- # when reading
9
+ # A thread-safe array. We use a sync object instead of a
10
+ # mutex, because it is re-entrant. An exclusive lock is
11
+ # needed when writing, a shared lock IS NEEDED when reading.
13
12
 
14
13
  class SafeArray < Array
15
14
 
@@ -18,61 +17,43 @@ class SafeArray < Array
18
17
  # gmosx: delegator is not used.
19
18
 
20
19
  def initialize(delegator = nil)
21
- @sync = ::Sync.new()
20
+ @sync = Sync.new()
22
21
  end
23
22
 
24
23
  def << (value)
25
- return @sync.synchronize(::Sync::SH) {
26
- super
27
- }
24
+ return @sync.synchronize(Sync::SH) { super }
28
25
  end
29
26
 
30
27
  def delete_if(&block)
31
- return @sync.synchronize(::Sync::SH) {
32
- super
33
- }
28
+ return @sync.synchronize(Sync::SH) { super }
34
29
  end
35
30
 
36
31
  def [](key)
37
- return @sync.synchronize(::Sync::SH) {
38
- super
39
- }
32
+ return @sync.synchronize(Sync::SH) { super }
40
33
  end
41
34
 
42
35
  def []=(key, value)
43
- return @sync.synchronize(::Sync::EX) {
44
- super
45
- }
36
+ return @sync.synchronize(Sync::EX) { super }
46
37
  end
47
38
 
48
39
  def delete(key)
49
- return @sync.synchronize(::Sync::EX) {
50
- super
51
- }
40
+ return @sync.synchronize(Sync::EX) { super }
52
41
  end
53
42
 
54
43
  def clear
55
- @sync.synchronize(::Sync::EX) {
56
- super
57
- }
44
+ @sync.synchronize(Sync::EX) { super }
58
45
  end
59
46
 
60
47
  def size
61
- return @sync.synchronize(::Sync::SH) {
62
- super
63
- }
48
+ return @sync.synchronize(Sync::SH) { super }
64
49
  end
65
50
 
66
51
  def shift
67
- return @sync.synchronize(::Sync::EX) {
68
- super
69
- }
52
+ return @sync.synchronize(::Sync::EX) { super }
70
53
  end
71
54
 
72
55
  def unshift(el)
73
- return @sync.synchronize(::Sync::EX) {
74
- super
75
- }
56
+ return @sync.synchronize(::Sync::EX) { super }
76
57
  end
77
58
 
78
59
  end
@@ -1,22 +1,17 @@
1
- # code:
2
1
  # * George Moschovitis <gm@navel.gr>
3
- #
4
- # (c) 2004 Navel, all rights reserved.
5
- # $Id: hash.rb 202 2005-01-17 10:44:13Z gmosx $
2
+ # (c) 2004-2005 Navel, all rights reserved.
3
+ # $Id: hash.rb 263 2005-02-23 13:45:08Z gmosx $
6
4
 
7
- require "sync"
5
+ require 'sync'
8
6
 
9
- module N;
7
+ module N
10
8
 
11
- # == SafeHash
12
- #
13
9
  # A thread-safe hash. We use a sync object instead of a mutex,
14
- # because it is re-entrant.
15
- # An exclusive lock is needed when writing, a shared lock IS NEEDED
16
- # when reading
10
+ # because it is re-entrant. An exclusive lock is needed when
11
+ # writing, a shared lock IS NEEDED when reading
17
12
  # uses the delegator pattern to allow for multiple
18
13
  # implementations!
19
- #
14
+
20
15
  class SafeHash < Hash
21
16
  attr :sync
22
17
 
@@ -27,63 +22,47 @@ class SafeHash < Hash
27
22
  end
28
23
 
29
24
  def [](key)
30
- return @sync.synchronize(::Sync::SH) {
31
- super
32
- }
25
+ @sync.synchronize(::Sync::SH) { super }
33
26
  end
34
27
 
35
28
  def []=(key, value)
36
- return @sync.synchronize(::Sync::EX) {
37
- super
38
- }
29
+ @sync.synchronize(::Sync::EX) { super }
39
30
  end
40
31
 
41
32
  def delete(key)
42
- return @sync.synchronize(::Sync::EX) {
43
- super
44
- }
33
+ @sync.synchronize(::Sync::EX) { super }
45
34
  end
46
35
 
47
36
  def clear
48
- @sync.synchronize(::Sync::EX) {
49
- super
50
- }
37
+ @sync.synchronize(::Sync::EX) { super }
51
38
  end
52
39
 
53
40
  def size
54
- return @sync.synchronize(::Sync::SH) {
55
- super
56
- }
41
+ @sync.synchronize(::Sync::SH) { super }
57
42
  end
58
43
 
59
44
  def values
60
- return @sync.synchronize(::Sync::SH) {
61
- super
62
- }
45
+ @sync.synchronize(::Sync::SH) { super }
63
46
  end
64
47
 
65
48
  def keys
66
- return @sync.synchronize(::Sync::SH) {
67
- super
68
- }
49
+ @sync.synchronize(::Sync::SH) { super }
69
50
  end
70
51
 
71
- end # SafeHash
52
+ end
72
53
 
73
- # == SafeHashDelegator
74
- #
75
54
  # A thread-safe hash. We use a sync object instead of a mutex,
76
- # because it is re-entrant.
77
- # An exclusive lock is needed when writing, a shared lock IS NEEDED
78
- # when reading
55
+ # because it is re-entrant. An exclusive lock is needed when
56
+ # writing, a shared lock IS NEEDED when reading.
57
+ #
58
+ # === Design
79
59
  #
80
- # Design:
81
60
  # This class uses the delegator pattern. However we dont use rubys
82
61
  # delegation facilities, they are more general and powerfull than we
83
62
  # need here (and slower). Instead a custom (but simple) solution is
84
63
  # used.
85
64
  #
86
- # Example:
65
+ # === Example
87
66
  #
88
67
  # hash = SafeHashDelegator.new(Hash.new)
89
68
  # hash = SafeHashDelegator.new(Hash.new)
@@ -96,20 +75,20 @@ class SafeHashDelegator < Hash
96
75
  @sync = ::Sync.new
97
76
  end
98
77
 
99
- def [](key)
100
- return @sync.synchronize(::Sync::SH) {
78
+ def [](key)
79
+ @sync.synchronize(::Sync::SH) {
101
80
  @delegate[key]
102
81
  }
103
- end
82
+ end
104
83
 
105
- def []=(key, value)
106
- return @sync.synchronize(::Sync::EX) {
84
+ def []=(key, value)
85
+ @sync.synchronize(::Sync::EX) {
107
86
  @delegate[key] = value
108
87
  }
109
- end
88
+ end
110
89
 
111
90
  def delete(key)
112
- return @sync.synchronize(::Sync::EX) {
91
+ @sync.synchronize(::Sync::EX) {
113
92
  @delegate.delete(key)
114
93
  }
115
94
  end
@@ -121,23 +100,23 @@ class SafeHashDelegator < Hash
121
100
  end
122
101
 
123
102
  def size
124
- return @sync.synchronize(::Sync::SH) {
103
+ @sync.synchronize(::Sync::SH) {
125
104
  @delegate.size()
126
105
  }
127
106
  end
128
107
 
129
108
  def values
130
- return @sync.synchronize(::Sync::SH) {
109
+ @sync.synchronize(::Sync::SH) {
131
110
  @delegate.values()
132
111
  }
133
112
  end
134
113
 
135
114
  def keys
136
- return @sync.synchronize(::Sync::SH) {
115
+ @sync.synchronize(::Sync::SH) {
137
116
  @delegate.keys()
138
117
  }
139
118
  end
140
119
 
141
- end # SafeHashDelegator
120
+ end
142
121
 
143
- end # module
122
+ end
@@ -1,21 +1,17 @@
1
- # code:
2
1
  # * George Moschovitis <gm@navel.gr>
3
- #
4
- # (c) 2004 Navel, all rights reserved.
5
- # $Id: pool.rb 202 2005-01-17 10:44:13Z gmosx $
2
+ # (c) 2004-2005 Navel, all rights reserved.
3
+ # $Id: pool.rb 266 2005-02-28 14:50:48Z gmosx $
6
4
 
7
- require "thread"
8
- require "monitor"
5
+ require 'thread'
6
+ require 'monitor'
9
7
 
10
8
  module N
11
9
 
12
- # = Pool
13
- #
14
10
  # Generalized object pool implementation. Implemented as a thread
15
11
  # safe stack. Exclusive locking is needed both for push and pop.
16
12
  #
17
13
  # INVESTIGATE: Could use the SizedQueue/Queue.
18
- #
14
+
19
15
  class Pool < Array
20
16
  include MonitorMixin
21
17
 
@@ -25,7 +21,7 @@ class Pool < Array
25
21
  end
26
22
 
27
23
  # Add, restore an object to the pool.
28
- #
24
+
29
25
  def push(obj)
30
26
  synchronize do
31
27
  super
@@ -34,7 +30,7 @@ class Pool < Array
34
30
  end
35
31
 
36
32
  # Obtain an object from the pool.
37
- #
33
+
38
34
  def pop
39
35
  synchronize do
40
36
  @cv.wait_while { empty? }
@@ -44,6 +40,7 @@ class Pool < Array
44
40
 
45
41
  # Obtains an object, passes it to a block for processing
46
42
  # and restores it to the pool.
43
+
47
44
  def obtain
48
45
  result = nil
49
46
 
@@ -60,4 +57,4 @@ class Pool < Array
60
57
 
61
58
  end
62
59
 
63
- end # module
60
+ end
@@ -1,7 +1,7 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # * Michael Neumann <mneumann@ntecs.de>
3
3
  # (c) 2004-2005 Navel, all rights reserved.
4
- # $Id: property.rb 254 2005-02-10 12:44:05Z gmosx $
4
+ # $Id: property.rb 266 2005-02-28 14:50:48Z gmosx $
5
5
 
6
6
  require 'glue/attribute'
7
7
  require 'glue/array'
@@ -30,22 +30,35 @@ class Property
30
30
 
31
31
  cattr_accessor :type_checking, false
32
32
 
33
- # the symbol of the property
33
+ # The symbol of the property.
34
34
 
35
35
  attr_accessor :symbol
36
36
 
37
- # the string representation of the symbol
37
+ # The string representation of the symbol.
38
38
 
39
39
  attr_accessor :name
40
40
 
41
- # the class of the property
41
+ # The class of the property.
42
42
 
43
43
  attr_accessor :klass
44
-
45
- # additional metadata (like sql declaration, sql index, etc)
44
+
45
+ # Additional metadata (like sql declaration, sql index, etc)
46
+ # Here is a list of predefined metadata:
47
+ #
48
+ # [+:reader+]
49
+ # create reader?
50
+ #
51
+ # [+:writer+]
52
+ # create writer?
53
+ #
54
+ # [+:sql_index+]
55
+ # create an sql index for the column this poperty maps to?
56
+ #
57
+ # You can use this mechanism to add your own, custom,
58
+ # metadata.
46
59
 
47
60
  attr_accessor :meta
48
-
61
+
49
62
  def initialize(symbol, klass, meta = {})
50
63
  @symbol, @klass = symbol, klass
51
64
  @meta = meta
@@ -124,6 +137,11 @@ module PropertyUtils
124
137
  else
125
138
  target.__props << prop
126
139
  end
140
+
141
+ # Store the property in the :props_and_relations
142
+ # metadata array.
143
+
144
+ target.meta :props_and_relations, prop
127
145
 
128
146
  # Precompile the property read/write methods
129
147
 
@@ -366,7 +384,7 @@ class Module
366
384
  prop(klass, symbol, meta)
367
385
  end
368
386
  end
369
-
387
+ alias_method :property, :prop_accessor
370
388
 
371
389
  # Attach metadata.
372
390
  # Guard against duplicates, no need to keep order.
@@ -375,7 +393,11 @@ class Module
375
393
  # gmosx: crappy implementation, recode.
376
394
  #++
377
395
 
378
- def meta(key, val)
396
+ def meta(key, *val)
397
+ val = val.first if val.size == 1
398
+
399
+ N::PropertyUtils.enchant(self)
400
+
379
401
  self.module_eval %{
380
402
  @@__meta[key] ||= []
381
403
  @@__meta[key].delete_if { |v| val == v }
data/lib/og.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # * George Moschovitis <gm@navel.gr>
2
2
  # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: og.rb 259 2005-02-15 08:54:54Z gmosx $
3
+ # $Id: og.rb 266 2005-02-28 14:50:48Z gmosx $
4
4
 
5
5
  require 'glue'
6
6
  require 'glue/logger'
@@ -89,7 +89,7 @@ require 'glue/validation'
89
89
  # * Deserialize to OpenStruct.
90
90
  # * Better documentation.
91
91
 
92
- class Og
92
+ module Og
93
93
 
94
94
  # The name.
95
95
 
@@ -97,7 +97,7 @@ class Og
97
97
 
98
98
  # The version.
99
99
 
100
- Version = '0.10.0'
100
+ Version = '0.11.0'
101
101
 
102
102
  # Library path.
103
103
 
@@ -106,37 +106,45 @@ class Og
106
106
  # If true, only allow reading from the database. Usefull
107
107
  # for maintainance.
108
108
 
109
- cattr_accessor :read_only_mode, false
109
+ mattr_accessor :read_only_mode, false
110
110
 
111
111
  # If true, the library automatically 'enchants' managed classes.
112
112
  # In enchant mode, special db aware methods are added to
113
113
  # managed classes and instances.
114
+ # If false, Og enchants only classes that define properties.
114
115
 
115
- cattr_accessor :enchant_managed_classes, true
116
+ mattr_accessor :enchant_managed_classes, true
116
117
 
117
118
  # If true, use Ruby's advanced introspection capabilities to
118
119
  # automatically manage classes tha define properties.
119
120
 
120
- cattr_accessor :auto_manage_classes, true
121
+ mattr_accessor :auto_manage_classes, true
121
122
 
122
123
  # If true, automatically include the Og meta-language into Module.
123
- #
124
- # By default this is FALSE, to avoid polution of the Module object.
125
- # However if you include a prop_accessor or a managed Mixin in your
124
+ # If false, the polution of the Module object is avoided. However
125
+ # if you include a prop_accessor or a managed Mixin in your
126
126
  # object MetaLanguage gets automatically extended in the class.
127
127
 
128
- cattr_accessor :include_meta_language, true
128
+ mattr_accessor :include_meta_language, true
129
129
 
130
130
  # Attach the following prefix to all generated SQL table names.
131
131
  # Usefull on hosting scenarios where you have to run multiple
132
132
  # web applications/sites on a single database.
133
133
 
134
- cattr_accessor :table_prefix, nil
134
+ mattr_accessor :table_prefix, nil
135
135
 
136
+ # If true, Og tries to create/update the schema in the
137
+ # data store. For production/live environments set this to false
138
+ # and only set to true when the object model is upadated.
139
+ # For debug/development environments this should stay true
140
+ # for convienience.
141
+
142
+ mattr_accessor :create_schema, true
143
+
136
144
  # The active database. Og allows you to access multiple
137
145
  # databases from a single application.
138
146
 
139
- cattr_accessor :db
147
+ mattr_accessor :db
140
148
 
141
149
  # Set the active database.
142
150