scheman 0.0.2 → 0.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.
- 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
|