og 0.12.0 → 0.13.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/CHANGELOG +27 -0
- data/INSTALL +56 -0
- data/{README.og → README} +3 -3
- data/Rakefile +7 -73
- data/benchmark/bench.rb +75 -0
- data/benchmark/sqlite-no-prepare.1.txt +13 -0
- data/benchmark/sqlite-no-prepare.2.txt +13 -0
- data/benchmark/sqlite-prepare.1.txt +13 -0
- data/benchmark/sqlite-prepare.2.txt +13 -0
- data/doc/AUTHORS +0 -9
- data/{RELEASES.og → doc/RELEASES} +15 -0
- data/doc/config.txt +35 -0
- data/doc/tutorial.txt +595 -0
- data/examples/{og/README → README} +1 -1
- data/examples/{og/mock_example.rb → mock_example.rb} +1 -1
- data/examples/{og/mysql_to_psql.rb → mysql_to_psql.rb} +1 -1
- data/examples/{og/run.rb → run.rb} +1 -1
- data/install.rb +8 -5
- data/lib/og.rb +13 -8
- data/lib/og/adapter.rb +1 -1
- data/lib/og/adapters/filesys.rb +1 -1
- data/lib/og/adapters/mysql.rb +4 -3
- data/lib/og/adapters/oracle.rb +1 -1
- data/lib/og/adapters/psql.rb +4 -3
- data/lib/og/adapters/sqlite.rb +1 -1
- data/lib/og/backend.rb +1 -1
- data/lib/og/connection.rb +1 -1
- data/lib/og/database.rb +1 -1
- data/lib/og/meta.rb +13 -2
- data/lib/og/observer.rb +1 -1
- data/lib/og/typemacros.rb +1 -1
- data/lib/og/validation.rb +81 -0
- data/test/og/tc_validation.rb +89 -0
- metadata +33 -65
- data/ChangeLog +0 -1549
- data/lib/glue.rb +0 -55
- data/lib/glue/array.rb +0 -61
- data/lib/glue/attribute.rb +0 -83
- data/lib/glue/cache.rb +0 -138
- data/lib/glue/flexob.rb +0 -12
- data/lib/glue/hash.rb +0 -122
- data/lib/glue/inflector.rb +0 -91
- data/lib/glue/logger.rb +0 -147
- data/lib/glue/misc.rb +0 -14
- data/lib/glue/mixins.rb +0 -36
- data/lib/glue/number.rb +0 -24
- data/lib/glue/object.rb +0 -32
- data/lib/glue/pool.rb +0 -60
- data/lib/glue/property.rb +0 -408
- data/lib/glue/string.rb +0 -162
- data/lib/glue/time.rb +0 -85
- data/lib/glue/validation.rb +0 -394
- data/vendor/extensions/_base.rb +0 -153
- data/vendor/extensions/_template.rb +0 -36
- data/vendor/extensions/all.rb +0 -21
- data/vendor/extensions/array.rb +0 -68
- data/vendor/extensions/binding.rb +0 -224
- data/vendor/extensions/class.rb +0 -50
- data/vendor/extensions/continuation.rb +0 -71
- data/vendor/extensions/enumerable.rb +0 -250
- data/vendor/extensions/hash.rb +0 -23
- data/vendor/extensions/io.rb +0 -58
- data/vendor/extensions/kernel.rb +0 -42
- data/vendor/extensions/module.rb +0 -114
- data/vendor/extensions/numeric.rb +0 -230
- data/vendor/extensions/object.rb +0 -164
- data/vendor/extensions/ostruct.rb +0 -41
- data/vendor/extensions/string.rb +0 -316
- data/vendor/extensions/symbol.rb +0 -28
data/vendor/extensions/class.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
#!/usr/local/bin/ruby -w
|
2
|
-
#
|
3
|
-
# == extensions/class.rb
|
4
|
-
#
|
5
|
-
# Adds methods to the builtin Class class.
|
6
|
-
#
|
7
|
-
|
8
|
-
require "extensions/_base"
|
9
|
-
|
10
|
-
ExtensionsProject.implement(Class, :autoinit) do
|
11
|
-
class Class
|
12
|
-
#
|
13
|
-
# A shorthand for the common chore of assigning initialize's parameters to
|
14
|
-
# instance variables. For example:
|
15
|
-
#
|
16
|
-
# class Circle
|
17
|
-
#
|
18
|
-
# attr_reader :radius, :location, :area
|
19
|
-
#
|
20
|
-
# autoinit(:radius, :location) do
|
21
|
-
# @area = Math::PI * @radius ** 2
|
22
|
-
# end
|
23
|
-
#
|
24
|
-
# end
|
25
|
-
#
|
26
|
-
# A TypeError is raised unless all the arguments to +autoinit+ are strings
|
27
|
-
# or symbols.
|
28
|
-
#
|
29
|
-
#--
|
30
|
-
# Taken from ruby-talk:11668, by Avi Bryant.
|
31
|
-
def autoinit(*args, &block) # :yield:
|
32
|
-
unless args.all? { |a| Symbol === a or String === a }
|
33
|
-
raise TypeError, "All arguments must be symbols or strings"
|
34
|
-
end
|
35
|
-
block = proc {} if block.nil?
|
36
|
-
define_method(:__init_proc) { block }
|
37
|
-
params = args.join(", ")
|
38
|
-
vars = args.map { |a| "@#{a}" }.join(", ")
|
39
|
-
|
40
|
-
code = %{
|
41
|
-
def initialize(#{params})
|
42
|
-
#{vars} = #{params}
|
43
|
-
instance_eval(&__init_proc)
|
44
|
-
end
|
45
|
-
}
|
46
|
-
class_eval code
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
@@ -1,71 +0,0 @@
|
|
1
|
-
#!/usr/local/bin/ruby -w
|
2
|
-
#
|
3
|
-
# == extensions/continuation.rb
|
4
|
-
#
|
5
|
-
# Adds methods to the builtin Continuation class.
|
6
|
-
#
|
7
|
-
|
8
|
-
require "extensions/_base"
|
9
|
-
|
10
|
-
#
|
11
|
-
# * Continuation.create
|
12
|
-
#
|
13
|
-
ExtensionsProject.implement(Continuation, :create, :class) do
|
14
|
-
class Continuation
|
15
|
-
#
|
16
|
-
# <tt>Continuation.create</tt> offers a nicer interface for creating continuations than
|
17
|
-
# <tt>Kernel.callcc</tt>.
|
18
|
-
#
|
19
|
-
# === Example
|
20
|
-
#
|
21
|
-
# Count down from 10 to 0 using a continuation.
|
22
|
-
#
|
23
|
-
# continuation, counter = Continuation.create(10)
|
24
|
-
# puts counter
|
25
|
-
# continuation.call(counter - 1) if counter > 0
|
26
|
-
#
|
27
|
-
# Implement a workalike of <tt>Array#inject</tt> using continuations. For simplicity's
|
28
|
-
# sake, this is not fully compatible with the real <tt>#inject</tt>.
|
29
|
-
#
|
30
|
-
# class Array
|
31
|
-
# def cc_inject( value=nil )
|
32
|
-
# copy = self.clone
|
33
|
-
# cc, result, item = Continuation.create( value, nil )
|
34
|
-
# next_item = copy.shift
|
35
|
-
# if result and item
|
36
|
-
# cc.call( yield(result, item), next_item )
|
37
|
-
# elsif next_item
|
38
|
-
# cc.call( next_item, result )
|
39
|
-
# end
|
40
|
-
# result
|
41
|
-
# end
|
42
|
-
# end
|
43
|
-
#
|
44
|
-
# [1,2,3,4,5].cc_inject { |acc, n| acc + n } # -> 15
|
45
|
-
#
|
46
|
-
# === Explanation
|
47
|
-
#
|
48
|
-
# I've got no idea how it works. TODO: work it out. In particular, what do the arguments
|
49
|
-
# do? And what the hell is going on in #cc_inject???!?
|
50
|
-
#
|
51
|
-
# === See Also
|
52
|
-
#
|
53
|
-
# This method is included in the 'extensions' package primarily to support
|
54
|
-
# Binding.of_caller.
|
55
|
-
#
|
56
|
-
# === Credits
|
57
|
-
#
|
58
|
-
# <tt>Continuation.create</tt> was written and demonstrated by Florian Gross. See
|
59
|
-
# ruby-talk:94681.
|
60
|
-
#
|
61
|
-
def Continuation.create(*args, &block)
|
62
|
-
cc = nil
|
63
|
-
result = callcc { |c|
|
64
|
-
cc = c
|
65
|
-
block.call(cc) if block and args.empty?
|
66
|
-
}
|
67
|
-
result ||= args
|
68
|
-
return *[cc, *result]
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
@@ -1,250 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# == extensions/enumerable.rb
|
3
|
-
#
|
4
|
-
# Adds methods to the builtin Enumerable module.
|
5
|
-
#
|
6
|
-
|
7
|
-
require "extensions/_base"
|
8
|
-
|
9
|
-
#
|
10
|
-
# * Enumerable#build_hash
|
11
|
-
#
|
12
|
-
ExtensionsProject.implement(Enumerable, :build_hash) do
|
13
|
-
module Enumerable
|
14
|
-
#
|
15
|
-
# Like <tt>#map</tt>/<tt>#collect</tt>, but it generates a Hash. The block
|
16
|
-
# is expected to return two values: the key and the value for the new hash.
|
17
|
-
# numbers = (1..3)
|
18
|
-
# squares = numbers.build_hash { |n| [n, n*n] } # 1=>1, 2=>4, 3=>9
|
19
|
-
# sq_roots = numbers.build_hash { |n| [n*n, n] } # 1=>1, 4=>2, 9=>3
|
20
|
-
#
|
21
|
-
def build_hash
|
22
|
-
result = {}
|
23
|
-
self.each do |elt|
|
24
|
-
key, value = yield elt
|
25
|
-
result[key] = value
|
26
|
-
end
|
27
|
-
result
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# There was a bug in Hash which causes the above code to issue a warning when
|
32
|
-
# used with a Hash. That was fixed on 2003-10-24.
|
33
|
-
if RUBY_RELEASE_DATE < "2003-10-25"
|
34
|
-
class Hash #:nodoc:
|
35
|
-
def build_hash
|
36
|
-
result = {}
|
37
|
-
self.each_pair do |k, v|
|
38
|
-
key, value = yield(k, v)
|
39
|
-
result[key] = value
|
40
|
-
end
|
41
|
-
result
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
|
48
|
-
#
|
49
|
-
# Enumerable#mapf
|
50
|
-
#
|
51
|
-
ExtensionsProject.implement(Enumerable, :mapf) do
|
52
|
-
module Enumerable
|
53
|
-
#
|
54
|
-
# "map function"
|
55
|
-
# enum.mapf(:x)
|
56
|
-
# is short for
|
57
|
-
# enum.map { |elt| elt.x }
|
58
|
-
#
|
59
|
-
def mapf(message)
|
60
|
-
self.map { |elt| elt.send(message) }
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
|
66
|
-
#
|
67
|
-
# Enumerable#collectf
|
68
|
-
#
|
69
|
-
ExtensionsProject.implement(Enumerable, :collectf) do
|
70
|
-
module Enumerable
|
71
|
-
alias collectf mapf
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
|
76
|
-
#
|
77
|
-
# * Enumerable#includes?
|
78
|
-
#
|
79
|
-
ExtensionsProject.implement(Enumerable, :includes?) do
|
80
|
-
module Enumerable
|
81
|
-
alias includes? include?
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
|
86
|
-
#
|
87
|
-
# * Enumerable#contains?
|
88
|
-
#
|
89
|
-
ExtensionsProject.implement(Enumerable, :contains?) do
|
90
|
-
module Enumerable
|
91
|
-
alias contains? include?
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
|
96
|
-
#
|
97
|
-
# * Enumerable#has?
|
98
|
-
#
|
99
|
-
ExtensionsProject.implement(Enumerable, :has?) do
|
100
|
-
module Enumerable
|
101
|
-
alias has? include?
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
|
106
|
-
#
|
107
|
-
# * Enumerable#map_with_index
|
108
|
-
#
|
109
|
-
ExtensionsProject.implement(Enumerable, :map_with_index) do
|
110
|
-
module Enumerable
|
111
|
-
#
|
112
|
-
# Same as Enumerable#map, but the index is yielded as well. See
|
113
|
-
# Enumerable#each_with_index.
|
114
|
-
# puts files.map_with_index { |fn, idx| "#{idx}. #{fn}" }
|
115
|
-
# print "Please select a file (0-#{files.size}): "
|
116
|
-
#
|
117
|
-
def map_with_index
|
118
|
-
result = []
|
119
|
-
self.each_with_index do |elt, idx|
|
120
|
-
result << yield(elt, idx)
|
121
|
-
end
|
122
|
-
result
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
|
128
|
-
#
|
129
|
-
# * Enumerable#collect_with_index
|
130
|
-
#
|
131
|
-
ExtensionsProject.implement(Enumerable, :collect_with_index) do
|
132
|
-
module Enumerable
|
133
|
-
alias collect_with_index map_with_index
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
|
138
|
-
#
|
139
|
-
# * Enumerable#partition_by
|
140
|
-
#
|
141
|
-
ExtensionsProject.implement(Enumerable, :partition_by) do
|
142
|
-
module Enumerable
|
143
|
-
#
|
144
|
-
# See Enumerable#partition for the background. #partition_by is best
|
145
|
-
# explained by example.
|
146
|
-
#
|
147
|
-
# (1..5).partition_by { |n| n % 3 }
|
148
|
-
# # -> { 0 => [3], 1 => [1, 4], 2 => [2,5] }
|
149
|
-
#
|
150
|
-
# ["I had", 1, "dollar and", 50, "cents"].partition_by { |e| e.class }
|
151
|
-
# # -> { String => ["I had","dollar and","cents"], Fixnum => [1,50] }
|
152
|
-
#
|
153
|
-
# #partition_by is used to group items in a collection by something they
|
154
|
-
# have in common. The common factor is the key in the resulting hash, the
|
155
|
-
# array of like elements is the value.
|
156
|
-
#
|
157
|
-
def partition_by
|
158
|
-
result = {}
|
159
|
-
self.each do |e|
|
160
|
-
value = yield e
|
161
|
-
(result[value] ||= []) << e
|
162
|
-
end
|
163
|
-
result
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
|
169
|
-
#
|
170
|
-
# * Enumerable#none?
|
171
|
-
#
|
172
|
-
ExtensionsProject.implement(Enumerable, :none?) do
|
173
|
-
module Enumerable
|
174
|
-
#
|
175
|
-
# Enumerable#none? is the logical opposite of the builtin method Enumerable#any?. It
|
176
|
-
# returns +true+ if and only if _none_ of the elements in the collection satisfy the
|
177
|
-
# predicate.
|
178
|
-
#
|
179
|
-
# If no predicate is provided, Enumerable#none? returns +true+ if and only if _none_ of the
|
180
|
-
# elements have a true value (i.e. not +nil+ or +false+).
|
181
|
-
#
|
182
|
-
# [].none? # true
|
183
|
-
# [nil].none? # true
|
184
|
-
# [5,8,9].none? # false
|
185
|
-
# (1...10).none? { |n| n < 0 } # true
|
186
|
-
# (1...10).none? { |n| n > 0 } # false
|
187
|
-
#
|
188
|
-
def none? # :yield: e
|
189
|
-
if block_given?
|
190
|
-
not self.any? { |e| yield e }
|
191
|
-
else
|
192
|
-
not self.any?
|
193
|
-
end
|
194
|
-
end
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
|
199
|
-
#
|
200
|
-
# * Enumerable#one?
|
201
|
-
#
|
202
|
-
ExtensionsProject.implement(Enumerable, :one?) do
|
203
|
-
module Enumerable
|
204
|
-
#
|
205
|
-
# Enumerable#one? returns +true+ if and only if <em>exactly one</em> element in the
|
206
|
-
# collection satisfies the given predicate.
|
207
|
-
#
|
208
|
-
# If no predicate is provided, Enumerable#one? returns +true+ if and only if <em>exactly
|
209
|
-
# one</em> element has a true value (i.e. not +nil+ or +false+).
|
210
|
-
#
|
211
|
-
# [].one? # false
|
212
|
-
# [nil].one? # false
|
213
|
-
# [5].one? # true
|
214
|
-
# [5,8,9].one? # false
|
215
|
-
# (1...10).one? { |n| n == 5 } # true
|
216
|
-
# (1...10).one? { |n| n < 5 } # false
|
217
|
-
#
|
218
|
-
def one? # :yield: e
|
219
|
-
matches = 0
|
220
|
-
if block_given?
|
221
|
-
self.each do |e|
|
222
|
-
if yield(e)
|
223
|
-
matches += 1
|
224
|
-
return false if matches > 1
|
225
|
-
end
|
226
|
-
end
|
227
|
-
return (matches == 1)
|
228
|
-
else
|
229
|
-
one? { |e| e }
|
230
|
-
end
|
231
|
-
end
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
|
236
|
-
#
|
237
|
-
# * Object.in?
|
238
|
-
# This has special treatment: it's included here and in object.rb, so we don't
|
239
|
-
# want a warning if it's alredy defined.
|
240
|
-
#
|
241
|
-
unless Object.method_defined?(:in?)
|
242
|
-
ExtensionsProject.implement(Object, :in?) do
|
243
|
-
class Object
|
244
|
-
def in?(enumerable) # :nodoc: It's documented in object.rb.
|
245
|
-
enumerable.include?(self)
|
246
|
-
end
|
247
|
-
end
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
data/vendor/extensions/hash.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
#!/usr/local/bin/ruby -w
|
2
|
-
#
|
3
|
-
# == extensions/hash.rb
|
4
|
-
#
|
5
|
-
# Adds methods to the builtin Hash class.
|
6
|
-
#
|
7
|
-
|
8
|
-
require "extensions/_base"
|
9
|
-
|
10
|
-
#
|
11
|
-
# * Hash#select!
|
12
|
-
#
|
13
|
-
ExtensionsProject.implement(Hash, :select!) do
|
14
|
-
class Hash
|
15
|
-
#
|
16
|
-
# In-place version of Hash#select. (Counterpart to, and opposite of, the
|
17
|
-
# built-in #reject!)
|
18
|
-
#
|
19
|
-
def select!
|
20
|
-
reject! { |k,v| not yield(k,v) }
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/vendor/extensions/io.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
#!/usr/local/bin/ruby -w
|
2
|
-
|
3
|
-
#
|
4
|
-
# == extensions/io.rb
|
5
|
-
#
|
6
|
-
# Adds methods to the builtin IO class.
|
7
|
-
#
|
8
|
-
|
9
|
-
require "extensions/_base"
|
10
|
-
|
11
|
-
# This is Ruby's built-in IO class.
|
12
|
-
class IO
|
13
|
-
end
|
14
|
-
|
15
|
-
#
|
16
|
-
# * IO.write
|
17
|
-
#
|
18
|
-
ExtensionsProject.implement(IO, :write, :class) do
|
19
|
-
class << IO
|
20
|
-
#
|
21
|
-
# Writes the given data to the given path and closes the file. This is
|
22
|
-
# done in binary mode, complementing <tt>IO.read</tt> in standard Ruby.
|
23
|
-
#
|
24
|
-
# Returns the number of bytes written.
|
25
|
-
#
|
26
|
-
def write(path, data)
|
27
|
-
File.open(path, "wb") do |file|
|
28
|
-
return file.write(data)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
#
|
35
|
-
# * IO.writelines
|
36
|
-
#
|
37
|
-
ExtensionsProject.implement(IO, :writelines, :class) do
|
38
|
-
class << IO
|
39
|
-
#
|
40
|
-
# Writes the given array of data to the given path and closes the file.
|
41
|
-
# This is done in binary mode, complementing <tt>IO.readlines</tt> in
|
42
|
-
# standard Ruby.
|
43
|
-
#
|
44
|
-
# Note that +readlines+ (the standard Ruby method) returns an array of lines
|
45
|
-
# <em>with newlines intact</em>, whereas +writelines+ uses +puts+, and so
|
46
|
-
# appends newlines if necessary. In this small way, +readlines+ and
|
47
|
-
# +writelines+ are not exact opposites.
|
48
|
-
#
|
49
|
-
# Returns +nil+.
|
50
|
-
#
|
51
|
-
def writelines(path, data)
|
52
|
-
File.open(path, "wb") do |file|
|
53
|
-
file.puts(data)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|