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.
Files changed (69) hide show
  1. data/CHANGELOG +27 -0
  2. data/INSTALL +56 -0
  3. data/{README.og → README} +3 -3
  4. data/Rakefile +7 -73
  5. data/benchmark/bench.rb +75 -0
  6. data/benchmark/sqlite-no-prepare.1.txt +13 -0
  7. data/benchmark/sqlite-no-prepare.2.txt +13 -0
  8. data/benchmark/sqlite-prepare.1.txt +13 -0
  9. data/benchmark/sqlite-prepare.2.txt +13 -0
  10. data/doc/AUTHORS +0 -9
  11. data/{RELEASES.og → doc/RELEASES} +15 -0
  12. data/doc/config.txt +35 -0
  13. data/doc/tutorial.txt +595 -0
  14. data/examples/{og/README → README} +1 -1
  15. data/examples/{og/mock_example.rb → mock_example.rb} +1 -1
  16. data/examples/{og/mysql_to_psql.rb → mysql_to_psql.rb} +1 -1
  17. data/examples/{og/run.rb → run.rb} +1 -1
  18. data/install.rb +8 -5
  19. data/lib/og.rb +13 -8
  20. data/lib/og/adapter.rb +1 -1
  21. data/lib/og/adapters/filesys.rb +1 -1
  22. data/lib/og/adapters/mysql.rb +4 -3
  23. data/lib/og/adapters/oracle.rb +1 -1
  24. data/lib/og/adapters/psql.rb +4 -3
  25. data/lib/og/adapters/sqlite.rb +1 -1
  26. data/lib/og/backend.rb +1 -1
  27. data/lib/og/connection.rb +1 -1
  28. data/lib/og/database.rb +1 -1
  29. data/lib/og/meta.rb +13 -2
  30. data/lib/og/observer.rb +1 -1
  31. data/lib/og/typemacros.rb +1 -1
  32. data/lib/og/validation.rb +81 -0
  33. data/test/og/tc_validation.rb +89 -0
  34. metadata +33 -65
  35. data/ChangeLog +0 -1549
  36. data/lib/glue.rb +0 -55
  37. data/lib/glue/array.rb +0 -61
  38. data/lib/glue/attribute.rb +0 -83
  39. data/lib/glue/cache.rb +0 -138
  40. data/lib/glue/flexob.rb +0 -12
  41. data/lib/glue/hash.rb +0 -122
  42. data/lib/glue/inflector.rb +0 -91
  43. data/lib/glue/logger.rb +0 -147
  44. data/lib/glue/misc.rb +0 -14
  45. data/lib/glue/mixins.rb +0 -36
  46. data/lib/glue/number.rb +0 -24
  47. data/lib/glue/object.rb +0 -32
  48. data/lib/glue/pool.rb +0 -60
  49. data/lib/glue/property.rb +0 -408
  50. data/lib/glue/string.rb +0 -162
  51. data/lib/glue/time.rb +0 -85
  52. data/lib/glue/validation.rb +0 -394
  53. data/vendor/extensions/_base.rb +0 -153
  54. data/vendor/extensions/_template.rb +0 -36
  55. data/vendor/extensions/all.rb +0 -21
  56. data/vendor/extensions/array.rb +0 -68
  57. data/vendor/extensions/binding.rb +0 -224
  58. data/vendor/extensions/class.rb +0 -50
  59. data/vendor/extensions/continuation.rb +0 -71
  60. data/vendor/extensions/enumerable.rb +0 -250
  61. data/vendor/extensions/hash.rb +0 -23
  62. data/vendor/extensions/io.rb +0 -58
  63. data/vendor/extensions/kernel.rb +0 -42
  64. data/vendor/extensions/module.rb +0 -114
  65. data/vendor/extensions/numeric.rb +0 -230
  66. data/vendor/extensions/object.rb +0 -164
  67. data/vendor/extensions/ostruct.rb +0 -41
  68. data/vendor/extensions/string.rb +0 -316
  69. data/vendor/extensions/symbol.rb +0 -28
@@ -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
-
@@ -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
@@ -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
-