create_table 0.1.0

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.
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