scheman 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +5 -3
- data/lib/scheman/diff.rb +5 -3
- data/lib/scheman/parsers/mysql.rb +85 -6
- data/lib/scheman/schema.rb +1 -1
- data/lib/scheman/version.rb +1 -1
- data/lib/scheman/views/mysql.rb +17 -0
- data/spec/scheman/diff_spec.rb +5 -3
- data/spec/scheman/parsers/mysql_spec.rb +108 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13a488256dda03bd9e7c75477ab532b805ba3491
|
4
|
+
data.tar.gz: c4f69982678f0427156d0d127f7fcdc0eaa9f5d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c2b41f51bf2f871e20e045c4f4828f292cdf288e4c5f2c8f4697b7a34950d16f05c9529d2f72ba8808f2afca3c3949c5b4b92fa254c4ddb3fb9da2d68d5f9cf
|
7
|
+
data.tar.gz: 474496316452b1eb06fd78ff64cdd445dac31c75138d8beb9683c3b107cabfd4849d3a35052959575f51571e7138786c9b87d0ed228f62b24a29cd0c3b02e574
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -9,7 +9,8 @@ require "scheman"
|
|
9
9
|
|
10
10
|
before = <<-SQL
|
11
11
|
CREATE TABLE `table1` (
|
12
|
-
`column1` INTEGER(11) PRIMARY KEY NOT NULL AUTO INCREMENT
|
12
|
+
`column1` INTEGER(11) PRIMARY KEY NOT NULL AUTO INCREMENT,
|
13
|
+
`column2` DATETIME DEFAULT NOW()
|
13
14
|
);
|
14
15
|
|
15
16
|
CREATE TABLE `table2` (
|
@@ -21,7 +22,8 @@ SQL
|
|
21
22
|
after = <<-SQL
|
22
23
|
CREATE TABLE `table1` (
|
23
24
|
`column1` CHAR(11) NOT NULL AUTO INCREMENT,
|
24
|
-
`column2`
|
25
|
+
`column2` DATETIME DEFAULT CURRENT_TIMESTAMP(),
|
26
|
+
`column3` VARCHAR(255) NOT NULL DEFAULT "a",
|
25
27
|
PRIMARY KEY (`column2`)
|
26
28
|
);
|
27
29
|
|
@@ -46,7 +48,7 @@ CREATE TABLE `table3` (
|
|
46
48
|
PRIMARY KEY (`column1`)
|
47
49
|
);
|
48
50
|
|
49
|
-
ALTER TABLE `table1` ADD COLUMN `
|
51
|
+
ALTER TABLE `table1` ADD COLUMN `column3` VARCHAR(255) NOT NULL DEFAULT "a",
|
50
52
|
CHANGE COLUMN `column1` CHAR(11) NOT NULL AUTO INCREMENT,
|
51
53
|
DROP PRIMARY KEY,
|
52
54
|
ADD PRIMARY KEY `column2`;
|
data/lib/scheman/diff.rb
CHANGED
@@ -75,9 +75,11 @@ module Scheman
|
|
75
75
|
if before_table = before_schema.tables_indexed_by_name[after_table.name]
|
76
76
|
after_table.fields.each do |after_field|
|
77
77
|
if before_field = before_table.fields_indexed_by_name[after_field.name]
|
78
|
-
|
79
|
-
|
80
|
-
|
78
|
+
if after_field != before_field
|
79
|
+
result << {
|
80
|
+
alter_field: after_field.to_hash.merge(table_name: after_table.name),
|
81
|
+
}
|
82
|
+
end
|
81
83
|
end
|
82
84
|
end
|
83
85
|
end
|
@@ -99,6 +99,33 @@ module Scheman
|
|
99
99
|
spaces.maybe
|
100
100
|
end
|
101
101
|
|
102
|
+
rule(:string) do
|
103
|
+
(
|
104
|
+
single_quoted(
|
105
|
+
(
|
106
|
+
(str('\\') >> match('.')) |
|
107
|
+
str("''") |
|
108
|
+
match('[^\\\']')
|
109
|
+
).repeat
|
110
|
+
) | double_quoted(
|
111
|
+
(
|
112
|
+
(str('\\') >> match('.')) |
|
113
|
+
str('""') |
|
114
|
+
match('[^\\\"]')
|
115
|
+
).repeat
|
116
|
+
)
|
117
|
+
).as(:string)
|
118
|
+
end
|
119
|
+
|
120
|
+
rule(:bit) do
|
121
|
+
(
|
122
|
+
str("b") >> (
|
123
|
+
single_quoted(match("0|1").repeat(1, 64)) |
|
124
|
+
double_quoted(match("0|1").repeat(1, 64))
|
125
|
+
)
|
126
|
+
).as(:bit)
|
127
|
+
end
|
128
|
+
|
102
129
|
rule(:delimiter) do
|
103
130
|
str(";")
|
104
131
|
end
|
@@ -107,10 +134,6 @@ module Scheman
|
|
107
134
|
spaces >> match('[\S]').repeat >> spaces
|
108
135
|
end
|
109
136
|
|
110
|
-
rule(:string) do
|
111
|
-
any.repeat(1)
|
112
|
-
end
|
113
|
-
|
114
137
|
rule(:eol) do
|
115
138
|
delimiter >> spaces?
|
116
139
|
end
|
@@ -258,7 +281,7 @@ module Scheman
|
|
258
281
|
(field_qualifier >> (spaces >> field_qualifier).repeat)
|
259
282
|
end
|
260
283
|
|
261
|
-
# TODO:
|
284
|
+
# TODO: on update
|
262
285
|
rule(:field_qualifier) do
|
263
286
|
not_null_qualifier |
|
264
287
|
null_qualifier |
|
@@ -266,7 +289,26 @@ module Scheman
|
|
266
289
|
auto_increment_qualifier |
|
267
290
|
character_set_qualifier |
|
268
291
|
collate_qualifier |
|
269
|
-
unique_key_qualifier
|
292
|
+
unique_key_qualifier |
|
293
|
+
default_qualifier
|
294
|
+
end
|
295
|
+
|
296
|
+
rule(:default_qualifier) do
|
297
|
+
(
|
298
|
+
case_insensitive_str("default") >> spaces >> default_value
|
299
|
+
).as(:default_qualifier)
|
300
|
+
end
|
301
|
+
|
302
|
+
rule(:default_value) do
|
303
|
+
(current_timestamp | string | bit | unclassified_default_value).as(:default_value)
|
304
|
+
end
|
305
|
+
|
306
|
+
rule(:unclassified_default_value) do
|
307
|
+
(match('[\w\d:.-]')).repeat(1).as(:unclassified_default_value)
|
308
|
+
end
|
309
|
+
|
310
|
+
rule(:current_timestamp) do
|
311
|
+
(case_insensitive_str("current_timestamp()") | case_insensitive_str("now()")).as(:current_timestamp)
|
270
312
|
end
|
271
313
|
|
272
314
|
rule(:unique_key_qualifier) do
|
@@ -441,6 +483,28 @@ module Scheman
|
|
441
483
|
identifier.to_s
|
442
484
|
end
|
443
485
|
|
486
|
+
rule(string: simple(:value)) do
|
487
|
+
{
|
488
|
+
type: "string",
|
489
|
+
value: value.to_s[1..-2],
|
490
|
+
}
|
491
|
+
end
|
492
|
+
|
493
|
+
rule(bit: simple(:value)) do
|
494
|
+
{
|
495
|
+
type: "bit",
|
496
|
+
value: value.to_s[2..-2].to_i(2),
|
497
|
+
}
|
498
|
+
end
|
499
|
+
|
500
|
+
|
501
|
+
rule(unclassified_default_value: simple(:value)) do
|
502
|
+
{
|
503
|
+
type: "unclassified",
|
504
|
+
value: value.to_s,
|
505
|
+
}
|
506
|
+
end
|
507
|
+
|
444
508
|
rule(field_value: simple(:field_value)) do
|
445
509
|
field_value.to_s
|
446
510
|
end
|
@@ -529,6 +593,21 @@ module Scheman
|
|
529
593
|
}
|
530
594
|
end
|
531
595
|
|
596
|
+
rule(default_qualifier: subtree(:tree)) do
|
597
|
+
{
|
598
|
+
type: "default",
|
599
|
+
value: tree,
|
600
|
+
}
|
601
|
+
end
|
602
|
+
|
603
|
+
# @note We use Symbol to distinguish from string value
|
604
|
+
rule(current_timestamp: simple(:current_timestamp)) do
|
605
|
+
{
|
606
|
+
type: "current_timestamp",
|
607
|
+
value: nil,
|
608
|
+
}
|
609
|
+
end
|
610
|
+
|
532
611
|
rule(database_name: simple(:database_name)) do
|
533
612
|
{
|
534
613
|
database_name: database_name.to_s,
|
data/lib/scheman/schema.rb
CHANGED
data/lib/scheman/version.rb
CHANGED
data/lib/scheman/views/mysql.rb
CHANGED
@@ -79,6 +79,10 @@ module Scheman
|
|
79
79
|
rule(drop_index: subtree(:drop_index)) do
|
80
80
|
DropIndex.new(drop_index)
|
81
81
|
end
|
82
|
+
|
83
|
+
rule(default_value: subtree(:tree)) do
|
84
|
+
DefaultValue.new(tree)
|
85
|
+
end
|
82
86
|
end
|
83
87
|
|
84
88
|
class Node
|
@@ -344,6 +348,19 @@ module Scheman
|
|
344
348
|
end
|
345
349
|
end
|
346
350
|
end
|
351
|
+
|
352
|
+
class DefaultValue < Node
|
353
|
+
def to_s
|
354
|
+
case @element[:type]
|
355
|
+
when "string"
|
356
|
+
@element[:value].inspect
|
357
|
+
when "current_timestamp"
|
358
|
+
"CURRENT_TIMESTAMP()"
|
359
|
+
else
|
360
|
+
@element[:value]
|
361
|
+
end
|
362
|
+
end
|
363
|
+
end
|
347
364
|
end
|
348
365
|
end
|
349
366
|
end
|
data/spec/scheman/diff_spec.rb
CHANGED
@@ -20,7 +20,8 @@ describe Scheman::Diff do
|
|
20
20
|
let(:before_schema) do
|
21
21
|
<<-EOS.strip_heredoc
|
22
22
|
CREATE TABLE `table1` (
|
23
|
-
`column1` INTEGER(11) PRIMARY KEY NOT NULL AUTO INCREMENT
|
23
|
+
`column1` INTEGER(11) PRIMARY KEY NOT NULL AUTO INCREMENT,
|
24
|
+
`column2` DATETIME DEFAULT NOW()
|
24
25
|
);
|
25
26
|
|
26
27
|
CREATE TABLE `table2` (
|
@@ -34,7 +35,8 @@ describe Scheman::Diff do
|
|
34
35
|
<<-EOS.strip_heredoc
|
35
36
|
CREATE TABLE `table1` (
|
36
37
|
`column1` CHAR(11) NOT NULL AUTO INCREMENT,
|
37
|
-
`column2`
|
38
|
+
`column2` DATETIME DEFAULT CURRENT_TIMESTAMP(),
|
39
|
+
`column3` VARCHAR(255) NOT NULL DEFAULT "a",
|
38
40
|
PRIMARY KEY (`column2`)
|
39
41
|
);
|
40
42
|
|
@@ -61,7 +63,7 @@ describe Scheman::Diff do
|
|
61
63
|
PRIMARY KEY (`column1`)
|
62
64
|
);
|
63
65
|
|
64
|
-
ALTER TABLE `table1` ADD COLUMN `
|
66
|
+
ALTER TABLE `table1` ADD COLUMN `column3` VARCHAR(255) NOT NULL DEFAULT "a",
|
65
67
|
CHANGE COLUMN `column1` CHAR(11) NOT NULL AUTO INCREMENT,
|
66
68
|
DROP PRIMARY KEY,
|
67
69
|
ADD PRIMARY KEY `column2`;
|
@@ -241,6 +241,114 @@ describe Scheman::Parsers::Mysql do
|
|
241
241
|
end
|
242
242
|
end
|
243
243
|
|
244
|
+
context "with DEFAULT CURRENT_TIMESTAMP()" do
|
245
|
+
let(:str) do
|
246
|
+
"CREATE TABLE `table1` (`column1` INTEGER DEFAULT CURRENT_TIMESTAMP());"
|
247
|
+
end
|
248
|
+
|
249
|
+
it "succeeds in parse" do
|
250
|
+
subject[0][:create_table][:fields][0][:field][:qualifiers][0][:qualifier].should == {
|
251
|
+
type: "default",
|
252
|
+
value: {
|
253
|
+
default_value: {
|
254
|
+
type: "current_timestamp",
|
255
|
+
value: nil,
|
256
|
+
},
|
257
|
+
},
|
258
|
+
}
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
context "with DEFAULT NOW()" do
|
263
|
+
let(:str) do
|
264
|
+
"CREATE TABLE `table1` (`column1` INTEGER DEFAULT NOW());"
|
265
|
+
end
|
266
|
+
|
267
|
+
it "succeeds in parse" do
|
268
|
+
subject[0][:create_table][:fields][0][:field][:qualifiers][0][:qualifier].should == {
|
269
|
+
type: "default",
|
270
|
+
value: {
|
271
|
+
default_value: {
|
272
|
+
type: "current_timestamp",
|
273
|
+
value: nil,
|
274
|
+
},
|
275
|
+
},
|
276
|
+
}
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
context "with DEFAULT with double quoted value" do
|
281
|
+
let(:str) do
|
282
|
+
%<CREATE TABLE `table1` (`column1` INTEGER DEFAULT "a");>
|
283
|
+
end
|
284
|
+
|
285
|
+
it "succeeds in parse" do
|
286
|
+
subject[0][:create_table][:fields][0][:field][:qualifiers][0][:qualifier].should == {
|
287
|
+
type: "default",
|
288
|
+
value: {
|
289
|
+
default_value: {
|
290
|
+
type: "string",
|
291
|
+
value: "a",
|
292
|
+
},
|
293
|
+
},
|
294
|
+
}
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
context "with DEFAULT with single quoted value" do
|
299
|
+
let(:str) do
|
300
|
+
"CREATE TABLE `table1` (`column1` INTEGER DEFAULT 'a');"
|
301
|
+
end
|
302
|
+
|
303
|
+
it "succeeds in parse" do
|
304
|
+
subject[0][:create_table][:fields][0][:field][:qualifiers][0][:qualifier].should == {
|
305
|
+
type: "default",
|
306
|
+
value: {
|
307
|
+
default_value: {
|
308
|
+
type: "string",
|
309
|
+
value: "a",
|
310
|
+
},
|
311
|
+
},
|
312
|
+
}
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
context "with DEFAULT with bit value" do
|
317
|
+
let(:str) do
|
318
|
+
"CREATE TABLE `table1` (`column1` INTEGER DEFAULT b'1111');"
|
319
|
+
end
|
320
|
+
|
321
|
+
it "succeeds in parse" do
|
322
|
+
subject[0][:create_table][:fields][0][:field][:qualifiers][0][:qualifier].should == {
|
323
|
+
type: "default",
|
324
|
+
value: {
|
325
|
+
default_value: {
|
326
|
+
type: "bit",
|
327
|
+
value: 15,
|
328
|
+
},
|
329
|
+
},
|
330
|
+
}
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
context "with DEFAULT with unclassified value" do
|
335
|
+
let(:str) do
|
336
|
+
"CREATE TABLE `table1` (`column1` INTEGER DEFAULT 0);"
|
337
|
+
end
|
338
|
+
|
339
|
+
it "succeeds in parse" do
|
340
|
+
subject[0][:create_table][:fields][0][:field][:qualifiers][0][:qualifier].should == {
|
341
|
+
type: "default",
|
342
|
+
value: {
|
343
|
+
default_value: {
|
344
|
+
type: "unclassified",
|
345
|
+
value: "0",
|
346
|
+
},
|
347
|
+
},
|
348
|
+
}
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
244
352
|
context "with PRIMARY KEY" do
|
245
353
|
let(:str) do
|
246
354
|
<<-EOS.strip_heredoc
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scheman
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|