visual_migrate 4.0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (207) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +1 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/images/visual_migrate/bg_pagetop.gif +0 -0
  6. data/app/assets/javascripts/common.js +21 -0
  7. data/app/assets/javascripts/jquery.cookie.js +95 -0
  8. data/app/assets/javascripts/jquery.js +4 -0
  9. data/app/assets/javascripts/visual_migrate/application.js +13 -0
  10. data/app/assets/javascripts/visual_migrate/dialog.js +2 -0
  11. data/app/assets/javascripts/visual_migrate/index.js +2 -0
  12. data/app/assets/javascripts/vm-application.js +35 -0
  13. data/app/assets/stylesheets/visual_migrate/application.css +13 -0
  14. data/app/assets/stylesheets/visual_migrate/dialog.css +4 -0
  15. data/app/assets/stylesheets/visual_migrate/index.css +4 -0
  16. data/app/assets/stylesheets/vm-application.css +40 -0
  17. data/app/assets/stylesheets/vm-common.css +335 -0
  18. data/app/assets/template/sim003_blue.zip +0 -0
  19. data/app/assets/template/sim003_blue/src/css/common.css +329 -0
  20. data/app/assets/template/sim003_blue/src/images/bg_pagetop.gif +0 -0
  21. data/app/assets/template/sim003_blue/src/index.html +153 -0
  22. data/app/assets/template/sim003_blue/src/js/common.js +21 -0
  23. data/app/assets/template/sim003_blue/src/js/jquery.js +4 -0
  24. data/app/controllers/visual_migrate/application_controller.rb +5 -0
  25. data/app/controllers/visual_migrate/dialog_controller.rb +9 -0
  26. data/app/controllers/visual_migrate/index_controller.rb +174 -0
  27. data/app/helpers/visual_migrate/application_helper.rb +97 -0
  28. data/app/helpers/visual_migrate/dialog_helper.rb +4 -0
  29. data/app/helpers/visual_migrate/index_helper.rb +4 -0
  30. data/app/models/schema_migration.rb +2 -0
  31. data/app/views/layouts/visual_migrate/_columns.html.erb +133 -0
  32. data/app/views/layouts/visual_migrate/_func_add_column.html.erb +24 -0
  33. data/app/views/layouts/visual_migrate/_func_add_index.html.erb +20 -0
  34. data/app/views/layouts/visual_migrate/_func_add_timestamps.html.erb +8 -0
  35. data/app/views/layouts/visual_migrate/_func_change_column.html.erb +24 -0
  36. data/app/views/layouts/visual_migrate/_func_change_column_default.html.erb +12 -0
  37. data/app/views/layouts/visual_migrate/_func_create_table.html.erb +33 -0
  38. data/app/views/layouts/visual_migrate/_func_drop_table.html.erb +8 -0
  39. data/app/views/layouts/visual_migrate/_func_remove_column.html.erb +9 -0
  40. data/app/views/layouts/visual_migrate/_func_remove_index.html.erb +17 -0
  41. data/app/views/layouts/visual_migrate/_func_remove_timestamps.html.erb +8 -0
  42. data/app/views/layouts/visual_migrate/_func_rename_column.html.erb +12 -0
  43. data/app/views/layouts/visual_migrate/_func_rename_index.html.erb +10 -0
  44. data/app/views/layouts/visual_migrate/_func_rename_table.html.erb +9 -0
  45. data/app/views/layouts/visual_migrate/_migration_class.html.erb +20 -0
  46. data/app/views/layouts/visual_migrate/_migration_method.html.erb +40 -0
  47. data/app/views/layouts/visual_migrate/application.html.erb +68 -0
  48. data/app/views/layouts/visual_migrate/dialog.html.erb +28 -0
  49. data/app/views/visual_migrate/dialog/add_new_func.html.erb +45 -0
  50. data/app/views/visual_migrate/index/_section_migrations.html.erb +19 -0
  51. data/app/views/visual_migrate/index/_section_tables.html.erb +10 -0
  52. data/app/views/visual_migrate/index/command_line.html.erb +34 -0
  53. data/app/views/visual_migrate/index/direct_edit.html.erb +9 -0
  54. data/app/views/visual_migrate/index/edit_migration.html.erb +15 -0
  55. data/app/views/visual_migrate/index/modify_table.html.erb +1 -0
  56. data/config/routes.rb +70 -0
  57. data/lib/class_filter.rb +126 -0
  58. data/lib/func_filter.rb +560 -0
  59. data/lib/method_filter.rb +104 -0
  60. data/lib/migration_defs.rb +626 -0
  61. data/lib/tasks/visual-migrate_tasks.rake +4 -0
  62. data/lib/tasks/visual_migrate_tasks.rake +4 -0
  63. data/lib/visual_migrate.rb +6 -0
  64. data/lib/visual_migrate/activerecord.rb +23 -0
  65. data/lib/visual_migrate/engine.rb +5 -0
  66. data/lib/visual_migrate/migration.rb +15 -0
  67. data/lib/visual_migrate/version.rb +3 -0
  68. data/lib/visual_migrate_ripper.rb +157 -0
  69. data/test/dummy/Gemfile +84 -0
  70. data/test/dummy/Gemfile.lock +218 -0
  71. data/test/dummy/README.rdoc +28 -0
  72. data/test/dummy/Rakefile +6 -0
  73. data/test/dummy/app/assets/javascripts/application.js +13 -0
  74. data/test/dummy/app/assets/javascripts/index.js +2 -0
  75. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  76. data/test/dummy/app/assets/stylesheets/index.css +4 -0
  77. data/test/dummy/app/controllers/application_controller.rb +5 -0
  78. data/test/dummy/app/controllers/index_controller.rb +9 -0
  79. data/test/dummy/app/helpers/application_helper.rb +2 -0
  80. data/test/dummy/app/helpers/index_helper.rb +2 -0
  81. data/test/dummy/app/models/test_table.rb +2 -0
  82. data/test/dummy/app/views/index/index.html.erb +23 -0
  83. data/test/dummy/app/views/layouts/application.html.erb +43 -0
  84. data/test/dummy/bin/bundle +3 -0
  85. data/test/dummy/bin/rails +4 -0
  86. data/test/dummy/bin/rake +4 -0
  87. data/test/dummy/config.ru +4 -0
  88. data/test/dummy/config/application.rb +23 -0
  89. data/test/dummy/config/boot.rb +5 -0
  90. data/test/dummy/config/database.yml +30 -0
  91. data/test/dummy/config/environment.rb +5 -0
  92. data/test/dummy/config/environments/development.rb +29 -0
  93. data/test/dummy/config/environments/production.rb +80 -0
  94. data/test/dummy/config/environments/test.rb +36 -0
  95. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  96. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  97. data/test/dummy/config/initializers/inflections.rb +16 -0
  98. data/test/dummy/config/initializers/mime_types.rb +5 -0
  99. data/test/dummy/config/initializers/secret_token.rb +12 -0
  100. data/test/dummy/config/initializers/session_store.rb +3 -0
  101. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  102. data/test/dummy/config/locales/en.yml +23 -0
  103. data/test/dummy/config/routes.rb +6 -0
  104. data/test/dummy/db/development.sqlite3 +0 -0
  105. data/test/dummy/db/migrate/20131006135044_create_test_tables.rb +9 -0
  106. data/test/dummy/db/migrate/20131007030825_add_column_test_table.rb +13 -0
  107. data/test/dummy/db/migrate/20131026214458_rename_column_test_table.rb +5 -0
  108. data/test/dummy/db/migrate/20131030105601_change_column_test.rb +10 -0
  109. data/test/dummy/db/migrate/20131104225745_index_test.rb +9 -0
  110. data/test/dummy/db/migrate/20131105025821_rename_index_test.rb +5 -0
  111. data/test/dummy/db/migrate/20131105042853_remove_timestamps_test.rb +9 -0
  112. data/test/dummy/db/schema.rb +28 -0
  113. data/test/dummy/db/seeds.rb +20 -0
  114. data/test/dummy/db/test.sqlite3 +0 -0
  115. data/test/dummy/log/development.log +90374 -0
  116. data/test/dummy/log/production.log +329 -0
  117. data/test/dummy/log/test.log +489 -0
  118. data/test/dummy/public/404.html +58 -0
  119. data/test/dummy/public/422.html +58 -0
  120. data/test/dummy/public/500.html +57 -0
  121. data/test/dummy/public/favicon.ico +0 -0
  122. data/test/dummy/public/index.html.bak +38 -0
  123. data/test/dummy/spec/controllers/index_controller_spec.rb +19 -0
  124. data/test/dummy/spec/spec_helper.rb +46 -0
  125. data/test/dummy/spec/views/index/index.html.erb_spec.rb +17 -0
  126. data/test/dummy/test/controllers/index_controller_test.rb +7 -0
  127. data/test/dummy/test/fixtures/test_tables.yml +11 -0
  128. data/test/dummy/test/helpers/index_helper_test.rb +4 -0
  129. data/test/dummy/test/models/test_table_test.rb +7 -0
  130. data/test/dummy/tmp/cache/assets/development/sprockets/021fe5e1eadff30885806b7245f7e66e +0 -0
  131. data/test/dummy/tmp/cache/assets/development/sprockets/0a9126be05e74d1b89f024c687b7dbfd +0 -0
  132. data/test/dummy/tmp/cache/assets/development/sprockets/0b682b760de6f7c47a7236f024fee55d +0 -0
  133. data/test/dummy/tmp/cache/assets/development/sprockets/0caf4a7a233e329f7d3bfe3fc2f37910 +0 -0
  134. data/test/dummy/tmp/cache/assets/development/sprockets/0e059cd92931990c10b6c5b78014ec92 +0 -0
  135. data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  136. data/test/dummy/tmp/cache/assets/development/sprockets/178af67c2277a751289e81fc2f96dc7d +0 -0
  137. data/test/dummy/tmp/cache/assets/development/sprockets/18650e945a1a2ad87b3d8997d1ccac10 +0 -0
  138. data/test/dummy/tmp/cache/assets/development/sprockets/19bf9cd3f01562cdecb4b5c825c8f36d +0 -0
  139. data/test/dummy/tmp/cache/assets/development/sprockets/1b5f6c8780c3fcb34d2bbbabe38c3d94 +0 -0
  140. data/test/dummy/tmp/cache/assets/development/sprockets/1df2ccc1ade2cfe4a9d0ce8b0ec2dadf +0 -0
  141. data/test/dummy/tmp/cache/assets/development/sprockets/272853fd0642f08e38174a609a2be457 +0 -0
  142. data/test/dummy/tmp/cache/assets/development/sprockets/2aff43fdd4d59cb6a75288268ec363ee +0 -0
  143. data/test/dummy/tmp/cache/assets/development/sprockets/2c853768baf811357d81d41bdfd05dcf +0 -0
  144. data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  145. data/test/dummy/tmp/cache/assets/development/sprockets/314d48e543146f617c4d3439a4d8d40d +0 -0
  146. data/test/dummy/tmp/cache/assets/development/sprockets/320853225bbf3512349dc1ef4ea80874 +0 -0
  147. data/test/dummy/tmp/cache/assets/development/sprockets/32f1a742d35f7250e984b1de0554a894 +0 -0
  148. data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  149. data/test/dummy/tmp/cache/assets/development/sprockets/3807e3adca7677de6842a8048ad6d83b +0 -0
  150. data/test/dummy/tmp/cache/assets/development/sprockets/42ad84505ad8dfc0a4a724e8c889c607 +0 -0
  151. data/test/dummy/tmp/cache/assets/development/sprockets/46c5c46e37f5a22449050d7fc6f1dc26 +0 -0
  152. data/test/dummy/tmp/cache/assets/development/sprockets/4fbe2f2c44de1e405b3562e4935176b9 +0 -0
  153. data/test/dummy/tmp/cache/assets/development/sprockets/52d191f68c69ae795e8da63ef51ca640 +0 -0
  154. data/test/dummy/tmp/cache/assets/development/sprockets/54cf088ee215412d3800d9b1e0263c30 +0 -0
  155. data/test/dummy/tmp/cache/assets/development/sprockets/55165e8d7dcda66caf51df6c6417142d +0 -0
  156. data/test/dummy/tmp/cache/assets/development/sprockets/576fe10a40538bd3999a2b1b3fe334d1 +0 -0
  157. data/test/dummy/tmp/cache/assets/development/sprockets/5793e837a2934ce3b84aac8785a874ce +0 -0
  158. data/test/dummy/tmp/cache/assets/development/sprockets/5900a8937fa5118d2a6ee8289614c854 +0 -0
  159. data/test/dummy/tmp/cache/assets/development/sprockets/5a9053557c1035de31eb2162db5b9d34 +0 -0
  160. data/test/dummy/tmp/cache/assets/development/sprockets/5df80a6ab7f25724f11ce3179173ad60 +0 -0
  161. data/test/dummy/tmp/cache/assets/development/sprockets/6373000f4849668f51493aaf8503c8e8 +0 -0
  162. data/test/dummy/tmp/cache/assets/development/sprockets/65048e3e4fd096e06f7ca69a5af7ab9f +0 -0
  163. data/test/dummy/tmp/cache/assets/development/sprockets/6bb983076781d92edbb1da256023c14b +0 -0
  164. data/test/dummy/tmp/cache/assets/development/sprockets/6dfaf2d0d571c61e96bce5377fcddf7f +0 -0
  165. data/test/dummy/tmp/cache/assets/development/sprockets/6efc50a7f372f50e09a67daa7ac00940 +0 -0
  166. data/test/dummy/tmp/cache/assets/development/sprockets/6f7dfedc6e14ea8772e0284497539f90 +0 -0
  167. data/test/dummy/tmp/cache/assets/development/sprockets/70f64d1c4421c935f01a8d5aa647d792 +0 -0
  168. data/test/dummy/tmp/cache/assets/development/sprockets/7999e525c88173c1beb785f002effc1d +0 -0
  169. data/test/dummy/tmp/cache/assets/development/sprockets/7c188f2b1cb38e1b55dc8a8bb8785fe8 +0 -0
  170. data/test/dummy/tmp/cache/assets/development/sprockets/7d48e39953ffcdd70751e98d08d1282c +0 -0
  171. data/test/dummy/tmp/cache/assets/development/sprockets/7ddca3ef38a810d93ddc026ee5fa7959 +0 -0
  172. data/test/dummy/tmp/cache/assets/development/sprockets/7fecd8a0b0c56f928c31450f839c4731 +0 -0
  173. data/test/dummy/tmp/cache/assets/development/sprockets/842d637730ce4255c6beacff60b80157 +0 -0
  174. data/test/dummy/tmp/cache/assets/development/sprockets/89cd476f554d26de50608ac9ce6d0606 +0 -0
  175. data/test/dummy/tmp/cache/assets/development/sprockets/9519989fc45811670fa6b1184fedecc7 +0 -0
  176. data/test/dummy/tmp/cache/assets/development/sprockets/99cdbaecd1b34008d0853764ec707246 +0 -0
  177. data/test/dummy/tmp/cache/assets/development/sprockets/a093237e72888c88a730f537a544e03b +0 -0
  178. data/test/dummy/tmp/cache/assets/development/sprockets/a7c148cd78906c44016fdeb236569b5b +0 -0
  179. data/test/dummy/tmp/cache/assets/development/sprockets/a83bebd10c561b2264affb4ed6a9f83b +0 -0
  180. data/test/dummy/tmp/cache/assets/development/sprockets/b3ed09e62124bd9cf5f7a1ac14298d4f +0 -0
  181. data/test/dummy/tmp/cache/assets/development/sprockets/be45f47d31b8e7fd54a0b6087eeaf5de +0 -0
  182. data/test/dummy/tmp/cache/assets/development/sprockets/c00bfe3da0096cbd0434a6c66262fe23 +0 -0
  183. data/test/dummy/tmp/cache/assets/development/sprockets/c78109332f6461183a94718da0068da6 +0 -0
  184. data/test/dummy/tmp/cache/assets/development/sprockets/cee8c6b09c33d2b276753e959712724e +0 -0
  185. data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  186. data/test/dummy/tmp/cache/assets/development/sprockets/d08ae02c560f15a5cb4d0447b0da29ad +0 -0
  187. data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  188. data/test/dummy/tmp/cache/assets/development/sprockets/d990155237ca59ccb96cf2253f8059ae +0 -0
  189. data/test/dummy/tmp/cache/assets/development/sprockets/df600f50f002512c95d93bcfbab891ed +0 -0
  190. data/test/dummy/tmp/cache/assets/development/sprockets/e2a3afc837465539886843291aedd0f3 +0 -0
  191. data/test/dummy/tmp/cache/assets/development/sprockets/eb7b0ec5bff36142ba070d1a39e194b1 +0 -0
  192. data/test/dummy/tmp/cache/assets/development/sprockets/f3aee0380718ef20b2e587a842ce697e +0 -0
  193. data/test/dummy/tmp/cache/assets/development/sprockets/f408c68444462a9ae2effa5230b43edf +0 -0
  194. data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  195. data/test/dummy/tmp/cache/assets/development/sprockets/f898358aceb33227eb4403237acca034 +0 -0
  196. data/test/dummy/tmp/cache/assets/development/sprockets/fc7201c6cbef32453aa4175c520c8eae +0 -0
  197. data/test/dummy/tmp/cache/assets/development/sprockets/fca81105f7109a6a96f05aedd0f1b883 +0 -0
  198. data/test/dummy/tmp/cache/assets/development/sprockets/fdd7a6a4d56761d6463b3c34768fbc78 +0 -0
  199. data/test/dummy/tmp/restart.txt +0 -0
  200. data/test/dummy/tmp/visual-migrate_tmp.rb +5 -0
  201. data/test/dummy/tmp/visual_migrate_tmp.rb +10 -0
  202. data/test/fixtures/visual_migrate/schema_migrations.yml +11 -0
  203. data/test/integration/navigation_test.rb +10 -0
  204. data/test/models/visual_migrate/schema_migration_test.rb +9 -0
  205. data/test/test_helper.rb +15 -0
  206. data/test/visual_migrate_test.rb +7 -0
  207. metadata +487 -0
