sequel 0.4.1.2 → 0.4.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,4 +1,14 @@
1
- == 0.4.1.2 (2007-12-04)
1
+ === SVN
2
+
3
+ * Better plugin conventions.
4
+
5
+ * Added experimental OpenBase adapter.
6
+
7
+ * Fixed Sequel.<xxx> methods to accept options hash as well as database name. Fixed Sequel.connect to accept options hash as well as URI (Wayne).
8
+
9
+ === 0.4.1.2 (2007-12-04)
10
+
11
+ * Added release rake task (using RubyForge).
2
12
 
3
13
  * Changed Model.is to accept variable arity.
4
14
 
data/COPYING CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2006 Sharon Rosner
1
+ Copyright (c) 2006-2007 Sharon Rosner
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to
data/README CHANGED
@@ -37,7 +37,7 @@ Sequel currently supports:
37
37
  * PostgreSQL
38
38
  * SQLite 3
39
39
 
40
- There is also an experimental adapter for DB2.
40
+ There are also experimental adapters for DB2 and OpenBase.
41
41
 
42
42
  == The Sequel Console
43
43
 
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'fileutils'
6
6
  include FileUtils
7
7
 
8
8
  NAME = "sequel"
9
- VERS = "0.4.1.2"
9
+ VERS = "0.4.1.3"
10
10
  CLEAN.include ['**/.*.sw?', 'pkg/*', '.config', 'doc/*', 'coverage/*']
