my_enginery 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/.gitignore +18 -0
  2. data/.travis.yml +9 -0
  3. data/CHANGELOG.md +14 -0
  4. data/Gemfile +12 -0
  5. data/LICENSE +19 -0
  6. data/README.md +957 -0
  7. data/Rakefile +48 -0
  8. data/app/base/.pryrc +1 -0
  9. data/app/base/Gemfile +25 -0
  10. data/app/base/Rakefile +4 -0
  11. data/app/base/app.rb +8 -0
  12. data/app/base/base/boot.rb +45 -0
  13. data/app/base/base/config.rb +127 -0
  14. data/app/base/base/controllers/rear-controllers/.gitkeep +0 -0
  15. data/app/base/base/database.rb +3 -0
  16. data/app/base/base/helpers/application_helpers.rb +3 -0
  17. data/app/base/base/migrations/.gitkeep +0 -0
  18. data/app/base/base/models/.gitkeep +0 -0
  19. data/app/base/base/specs/.gitkeep +0 -0
  20. data/app/base/base/views/.gitkeep +0 -0
  21. data/app/base/config.ru +4 -0
  22. data/app/base/config/config.yml +17 -0
  23. data/app/base/public/assets/Enginery.png +0 -0
  24. data/app/base/public/assets/Espresso.png +0 -0
  25. data/app/base/public/assets/application.css +13 -0
  26. data/app/base/public/assets/application.js +2 -0
  27. data/app/base/public/assets/bootstrap/css/bootstrap-responsive.min.css +9 -0
  28. data/app/base/public/assets/bootstrap/css/bootstrap.min.css +9 -0
  29. data/app/base/public/assets/bootstrap/img/glyphicons-halflings-white.png +0 -0
  30. data/app/base/public/assets/bootstrap/img/glyphicons-halflings.png +0 -0
  31. data/app/base/public/assets/bootstrap/js/bootstrap.min.js +6 -0
  32. data/app/base/public/assets/jquery.js +6 -0
  33. data/app/base/var/db/.gitkeep +0 -0
  34. data/app/base/var/log/.gitkeep +0 -0
  35. data/app/base/var/pid/.gitkeep +0 -0
  36. data/app/database/ActiveRecord.rb +11 -0
  37. data/app/database/DataMapper.rb +11 -0
  38. data/app/database/Sequel.rb +11 -0
  39. data/app/database/mysql.yml +24 -0
  40. data/app/database/postgres.yml +24 -0
  41. data/app/database/sqlite.yml +24 -0
  42. data/app/gemfiles/ActiveRecord.rb +1 -0
  43. data/app/gemfiles/BlueCloth.rb +1 -0
  44. data/app/gemfiles/DataMapper.rb +1 -0
  45. data/app/gemfiles/FastCGI.rb +1 -0
  46. data/app/gemfiles/Puma.rb +1 -0
  47. data/app/gemfiles/RDiscount.rb +1 -0
  48. data/app/gemfiles/RDoc.rb +1 -0
  49. data/app/gemfiles/RedCloth.rb +1 -0
  50. data/app/gemfiles/WEBrick.rb +1 -0
  51. data/app/gemfiles/WikiCloth.rb +1 -0
  52. data/app/gemfiles/mysql/ActiveRecord.rb +1 -0
  53. data/app/gemfiles/mysql/DataMapper.rb +1 -0
  54. data/app/gemfiles/mysql/Sequel.rb +1 -0
  55. data/app/gemfiles/postgres/ActiveRecord.rb +1 -0
  56. data/app/gemfiles/postgres/DataMapper.rb +1 -0
  57. data/app/gemfiles/postgres/Sequel.rb +1 -0
  58. data/app/gemfiles/sqlite/ActiveRecord.rb +1 -0
  59. data/app/gemfiles/sqlite/DataMapper.rb +1 -0
  60. data/app/gemfiles/sqlite/Sequel.rb +1 -0
  61. data/app/layouts/ERB/layout.erb +56 -0
  62. data/app/layouts/Erubis/layout.erb +56 -0
  63. data/app/layouts/Haml/layout.haml +38 -0
  64. data/app/layouts/Slim/layout.slim +38 -0
  65. data/app/migrations/ActiveRecord.erb +51 -0
  66. data/app/migrations/DataMapper.erb +61 -0
  67. data/app/migrations/Sequel.erb +54 -0
  68. data/app/migrations/tracking_table/ActiveRecord.rb +19 -0
  69. data/app/migrations/tracking_table/DataMapper.rb +26 -0
  70. data/app/migrations/tracking_table/Sequel.rb +18 -0
  71. data/app/rakefiles/ActiveRecord.rb +0 -0
  72. data/app/rakefiles/DataMapper.rb +1 -0
  73. data/app/rakefiles/Sequel.rb +0 -0
  74. data/app/rakefiles/Specular.rb +1 -0
  75. data/app/specfiles/Specular.erb +7 -0
  76. data/bin/my_enginery +235 -0
  77. data/lib/enginery.rb +23 -0
  78. data/lib/enginery/cli.rb +44 -0
  79. data/lib/enginery/configurator.rb +139 -0
  80. data/lib/enginery/delete.rb +116 -0
  81. data/lib/enginery/enginery.rb +41 -0
  82. data/lib/enginery/generator.rb +325 -0
  83. data/lib/enginery/helpers/app.rb +83 -0
  84. data/lib/enginery/helpers/generic.rb +145 -0
  85. data/lib/enginery/helpers/input.rb +123 -0
  86. data/lib/enginery/helpers/orm.rb +86 -0
  87. data/lib/enginery/helpers/validations.rb +101 -0
  88. data/lib/enginery/migrator.rb +371 -0
  89. data/lib/enginery/rake-tasks/data_mapper.rb +49 -0
  90. data/lib/enginery/rake-tasks/specular.rb +41 -0
  91. data/lib/enginery/registry.rb +101 -0
  92. data/lib/enginery/usage.rb +66 -0
  93. data/lib/enginery/version.rb +7 -0
  94. data/logo.png +0 -0
  95. data/my_enginery.gemspec +37 -0
  96. data/test/delete/test__admin.rb +49 -0
  97. data/test/delete/test__controller.rb +37 -0
  98. data/test/delete/test__helper.rb +49 -0
  99. data/test/delete/test__migration.rb +27 -0
  100. data/test/delete/test__model.rb +35 -0
  101. data/test/delete/test__route.rb +35 -0
  102. data/test/delete/test__spec.rb +59 -0
  103. data/test/delete/test__view.rb +51 -0
  104. data/test/generator/test__admin.rb +39 -0
  105. data/test/generator/test__controller.rb +123 -0
  106. data/test/generator/test__helper.rb +56 -0
  107. data/test/generator/test__model.rb +206 -0
  108. data/test/generator/test__project.rb +81 -0
  109. data/test/generator/test__route.rb +110 -0
  110. data/test/generator/test__spec.rb +56 -0
  111. data/test/generator/test__view.rb +85 -0
  112. data/test/migrator/test__auto_generation.rb +41 -0
  113. data/test/migrator/test__manual_generation.rb +59 -0
  114. data/test/migrator/test__migrations.rb +139 -0
  115. data/test/sandbox/.gitkeep +0 -0
  116. data/test/setup.rb +29 -0
  117. data/test/support/spec_helpers.rb +151 -0
  118. metadata +392 -0