@@ -0,0 +1,104 @@
1
+ # -*- coding: utf-8 -*-
2
+ # To change this template, choose Tools | Templates
3
+ # and open the template in the editor.
4
+
5
+ require 'func_filter'
6
+
7
+ class MethodFilter < Ripper::Filter
8
+ attr_accessor :mclass, :method_str, :funcs_str, :func_filters
9
+
10
+ def initialize(src, mclass)
11
+ super src
12
+
13
+ @method_str = ''
14
+ @funcs_str = Array.new
15
+ @mclass = mclass
16
+ @func_filters = Array.new
17
+ @is_method = false
18
+ @is_func = false
19
+ @is_do = false
20
+ end
21
+
22
+ def add_tok tok
23
+ if @is_func
24
+ @funcs_str[-1] += tok
25
+ elsif @is_method
26
+ @method_str += tok
27
+ end
28
+ end
29
+
30
+ def on_default(event, tok, f)
31
+ add_tok tok
32
+ end
33
+
34
+ def on_kw(tok, f)
35
+ if tok == 'def'
36
+ @is_method = true
37
+ @is_func = false
38
+ end
39
+
40
+ if tok == 'do'
41
+ if !@is_do
42
+ @is_do = true
43
+ end
44
+ end
45
+
46
+ if tok == 'end'
47
+ if @is_do
48
+ add_tok tok
49
+ @is_do = false
50
+ elsif @is_func
51
+ add_tok tok
52
+ @is_func = false
53
+ elsif @is_method
54
+ index = 0
55
+ @mclass.funcs.each do |func|
56
+ @func_filters << FuncFilterFactory.get(func, @funcs_str[index])
57
+ @func_filters.last.parse
58
+ index += 1
59
+ end
60
+ @is_method = false
61
+ end
62
+ end
63
+
64
+ add_tok tok
65
+ end
66
+
67
+ def on_ident(tok, f)
68
+ if !@method_name.nil? && MigrationDefs::FuncName.has_key?(tok)
69
+ @func_type = tok
70
+ @is_func = true
71
+ @funcs_str << ''
72
+ elsif !@func_type.nil?
73
+ @func_class = @mclass.add_func(@func_type, tok)
74
+ @func_type = nil
75
+ elsif MigrationDefs::MethodName.include?(tok)
76
+ @method_name = tok
77
+ end
78
+ add_tok tok
79
+ end
80
+
81
+ def on_nl(tok, f)
82
+ @is_func = false if !@is_do
83
+ Rails.logger.debug "on_nl2-----#{@is_do.inspect} / #{@is_func.to_s} / #{@is_method.to_s}-----"
84
+ end
85
+
86
+ def on_lbrase(tok, f)
87
+ if !@is_func
88
+ @is_func = true
89
+ elsif !@is_do
90
+ @is_do = true
91
+ end
92
+ add_tok tok
93
+ end
94
+
95
+ def on_rbrase(tok, f)
96
+ if @is_do
97
+ @is_do = false
98
+ elsif @is_func
99
+ @is_func = false
100
+ end
101
+ add_tok tok
102
+ end
103
+
104
+ end
@@ -0,0 +1,626 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module MigrationDefs
4
+ MethodName = ['change', 'up', 'down']
5
+
6
+ FuncName = {
7
+ 'create_table' => 'テーブルの作成',
8
+ 'rename_table' => 'テーブル名を変更',
9
+ 'drop_table' => 'テーブルの削除',
10
+ #'change_table' => 'テーブル定義を変更',#not support
11
+ 'add_column' => 'カラムの追加',
12
+ 'rename_column' => 'カラム名の変更',
13
+ 'change_column' => 'カラムの変更カラムの変更',
14
+ 'remove_column' => 'カラムの削除',
15
+ #'remove_columns' => '複数のカラムを削除',#not support
16
+ 'change_column_default' => 'カラムの初期値を設定',
17
+ 'add_index' => 'インデックスの追加',
18
+ 'rename_index' => 'インデックスの変更',
19
+ 'remove_index' => 'インデックスの削除',
20
+ #'timestamps' => 'created_atとupdated_atを生成',#@create_table
21
+ 'add_timestamps' => 'created_atとupdated_atを追加',
22
+ 'remove_timestamps' => 'created_atとupdated_atの削除',
23
+ }
24
+
25
+ ColumnType = {
26
+ 'string' => '文字列',
27
+ 'text' => '長い文字列',
28
+ 'integer' => '整数',
29
+ 'float' => '浮動小数',
30
+ 'decimal' => '精度の高い小数',
31
+ 'datetime' => '日時',
32
+ 'timestamp' => 'より細かい日時',
33
+ 'time' => '時間',
34
+ 'date' => '日付',
35
+ 'binary' => 'バイナリデータ',
36
+ 'boolean' => 'Boolean型',
37
+ 'timestamps' => 'レコードの作成・更新日時',
38
+ 'attachment' => 'attachment',
39
+ }
40
+
41
+ class MigrationClass
42
+ attr_accessor :name, :parent, :methods
43
+
44
+ def initialize(name, parent_name = nil)
45
+ @name = name
46
+ @parent = parent_name
47
+ @methods = Hash.new
48
+ end
49
+
50
+ def parse_from_params(parse_params)
51
+ return '' if parse_params[:methods].nil?
52
+
53
+ parse_params[:methods].each do |key, val|
54
+ add_method(key) if val[:enable] == 'true'
55
+ end
56
+ parse_params[:methods].each do |p_key, p_val|#not DRY
57
+ @methods.each do |m_key, m_val|
58
+ m_val.parse_from_params(p_val) if p_key == m_key
59
+ end
60
+ end
61
+ end
62
+
63
+ def add_method(name)
64
+ @methods[name] = MigrationMethod.new(name)
65
+ end
66
+
67
+ def get_str
68
+ return if @name.nil?
69
+
70
+ result = 'class ' + @name + (@parent.nil? ? '' : '< ' + @parent) + "\n"
71
+ @methods.each do |key, val|
72
+ result += val.get_str
73
+ end
74
+ result += "end\n"
75
+ end
76
+ end
77
+
78
+ class AbstractMigrationClass
79
+ #abstract_method :get_str, '(str -> String)' #undefined method `abstract_method' for MigrationDefs::AbstractMigrationClass:Class
80
+ #abstract_method :parse_from_params, '(str -> String)'
81
+ end
82
+
83
+ class MigrationMethod < AbstractMigrationClass
84
+ attr_accessor :name, :funcs
85
+
86
+ def initialize(name)
87
+ return nil if !MethodName.include? name
88
+
89
+ @name = name
90
+ @funcs = Array.new
91
+ end
92
+
93
+ def add_func(name, func_name, *func_options)
94
+ @funcs << FuncFactory::get(name, func_name, func_options)
95
+ end
96
+
97
+ def parse_from_params(parse_params)
98
+ return '' if parse_params[:funcs].nil?
99
+
100
+ parse_params[:funcs].each do |val|
101
+ add_func(val[:name], val[:table_name]) if val[:delete] != 'true'
102
+ end
103
+ index = 0
104
+ parse_params[:funcs].each do |val|#not DRY
105
+ if val[:delete] != 'true'
106
+ @funcs[index].parse_from_params(val)
107
+ index += 1
108
+ end
109
+ end
110
+ end
111
+
112
+ def get_str
113
+ result = "def #{@name}\n"
114
+ @funcs.each do |func|
115
+ result += func.get_str if !func.nil?
116
+ end
117
+ result += "end\n"
118
+ end
119
+ end
120
+
121
+ class FuncFactory
122
+ def self.get(func_type, func_name, *func_options)#How do I dynamic params?
123
+ case func_type
124
+ when 'create_table'
125
+ return CreateTableFunc.new(func_name)
126
+ when 'rename_table'
127
+ return RenameTableFunc.new(func_name)
128
+ when 'drop_table'
129
+ return DropTableFunc.new(func_name)
130
+ when 'add_column'
131
+ return AddColumnFunc.new(func_name)
132
+ when 'rename_column'
133
+ return RenameColumnFunc.new(func_name)
134
+ when 'change_column'
135
+ return ChangeColumnFunc.new(func_name)
136
+ when 'remove_column'
137
+ return RemoveColumnFunc.new(func_name)
138
+ when 'change_column_default'
139
+ return ChangeColumnDefaultFunc.new(func_name)
140
+ when 'add_index'
141
+ return AddIndexFunc.new(func_name)
142
+ when 'rename_index'
143
+ return RenameIndexFunc.new(func_name)
144
+ when 'remove_index'
145
+ return RemoveIndexFunc.new(func_name)
146
+ when 'add_timestamps'
147
+ return AddTimestampsFunc.new(func_name)
148
+ when 'remove_timestamps'
149
+ return RemoveTimestampsFunc.new(func_name)
150
+ else
151
+ return nil
152
+ end
153
+ end
154
+ end
155
+
156
+ class ColumnOption < AbstractMigrationClass
157
+ attr_accessor :limit, :default, :null, :precision, :scale
158
+
159
+ Description = {
160
+ 'limit' => 'カラムの桁数',
161
+ 'default' => 'デフォルトの値',
162
+ 'null' => 'nullを許可するか',
163
+ 'precision' => '数値の桁数',
164
+ 'scale' => '小数点以下の桁数',
165
+ }
166
+
167
+ def initialize(limit = nil, default = nil, is_null = true, precision = nil, scale = nil)
168
+ @limit = limit
169
+ @default = default
170
+ @null = is_null
171
+ @precision = precision
172
+ @scale = scale
173
+ end
174
+
175
+ def get_str
176
+ result = ''
177
+ result += ", :limit => #{@limit.to_s}" if !@limit.blank? && @limit != 0
178
+ result += ", :default => #{@default.to_s}" if !@default.blank?
179
+ result += ", :null => #{false.to_s}" if !@null
180
+ result += ", :precision => #{@precision.to_s}" if !@precision.nil? && @precision != 0
181
+ result += ", :scale => #{@scale.to_s}" if !@scale.nil? && @scale != 0
182
+ result
183
+ end
184
+ end
185
+
186
+ class Column < AbstractMigrationClass
187
+ attr_accessor :name, :type, :option
188
+
189
+ def initialize(type, name = '', *p_option)
190
+ return nil if !ColumnType.has_key?(type)
191
+
192
+ @type = type
193
+ @name = name
194
+ @option = ColumnOption.new
195
+ end
196
+
197
+ def set_option(key, val)
198
+ case key
199
+ when 'limit'
200
+ @option.limit = val.to_i
201
+ when 'default'
202
+ @option.default = val
203
+ when 'null'
204
+ @option.null = (val == 'true')
205
+ when 'precision'
206
+ @option.precision = val.to_i
207
+ when 'scale'
208
+ @option.scale = val.to_i
209
+ end
210
+ end
211
+
212
+ def get_str(prefix = 't.')
213
+ result = prefix + @type
214
+ result += " :#{@name}" if (@type != 'timestamps') && (@type != 'attachment')
215
+ result += @option.get_str
216
+ end
217
+ end
218
+
219
+ class CreateTableOption < AbstractMigrationClass
220
+ attr_accessor :id, :primary_key, :options, :temporary, :force
221
+
222
+ Description = {
223
+ 'id' => '主キーを自動生成',
224
+ 'primary_key' => '主キーのカラムの名前',
225
+ 'options' => 'テーブルオプション',
226
+ 'temporary' => '一時テーブルとして作成',
227
+ 'force' => 'テーブルを作成前に、既存のテーブルを削除',
228
+ }
229
+
230
+ def initialize(id = true, primary_key = 'id', options = nil, temporary = false, force = false)
231
+ @id = id
232
+ @primary_key = primary_key
233
+ @options = options
234
+ @temporary = temporary
235
+ @force = force
236
+ end
237
+
238
+ def set_option(key, val)
239
+ case key
240
+ when 'id'
241
+ @id = (val == 'true')
242
+ when 'primary_key'
243
+ @primary_key = val
244
+ when 'options'
245
+ @options = val
246
+ when 'temporary'
247
+ @temporary = (val == 'true')
248
+ when 'force'
249
+ @force = (val == 'true')
250
+ end
251
+ end
252
+
253
+ def get_str
254
+ result = ''
255
+ result += ", :id => #{@id.to_s}" if !@id.nil? && !@id
256
+ result += ", :primary_key => #{@primary_key}" if @primary_key != 'id'
257
+ result += ", :options => #{@options}" if !@options.nil? && !@options.blank?
258
+ result += ", :temporary => #{@temporary.to_s}" if !@temporary.nil? && @temporary != false
259
+ result += ", :force => #{@force.to_s}" if !@force.nil? && @force != true
260
+ result
261
+ end
262
+ end
263
+
264
+ class CreateTableFunc < AbstractMigrationClass
265
+ attr_accessor :name, :option, :columns
266
+
267
+ def initialize(name)
268
+ @name = name
269
+ @option = CreateTableOption.new
270
+ @columns = Array.new
271
+ end
272
+
273
+ def add_column(type, name = '')
274
+ @columns << Column.new(type, name)
275
+ @columns.last
276
+ end
277
+
278
+ def parse_from_params(parse_params)
279
+ return '' if parse_params.nil? || parse_params[:columns].nil?
280
+
281
+ parse_params.each do |key, val|
282
+ @option.set_option(key, val)
283
+ end
284
+
285
+ parse_params[:columns].each do |key, val|
286
+ next if val.nil?
287
+
288
+ if (val[:type] != 'timestamps') && (val[:type] != 'attachment')
289
+ c = add_column(val[:type], val[:name])
290
+ c.set_option 'limit', val[:limit]
291
+ c.set_option 'default', val[:default]
292
+ c.set_option 'null', val[:null]
293
+ c.set_option 'precision', val[:precision]
294
+ c.set_option 'scale', val[:scale]
295
+ else
296
+ c = add_column(val[:type])
297
+ end
298
+ end
299
+ end
300
+
301
+ def get_str
302
+ result = "create_table :#{@name}"
303
+ result += @option.get_str if !@option.nil?
304
+ result += " do |t|\n"
305
+ @columns.each do |col|
306
+ result += col.get_str + "\n" if !col.nil?
307
+ end
308
+ result += "end\n"
309
+ end
310
+ end
311
+
312
+ class RenameTableFunc < AbstractMigrationClass
313
+ attr_accessor :name, :new_name
314
+
315
+ def initialize(name)
316
+ @name = name
317
+ end
318
+
319
+ def add_new_name(new_name)
320
+ @new_name = new_name
321
+ end
322
+
323
+ def parse_from_params(parse_params)
324
+ @new_name = parse_params[:new_table_name]
325
+ end
326
+
327
+ def get_str
328
+ "rename_table :#{@name}" + (@new_name.blank? ? '' : ":#{@new_name}") + "\n"
329
+ end
330
+ end
331
+
332
+ class DropTableFunc < AbstractMigrationClass
333
+ attr_accessor :name
334
+
335
+ def initialize(name)
336
+ @name = name
337
+ end
338
+
339
+ def parse_from_params(parse_params)
340
+ return ''
341
+ end
342
+
343
+ def get_str
344
+ 'drop_table :' + @name + "\n"
345
+ end
346
+ end
347
+
348
+ class AddColumnFunc < AbstractMigrationClass
349
+ attr_accessor :name, :column
350
+
351
+ def initialize(name)
352
+ @name = name
353
+ end
354
+
355
+ def add_column(type, name = '')
356
+ @column = Column.new(type, name)
357
+ end
358
+
359
+ def parse_from_params(parse_params)
360
+ if (parse_params[:type] != 'timestamps') && (parse_params[:type] != 'attachment')
361
+ @column = add_column(parse_params[:type], parse_params[:column])
362
+ @column.set_option 'limit', parse_params[:limit]
363
+ @column.set_option 'default', parse_params[:default]
364
+ @column.set_option 'null', parse_params[:null]
365
+ @column.set_option 'precision', parse_params[:precision]
366
+ @column.set_option 'scale', parse_params[:scale]
367
+ else
368
+ add_column(parse_params[:type])
369
+ end
370
+ end
371
+
372
+ def get_str
373
+ if @column.nil?
374
+ return "add_column :#{@name}\n"
375
+ else
376
+ if (@column.type != 'timestamps') && (@column.type != 'attachment')
377
+ return "add_column :#{@name}" + (@column.name.blank? ? "\n" : ", :#{@column.name}, :#{@column.type}#{@column.option.get_str}\n")
378
+ else
379
+ return "add_column :#{@name}, #{:@column.type}\n"
380
+ end
381
+ end
382
+ end
383
+ end
384
+
385
+ class RemoveColumnFunc < AbstractMigrationClass
386
+ attr_accessor :name, :column_name
387
+
388
+ def initialize(name)
389
+ @name = name
390
+ end
391
+
392
+ def add_column_name(column_name)
393
+ @column_name = column_name
394
+ end
395
+
396
+ def parse_from_params(parse_params)
397
+ @column_name = parse_params[:column_name]
398
+ end
399
+
400
+ def get_str
401
+ "remove_column :#{@name}" + (@column_name.blank? ? '' : ", :#{@column_name}") + "\n"
402
+ end
403
+ end
404
+
405
+ class RenameColumnFunc < AbstractMigrationClass
406
+ attr_accessor :name, :column_name, :new_column_name
407
+
408
+ def initialize(name)
409
+ @name = name
410
+ end
411
+
412
+ def add_column_name(column_name)
413
+ @column_name = column_name
414
+ end
415
+
416
+ def add_new_column_name(column_name)
417
+ @new_column_name = column_name
418
+ end
419
+
420
+ def parse_from_params(parse_params)
421
+ @column_name = parse_params[:column_name]
422
+ @new_column_name = parse_params[:new_column_name]
423
+ end
424
+
425
+ def get_str
426
+ "rename_column :#{@name}" + (@column_name.blank? ? '' : ", :#{@column_name}") + (@new_column_name.blank? ? '' : ", :#{@new_column_name}") + "\n"
427
+ end
428
+ end
429
+
430
+ class ChangeColumnFunc < AddColumnFunc
431
+ def get_str
432
+ if @column.nil?
433
+ return "change_column :#{@name}\n"
434
+ else
435
+ if (@column.type != 'timestamps') && (@column.type != 'attachment')
436
+ return "change_column :#{@name}" + (@column.name.blank? ? "\n" : ", :#{@column.name}, :#{@column.type}#{@column.option.get_str}\n")
437
+ else
438
+ return "change_column :#{@name}, #{:@column.type}\n"
439
+ end
440
+ end
441
+ end
442
+ end
443
+
444
+ class ChangeColumnDefaultFunc < AbstractMigrationClass
445
+ attr_accessor :name, :column_name, :default
446
+
447
+ def initialize(name)
448
+ @name = name
449
+ end
450
+
451
+ def add_column_name(column_name)
452
+ @column_name = column_name
453
+ end
454
+
455
+ def set_column_default(default)
456
+ @default = default
457
+ end
458
+
459
+ def parse_from_params(parse_params)
460
+ Rails.logger.debug parse_params.inspect
461
+ @column_name = parse_params[:column_name]
462
+ @default = parse_params[:default]
463
+ end
464
+
465
+ def get_str
466
+ "change_column_default :#{@name}" + (@column_name.blank? ? '' : ", :#{@column_name}") + (@default.blank? ? '' : ", #{@default}") + "\n"
467
+ end
468
+ end
469
+
470
+ class IndexOption < AbstractMigrationClass
471
+ attr_accessor :name, :unique, :length
472
+
473
+ Description = {
474
+ 'name' => 'インデックスの名前',
475
+ 'unique' => 'ユニークなインデックス',
476
+ 'length' => 'インデックスに含まれるカラムの長さ',
477
+ }
478
+
479
+ def initialize(name = "''", unique = nil, length = nil)
480
+ @name = name
481
+ @unique = unique
482
+ @length = length
483
+ end
484
+
485
+ def set_option(key, val)
486
+ case key
487
+ when 'name'
488
+ @name = val
489
+ when 'unique'
490
+ @unique = (val == 'true')
491
+ when 'length'
492
+ @length = !val.blank? ? val.to_i : nil
493
+ end
494
+ end
495
+
496
+ def get_str
497
+ result = ''
498
+ result += ", :name => #{@name}" if !@name.nil? && !@name.blank?
499
+ result += ", :unique => #{@unique.to_s}" if !@unique.nil?
500
+ result += ", :length => #{@length.to_s}" if !@length.nil?
501
+ result
502
+ end
503
+ end
504
+
505
+ class AddIndexFunc < AbstractMigrationClass
506
+ attr_accessor :name, :columns, :option
507
+
508
+ def initialize(name)
509
+ @name = name
510
+ @columns = '[]'
511
+ @option = IndexOption.new
512
+ end
513
+
514
+ def set_columns(val)
515
+ @columns = val
516
+ end
517
+
518
+ def parse_from_params(parse_params)
519
+ @columns = set_columns(parse_params[:columns])
520
+ @option.set_option 'name', parse_params[:index_name]
521
+ @option.set_option 'unique', parse_params[:unique]
522
+ @option.set_option 'length', parse_params[:length]
523
+ end
524
+
525
+ def get_str
526
+ result = 'add_index '
527
+ result += " :#{@name}" if !@name.nil? && !@name.blank?
528
+ result += ", #{@columns}" if !@columns.nil? && !@columns.blank?
529
+ result += " #{@option.get_str}"
530
+ result += "\n"
531
+ result
532
+ end
533
+ end
534
+
535
+ class RemoveIndexOption < AbstractMigrationClass
536
+ attr_accessor :name, :column
537
+
538
+ Description = {
539
+ 'name' => 'インデックスの名前',
540
+ 'column' => 'カラム',
541
+ }
542
+
543
+ def initialize(name = "''", column = "[]")
544
+ @name = name
545
+ @column = column
546
+ end
547
+
548
+ def set_option(key, val)
549
+ case key
550
+ when 'name'
551
+ @name = val
552
+ when 'column'
553
+ @column = val
554
+ end
555
+ end
556
+
557
+ def get_str
558
+ result = ''
559
+ result += ", :name => #{@name}" if !@name.nil? && !@name.blank?
560
+ result += ", :column => #{@column}" if !@column.nil? && !@column.blank?
561
+ result
562
+ end
563
+ end
564
+
565
+ class RemoveIndexFunc < AbstractMigrationClass
566
+ attr_accessor :name, :option
567
+
568
+ def initialize(name)
569
+ @name = name
570
+ @option = RemoveIndexOption.new
571
+ end
572
+
573
+ def parse_from_params(parse_params)
574
+ @option.set_option 'name', parse_params[:index_name]
575
+ @option.set_option 'column', parse_params[:columns]
576
+ end
577
+
578
+ def get_str
579
+ return "remove_index :#{@name} #{@option.get_str}\n"
580
+ end
581
+ end
582
+
583
+ class RenameIndexFunc < AbstractMigrationClass
584
+ attr_accessor :name, :index_name, :new_index_name
585
+
586
+ def initialize(name)
587
+ @name = name
588
+ @index_name = "''"
589
+ @new_index_name = "''"
590
+ end
591
+
592
+ def parse_from_params(parse_params)
593
+ @index_name = parse_params[:index_name]
594
+ @new_index_name = parse_params[:new_index_name]
595
+ end
596
+
597
+ def get_str
598
+ result = "rename_index :#{@name}"
599
+ result += ", #{@index_name}" if !@index_name.nil? && !@index_name.blank?
600
+ result += ", #{@new_index_name}" if !@new_index_name.nil? && !@new_index_name.blank?
601
+ result += "\n"
602
+ end
603
+ end
604
+
605
+ class AddTimestampsFunc < AbstractMigrationClass
606
+ attr_accessor :name
607
+
608
+ def initialize(name)
609
+ @name = name
610
+ end
611
+
612
+ def parse_from_params(parse_params)
613
+ end
614
+
615
+ def get_str
616
+ return "add_timestamps :#{@name}\n"
617
+ end
618
+ end
619
+
620
+ class RemoveTimestampsFunc < AddTimestampsFunc
621
+ def get_str
622
+ return "remove_timestamps :#{@name}\n"
623
+ end
624
+ end
625
+
626
+ end