maglevrecord 0.0.3 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. data/.gitignore +35 -0
  2. data/.travis.yml +19 -0
  3. data/Gemfile +13 -0
  4. data/README.md +89 -0
  5. data/Rakefile +22 -0
  6. data/install.sh +238 -0
  7. data/lib/maglev_record/base.rb +10 -62
  8. data/lib/maglev_record/enumerable.rb +13 -24
  9. data/lib/maglev_record/errors.rb +10 -0
  10. data/lib/maglev_record/integration.rb +7 -0
  11. data/lib/maglev_record/maglev_record.rb +13 -0
  12. data/lib/maglev_record/maglev_support/active_support_patch.rb +31 -0
  13. data/lib/maglev_record/maglev_support/concern.rb +19 -0
  14. data/lib/maglev_record/maglev_support/maglev_support.rb +15 -0
  15. data/lib/maglev_record/maglev_support/secure_password.rb +39 -0
  16. data/lib/maglev_record/migration/loader.rb +38 -0
  17. data/lib/maglev_record/migration/migration.rb +142 -0
  18. data/lib/maglev_record/migration/migrator.rb +40 -0
  19. data/lib/maglev_record/migration/operations.rb +92 -0
  20. data/lib/maglev_record/migration.rb +5 -0
  21. data/lib/maglev_record/persistence.rb +23 -48
  22. data/lib/maglev_record/raketasks.rb +9 -0
  23. data/lib/maglev_record/read_write.rb +20 -10
  24. data/lib/maglev_record/rooted_base.rb +8 -0
  25. data/lib/maglev_record/rooted_enumerable.rb +25 -0
  26. data/lib/maglev_record/rooted_persistence.rb +36 -0
  27. data/lib/maglev_record/sensible.rb +28 -0
  28. data/lib/maglev_record/snapshot/change.rb +53 -0
  29. data/lib/maglev_record/snapshot/snapshot.rb +67 -0
  30. data/lib/maglev_record/snapshot/snapshotable.rb +58 -0
  31. data/lib/maglev_record/snapshot.rb +5 -0
  32. data/lib/maglev_record/tools/object_reference.rb +189 -0
  33. data/lib/maglev_record/tools/submodule_finder.rb +42 -0
  34. data/lib/maglev_record/tools.rb +2 -0
  35. data/lib/maglev_record.rb +60 -4
  36. data/lib/tasks/database.rake +38 -0
  37. data/maglevrecord.gemspec +17 -0
  38. data/rails/init.rb +1 -0
  39. data/test/_test_object_reference.rb +70 -0
  40. data/test/example_model.rb +26 -13
  41. data/test/migration/dummy_migrations/migration_1.rb +8 -0
  42. data/test/migration/dummy_migrations/migration_2.rb +8 -0
  43. data/test/migration/dummy_migrations/migration_3.rb +8 -0
  44. data/test/migration/migrations/migration_1.rb +12 -0
  45. data/test/migration/migrations/migration_2.rb +12 -0
  46. data/test/migration/migrations/migration_3.rb +12 -0
  47. data/test/migration/operation_setup.rb +91 -0
  48. data/test/migration/projects/project1/.gitignore +15 -0
  49. data/test/migration/projects/project1/Gemfile +43 -0
  50. data/test/migration/projects/project1/Gemfile.lock +114 -0
  51. data/test/migration/projects/project1/README.rdoc +261 -0
  52. data/test/migration/projects/project1/Rakefile +17 -0
  53. data/test/migration/projects/project1/app/assets/images/rails.png +0 -0
  54. data/test/migration/projects/project1/app/assets/javascripts/application.js +15 -0
  55. data/test/migration/projects/project1/app/assets/stylesheets/application.css +13 -0
  56. data/test/migration/projects/project1/app/controllers/application_controller.rb +3 -0
  57. data/test/migration/projects/project1/app/helpers/application_helper.rb +2 -0
  58. data/test/migration/projects/project1/app/mailers/.gitkeep +0 -0
  59. data/test/migration/projects/project1/app/models/.gitkeep +0 -0
  60. data/test/migration/projects/project1/app/views/layouts/application.html.erb +14 -0
  61. data/test/migration/projects/project1/config/application.rb +62 -0
  62. data/test/migration/projects/project1/config/boot.rb +6 -0
  63. data/test/migration/projects/project1/config/database.yml +25 -0
  64. data/test/migration/projects/project1/config/environment.rb +5 -0
  65. data/test/migration/projects/project1/config/environments/development.rb +37 -0
  66. data/test/migration/projects/project1/config/environments/production.rb +67 -0
  67. data/test/migration/projects/project1/config/initializers/backtrace_silencers.rb +7 -0
  68. data/test/migration/projects/project1/config/initializers/inflections.rb +15 -0
  69. data/test/migration/projects/project1/config/initializers/mime_types.rb +5 -0
  70. data/test/migration/projects/project1/config/initializers/secret_token.rb +7 -0
  71. data/test/migration/projects/project1/config/initializers/session_store.rb +8 -0
  72. data/test/migration/projects/project1/config/initializers/wrap_parameters.rb +14 -0
  73. data/test/migration/projects/project1/config/locales/en.yml +5 -0
  74. data/test/migration/projects/project1/config/routes.rb +58 -0
  75. data/test/migration/projects/project1/config.ru +4 -0
  76. data/test/migration/projects/project1/db/seeds.rb +7 -0
  77. data/test/migration/projects/project1/lib/assets/.gitkeep +0 -0
  78. data/test/migration/projects/project1/lib/tasks/.gitkeep +0 -0
  79. data/test/migration/projects/project1/log/.gitkeep +0 -0
  80. data/test/migration/projects/project1/public/404.html +26 -0
  81. data/test/migration/projects/project1/public/422.html +26 -0
  82. data/test/migration/projects/project1/public/500.html +25 -0
  83. data/test/migration/projects/project1/public/favicon.ico +0 -0
  84. data/test/migration/projects/project1/public/index.html +241 -0
  85. data/test/migration/projects/project1/public/robots.txt +5 -0
  86. data/test/migration/projects/project1/script/rails +6 -0
  87. data/test/migration/projects/project2/.gitignore +15 -0
  88. data/test/migration/projects/project2/Gemfile +44 -0
  89. data/test/migration/projects/project2/Gemfile.lock +115 -0
  90. data/test/migration/projects/project2/README.rdoc +261 -0
  91. data/test/migration/projects/project2/Rakefile +17 -0
  92. data/test/migration/projects/project2/app/assets/images/rails.png +0 -0
  93. data/test/migration/projects/project2/app/assets/javascripts/application.js +15 -0
  94. data/test/migration/projects/project2/app/assets/stylesheets/application.css +13 -0
  95. data/test/migration/projects/project2/app/controllers/application_controller.rb +3 -0
  96. data/test/migration/projects/project2/app/helpers/application_helper.rb +2 -0
  97. data/test/migration/projects/project2/app/mailers/.gitkeep +0 -0
  98. data/test/migration/projects/project2/app/models/.gitkeep +0 -0
  99. data/test/migration/projects/project2/app/models/project_model.rb +8 -0
  100. data/test/migration/projects/project2/app/views/layouts/application.html.erb +14 -0
  101. data/test/migration/projects/project2/config/application.rb +62 -0
  102. data/test/migration/projects/project2/config/boot.rb +6 -0
  103. data/test/migration/projects/project2/config/database.yml +25 -0
  104. data/test/migration/projects/project2/config/environment.rb +5 -0
  105. data/test/migration/projects/project2/config/environments/development.rb +37 -0
  106. data/test/migration/projects/project2/config/environments/production.rb +67 -0
  107. data/test/migration/projects/project2/config/initializers/backtrace_silencers.rb +7 -0
  108. data/test/migration/projects/project2/config/initializers/inflections.rb +15 -0
  109. data/test/migration/projects/project2/config/initializers/mime_types.rb +5 -0
  110. data/test/migration/projects/project2/config/initializers/secret_token.rb +7 -0
  111. data/test/migration/projects/project2/config/initializers/session_store.rb +8 -0
  112. data/test/migration/projects/project2/config/initializers/wrap_parameters.rb +14 -0
  113. data/test/migration/projects/project2/config/locales/en.yml +5 -0
  114. data/test/migration/projects/project2/config/routes.rb +58 -0
  115. data/test/migration/projects/project2/config.ru +4 -0
  116. data/test/migration/projects/project2/db/seeds.rb +7 -0
  117. data/test/migration/projects/project2/lib/assets/.gitkeep +0 -0
  118. data/test/migration/projects/project2/lib/tasks/.gitkeep +0 -0
  119. data/test/migration/projects/project2/log/.gitkeep +0 -0
  120. data/test/migration/projects/project2/migrations/migration_2013-04-Apr-23_17.31.38.rb +16 -0
  121. data/test/migration/projects/project2/migrations/migration_2013-04-Apr-23_17.31.52.rb +16 -0
  122. data/test/migration/projects/project2/migrations/migration_2013-04-Apr-23_17.32.07.rb +16 -0
  123. data/test/migration/projects/project2/public/404.html +26 -0
  124. data/test/migration/projects/project2/public/422.html +26 -0
  125. data/test/migration/projects/project2/public/500.html +25 -0
  126. data/test/migration/projects/project2/public/favicon.ico +0 -0
  127. data/test/migration/projects/project2/public/index.html +241 -0
  128. data/test/migration/projects/project2/public/robots.txt +5 -0
  129. data/test/migration/projects/project2/script/rails +6 -0
  130. data/test/migration/test_loader.rb +78 -0
  131. data/test/migration/test_migration.rb +127 -0
  132. data/test/migration/test_nonexistent_classes.rb +120 -0
  133. data/test/migration/test_operations_fit_together.rb +68 -0
  134. data/test/migration/test_project.rb +105 -0
  135. data/test/migration/test_project1.slow.rb +58 -0
  136. data/test/migration/test_project2.slow.rb +34 -0
  137. data/test/migration/test_remove.rb +219 -0
  138. data/test/migration/test_rename.rb +238 -0
  139. data/test/migration/test_scenario.rb +37 -0
  140. data/test/migration/todo.txt +17 -0
  141. data/test/more_asserts.rb +63 -0
  142. data/test/snapshot/test_snapshot.rb +99 -0
  143. data/test/snapshot/test_snapshot_attributes.slow.rb +57 -0
  144. data/test/snapshot/test_snapshot_classes.slow.rb +32 -0
  145. data/test/snapshot/test_snapshotable.rb +53 -0
  146. data/test/test_accessors.rb +46 -0
  147. data/test/test_active_model_like_interface.rb +1 -1
  148. data/test/test_model_timestamps.rb +22 -0
  149. data/test/test_more_asserts.rb +68 -0
  150. data/test/test_naming.rb +22 -0
  151. data/test/test_persistence.rb +127 -0
  152. data/test/test_query_interface.rb +20 -25
  153. data/test/test_sensibles.rb +38 -0
  154. data/test/test_validation.rb +20 -57
  155. data/todo.txt +1 -0
  156. data/update.sh +180 -0
  157. metadata +156 -12
  158. data/lib/maglev_record/model_not_saved_or_reset.rb +0 -15
  159. data/test/test_dirty_object.rb +0 -50
  160. data/test/test_maglev_record_base.rb +0 -22
  161. data/test/test_maglev_simple_persistance.rb +0 -45
