create_table 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.md +82 -0
  5. data/Rakefile +89 -0
  6. data/create_table.gemspec +28 -0
  7. data/features/parsing.feature +736 -0
  8. data/features/step_definitions/create_table/parsing_steps.rb +60 -0
  9. data/features/support/env.rb +28 -0
  10. data/lib/create_table.rb +2545 -0
  11. data/lib/create_table.rl +185 -0
  12. data/lib/create_table/column.rb +4920 -0
  13. data/lib/create_table/column.rl +338 -0
  14. data/lib/create_table/column_name_based_collection.rb +26 -0
  15. data/lib/create_table/common.rb +5 -0
  16. data/lib/create_table/common.rl +13 -0
  17. data/lib/create_table/index.rb +315 -0
  18. data/lib/create_table/index.rl +91 -0
  19. data/lib/create_table/mysql_reserved.txt +226 -0
  20. data/lib/create_table/parser.rb +36 -0
  21. data/lib/create_table/pg_reserved.txt +742 -0
  22. data/lib/create_table/unique.rb +7 -0
  23. data/lib/create_table/version.rb +3 -0
  24. data/spec/create_table_spec.rb +88 -0
  25. data/spec/generating/autoincrement_primary_key.yml +74 -0
  26. data/spec/generating/backticks.yml +22 -0
  27. data/spec/generating/charset.yml +21 -0
  28. data/spec/generating/comments.yml +34 -0
  29. data/spec/generating/doublequoted.yml +25 -0
  30. data/spec/generating/index.yml +37 -0
  31. data/spec/generating/named_unique.yml +37 -0
  32. data/spec/generating/reservedwords.yml +23 -0
  33. data/spec/generating/string_primary_key.yml +35 -0
  34. data/spec/generating/temporary.yml +25 -0
  35. data/spec/generating/unique.yml +35 -0
  36. data/spec/generating/unquoted.yml +25 -0
  37. data/spec/generating_spec.rb +27 -0
  38. data/spec/spec_helper.rb +66 -0
  39. metadata +263 -0
