sequel_core 1.0.2 → 1.0.3
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 +10 -0
- data/Rakefile +1 -1
- data/lib/sequel_core/adapters/mysql.rb +2 -2
- data/lib/sequel_core/adapters/postgres.rb +4 -0
- data/lib/sequel_core/core_sql.rb +9 -1
- data/lib/sequel_core/schema/schema_generator.rb +8 -0
- data/lib/sequel_core/schema/schema_sql.rb +16 -0
- data/spec/core_sql_spec.rb +10 -0
- data/spec/schema_generator_spec.rb +14 -2
- data/spec/schema_spec.rb +35 -0
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
=== 1.0.3 (2008-01-17)
|
2
|
+
|
3
|
+
* Added support for UNSIGNED constraint, used in MySQL? (#127).
|
4
|
+
|
5
|
+
* Implemented constraint definitions inside Database#create_table.
|
6
|
+
|
7
|
+
* Fixed postgres adapter to define PGconn#async_exec as alias to #exec if not defined (for pure-ruby postgres driver).
|
8
|
+
|
9
|
+
* Added String#to_date. Updated mysql adapter to use String#to_date for mysql date types (thanks drfreeze).
|
10
|
+
|
1
11
|
=== 1.0.2 (2008-01-14)
|
2
12
|
|
3
13
|
* Removed ConnectionPool, NumericExtensions. Added dependency on assistance.
|
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ include FileUtils
|
|
9
9
|
# Configuration
|
10
10
|
##############################################################################
|
11
11
|
NAME = "sequel_core"
|
12
|
-
VERS = "1.0.
|
12
|
+
VERS = "1.0.3"
|
13
13
|
CLEAN.include ["**/.*.sw?", "pkg/*", ".config", "doc/*", "coverage/*"]
|
14
14
|
RDOC_OPTS = [
|
15
15
|
"--quiet",
|
@@ -13,11 +13,11 @@ class Mysql::Result
|
|
13
13
|
7 => :to_time, # MYSQL_TYPE_TIMESTAMP
|
14
14
|
8 => :to_i, # MYSQL_TYPE_LONGLONG
|
15
15
|
9 => :to_i, # MYSQL_TYPE_INT24
|
16
|
-
10 => :
|
16
|
+
10 => :to_date, # MYSQL_TYPE_DATE
|
17
17
|
11 => :to_time, # MYSQL_TYPE_TIME
|
18
18
|
12 => :to_time, # MYSQL_TYPE_DATETIME
|
19
19
|
13 => :to_i, # MYSQL_TYPE_YEAR
|
20
|
-
14 => :
|
20
|
+
14 => :to_date, # MYSQL_TYPE_NEWDATE
|
21
21
|
# 15 => :to_s # MYSQL_TYPE_VARCHAR
|
22
22
|
# 16 => :to_s, # MYSQL_TYPE_BIT
|
23
23
|
246 => :to_d, # MYSQL_TYPE_NEWDECIMAL
|
data/lib/sequel_core/core_sql.rb
CHANGED
@@ -52,7 +52,15 @@ class String
|
|
52
52
|
rescue Exception => e
|
53
53
|
raise Sequel::Error::InvalidValue, "Invalid time value '#{self}' (#{e.message})"
|
54
54
|
end
|
55
|
-
|
55
|
+
end
|
56
|
+
|
57
|
+
# Converts a string into a Date object.
|
58
|
+
def to_date
|
59
|
+
begin
|
60
|
+
Date.parse(self)
|
61
|
+
rescue Exception => e
|
62
|
+
raise Sequel::Error::InvalidValue, "Invalid date value '#{self}' (#{e.message})"
|
63
|
+
end
|
56
64
|
end
|
57
65
|
end
|
58
66
|
|
@@ -40,6 +40,14 @@ module Sequel
|
|
40
40
|
index(name) if opts[:index]
|
41
41
|
end
|
42
42
|
|
43
|
+
def check(*args, &block)
|
44
|
+
@columns << {:name => nil, :type => :check, :check => block || args}
|
45
|
+
end
|
46
|
+
|
47
|
+
def constraint(name, *args, &block)
|
48
|
+
@columns << {:name => name, :type => :check, :check => block || args}
|
49
|
+
end
|
50
|
+
|
43
51
|
def has_column?(name)
|
44
52
|
@columns.each {|c| return true if c[:name] == name}
|
45
53
|
false
|
@@ -31,6 +31,7 @@ module Sequel
|
|
31
31
|
COMMA_SEPARATOR = ', '.freeze
|
32
32
|
UNIQUE = ' UNIQUE'.freeze
|
33
33
|
NOT_NULL = ' NOT NULL'.freeze
|
34
|
+
UNSIGNED = ' UNSIGNED'.freeze
|
34
35
|
PRIMARY_KEY = ' PRIMARY KEY'.freeze
|
35
36
|
|
36
37
|
TYPES = Hash.new {|h, k| k}
|
@@ -43,14 +44,22 @@ module Sequel
|
|
43
44
|
def literal(v)
|
44
45
|
schema_utility_dataset.literal(v)
|
45
46
|
end
|
47
|
+
|
48
|
+
def expression_list(*args, &block)
|
49
|
+
schema_utility_dataset.expression_list(*args, &block)
|
50
|
+
end
|
46
51
|
|
47
52
|
def column_definition_sql(column)
|
53
|
+
if column[:type] == :check
|
54
|
+
return constraint_definition_sql(column)
|
55
|
+
end
|
48
56
|
sql = "#{literal(column[:name].to_sym)} #{TYPES[column[:type]]}"
|
49
57
|
column[:size] ||= 255 if column[:type] == :varchar
|
50
58
|
elements = column[:size] || column[:elements]
|
51
59
|
sql << "(#{literal(elements)})" if elements
|
52
60
|
sql << UNIQUE if column[:unique]
|
53
61
|
sql << NOT_NULL if column[:null] == false
|
62
|
+
sql << UNSIGNED if column[:unsigned]
|
54
63
|
sql << " DEFAULT #{literal(column[:default])}" if column.include?(:default)
|
55
64
|
sql << PRIMARY_KEY if column[:primary_key]
|
56
65
|
if column[:table]
|
@@ -61,6 +70,13 @@ module Sequel
|
|
61
70
|
sql << " #{auto_increment_sql}" if column[:auto_increment]
|
62
71
|
sql
|
63
72
|
end
|
73
|
+
|
74
|
+
def constraint_definition_sql(column)
|
75
|
+
sql = column[:name] ? "CONSTRAINT #{literal(column[:name].to_sym)} " : ""
|
76
|
+
|
77
|
+
sql << "CHECK #{expression_list(column[:check], true)}"
|
78
|
+
sql
|
79
|
+
end
|
64
80
|
|
65
81
|
def column_list_sql(columns)
|
66
82
|
columns.map {|c| column_definition_sql(c)}.join(COMMA_SEPARATOR)
|
data/spec/core_sql_spec.rb
CHANGED
@@ -299,3 +299,13 @@ context "String#to_time" do
|
|
299
299
|
end
|
300
300
|
end
|
301
301
|
|
302
|
+
context "String#to_date" do
|
303
|
+
specify "should convert the string into a Date object" do
|
304
|
+
"2007-07-11".to_date.should == Date.parse("2007-07-11")
|
305
|
+
end
|
306
|
+
|
307
|
+
specify "should raise Error::InvalidValue for an invalid date" do
|
308
|
+
proc {'0000-00-00'.to_time}.should raise_error(Sequel::Error::InvalidValue)
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
@@ -7,6 +7,8 @@ describe Sequel::Schema::Generator do
|
|
7
7
|
column :body, :text
|
8
8
|
foreign_key :parent_id
|
9
9
|
primary_key :id
|
10
|
+
check 'price > 100'
|
11
|
+
constraint(:xxx) {:yyy == :zzz}
|
10
12
|
index :title
|
11
13
|
index [:title, :body]
|
12
14
|
end
|
@@ -19,8 +21,8 @@ describe Sequel::Schema::Generator do
|
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
22
|
-
it "counts primary key as
|
23
|
-
@columns.size.should ==
|
24
|
+
it "counts primary key, column and constraint definitions as columns" do
|
25
|
+
@columns.size.should == 6
|
24
26
|
end
|
25
27
|
|
26
28
|
it "places primary key first" do
|
@@ -52,6 +54,16 @@ describe Sequel::Schema::Generator do
|
|
52
54
|
@generator.has_column?(:foo).should_not be_true
|
53
55
|
end
|
54
56
|
|
57
|
+
it "creates constraints" do
|
58
|
+
@columns[4][:name].should == nil
|
59
|
+
@columns[4][:type].should == :check
|
60
|
+
@columns[4][:check].should == ['price > 100']
|
61
|
+
|
62
|
+
@columns[5][:name].should == :xxx
|
63
|
+
@columns[5][:type].should == :check
|
64
|
+
@columns[5][:check].should be_a_kind_of(Proc)
|
65
|
+
end
|
66
|
+
|
55
67
|
it "creates indexes" do
|
56
68
|
@indexes[0][:columns].should include(:title)
|
57
69
|
@indexes[1][:columns].should include(:title)
|
data/spec/schema_spec.rb
CHANGED
@@ -69,6 +69,13 @@ context "DB#create_table" do
|
|
69
69
|
@db.sqls.should == ["CREATE TABLE cats (id integer, name text UNIQUE)"]
|
70
70
|
end
|
71
71
|
|
72
|
+
specify "should accept unsigned definition" do
|
73
|
+
@db.create_table(:cats) do
|
74
|
+
integer :value, :unsigned => true
|
75
|
+
end
|
76
|
+
@db.sqls.should == ["CREATE TABLE cats (value integer UNSIGNED)"]
|
77
|
+
end
|
78
|
+
|
72
79
|
specify "should accept [SET|ENUM](...) types" do
|
73
80
|
@db.create_table(:cats) do
|
74
81
|
set :color, :elements => ['black', 'tricolor', 'grey']
|
@@ -205,6 +212,34 @@ context "DB#create_table" do
|
|
205
212
|
end
|
206
213
|
@db.sqls.should == ["CREATE TABLE cats (id integer)", "CREATE UNIQUE INDEX cats_id_name_index ON cats (id, name)"]
|
207
214
|
end
|
215
|
+
|
216
|
+
specify "should accept unnamed constraint definitions" do
|
217
|
+
@db.create_table(:cats) do
|
218
|
+
integer :score
|
219
|
+
check {:x > 0 && :y < 1}
|
220
|
+
end
|
221
|
+
@db.sqls.should == ["CREATE TABLE cats (score integer, CHECK (((x > 0) AND (y < 1))))"]
|
222
|
+
@db.sqls.clear
|
223
|
+
|
224
|
+
@db.create_table(:cats) do
|
225
|
+
check 'price < ?', 100
|
226
|
+
end
|
227
|
+
@db.sqls.should == ["CREATE TABLE cats (CHECK (price < 100))"]
|
228
|
+
end
|
229
|
+
|
230
|
+
specify "should accept named constraint definitions" do
|
231
|
+
@db.create_table(:cats) do
|
232
|
+
integer :score
|
233
|
+
constraint :valid_score, 'score <= 100'
|
234
|
+
end
|
235
|
+
@db.sqls.should == ["CREATE TABLE cats (score integer, CONSTRAINT valid_score CHECK (score <= 100))"]
|
236
|
+
@db.sqls.clear
|
237
|
+
|
238
|
+
@db.create_table(:cats) do
|
239
|
+
constraint(:blah_blah) {:x > 0 && :y < 1}
|
240
|
+
end
|
241
|
+
@db.sqls.should == ["CREATE TABLE cats (CONSTRAINT blah_blah CHECK (((x > 0) AND (y < 1))))"]
|
242
|
+
end
|
208
243
|
end
|
209
244
|
|
210
245
|
context "DB#create_table!" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.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: 2008-01-
|
12
|
+
date: 2008-01-17 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|