@@ -0,0 +1,219 @@
1
+ ####
2
+ #
3
+ # Test Cases for removing
4
+ #
5
+ # - instance variables
6
+ #
7
+ # - attributes
8
+ #
9
+ # - classes
10
+ #
11
+
12
+ require "maglev_record"
13
+ require "migration/operation_setup"
14
+ require "more_asserts"
15
+ require 'time'
16
+
17
+ ################## remove instance_variable
18
+
19
+ class TestMigrationRemoveInstanceVariable < Test::Unit::TestCase
20
+
21
+ def setup
22
+ setup_migration_operations
23
+ Lecture.fill_with_examples
24
+ end
25
+
26
+ def migration1
27
+ MaglevRecord::Migration.new(Time.now, "remove instance variable") do
28
+ def up
29
+ Lecture.delete_instance_variable(:@lecturer)
30
+ end
31
+ end
32
+ end
33
+
34
+ def test_instance_variable_is_removed
35
+ migration1.do
36
+ assert_not Lecture.first.instance_variable_defined?(:@lecturer)
37
+ assert_nil Lecture.first.instance_variable_get(:@lecturer)
38
+ end
39
+
40
+ def migration2
41
+ MaglevRecord::Migration.new(Time.now, "delete instance variable") do
42
+ def up
43
+ @lecturers = []
44
+ Lecture.delete_instance_variable(:@lecturer) {
45
+ |lecturer|
46
+ # you could do some garbage collection help here
47
+ # inthis case we just save the contents of the variable
48
+ # to prove the block is called with the right argument
49
+ @lecturers << lecturer
50
+ }
51
+ end
52
+ def lecturers
53
+ @lecturers
54
+ end
55
+ end
56
+ end
57
+
58
+ def test_instance_variable_is_removed_with_block
59
+ migration2.do
60
+ assert_not Lecture.first.instance_variable_defined?(:@lecturer)
61
+ assert_nil Lecture.first.instance_variable_get(:@lecturer)
62
+ end
63
+
64
+ def test_block_is_called_with_deleted_content
65
+ lecturers = Lecture.collect{ |l| l.instance_variable_get(:@lecturer)}
66
+ migration = migration2
67
+ migration.do
68
+ assert_equal lecturers.sort, migration.lecturers.sort
69
+ end
70
+
71
+ def test_first_lecture_has_lecturer
72
+ assert Lecture.first.instance_variable_defined?(:@lecturer)
73
+ assert_not_nil Lecture.first.instance_variable_get(:@lecturer)
74
+ end
75
+
76
+ end
77
+
78
+ ################## remove attribute
79
+
80
+ class TestMigrationRemoveAttribute < Test::Unit::TestCase
81
+
82
+ def setup
83
+ setup_migration_operations
84
+ Lecture2.fill_with_examples
85
+ end
86
+
87
+ def migration1
88
+ MaglevRecord::Migration.new(Time.now, "remove attribute") do
89
+ def up
90
+ Lecture2.delete_attribute(:lecturer)
91
+ end
92
+ end
93
+ end
94
+
95
+ def test_attribute_is_removed
96
+ migration1.do
97
+ assert_nil Lecture2.first.lecturer
98
+ end
99
+
100
+ def migration2
101
+ MaglevRecord::Migration.new(Time.now, "remove attribute lecturer") do
102
+ def up
103
+ @lecturers = []
104
+ Lecture2.delete_attribute(:lecturer) {
105
+ |lecturer|
106
+ # you could do some garbage collection help here
107
+ # inthis case we just save the contents of the variable
108
+ # to prodo some garbage collection help
109
+ @lecturers << lecturer
110
+ }
111
+ end
112
+ def lecturers
113
+ @lecturers
114
+ end
115
+ end
116
+ end
117
+
118
+ def test_attribute_is_removed_with_block
119
+ migration2.do
120
+ assert_nil Lecture2.first.lecturer
121
+ end
122
+
123
+ def test_block_is_called_with_deleted_content
124
+ lecturers = Lecture2.collect{ |l| l.lecturer }
125
+ migration = migration2
126
+ migration.do
127
+ assert_equal lecturers.sort, migration.lecturers.sort
128
+ end
129
+
130
+ def test_first_lecture_has_lecturer
131
+ assert_not_nil Lecture2.first.lecturer
132
+ end
133
+
134
+ end
135
+
136
+ ################## remove classes
137
+
138
+ class TestMigrationRemoveClass < Test::Unit::TestCase
139
+
140
+ def setup
141
+ setup_migration_operations
142
+ end
143
+
144
+ def migration1
145
+ MaglevRecord::Migration.new(Time.now, "remove class Lecture") do
146
+ def up
147
+ delete_class(Lecture)
148
+ end
149
+ end
150
+ end
151
+
152
+ def test_class_is_not_present_after_deletion
153
+ migration1.do
154
+ assert_raise(NameError) {
155
+ Lecture
156
+ }
157
+ end
158
+
159
+ def test_objects_are_not_referenced_by_object_pool_after_deletion
160
+ object_pool = Lecture.object_pool
161
+ migration1.do
162
+ assert object_pool.empty?
163
+ end
164
+
165
+ def migration2
166
+ MaglevRecord::Migration.new(Time.now, "remove class Lecture") do
167
+ def up
168
+ @lectures = []
169
+ delete_class(Lecture) {
170
+ |lecture|
171
+ @lectures << lecture
172
+ }
173
+ end
174
+ def lectures
175
+ @lectures
176
+ end
177
+ end
178
+ end
179
+
180
+ def test_block_yields_all_instances_of_lecture
181
+ migration = migration2
182
+ instances = Lecture.all
183
+ migration.do
184
+ assert_equal instances.sort, migration.lectures.sort
185
+ end
186
+
187
+ def test_object_pool_is_existent_before_delete
188
+ pool_dict = Maglev::PERSISTENT_ROOT[MaglevRecord::PERSISTENT_ROOT_KEY]
189
+ object_pool = Lecture.object_pool
190
+ assert pool_dict.values.any?{|v| v.equal? object_pool}
191
+ # this test belongs to test_object_pool_removed_from_pool_dict
192
+ end
193
+
194
+ def test_object_pool_removed_from_pool_dict
195
+ pool_dict = Maglev::PERSISTENT_ROOT[MaglevRecord::PERSISTENT_ROOT_KEY]
196
+ object_pool = Lecture.object_pool
197
+ migration1.do
198
+ assert_not pool_dict.values.any?{|v| v.equal? object_pool}
199
+ end
200
+
201
+ def migration_remove_nested_class
202
+ MaglevRecord::Migration.new(Time.now, "remove class Lecture") do
203
+ def up
204
+ delete_class(Models::M1::Lecture)
205
+ end
206
+ end
207
+ end
208
+
209
+ def test_remove_nested_class
210
+ Models::M1::Lecture
211
+ migration_remove_nested_class.do
212
+ assert_raise(NameError){
213
+ Models::M1::Lecture
214
+ }
215
+ end
216
+
217
+
218
+ end
219
+
@@ -0,0 +1,238 @@
1
+ ####
2
+ #
3
+ # Test Cases for renaming
4
+ #
5
+ # - instance variables
6
+ #
7
+ # - attributes
8
+ #
9
+ # - classes
10
+ #
11
+
12
+
13
+
14
+
15
+ require "maglev_record"
16
+ require "migration/operation_setup"
17
+ require "more_asserts"
18
+ require 'time'
19
+
20
+
21
+ ################## rename instance variables
22
+
23
+ class TestMigrationRenameInstanceVariable < Test::Unit::TestCase
24
+
25
+ def setup
26
+ setup_migration_operations
27
+ Lecture.fill_with_examples
28
+ end
29
+
30
+ def m1
31
+ MaglevRecord::Migration.new(Time.now, "rename instance variable") do
32
+ def up
33
+ Lecture.rename_instance_variable(:@lecturer , :@lecturers) {
34
+ |lecturer|
35
+ [lecturer]
36
+ }
37
+ end
38
+ end
39
+ end
40
+
41
+ def test_rename_inst_var_with_block
42
+ lecturer = Lecture.first.instance_variable_get(:@lecturer)
43
+ m1.do
44
+ assert_equal Lecture.first.instance_variable_get(:@lecturers), [lecturer]
45
+ end
46
+
47
+ def test_lecturer_exists
48
+ assert_not_nil Lecture.first.instance_variable_get(:@lecturer)
49
+ end
50
+
51
+ def m2
52
+ MaglevRecord::Migration.new(Time.now, "rename instance variable") do
53
+ def up
54
+ Lecture.rename_instance_variable(:@users , :@attendees)
55
+ end
56
+ end
57
+ end
58
+
59
+ def test_rename_inst_var
60
+ users = Lecture.first.instance_variable_get(:@users)
61
+ m2.do
62
+ assert_equal Lecture.first.instance_variable_get(:@attendees), users
63
+ end
64
+
65
+ def test_users_exists
66
+ assert_not_nil Lecture.first.instance_variable_get(:@users)
67
+ end
68
+
69
+ def test_old_instance_variable_is_removed_after_renaming
70
+ m2.do
71
+ assert_not Lecture.first.instance_variable_defined?(:@users)
72
+ assert_nil Lecture.first.instance_variable_get(:@users)
73
+ end
74
+ end
75
+
76
+ ################## rename attributes
77
+
78
+
79
+ class TestMigrationRenameAttributes < Test::Unit::TestCase
80
+
81
+ def setup
82
+ setup_migration_operations
83
+ Lecture2.fill_with_examples
84
+ end
85
+
86
+ def m3
87
+ MaglevRecord::Migration.new(Time.now, "rename attribute") do
88
+ def up
89
+ Lecture2.rename_attribute(:lecturer , :lecturers) {
90
+ |lecturer|
91
+ [lecturer]
92
+ }
93
+ end
94
+ end
95
+ end
96
+
97
+ def test_rename_attribute_with_block
98
+ lecturer = Lecture2.first.lecturer
99
+ m3.do
100
+ assert_equal Lecture2.first.lecturers, [lecturer]
101
+ end
102
+
103
+ def test_attr_lecturer_exists
104
+ assert_not_nil Lecture2.first.lecturer
105
+ end
106
+
107
+ def m4
108
+ MaglevRecord::Migration.new(Time.now, "rename attribute") do
109
+ def up
110
+ Lecture2.rename_attribute(:users , :attendees)
111
+ end
112
+ end
113
+ end
114
+
115
+ def test_rename_attribute
116
+ users = Lecture2.first.users
117
+ m4.do
118
+ assert_equal Lecture2.first.attendees, users
119
+ end
120
+
121
+ def test_attr_users_exists
122
+ assert_not_nil Lecture2.first.users
123
+ assert_not_equal Lecture2.first.users, []
124
+ end
125
+
126
+ end
127
+
128
+ ################## rename classes
129
+
130
+ class TestMigrationRenameClass < Test::Unit::TestCase
131
+
132
+ def setup
133
+ setup_migration_operations
134
+ Lecture3.fill_with_examples
135
+ end
136
+
137
+ def migration
138
+ MaglevRecord::Migration.new(Time.now, "rename attribute") do
139
+ def up
140
+ rename_class Lecture3, :Lecture4
141
+ end
142
+ end
143
+ end
144
+
145
+ def test_objects_are_in_renamed_class
146
+ obj = Lecture3.first
147
+ migration.do
148
+ assert_equal Lecture4.first, obj
149
+ end
150
+
151
+ def test_class_has_objects
152
+ assert_not_equal Lecture3.all, []
153
+ end
154
+
155
+ def test_class_with_same_name_as_renamed_class_has_no_objects
156
+ migration.up
157
+ redefine_migration_classes
158
+ assert_equal Lecture3.all, []
159
+ end
160
+
161
+ def test_renamed_class_does_not_exist
162
+ migration.up
163
+ assert_raise(NameError) {
164
+ Lecture3
165
+ }
166
+ end
167
+
168
+ def test_unrenamed_classes_have_distinct_objects
169
+ Lecture3.each{ |lecture3|
170
+ assert_not_include? Lecture4.all, lecture3
171
+ }
172
+ end
173
+
174
+ def test_objects_are_of_renamed_class
175
+ assert_equal Lecture3.first.class, Lecture3
176
+ migration.do
177
+ assert_equal Lecture4.first.class, Lecture4
178
+ end
179
+
180
+ def test_objects_are_not_of_original_class
181
+ assert_equal Lecture3.first.class, Lecture3
182
+ migration.do
183
+ redefine_migration_classes
184
+ assert_not_equal Lecture4.first.class, Lecture3
185
+ end
186
+
187
+ def test_migration_changes_class_name
188
+ migration.do
189
+ assert_equal Lecture4.first.class.name, "Lecture4"
190
+ end
191
+
192
+ end
193
+
194
+ class TestNestingList < Test::Unit::TestCase
195
+
196
+ def setup
197
+ setup_migration_operations
198
+ end
199
+
200
+ def test_Lecture_is_not_nested
201
+ assert_equal Lecture.nesting_list, [Object, Lecture]
202
+ end
203
+
204
+ def test_Models_M1_Lecture_lists_submodules_in_nesting_list
205
+ assert_equal Models::M1::Lecture.nesting_list, [
206
+ Object, Models, Models::M1, Models::M1::Lecture]
207
+ end
208
+
209
+ def migration_rename_Lecture4
210
+ MaglevRecord::Migration.new(Time.now, "rename Lecture") do
211
+ def up
212
+ rename_class Lecture4, :Lecture5
213
+ end
214
+ end
215
+ end
216
+
217
+ def test_renamed_models_have_different_nesting_list
218
+ migration_rename_Lecture4.do
219
+ assert_equal Lecture5.nesting_list, [Object, Lecture5]
220
+ end
221
+
222
+ def migration_rename_nested_Lecture
223
+ MaglevRecord::Migration.new(Time.now, "rename Lecture") do
224
+ def up
225
+ rename_class Models::M1::Lecture, :Lecture3
226
+ end
227
+ end
228
+ end
229
+
230
+ def test_nested_renamed_class_has_different_nesting_list
231
+ migration_rename_nested_Lecture.do
232
+ assert_equal Models::M1::Lecture3.nesting_list, [
233
+ Object, Models, Models::M1, Models::M1::Lecture3 ]
234
+ end
235
+
236
+ end
237
+
238
+
@@ -0,0 +1,37 @@
1
+ require "more_asserts"
2
+ require "example_model"
3
+
4
+ class MigrationScenarioTest < Test::Unit::TestCase
5
+ Migration = MaglevRecord::Migration
6
+ MigrationLoader = MaglevRecord::MigrationLoader
7
+ Migrator = MaglevRecord::Migrator
8
+
9
+ attr_reader :loader
10
+
11
+ def setup
12
+ MaglevRecord.reset
13
+ RootedBook.clear
14
+ Maglev::PERSISTENT_ROOT[Migrator::MIGRATION_KEY] = Array.new
15
+ @loader = MigrationLoader.new
16
+ RootedBook.new(:title => "Harry Potter and the Philosopher's stone")
17
+ RootedBook.new(:title => "Harry Potter and the Chamber of Secrets")
18
+ RootedBook.new(:title => "Harry Potter and the Prisoner of Azkaban")
19
+ MaglevRecord.save
20
+ loader.load_directory(migration_directory)
21
+ end
22
+
23
+ def migration_directory
24
+ File.dirname(__FILE__) + '/migrations'
25
+ end
26
+
27
+ def test_migration_loader_loads_correct_number_of_migrations
28
+ assert_equal 3, loader.migration_list.size
29
+ end
30
+
31
+ def test_migration_loader
32
+ migration_list = loader.migration_list
33
+ migrator = Migrator.new(migration_list)
34
+ migrator.up
35
+ assert_equal "The most recent book title", RootedBook.first.title
36
+ end
37
+ end
@@ -0,0 +1,17 @@
1
+
2
+ TODO
3
+ ====
4
+
5
+ 2) from rooted base to base
6
+ 4) copy from one class to another
7
+ 5) rename class from submodule
8
+ 5) remove class from submodule
9
+
10
+ DONE
11
+ ====
12
+
13
+
14
+
15
+
16
+
17
+
@@ -0,0 +1,63 @@
1
+ require 'test/unit'
2
+ require 'maglev_record'
3
+
4
+
5
+ class Test::Unit::TestCase
6
+
7
+ def assert_not(bool, message = nil)
8
+ assert_equal false, bool, message
9
+ end
10
+
11
+ def assert_include?(array, element)
12
+ assert array.include?(element), "#{array}\n should include \n#{element}"
13
+ end
14
+
15
+ def assert_not_include?(array, element)
16
+ assert_not array.include?(element), "#{array}\n should include \n#{element}"
17
+ end
18
+
19
+
20
+ # run once before all tests
21
+ def self.startup
22
+ end
23
+
24
+ # run once after all tests
25
+ def self.shutdown
26
+ end
27
+
28
+ class << self
29
+ alias :old_suite :suite
30
+
31
+ def suite
32
+ mysuite = old_suite
33
+ #puts "suite: #{mysuite}"
34
+ def mysuite.run(*args)
35
+ @tests.first.class.startup() unless @tests.empty?
36
+ super
37
+ @tests.first.class.shutdown() unless @tests.empty?
38
+ end
39
+ mysuite
40
+ end
41
+ end
42
+
43
+ #
44
+ # make the class methods available as instance methods
45
+ #
46
+ def self.as_instance_method(*names)
47
+ names.each{ |name|
48
+ name = name.to_s
49
+ self.class_eval "def #{name}(*args); self.class.#{name}(*args);end"
50
+ }
51
+ end
52
+
53
+ end
54
+
55
+ # class MyTest < Test::Unit::TestCase
56
+ # def self.startup
57
+ # puts 'runs only once at start2'
58
+ # end
59
+ # def self.shutdown
60
+ # puts 'runs only once at end2'
61
+ # end
62
+ # end
63
+
@@ -0,0 +1,99 @@
1
+ require "maglev_record"
2
+ require "more_asserts"
3
+
4
+ class SnapshotTest < Test::Unit::TestCase
5
+
6
+ # the file with the content of what shell be snapshot
7
+ def self.module_file_path
8
+ # todo: pot this into a temp dir
9
+ 'module_content.rb'
10
+ end
11
+
12
+ # the file content that snapshots
13
+ def self.snapshot_content
14
+ <<-EOF
15
+ $LOAD_PATH << "lib"
16
+ require "rubygems"
17
+ require "maglev_record"
18
+ load "#{module_file_path}"
19
+ Maglev::PERSISTENT_ROOT['test_snapshot'] = MaglevRecord::Snapshot.new
20
+ Maglev.commit_transaction
21
+ EOF
22
+ end
23
+
24
+ # the path of the file that snapshots
25
+ def self.snapshot_file_path
26
+ filepath = 'caller_content.rb'
27
+ File.open(filepath, 'w') { |file| file.write(snapshot_content) }
28
+ filepath
29
+ end
30
+
31
+ #
32
+ # snapshot the program after the sting was executed
33
+ # returns the snapshot and aborts the transaction
34
+ #
35
+ def self.snapshot(module_content)
36
+ File.open(module_file_path, 'w') { |file| file.write(module_content) }
37
+ stone = Maglev::System.stone_name
38
+ command = "export MAGLEV_OPTS=\"-W0 --stone #{stone}\" && "
39
+ command += "bundle exec "
40
+ command += "maglev-ruby #{snapshot_file_path}"
41
+ IO.popen(command) { |f|
42
+ line = f.gets
43
+ status = 1 # $? does not work here so we work around
44
+ while not line.nil?
45
+ puts line
46
+ line = f.gets
47
+ end
48
+ status
49
+ }
50
+ Maglev.abort_transaction
51
+ Maglev::PERSISTENT_ROOT['test_snapshot']
52
+ end
53
+
54
+ def self.shutdown
55
+ File.delete(snapshot_file_path)
56
+ File.delete(module_file_path) if File.file?(module_file_path)
57
+ end
58
+
59
+ #
60
+ # compare two sources and return the MaglevRecord Snapshot
61
+ #
62
+ def self.compare(s1, s2)
63
+ s1 = snapshot(s1)
64
+ s2 = snapshot(s2)
65
+ s2.changes_since(s1) unless s1.nil? or s2.nil?
66
+ end
67
+
68
+ def self.class_string(name, content = '')
69
+ "class #{name}
70
+ include MaglevRecord::Base
71
+ self.maglev_record_persistable
72
+ # content follows
73
+ #{content}
74
+ # content ends
75
+ end"
76
+ end
77
+
78
+ def self.clean
79
+ Maglev.abort_transaction
80
+ consts = [:MyTestClass, :MyTestClass2]
81
+ Maglev.persistent do
82
+ consts.each { |const|
83
+ Object.remove_const(const) if Object.const_defined? const
84
+ }
85
+ end
86
+ Maglev.commit_transaction
87
+ end
88
+
89
+ as_instance_method :class_string, :compare, :snapshot, :clean
90
+
91
+ ############### Test
92
+
93
+ def test_class_string_include_class_name
94
+ s = class_string('MyTestClass123123', 'xxxx')
95
+ assert_include? s, 'class MyTestClass123123'
96
+ assert_include? s, 'xxxx'
97
+ end
98
+
99
+ end