11
11
  RDOC_OPTS = ['--quiet', '--title', "Sequel: Concise ORM for Ruby",
12
12
  "--opname", "index.html",
@@ -104,6 +104,13 @@ task :uninstall => [:clean] do
104
104
  sh %{sudo gem uninstall #{NAME}}
105
105
  end
106
106
 
107
+ task :release => [:package] do
108
+ sh %{rubyforge login}
109
+ sh %{rubyforge add_release sequel sequel #{VERS} pkg/sequel-#{VERS}.tgz}
110
+ sh %{rubyforge add_file sequel sequel #{VERS} pkg/sequel-#{VERS}.gem}
111
+ sh %{rubyforge add_file sequel sequel #{VERS} pkg/sequel-#{VERS}-x86-mswin32-60.gem}
112
+ end
113
+
107
114
  desc 'Update docs and upload to rubyforge.org'
108
115
  task :doc_rforge do
109
116
  sh %{rake doc}
data/lib/sequel.rb CHANGED
@@ -23,7 +23,6 @@ module Sequel #:nodoc:
23
23
  def connect(*args)
24
24
  Database.connect(*args)
25
25
  end
26
-
27
26
  alias_method :open, :connect
28
27
 
29
28
  def single_threaded=(value)
@@ -35,7 +34,7 @@ module Sequel #:nodoc:
35
34
  begin
36
35
  case args.size
37
36
  when 1: # Sequel.dbi(db_name)
38
- opts = {:database => args[0]}
37
+ opts = args[0].is_a?(Hash) ? args[0] : {:database => args[0]}
39
38
  when 0 # Sequel.dbi
40
39
  opts = {}
41
40
  else # Sequel.dbi(db_name, opts)
@@ -0,0 +1,93 @@
1
+ if !Object.const_defined?('Sequel')
2
+ require File.join(File.dirname(__FILE__), '../../sequel')
3
+ end
4
+
5
+ require 'openbase'
6
+
7
+ module Sequel
8
+ module OpenBase
9
+ class Database < Sequel::Database
10
+ set_adapter_scheme :openbase
11
+
12
+ def connect
13
+ OpenBase.new(
14
+ opts[:database],
15
+ opts[:host] || 'localhost',
16
+ opts[:user],
17
+ opts[:password]
18
+ )
19
+ end
20
+
21
+ def disconnect
22
+ # would this work?
23
+ @pool.disconnect {|c| c.disconnect}
24
+ end
25
+
26
+ def dataset(opts = nil)
27
+ OpenBase::Dataset.new(self, opts)
28
+ end
29
+
30
+ def execute(sql)
31
+ @logger.info(sql) if @logger
32
+ @pool.hold {|conn| conn.execute(sql)}
33
+ end
34
+
35
+ alias_method :do, :execute
36
+ end
37
+
38
+ class Dataset < Sequel::Dataset
39
+ def literal(v)
40
+ case v
41
+ when Time: literal(v.iso8601)
42
+ else
43
+ super
44
+ end
45
+ end
46
+
47
+ def fetch_rows(sql, &block)
48
+ @db.synchronize do
49
+ result = @db.execute sql
50
+ begin
51
+ @columns = result.column_infos.map {|c| c.name.to_sym}
52
+ result.each do |r|
53
+ row = {}
54
+ r.each_with_index {|v, i| row[@columns[i]] = v}
55
+ yield row
56
+ end
57
+ ensure
58
+ # result.close
59
+ end
60
+ end
61
+ self
62
+ end
63
+
64
+ def array_tuples_fetch_rows(sql, &block)
65
+ @db.synchronize do
66
+ result = @db.execute sql
67
+ begin
68
+ @columns = result.column_infos.map {|c| c.name.to_sym}
69
+ result.each do |r|
70
+ r.keys = @columns
71
+ yield r
72
+ end
73
+ ensure
74
+ # cursor.close
75
+ end
76
+ end
77
+ self
78
+ end
79
+
80
+ def insert(*values)
81
+ @db.do insert_sql(*values)
82
+ end
83
+
84
+ def update(values, opts = nil)
85
+ @db.do update_sql(values, opts)
86
+ end
87
+
88
+ def delete(opts = nil)
89
+ @db.do delete_sql(opts)
90
+ end
91
+ end
92
+ end
93
+ end
@@ -60,7 +60,7 @@ module Sequel
60
60
  @columns = cursor.get_col_names.map {|c| c.to_sym}
61
61
  while r = cursor.fetch
62
62
  row = {}
63
- r.each_with_index {|v, i| row[columns[i]] = v}
63
+ r.each_with_index {|v, i| row[@columns[i]] = v}
64
64
  yield row
65
65
  end
66
66
  ensure
@@ -70,13 +70,6 @@ module Sequel
70
70
  self
71
71
  end
72
72
 
73
- def hash_row(row)
74
- @columns.inject({}) do |m, c|
75
- m[c] = row.shift
76
- m
77
- end
78
- end
79
-
80
73
  def array_tuples_fetch_rows(sql, &block)
81
74
  @db.synchronize do
82
75
  cursor = @db.execute sql
@@ -268,19 +268,34 @@ module Sequel
268
268
 
269
269
  # call-seq:
270
270
  # Sequel::Database.connect(conn_string)
271
+ # Sequel::Database.connect(opts)
271
272
  # Sequel.connect(conn_string)
273
+ # Sequel.connect(opts)
272
274
  # Sequel.open(conn_string)
275
+ # Sequel.open(opts)
276
+ #
277
+ # Creates a new database object based on the supplied connection string
278
+ # and or options. If a URI is used, the URI scheme determines the database
279
+ # class used, and the rest of the string specifies the connection options.
280
+ # For example:
273
281
  #
274
- # Creates a new database object based on the supplied connection string.
275
- # The specified scheme determines the database class used, and the rest
276
- # of the string specifies the connection options. For example:
277
282
  # DB = Sequel.open 'sqlite:///blog.db'
278
- def self.connect(conn_string, more_opts = nil)
279
- uri = URI.parse(conn_string)
280
- scheme = uri.scheme
281
- scheme = :dbi if scheme =~ /^dbi-(.+)/
282
- c = adapter_class(scheme)
283
- c.new(c.uri_to_options(uri).merge(more_opts || {}))
283
+ #
284
+ # The second form of this method takes an options:
285
+ #
286
+ # DB = Sequel.open :adapter => :sqlite, :database => 'blog.db'
287
+ def self.connect(conn_string, opts = nil)
288
+ if conn_string.is_a?(String)
289
+ uri = URI.parse(conn_string)
290
+ scheme = uri.scheme
291
+ scheme = :dbi if scheme =~ /^dbi-(.+)/
292
+ c = adapter_class(scheme)
293
+ c.new(c.uri_to_options(uri).merge(opts || {}))
294
+ else
295
+ opts = conn_string.merge(opts || {})
296
+ c = adapter_class(opts[:adapter])
297
+ c.new(opts)
298
+ end
284
299
  end
285
300
 
286
301
  @@single_threaded = false
@@ -6,7 +6,22 @@ module Sequel
6
6
  # Loads a plugin for use with the model class, passing optional arguments
7
7
  # to the plugin.
8
8
  def is(plugin, *args)
9
- plugin_module(plugin).apply(self, *args)
9
+ m = plugin_module(plugin)
10
+ if m.respond_to?(:apply)
11
+ m.apply(self, *args)
12
+ end
13
+ if m.const_defined?("InstanceMethods")
14
+ class_def(:"#{plugin}_opts") {args.first}
15
+ include(m::InstanceMethods)
16
+ end
17
+ if m.const_defined?("ClassMethods")
18
+ meta_def(:"#{plugin}_opts") {args.first}
19
+ metaclass.send(:include, m::ClassMethods)
20
+ end
21
+ if m.const_defined?("DatasetMethods")
22
+ dataset.meta_def(:"#{plugin}_opts") {args.first}
23
+ dataset.metaclass.send(:include, m::DatasetMethods)
24
+ end
10
25
  end
11
26
  alias_method :is_a, :is
12
27
 
@@ -390,6 +390,16 @@ context "A Database adapter with a scheme" do
390
390
  c = Sequel.ccc
391
391
  c.should be_a_kind_of(CCC)
392
392
  c.opts.should == {}
393
+
394
+ c = Sequel.ccc(:database => 'mydb', :host => 'localhost')
395
+ c.should be_a_kind_of(CCC)
396
+ c.opts.should == {:database => 'mydb', :host => 'localhost'}
397
+ end
398
+
399
+ specify "should be accessible through Sequel.connect with options" do
400
+ c = Sequel.connect(:adapter => :ccc, :database => 'mydb')
401
+ c.should be_a_kind_of(CCC)
402
+ c.opts.should == {:adapter => :ccc, :database => 'mydb'}
393
403
  end
394
404
  end
395
405
 
data/spec/model_spec.rb CHANGED
@@ -1048,6 +1048,14 @@ module Sequel::Plugins
1048
1048
  m.meta_def(:stamp_opts) {opts}
1049
1049
  m.before_save {@values[:stamp] = Time.now}
1050
1050
  end
1051
+
1052
+ module InstanceMethods
1053
+ def abc; timestamped_opts; end
1054
+ end
1055
+
1056
+ module ClassMethods
1057
+ def deff; timestamped_opts; end
1058
+ end
1051
1059
  end
1052
1060
  end
1053
1061
 
@@ -1073,8 +1081,13 @@ context "A model using a plugin" do
1073
1081
 
1074
1082
  m = c.new
1075
1083
  m.should respond_to(:get_stamp)
1084
+ m.should respond_to(:abc)
1085
+ m.abc.should == {:a => 1, :b => 2}
1076
1086
  t = Time.now
1077
1087
  m[:stamp] = t
1078
1088
  m.get_stamp.should == t
1089
+
1090
+ c.should respond_to(:deff)
1091
+ c.deff.should == {:a => 1, :b => 2}
1079
1092
  end
1080
1093
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1.2
4
+ version: 0.4.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2007-12-04 00:00:00 +02:00
12
+ date: 2007-12-05 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -83,6 +83,7 @@ files:
83
83
  - lib/sequel/adapters/mysql.rb
84
84
  - lib/sequel/adapters/odbc.rb
85
85
  - lib/sequel/adapters/odbc_mssql.rb
86
+ - lib/sequel/adapters/openbase.rb
86
87
  - lib/sequel/adapters/oracle.rb
87
88
  - lib/sequel/adapters/postgres.rb
88
89
  - lib/sequel/adapters/sqlite.rb