@@ -0,0 +1,7 @@
1
+ class CreateTable
2
+ class Unique < Index
3
+ def unique
4
+ true
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ class CreateTable
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe CreateTable do
4
+ describe 'parsing SQL' do
5
+ before do
6
+ @c = CreateTable.new(%{
7
+ CREATE TABLE cats (
8
+ nickname CHARACTER VARYING(255),
9
+ birthday DATE NOT NULL DEFAULT '2005-01-01',
10
+ license_id INTEGER NULL,
11
+ price NUMERIC(5,2) DEFAULT '14.50',
12
+ PRIMARY KEY (nickname),
13
+ UNIQUE KEY uindex_cats_on_license_id (license_id),
14
+ INDEX index_cats_on_price (price)
15
+ )
16
+ })
17
+ end
18
+ it "gets table name" do
19
+ @c.table_name.should == 'cats'
20
+ end
21
+ it "gets all columns" do
22
+ @c.columns.length.should == 4
23
+ end
24
+ it "gets column names" do
25
+ @c.columns.map(&:name).should == ['nickname', 'birthday', 'license_id', 'price']
26
+ end
27
+ it "gets data types" do
28
+ @c.columns.map(&:data_type).should == ['CHARACTER VARYING(255)', "DATE", 'INTEGER', "NUMERIC(5,2)"]
29
+ end
30
+ it "gets defaults" do
31
+ @c.columns.map(&:default).should == [%{}, %{2005-01-01}, nil, %{14.50}]
32
+ end
33
+ it "gets [not] null" do
34
+ @c.columns.map(&:null).should == [false, false, true, true]
35
+ end
36
+ it "gets primary key" do
37
+ @c.primary_key.column_names.should == ['nickname']
38
+ end
39
+ it "gets all indexes" do
40
+ @c.indexes.length.should == 3
41
+ @c.indexes.map(&:column_names).should == [['nickname'], ['license_id'], ['price']]
42
+ end
43
+ it "gets unique indexes" do
44
+ u = @c.indexes['license_id']
45
+ u.unique.should == true
46
+ u.name.should == 'uindex_cats_on_license_id'
47
+ u.column_names.should == ['license_id']
48
+ end
49
+ it "gets normal indexes" do
50
+ i = @c.indexes['price']
51
+ i.unique.should == false
52
+ i.name.should == 'index_cats_on_price'
53
+ i.column_names.should == ['price']
54
+ end
55
+ end
56
+
57
+ describe 'generating SQL' do
58
+ before do
59
+ @c = CreateTable.new
60
+ @c.table_name = 'where' # reserved
61
+ @c.parse_column 'nickname CHARACTER VARYING(255) PRIMARY KEY'
62
+ @c.parse_column 'false CHARACTER VARYING(255)' # reserved word
63
+ @c.parse_column 'else NUMERIC(5,2)' # reserved word
64
+ end
65
+ it "gets table name" do
66
+ @c.table_name.should == 'where'
67
+ end
68
+ it "gets all columns" do
69
+ @c.columns.length.should == 3
70
+ end
71
+ it "gets column names" do
72
+ @c.columns.map(&:name).should == ['nickname', 'false', 'else']
73
+ end
74
+ it "gets all indexes" do
75
+ @c.indexes.length.should == 1
76
+ end
77
+ it "writes minimal SQL" do
78
+ ref = %{
79
+ CREATE TABLE "where" (
80
+ nickname CHARACTER VARYING(255) PRIMARY KEY,
81
+ "false" CHARACTER VARYING(255),
82
+ "else" NUMERIC(5,2)
83
+ )
84
+ }
85
+ assert_same_sql @c.to_postgresql, ref
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,74 @@
1
+ ---
2
+ table_name: cats
3
+ description: Auto-incrementing primary key defined inline
4
+ input:
5
+ postgresql:
6
+ - |
7
+ CREATE TABLE cats (
8
+ id SERIAL PRIMARY KEY,
9
+ nickname CHARACTER VARYING(255),
10
+ birthday DATE,
11
+ license_id INTEGER,
12
+ price NUMERIC(5,2)
13
+ )
14
+ - |
15
+ CREATE TABLE cats (
16
+ id SERIAL,
17
+ nickname CHARACTER VARYING(255),
18
+ birthday DATE,
19
+ license_id INTEGER,
20
+ price NUMERIC(5,2),
21
+ PRIMARY KEY ("id")
22
+ )
23
+ mysql:
24
+ - |
25
+ CREATE TABLE cats (
26
+ id INTEGER PRIMARY KEY AUTO_INCREMENT,
27
+ nickname CHARACTER VARYING(255),
28
+ birthday DATE,
29
+ license_id INTEGER,
30
+ price NUMERIC(5,2)
31
+ )
32
+ - |
33
+ CREATE TABLE cats (
34
+ id INTEGER AUTO_INCREMENT,
35
+ nickname CHARACTER VARYING(255),
36
+ birthday DATE,
37
+ license_id INTEGER,
38
+ price NUMERIC(5,2),
39
+ PRIMARY KEY ("id")
40
+ )
41
+ sqlite3: |
42
+ CREATE TABLE cats (
43
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
44
+ nickname CHARACTER VARYING(255),
45
+ birthday DATE,
46
+ license_id INTEGER,
47
+ price NUMERIC(5,2)
48
+ )
49
+
50
+ output:
51
+ postgresql: |
52
+ CREATE TABLE cats (
53
+ "id" SERIAL PRIMARY KEY,
54
+ nickname CHARACTER VARYING(255),
55
+ birthday DATE,
56
+ license_id INTEGER,
57
+ price NUMERIC(5,2)
58
+ )
59
+ mysql: |-
60
+ CREATE TABLE cats (
61
+ "id" INTEGER PRIMARY KEY AUTO_INCREMENT,
62
+ nickname CHARACTER VARYING(255),
63
+ birthday DATE,
64
+ license_id INTEGER,
65
+ price NUMERIC(5,2)
66
+ )
67
+ sqlite3: |-
68
+ CREATE TABLE cats (
69
+ "id" INTEGER PRIMARY KEY AUTOINCREMENT,
70
+ nickname CHARACTER VARYING(255),
71
+ birthday DATE,
72
+ license_id INTEGER,
73
+ price NUMERIC(5,2)
74
+ )
@@ -0,0 +1,22 @@
1
+ ---
2
+ table_name: cats
3
+ description: MySQL-style backticks
4
+ input:
5
+ mysql: |
6
+ CREATE TABLE `cats` (
7
+ `nickname` CHARACTER VARYING(255),
8
+ `birthday` DATE,
9
+ `license_id` INTEGER,
10
+ `price` NUMERIC(5,2)
11
+ )
12
+ output:
13
+ postgresql: &id002 |
14
+ CREATE TABLE cats (
15
+ nickname CHARACTER VARYING(255),
16
+ birthday DATE,
17
+ license_id INTEGER,
18
+ price NUMERIC(5,2)
19
+ )
20
+
21
+ mysql: *id002
22
+ sqlite3: *id002
@@ -0,0 +1,21 @@
1
+ ---
2
+ table_name: cats
3
+ description: MySQL-style specification of table charset in CREATE TABLE sql
4
+ input:
5
+ postgresql: &id001 |
6
+ CREATE TABLE cats (
7
+ nickname CHARACTER VARYING(255),
8
+ birthday DATE,
9
+ license_id INTEGER,
10
+ price NUMERIC(5,2)
11
+ ) DEFAULT CHARSET=utf8
12
+ output:
13
+ postgresql: &id002 |
14
+ CREATE TABLE cats (
15
+ nickname CHARACTER VARYING(255),
16
+ birthday DATE,
17
+ license_id INTEGER,
18
+ price NUMERIC(5,2)
19
+ )
20
+ mysql: *id002
21
+ sqlite3: *id002
@@ -0,0 +1,34 @@
1
+ ---
2
+ table_name: cats
3
+ description: Comments with "/* */", including multiline
4
+ input:
5
+ postgresql: &id001 |
6
+ /* b o yah */CREATE TABLE cats (/* daom */
7
+ nickname /*yah
8
+ see
9
+ i didn't
10
+ think
11
+ so*/ CHARACTER VARYING(255), /*this is a great nickname*/
12
+ birthday /* did you notice this? */ DATE,
13
+ license_id INTEGER, /* oh yah that's cool too */
14
+ /* oh yah that's hilarious */ price NUMERIC(5,2)
15
+ )/* gosh
16
+ when
17
+ will
18
+ it
19
+ end
20
+ */
21
+
22
+ mysql: *id001
23
+ sqlite3: *id001
24
+ output:
25
+ postgresql: &id002 |
26
+ CREATE TABLE cats (
27
+ nickname CHARACTER VARYING(255),
28
+ birthday DATE,
29
+ license_id INTEGER,
30
+ price NUMERIC(5,2)
31
+ )
32
+
33
+ mysql: *id002
34
+ sqlite3: *id002
@@ -0,0 +1,25 @@
1
+ ---
2
+ table_name: cats
3
+ description: Double-quoted
4
+ input:
5
+ postgresql: &id001 |
6
+ CREATE TABLE "cats" (
7
+ "nickname" CHARACTER VARYING(255),
8
+ "birthday" DATE,
9
+ "license_id" INTEGER,
10
+ "price" NUMERIC(5,2)
11
+ )
12
+
13
+ mysql: *id001
14
+ sqlite3: *id001
15
+ output:
16
+ postgresql: &id002 |
17
+ CREATE TABLE cats (
18
+ nickname CHARACTER VARYING(255),
19
+ birthday DATE,
20
+ license_id INTEGER,
21
+ price NUMERIC(5,2)
22
+ )
23
+
24
+ mysql: *id002
25
+ sqlite3: *id002
@@ -0,0 +1,37 @@
1
+ ---
2
+ table_name: cats
3
+ description: Index defined in the "table constraints" section
4
+ input:
5
+ mysql:
6
+ - |
7
+ CREATE TABLE cats (
8
+ nickname CHARACTER VARYING(255),
9
+ birthday DATE,
10
+ license_id INTEGER,
11
+ price NUMERIC(5,2),
12
+ INDEX index_cats_on_nickname (nickname)
13
+ )
14
+ - |
15
+ CREATE TABLE cats (
16
+ nickname CHARACTER VARYING(255),
17
+ birthday DATE,
18
+ license_id INTEGER,
19
+ price NUMERIC(5,2),
20
+ KEY index_cats_on_nickname (nickname)
21
+ )
22
+ output:
23
+ postgresql:
24
+ - &create_table |
25
+ CREATE TABLE cats (
26
+ nickname CHARACTER VARYING(255),
27
+ birthday DATE,
28
+ license_id INTEGER,
29
+ price NUMERIC(5,2)
30
+ )
31
+ - &create_indexes CREATE INDEX index_cats_on_nickname ON cats (nickname)
32
+ mysql:
33
+ - *create_table
34
+ - *create_indexes
35
+ sqlite3:
36
+ - *create_table
37
+ - *create_indexes
@@ -0,0 +1,37 @@
1
+ ---
2
+ table_name: cats
3
+ description: Named unique indexes
4
+ input:
5
+ mysql:
6
+ - |
7
+ CREATE TABLE cats (
8
+ nickname CHARACTER VARYING(255),
9
+ birthday DATE,
10
+ license_id INTEGER,
11
+ price NUMERIC(5,2),
12
+ UNIQUE KEY uindex_cats_on_nickname (nickname)
13
+ )
14
+ - |
15
+ CREATE TABLE cats (
16
+ nickname CHARACTER VARYING(255),
17
+ birthday DATE,
18
+ license_id INTEGER,
19
+ price NUMERIC(5,2),
20
+ UNIQUE INDEX uindex_cats_on_nickname (nickname)
21
+ )
22
+ output:
23
+ postgresql:
24
+ - &id002 |
25
+ CREATE TABLE cats (
26
+ nickname CHARACTER VARYING(255),
27
+ birthday DATE,
28
+ license_id INTEGER,
29
+ price NUMERIC(5,2)
30
+ )
31
+ - CREATE UNIQUE INDEX uindex_cats_on_nickname ON cats (nickname)
32
+ mysql:
33
+ - *id002
34
+ - CREATE UNIQUE INDEX uindex_cats_on_nickname ON cats (nickname)
35
+ sqlite3:
36
+ - *id002
37
+ - CREATE UNIQUE INDEX uindex_cats_on_nickname ON cats (nickname)
@@ -0,0 +1,23 @@
1
+ ---
2
+ table_name: where
3
+ description: Reserved words in table and column names
4
+ input:
5
+ postgresql: &id001 |
6
+ CREATE TABLE "where" (
7
+ nickname CHARACTER VARYING(255),
8
+ "false" CHARACTER VARYING(255),
9
+ "else" NUMERIC(5,2)
10
+ )
11
+
12
+ mysql: *id001
13
+ sqlite3: *id001
14
+ output:
15
+ postgresql: &id002 |
16
+ CREATE TABLE "where" (
17
+ nickname CHARACTER VARYING(255),
18
+ "false" CHARACTER VARYING(255),
19
+ "else" NUMERIC(5,2)
20
+ )
21
+
22
+ mysql: *id002
23
+ sqlite3: *id002
@@ -0,0 +1,35 @@
1
+ ---
2
+ table_name: cats
3
+ description: String primary key
4
+ input:
5
+ postgresql: &id001
6
+ - |
7
+ CREATE TABLE cats (
8
+ nickname CHARACTER VARYING(255) PRIMARY KEY,
9
+ birthday DATE,
10
+ license_id INTEGER,
11
+ price NUMERIC(5,2)
12
+ )
13
+
14
+ - |
15
+ CREATE TABLE cats (
16
+ nickname CHARACTER VARYING(255),
17
+ birthday DATE,
18
+ license_id INTEGER,
19
+ price NUMERIC(5,2),
20
+ PRIMARY KEY (nickname)
21
+ )
22
+
23
+ mysql: *id001
24
+ sqlite3: *id001
25
+ output:
26
+ postgresql: &id002 |
27
+ CREATE TABLE cats (
28
+ nickname CHARACTER VARYING(255) PRIMARY KEY,
29
+ birthday DATE,
30
+ license_id INTEGER,
31
+ price NUMERIC(5,2)
32
+ )
33
+
34
+ mysql: *id002
35
+ sqlite3: *id002
@@ -0,0 +1,25 @@
1
+ ---
2
+ table_name: cats
3
+ description: Temporary tables
4
+ input:
5
+ mysql: &id001 |
6
+ CREATE TEMPORARY TABLE cats (
7
+ nickname CHARACTER VARYING(255),
8
+ birthday DATE,
9
+ license_id INTEGER,
10
+ price NUMERIC(5,2)
11
+ )
12
+
13
+ mysql: *id001
14
+ sqlite3: *id001
15
+ output:
16
+ postgresql: &id002 |
17
+ CREATE TEMPORARY TABLE cats (
18
+ nickname CHARACTER VARYING(255),
19
+ birthday DATE,
20
+ license_id INTEGER,
21
+ price NUMERIC(5,2)
22
+ )
23
+
24
+ mysql: *id002
25
+ sqlite3: *id002