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.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +82 -0
- data/Rakefile +89 -0
- data/create_table.gemspec +28 -0
- data/features/parsing.feature +736 -0
- data/features/step_definitions/create_table/parsing_steps.rb +60 -0
- data/features/support/env.rb +28 -0
- data/lib/create_table.rb +2545 -0
- data/lib/create_table.rl +185 -0
- data/lib/create_table/column.rb +4920 -0
- data/lib/create_table/column.rl +338 -0
- data/lib/create_table/column_name_based_collection.rb +26 -0
- data/lib/create_table/common.rb +5 -0
- data/lib/create_table/common.rl +13 -0
- data/lib/create_table/index.rb +315 -0
- data/lib/create_table/index.rl +91 -0
- data/lib/create_table/mysql_reserved.txt +226 -0
- data/lib/create_table/parser.rb +36 -0
- data/lib/create_table/pg_reserved.txt +742 -0
- data/lib/create_table/unique.rb +7 -0
- data/lib/create_table/version.rb +3 -0
- data/spec/create_table_spec.rb +88 -0
- data/spec/generating/autoincrement_primary_key.yml +74 -0
- data/spec/generating/backticks.yml +22 -0
- data/spec/generating/charset.yml +21 -0
- data/spec/generating/comments.yml +34 -0
- data/spec/generating/doublequoted.yml +25 -0
- data/spec/generating/index.yml +37 -0
- data/spec/generating/named_unique.yml +37 -0
- data/spec/generating/reservedwords.yml +23 -0
- data/spec/generating/string_primary_key.yml +35 -0
- data/spec/generating/temporary.yml +25 -0
- data/spec/generating/unique.yml +35 -0
- data/spec/generating/unquoted.yml +25 -0
- data/spec/generating_spec.rb +27 -0
- data/spec/spec_helper.rb +66 -0
- metadata +263 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
---
|
2
|
+
table_name: cats
|
3
|
+
description: Uniques
|
4
|
+
input:
|
5
|
+
postgresql: &id001
|
6
|
+
- |
|
7
|
+
CREATE TABLE cats (
|
8
|
+
nickname CHARACTER VARYING(255) UNIQUE,
|
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
|
+
UNIQUE (nickname)
|
21
|
+
)
|
22
|
+
|
23
|
+
mysql: *id001
|
24
|
+
sqlite3: *id001
|
25
|
+
output:
|
26
|
+
postgresql: &id002 |
|
27
|
+
CREATE TABLE cats (
|
28
|
+
nickname CHARACTER VARYING(255) UNIQUE,
|
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: Unquoted
|
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,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
describe CreateTable do
|
5
|
+
Dir[File.expand_path('../generating/*.yml', __FILE__)].each do |path|
|
6
|
+
describe "using #{File.basename(path)}" do
|
7
|
+
src = YAML.load_file path
|
8
|
+
|
9
|
+
%w{ postgresql mysql sqlite3 }.permutation(2).each do |db1, db2|
|
10
|
+
it "parses #{db1}-compatible SQL to generate #{db2}-compatible SQL" do
|
11
|
+
[ src['input'][db1] ].flatten(1).compact.each do |sql|
|
12
|
+
c = CreateTable.new sql
|
13
|
+
assert_same_sql src['output'][db2], c.send("to_#{db2}")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
[ src['input'][ENV['DB']] ].flatten(1).compact.each_with_index do |sql, i|
|
19
|
+
it "generates #{ENV['DB']}-compatible SQL that is functionally equivalent to original (#{i})" do
|
20
|
+
c = CreateTable.new sql
|
21
|
+
assert_same_result src['table_name'], sql, c.send("to_#{ENV['DB']}")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
|
3
|
+
Bundler.with_clean_env do
|
4
|
+
system %{rake ragel}
|
5
|
+
raise RuntimeError unless $?.success?
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'active_record'
|
9
|
+
|
10
|
+
ENV['DB'] ||= 'mysql'
|
11
|
+
case ENV['DB']
|
12
|
+
when 'postgresql'
|
13
|
+
system %{ dropdb create_table_test }
|
14
|
+
system %{ createdb create_table_test }
|
15
|
+
ActiveRecord::Base.establish_connection :adapter => 'postgresql', :database => 'create_table_test'
|
16
|
+
when 'mysql'
|
17
|
+
system %{ mysql -u root -ppassword -e "DROP DATABASE IF EXISTS create_table_test" }
|
18
|
+
system %{ mysql -u root -ppassword -e "CREATE DATABASE create_table_test CHARSET utf8" }
|
19
|
+
ENV['DATABASE_URL'] = 'mysql2://root:password@127.0.0.1/create_table_test'
|
20
|
+
ActiveRecord::Base.establish_connection
|
21
|
+
when 'sqlite3'
|
22
|
+
ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => ':memory:'
|
23
|
+
else
|
24
|
+
raise "not supported"
|
25
|
+
end
|
26
|
+
|
27
|
+
require 'create_table'
|
28
|
+
|
29
|
+
module SpecHelper
|
30
|
+
def assert_same_sql(ref, actual)
|
31
|
+
ref = [ref].flatten
|
32
|
+
actual = [actual].flatten
|
33
|
+
|
34
|
+
ref.each_with_index do |ref1, i|
|
35
|
+
clean_sql(actual[i]).should == clean_sql(ref1)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def assert_same_result(table_name, a, b)
|
40
|
+
conn = ActiveRecord::Base.connection
|
41
|
+
|
42
|
+
[a].flatten.each { |stmt| conn.execute stmt }
|
43
|
+
a_columns = conn.columns table_name
|
44
|
+
a_indexes = conn.indexes table_name
|
45
|
+
conn.drop_table table_name
|
46
|
+
|
47
|
+
[b].flatten.each { |stmt| conn.execute stmt }
|
48
|
+
b_columns = conn.columns table_name
|
49
|
+
b_indexes = conn.indexes table_name
|
50
|
+
conn.drop_table table_name
|
51
|
+
|
52
|
+
[:name, :sql_type, :default].each do |variable|
|
53
|
+
b_columns.map(&variable).should == a_columns.map(&variable)
|
54
|
+
end
|
55
|
+
a_indexes.should == b_indexes
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def clean_sql(sql)
|
60
|
+
sql.gsub('`', '"').gsub(/\s+/, ' ').gsub(/\s*([,\(\)])\s*/, '\1').strip
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
RSpec.configure do |c|
|
65
|
+
c.include SpecHelper
|
66
|
+
end
|
metadata
ADDED
@@ -0,0 +1,263 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: create_table
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Seamus Abshere
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec-core
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec-expectations
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec-mocks
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: posix-spawn
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: activerecord
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: activesupport
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: mysql2
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: pg
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: sqlite3
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: cucumber
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
description: Analyze and inspect CREATE TABLE SQL statements and translate across
|
175
|
+
databases.
|
176
|
+
email:
|
177
|
+
- seamus@abshere.net
|
178
|
+
executables: []
|
179
|
+
extensions: []
|
180
|
+
extra_rdoc_files: []
|
181
|
+
files:
|
182
|
+
- .gitignore
|
183
|
+
- Gemfile
|
184
|
+
- LICENSE
|
185
|
+
- README.md
|
186
|
+
- Rakefile
|
187
|
+
- create_table.gemspec
|
188
|
+
- features/parsing.feature
|
189
|
+
- features/step_definitions/create_table/parsing_steps.rb
|
190
|
+
- features/support/env.rb
|
191
|
+
- lib/create_table.rb
|
192
|
+
- lib/create_table.rl
|
193
|
+
- lib/create_table/column.rb
|
194
|
+
- lib/create_table/column.rl
|
195
|
+
- lib/create_table/column_name_based_collection.rb
|
196
|
+
- lib/create_table/common.rb
|
197
|
+
- lib/create_table/common.rl
|
198
|
+
- lib/create_table/index.rb
|
199
|
+
- lib/create_table/index.rl
|
200
|
+
- lib/create_table/mysql_reserved.txt
|
201
|
+
- lib/create_table/parser.rb
|
202
|
+
- lib/create_table/pg_reserved.txt
|
203
|
+
- lib/create_table/unique.rb
|
204
|
+
- lib/create_table/version.rb
|
205
|
+
- spec/create_table_spec.rb
|
206
|
+
- spec/generating/autoincrement_primary_key.yml
|
207
|
+
- spec/generating/backticks.yml
|
208
|
+
- spec/generating/charset.yml
|
209
|
+
- spec/generating/comments.yml
|
210
|
+
- spec/generating/doublequoted.yml
|
211
|
+
- spec/generating/index.yml
|
212
|
+
- spec/generating/named_unique.yml
|
213
|
+
- spec/generating/reservedwords.yml
|
214
|
+
- spec/generating/string_primary_key.yml
|
215
|
+
- spec/generating/temporary.yml
|
216
|
+
- spec/generating/unique.yml
|
217
|
+
- spec/generating/unquoted.yml
|
218
|
+
- spec/generating_spec.rb
|
219
|
+
- spec/spec_helper.rb
|
220
|
+
homepage: https://github.com/seamusabshere/create_table
|
221
|
+
licenses: []
|
222
|
+
post_install_message:
|
223
|
+
rdoc_options: []
|
224
|
+
require_paths:
|
225
|
+
- lib
|
226
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
227
|
+
none: false
|
228
|
+
requirements:
|
229
|
+
- - ! '>='
|
230
|
+
- !ruby/object:Gem::Version
|
231
|
+
version: '0'
|
232
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
233
|
+
none: false
|
234
|
+
requirements:
|
235
|
+
- - ! '>='
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
version: '0'
|
238
|
+
requirements: []
|
239
|
+
rubyforge_project:
|
240
|
+
rubygems_version: 1.8.24
|
241
|
+
signing_key:
|
242
|
+
specification_version: 3
|
243
|
+
summary: Analyze and inspect CREATE TABLE SQL statements and translate across databases.
|
244
|
+
test_files:
|
245
|
+
- features/parsing.feature
|
246
|
+
- features/step_definitions/create_table/parsing_steps.rb
|
247
|
+
- features/support/env.rb
|
248
|
+
- spec/create_table_spec.rb
|
249
|
+
- spec/generating/autoincrement_primary_key.yml
|
250
|
+
- spec/generating/backticks.yml
|
251
|
+
- spec/generating/charset.yml
|
252
|
+
- spec/generating/comments.yml
|
253
|
+
- spec/generating/doublequoted.yml
|
254
|
+
- spec/generating/index.yml
|
255
|
+
- spec/generating/named_unique.yml
|
256
|
+
- spec/generating/reservedwords.yml
|
257
|
+
- spec/generating/string_primary_key.yml
|
258
|
+
- spec/generating/temporary.yml
|
259
|
+
- spec/generating/unique.yml
|
260
|
+
- spec/generating/unquoted.yml
|
261
|
+
- spec/generating_spec.rb
|
262
|
+
- spec/spec_helper.rb
|
263
|
+
has_rdoc:
|