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,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
@@ -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: