sequel_core 1.4.0 → 1.5.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 (51) hide show
  1. data/CHANGELOG +74 -0
  2. data/COPYING +1 -0
  3. data/README +17 -6
  4. data/Rakefile +16 -21
  5. data/lib/sequel_core.rb +18 -28
  6. data/lib/sequel_core/adapters/ado.rb +3 -15
  7. data/lib/sequel_core/adapters/dbi.rb +1 -14
  8. data/lib/sequel_core/adapters/informix.rb +3 -3
  9. data/lib/sequel_core/adapters/jdbc.rb +2 -2
  10. data/lib/sequel_core/adapters/mysql.rb +39 -59
  11. data/lib/sequel_core/adapters/odbc.rb +18 -38
  12. data/lib/sequel_core/adapters/openbase.rb +1 -17
  13. data/lib/sequel_core/adapters/oracle.rb +1 -19
  14. data/lib/sequel_core/adapters/postgres.rb +20 -60
  15. data/lib/sequel_core/adapters/sqlite.rb +4 -8
  16. data/lib/sequel_core/connection_pool.rb +150 -0
  17. data/lib/sequel_core/core_ext.rb +41 -0
  18. data/lib/sequel_core/core_sql.rb +35 -38
  19. data/lib/sequel_core/database.rb +20 -17
  20. data/lib/sequel_core/dataset.rb +49 -80
  21. data/lib/sequel_core/dataset/callback.rb +11 -13
  22. data/lib/sequel_core/dataset/convenience.rb +18 -136
  23. data/lib/sequel_core/dataset/pagination.rb +81 -0
  24. data/lib/sequel_core/dataset/sequelizer.rb +5 -4
  25. data/lib/sequel_core/dataset/sql.rb +43 -33
  26. data/lib/sequel_core/deprecated.rb +200 -0
  27. data/lib/sequel_core/exceptions.rb +0 -14
  28. data/lib/sequel_core/object_graph.rb +199 -0
  29. data/lib/sequel_core/pretty_table.rb +27 -24
  30. data/lib/sequel_core/schema/generator.rb +16 -4
  31. data/lib/sequel_core/schema/sql.rb +5 -3
  32. data/lib/sequel_core/worker.rb +1 -1
  33. data/spec/adapters/informix_spec.rb +1 -47
  34. data/spec/adapters/mysql_spec.rb +85 -54
  35. data/spec/adapters/oracle_spec.rb +1 -57
  36. data/spec/adapters/postgres_spec.rb +66 -49
  37. data/spec/adapters/sqlite_spec.rb +4 -29
  38. data/spec/connection_pool_spec.rb +358 -0
  39. data/spec/core_sql_spec.rb +24 -19
  40. data/spec/database_spec.rb +13 -9
  41. data/spec/dataset_spec.rb +59 -78
  42. data/spec/object_graph_spec.rb +202 -0
  43. data/spec/pretty_table_spec.rb +1 -9
  44. data/spec/schema_generator_spec.rb +7 -1
  45. data/spec/schema_spec.rb +27 -0
  46. data/spec/sequelizer_spec.rb +2 -2
  47. data/spec/spec_helper.rb +4 -2
  48. metadata +16 -57
  49. data/lib/sequel_core/array_keys.rb +0 -322
  50. data/lib/sequel_core/model.rb +0 -8
  51. data/spec/array_keys_spec.rb +0 -682
@@ -35,14 +35,6 @@ context "PrettyTable" do
35
35
  /\n(\|x\|y\|)|(\|y\|x\|)\n/
36
36
  end
37
37
 
38
- specify "should infer columns from array with keys" do
39
- a = [1, 2, 3]
40
- a.keys = [:a, :b, :c]
41
- Sequel::PrettyTable.print([a])
42
- @output.rewind
43
- @output.read.should =~ /\n\|a\|b\|c\|\n/
44
- end
45
-
46
38
  specify "should calculate the maximum width of each column correctly" do
47
39
  Sequel::PrettyTable.print(@data2, [:a, :b])
48
40
  @output.rewind
@@ -63,4 +55,4 @@ context "PrettyTable" do
63
55
  @output.read.should == \
64
56
  "+--+\n|a |\n+--+\n|23|\n|45|\n+--+\n"
65
57
  end
66
- end
58
+ end
@@ -82,6 +82,9 @@ describe Sequel::Schema::AlterTableGenerator do
82
82
  add_index [:fff, :ggg]
83
83
  drop_index :hhh
84
84
  add_full_text_index :blah
85
+ add_spatial_index :geom
86
+ add_index :blah, :type => :hash
87
+ add_index :blah, :where => {:something => true}
85
88
  add_constraint :con1, ':fred > 100'
86
89
  drop_constraint :con2
87
90
  end
@@ -96,7 +99,10 @@ describe Sequel::Schema::AlterTableGenerator do
96
99
  {:op => :set_column_default, :name => :eee, :default => 1},
97
100
  {:op => :add_index, :columns => [:fff, :ggg]},
98
101
  {:op => :drop_index, :columns => [:hhh]},
99
- {:op => :add_index, :columns => [:blah], :full_text => true},
102
+ {:op => :add_index, :columns => [:blah], :type => :full_text},
103
+ {:op => :add_index, :columns => [:geom], :type => :spatial},
104
+ {:op => :add_index, :columns => [:blah], :type => :hash},
105
+ {:op => :add_index, :columns => [:blah], :where => {:something => true}},
100
106
  {:op => :add_constraint, :type => :check, :name => :con1, :check => [':fred > 100']},
101
107
  {:op => :drop_constraint, :name => :con2}
102
108
  ]
data/spec/schema_spec.rb CHANGED
@@ -204,6 +204,33 @@ context "DB#create_table" do
204
204
  }.should raise_error(Sequel::Error)
205
205
  end
206
206
 
207
+ specify "should raise on spatial index definitions" do
208
+ proc {
209
+ @db.create_table(:cats) do
210
+ point :geom
211
+ spatial_index :geom
212
+ end
213
+ }.should raise_error(Sequel::Error)
214
+ end
215
+
216
+ specify "should raise on partial index definitions" do
217
+ proc {
218
+ @db.create_table(:cats) do
219
+ text :name
220
+ index :name, :where => {:something => true}
221
+ end
222
+ }.should raise_error(Sequel::Error)
223
+ end
224
+
225
+ specify "should raise index definitions with type" do
226
+ proc {
227
+ @db.create_table(:cats) do
228
+ text :name
229
+ index :name, :type => :hash
230
+ end
231
+ }.should raise_error(Sequel::Error)
232
+ end
233
+
207
234
  specify "should accept multiple index definitions" do
208
235
  @db.create_table(:cats) do
209
236
  integer :id
@@ -247,8 +247,8 @@ context "Proc#to_sql" do
247
247
  end
248
248
 
249
249
  specify "should support functions on columns" do
250
- proc {:x.MAX > 100}.sql.should == "(max(x) > 100)"
251
- proc {:x.COUNT > 100}.sql.should == "(count(x) > 100)"
250
+ proc {:max[:x] > 100}.sql.should == "(max(x) > 100)"
251
+ proc {:count[:x] > 100}.sql.should == "(count(x) > 100)"
252
252
  end
253
253
 
254
254
  specify "should support SQL functions" do
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'rubygems'
2
- require File.join(File.dirname(__FILE__), "../lib/sequel_core")
3
-
2
+ unless Object.const_defined?('Sequel')
3
+ $:.unshift(File.join(File.dirname(__FILE__), "../lib/"))
4
+ require 'sequel_core'
5
+ end
4
6
  if File.exists?(File.join(File.dirname(__FILE__), 'spec_config.rb'))
5
7
  require File.join(File.dirname(__FILE__), 'spec_config.rb')
6
8
  end
metadata CHANGED
@@ -3,12 +3,12 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: sequel_core
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.4.0
7
- date: 2008-04-08 00:00:00 -07:00
6
+ version: 1.5.0
7
+ date: 2008-04-29 00:00:00 -07:00
8
8
  summary: "The Database Toolkit for Ruby: Core Library and Adapters"
