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
@@ -0,0 +1,57 @@
1
+ task :default => :test
2
+ task :environment do
3
+ require(File.join(RAILS_ROOT, 'config', 'environment'))
4
+ end
5
+
6
+ require 'rails_generator/secret_key_generator'
7
+ desc 'Generate a crytographically secure secret key. This is typically used to generate a secret for cookie sessions. Pass a unique identifier to the generator using ID="some unique identifier" for greater security.'
8
+ task :secret do
9
+ puts Rails::SecretKeyGenerator.new(ENV['ID']).generate_secret
10
+ end
11
+
12
+ require 'active_support'
13
+ namespace :time do
14
+ namespace :zones do
15
+ desc 'Displays names of all time zones recognized by the Rails TimeZone class, grouped by offset. Results can be filtered with optional OFFSET parameter, e.g., OFFSET=-6'
16
+ task :all do
17
+ build_time_zone_list(:all)
18
+ end
19
+
20
+ desc 'Displays names of US time zones recognized by the Rails TimeZone class, grouped by offset. Results can be filtered with optional OFFSET parameter, e.g., OFFSET=-6'
21
+ task :us do
22
+ build_time_zone_list(:us_zones)
23
+ end
24
+
25
+ desc 'Displays names of time zones recognized by the Rails TimeZone class with the same offset as the system local time'
26
+ task :local do
27
+ jan_offset = Time.now.beginning_of_year.utc_offset
28
+ jul_offset = Time.now.beginning_of_year.change(:month => 7).utc_offset
29
+ offset = jan_offset < jul_offset ? jan_offset : jul_offset
30
+ build_time_zone_list(:all, offset)
31
+ end
32
+
33
+ # to find UTC -06:00 zones, OFFSET can be set to either -6, -6:00 or 21600
34
+ def build_time_zone_list(method, offset = ENV['OFFSET'])
35
+ if offset
36
+ offset = if offset.to_s.match(/(\+|-)?(\d+):(\d+)/)
37
+ sign = $1 == '-' ? -1 : 1
38
+ hours, minutes = $2.to_f, $3.to_f
39
+ ((hours * 3600) + (minutes.to_f * 60)) * sign
40
+ elsif offset.to_f.abs <= 13
41
+ offset.to_f * 3600
42
+ else
43
+ offset.to_f
44
+ end
45
+ end
46
+ previous_offset = nil
47
+ ActiveSupport::TimeZone.__send__(method).each do |zone|
48
+ if offset.nil? || offset == zone.utc_offset
49
+ puts "\n* UTC #{zone.formatted_offset} *" unless zone.utc_offset == previous_offset
50
+ puts zone.name
51
+ previous_offset = zone.utc_offset
52
+ end
53
+ end
54
+ puts "\n"
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,8 @@
1
+ $VERBOSE = nil
2
+
3
+ # Load Rails rakefile extensions
4
+ Dir["#{File.dirname(__FILE__)}/*.rake"].each { |ext| load ext }
5
+
6
+ # Load any custom rakefile extensions
7
+ Dir["#{RAILS_ROOT}/vendor/plugins/*/**/tasks/**/*.rake"].sort.each { |ext| load ext }
8
+ Dir["#{RAILS_ROOT}/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
@@ -0,0 +1,17 @@
1
+ desc 'Print out all defined routes in match order, with names.'
2
+ task :routes => :environment do
3
+ routes = ActionController::Routing::Routes.routes.collect do |route|
4
+ name = ActionController::Routing::Routes.named_routes.routes.index(route).to_s
5
+ verb = route.conditions[:method].to_s.upcase
6
+ segs = route.segments.inject("") { |str,s| str << s.to_s }
7
+ segs.chop! if segs.length > 1
8
+ reqs = route.requirements.empty? ? "" : route.requirements.inspect
9
+ {:name => name, :verb => verb, :segs => segs, :reqs => reqs}
10
+ end
11
+ name_width = routes.collect {|r| r[:name]}.collect {|n| n.length}.max
12
+ verb_width = routes.collect {|r| r[:verb]}.collect {|v| v.length}.max
13
+ segs_width = routes.collect {|r| r[:segs]}.collect {|s| s.length}.max
14
+ routes.each do |r|
15
+ puts "#{r[:name].rjust(name_width)} #{r[:verb].ljust(verb_width)} #{r[:segs].ljust(segs_width)} #{r[:reqs]}"
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ STATS_DIRECTORIES = [
2
+ %w(Controllers app/controllers),
3
+ %w(Helpers app/helpers),
4
+ %w(Models app/models),
5
+ %w(Libraries lib/),
6
+ %w(APIs app/apis),
7
+ %w(Components components),
8
+ %w(Integration\ tests test/integration),
9
+ %w(Functional\ tests test/functional),
10
+ %w(Unit\ tests test/unit)
11
+
12
+ ].collect { |name, dir| [ name, "#{RAILS_ROOT}/#{dir}" ] }.select { |name, dir| File.directory?(dir) }
13
+
14
+ desc "Report code statistics (KLOCs, etc) from the application"
15
+ task :stats do
16
+ require 'code_statistics'
17
+ CodeStatistics.new(*STATS_DIRECTORIES).to_s
18
+ end
@@ -0,0 +1,118 @@
1
+ TEST_CHANGES_SINCE = Time.now - 600
2
+
3
+ # Look up tests for recently modified sources.
4
+ def recent_tests(source_pattern, test_path, touched_since = 10.minutes.ago)
5
+ FileList[source_pattern].map do |path|
6
+ if File.mtime(path) > touched_since
7
+ tests = []
8
+ source_dir = File.dirname(path).split("/")
9
+ source_file = File.basename(path, '.rb')
10
+
11
+ # Support subdirs in app/models and app/controllers
12
+ modified_test_path = source_dir.length > 2 ? "#{test_path}/" << source_dir[1..source_dir.length].join('/') : test_path
13
+
14
+ # For modified files in app/ run the tests for it. ex. /test/functional/account_controller.rb
15
+ test = "#{modified_test_path}/#{source_file}_test.rb"
16
+ tests.push test if File.exist?(test)
17
+
18
+ # For modified files in app, run tests in subdirs too. ex. /test/functional/account/*_test.rb
19
+ test = "#{modified_test_path}/#{File.basename(path, '.rb').sub("_controller","")}"
20
+ FileList["#{test}/*_test.rb"].each { |f| tests.push f } if File.exist?(test)
21
+
22
+ return tests
23
+
24
+ end
25
+ end.flatten.compact
26
+ end
27
+
28
+
29
+ # Recreated here from ActiveSupport because :uncommitted needs it before Rails is available
30
+ module Kernel
31
+ def silence_stderr
32
+ old_stderr = STDERR.dup
33
+ STDERR.reopen(RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'NUL:' : '/dev/null')
34
+ STDERR.sync = true
35
+ yield
36
+ ensure
37
+ STDERR.reopen(old_stderr)
38
+ end
39
+ end
40
+
41
+ desc 'Run all unit, functional and integration tests'
42
+ task :test do
43
+ errors = %w(test:units test:functionals test:integration).collect do |task|
44
+ begin
45
+ Rake::Task[task].invoke
46
+ nil
47
+ rescue => e
48
+ task
49
+ end
50
+ end.compact
51
+ abort "Errors running #{errors.to_sentence}!" if errors.any?
52
+ end
53
+
54
+ namespace :test do
55
+ Rake::TestTask.new(:recent => "db:test:prepare") do |t|
56
+ since = TEST_CHANGES_SINCE
57
+ touched = FileList['test/**/*_test.rb'].select { |path| File.mtime(path) > since } +
58
+ recent_tests('app/models/**/*.rb', 'test/unit', since) +
59
+ recent_tests('app/controllers/**/*.rb', 'test/functional', since)
60
+
61
+ t.libs << 'test'
62
+ t.verbose = true
63
+ t.test_files = touched.uniq
64
+ end
65
+ Rake::Task['test:recent'].comment = "Test recent changes"
66
+
67
+ Rake::TestTask.new(:uncommitted => "db:test:prepare") do |t|
68
+ def t.file_list
69
+ changed_since_checkin = silence_stderr { `svn status` }.map { |path| path.chomp[7 .. -1] }
70
+
71
+ models = changed_since_checkin.select { |path| path =~ /app[\\\/]models[\\\/].*\.rb/ }
72
+ controllers = changed_since_checkin.select { |path| path =~ /app[\\\/]controllers[\\\/].*\.rb/ }
73
+
74
+ unit_tests = models.map { |model| "test/unit/#{File.basename(model, '.rb')}_test.rb" }
75
+ functional_tests = controllers.map { |controller| "test/functional/#{File.basename(controller, '.rb')}_test.rb" }
76
+
77
+ unit_tests.uniq + functional_tests.uniq
78
+ end
79
+
80
+ t.libs << 'test'
81
+ t.verbose = true
82
+ end
83
+ Rake::Task['test:uncommitted'].comment = "Test changes since last checkin (only Subversion)"
84
+
85
+ Rake::TestTask.new(:units => "db:test:prepare") do |t|
86
+ t.libs << "test"
87
+ t.pattern = 'test/unit/**/*_test.rb'
88
+ t.verbose = true
89
+ end
90
+ Rake::Task['test:units'].comment = "Run the unit tests in test/unit"
91
+
92
+ Rake::TestTask.new(:functionals => "db:test:prepare") do |t|
93
+ t.libs << "test"
94
+ t.pattern = 'test/functional/**/*_test.rb'
95
+ t.verbose = true
96
+ end
97
+ Rake::Task['test:functionals'].comment = "Run the functional tests in test/functional"
98
+
99
+ Rake::TestTask.new(:integration => "db:test:prepare") do |t|
100
+ t.libs << "test"
101
+ t.pattern = 'test/integration/**/*_test.rb'
102
+ t.verbose = true
103
+ end
104
+ Rake::Task['test:integration'].comment = "Run the integration tests in test/integration"
105
+
106
+ Rake::TestTask.new(:plugins => :environment) do |t|
107
+ t.libs << "test"
108
+
109
+ if ENV['PLUGIN']
110
+ t.pattern = "vendor/plugins/#{ENV['PLUGIN']}/test/**/*_test.rb"
111
+ else
112
+ t.pattern = 'vendor/plugins/*/**/test/**/*_test.rb'
113
+ end
114
+
115
+ t.verbose = true
116
+ end
117
+ Rake::Task['test:plugins'].comment = "Run the plugin tests in vendor/plugins/*/**/test (or specify with PLUGIN=name)"
118
+ end
@@ -0,0 +1,37 @@
1
+ namespace :tmp do
2
+ desc "Clear session, cache, and socket files from tmp/"
3
+ task :clear => [ "tmp:sessions:clear", "tmp:cache:clear", "tmp:sockets:clear"]
4
+
5
+ desc "Creates tmp directories for sessions, cache, and sockets"
6
+ task :create do
7
+ FileUtils.mkdir_p(%w( tmp/sessions tmp/cache tmp/sockets tmp/pids ))
8
+ end
9
+
10
+ namespace :sessions do
11
+ desc "Clears all files in tmp/sessions"
12
+ task :clear do
13
+ FileUtils.rm(Dir['tmp/sessions/[^.]*'])
14
+ end
15
+ end
16
+
17
+ namespace :cache do
18
+ desc "Clears all files and directories in tmp/cache"
19
+ task :clear do
20
+ FileUtils.rm_rf(Dir['tmp/cache/[^.]*'])
21
+ end
22
+ end
23
+
24
+ namespace :sockets do
25
+ desc "Clears all files in tmp/sockets"
26
+ task :clear do
27
+ FileUtils.rm(Dir['tmp/sockets/[^.]*'])
28
+ end
29
+ end
30
+
31
+ namespace :pids do
32
+ desc "Clears all files in tmp/pids"
33
+ task :clear do
34
+ FileUtils.rm(Dir['tmp/pids/[^.]*'])
35
+ end
36
+ end
37
+ end
data/lib/test_help.rb ADDED
@@ -0,0 +1,28 @@
1
+ require_dependency 'application'
2
+
3
+ # Make double-sure the RAILS_ENV is set to test,
4
+ # so fixtures are loaded to the right database
5
+ silence_warnings { RAILS_ENV = "test" }
6
+
7
+ require 'test/unit'
8
+ require 'active_support/test_case'
9
+ require 'active_record/fixtures'
10
+ require 'action_controller/test_case'
11
+ require 'action_controller/test_process'
12
+ require 'action_controller/integration'
13
+ require 'action_mailer/test_case' if defined?(ActionMailer)
14
+
15
+ Test::Unit::TestCase.fixture_path = RAILS_ROOT + "/test/fixtures/"
16
+ ActionController::IntegrationTest.fixture_path = Test::Unit::TestCase.fixture_path
17
+
18
+ def create_fixtures(*table_names)
19
+ Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names)
20
+ end
21
+
22
+ begin
23
+ require_library_or_gem 'ruby-debug'
24
+ Debugger.start
25
+ Debugger.settings[:autoeval] = true if Debugger.respond_to?(:settings)
26
+ rescue LoadError
27
+ # ruby-debug wasn't available so neither can the debugging be
28
+ end
@@ -0,0 +1,165 @@
1
+ # Donated by Florian Gross
2
+
3
+ require 'webrick'
4
+ require 'cgi'
5
+ require 'stringio'
6
+ require 'dispatcher'
7
+
8
+ include WEBrick
9
+
10
+ class CGI #:nodoc:
11
+ def stdinput
12
+ @stdin || $stdin
13
+ end
14
+
15
+ def env_table
16
+ @env_table || ENV
17
+ end
18
+
19
+ def initialize(type = "query", table = nil, stdin = nil)
20
+ @env_table, @stdin = table, stdin
21
+
22
+ if defined?(MOD_RUBY) && !ENV.key?("GATEWAY_INTERFACE")
23
+ Apache.request.setup_cgi_env
24
+ end
25
+
26
+ extend QueryExtension
27
+ @multipart = false
28
+ if defined?(CGI_PARAMS)
29
+ warn "do not use CGI_PARAMS and CGI_COOKIES"
30
+ @params = CGI_PARAMS.dup
31
+ @cookies = CGI_COOKIES.dup
32
+ else
33
+ initialize_query() # set @params, @cookies
34
+ end
35
+ @output_cookies = nil
36
+ @output_hidden = nil
37
+ end
38
+ end
39
+
40
+ # A custom dispatch servlet for use with WEBrick. It dispatches requests
41
+ # (using the Rails Dispatcher) to the appropriate controller/action. By default,
42
+ # it restricts WEBrick to a managing a single Rails request at a time, but you
43
+ # can change this behavior by setting ActionController::Base.allow_concurrency
44
+ # to true.
45
+ class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet
46
+ REQUEST_MUTEX = Mutex.new
47
+
48
+ # Start the WEBrick server with the given options, mounting the
49
+ # DispatchServlet at <tt>/</tt>.
50
+ def self.dispatch(options = {})
51
+ Socket.do_not_reverse_lookup = true # patch for OS X
52
+
53
+ params = { :Port => options[:port].to_i,
54
+ :ServerType => options[:server_type],
55
+ :BindAddress => options[:ip] }
56
+ params[:MimeTypes] = options[:mime_types] if options[:mime_types]
57
+
58
+ server = WEBrick::HTTPServer.new(params)
59
+ server.mount('/', DispatchServlet, options)
60
+
61
+ trap("INT") { server.shutdown }
62
+ server.start
63
+ end
64
+
65
+ def initialize(server, options) #:nodoc:
66
+ @server_options = options
67
+ @file_handler = WEBrick::HTTPServlet::FileHandler.new(server, options[:server_root])
68
+ # Change to the RAILS_ROOT, since Webrick::Daemon.start does a Dir::cwd("/")
69
+ # OPTIONS['working_directory'] is an absolute path of the RAILS_ROOT, set in erailties/lib/commands/servers/webrick.rb
70
+ Dir.chdir(OPTIONS['working_directory']) if defined?(OPTIONS) && File.directory?(OPTIONS['working_directory'])
71
+ super
72
+ end
73
+
74
+ def service(req, res) #:nodoc:
75
+ unless handle_file(req, res)
76
+ begin
77
+ REQUEST_MUTEX.lock unless ActionController::Base.allow_concurrency
78
+ unless handle_dispatch(req, res)
79
+ raise WEBrick::HTTPStatus::NotFound, "`#{req.path}' not found."
80
+ end
81
+ ensure
82
+ unless ActionController::Base.allow_concurrency
83
+ REQUEST_MUTEX.unlock if REQUEST_MUTEX.locked?
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ def handle_file(req, res) #:nodoc:
90
+ begin
91
+ req = req.dup
92
+ path = req.path.dup
93
+
94
+ # Add .html if the last path piece has no . in it
95
+ path << '.html' if path != '/' && (%r{(^|/)[^./]+$} =~ path)
96
+ path.gsub!('+', ' ') # Unescape + since FileHandler doesn't do so.
97
+
98
+ req.instance_variable_set(:@path_info, path) # Set the modified path...
99
+
100
+ @file_handler.send(:service, req, res)
101
+ return true
102
+ rescue HTTPStatus::PartialContent, HTTPStatus::NotModified => err
103
+ res.set_error(err)
104
+ return true
105
+ rescue => err
106
+ return false
107
+ end
108
+ end
109
+
110
+ def handle_dispatch(req, res, origin = nil) #:nodoc:
111
+ data = StringIO.new
112
+ Dispatcher.dispatch(
113
+ CGI.new("query", create_env_table(req, origin), StringIO.new(req.body || "")),
114
+ ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS,
115
+ data
116
+ )
117
+
118
+ header, body = extract_header_and_body(data)
119
+
120
+ set_charset(header)
121
+ assign_status(res, header)
122
+ res.cookies.concat(header.delete('set-cookie') || [])
123
+ header.each { |key, val| res[key] = val.join(", ") }
124
+
125
+ res.body = body
126
+ return true
127
+ rescue => err
128
+ p err, err.backtrace
129
+ return false
130
+ end
131
+
132
+ private
133
+ def create_env_table(req, origin)
134
+ env = req.meta_vars.clone
135
+ env.delete "SCRIPT_NAME"
136
+ env["QUERY_STRING"] = req.request_uri.query
137
+ env["REQUEST_URI"] = origin if origin
138
+ return env
139
+ end
140
+
141
+ def extract_header_and_body(data)
142
+ data.rewind
143
+ data = data.read
144
+
145
+ raw_header, body = *data.split(/^[\xd\xa]{2}/on, 2)
146
+ header = WEBrick::HTTPUtils::parse_header(raw_header)
147
+
148
+ return header, body
149
+ end
150
+
151
+ def set_charset(header)
152
+ ct = header["content-type"]
153
+ if ct.any? { |x| x =~ /^text\// } && ! ct.any? { |x| x =~ /charset=/ }
154
+ ch = @server_options[:charset] || "UTF-8"
155
+ ct.find { |x| x =~ /^text\// } << ("; charset=" + ch)
156
+ end
157
+ end
158
+
159
+ def assign_status(res, header)
160
+ if /^(\d+)/ =~ header['status'][0]
161
+ res.status = $1.to_i
162
+ header.delete('status')
163
+ end
164
+ end
165
+ end