@@ -0,0 +1,59 @@
1
+ module Enginery
2
+ module Test
3
+ module DeleteSpec
4
+ Spec.new self do
5
+
6
+ Dir.chdir DST_ROOT do
7
+
8
+ is(new_app 'App').ok?
9
+
10
+ Dir.chdir 'App' do
11
+
12
+ entries = [
13
+ 'base/specs/foo/bar' + Enginery::SPEC_SUFFIX
14
+ ]
15
+ Should 'be deleted alongside controller' do
16
+ is(new_controller 'Foo').ok?
17
+ is(new_route 'Foo bar').ok?
18
+ entries.each do |e|
19
+ does(File).exists? e
20
+ end
21
+
22
+ is(delete_controller 'Foo').ok?
23
+ entries.each do |e|
24
+ refute(File).exists? e
25
+ end
26
+ end
27
+ Should 'be deleted alongside route' do
28
+ is(new_controller 'Foo').ok?
29
+ is(new_route 'Foo bar').ok?
30
+ entries.each do |e|
31
+ does(File).exists? e
32
+ end
33
+
34
+ is(delete_route 'Foo bar').ok?
35
+ entries.each do |e|
36
+ refute(File).exists? e
37
+ end
38
+ end
39
+ Should 'be deleted manually' do
40
+ delete_controller 'Foo'
41
+ is(new_controller 'Foo').ok?
42
+ is(new_route 'Foo bar').ok?
43
+ entries.each do |e|
44
+ does(File).exists? e
45
+ end
46
+
47
+ is(delete_spec 'Foo bar').ok?
48
+ entries.each do |e|
49
+ refute(File).exists? e
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,51 @@
1
+ module Enginery
2
+ module Test
3
+ module DeleteView
4
+ Spec.new self do
5
+ Dir.chdir DST_ROOT do
6
+
7
+ is(new_app 'App').ok?
8
+
9
+ Dir.chdir 'App' do
10
+
11
+ Testing 'with default engine' do
12
+ entries = [
13
+ 'base/views/foo/bar.erb',
14
+ ]
15
+
16
+ is(new_controller 'Foo').ok?
17
+ is(new_route 'Foo bar').ok?
18
+ entries.each do |e|
19
+ does(File).exists? e
20
+ end
21
+
22
+ is(delete_view 'Foo bar').ok?
23
+ entries.each do |e|
24
+ refute(File).exists? e
25
+ end
26
+ end
27
+
28
+ Testing 'with custom engine' do
29
+ entries = [
30
+ 'base/views/baz/bar.slim',
31
+ ]
32
+
33
+ is(new_controller 'Baz e:Slim').ok?
34
+ is(new_route 'Baz bar').ok?
35
+ entries.each do |e|
36
+ does(File).exists? e
37
+ end
38
+
39
+ is(delete_view 'Baz bar').ok?
40
+ entries.each do |e|
41
+ refute(File).exists? e
42
+ end
43
+ end
44
+
45
+ end
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,39 @@
1
+ module Enginery
2
+ module Test
3
+ module AdminGenerator
4
+
5
+ Spec.new self do
6
+ base_path = 'base/controllers/rear-controllers/'
7
+
8
+ Dir.chdir DST_ROOT do
9
+ is(new_app 'App').ok?
10
+
11
+ Dir.chdir 'App' do
12
+ is(new_model 'A').ok?
13
+ is(File).file? base_path + 'a' + ADMIN_SUFFIX
14
+
15
+ Should 'play well with namespaced models' do
16
+ is(new_model 'X::Y::Z').ok?
17
+ is(File).file? base_path + 'x/y/z' + ADMIN_SUFFIX
18
+ end
19
+
20
+ Testing 'manual generation' do
21
+ is(new_model 'B').ok?
22
+
23
+ file = base_path + 'b' + ADMIN_SUFFIX
24
+ is(File).file? file
25
+ # accidentally removing controller file...
26
+ FileUtils.rm file
27
+ refute(File).file? file
28
+
29
+ is(new_admin_controller 'B').ok?
30
+ is(File).file? file
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,123 @@
1
+ module Enginery
2
+ module Test
3
+ module ControllerGenerator
4
+ Spec.new self do
5
+
6
+ Should 'fail cause not inside Espresso application' do
7
+ does(new_controller 'Foo').fail_with? /not.*Espresso.*application/im
8
+ end
9
+
10
+ Dir.chdir DST_ROOT do
11
+ Testing do
12
+
13
+ is(new_app 'App').ok?
14
+
15
+ Dir.chdir 'App' do
16
+ Context 'creating controllers' do
17
+
18
+ Should 'create an unmapped controller' do
19
+ is(new_controller 'Foo').ok?
20
+
21
+ dir = 'base/controllers/foo'
22
+ is(File).directory? dir
23
+ file = dir + '_controller.rb'
24
+ is(File).file? file
25
+ expect(File.read file) =~ /class\s+Foo\s+<\s+E\n/
26
+ end
27
+
28
+ Should 'create a mapped controller' do
29
+ is(new_controller 'Bar r:bar').ok?
30
+
31
+ dir = 'base/controllers/bar'
32
+ is(File).directory? dir
33
+ file = dir + '_controller.rb'
34
+ is(File).file? file
35
+ expect(File.read file) =~ /map\s+\Wbar/m
36
+ end
37
+
38
+ Should 'create a controller with setups' do
39
+ is(new_controller 'Baz engine:Slim format:html').ok?
40
+
41
+ dir = 'base/controllers/baz'
42
+ is(File).directory? dir
43
+ file = dir + '_controller.rb'
44
+ is(File).file? file
45
+ code = File.read(file)
46
+ expect(code) =~ /format\s+\Whtml/m
47
+ expect(code) =~ /engine\s+:Slim/m
48
+ end
49
+
50
+ Should 'fail with "controller already exists"' do
51
+ does(new_controller 'Baz').fail_with? /controller already exists/i
52
+ end
53
+
54
+ Should 'correctly handle namespaces' do
55
+ is(new_controller 'A::B::C').ok?
56
+
57
+ dir = 'base/controllers/a/b/c'
58
+ is(File).directory? dir
59
+ file = dir + '_controller.rb'
60
+ is(File).file? file
61
+ code = File.read(file)
62
+ expect(code) =~ /module A/
63
+ expect(code) =~ /module B/
64
+ expect(code) =~ /class C < E/
65
+ end
66
+
67
+ end
68
+ end
69
+ end
70
+ cleanup
71
+
72
+ Should 'inherit engine defined at project generation' do
73
+ is(new_app 'App e:Slim').ok?
74
+
75
+ Dir.chdir 'App' do
76
+ is(new_controller 'Foo').ok?
77
+
78
+ is(File).file? 'base/views/foo/index.slim'
79
+
80
+ Should 'include modules provided via include: option' do
81
+ is(new_controller 'Bar i:Rack::Utils').ok?
82
+
83
+ file = 'base/controllers/bar_controller.rb'
84
+ is(File).file? file
85
+ does(File.read file) =~ /include Rack::Utils/
86
+ end
87
+ end
88
+ end
89
+ cleanup
90
+
91
+ Should 'create multiple controllers at once' do
92
+ is(new_app 'App').ok?
93
+
94
+ Dir.chdir 'App' do
95
+ are(new_controllers 'A B C X::Y::Z e:Slim').ok?
96
+
97
+ %w[a b c].each do |c|
98
+ dir = "base/controllers/#{c}"
99
+ is(File).directory? dir
100
+ file = dir + "_controller.rb"
101
+ is(File).file? file
102
+ expect {File.read file} =~ /class #{c} < E/i
103
+ is(File).file? "base/views/#{c}/index.slim"
104
+ end
105
+
106
+ And 'yet behave well with namespaces' do
107
+ dir = "base/controllers/x/y/z"
108
+ is(File).directory? dir
109
+ file = dir + "_controller.rb"
110
+ is(File).file? file
111
+ is(File).file? "base/views/x/y/z/index.slim"
112
+ end
113
+
114
+ end
115
+ end
116
+ cleanup
117
+
118
+ end
119
+
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,56 @@
1
+ module Enginery
2
+ module Test
3
+ module HelperGenerator
4
+
5
+ Spec.new self do
6
+
7
+ Dir.chdir DST_ROOT do
8
+ is(new_app 'App').ok?
9
+ Dir.chdir 'App' do
10
+ Should 'be auto-generated alongside controller' do
11
+ is(new_controller 'A').ok?
12
+ controller_file = 'base/controllers/a_controller.rb'
13
+ is(File).file? controller_file
14
+
15
+ Ensure 'it generated a helper file for A controller' do
16
+ helper_file = 'base/helpers/a.rb'
17
+ is(File).file? helper_file
18
+
19
+ Ensure 'generated helper include application helpers' do
20
+ does(File.read(helper_file)) =~ /include\s+Helpers/
21
+ end
22
+
23
+ Ensure 'controller include generated helper' do
24
+ does(File.read(controller_file)) =~ /include\s+AHelpers/
25
+ end
26
+ end
27
+
28
+ Should 'play well with namespaced controllers' do
29
+ is(new_controller 'X::Y::Z').ok?
30
+ is(File).file? 'base/helpers/x/y/z.rb'
31
+ end
32
+ end
33
+
34
+ Testing 'manual generation' do
35
+ is(new_controller 'B').ok?
36
+
37
+ helper_file = 'base/helpers/b.rb'
38
+ is(File).file? helper_file
39
+ FileUtils.rm helper_file
40
+ refute(File).file? helper_file
41
+
42
+ is(new_helper 'B').ok?
43
+ is(File).file? helper_file
44
+
45
+ Ensure 'generated helper include application helpers' do
46
+ does(File.read(helper_file)) =~ /include\s+Helpers/
47
+ end
48
+ end
49
+
50
+ end
51
+ end
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,206 @@
1
+ module Enginery
2
+ module Test
3
+ module ModelGenerator
4
+ Spec.new self do
5
+
6
+ Dir.chdir DST_ROOT do
7
+ Should 'generate a plain class cause no setups given' do
8
+ is(new_app 'App').ok?
9
+
10
+ Dir.chdir 'App' do
11
+ is(new_model 'Foo').ok?
12
+
13
+ file = 'base/models/foo.rb'
14
+ is(File).file? file
15
+ expect(File.read file) =~ /class\s+Foo\n/
16
+
17
+ Should 'correctly handle namespaces' do
18
+ is(new_model 'A::B::C').ok?
19
+
20
+ file = 'base/models/a/b/c.rb'
21
+ is(File).file? file
22
+ code = File.read(file)
23
+ expect(code) =~ /module A/
24
+ expect(code) =~ /module B/
25
+ expect(code) =~ /class C/
26
+ end
27
+
28
+ end
29
+ end
30
+ cleanup
31
+
32
+ Should 'use ORM defined at project generation' do
33
+ is(new_app 'App orm:DataMapper').ok?
34
+
35
+ Dir.chdir 'App' do
36
+ is(new_model 'Foo').ok?
37
+
38
+ file = 'base/models/foo.rb'
39
+ is(File).file? file
40
+ source_code = File.read file
41
+ does(source_code) =~ /class\s+Foo/
42
+ does(source_code) =~ /include\s+DataMapper/
43
+
44
+ Should 'generate multiple models' do
45
+
46
+ are(new_models 'Bar Baz X::Y::Z').ok?
47
+
48
+ %w[Bar Baz].each do |c|
49
+ file = "base/models/#{c.downcase}.rb"
50
+ is(File).file? file
51
+ expect {File.read file} =~ /class #{c}/i
52
+ end
53
+
54
+ And 'yet behave well with namespaces' do
55
+ file = "base/models/x/y/z.rb"
56
+ is(File).file? file
57
+ expect {File.read file} =~ /class Z/i
58
+ end
59
+
60
+ end
61
+
62
+ Should 'include modules provided via include: option' do
63
+ is(new_model 'BarBaz i:Rack::Utils').ok?
64
+
65
+ file = 'base/models/bar_baz.rb'
66
+ is(File).file? file
67
+ does(File.read file) =~ /include Rack::Utils/
68
+ end
69
+
70
+ end
71
+ end
72
+ cleanup
73
+ end
74
+ end
75
+
76
+ Spec.new self do
77
+ Dir.chdir DST_ROOT do
78
+
79
+ Should 'correctly handle ActiveRecord associations' do
80
+ is(new_app 'App orm:ar').ok?
81
+
82
+ Dir.chdir 'App' do
83
+ model_file = "base/models/foo.rb"
84
+
85
+ is(new_model 'Foo belongs_to:bar').ok?
86
+ does(model_file).contain? /belongs_to\W+bar/
87
+ is(delete_model 'Foo').ok?
88
+
89
+ is(new_model 'Foo has_one:bar').ok?
90
+ does(model_file).contain? /has_one\W+bar/i
91
+ is(delete_model 'Foo').ok?
92
+
93
+ is(new_model 'Foo has_one:bar:through:baz').ok?
94
+ does(model_file).contain? /has_one\W+bar\W+through\W+baz/i
95
+ is(delete_model 'Foo').ok?
96
+
97
+ is(new_model 'Foo has_many:bars').ok?
98
+ does(model_file).contain? /has_many\W+bars/i
99
+ is(delete_model 'Foo').ok?
100
+
101
+ is(new_model 'Foo has_many:bars:through:baz').ok?
102
+ does(model_file).contain? /has_many\W+bars\W+through\W+baz/i
103
+ is(delete_model 'Foo').ok?
104
+
105
+ is(new_model 'Foo has_and_belongs_to_many:bars').ok?
106
+ does(model_file).contain? /has_and_belongs_to_many\W+bars/i
107
+ is(delete_model 'Foo').ok?
108
+
109
+ Should 'handle multiple associations' do
110
+ is(new_model 'Foo belongs_to:bar belongs_to:baz has_many:related_bars').ok?
111
+ does(model_file).contain? /belongs_to\W+bar/
112
+ does(model_file).contain? /belongs_to\W+baz/
113
+ does(model_file).contain? /has_many\W+related_bars/
114
+ is(delete_model 'Foo').ok?
115
+
116
+ is(new_model 'Foo has_and_belongs_to_many:bars has_many:barz:through:baz').ok?
117
+ does(model_file).contain? /has_and_belongs_to_many\W+bars/i
118
+ does(model_file).contain? /has_many\W+barz\W+through\W+baz/i
119
+ is(delete_model 'Foo').ok?
120
+ end
121
+ end
122
+ end
123
+ cleanup
124
+
125
+ Should 'correctly handle DataMapper associations' do
126
+ is(new_app 'App orm:dm').ok?
127
+
128
+ Dir.chdir 'App' do
129
+ model_file = "base/models/foo.rb"
130
+
131
+ is(new_model 'Foo belongs_to:bar').ok?
132
+ does(model_file).contain? /belongs_to\W+bar/
133
+ is(delete_model 'Foo').ok?
134
+
135
+ is(new_model 'Foo has_one:bar').ok?
136
+ does(model_file).contain? /has\s+1\W+bar/i
137
+ is(delete_model 'Foo').ok?
138
+
139
+ is(new_model 'Foo has_one:bar:through:baz').ok?
140
+ does(model_file).contain? /has\s+1\W+bar\W+through\W+baz/i
141
+ is(delete_model 'Foo').ok?
142
+
143
+ is(new_model 'Foo has_many:bars').ok?
144
+ does(model_file).contain? /has\s+n\W+bars/i
145
+ is(delete_model 'Foo').ok?
146
+
147
+ is(new_model 'Foo has_many:bars:through:baz').ok?
148
+ does(model_file).contain? /has\s+n\W+bars\W+through\W+baz/i
149
+ is(delete_model 'Foo').ok?
150
+
151
+ is(new_model 'Foo has_and_belongs_to_many:bars').ok?
152
+ does(model_file).contain? /has\s+n\W+bars/i
153
+ is(delete_model 'Foo').ok?
154
+
155
+ Should 'handle multiple associations' do
156
+ is(new_model 'Foo belongs_to:bar has_many:related_bars').ok?
157
+ does(model_file).contain? /belongs_to\W+bar/
158
+ does(model_file).contain? /has\s+n\W+related_bars/
159
+ is(delete_model 'Foo').ok?
160
+
161
+ is(new_model 'Foo has_many:related_bars has_many:bars:through:related_bars').ok?
162
+ does(model_file).contain? /has\s+n\W+related_bars/
163
+ does(model_file).contain? /has\s+n\W+bars\W+through\W+related_bars/
164
+ is(delete_model 'Foo').ok?
165
+ end
166
+ end
167
+ end
168
+ cleanup
169
+
170
+ Should 'correctly handle Sequel associations' do
171
+ is(new_app 'App orm:sq').ok?
172
+
173
+ Dir.chdir 'App' do
174
+ model_file = "base/models/foo.rb"
175
+
176
+ is(new_model 'Foo belongs_to:bar').ok?
177
+ does(model_file).contain? /many_to_one\W+bar/
178
+ is(delete_model 'Foo').ok?
179
+
180
+ is(new_model 'Foo has_one:bar').ok?
181
+ does(model_file).contain? /one_to_one\W+bar/i
182
+ is(delete_model 'Foo').ok?
183
+
184
+ is(new_model 'Foo has_many:bars').ok?
185
+ does(model_file).contain? /one_to_many\W+bars/i
186
+ is(delete_model 'Foo').ok?
187
+
188
+ is(new_model 'Foo has_and_belongs_to_many:bars').ok?
189
+ does(model_file).contain? /many_to_many\W+bars/i
190
+ is(delete_model 'Foo').ok?
191
+
192
+ Should 'handle multiple associations' do
193
+ is(new_model 'Foo belongs_to:bar has_many:related_bars').ok?
194
+ does(model_file).contain? /many_to_one\W+bar/
195
+ does(model_file).contain? /one_to_many\W+related_bars/
196
+ is(delete_model 'Foo').ok?
197
+ end
198
+ end
199
+ end
200
+ cleanup
201
+ end
202
+
203
+ end
204
+ end
205
+ end
206
+ end