9
9
  require_paths:
10
10
  - lib
11
- email: themastermind1@gmail.com
11
+ email: code@jeremyevans.net
12
12
  homepage: http://sequel.rubyforge.org
13
13
  rubyforge_project: sequel
14
14
  description: "The Database Toolkit for Ruby: Core Library and Adapters"
@@ -27,28 +27,29 @@ signing_key:
27
27
  cert_chain:
28
28
  post_install_message:
29
29
  authors:
30
- - Aman Gupta
30
+ - Jeremy Evans
31
31
  files:
32
32
  - COPYING
33
33
  - README
34
34
  - Rakefile
35
35
  - bin/sequel
36
36
  - spec/adapters
37
- - spec/array_keys_spec.rb
37
+ - spec/dataset_spec.rb
38
38
  - spec/core_ext_spec.rb
39
39
  - spec/core_sql_spec.rb
40
40
  - spec/database_spec.rb
41
- - spec/dataset_spec.rb
41
+ - spec/schema_spec.rb
42
42
  - spec/migration_spec.rb
43
43
  - spec/pretty_table_spec.rb
44
44
  - spec/rcov.opts
45
45
  - spec/schema_generator_spec.rb
46
- - spec/schema_spec.rb
46
+ - spec/spec_helper.rb
47
47
  - spec/sequelizer_spec.rb
48
48
  - spec/spec.opts
49
49
  - spec/spec_config.rb.example
50
- - spec/spec_helper.rb
51
50
  - spec/worker_spec.rb
51
+ - spec/connection_pool_spec.rb
52
+ - spec/object_graph_spec.rb
52
53
  - spec/adapters/informix_spec.rb
53
54
  - spec/adapters/mysql_spec.rb
54
55
  - spec/adapters/oracle_spec.rb
@@ -57,19 +58,20 @@ files:
57
58
  - lib/sequel_core.rb
58
59
  - lib/sequel_core
59
60
  - lib/sequel_core/adapters
60
- - lib/sequel_core/array_keys.rb
61
+ - lib/sequel_core/dataset.rb
61
62
  - lib/sequel_core/core_ext.rb
62
63
  - lib/sequel_core/core_sql.rb
63
64
  - lib/sequel_core/database.rb
64
- - lib/sequel_core/dataset.rb
65
- - lib/sequel_core/dataset
66
65
  - lib/sequel_core/exceptions.rb
66
+ - lib/sequel_core/dataset
67
+ - lib/sequel_core/object_graph.rb
67
68
  - lib/sequel_core/migration.rb
68
- - lib/sequel_core/model.rb
69
+ - lib/sequel_core/worker.rb
69
70
  - lib/sequel_core/pretty_table.rb
70
71
  - lib/sequel_core/schema.rb
71
72
  - lib/sequel_core/schema
72
- - lib/sequel_core/worker.rb
73
+ - lib/sequel_core/connection_pool.rb
74
+ - lib/sequel_core/deprecated.rb
73
75
  - lib/sequel_core/adapters/adapter_skeleton.rb
74
76
  - lib/sequel_core/adapters/ado.rb
75
77
  - lib/sequel_core/adapters/db2.rb
@@ -87,6 +89,7 @@ files:
87
89
  - lib/sequel_core/dataset/convenience.rb
88
90
  - lib/sequel_core/dataset/sequelizer.rb
89
91
  - lib/sequel_core/dataset/sql.rb
92
+ - lib/sequel_core/dataset/pagination.rb
90
93
  - lib/sequel_core/schema/generator.rb
91
94
  - lib/sequel_core/schema/sql.rb
92
95
  - CHANGELOG
@@ -94,18 +97,10 @@ test_files: []
94
97
 
95
98
  rdoc_options:
96
99
  - --quiet
97
- - --title
98
- - "Sequel: The Database Toolkit for Ruby"
99
- - --opname
100
- - index.html
101
100
  - --line-numbers
102
- - --main
103
- - README
104
101
  - --inline-source
105
102
  - --exclude
106
103
  - ^(examples|extras)/
107
- - --exclude
108
- - lib/sequel_core.rb
109
104
  extra_rdoc_files:
