og 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
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
-