visual_migrate 4.0.1.2

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