erails 2.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 (193) hide show
  1. data/CHANGELOG +3 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README +309 -0
  4. data/Rakefile +339 -0
  5. data/bin/about +4 -0
  6. data/bin/console +3 -0
  7. data/bin/dbconsole +3 -0
  8. data/bin/destroy +3 -0
  9. data/bin/erails +19 -0
  10. data/bin/generate +3 -0
  11. data/bin/performance/benchmarker +3 -0
  12. data/bin/performance/profiler +3 -0
  13. data/bin/performance/request +3 -0
  14. data/bin/plugin +3 -0
  15. data/bin/process/inspector +3 -0
  16. data/bin/process/reaper +3 -0
  17. data/bin/process/spawner +3 -0
  18. data/bin/runner +3 -0
  19. data/bin/server +3 -0
  20. data/builtin/rails_info/rails/info.rb +125 -0
  21. data/builtin/rails_info/rails/info_controller.rb +9 -0
  22. data/builtin/rails_info/rails/info_helper.rb +2 -0
  23. data/builtin/rails_info/rails_info_controller.rb +2 -0
  24. data/configs/apache.conf +40 -0
  25. data/configs/databases/frontbase.yml +28 -0
  26. data/configs/databases/mysql.yml +54 -0
  27. data/configs/databases/oracle.yml +39 -0
  28. data/configs/databases/postgresql.yml +48 -0
  29. data/configs/databases/sqlite2.yml +16 -0
  30. data/configs/databases/sqlite3.yml +19 -0
  31. data/configs/empty.log +0 -0
  32. data/configs/initializers/inflections.rb +10 -0
  33. data/configs/initializers/mime_types.rb +5 -0
  34. data/configs/initializers/new_rails_defaults.rb +17 -0
  35. data/configs/lighttpd.conf +54 -0
  36. data/configs/routes.rb +43 -0
  37. data/dispatches/dispatch.fcgi +24 -0
  38. data/dispatches/dispatch.rb +10 -0
  39. data/dispatches/gateway.cgi +97 -0
  40. data/doc/README_FOR_APP +2 -0
  41. data/environments/boot.rb +109 -0
  42. data/environments/development.rb +16 -0
  43. data/environments/environment.rb +71 -0
  44. data/environments/production.rb +22 -0
  45. data/environments/test.rb +22 -0
  46. data/fresh_rakefile +10 -0
  47. data/helpers/application.rb +15 -0
  48. data/helpers/application_helper.rb +3 -0
  49. data/helpers/test_helper.rb +38 -0
  50. data/html/404.html +30 -0
  51. data/html/422.html +30 -0
  52. data/html/500.html +30 -0
  53. data/html/favicon.ico +0 -0
  54. data/html/images/rails.png +0 -0
  55. data/html/index.html +274 -0
  56. data/html/javascripts/application.js +2 -0
  57. data/html/robots.txt +5 -0
  58. data/lib/code_statistics.rb +107 -0
  59. data/lib/commands/about.rb +3 -0
  60. data/lib/commands/console.rb +32 -0
  61. data/lib/commands/dbconsole.rb +67 -0
  62. data/lib/commands/destroy.rb +6 -0
  63. data/lib/commands/generate.rb +6 -0
  64. data/lib/commands/ncgi/listener +86 -0
  65. data/lib/commands/ncgi/tracker +69 -0
  66. data/lib/commands/performance/benchmarker.rb +24 -0
  67. data/lib/commands/performance/profiler.rb +50 -0
  68. data/lib/commands/performance/request.rb +6 -0
  69. data/lib/commands/plugin.rb +950 -0
  70. data/lib/commands/process/inspector.rb +68 -0
  71. data/lib/commands/process/reaper.rb +149 -0
  72. data/lib/commands/process/spawner.rb +219 -0
  73. data/lib/commands/process/spinner.rb +57 -0
  74. data/lib/commands/runner.rb +48 -0
  75. data/lib/commands/server.rb +39 -0
  76. data/lib/commands/servers/base.rb +31 -0
  77. data/lib/commands/servers/lighttpd.rb +94 -0
  78. data/lib/commands/servers/mongrel.rb +69 -0
  79. data/lib/commands/servers/new_mongrel.rb +16 -0
  80. data/lib/commands/servers/webrick.rb +66 -0
  81. data/lib/commands/update.rb +4 -0
  82. data/lib/commands.rb +17 -0
  83. data/lib/console_app.rb +30 -0
  84. data/lib/console_sandbox.rb +6 -0
  85. data/lib/console_with_helpers.rb +26 -0
  86. data/lib/dispatcher.rb +24 -0
  87. data/lib/fcgi_handler.rb +239 -0
  88. data/lib/initializer.rb +926 -0
  89. data/lib/rails/gem_builder.rb +21 -0
  90. data/lib/rails/gem_dependency.rb +129 -0
  91. data/lib/rails/mongrel_server/commands.rb +342 -0
  92. data/lib/rails/mongrel_server/handler.rb +55 -0
  93. data/lib/rails/plugin/loader.rb +152 -0
  94. data/lib/rails/plugin/locator.rb +100 -0
  95. data/lib/rails/plugin.rb +116 -0
  96. data/lib/rails/version.rb +9 -0
  97. data/lib/rails_generator/base.rb +263 -0
  98. data/lib/rails_generator/commands.rb +622 -0
  99. data/lib/rails_generator/generated_attribute.rb +42 -0
  100. data/lib/rails_generator/generators/applications/app/USAGE +9 -0
  101. data/lib/rails_generator/generators/applications/app/app_generator.rb +174 -0
  102. data/lib/rails_generator/generators/components/controller/USAGE +29 -0
  103. data/lib/rails_generator/generators/components/controller/controller_generator.rb +37 -0
  104. data/lib/rails_generator/generators/components/controller/templates/controller.rb +7 -0
  105. data/lib/rails_generator/generators/components/controller/templates/functional_test.rb +8 -0
  106. data/lib/rails_generator/generators/components/controller/templates/helper.rb +2 -0
  107. data/lib/rails_generator/generators/components/controller/templates/view.html.erb +2 -0
  108. data/lib/rails_generator/generators/components/integration_test/USAGE +8 -0
  109. data/lib/rails_generator/generators/components/integration_test/integration_test_generator.rb +16 -0
  110. data/lib/rails_generator/generators/components/integration_test/templates/integration_test.rb +10 -0
  111. data/lib/rails_generator/generators/components/mailer/USAGE +16 -0
  112. data/lib/rails_generator/generators/components/mailer/mailer_generator.rb +30 -0
  113. data/lib/rails_generator/generators/components/mailer/templates/fixture.erb +3 -0
  114. data/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -0
  115. data/lib/rails_generator/generators/components/mailer/templates/mailer.rb +15 -0
  116. data/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +21 -0
  117. data/lib/rails_generator/generators/components/mailer/templates/view.erb +3 -0
  118. data/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -0
  119. data/lib/rails_generator/generators/components/migration/USAGE +29 -0
  120. data/lib/rails_generator/generators/components/migration/migration_generator.rb +20 -0
  121. data/lib/rails_generator/generators/components/migration/templates/migration.rb +11 -0
  122. data/lib/rails_generator/generators/components/model/USAGE +27 -0
  123. data/lib/rails_generator/generators/components/model/model_generator.rb +45 -0
  124. data/lib/rails_generator/generators/components/model/templates/fixtures.yml +19 -0
  125. data/lib/rails_generator/generators/components/model/templates/migration.rb +16 -0
  126. data/lib/rails_generator/generators/components/model/templates/model.rb +2 -0
  127. data/lib/rails_generator/generators/components/model/templates/unit_test.rb +8 -0
  128. data/lib/rails_generator/generators/components/observer/USAGE +13 -0
  129. data/lib/rails_generator/generators/components/observer/observer_generator.rb +16 -0
  130. data/lib/rails_generator/generators/components/observer/templates/observer.rb +2 -0
  131. data/lib/rails_generator/generators/components/observer/templates/unit_test.rb +8 -0
  132. data/lib/rails_generator/generators/components/plugin/USAGE +25 -0
  133. data/lib/rails_generator/generators/components/plugin/plugin_generator.rb +39 -0
  134. data/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +20 -0
  135. data/lib/rails_generator/generators/components/plugin/templates/README +13 -0
  136. data/lib/rails_generator/generators/components/plugin/templates/Rakefile +22 -0
  137. data/lib/rails_generator/generators/components/plugin/templates/USAGE +8 -0
  138. data/lib/rails_generator/generators/components/plugin/templates/generator.rb +8 -0
  139. data/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -0
  140. data/lib/rails_generator/generators/components/plugin/templates/install.rb +1 -0
  141. data/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -0
  142. data/lib/rails_generator/generators/components/plugin/templates/tasks.rake +4 -0
  143. data/lib/rails_generator/generators/components/plugin/templates/uninstall.rb +1 -0
  144. data/lib/rails_generator/generators/components/plugin/templates/unit_test.rb +8 -0
  145. data/lib/rails_generator/generators/components/resource/USAGE +23 -0
  146. data/lib/rails_generator/generators/components/resource/resource_generator.rb +74 -0
  147. data/lib/rails_generator/generators/components/resource/templates/controller.rb +2 -0
  148. data/lib/rails_generator/generators/components/resource/templates/functional_test.rb +8 -0
  149. data/lib/rails_generator/generators/components/resource/templates/helper.rb +2 -0
  150. data/lib/rails_generator/generators/components/scaffold/USAGE +25 -0
  151. data/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +93 -0
  152. data/lib/rails_generator/generators/components/scaffold/templates/controller.rb +85 -0
  153. data/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +45 -0
  154. data/lib/rails_generator/generators/components/scaffold/templates/helper.rb +2 -0
  155. data/lib/rails_generator/generators/components/scaffold/templates/layout.html.erb +17 -0
  156. data/lib/rails_generator/generators/components/scaffold/templates/style.css +54 -0
  157. data/lib/rails_generator/generators/components/scaffold/templates/view_edit.html.erb +18 -0
  158. data/lib/rails_generator/generators/components/scaffold/templates/view_index.html.erb +24 -0
  159. data/lib/rails_generator/generators/components/scaffold/templates/view_new.html.erb +17 -0
  160. data/lib/rails_generator/generators/components/scaffold/templates/view_show.html.erb +10 -0
  161. data/lib/rails_generator/generators/components/session_migration/USAGE +10 -0
  162. data/lib/rails_generator/generators/components/session_migration/session_migration_generator.rb +18 -0
  163. data/lib/rails_generator/generators/components/session_migration/templates/migration.rb +16 -0
  164. data/lib/rails_generator/lookup.rb +249 -0
  165. data/lib/rails_generator/manifest.rb +53 -0
  166. data/lib/rails_generator/options.rb +150 -0
  167. data/lib/rails_generator/scripts/destroy.rb +30 -0
  168. data/lib/rails_generator/scripts/generate.rb +7 -0
  169. data/lib/rails_generator/scripts/update.rb +12 -0
  170. data/lib/rails_generator/scripts.rb +89 -0
  171. data/lib/rails_generator/secret_key_generator.rb +164 -0
  172. data/lib/rails_generator/simple_logger.rb +46 -0
  173. data/lib/rails_generator/spec.rb +44 -0
  174. data/lib/rails_generator.rb +43 -0
  175. data/lib/railties_path.rb +1 -0
  176. data/lib/ruby_version_check.rb +17 -0
  177. data/lib/rubyprof_ext.rb +35 -0
  178. data/lib/source_annotation_extractor.rb +102 -0
  179. data/lib/tasks/annotations.rake +23 -0
  180. data/lib/tasks/databases.rake +389 -0
  181. data/lib/tasks/documentation.rake +80 -0
  182. data/lib/tasks/framework.rake +105 -0
  183. data/lib/tasks/gems.rake +64 -0
  184. data/lib/tasks/log.rake +9 -0
  185. data/lib/tasks/misc.rake +57 -0
  186. data/lib/tasks/rails.rb +8 -0
  187. data/lib/tasks/routes.rake +17 -0
  188. data/lib/tasks/statistics.rake +18 -0
  189. data/lib/tasks/testing.rake +118 -0
  190. data/lib/tasks/tmp.rake +37 -0
  191. data/lib/test_help.rb +28 -0
  192. data/lib/webrick_server.rb +165 -0
  193. metadata +356 -0
