og 0.7.0 → 0.8.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 +14 -4
- data/ChangeLog +192 -1
- data/README.og +2 -1
- data/RELEASES.og +35 -0
- data/Rakefile +1 -1
- data/examples/og/mock_example.rb +6 -9
- data/examples/og/mysql_to_psql.rb +100 -0
- data/examples/og/run.rb +8 -17
- data/lib/glue/array.rb +1 -1
- data/lib/glue/attribute.rb +86 -0
- data/lib/glue/cache.rb +1 -1
- data/lib/glue/hash.rb +1 -1
- data/lib/glue/inflector.rb +1 -1
- data/lib/glue/logger.rb +118 -18
- data/lib/glue/mixins.rb +1 -1
- data/lib/glue/number.rb +1 -1
- data/lib/glue/pool.rb +1 -1
- data/lib/glue/property.rb +48 -31
- data/lib/glue/string.rb +1 -1
- data/lib/glue/time.rb +2 -2
- data/lib/glue/validation.rb +400 -0
- data/lib/glue.rb +7 -8
- data/lib/og/backend.rb +47 -46
- data/lib/og/backends/mysql.rb +64 -63
- data/lib/og/backends/psql.rb +73 -72
- data/lib/og/connection.rb +7 -8
- data/lib/og/enchant.rb +80 -0
- data/lib/og/meta.rb +21 -21
- data/lib/og/mock.rb +31 -88
- data/lib/og/version.rb +6 -5
- data/lib/og.rb +95 -129
- data/test/tc_og.rb +3 -3
- data/vendor/extensions/_base.rb +153 -0
- data/vendor/extensions/_template.rb +36 -0
- data/vendor/extensions/all.rb +21 -0
- data/vendor/extensions/array.rb +68 -0
- data/vendor/extensions/binding.rb +224 -0
- data/vendor/extensions/class.rb +50 -0
- data/vendor/extensions/continuation.rb +71 -0
- data/vendor/extensions/enumerable.rb +250 -0
- data/vendor/extensions/hash.rb +23 -0
- data/vendor/extensions/io.rb +58 -0
- data/vendor/extensions/kernel.rb +42 -0
- data/vendor/extensions/module.rb +114 -0
- data/vendor/extensions/numeric.rb +230 -0
- data/vendor/extensions/object.rb +164 -0
- data/vendor/extensions/ostruct.rb +41 -0
- data/vendor/extensions/string.rb +316 -0
- data/vendor/extensions/symbol.rb +28 -0
- metadata +24 -4
- data/lib/glue/property.rb.old +0 -307
data/lib/glue/logger.rb
CHANGED
@@ -1,45 +1,144 @@
|
|
1
|
-
# = Logger
|
2
|
-
#
|
3
|
-
# A simple wrapper arround the Ruby logger. Mainly for compatibility
|
4
|
-
# purposes.
|
5
|
-
#
|
6
1
|
# code:
|
7
2
|
# * George Moschovitis <gm@navel.gr>
|
8
3
|
#
|
9
4
|
# (c) 2004 Navel, all rights reserved.
|
10
5
|
# $Id: logger.rb 161 2004-11-18 10:51:51Z gmosx $
|
11
6
|
|
12
|
-
require
|
7
|
+
require 'logger'
|
13
8
|
|
14
9
|
# = Logger
|
15
10
|
#
|
16
|
-
# A simple wrapper arround the Ruby logger. Mainly for
|
17
|
-
# purposes.
|
11
|
+
# A simple wrapper arround the Ruby logger. Mainly for
|
12
|
+
# compatibility purposes.
|
18
13
|
#
|
19
14
|
class Logger
|
20
15
|
alias_method :devel, :debug
|
21
16
|
alias_method :fine, :debug
|
22
17
|
|
23
|
-
|
18
|
+
# Prints a trace message to DEBUGLOG (at debug level).
|
19
|
+
# Useful for emitting the value of variables, etc. Use
|
20
|
+
# like this:
|
21
|
+
#
|
22
|
+
# x = y = 5
|
23
|
+
# trace 'x' # -> 'x = 5'
|
24
|
+
# trace 'x ** y' # -> 'x ** y = 3125'
|
25
|
+
#
|
26
|
+
# If you have a more complicated value, like an array of
|
27
|
+
# hashes, then you'll probably want to use an alternative
|
28
|
+
# output format. For instance:
|
29
|
+
#
|
30
|
+
# trace 'value', :yaml
|
31
|
+
#
|
32
|
+
# Valid output format values (the _style_ parameter) are:
|
33
|
+
#
|
34
|
+
# :p :inspect
|
35
|
+
# :pp (pretty-print, using 'pp' library)
|
36
|
+
# :s :to_s
|
37
|
+
# :y :yaml :to_yaml (using the 'yaml' library')
|
38
|
+
#
|
39
|
+
# The default is <tt>:p</tt>.
|
40
|
+
#
|
41
|
+
# CREDITS:
|
42
|
+
#
|
43
|
+
# This code comes straight from the dev-utils Gem.
|
44
|
+
# Author: Gavin Sinclair <gsinclair@soyabean.com.au>
|
45
|
+
#
|
46
|
+
def trace(expr, style=:p)
|
47
|
+
unless expr.respond_to? :to_str
|
48
|
+
warn "trace: Can't evaluate the given value: #{caller.first}"
|
49
|
+
else
|
50
|
+
require 'extensions/binding'
|
51
|
+
|
52
|
+
Binding.of_caller do |b|
|
53
|
+
value = b.eval(expr.to_str)
|
54
|
+
formatter = TRACE_STYLES[style] || :inspect
|
55
|
+
case formatter
|
56
|
+
when :pp then require 'pp'
|
57
|
+
when :y, :yaml, :to_yaml then require 'yaml'
|
58
|
+
end
|
59
|
+
value_s = value.send(formatter)
|
60
|
+
message = "#{expr} = #{value_s}"
|
61
|
+
lines = message.split(/\n/)
|
62
|
+
indent = " "
|
63
|
+
debug(lines.shift)
|
64
|
+
lines.each do |line|
|
65
|
+
debug(indent + line)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
TRACE_STYLES = {} # :nodoc:
|
71
|
+
TRACE_STYLES.update( :pp => :pp_s, :s => :to_s, :p => :inspect, :y => :to_yaml,
|
72
|
+
:yaml => :to_yaml, :inspect => :inspect, :to_yaml => :to_yaml )
|
73
|
+
|
74
|
+
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
75
|
+
# Global logger interface.
|
76
|
+
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
77
|
+
|
78
|
+
# Override the logger with your custom version.
|
79
|
+
#
|
80
|
+
@@global_logger = Logger.new(STDERR)
|
81
|
+
|
82
|
+
def self.set(logger)
|
83
|
+
@@global_logger = logger
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.get
|
87
|
+
@@global_logger
|
24
88
|
end
|
25
89
|
|
26
|
-
|
27
|
-
|
28
|
-
def d(str)
|
29
|
-
self << "#{str}\n"
|
90
|
+
def self.warn(str)
|
91
|
+
@@global_logger.warn(str)
|
30
92
|
end
|
31
93
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
94
|
+
def self.info(str)
|
95
|
+
@@global_logger.info(str)
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.debug(str)
|
99
|
+
@@global_logger.debug(str)
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.error(str)
|
103
|
+
@@global_logger.error(str)
|
37
104
|
end
|
38
105
|
|
106
|
+
#--
|
107
|
+
# Saddly have to duplicate the code to make
|
108
|
+
# Binding.of_caller work.
|
109
|
+
#++
|
110
|
+
def self.trace(expr, style=:p)
|
111
|
+
unless expr.respond_to? :to_str
|
112
|
+
warn "trace: Can't evaluate the given value: #{caller.first}"
|
113
|
+
else
|
114
|
+
require 'extensions/binding'
|
115
|
+
|
116
|
+
Binding.of_caller do |b|
|
117
|
+
value = b.eval(expr.to_str)
|
118
|
+
formatter = TRACE_STYLES[style] || :inspect
|
119
|
+
case formatter
|
120
|
+
when :pp then require 'pp'
|
121
|
+
when :y, :yaml, :to_yaml then require 'yaml'
|
122
|
+
end
|
123
|
+
value_s = value.send(formatter)
|
124
|
+
message = "#{expr} = #{value_s}"
|
125
|
+
lines = message.split(/\n/)
|
126
|
+
indent = " "
|
127
|
+
debug(lines.shift)
|
128
|
+
lines.each do |line|
|
129
|
+
debug(indent + line)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
136
|
+
|
39
137
|
private
|
40
138
|
|
41
139
|
# the default Ruby logger has a hardwired silly format.
|
42
140
|
# we use some Ruby magic to fix it!
|
141
|
+
|
43
142
|
remove_const "Format"
|
44
143
|
|
45
144
|
Format = "%5s: %s\n"
|
@@ -47,5 +146,6 @@ class Logger
|
|
47
146
|
def format_message(severity, timestamp, msg, progname)
|
48
147
|
Format % [severity, msg]
|
49
148
|
end
|
149
|
+
|
50
150
|
end
|
51
151
|
|
data/lib/glue/mixins.rb
CHANGED
data/lib/glue/number.rb
CHANGED
data/lib/glue/pool.rb
CHANGED
data/lib/glue/property.rb
CHANGED
@@ -1,15 +1,13 @@
|
|
1
1
|
# code:
|
2
2
|
# * George Moschovitis <gm@navel.gr>
|
3
|
-
# design:
|
4
|
-
# * Anastastios Koutoumanos <ak@navel.gr>
|
5
3
|
#
|
6
4
|
# (c) 2004 Navel, all rights reserved.
|
7
5
|
# $Id: property.rb 200 2004-12-27 11:24:41Z gmosx $
|
8
6
|
|
9
|
-
require
|
10
|
-
require
|
7
|
+
require 'glue/array'
|
8
|
+
require 'glue/hash'
|
11
9
|
|
12
|
-
module
|
10
|
+
module N
|
13
11
|
|
14
12
|
# = Property
|
15
13
|
#
|
@@ -61,14 +59,17 @@ module PropertyUtils
|
|
61
59
|
# Add accessors to the properties to the given target
|
62
60
|
# (Module or Class). For simplicity also create the
|
63
61
|
# meta accessors.
|
62
|
+
#
|
63
|
+
# [+target+]
|
64
|
+
# The target class or module
|
64
65
|
#--
|
65
66
|
# gmosx: Perhaps we 'll optimize this in the future.
|
66
67
|
#++
|
67
|
-
def self.enchant(target)
|
68
|
+
def self.enchant(target, force = false)
|
68
69
|
unless target.singleton_methods.include?('__props')
|
69
70
|
target.module_eval <<-"end_eval", __FILE__, __LINE__
|
70
|
-
@@__meta =
|
71
|
-
@@__props =
|
71
|
+
@@__meta = N::SafeHash.new
|
72
|
+
@@__props = N::SafeArray.new
|
72
73
|
|
73
74
|
def self.__props
|
74
75
|
@@__props
|
@@ -98,7 +99,8 @@ module PropertyUtils
|
|
98
99
|
|
99
100
|
# copy the metadata.
|
100
101
|
src.__meta.each do |k, val|
|
101
|
-
|
102
|
+
dest.__meta[k] = val.dup
|
103
|
+
# val.each { |v| dest.meta(k, v) } if val
|
102
104
|
end
|
103
105
|
end
|
104
106
|
|
@@ -132,19 +134,19 @@ module PropertyUtils
|
|
132
134
|
|
133
135
|
def __force_#{s}(val)
|
134
136
|
self.#{s}=(} + case klass.name
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
137
|
+
when Fixnum.name
|
138
|
+
"val.to_i()"
|
139
|
+
when String.name
|
140
|
+
"val.to_s()"
|
141
|
+
when Float.name
|
142
|
+
"val.to_f()"
|
143
|
+
when Time.name
|
144
|
+
"Time.parse(val.to_s())"
|
145
|
+
when TrueClass.name, FalseClass.name
|
146
|
+
"val.to_i() > 0"
|
147
|
+
else
|
148
|
+
"val"
|
149
|
+
end + %{)
|
148
150
|
end
|
149
151
|
}
|
150
152
|
end
|
@@ -161,7 +163,13 @@ module PropertyUtils
|
|
161
163
|
end
|
162
164
|
}
|
163
165
|
end
|
164
|
-
|
166
|
+
|
167
|
+
# Get the property metadata for the given symbol.
|
168
|
+
#
|
169
|
+
def self.get_prop(klass, sym)
|
170
|
+
return klass.__props.find { |p| p.symbol == sym }
|
171
|
+
end
|
172
|
+
|
165
173
|
end
|
166
174
|
|
167
175
|
end # module
|
@@ -182,6 +190,7 @@ class Module
|
|
182
190
|
# --> creates reader and writer.
|
183
191
|
#
|
184
192
|
def prop(*params)
|
193
|
+
|
185
194
|
meta = {}
|
186
195
|
klass = Object
|
187
196
|
|
@@ -200,7 +209,7 @@ class Module
|
|
200
209
|
end
|
201
210
|
end
|
202
211
|
|
203
|
-
|
212
|
+
N::PropertyUtils.enchant(self)
|
204
213
|
|
205
214
|
if self.is_a?(Class)
|
206
215
|
|
@@ -209,8 +218,8 @@ class Module
|
|
209
218
|
self.module_eval <<-"end_eval", __FILE__, __LINE__
|
210
219
|
|
211
220
|
def self.inherited(sub)
|
212
|
-
|
213
|
-
|
221
|
+
N::PropertyUtils.enchant(sub)
|
222
|
+
N::PropertyUtils.copy_props(self, sub)
|
214
223
|
# gmosx: We have to define @@__props first to avoid reusing
|
215
224
|
# the hash from the module. super must stay at the end.
|
216
225
|
super
|
@@ -225,10 +234,15 @@ class Module
|
|
225
234
|
self.module_eval <<-"end_eval", __FILE__, __LINE__
|
226
235
|
|
227
236
|
def self.append_features(base)
|
228
|
-
|
229
|
-
|
237
|
+
N::PropertyUtils.enchant(base)
|
238
|
+
N::PropertyUtils.copy_props(self, base)
|
230
239
|
# gmosx: We have to define @@__props first to avoid reusing
|
231
240
|
# the hash from the module. super must stay at the end.
|
241
|
+
|
242
|
+
unless base.included_modules.include?(N::Validation)
|
243
|
+
base.module_eval %{ include N::Validation }
|
244
|
+
end if defined?(N::Validation)
|
245
|
+
|
232
246
|
super
|
233
247
|
end
|
234
248
|
|
@@ -236,7 +250,7 @@ class Module
|
|
236
250
|
|
237
251
|
end
|
238
252
|
|
239
|
-
property =
|
253
|
+
property = N::Property.new(symbol, klass, meta)
|
240
254
|
|
241
255
|
reader = meta[:reader] || true
|
242
256
|
writer = writer || meta[:writer] || false
|
@@ -248,7 +262,10 @@ class Module
|
|
248
262
|
meta[:writer] = true if meta[:writer].nil?
|
249
263
|
end
|
250
264
|
|
251
|
-
|
265
|
+
N::PropertyUtils.add_prop(self, property)
|
266
|
+
|
267
|
+
# gmosx: should be placed AFTER enchant!
|
268
|
+
module_eval %{ include N::Validation } if defined?(N::Validation)
|
252
269
|
end
|
253
270
|
|
254
271
|
# Helper method. Accepts a collection of symbols and generates
|
@@ -303,7 +320,7 @@ class Module
|
|
303
320
|
# the meta hash.
|
304
321
|
meta = param
|
305
322
|
else
|
306
|
-
raise
|
323
|
+
raise 'Error when defining property!'
|
307
324
|
end
|
308
325
|
end
|
309
326
|
|
data/lib/glue/string.rb
CHANGED
data/lib/glue/time.rb
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
require "time.rb"
|
8
8
|
|
9
|
-
module
|
9
|
+
module N;
|
10
10
|
|
11
11
|
# = Time
|
12
12
|
#
|
@@ -77,7 +77,7 @@ module TimeUtils
|
|
77
77
|
#
|
78
78
|
def self.time_in_day_range(time, stime=ZERO, etime=NEVER)
|
79
79
|
if (etime <= stime)
|
80
|
-
|
80
|
+
Logger.debug "Invalid end time (#{etime} < #{stime})" if $DBG
|
81
81
|
etime = NEVER
|
82
82
|
end
|
83
83
|
|