sequel_migration_builder 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/VERSION +1 -1
- data/lib/sequel/schema/db_schema_parser.rb +10 -1
- data/sequel_migration_builder.gemspec +3 -3
- data/spec/alter_table_operations_spec.rb +18 -18
- data/spec/db_column_spec.rb +32 -33
- data/spec/db_index_spec.rb +22 -27
- data/spec/db_schema_parser_spec.rb +52 -26
- data/spec/migration_builder_spec.rb +25 -40
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NGRmODU3NzY1NDA1MGIyNjllMjE3ODA1ZjY0ZWIyNzE3MWRjMTdhZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NDFiMmJkZjlkNDA2YTVlMTdkODExYzY2NzQ3Yzg2ZDk4MWVmOWQxYQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MjNiZjk0NTA3MmUxYWYxMmIwZjY4MDcyNjgwYjBlY2Y1ZmNiMTI3ZDJhOTU5
|
10
|
+
M2RjZDI2MTc3MGU4ODVmNWQ5N2ZlYzEwMGY2NzIyODc1ZjViMDM2ZTI0MTVl
|
11
|
+
NGI0OWRiODQ0ZDEwYWM1NGY4NjhiMzg1MzJlMmU4NGQwYjlhY2I=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZTVlYzE0YTViNjNmNDg5MTY4ODNmOTVhYTI4ZGY1NWFlZDQxYzA1MGFjMzdj
|
14
|
+
YjU4YzgxOTU2ZjYxYTcwNDVjNGM0ZDZiZDdkNzAyMzg5NDI2NzNmNTMwNDY3
|
15
|
+
OWE0YWNiMDlhZWM4MmU2MzY0MTQ1MWI0NWFlNGFkYTM1N2NiYzM=
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.1
|
@@ -43,7 +43,7 @@ module Sequel
|
|
43
43
|
db_schema.map do |column|
|
44
44
|
type = parse_type(column.last[:db_type])
|
45
45
|
DbColumn.build_from_hash(:name => column.first,
|
46
|
-
:default => column
|
46
|
+
:default => extract_default(column),
|
47
47
|
:null => column.last[:allow_null],
|
48
48
|
:column_type => type,
|
49
49
|
:unsigned => extract_unsigned(column.last[:db_type], type),
|
@@ -73,12 +73,21 @@ module Sequel
|
|
73
73
|
case type
|
74
74
|
when /^int/ then :integer
|
75
75
|
when /^tinyint\(1\)/ then :boolean
|
76
|
+
when /^character varying/ then :varchar
|
77
|
+
when /^character/ then :char
|
78
|
+
when /^timestamp/ then :timestamp
|
79
|
+
when /^numeric\(\d+,\d+\)/ then :decimal
|
76
80
|
when /^([^(]+)/ then $1.to_sym
|
77
81
|
end
|
78
82
|
end
|
79
83
|
|
80
84
|
private
|
81
85
|
|
86
|
+
def extract_default(column)
|
87
|
+
default = column.last[:ruby_default] || column.last[:default]
|
88
|
+
default =~ /^"identity/ ? nil : default
|
89
|
+
end
|
90
|
+
|
82
91
|
def extract_unsigned(db_type_string, type)
|
83
92
|
return unless DbColumn::NUMERIC_TYPES.include?(type)
|
84
93
|
db_type_string.include?(" unsigned")
|
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: sequel_migration_builder 0.4.
|
5
|
+
# stub: sequel_migration_builder 0.4.1 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "sequel_migration_builder"
|
9
|
-
s.version = "0.4.
|
9
|
+
s.version = "0.4.1"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Roland Swingler"]
|
14
|
-
s.date = "2014-09-
|
14
|
+
s.date = "2014-09-02"
|
15
15
|
s.description = "Build Sequel Migrations based on the differences between two schemas"
|
16
16
|
s.email = "roland.swingler@gmail.com"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -13,7 +13,7 @@ describe "Sequel::Schema::AlterTableOperations#build_column_operations" do
|
|
13
13
|
a = build_column(:name => :foo, :column_type => :integer)
|
14
14
|
b = build_column(:name => :foo, :column_type => :integer)
|
15
15
|
|
16
|
-
@subject.build_column_operations(a,b).
|
16
|
+
expect(@subject.build_column_operations(a,b)).to eql([])
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should return a ChangeColumn operation if the types are different" do
|
@@ -21,7 +21,7 @@ describe "Sequel::Schema::AlterTableOperations#build_column_operations" do
|
|
21
21
|
b = build_column(:name => :foo, :column_type => :smallint)
|
22
22
|
ops = @subject.build_column_operations(a,b)
|
23
23
|
|
24
|
-
ops.first.
|
24
|
+
expect(ops.first).to eql("set_column_type :foo, :smallint, :default => nil")
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should return a ChangeColumn operation if the sizes are different" do
|
@@ -29,7 +29,7 @@ describe "Sequel::Schema::AlterTableOperations#build_column_operations" do
|
|
29
29
|
b = build_column(:name => :foo, :column_type => :char, :size => 10)
|
30
30
|
ops = @subject.build_column_operations(a,b)
|
31
31
|
|
32
|
-
ops.first.
|
32
|
+
expect(ops.first).to eql("set_column_type :foo, :char, :default => nil, :size => 10")
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should return a ChangeColumn operation if the unsigned value is different" do
|
@@ -37,7 +37,7 @@ describe "Sequel::Schema::AlterTableOperations#build_column_operations" do
|
|
37
37
|
b = build_column(:name => :foo, :column_type => :integer, :unsigned => false)
|
38
38
|
ops = @subject.build_column_operations(a,b)
|
39
39
|
|
40
|
-
ops.first.
|
40
|
+
expect(ops.first).to eql("set_column_type :foo, :integer, :default => nil, :unsigned => false")
|
41
41
|
end
|
42
42
|
|
43
43
|
it "should return a ChangeColumn operation to set the null value if the null value is different" do
|
@@ -45,7 +45,7 @@ describe "Sequel::Schema::AlterTableOperations#build_column_operations" do
|
|
45
45
|
b = build_column(:name => :foo, :column_type => :integer, :null => false)
|
46
46
|
ops = @subject.build_column_operations(a,b)
|
47
47
|
|
48
|
-
ops.first.
|
48
|
+
expect(ops.first).to eql("set_column_allow_null :foo, false")
|
49
49
|
end
|
50
50
|
|
51
51
|
it "should return a ChangeColumn operation to set the default if the default value is different" do
|
@@ -53,7 +53,7 @@ describe "Sequel::Schema::AlterTableOperations#build_column_operations" do
|
|
53
53
|
b = build_column(:name => :foo, :column_type => :integer, :default => 2)
|
54
54
|
ops = @subject.build_column_operations(a,b)
|
55
55
|
|
56
|
-
ops.first.
|
56
|
+
expect(ops.first).to eql("set_column_default :foo, 2")
|
57
57
|
end
|
58
58
|
|
59
59
|
it "should only return 1 operation if the default and other values are different" do
|
@@ -61,8 +61,8 @@ describe "Sequel::Schema::AlterTableOperations#build_column_operations" do
|
|
61
61
|
b = build_column(:name => :foo, :column_type => :smallint, :default => 2)
|
62
62
|
ops = @subject.build_column_operations(a,b)
|
63
63
|
|
64
|
-
ops.size.
|
65
|
-
ops.first.
|
64
|
+
expect(ops.size).to eql(1)
|
65
|
+
expect(ops.first).to eql("set_column_type :foo, :smallint, :default => 2")
|
66
66
|
end
|
67
67
|
|
68
68
|
it "should return a ChangeColumn operation if the elements are different" do
|
@@ -70,7 +70,7 @@ describe "Sequel::Schema::AlterTableOperations#build_column_operations" do
|
|
70
70
|
b = build_column(:name => :foo, :column_type => :enum, :elements => ["A", "B"])
|
71
71
|
ops = @subject.build_column_operations(a,b)
|
72
72
|
|
73
|
-
ops.first.
|
73
|
+
expect(ops.first).to eql("set_column_type :foo, :enum, :default => nil, :elements => [\"A\", \"B\"]")
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
@@ -82,7 +82,7 @@ describe "Sequel::Schema::AlterTableOperations.build" do
|
|
82
82
|
:columns => [build_column(:name => :foo, :column_type => :integer)]}
|
83
83
|
ops = Sequel::Schema::AlterTableOperations.build(table_a,table_b)
|
84
84
|
|
85
|
-
ops.
|
85
|
+
expect(ops).to eql([])
|
86
86
|
end
|
87
87
|
|
88
88
|
it "should return an add column operation if the column is new" do
|
@@ -92,8 +92,8 @@ describe "Sequel::Schema::AlterTableOperations.build" do
|
|
92
92
|
:columns => [build_column(:name => :foo, :column_type => :integer)]}
|
93
93
|
ops = Sequel::Schema::AlterTableOperations.build(table_a,table_b)
|
94
94
|
|
95
|
-
ops.size.
|
96
|
-
ops.first.
|
95
|
+
expect(ops.size).to eql(1)
|
96
|
+
expect(ops.first).to match(/add_column/)
|
97
97
|
end
|
98
98
|
|
99
99
|
it "should return a drop column operation if the column has been removed" do
|
@@ -103,8 +103,8 @@ describe "Sequel::Schema::AlterTableOperations.build" do
|
|
103
103
|
:columns => []}
|
104
104
|
ops = Sequel::Schema::AlterTableOperations.build(table_a,table_b)
|
105
105
|
|
106
|
-
ops.size.
|
107
|
-
ops.first.
|
106
|
+
expect(ops.size).to eql(1)
|
107
|
+
expect(ops.first).to match(/drop_column/)
|
108
108
|
end
|
109
109
|
|
110
110
|
it "should return a change column operation if columns are different" do
|
@@ -114,8 +114,8 @@ describe "Sequel::Schema::AlterTableOperations.build" do
|
|
114
114
|
:columns => [build_column(:name => :foo, :column_type => :smallint)]}
|
115
115
|
ops = Sequel::Schema::AlterTableOperations.build(table_a,table_b)
|
116
116
|
|
117
|
-
ops.size.
|
118
|
-
ops.first.
|
117
|
+
expect(ops.size).to eql(1)
|
118
|
+
expect(ops.first).to match(/set_column/)
|
119
119
|
end
|
120
120
|
|
121
121
|
it "should not output a drop index statement in #change if the index's column is also removed" do
|
@@ -125,7 +125,7 @@ describe "Sequel::Schema::AlterTableOperations.build" do
|
|
125
125
|
table_b = {:name => :example_table, :indexes => {}, :columns => []}
|
126
126
|
ops = Sequel::Schema::AlterTableOperations.build(table_a,table_b)
|
127
127
|
|
128
|
-
ops.last.
|
128
|
+
expect(ops.last).to be_nil
|
129
129
|
end
|
130
130
|
|
131
131
|
it "should not output an add_index statement if there is nothing to be done" do
|
@@ -135,6 +135,6 @@ describe "Sequel::Schema::AlterTableOperations.build" do
|
|
135
135
|
table_b = {:name => :example_table, :indexes => {:foo_idx => {:columns => [:foo]}}, :columns => []}
|
136
136
|
|
137
137
|
ops = Sequel::Schema::AlterTableOperations.build(table_a,table_b)
|
138
|
-
ops.
|
138
|
+
expect(ops).to eql([])
|
139
139
|
end
|
140
140
|
end
|
data/spec/db_column_spec.rb
CHANGED
@@ -7,115 +7,114 @@ describe Sequel::Schema::DbColumn do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should return a #define_statement" do
|
10
|
-
@column.define_statement.
|
10
|
+
expect(@column.define_statement).to eql("integer :foo, :null => false, :default => 10, :unsigned => true, :size => 10")
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should return a primary_key invocation if single_primary_key is set and the column is an integer" do
|
14
14
|
@column.single_primary_key = true
|
15
|
-
@column.define_statement.
|
15
|
+
expect(@column.define_statement).to eql("primary_key :foo, :type => :integer, :null => false, :default => 10, :unsigned => true, :size => 10")
|
16
16
|
end
|
17
17
|
|
18
18
|
it "should return a #drop_statement" do
|
19
|
-
@column.drop_statement.
|
19
|
+
expect(@column.drop_statement).to eql("drop_column :foo")
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should return an #add_statement" do
|
23
|
-
@column.add_statement.
|
23
|
+
expect(@column.add_statement).to eql("add_column :foo, :integer, :null => false, :default => 10, :unsigned => true, :size => 10")
|
24
24
|
end
|
25
25
|
|
26
26
|
it "should return a #change_null statement" do
|
27
|
-
@column.change_null_statement.
|
27
|
+
expect(@column.change_null_statement).to eql("set_column_allow_null :foo, false")
|
28
28
|
end
|
29
29
|
|
30
30
|
it "should return a #change_default statement" do
|
31
|
-
@column.change_default_statement.
|
31
|
+
expect(@column.change_default_statement).to eql("set_column_default :foo, 10")
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should return a #change_type statement" do
|
35
|
-
@column.change_type_statement.
|
35
|
+
expect(@column.change_type_statement).to eql("set_column_type :foo, :integer, :default => 10, :unsigned => true, :size => 10")
|
36
36
|
end
|
37
37
|
|
38
38
|
it "should be diffable with another DbColumn" do
|
39
39
|
other = Sequel::Schema::DbColumn.new(:foo, :smallint, false, 10, true, 10, nil)
|
40
|
-
@column.diff(other).
|
40
|
+
expect(@column.diff(other)).to eql([:column_type].to_set)
|
41
41
|
|
42
42
|
other = Sequel::Schema::DbColumn.new(:foo, :integer, true, 11, true, 10, nil)
|
43
|
-
@column.diff(other).
|
43
|
+
expect(@column.diff(other)).to eql([:null, :default].to_set)
|
44
44
|
end
|
45
45
|
|
46
46
|
it "should not consider allowing null being nil different from false" do
|
47
47
|
a = Sequel::Schema::DbColumn.new(:foo, :smallint, false, 10, true, 10, nil)
|
48
48
|
b = Sequel::Schema::DbColumn.new(:foo, :smallint, nil, 10, true, 10, nil)
|
49
|
-
a.diff(b).
|
50
|
-
b.diff(a).
|
49
|
+
expect(a.diff(b)).to be_empty
|
50
|
+
expect(b.diff(a)).to be_empty
|
51
51
|
end
|
52
52
|
|
53
53
|
it "should not consider size to be different if one of the sizes is nil" do
|
54
54
|
a = Sequel::Schema::DbColumn.new(:foo, :smallint, false, 10, true, 10, nil)
|
55
55
|
b = Sequel::Schema::DbColumn.new(:foo, :smallint, false, 10, true, nil, nil)
|
56
|
-
a.diff(b).
|
57
|
-
b.diff(a).
|
56
|
+
expect(a.diff(b)).to be_empty
|
57
|
+
expect(b.diff(a)).to be_empty
|
58
58
|
end
|
59
59
|
|
60
60
|
it "should not consider 0 to be different from null if the column does not allow nulls" do
|
61
61
|
a = Sequel::Schema::DbColumn.new(:foo, :smallint, false, 0, true, 10, nil)
|
62
62
|
b = Sequel::Schema::DbColumn.new(:foo, :smallint, false, nil, true, nil, nil)
|
63
|
-
a.diff(b).
|
64
|
-
b.diff(a).
|
63
|
+
expect(a.diff(b)).to be_empty
|
64
|
+
expect(b.diff(a)).to be_empty
|
65
65
|
end
|
66
66
|
|
67
67
|
it "should consider 0 to be different from null if the column does allow nulls" do
|
68
68
|
a = Sequel::Schema::DbColumn.new(:foo, :smallint, true, 0, true, 10, nil)
|
69
69
|
b = Sequel::Schema::DbColumn.new(:foo, :smallint, true, nil, true, nil, nil)
|
70
|
-
a.diff(b).
|
71
|
-
b.diff(a).
|
70
|
+
expect(a.diff(b)).to eql([:default].to_set)
|
71
|
+
expect(b.diff(a)).to eql([:default].to_set)
|
72
72
|
end
|
73
73
|
|
74
74
|
it "should consider 1 to be different from null" do
|
75
75
|
a = Sequel::Schema::DbColumn.new(:foo, :smallint, false, 1, true, 10, nil)
|
76
76
|
b = Sequel::Schema::DbColumn.new(:foo, :smallint, false, nil, true, nil, nil)
|
77
|
-
a.diff(b).
|
78
|
-
b.diff(a).
|
77
|
+
expect(a.diff(b)).to eql([:default].to_set)
|
78
|
+
expect(b.diff(a)).to eql([:default].to_set)
|
79
79
|
end
|
80
80
|
|
81
81
|
it "should not consider '' to be different from null if the column does not allow nulls" do
|
82
82
|
a = Sequel::Schema::DbColumn.new(:foo, :varchar, false, '', true, 10, nil)
|
83
83
|
b = Sequel::Schema::DbColumn.new(:foo, :varchar, false, nil, true, nil, nil)
|
84
|
-
a.diff(b).
|
85
|
-
b.diff(a).
|
84
|
+
expect(a.diff(b)).to be_empty
|
85
|
+
expect(b.diff(a)).to be_empty
|
86
86
|
end
|
87
87
|
|
88
88
|
it "should consider '' to be different from null if the column allows null" do
|
89
89
|
a = Sequel::Schema::DbColumn.new(:foo, :varchar, true, '', true, 10, nil)
|
90
90
|
b = Sequel::Schema::DbColumn.new(:foo, :varchar, true, nil, true, nil, nil)
|
91
|
-
a.diff(b).
|
92
|
-
b.diff(a).
|
91
|
+
expect(a.diff(b)).to eql([:default].to_set)
|
92
|
+
expect(b.diff(a)).to eql([:default].to_set)
|
93
93
|
end
|
94
94
|
|
95
95
|
it "should consider columns with different elements to be different" do
|
96
96
|
a = Sequel::Schema::DbColumn.new(:foo, :enum, true, nil, true, nil, ["A"])
|
97
97
|
b = Sequel::Schema::DbColumn.new(:foo, :enum, true, nil, true, nil, ["A", "B"])
|
98
|
-
a.diff(b).
|
99
|
-
b.diff(a).
|
98
|
+
expect(a.diff(b)).to eql([:elements].to_set)
|
99
|
+
expect(b.diff(a)).to eql([:elements].to_set)
|
100
100
|
end
|
101
101
|
|
102
102
|
it "should cast decimal defaults to the correct number" do
|
103
103
|
a = Sequel::Schema::DbColumn.new(:foo, :decimal, true, '0.00', true, [4,2], nil)
|
104
104
|
b = Sequel::Schema::DbColumn.new(:foo, :decimal, true, 0, true, [4,2], nil)
|
105
105
|
|
106
|
-
a.diff(b).
|
107
|
-
b.diff(a).
|
106
|
+
expect(a.diff(b)).to eql(Set.new)
|
107
|
+
expect(b.diff(a)).to eql(Set.new)
|
108
108
|
end
|
109
109
|
|
110
110
|
it "should output BigDecimal correctly in a #define_statement" do
|
111
|
-
Sequel::Schema::DbColumn.new(:foo, :decimal, false, '1.1', true, [4,2], nil).
|
112
|
-
define_statement.should == "decimal :foo, :null => false, :default => BigDecimal.new('1.1'), :unsigned => true, :size => [4, 2]"
|
111
|
+
expect(Sequel::Schema::DbColumn.new(:foo, :decimal, false, '1.1', true, [4,2], nil).define_statement).to eql("decimal :foo, :null => false, :default => BigDecimal.new('1.1'), :unsigned => true, :size => [4, 2]")
|
113
112
|
end
|
114
113
|
|
115
114
|
it "should be buildable from a Hash" do
|
116
|
-
Sequel::Schema::DbColumn.build_from_hash(:name => "foo",
|
117
|
-
:column_type => "integer").column_type.
|
118
|
-
Sequel::Schema::DbColumn.build_from_hash('name' => "foo",
|
119
|
-
'column_type' => "integer").name.
|
115
|
+
expect(Sequel::Schema::DbColumn.build_from_hash(:name => "foo",
|
116
|
+
:column_type => "integer").column_type).to eql("integer")
|
117
|
+
expect(Sequel::Schema::DbColumn.build_from_hash('name' => "foo",
|
118
|
+
'column_type' => "integer").name).to eql("foo")
|
120
119
|
end
|
121
120
|
end
|
data/spec/db_index_spec.rb
CHANGED
@@ -2,79 +2,74 @@ require File.dirname(__FILE__) + "/spec_helper"
|
|
2
2
|
|
3
3
|
describe Sequel::Schema::DbIndex do
|
4
4
|
it "should have a name" do
|
5
|
-
Sequel::Schema::DbIndex.new('foo_index', :foo).name.
|
5
|
+
expect(Sequel::Schema::DbIndex.new('foo_index', :foo).name).to eql(:foo_index)
|
6
6
|
end
|
7
7
|
|
8
8
|
it "can have columns" do
|
9
|
-
Sequel::Schema::DbIndex.new('foo_index', [:foo, :bar]).columns.
|
9
|
+
expect(Sequel::Schema::DbIndex.new('foo_index', [:foo, :bar]).columns).to eql([:foo, :bar])
|
10
10
|
end
|
11
11
|
|
12
12
|
it "converts a single column symbol to a 1 element array of columns" do
|
13
|
-
Sequel::Schema::DbIndex.new('foo_index', :foo).columns.
|
13
|
+
expect(Sequel::Schema::DbIndex.new('foo_index', :foo).columns).to eql([:foo])
|
14
14
|
end
|
15
15
|
|
16
16
|
it "is not unique by default" do
|
17
|
-
Sequel::Schema::DbIndex.new('foo_index', :foo).
|
17
|
+
expect(Sequel::Schema::DbIndex.new('foo_index', :foo)).not_to be_unique
|
18
18
|
end
|
19
19
|
|
20
20
|
it "can be unique" do
|
21
|
-
Sequel::Schema::DbIndex.new('foo_index', :foo, true).
|
21
|
+
expect(Sequel::Schema::DbIndex.new('foo_index', :foo, true)).to be_unique
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should respond to multi_column?" do
|
25
|
-
Sequel::Schema::DbIndex.new('foo_index', :foo, true).
|
26
|
-
Sequel::Schema::DbIndex.new('foo_index', [:foo, :bar], true).
|
25
|
+
expect(Sequel::Schema::DbIndex.new('foo_index', :foo, true)).not_to be_multi_column
|
26
|
+
expect(Sequel::Schema::DbIndex.new('foo_index', [:foo, :bar], true)).to be_multi_column
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should be equal when compared with ==" do
|
30
30
|
i1 = Sequel::Schema::DbIndex.new('foo_idx', :foo, true)
|
31
31
|
|
32
|
-
i1.
|
33
|
-
i1.
|
34
|
-
i1.
|
35
|
-
i1.
|
36
|
-
i1.
|
32
|
+
expect(i1).to eql(Sequel::Schema::DbIndex.new('foo_idx', :foo, true))
|
33
|
+
expect(i1).to eql(Sequel::Schema::DbIndex.new('foo_idx', [:foo], true))
|
34
|
+
expect(i1).to_not eql(Sequel::Schema::DbIndex.new('foo_idx', :foo, false))
|
35
|
+
expect(i1).to_not eql(Sequel::Schema::DbIndex.new('foo', :foo, true))
|
36
|
+
expect(i1).to_not eql(Sequel::Schema::DbIndex.new('foo_idx', :bar, true))
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should be equal when compared with eql?" do
|
40
40
|
i1 = Sequel::Schema::DbIndex.new('foo_idx', :foo, true)
|
41
41
|
|
42
|
-
i1.hash.
|
43
|
-
i1.
|
42
|
+
expect(i1.hash).to eql(Sequel::Schema::DbIndex.new('foo_idx', :foo, true).hash)
|
43
|
+
expect(i1).to be_eql(Sequel::Schema::DbIndex.new('foo_idx', :foo, true))
|
44
44
|
end
|
45
45
|
|
46
46
|
it "should ensure nil as unique is converted to false" do
|
47
|
-
([Sequel::Schema::DbIndex.new(:foo_idx, :foo, :unique => nil)] - [Sequel::Schema::DbIndex.new(:foo_idx, :foo, :unique => false)]).
|
47
|
+
expect(([Sequel::Schema::DbIndex.new(:foo_idx, :foo, :unique => nil)] - [Sequel::Schema::DbIndex.new(:foo_idx, :foo, :unique => false)])).to eql([])
|
48
48
|
end
|
49
49
|
|
50
50
|
it "can be built from a hash returned by Sequel::Database#indexes" do
|
51
51
|
hsh = {:foo_idx => {:columns => [:foo], :unique => true}}
|
52
|
-
Sequel::Schema::DbIndex.build_from_hash(hsh).
|
53
|
-
[Sequel::Schema::DbIndex.new(:foo_idx, :foo, true)]
|
52
|
+
expect(Sequel::Schema::DbIndex.build_from_hash(hsh)).
|
53
|
+
to eql([Sequel::Schema::DbIndex.new(:foo_idx, :foo, true)])
|
54
54
|
end
|
55
55
|
|
56
56
|
it "should have a define statement" do
|
57
|
-
Sequel::Schema::DbIndex.new(:foo_idx, :foo, true).define_statement.
|
58
|
-
"index :foo, :name => :foo_idx, :unique => true"
|
57
|
+
expect(Sequel::Schema::DbIndex.new(:foo_idx, :foo, true).define_statement).to eql("index :foo, :name => :foo_idx, :unique => true")
|
59
58
|
end
|
60
59
|
|
61
60
|
it "should have a define statement for multiple columns" do
|
62
|
-
Sequel::Schema::DbIndex.new(:foo_idx, [:foo, :bar], true).define_statement.
|
63
|
-
"index [:foo, :bar], :name => :foo_idx, :unique => true"
|
61
|
+
expect(Sequel::Schema::DbIndex.new(:foo_idx, [:foo, :bar], true).define_statement).to eql("index [:foo, :bar], :name => :foo_idx, :unique => true")
|
64
62
|
end
|
65
63
|
|
66
64
|
it "should not output the unique value if it is false" do
|
67
|
-
Sequel::Schema::DbIndex.new(:foo_idx, :foo).define_statement.
|
68
|
-
"index :foo, :name => :foo_idx"
|
65
|
+
expect(Sequel::Schema::DbIndex.new(:foo_idx, :foo).define_statement).to eql("index :foo, :name => :foo_idx")
|
69
66
|
end
|
70
67
|
|
71
68
|
it "should have an add_index statement" do
|
72
|
-
Sequel::Schema::DbIndex.new(:foo_idx, :foo, true).add_statement.
|
73
|
-
"add_index :foo, :name => :foo_idx, :unique => true"
|
69
|
+
expect(Sequel::Schema::DbIndex.new(:foo_idx, :foo, true).add_statement).to eql("add_index :foo, :name => :foo_idx, :unique => true")
|
74
70
|
end
|
75
71
|
|
76
72
|
it "should have an drop_index statement" do
|
77
|
-
Sequel::Schema::DbIndex.new(:foo_idx, :foo, true).drop_statement.
|
78
|
-
"drop_index :foo, :name => :foo_idx"
|
73
|
+
expect(Sequel::Schema::DbIndex.new(:foo_idx, :foo, true).drop_statement).to eql("drop_index :foo, :name => :foo_idx")
|
79
74
|
end
|
80
75
|
end
|
@@ -2,8 +2,8 @@ require File.dirname(__FILE__) + "/spec_helper"
|
|
2
2
|
|
3
3
|
describe "Sequel::Schema::DbSchemaParser.for_db" do
|
4
4
|
it "should return a DbSchemaParser" do
|
5
|
-
Sequel::Schema::DbSchemaParser.for_db(double(:database)).
|
6
|
-
be_kind_of(Sequel::Schema::DbSchemaParser)
|
5
|
+
expect(Sequel::Schema::DbSchemaParser.for_db(double(:database))).
|
6
|
+
to be_kind_of(Sequel::Schema::DbSchemaParser)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
@@ -20,70 +20,80 @@ describe "A hash in the array returned by Sequel::Schema::DbSchemaParser#parse_t
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should contain the :name of the column" do
|
23
|
-
@parser.parse_table_schema(@schema).first.name.
|
23
|
+
expect(@parser.parse_table_schema(@schema).first.name).to eql(:example_column)
|
24
24
|
end
|
25
25
|
|
26
26
|
it "should contain the ruby_default as the :default" do
|
27
|
-
@parser.parse_table_schema(@schema).first.default.
|
27
|
+
expect(@parser.parse_table_schema(@schema).first.default).to eql(1)
|
28
28
|
end
|
29
29
|
|
30
30
|
it "should contain whether the column can be :null" do
|
31
|
-
@parser.parse_table_schema(@schema).first.null.
|
31
|
+
expect(@parser.parse_table_schema(@schema).first.null).to eql(true)
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should contain a type of :integer given a int column" do
|
35
35
|
set_db_type "int(11)"
|
36
|
-
@parser.parse_table_schema(@schema).first.column_type.
|
36
|
+
expect(@parser.parse_table_schema(@schema).first.column_type).to eql(:integer)
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should contain a type of :boolean given a tinyint(1) column" do
|
40
40
|
set_db_type "tinyint(1)"
|
41
|
-
@parser.parse_table_schema(@schema).first.column_type.
|
41
|
+
expect(@parser.parse_table_schema(@schema).first.column_type).to eql(:boolean)
|
42
42
|
end
|
43
43
|
|
44
44
|
it "should contain a type of :tinyint given a tinyint column" do
|
45
45
|
set_db_type "tinyint(4)"
|
46
|
-
@parser.parse_table_schema(@schema).first.column_type.
|
46
|
+
expect(@parser.parse_table_schema(@schema).first.column_type).to eql(:tinyint)
|
47
47
|
end
|
48
48
|
|
49
49
|
it "should contain a type of :smallint given a smallint column" do
|
50
50
|
set_db_type "smallint(5)"
|
51
|
-
@parser.parse_table_schema(@schema).first.column_type.
|
51
|
+
expect(@parser.parse_table_schema(@schema).first.column_type).to eql(:smallint)
|
52
52
|
end
|
53
53
|
|
54
54
|
it "should contain a type of :mediumint given a mediumint column" do
|
55
55
|
set_db_type "mediumint(5)"
|
56
|
-
@parser.parse_table_schema(@schema).first.column_type.
|
56
|
+
expect(@parser.parse_table_schema(@schema).first.column_type).to eql(:mediumint)
|
57
57
|
end
|
58
58
|
|
59
59
|
it "should contain a type of :bigint given a bigint column" do
|
60
60
|
set_db_type "bigint(10)"
|
61
|
-
@parser.parse_table_schema(@schema).first.column_type.
|
61
|
+
expect(@parser.parse_table_schema(@schema).first.column_type).to eql(:bigint)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should contain a type of :decimal given a numeric(x,y) column" do
|
65
|
+
set_db_type "numeric(3,4)"
|
66
|
+
expect(@parser.parse_table_schema(@schema).first.column_type).to eql(:decimal)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should contain a type of :char given a character column" do
|
70
|
+
set_db_type "character(3)"
|
71
|
+
expect(@parser.parse_table_schema(@schema).first.column_type).to eql(:char)
|
62
72
|
end
|
63
73
|
|
64
74
|
it "should contain a :size attribute for text-like columns" do
|
65
75
|
set_db_type "varchar(20)", :string
|
66
|
-
@parser.parse_table_schema(@schema).first.size.
|
76
|
+
expect(@parser.parse_table_schema(@schema).first.size).to eql(20)
|
67
77
|
end
|
68
78
|
|
69
79
|
it "should contain a :size attribute for decimal columns" do
|
70
80
|
set_db_type "decimal(14,5)"
|
71
|
-
@parser.parse_table_schema(@schema).first.size.
|
81
|
+
expect(@parser.parse_table_schema(@schema).first.size).to eql([14,5])
|
72
82
|
end
|
73
83
|
|
74
84
|
it "should contain a :size attribute for binary columns" do
|
75
85
|
set_db_type "binary(16)", :blob
|
76
|
-
@parser.parse_table_schema(@schema).first.size.
|
86
|
+
expect(@parser.parse_table_schema(@schema).first.size).to eql(16)
|
77
87
|
end
|
78
88
|
|
79
89
|
it "should contain :unsigned false if a numeric column is not unsigned" do
|
80
90
|
set_db_type "int(10)"
|
81
|
-
@parser.parse_table_schema(@schema).first.unsigned.
|
91
|
+
expect(@parser.parse_table_schema(@schema).first.unsigned).to eql(false)
|
82
92
|
end
|
83
93
|
|
84
94
|
it "should contain :unsigned true if an integer column is unsigned" do
|
85
95
|
set_db_type "int(10) unsigned"
|
86
|
-
@parser.parse_table_schema(@schema).first.unsigned.
|
96
|
+
expect(@parser.parse_table_schema(@schema).first.unsigned).to eql(true)
|
87
97
|
end
|
88
98
|
|
89
99
|
it "should contain :unsigned true if a decimal column is unsigned" do
|
@@ -95,19 +105,35 @@ describe "A hash in the array returned by Sequel::Schema::DbSchemaParser#parse_t
|
|
95
105
|
:db_type => "decimal(10,2) unsigned",
|
96
106
|
:allow_null => true }]]
|
97
107
|
|
98
|
-
@parser.parse_table_schema(@schema).first.unsigned.
|
108
|
+
expect(@parser.parse_table_schema(@schema).first.unsigned).to eql(true)
|
99
109
|
end
|
100
110
|
|
101
111
|
it "should not contain an :unsigned value if not a numeric column" do
|
102
112
|
set_db_type "varchar(10)", :string
|
103
|
-
@parser.parse_table_schema(@schema).first.unsigned.
|
113
|
+
expect(@parser.parse_table_schema(@schema).first.unsigned).to eql(nil)
|
104
114
|
end
|
105
115
|
|
106
116
|
it "should contain the elements of an enum column" do
|
107
117
|
set_db_type "enum('foo','bar')"
|
108
|
-
@parser.parse_table_schema(@schema).first.elements.
|
118
|
+
expect(@parser.parse_table_schema(@schema).first.elements).to eql(['foo', 'bar'])
|
109
119
|
end
|
110
120
|
|
121
|
+
it "should be a varchar if the the db type is character varying" do
|
122
|
+
set_db_type "character varying"
|
123
|
+
expect(@parser.parse_table_schema(@schema).first.column_type).to eql(:varchar)
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should be a timestamp if the the db type is a timestamp without time zone" do
|
127
|
+
set_db_type "timestamp without time zone"
|
128
|
+
expect(@parser.parse_table_schema(@schema).first.column_type).to eql(:timestamp)
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should not have a default for postgres identity columns" do
|
132
|
+
@schema.first.last.merge!(:default => "\"identity\"(123,0)",
|
133
|
+
:ruby_default => nil)
|
134
|
+
expect(@parser.parse_table_schema(@schema).first.default).to be_nil
|
135
|
+
end
|
136
|
+
|
111
137
|
def set_db_type(type, ruby_type=nil)
|
112
138
|
@schema.first.last.merge!(:db_type => type)
|
113
139
|
@schema.first.last.merge!(:type => ruby_type) if ruby_type
|
@@ -117,12 +143,12 @@ end
|
|
117
143
|
describe "Sequel::Schema::DbSchemaParser#parse_db_schema" do
|
118
144
|
it "should extract a list of table definitions from a database" do
|
119
145
|
mock_db = double(:db)
|
120
|
-
mock_db.
|
121
|
-
mock_db.
|
122
|
-
mock_db.
|
146
|
+
expect(mock_db).to receive(:tables).at_least(:once).and_return([:table1])
|
147
|
+
expect(mock_db).to receive(:schema).with(:table1).and_return([])
|
148
|
+
expect(mock_db).to receive(:indexes).with(:table1, :partial => true)
|
123
149
|
|
124
150
|
@parser = Sequel::Schema::DbSchemaParser.for_db(mock_db)
|
125
|
-
@parser.parse_db_schema.keys.
|
151
|
+
expect(@parser.parse_db_schema.keys).to eql([:table1])
|
126
152
|
end
|
127
153
|
end
|
128
154
|
|
@@ -139,7 +165,7 @@ describe "Parsing a text column" do
|
|
139
165
|
:db_type => "text",
|
140
166
|
:allow_null => true }]]
|
141
167
|
|
142
|
-
|
168
|
+
expect { parser.parse_table_schema(schema) }.not_to raise_error
|
143
169
|
end
|
144
170
|
end
|
145
171
|
|
@@ -154,7 +180,7 @@ describe "Parsing an enum column" do
|
|
154
180
|
:db_type => "enum('foo (bar)', 'baz')",
|
155
181
|
:allow_null => true }]]
|
156
182
|
|
157
|
-
|
183
|
+
expect { parser.parse_table_schema(schema) }.not_to raise_error
|
158
184
|
end
|
159
185
|
|
160
186
|
it "should correctly parse elements with escaped '' in them" do
|
@@ -168,6 +194,6 @@ describe "Parsing an enum column" do
|
|
168
194
|
:allow_null => true }]]
|
169
195
|
|
170
196
|
|
171
|
-
parser.parse_table_schema(schema).first.elements.
|
197
|
+
expect(parser.parse_table_schema(schema).first.elements).to eql(["don't"])
|
172
198
|
end
|
173
199
|
end
|
@@ -4,8 +4,8 @@ describe Sequel::MigrationBuilder do
|
|
4
4
|
|
5
5
|
it "should return nil if the table hash is empty and the database has no tables" do
|
6
6
|
mock_db = double(:database)
|
7
|
-
mock_db.
|
8
|
-
Sequel::MigrationBuilder.new(mock_db).generate_migration({}).
|
7
|
+
expect(mock_db).to receive(:tables).at_least(:once).and_return([])
|
8
|
+
expect(Sequel::MigrationBuilder.new(mock_db).generate_migration({})).to be_nil
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should produce a simple migration string given a database connection and a hash of tables" do
|
@@ -25,8 +25,8 @@ end
|
|
25
25
|
END
|
26
26
|
|
27
27
|
mock_db = double(:database)
|
28
|
-
mock_db.
|
29
|
-
Sequel::MigrationBuilder.new(mock_db).generate_migration(tables).
|
28
|
+
expect(mock_db).to receive(:tables).at_least(:once).and_return([])
|
29
|
+
expect(Sequel::MigrationBuilder.new(mock_db).generate_migration(tables)).to eql(expected)
|
30
30
|
end
|
31
31
|
|
32
32
|
it "should produce statements for multiple new tables" do
|
@@ -55,13 +55,13 @@ end
|
|
55
55
|
END
|
56
56
|
|
57
57
|
mock_db = double(:database)
|
58
|
-
mock_db.
|
59
|
-
Sequel::MigrationBuilder.new(mock_db).generate_migration(tables).
|
58
|
+
expect(mock_db).to receive(:tables).at_least(:once).and_return([])
|
59
|
+
expect(Sequel::MigrationBuilder.new(mock_db).generate_migration(tables)).to eql(expected)
|
60
60
|
end
|
61
61
|
|
62
62
|
it "should add the primary key of the table" do
|
63
63
|
mock_db = double(:database)
|
64
|
-
mock_db.
|
64
|
+
expect(mock_db).to receive(:tables).at_least(:once).and_return([])
|
65
65
|
table = {
|
66
66
|
:primary_key => :foo,
|
67
67
|
:columns => [{:name => :foo, :column_type => :integer}, {:name => :bar, :column_type => :varchar}]
|
@@ -74,13 +74,12 @@ create_table :example_table do
|
|
74
74
|
end
|
75
75
|
END
|
76
76
|
|
77
|
-
Sequel::MigrationBuilder.new(mock_db).create_table_statement(:example_table, table).join("\n").
|
78
|
-
should == expected.strip
|
77
|
+
expect(Sequel::MigrationBuilder.new(mock_db).create_table_statement(:example_table, table).join("\n")).to eql(expected.strip)
|
79
78
|
end
|
80
79
|
|
81
80
|
it "should add the non-integer primary key of the table" do
|
82
81
|
mock_db = double(:database)
|
83
|
-
mock_db.
|
82
|
+
expect(mock_db).to receive(:tables).at_least(:once).and_return([])
|
84
83
|
table = {
|
85
84
|
:primary_key => :foo,
|
86
85
|
:columns => [{:name => :foo, :column_type => :binary}, {:name => :bar, :column_type => :varchar}]
|
@@ -95,13 +94,12 @@ create_table :example_table do
|
|
95
94
|
end
|
96
95
|
END
|
97
96
|
|
98
|
-
Sequel::MigrationBuilder.new(mock_db).create_table_statement(:example_table, table).join("\n").
|
99
|
-
should == expected.strip
|
97
|
+
expect(Sequel::MigrationBuilder.new(mock_db).create_table_statement(:example_table, table).join("\n")).to eql(expected.strip)
|
100
98
|
end
|
101
99
|
|
102
100
|
it "should add the table options do the create_table statement" do
|
103
101
|
mock_db = double(:database)
|
104
|
-
mock_db.
|
102
|
+
expect(mock_db).to receive(:tables).at_least(:once).and_return([])
|
105
103
|
table = {
|
106
104
|
:table_options => {:engine => "myisam"},
|
107
105
|
:columns => [{:name => :foo, :column_type => :integer}]
|
@@ -113,13 +111,12 @@ create_table :example_table, :engine => "myisam" do
|
|
113
111
|
end
|
114
112
|
END
|
115
113
|
|
116
|
-
Sequel::MigrationBuilder.new(mock_db).create_table_statement(:example_table, table).join("\n").
|
117
|
-
should == expected.strip
|
114
|
+
expect(Sequel::MigrationBuilder.new(mock_db).create_table_statement(:example_table, table).join("\n")).to eql(expected.strip)
|
118
115
|
end
|
119
116
|
|
120
117
|
it "should add indexes to the create_table statement" do
|
121
118
|
mock_db = double(:database)
|
122
|
-
mock_db.
|
119
|
+
expect(mock_db).to receive(:tables).at_least(:once).and_return([])
|
123
120
|
table = {
|
124
121
|
:indexes => {:foo_index => {:columns => :foo, :unique => true}},
|
125
122
|
:columns => [{:name => :foo, :column_type => :integer}]
|
@@ -133,8 +130,12 @@ create_table :example_table do
|
|
133
130
|
end
|
134
131
|
END
|
135
132
|
|
136
|
-
Sequel::MigrationBuilder.
|
137
|
-
|
133
|
+
result = Sequel::MigrationBuilder.
|
134
|
+
new(mock_db).
|
135
|
+
create_table_statement(:example_table, table).
|
136
|
+
join("\n")
|
137
|
+
|
138
|
+
expect(result).to eql(expected.strip)
|
138
139
|
end
|
139
140
|
|
140
141
|
context "when a table needs to be altered" do
|
@@ -144,9 +145,9 @@ END
|
|
144
145
|
:columns => [{:name => :foo, :column_type => :integer}, {:name => :bar, :column_type => :varchar}]}
|
145
146
|
}
|
146
147
|
@mock_db = double(:database)
|
147
|
-
@mock_db.
|
148
|
-
@mock_db.
|
149
|
-
@mock_db.
|
148
|
+
expect(@mock_db).to receive(:tables).at_least(:once).and_return([:example_table])
|
149
|
+
expect(@mock_db).to receive(:indexes).with(:example_table, :partial => true).and_return({})
|
150
|
+
expect(@mock_db).to receive(:schema).with(:example_table).and_return([[:foo, {:type => :integer, :db_type => "smallint(5) unsigned", :allow_null => true, :ruby_default => 10}]])
|
150
151
|
|
151
152
|
end
|
152
153
|
|
@@ -161,8 +162,7 @@ change do
|
|
161
162
|
end
|
162
163
|
end
|
163
164
|
END
|
164
|
-
Sequel::MigrationBuilder.new(@mock_db).
|
165
|
-
generate_migration_body(@tables).join("\n").should == expected.strip
|
165
|
+
expect(Sequel::MigrationBuilder.new(@mock_db).generate_migration_body(@tables).join("\n")).to eql(expected.strip)
|
166
166
|
end
|
167
167
|
|
168
168
|
it "should return separate alter table statements when option is set" do
|
@@ -185,8 +185,7 @@ change do
|
|
185
185
|
end
|
186
186
|
end
|
187
187
|
END
|
188
|
-
Sequel::MigrationBuilder.new(@mock_db, :separate_alter_table_statements => true).
|
189
|
-
generate_migration_body(@tables).join("\n").should == expected.strip
|
188
|
+
expect(Sequel::MigrationBuilder.new(@mock_db, :separate_alter_table_statements => true).generate_migration_body(@tables).join("\n")).to eql(expected.strip)
|
190
189
|
end
|
191
190
|
|
192
191
|
it "should drop and add columns instead of changing them if immutable_columns is set" do
|
@@ -206,21 +205,7 @@ change do
|
|
206
205
|
end
|
207
206
|
end
|
208
207
|
END
|
209
|
-
Sequel::MigrationBuilder.new(@mock_db, :separate_alter_table_statements => true, :immutable_columns => true).
|
210
|
-
generate_migration_body(tables).join("\n").should == expected.strip
|
208
|
+
expect(Sequel::MigrationBuilder.new(@mock_db, :separate_alter_table_statements => true, :immutable_columns => true).generate_migration_body(tables).join("\n")).to eql(expected.strip)
|
211
209
|
end
|
212
210
|
end
|
213
|
-
|
214
|
-
it "should drop the table if the table exists in the database but not the table hash" do
|
215
|
-
pending # Deal with in a later version.
|
216
|
-
mock_db = double(:database)
|
217
|
-
mock_db.should_receive(:tables).at_least(:once).and_return([:example_table])
|
218
|
-
|
219
|
-
expected = <<-END
|
220
|
-
change do
|
221
|
-
drop_table :example_table
|
222
|
-
end
|
223
|
-
END
|
224
|
-
Sequel::MigrationBuilder.new(mock_db).generate_up({}).join("\n").should == expected
|
225
|
-
end
|
226
211
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel_migration_builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roland Swingler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|