data/html/index.html ADDED
@@ -0,0 +1,274 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html>
4
+ <head>
5
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
6
+ <title>Ruby on Rails: Welcome aboard</title>
7
+ <style type="text/css" media="screen">
8
+ body {
9
+ margin: 0;
10
+ margin-bottom: 25px;
11
+ padding: 0;
12
+ background-color: #f0f0f0;
13
+ font-family: "Lucida Grande", "Bitstream Vera Sans", "Verdana";
14
+ font-size: 13px;
15
+ color: #333;
16
+ }
17
+
18
+ h1 {
19
+ font-size: 28px;
20
+ color: #000;
21
+ }
22
+
23
+ a {color: #03c}
24
+ a:hover {
25
+ background-color: #03c;
26
+ color: white;
27
+ text-decoration: none;
28
+ }
29
+
30
+
31
+ #page {
32
+ background-color: #f0f0f0;
33
+ width: 750px;
34
+ margin: 0;
35
+ margin-left: auto;
36
+ margin-right: auto;
37
+ }
38
+
39
+ #content {
40
+ float: left;
41
+ background-color: white;
42
+ border: 3px solid #aaa;
43
+ border-top: none;
44
+ padding: 25px;
45
+ width: 500px;
46
+ }
47
+
48
+ #sidebar {
49
+ float: right;
50
+ width: 175px;
51
+ }
52
+
53
+ #footer {
54
+ clear: both;
55
+ }
56
+
57
+
58
+ #header, #about, #getting-started {
59
+ padding-left: 75px;
60
+ padding-right: 30px;
61
+ }
62
+
63
+
64
+ #header {
65
+ background-image: url("images/rails.png");
66
+ background-repeat: no-repeat;
67
+ background-position: top left;
68
+ height: 64px;
69
+ }
70
+ #header h1, #header h2 {margin: 0}
71
+ #header h2 {
72
+ color: #888;
73
+ font-weight: normal;
74
+ font-size: 16px;
75
+ }
76
+
77
+
78
+ #about h3 {
79
+ margin: 0;
80
+ margin-bottom: 10px;
81
+ font-size: 14px;
82
+ }
83
+
84
+ #about-content {
85
+ background-color: #ffd;
86
+ border: 1px solid #fc0;
87
+ margin-left: -11px;
88
+ }
89
+ #about-content table {
90
+ margin-top: 10px;
91
+ margin-bottom: 10px;
92
+ font-size: 11px;
93
+ border-collapse: collapse;
94
+ }
95
+ #about-content td {
96
+ padding: 10px;
97
+ padding-top: 3px;
98
+ padding-bottom: 3px;
99
+ }
100
+ #about-content td.name {color: #555}
101
+ #about-content td.value {color: #000}
102
+
103
+ #about-content.failure {
104
+ background-color: #fcc;
105
+ border: 1px solid #f00;
106
+ }
107
+ #about-content.failure p {
108
+ margin: 0;
109
+ padding: 10px;
110
+ }
111
+
112
+
113
+ #getting-started {
114
+ border-top: 1px solid #ccc;
115
+ margin-top: 25px;
116
+ padding-top: 15px;
117
+ }
118
+ #getting-started h1 {
119
+ margin: 0;
120
+ font-size: 20px;
121
+ }
122
+ #getting-started h2 {
123
+ margin: 0;
124
+ font-size: 14px;
125
+ font-weight: normal;
126
+ color: #333;
127
+ margin-bottom: 25px;
128
+ }
129
+ #getting-started ol {
130
+ margin-left: 0;
131
+ padding-left: 0;
132
+ }
133
+ #getting-started li {
134
+ font-size: 18px;
135
+ color: #888;
136
+ margin-bottom: 25px;
137
+ }
138
+ #getting-started li h2 {
139
+ margin: 0;
140
+ font-weight: normal;
141
+ font-size: 18px;
142
+ color: #333;
143
+ }
144
+ #getting-started li p {
145
+ color: #555;
146
+ font-size: 13px;
147
+ }
148
+
149
+
150
+ #search {
151
+ margin: 0;
152
+ padding-top: 10px;
153
+ padding-bottom: 10px;
154
+ font-size: 11px;
155
+ }
156
+ #search input {
157
+ font-size: 11px;
158
+ margin: 2px;
159
+ }
160
+ #search-text {width: 170px}
161
+
162
+
163
+ #sidebar ul {
164
+ margin-left: 0;
165
+ padding-left: 0;
166
+ }
167
+ #sidebar ul h3 {
168
+ margin-top: 25px;
169
+ font-size: 16px;
170
+ padding-bottom: 10px;
171
+ border-bottom: 1px solid #ccc;
172
+ }
173
+ #sidebar li {
174
+ list-style-type: none;
175
+ }
176
+ #sidebar ul.links li {
177
+ margin-bottom: 5px;
178
+ }
179
+
180
+ </style>
181
+ <script type="text/javascript" src="javascripts/prototype.js"></script>
182
+ <script type="text/javascript" src="javascripts/effects.js"></script>
183
+ <script type="text/javascript">
184
+ function about() {
185
+ if (Element.empty('about-content')) {
186
+ new Ajax.Updater('about-content', 'rails/info/properties', {
187
+ method: 'get',
188
+ onFailure: function() {Element.classNames('about-content').add('failure')},
189
+ onComplete: function() {new Effect.BlindDown('about-content', {duration: 0.25})}
190
+ });
191
+ } else {
192
+ new Effect[Element.visible('about-content') ?
193
+ 'BlindUp' : 'BlindDown']('about-content', {duration: 0.25});
194
+ }
195
+ }
196
+
197
+ window.onload = function() {
198
+ $('search-text').value = '';
199
+ $('search').onsubmit = function() {
200
+ $('search-text').value = 'site:rubyonrails.org ' + $F('search-text');
201
+ }
202
+ }
203
+ </script>
204
+ </head>
205
+ <body>
206
+ <div id="page">
207
+ <div id="sidebar">
208
+ <ul id="sidebar-items">
209
+ <li>
210
+ <form id="search" action="http://www.google.com/search" method="get">
211
+ <input type="hidden" name="hl" value="en" />
212
+ <input type="text" id="search-text" name="q" value="site:rubyonrails.org " />
213
+ <input type="submit" value="Search" /> the Rails site
214
+ </form>
215
+ </li>
216
+
217
+ <li>
218
+ <h3>Join the community</h3>
219
+ <ul class="links">
220
+ <li><a href="http://www.rubyonrails.org/">Ruby on Rails</a></li>
221
+ <li><a href="http://weblog.rubyonrails.org/">Official weblog</a></li>
222
+ <li><a href="http://wiki.rubyonrails.org/">Wiki</a></li>
223
+ </ul>
224
+ </li>
225
+
226
+ <li>
227
+ <h3>Browse the documentation</h3>
228
+ <ul class="links">
229
+ <li><a href="http://api.rubyonrails.org/">Rails API</a></li>
230
+ <li><a href="http://stdlib.rubyonrails.org/">Ruby standard library</a></li>
231
+ <li><a href="http://corelib.rubyonrails.org/">Ruby core</a></li>
232
+ </ul>
233
+ </li>
234
+ </ul>
235
+ </div>
236
+
237
+ <div id="content">
238
+ <div id="header">
239
+ <h1>Welcome aboard</h1>
240
+ <h2>You&rsquo;re riding Ruby on Rails!</h2>
241
+ </div>
242
+
243
+ <div id="about">
244
+ <h3><a href="rails/info/properties" onclick="about(); return false">About your application&rsquo;s environment</a></h3>
245
+ <div id="about-content" style="display: none"></div>
246
+ </div>
247
+
248
+ <div id="getting-started">
249
+ <h1>Getting started</h1>
250
+ <h2>Here&rsquo;s how to get rolling:</h2>
251
+
252
+ <ol>
253
+ <li>
254
+ <h2>Use <tt>script/generate</tt> to create your models and controllers</h2>
255
+ <p>To see all available options, run it without parameters.</p>
256
+ </li>
257
+
258
+ <li>
259
+ <h2>Set up a default route and remove or rename this file</h2>
260
+ <p>Routes are set up in config/routes.rb.</p>
261
+ </li>
262
+
263
+ <li>
264
+ <h2>Create your database</h2>
265
+ <p>Run <tt>rake db:migrate</tt> to create your database. If you're not using SQLite (the default), edit <tt>config/database.yml</tt> with your username and password.</p>
266
+ </li>
267
+ </ol>
268
+ </div>
269
+ </div>
270
+
271
+ <div id="footer">&nbsp;</div>
272
+ </div>
273
+ </body>
274
+ </html>
@@ -0,0 +1,2 @@
1
+ // Place your application-specific JavaScript functions and classes here
2
+ // This file is automatically included by javascript_include_tag :defaults
data/html/robots.txt ADDED
@@ -0,0 +1,5 @@
1
+ # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2
+ #
3
+ # To ban all spiders from the entire site uncomment the next two lines:
4
+ # User-Agent: *
5
+ # Disallow: /
@@ -0,0 +1,107 @@
1
+ class CodeStatistics #:nodoc:
2
+
3
+ TEST_TYPES = %w(Units Functionals Unit\ tests Functional\ tests Integration\ tests)
4
+
5
+ def initialize(*pairs)
6
+ @pairs = pairs
7
+ @statistics = calculate_statistics
8
+ @total = calculate_total if pairs.length > 1
9
+ end
10
+
11
+ def to_s
12
+ print_header
13
+ @pairs.each { |pair| print_line(pair.first, @statistics[pair.first]) }
14
+ print_splitter
15
+
16
+ if @total
17
+ print_line("Total", @total)
18
+ print_splitter
19
+ end
20
+
21
+ print_code_test_stats
22
+ end
23
+
24
+ private
25
+ def calculate_statistics
26
+ @pairs.inject({}) { |stats, pair| stats[pair.first] = calculate_directory_statistics(pair.last); stats }
27
+ end
28
+
29
+ def calculate_directory_statistics(directory, pattern = /.*\.rb$/)
30
+ stats = { "lines" => 0, "codelines" => 0, "classes" => 0, "methods" => 0 }
31
+
32
+ Dir.foreach(directory) do |file_name|
33
+ if File.stat(directory + "/" + file_name).directory? and (/^\./ !~ file_name)
34
+ newstats = calculate_directory_statistics(directory + "/" + file_name, pattern)
35
+ stats.each { |k, v| stats[k] += newstats[k] }
36
+ end
37
+
38
+ next unless file_name =~ pattern
39
+
40
+ f = File.open(directory + "/" + file_name)
41
+
42
+ while line = f.gets
43
+ stats["lines"] += 1
44
+ stats["classes"] += 1 if line =~ /class [A-Z]/
45
+ stats["methods"] += 1 if line =~ /def [a-z]/
46
+ stats["codelines"] += 1 unless line =~ /^\s*$/ || line =~ /^\s*#/
47
+ end
48
+ end
49
+
50
+ stats
51
+ end
52
+
53
+ def calculate_total
54
+ total = { "lines" => 0, "codelines" => 0, "classes" => 0, "methods" => 0 }
55
+ @statistics.each_value { |pair| pair.each { |k, v| total[k] += v } }
56
+ total
57
+ end
58
+
59
+ def calculate_code
60
+ code_loc = 0
61
+ @statistics.each { |k, v| code_loc += v['codelines'] unless TEST_TYPES.include? k }
62
+ code_loc
63
+ end
64
+
65
+ def calculate_tests
66
+ test_loc = 0
67
+ @statistics.each { |k, v| test_loc += v['codelines'] if TEST_TYPES.include? k }
68
+ test_loc
69
+ end
70
+
71
+ def print_header
72
+ print_splitter
73
+ puts "| Name | Lines | LOC | Classes | Methods | M/C | LOC/M |"
74
+ print_splitter
75
+ end
76
+
77
+ def print_splitter
78
+ puts "+----------------------+-------+-------+---------+---------+-----+-------+"
79
+ end
80
+
81
+ def print_line(name, statistics)
82
+ m_over_c = (statistics["methods"] / statistics["classes"]) rescue m_over_c = 0
83
+ loc_over_m = (statistics["codelines"] / statistics["methods"]) - 2 rescue loc_over_m = 0
84
+
85
+ start = if TEST_TYPES.include? name
86
+ "| #{name.ljust(20)} "
87
+ else
88
+ "| #{name.ljust(20)} "
89
+ end
90
+
91
+ puts start +
92
+ "| #{statistics["lines"].to_s.rjust(5)} " +
93
+ "| #{statistics["codelines"].to_s.rjust(5)} " +
94
+ "| #{statistics["classes"].to_s.rjust(7)} " +
95
+ "| #{statistics["methods"].to_s.rjust(7)} " +
96
+ "| #{m_over_c.to_s.rjust(3)} " +
97
+ "| #{loc_over_m.to_s.rjust(5)} |"
98
+ end
99
+
100
+ def print_code_test_stats
101
+ code = calculate_code
102
+ tests = calculate_tests
103
+
104
+ puts " Code LOC: #{code} Test LOC: #{tests} Code to Test Ratio: 1:#{sprintf("%.1f", tests.to_f/code)}"
105
+ puts ""
106
+ end
107
+ end
@@ -0,0 +1,3 @@
1
+ require 'environment'
2
+ require 'rails/info'
3
+ puts Rails::Info
@@ -0,0 +1,32 @@
1
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
2
+
3
+ require 'optparse'
4
+ options = { :sandbox => false, :irb => irb }
5
+ OptionParser.new do |opt|
6
+ opt.banner = "Usage: console [environment] [options]"
7
+ opt.on('-s', '--sandbox', 'Rollback database modifications on exit.') { |v| options[:sandbox] = v }
8
+ opt.on("--irb=[#{irb}]", 'Invoke a different irb.') { |v| options[:irb] = v }
9
+ opt.parse!(ARGV)
10
+ end
11
+
12
+ libs = " -r irb/completion"
13
+ libs << %( -r "#{RAILS_ROOT}/config/environment")
14
+ libs << " -r console_app"
15
+ libs << " -r console_sandbox" if options[:sandbox]
16
+ libs << " -r console_with_helpers"
17
+
18
+ ENV['RAILS_ENV'] = case ARGV.first
19
+ when "p"; "production"
20
+ when "d"; "development"
21
+ when "t"; "test"
22
+ else
23
+ ARGV.first || ENV['RAILS_ENV'] || 'development'
24
+ end
25
+
26
+ if options[:sandbox]
27
+ puts "Loading #{ENV['RAILS_ENV']} environment in sandbox (Enhanced Rails #{Rails.version})"
28
+ puts "Any modifications you make will be rolled back on exit"
29
+ else
30
+ puts "Loading #{ENV['RAILS_ENV']} environment (Enhanced Rails #{Rails.version})"
31
+ end
32
+ exec "#{options[:irb]} #{libs} --simple-prompt"
@@ -0,0 +1,67 @@
1
+ require 'erb'
2
+ require 'yaml'
3
+ require 'optparse'
4
+
5
+ include_password = false
6
+
7
+ OptionParser.new do |opt|
8
+ opt.banner = "Usage: dbconsole [options] [environment]"
9
+ opt.on("-p", "--include-password", "Automatically provide the database from database.yml") do |v|
10
+ include_password = true
11
+ end
12
+ opt.parse!(ARGV)
13
+ abort opt.to_s unless (0..1).include?(ARGV.size)
14
+ end
15
+
16
+ env = ARGV.first || ENV['RAILS_ENV'] || 'development'
17
+ unless config = YAML::load(ERB.new(IO.read(RAILS_ROOT + "/config/database.yml")).result)[env]
18
+ abort "No database is configured for the environment '#{env}'"
19
+ end
20
+
21
+
22
+ def find_cmd(*commands)
23
+ dirs_on_path = ENV['PATH'].to_s.split(File::PATH_SEPARATOR)
24
+ commands += commands.map{|cmd| "#{cmd}.exe"} if RUBY_PLATFORM =~ /win32/
25
+ commands.detect do |cmd|
26
+ dirs_on_path.detect do |path|
27
+ File.executable? File.join(path, cmd)
28
+ end
29
+ end || abort("Couldn't find database client: #{commands.join(', ')}. Check your $PATH and try again.")
30
+ end
31
+
32
+ case config["adapter"]
33
+ when "mysql"
34
+ args = {
35
+ 'host' => '--host',
36
+ 'port' => '--port',
37
+ 'socket' => '--socket',
38
+ 'username' => '--user',
39
+ 'encoding' => '--default-character-set'
40
+ }.map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }.compact
41
+
42
+ if config['password'] && include_password
43
+ args << "--password=#{config['password']}"
44
+ elsif config['password'] && !config['password'].empty?
45
+ args << "-p"
46
+ end
47
+
48
+ args << config['database']
49
+
50
+ exec(find_cmd('mysql5', 'mysql'), *args)
51
+
52
+ when "postgresql"
53
+ ENV['PGUSER'] = config["username"] if config["username"]
54
+ ENV['PGHOST'] = config["host"] if config["host"]
55
+ ENV['PGPORT'] = config["port"].to_s if config["port"]
56
+ ENV['PGPASSWORD'] = config["password"].to_s if config["password"] && include_password
57
+ exec(find_cmd('psql'), config["database"])
58
+
59
+ when "sqlite"
60
+ exec(find_cmd('sqlite'), config["database"])
61
+
62
+ when "sqlite3"
63
+ exec(find_cmd('sqlite3'), config["database"])
64
+
65
+ else
66
+ abort "Unknown command-line client for #{config['database']}. Submit a Rails patch to add support!"
67
+ end
@@ -0,0 +1,6 @@
1
+ require "#{RAILS_ROOT}/config/environment"
2
+ require 'rails_generator'
3
+ require 'rails_generator/scripts/destroy'
4
+
5
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
6
+ Rails::Generator::Scripts::Destroy.new.run(ARGV)
@@ -0,0 +1,6 @@
1
+ require "#{RAILS_ROOT}/config/environment"
2
+ require 'rails_generator'
3
+ require 'rails_generator/scripts/generate'
4
+
5
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
6
+ Rails::Generator::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,86 @@
1
+ #!/usr/local/bin/ruby
2
+
3
+ require 'stringio'
4
+ require 'fileutils'
5
+ require 'fcgi_handler'
6
+
7
+ def message(s)
8
+ $stderr.puts "listener: #{s}" if ENV && ENV["DEBUG_GATEWAY"]
9
+ end
10
+
11
+ class RemoteCGI < CGI
12
+ attr_accessor :stdinput, :stdoutput, :env_table
13
+ def initialize(env_table, input = nil, output = nil)
14
+ self.env_table = env_table
15
+ self.stdinput = input || StringIO.new
16
+ self.stdoutput = output || StringIO.new
17
+ super()
18
+ end
19
+
20
+ def out(stream) # Ignore the requested output stream
21
+ super(stdoutput)
22
+ end
23
+ end
24
+
25
+ class Listener
26
+ include DRbUndumped
27
+
28
+ def initialize(timeout, socket_path)
29
+ @socket = File.expand_path(socket_path)
30
+ @mutex = Mutex.new
31
+ @active = false
32
+ @timeout = timeout
33
+
34
+ @handler = RailsFCGIHandler.new
35
+ @handler.extend DRbUndumped
36
+
37
+ message 'opening socket'
38
+ DRb.start_service("drbunix:#{@socket}", self)
39
+
40
+ message 'entering process loop'
41
+ @handler.process! self
42
+ end
43
+
44
+ def each_cgi(&cgi_block)
45
+ @cgi_block = cgi_block
46
+ message 'entering idle loop'
47
+ loop do
48
+ sleep @timeout rescue nil
49
+ die! unless @active
50
+ @active = false
51
+ end
52
+ end
53
+
54
+ def process(env, input)
55
+ message 'received request'
56
+ @mutex.synchronize do
57
+ @active = true
58
+
59
+ message 'creating input stream'
60
+ input_stream = StringIO.new(input)
61
+ message 'building CGI instance'
62
+ cgi = RemoteCGI.new(eval(env), input_stream)
63
+
64
+ message 'yielding to fcgi handler'
65
+ @cgi_block.call cgi
66
+ message 'yield finished -- sending output'
67
+
68
+ cgi.stdoutput.seek(0)
69
+ output = cgi.stdoutput.read
70
+
71
+ return output
72
+ end
73
+ end
74
+
75
+ def die!
76
+ message 'shutting down'
77
+ DRb.stop_service
78
+ FileUtils.rm_f @socket
79
+ Kernel.exit 0
80
+ end
81
+ end
82
+
83
+ socket_path = ARGV.shift
84
+ timeout = (ARGV.shift || 90).to_i
85
+
86
+ Listener.new(timeout, socket_path)
@@ -0,0 +1,69 @@
1
+ #!/usr/local/bin/ruby
2
+
3
+ require 'drb'
4
+ require 'thread'
5
+
6
+ def message(s)
7
+ $stderr.puts "tracker: #{s}" if ENV && ENV["DEBUG_GATEWAY"]
8
+ end
9
+
10
+ class Tracker
11
+ include DRbUndumped
12
+
13
+ def initialize(instances, socket_path)
14
+ @instances = instances
15
+ @socket = File.expand_path(socket_path)
16
+ @active = false
17
+
18
+ @listeners = []
19
+ @instances.times { @listeners << Mutex.new }
20
+
21
+ message "using #{@listeners.length} listeners"
22
+ message "opening socket at #{@socket}"
23
+
24
+ @service = DRb.start_service("drbunix://#{@socket}", self)
25
+ end
26
+
27
+ def with_listener
28
+ message "listener requested"
29
+
30
+ mutex = has_lock = index = nil
31
+ 3.times do
32
+ @listeners.each_with_index do |mutex, index|
33
+ has_lock = mutex.try_lock
34
+ break if has_lock
35
+ end
36
+ break if has_lock
37
+ sleep 0.05
38
+ end
39
+
40
+ if has_lock
41
+ message "obtained listener #{index}"
42
+ @active = true
43
+ begin yield index
44
+ ensure
45
+ mutex.unlock
46
+ message "released listener #{index}"
47
+ end
48
+ else
49
+ message "dropping request because no listeners are available!"
50
+ end
51
+ end
52
+
53
+ def background(check_interval = nil)
54
+ if check_interval
55
+ loop do
56
+ sleep check_interval
57
+ message "Idle for #{check_interval}, shutting down" unless @active
58
+ @active = false
59
+ Kernel.exit 0
60
+ end
61
+ else DRb.thread.join
62
+ end
63
+ end
64
+ end
65
+
66
+ socket_path = ARGV.shift
67
+ instances = ARGV.shift.to_i
68
+ t = Tracker.new(instances, socket_path)
69
+ t.background(ARGV.first ? ARGV.shift.to_i : 90)
@@ -0,0 +1,24 @@
1
+ if ARGV.empty?
2
+ puts "Usage: ./script/performance/benchmarker [times] 'Person.expensive_way' 'Person.another_expensive_way' ..."
3
+ exit 1
4
+ end
5
+
6
+ begin
7
+ N = Integer(ARGV.first)
8
+ ARGV.shift
9
+ rescue ArgumentError
10
+ N = 1
11
+ end
12
+
13
+ require RAILS_ROOT + '/config/environment'
14
+ require 'benchmark'
15
+ include Benchmark
16
+
17
+ # Don't include compilation in the benchmark
18
+ ARGV.each { |expression| eval(expression) }
19
+
20
+ bm(6) do |x|
21
+ ARGV.each_with_index do |expression, idx|
22
+ x.report("##{idx + 1}") { N.times { eval(expression) } }
23
+ end
24
+ end