110
105
  - README
111
106
  - CHANGELOG
@@ -126,39 +121,3 @@ dependencies:
126
121
  - !ruby/object:Gem::Version
127
122
  version: 0.0.0
128
123
  version:
129
- - !ruby/object:Gem::Dependency
130
- name: assistance
131
- version_requirement:
132
- version_requirements: !ruby/object:Gem::Version::Requirement
133
- requirements:
134
- - - ">="
135
- - !ruby/object:Gem::Version
136
- version: "0.1"
137
- version:
138
- - !ruby/object:Gem::Dependency
139
- name: RubyInline
140
- version_requirement:
141
- version_requirements: !ruby/object:Gem::Version::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: 3.6.6
146
- version:
147
- - !ruby/object:Gem::Dependency
148
- name: ParseTree
149
- version_requirement:
150
- version_requirements: !ruby/object:Gem::Version::Requirement
151
- requirements:
152
- - - ">="
153
- - !ruby/object:Gem::Version
154
- version: 2.1.1
155
- version:
156
- - !ruby/object:Gem::Dependency
157
- name: ruby2ruby
158
- version_requirement:
159
- version_requirements: !ruby/object:Gem::Version::Requirement
160
- requirements:
161
- - - ">"
162
- - !ruby/object:Gem::Version
163
- version: 0.0.0
164
- version:
@@ -1,322 +0,0 @@
1
- # ArrayKeys provide support for accessing array elements by keys. ArrayKeys are
2
- # based on the arrayfields gem by Ara Howard, and can be used as substitutes
3
- # for fetching records tuples as Ruby hashes.
4
- #
5
- # The main advantage offered by ArrayKeys over hashes is that the values are
6
- # always ordered according to the column order in the query. Another purported
7
- # advantage is that they reduce the memory footprint, but this has turned out
8
- # to be a false claim.
9
- module ArrayKeys
10
- # The KeySet module contains methods that extend an array of keys to return
11
- # a key's position in the key set.
12
- module KeySet
13
- # Returns the key's position in the key set. Provides indifferent access
14
- # for symbols and strings.
15
- def key_pos(key)
16
- @key_indexes ||= inject({}) {|h, k| h[k.to_sym] = h.size; h}
17
- @key_indexes[key] || @key_indexes[key.to_sym] || @key_indexes[key.to_s]
18
- end
19
-
20
- # Adds a key to the key set.
21
- def add_key(key)
22
- self << key
23
- @key_indexes[key] = @key_indexes.size
24
- end
25
-
26
- # Removes a key from the key set by its index.
27
- def del_key(idx)
28
- delete_at(idx)
29
- @key_indexes = nil # reset key indexes
30
- end
31
- end
32
-
33
- # The KeyAccess provides a large part of the Hash API for arrays with keys.
34
- module KeyAccess
35
- # Returns a value referenced by an array index or a key.
36
- def [](idx, *args)
37
- if String === idx or Symbol === idx
38
- (idx = @keys.key_pos(idx)) ? super(idx, *args) : nil
39
- else
40
- super
41
- end
42
- end
43
-
44
- # Sets the value referenced by an array index or a key.
45
- def []=(idx,*args)
46
- if String === idx or Symbol === idx
47
- idx = @keys.key_pos(idx) || @keys.add_key(idx.to_sym)
48
- end
49
- super(idx, *args)
50
- end
51
-
52
- # Stores a value by index or key.
53
- def store(k, v); self[k] = v; end
54
-
55
- # Slices the array, and returns an array with its keys sliced accordingly.
56
- def slice(*args)
57
- s = super(*args)
58
- s.keys = @keys.slice(*args)
59
- s
60
- end
61
-
62
- # Converts the array into a hash.
63
- def to_hash
64
- h = {}
65
- each_with_index {|v, i| h[(k = @keys[i]) ? k.to_sym : nil] = v}
66
- h
67
- end
68
- alias_method :to_h, :to_hash
69
-
70
- # Iterates over each key-value pair in the array.
71
- def each_pair
72
- each_with_index {|v, i| yield @keys[i], v}
73
- end
74
-
75
- # Iterates over the array's associated keys.
76
- def each_key(&block)
77
- @keys.each(&block)
78
- end
79
-
80
- # Iterates over the array's values.
81
- def each_value(&block)
82
- each(&block)
83
- end
84
-
85
- # Deletes a value by its key.
86
- def delete(key, *args)
87
- if (idx = @keys.key_pos(key))
88
- delete_at(idx)
89
- end
90
- end
91
-
92
- # Deletes a value by its index.
93
- def delete_at(idx)
94
- super(idx)
95
- @keys = @keys.clone
96
- @keys.del_key(idx)
97
- end
98
-
99
- # Returns true if the array's key set contains the given key.
100
- def include?(k)
101
- @keys.include?(k) || @keys.include?(k.to_sym) || @keys.include?(k.to_s)
102
- end
103
-
104
- # Returns true if the array's key set contains the given key.
105
- def has_key?(k)
106
- @keys.include?(k) || @keys.include?(k.to_sym) || @keys.include?(k.to_s)
107
- end
108
- alias_method :member?, :has_key?
109
- alias_method :key?, :has_key?
110
-
111
- # Returns true if the array contains the given value.
112
- def has_value?(k); orig_include?(k); end
113
- alias_method :value?, :has_value?
114
-
115
- # Fetches a value by its key and optionally passes it through the given
116
- # block:
117
- #
118
- # row.fetch(:name) {|v| v.to_sym}
119
- #
120
- # You can also give a default value
121
- #
122
- # row.fetch(:name, 'untitled')
123
- #
124
- def fetch(k, *args, &block)
125
- if idx = @keys.key_pos(k)
126
- v = at idx
127
- else
128
- !args.empty? ? (v = args.first) : (raise IndexError, "key not found")
129
- end
130
- block ? block[v] : v
131
- end
132
-
133
- # Returns self.
134
- def values
135
- self
136
- end
137
-
138
- # Creates a copy of self with the same key set.
139
- def dup
140
- copy = super
141
- copy.keys = @keys
142
- copy
143
- end
144
-
145
- # Creates a copy of self with a copy of the key set.
146
- def clone
147
- copy = super
148
- copy.keys = @keys.clone
149
- copy
150
- end
151
-
152
- # Returns an array merged from self and the given array.
153
- def merge(values, &block)
154
- clone.merge!(values, &block)
155
- end
156
-
157
- # Merges the given array with self, optionally passing the values from self
158
- # through the given block:
159
- #
160
- # row.merge!(new_values) {|k, old, new| (k == :name) ? old : new}
161
- #
162
- def merge!(values, &block)
163
- values.each_pair do |k, v|
164
- self[k] = (has_key?(k) && block) ? block[k, self[k], v] : v
165
- end
166
- self
167
- end
168
- alias_method :update, :merge!
169
- alias_method :update!, :merge!
170
- end
171
-
172
- # The ArrayExtensions module provides extensions for the Array class.
173
- module ArrayExtensions
174
- attr_reader :keys
175
-
176
- # Sets the key set for the array. Once a key set has been set for an array,
177
- # it is extended with the KeyAccess API
178
- def keys=(keys)
179
- extend ArrayKeys::KeyAccess if keys
180
- @keys = keys.frozen? ? keys.dup : keys
181
- unless @keys.respond_to?(:key_pos)
182
- @keys.extend(ArrayKeys::KeySet)
183
- end
184
- end
185
-
186
- alias_method :columns, :keys
187
- alias_method :columns=, :keys=
188
- end
189
-
190
- # The DatasetExtensions module provides extensions that modify
191
- # a dataset to return Array tuples instead of Hash tuples.
192
- module DatasetExtensions
193
- # Fetches a dataset's records, converting each tuple into an array with keys.
194
- def array_tuples_each(opts = nil, &block)
195
- fetch_rows(select_sql(opts)) {|h| block[Array.from_hash(h)]}
196
- end
197
-
198
- # Provides the corresponding behavior to Sequel::Dataset#update_each_method,
199
- # using array tuples.
200
- def array_tuples_update_each_method
201
- # warning: ugly code generation ahead
202
- if @row_proc && @transform
203
- class << self
204
- def each(opts = nil, &block)
205
- if opts && opts[:naked]
206
- fetch_rows(select_sql(opts)) {|r| block[transform_load(Array.from_hash(r))]}
207
- else
208
- fetch_rows(select_sql(opts)) {|r| block[@row_proc[transform_load(Array.from_hash(r))]]}
209
- end
210
- self
211
- end
212
- end
213
- elsif @row_proc
214
- class << self
215
- def each(opts = nil, &block)
216
- if opts && opts[:naked]
217
- fetch_rows(select_sql(opts)) {|r| block[Array.from_hash(r)]}
218
- else
219
- fetch_rows(select_sql(opts)) {|r| block[@row_proc[Array.from_hash(r)]]}
220
- end
221
- self
222
- end
223
- end
224
- elsif @transform
225
- class << self
226
- def each(opts = nil, &block)
227
- fetch_rows(select_sql(opts)) {|r| block[transform_load(Array.from_hash(r))]}
228
- self
229
- end
230
- end
231
- else
232
- class << self
233
- def each(opts = nil, &block)
234
- fetch_rows(select_sql(opts)) {|r| block[Array.from_hash(r)]}
235
- self
236
- end
237
- end
238
- end
239
- end
240
-
241
- def array_tuples_transform_load(r)
242
- puts "transform_load"
243
-
244
- a = []; a.keys = []
245
- r.each_pair do |k, v|
246
- a[k] = (tt = @transform[k]) ? tt[0][v] : v
247
- end
248
- a
249
- end
250
-
251
- # Applies the value transform for data saved to the database.
252
- def array_tuples_transform_save(r)
253
- a = []; a.keys = []
254
- r.each_pair do |k, v|
255
- a[k] = (tt = @transform[k]) ? tt[1][v] : v
256
- end
257
- a
258
- end
259
- end
260
- end
261
-
262
- # Array extensions.
263
- class Array
264
- alias_method :orig_include?, :include?
265
-
266
- include ArrayKeys::ArrayExtensions
267
-
268
- # Converts a hash into an array with keys.
269
- def self.from_hash(h)
270
- a = []; a.keys = []
271
- a.merge!(h)
272
- end
273
- end
274
-
275
- module Sequel
276
- # Modifies all dataset classes to fetch records as arrays with keys. By
277
- # default records are fetched as hashes.
278
- def self.use_array_tuples
279
- Dataset.dataset_classes.each do |c|
280
- c.class_eval do
281
- if method_defined?(:array_tuples_fetch_rows)
282
- alias_method :hash_tuples_fetch_rows, :fetch_rows
283
- alias_method :fetch_rows, :array_tuples_fetch_rows
284
- else
285
- alias_method :orig_each, :each
286
- alias_method :orig_update_each_method, :update_each_method
287
-
288
- include ArrayKeys::DatasetExtensions
289
- alias_method :each, :array_tuples_each
290
- alias_method :update_each_method, :array_tuples_update_each_method
291
- end
292
-
293
- if method_defined?(:array_tuples_transform_load)
294
- alias_method :transform_load, :array_tuples_transform_load
295
- end
296
- if method_defined?(:array_tuples_transform_save)
297
- alias_method :transform_save, :array_tuples_transform_save
298
- end
299
- end
300
- end
301
- end
302
-
303
- # Modifies all dataset classes to fetch records as hashes.
304
- def self.use_hash_tuples
305
- Dataset.dataset_classes.each do |c|
306
- c.class_eval do
307
- if method_defined?(:hash_tuples_fetch_rows)
308
- alias_method :fetch_rows, :hash_tuples_fetch_rows
309
- else
310
- if method_defined?(:orig_each)
311
- alias_method :each, :orig_each
312
- undef_method :orig_each
313
- end
314
- if method_defined?(:orig_update_each_method)
315
- alias_method :update_each_method, :orig_update_each_method
316
- undef_method :orig_update_each_method
317
- end
318
- end
319
- end
320
- end
321
- end
322
- end