rails 1.2.6 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rails might be problematic. Click here for more details.

Files changed (148) hide show
  1. data/CHANGELOG +491 -12
  2. data/MIT-LICENSE +1 -1
  3. data/README +17 -25
  4. data/Rakefile +41 -18
  5. data/bin/about +1 -1
  6. data/bin/console +1 -1
  7. data/bin/destroy +1 -1
  8. data/bin/generate +1 -1
  9. data/bin/performance/request +3 -0
  10. data/bin/plugin +1 -1
  11. data/bin/runner +1 -1
  12. data/bin/server +1 -1
  13. data/builtin/rails_info/rails/info.rb +2 -2
  14. data/configs/apache.conf +1 -1
  15. data/configs/databases/mysql.yml +9 -3
  16. data/configs/databases/postgresql.yml +16 -12
  17. data/configs/initializers/inflections.rb +10 -0
  18. data/configs/initializers/mime_types.rb +5 -0
  19. data/configs/routes.rb +23 -11
  20. data/doc/README_FOR_APP +1 -1
  21. data/environments/boot.rb +95 -26
  22. data/environments/development.rb +2 -5
  23. data/environments/environment.rb +24 -25
  24. data/environments/test.rb +4 -1
  25. data/helpers/application.rb +5 -2
  26. data/helpers/test_helper.rb +10 -0
  27. data/html/422.html +30 -0
  28. data/html/500.html +1 -1
  29. data/html/index.html +2 -2
  30. data/html/javascripts/controls.js +484 -354
  31. data/html/javascripts/dragdrop.js +88 -58
  32. data/html/javascripts/effects.js +396 -364
  33. data/html/javascripts/prototype.js +2817 -1107
  34. data/html/robots.txt +5 -1
  35. data/lib/commands/console.rb +12 -5
  36. data/lib/commands/performance/request.rb +6 -0
  37. data/lib/commands/plugin.rb +15 -10
  38. data/lib/commands/process/spawner.rb +14 -4
  39. data/lib/commands/servers/base.rb +12 -0
  40. data/lib/commands/servers/mongrel.rb +5 -1
  41. data/lib/commands/servers/webrick.rb +14 -7
  42. data/lib/console_app.rb +5 -2
  43. data/lib/console_with_helpers.rb +5 -2
  44. data/lib/dispatcher.rb +3 -151
  45. data/lib/fcgi_handler.rb +79 -81
  46. data/lib/initializer.rb +125 -169
  47. data/lib/rails/plugin.rb +84 -0
  48. data/lib/rails/plugin/loader.rb +150 -0
  49. data/lib/rails/plugin/locator.rb +78 -0
  50. data/lib/rails/version.rb +3 -3
  51. data/lib/rails_generator/base.rb +11 -9
  52. data/lib/rails_generator/commands.rb +20 -10
  53. data/lib/rails_generator/generators/applications/app/USAGE +0 -7
  54. data/lib/rails_generator/generators/applications/app/app_generator.rb +25 -6
  55. data/lib/rails_generator/generators/components/controller/USAGE +11 -12
  56. data/lib/rails_generator/generators/components/controller/controller_generator.rb +2 -2
  57. data/lib/rails_generator/generators/components/controller/templates/functional_test.rb +1 -11
  58. data/lib/rails_generator/generators/components/controller/templates/{view.rhtml → view.html.erb} +0 -0
  59. data/lib/rails_generator/generators/components/integration_test/USAGE +5 -11
  60. data/lib/rails_generator/generators/components/mailer/USAGE +8 -10
  61. data/lib/rails_generator/generators/components/mailer/mailer_generator.rb +3 -3
  62. data/lib/rails_generator/generators/components/mailer/templates/fixture.erb +3 -0
  63. data/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -3
  64. data/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +8 -24
  65. data/lib/rails_generator/generators/components/mailer/templates/view.erb +3 -0
  66. data/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -3
  67. data/lib/rails_generator/generators/components/migration/USAGE +23 -8
  68. data/lib/rails_generator/generators/components/migration/migration_generator.rb +15 -2
  69. data/lib/rails_generator/generators/components/migration/templates/migration.rb +6 -2
  70. data/lib/rails_generator/generators/components/model/USAGE +15 -14
  71. data/lib/rails_generator/generators/components/model/model_generator.rb +10 -3
  72. data/lib/rails_generator/generators/components/model/templates/fixtures.yml +11 -3
  73. data/lib/rails_generator/generators/components/model/templates/migration.rb +4 -1
  74. data/lib/rails_generator/generators/components/model/templates/unit_test.rb +1 -3
  75. data/lib/rails_generator/generators/components/observer/USAGE +5 -7
  76. data/lib/rails_generator/generators/components/observer/templates/unit_test.rb +0 -2
  77. data/lib/rails_generator/generators/components/plugin/USAGE +8 -18
  78. data/lib/rails_generator/generators/components/plugin/plugin_generator.rb +1 -0
  79. data/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +20 -0
  80. data/lib/rails_generator/generators/components/plugin/templates/README +10 -1
  81. data/lib/rails_generator/generators/components/plugin/templates/USAGE +1 -1
  82. data/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -1
  83. data/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -1
  84. data/lib/rails_generator/generators/components/plugin/templates/tasks.rake +1 -1
  85. data/lib/rails_generator/generators/components/resource/USAGE +23 -0
  86. data/lib/rails_generator/generators/components/resource/resource_generator.rb +13 -15
  87. data/lib/rails_generator/generators/components/resource/templates/controller.rb +1 -1
  88. data/lib/rails_generator/generators/components/resource/templates/functional_test.rb +2 -14
  89. data/lib/rails_generator/generators/components/scaffold/USAGE +24 -31
  90. data/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +45 -146
  91. data/lib/rails_generator/generators/components/scaffold/templates/controller.rb +64 -37
  92. data/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +23 -80
  93. data/lib/rails_generator/generators/components/scaffold/templates/{layout.rhtml → layout.html.erb} +0 -0
  94. data/lib/rails_generator/generators/components/scaffold/templates/style.css +1 -1
  95. data/lib/rails_generator/generators/components/{scaffold_resource/templates/view_edit.rhtml → scaffold/templates/view_edit.html.erb} +4 -4
  96. data/lib/rails_generator/generators/components/{scaffold_resource/templates/view_index.rhtml → scaffold/templates/view_index.html.erb} +4 -4
  97. data/lib/rails_generator/generators/components/{scaffold_resource/templates/view_new.rhtml → scaffold/templates/view_new.html.erb} +3 -3
  98. data/lib/rails_generator/generators/components/{scaffold_resource/templates/view_show.rhtml → scaffold/templates/view_show.html.erb} +1 -1
  99. data/lib/rails_generator/generators/components/session_migration/USAGE +6 -11
  100. data/lib/rails_generator/generators/components/session_migration/templates/migration.rb +3 -3
  101. data/lib/rails_generator/lookup.rb +45 -10
  102. data/lib/rails_generator/scripts.rb +6 -3
  103. data/lib/rails_generator/scripts/destroy.rb +23 -0
  104. data/lib/rails_generator/secret_key_generator.rb +160 -0
  105. data/lib/rails_generator/spec.rb +1 -1
  106. data/lib/source_annotation_extractor.rb +62 -0
  107. data/lib/tasks/annotations.rake +23 -0
  108. data/lib/tasks/databases.rake +249 -83
  109. data/lib/tasks/documentation.rake +11 -13
  110. data/lib/tasks/framework.rake +1 -1
  111. data/lib/tasks/rails.rb +1 -1
  112. data/lib/tasks/testing.rake +5 -7
  113. data/lib/test_help.rb +4 -3
  114. data/lib/webrick_server.rb +3 -4
  115. metadata +31 -49
  116. data/bin/breakpointer +0 -3
  117. data/lib/binding_of_caller.rb +0 -85
  118. data/lib/breakpoint.rb +0 -553
  119. data/lib/breakpoint_client.rb +0 -196
  120. data/lib/commands/breakpointer.rb +0 -1
  121. data/lib/rails_generator/generators/components/resource/templates/USAGE +0 -18
  122. data/lib/rails_generator/generators/components/resource/templates/fixtures.yml +0 -11
  123. data/lib/rails_generator/generators/components/resource/templates/migration.rb +0 -13
  124. data/lib/rails_generator/generators/components/resource/templates/model.rb +0 -2
  125. data/lib/rails_generator/generators/components/resource/templates/unit_test.rb +0 -10
  126. data/lib/rails_generator/generators/components/scaffold/templates/form.rhtml +0 -3
  127. data/lib/rails_generator/generators/components/scaffold/templates/form_scaffolding.rhtml +0 -1
  128. data/lib/rails_generator/generators/components/scaffold/templates/view_edit.rhtml +0 -9
  129. data/lib/rails_generator/generators/components/scaffold/templates/view_list.rhtml +0 -27
  130. data/lib/rails_generator/generators/components/scaffold/templates/view_new.rhtml +0 -8
  131. data/lib/rails_generator/generators/components/scaffold/templates/view_show.rhtml +0 -8
  132. data/lib/rails_generator/generators/components/scaffold_resource/USAGE +0 -29
  133. data/lib/rails_generator/generators/components/scaffold_resource/scaffold_resource_generator.rb +0 -93
  134. data/lib/rails_generator/generators/components/scaffold_resource/templates/controller.rb +0 -79
  135. data/lib/rails_generator/generators/components/scaffold_resource/templates/fixtures.yml +0 -11
  136. data/lib/rails_generator/generators/components/scaffold_resource/templates/functional_test.rb +0 -57
  137. data/lib/rails_generator/generators/components/scaffold_resource/templates/helper.rb +0 -2
  138. data/lib/rails_generator/generators/components/scaffold_resource/templates/layout.rhtml +0 -17
  139. data/lib/rails_generator/generators/components/scaffold_resource/templates/migration.rb +0 -13
  140. data/lib/rails_generator/generators/components/scaffold_resource/templates/model.rb +0 -2
  141. data/lib/rails_generator/generators/components/scaffold_resource/templates/style.css +0 -74
  142. data/lib/rails_generator/generators/components/scaffold_resource/templates/unit_test.rb +0 -10
  143. data/lib/rails_generator/generators/components/web_service/USAGE +0 -28
  144. data/lib/rails_generator/generators/components/web_service/templates/api_definition.rb +0 -5
  145. data/lib/rails_generator/generators/components/web_service/templates/controller.rb +0 -8
  146. data/lib/rails_generator/generators/components/web_service/templates/functional_test.rb +0 -19
  147. data/lib/rails_generator/generators/components/web_service/web_service_generator.rb +0 -29
  148. data/lib/tasks/pre_namespace_aliases.rake +0 -53
@@ -1 +1,5 @@
1
- # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
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: /
@@ -10,16 +10,23 @@ OptionParser.new do |opt|
10
10
  end
11
11
 
12
12
  libs = " -r irb/completion"
13
- libs << " -r #{RAILS_ROOT}/config/environment"
13
+ libs << %( -r "#{RAILS_ROOT}/config/environment")
14
14
  libs << " -r console_app"
15
15
  libs << " -r console_sandbox" if options[:sandbox]
16
16
  libs << " -r console_with_helpers"
17
17
 
18
- ENV['RAILS_ENV'] = ARGV.first || ENV['RAILS_ENV'] || 'development'
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
+
19
26
  if options[:sandbox]
20
- puts "Loading #{ENV['RAILS_ENV']} environment in sandbox."
21
- puts "Any modifications you make will be rolled back on exit."
27
+ puts "Loading #{ENV['RAILS_ENV']} environment in sandbox (Rails #{Rails::VERSION::STRING})"
28
+ puts "Any modifications you make will be rolled back on exit"
22
29
  else
23
- puts "Loading #{ENV['RAILS_ENV']} environment."
30
+ puts "Loading #{ENV['RAILS_ENV']} environment (Rails #{Rails::VERSION::STRING})"
24
31
  end
25
32
  exec "#{options[:irb]} #{libs} --simple-prompt"
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ require 'config/environment'
3
+ require 'application'
4
+ require 'action_controller/request_profiler'
5
+
6
+ ActionController::RequestProfiler.run(ARGV)
@@ -91,7 +91,7 @@ class RailsEnvironment
91
91
  unless plugin.nil?
92
92
  plugin.install
93
93
  else
94
- puts "plugin not found: #{name_uri_or_plugin}"
94
+ puts "Plugin not found: #{name_uri_or_plugin}"
95
95
  end
96
96
  end
97
97
 
@@ -239,10 +239,10 @@ class Plugin
239
239
 
240
240
  def install_using_http(options = {})
241
241
  root = rails_env.root
242
- mkdir_p "#{root}/vendor/plugins"
243
- Dir.chdir "#{root}/vendor/plugins" do
242
+ mkdir_p "#{root}/vendor/plugins/#{@name}"
243
+ Dir.chdir "#{root}/vendor/plugins/#{@name}" do
244
244
  puts "fetching from '#{uri}'" if $verbose
245
- fetcher = RecursiveHTTPFetcher.new(uri)
245
+ fetcher = RecursiveHTTPFetcher.new(uri, -1)
246
246
  fetcher.quiet = true if options[:quiet]
247
247
  fetcher.fetch
248
248
  end
@@ -515,7 +515,7 @@ module Commands
515
515
  o.on( "--local",
516
516
  "List locally installed plugins.") {|@local| @remote = false}
517
517
  o.on( "--remote",
518
- "List remotely availabled plugins. This is the default behavior",
518
+ "List remotely available plugins. This is the default behavior",
519
519
  "unless --local is provided.") {|@remote|}
520
520
  end
521
521
  end
@@ -765,8 +765,9 @@ module Commands
765
765
  args.each do |name|
766
766
  ::Plugin.find(name).install(install_method, @options)
767
767
  end
768
- rescue
768
+ rescue StandardError => e
769
769
  puts "Plugin not found: #{args.inspect}"
770
+ puts e.inspect if $verbose
770
771
  exit 1
771
772
  end
772
773
  end
@@ -853,7 +854,8 @@ end
853
854
 
854
855
  class RecursiveHTTPFetcher
855
856
  attr_accessor :quiet
856
- def initialize(urls_to_fetch, cwd = ".")
857
+ def initialize(urls_to_fetch, level = 1, cwd = ".")
858
+ @level = level
857
859
  @cwd = cwd
858
860
  @urls_to_fetch = urls_to_fetch.to_a
859
861
  @quiet = false
@@ -884,7 +886,8 @@ class RecursiveHTTPFetcher
884
886
  links = []
885
887
  contents.scan(/href\s*=\s*\"*[^\">]*/i) do |link|
886
888
  link = link.sub(/href="/i, "")
887
- next if link =~ /^http/i || link =~ /^\./
889
+ next if link =~ /svnindex.xsl$/
890
+ next if link =~ /^(\w*:|)\/\// || link =~ /^\./
888
891
  links << File.join(base_url, link)
889
892
  end
890
893
  links
@@ -906,12 +909,14 @@ class RecursiveHTTPFetcher
906
909
  end
907
910
 
908
911
  def fetch_dir(url)
909
- push_d(File.basename(url))
912
+ @level += 1
913
+ push_d(File.basename(url)) if @level > 0
910
914
  open(url) do |stream|
911
915
  contents = stream.read
912
916
  fetch(links(url, contents))
913
917
  end
914
- pop_d
918
+ pop_d if @level > 0
919
+ @level -= 1
915
920
  end
916
921
  end
917
922
 
@@ -65,6 +65,14 @@ class MongrelSpawner < Spawner
65
65
  "-c #{OPTIONS[:rails_root]} " +
66
66
  "-l #{OPTIONS[:rails_root]}/log/mongrel.log"
67
67
 
68
+ # Add prefix functionality to spawner's call to mongrel_rails
69
+ # Digging through monrel's project subversion server, the earliest
70
+ # Tag that has prefix implemented in the bin/mongrel_rails file
71
+ # is 0.3.15 which also happens to be the earilest tag listed.
72
+ # References: http://mongrel.rubyforge.org/svn/tags
73
+ if Mongrel::Const::MONGREL_VERSION.to_f >=0.3 && !OPTIONS[:prefix].nil?
74
+ cmd = cmd + " --prefix #{OPTIONS[:prefix]}"
75
+ end
68
76
  system(cmd)
69
77
  end
70
78
 
@@ -114,14 +122,15 @@ end
114
122
  OPTIONS = {
115
123
  :environment => "production",
116
124
  :spawner => '/usr/bin/env spawn-fcgi',
117
- :dispatcher => File.expand_path(RAILS_ROOT + '/public/dispatch.fcgi'),
118
- :pids => File.expand_path(RAILS_ROOT + "/tmp/pids"),
119
- :rails_root => File.expand_path(RAILS_ROOT),
125
+ :dispatcher => File.expand_path(RELATIVE_RAILS_ROOT + '/public/dispatch.fcgi'),
126
+ :pids => File.expand_path(RELATIVE_RAILS_ROOT + "/tmp/pids"),
127
+ :rails_root => File.expand_path(RELATIVE_RAILS_ROOT),
120
128
  :process => "dispatch",
121
129
  :port => 8000,
122
130
  :address => '0.0.0.0',
123
131
  :instances => 3,
124
- :repeat => nil
132
+ :repeat => nil,
133
+ :prefix => nil
125
134
  }
126
135
 
127
136
  ARGV.options do |opts|
@@ -182,6 +191,7 @@ ARGV.options do |opts|
182
191
  opts.on("-i", "--instances=number", Integer, "Number of instances (default: #{OPTIONS[:instances]})") { |v| OPTIONS[:instances] = v }
183
192
  opts.on("-r", "--repeat=seconds", Integer, "Repeat spawn attempts every n seconds (default: off)") { |v| OPTIONS[:repeat] = v }
184
193
  opts.on("-e", "--environment=name", String, "test|development|production (default: #{OPTIONS[:environment]})") { |v| OPTIONS[:environment] = v }
194
+ opts.on("-P", "--prefix=path", String, "URL prefix for Rails app. [Used only with Mongrel > v0.3.15]: (default: #{OPTIONS[:prefix]})") { |v| OPTIONS[:prefix] = v }
185
195
  opts.on("-n", "--process=name", String, "default: #{OPTIONS[:process]}") { |v| OPTIONS[:process] = v }
186
196
  opts.on("-s", "--spawner=path", String, "default: #{OPTIONS[:spawner]}") { |v| OPTIONS[:spawner] = v }
187
197
  opts.on("-d", "--dispatcher=path", String, "default: #{OPTIONS[:dispatcher]}") { |dispatcher| OPTIONS[:dispatcher] = File.expand_path(dispatcher) }
@@ -17,3 +17,15 @@ def tail(log_file)
17
17
  end
18
18
  tail_thread
19
19
  end
20
+
21
+ def start_debugger
22
+ begin
23
+ require_library_or_gem 'ruby-debug'
24
+ Debugger.start
25
+ Debugger.settings[:autoeval] = true if Debugger.respond_to?(:settings)
26
+ puts "=> Debugger enabled"
27
+ rescue Exception
28
+ puts "You need to install ruby-debug to run the server in debugging mode. With gems, use 'gem install ruby-debug'"
29
+ exit
30
+ end
31
+ end
@@ -12,13 +12,15 @@ OPTIONS = {
12
12
  :port => 3000,
13
13
  :ip => "0.0.0.0",
14
14
  :environment => (ENV['RAILS_ENV'] || "development").dup,
15
- :detach => false
15
+ :detach => false,
16
+ :debugger => false
16
17
  }
17
18
 
18
19
  ARGV.clone.options do |opts|
19
20
  opts.on("-p", "--port=port", Integer, "Runs Rails on the specified port.", "Default: 3000") { |v| OPTIONS[:port] = v }
20
21
  opts.on("-b", "--binding=ip", String, "Binds Rails to the specified ip.", "Default: 0.0.0.0") { |v| OPTIONS[:ip] = v }
21
22
  opts.on("-d", "--daemon", "Make server run as a Daemon.") { OPTIONS[:detach] = true }
23
+ opts.on("-u", "--debugger", "Enable ruby-debugging for the server.") { OPTIONS[:debugger] = true }
22
24
  opts.on("-e", "--environment=name", String,
23
25
  "Specifies the environment to run this server under (test/development/production).",
24
26
  "Default: development") { |v| OPTIONS[:environment] = v }
@@ -46,6 +48,8 @@ else
46
48
  ENV["RAILS_ENV"] = OPTIONS[:environment]
47
49
  RAILS_ENV.replace(OPTIONS[:environment]) if defined?(RAILS_ENV)
48
50
 
51
+ start_debugger if OPTIONS[:debugger]
52
+
49
53
  require 'initializer'
50
54
  Rails::Initializer.run(:initialize_logger)
51
55
 
@@ -1,14 +1,17 @@
1
1
  require 'webrick'
2
2
  require 'optparse'
3
+ require 'commands/servers/base'
3
4
 
4
5
  OPTIONS = {
5
- :port => 3000,
6
- :ip => "0.0.0.0",
7
- :environment => (ENV['RAILS_ENV'] || "development").dup,
8
- :server_root => File.expand_path(RAILS_ROOT + "/public/"),
9
- :server_type => WEBrick::SimpleServer,
10
- :charset => "UTF-8",
11
- :mime_types => WEBrick::HTTPUtils::DefaultMimeTypes
6
+ :port => 3000,
7
+ :ip => "0.0.0.0",
8
+ :environment => (ENV['RAILS_ENV'] || "development").dup,
9
+ :server_root => File.expand_path(RAILS_ROOT + "/public/"),
10
+ :server_type => WEBrick::SimpleServer,
11
+ :charset => "UTF-8",
12
+ :mime_types => WEBrick::HTTPUtils::DefaultMimeTypes,
13
+ :debugger => false
14
+
12
15
  }
13
16
 
14
17
  ARGV.options do |opts|
@@ -34,6 +37,8 @@ ARGV.options do |opts|
34
37
  "Make Rails run as a Daemon (only works if fork is available -- meaning on *nix)."
35
38
  ) { OPTIONS[:server_type] = WEBrick::Daemon }
36
39
 
40
+ opts.on("-u", "--debugger", "Enable ruby-debugging for the server.") { OPTIONS[:debugger] = true }
41
+
37
42
  opts.on("-c", "--charset=charset", String,
38
43
  "Set default charset for output.",
39
44
  "Default: UTF-8") { |v| OPTIONS[:charset] = v }
@@ -46,6 +51,8 @@ ARGV.options do |opts|
46
51
  opts.parse!
47
52
  end
48
53
 
54
+ start_debugger if OPTIONS[:debugger]
55
+
49
56
  ENV["RAILS_ENV"] = OPTIONS[:environment]
50
57
  RAILS_ENV.replace(OPTIONS[:environment]) if defined?(RAILS_ENV)
51
58
 
@@ -1,7 +1,7 @@
1
1
  require 'action_controller/integration'
2
2
 
3
3
  # work around the at_exit hook in test/unit, which kills IRB
4
- Test::Unit.run = true
4
+ Test::Unit.run = true if Test::Unit.respond_to?(:run=)
5
5
 
6
6
  # reference the global "app" instance, created on demand. To recreate the
7
7
  # instance, pass a non-false value as the parameter.
@@ -23,5 +23,8 @@ end
23
23
  #reloads the environment
24
24
  def reload!
25
25
  puts "Reloading..."
26
- Dispatcher.reset_application!
26
+ dispatcher = ActionController::Dispatcher.new($stdout)
27
+ dispatcher.cleanup_application(true)
28
+ dispatcher.prepare_application(true)
29
+ true
27
30
  end
@@ -10,8 +10,10 @@ class Module
10
10
  end
11
11
  end
12
12
 
13
- def helper
14
- @helper_proxy ||= Object.new
13
+ def helper(*helper_names)
14
+ returning @helper_proxy ||= Object.new do |helper|
15
+ helper_names.each { |h| helper.extend "#{h}_helper".classify.constantize }
16
+ end
15
17
  end
16
18
 
17
19
  require 'application'
@@ -21,3 +23,4 @@ class << helper
21
23
  end
22
24
 
23
25
  @controller = ApplicationController.new
26
+ helper :application rescue nil
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2004-2006 David Heinemeier Hansson
2
+ # Copyright (c) 2004-2007 David Heinemeier Hansson
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining
5
5
  # a copy of this software and associated documentation files (the
@@ -20,153 +20,5 @@
20
20
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
-
24
- # This class provides an interface for dispatching a CGI (or CGI-like) request
25
- # to the appropriate controller and action. It also takes care of resetting
26
- # the environment (when Dependencies.load? is true) after each request.
27
- class Dispatcher
28
-
29
- class << self
30
-
31
- # Dispatch the given CGI request, using the given session options, and
32
- # emitting the output via the given output. If you dispatch with your
33
- # own CGI object be sure to handle the exceptions it raises on multipart
34
- # requests (EOFError and ArgumentError).
35
- def dispatch(cgi = nil, session_options = ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, output = $stdout)
36
- controller = nil
37
- if cgi ||= new_cgi(output)
38
- request, response = ActionController::CgiRequest.new(cgi, session_options), ActionController::CgiResponse.new(cgi)
39
- prepare_application
40
- controller = ActionController::Routing::Routes.recognize(request)
41
- controller.process(request, response).out(output)
42
- end
43
- rescue Exception => exception # errors from CGI dispatch
44
- failsafe_response(output, '500 Internal Server Error', exception) do
45
- controller ||= (ApplicationController rescue ActionController::Base)
46
- controller.process_with_exception(request, response, exception).out(output)
47
- end
48
- ensure
49
- # Do not give a failsafe response here.
50
- reset_after_dispatch
51
- end
52
-
53
- # Reset the application by clearing out loaded controllers, views, actions,
54
- # mailers, and so forth. This allows them to be loaded again without having
55
- # to restart the server (WEBrick, FastCGI, etc.).
56
- def reset_application!
57
- ActiveRecord::Base.reset_subclasses if defined?(ActiveRecord)
58
-
59
- Dependencies.clear
60
- ActiveSupport::Deprecation.silence do # TODO: Remove after 1.2
61
- Class.remove_class(*Reloadable.reloadable_classes)
62
- end
63
-
64
- ActiveRecord::Base.clear_reloadable_connections! if defined?(ActiveRecord)
65
- end
66
-
67
- # Add a preparation callback. Preparation callbacks are run before every
68
- # request in development mode, and before the first request in production
69
- # mode.
70
- #
71
- # An optional identifier may be supplied for the callback. If provided,
72
- # to_prepare may be called again with the same identifier to replace the
73
- # existing callback. Passing an identifier is a suggested practice if the
74
- # code adding a preparation block may be reloaded.
75
- def to_prepare(identifier = nil, &block)
76
- unless identifier.nil?
77
- callback = preparation_callbacks.detect { |ident, _| ident == identifier }
78
-
79
- if callback # Already registered: update the existing callback
80
- callback[-1] = block
81
- return
82
- end
83
- end
84
-
85
- preparation_callbacks << [identifier, block]
86
-
87
- return
88
- end
89
-
90
- private
91
-
92
- attr_accessor :preparation_callbacks, :preparation_callbacks_run
93
- alias_method :preparation_callbacks_run?, :preparation_callbacks_run
94
-
95
- # CGI.new plus exception handling. CGI#read_multipart raises EOFError
96
- # if body.empty? or body.size != Content-Length and raises ArgumentError
97
- # if Content-Length is non-integer.
98
- def new_cgi(output)
99
- failsafe_response(output, '400 Bad Request') { CGI.new }
100
- end
101
-
102
- def prepare_application
103
- if Dependencies.load?
104
- ActionController::Routing::Routes.reload
105
- self.preparation_callbacks_run = false
106
- end
107
-
108
- prepare_breakpoint
109
- require_dependency 'application' unless Object.const_defined?(:ApplicationController)
110
- ActiveRecord::Base.verify_active_connections! if defined?(ActiveRecord)
111
- run_preparation_callbacks
112
- end
113
-
114
- def reset_after_dispatch
115
- reset_application! if Dependencies.load?
116
- Breakpoint.deactivate_drb if defined?(BREAKPOINT_SERVER_PORT)
117
- end
118
-
119
- def prepare_breakpoint
120
- return unless defined?(BREAKPOINT_SERVER_PORT)
121
- require 'breakpoint'
122
- Breakpoint.activate_drb("druby://localhost:#{BREAKPOINT_SERVER_PORT}", nil, !defined?(FastCGI))
123
- true
124
- rescue
125
- nil
126
- end
127
-
128
- def run_preparation_callbacks
129
- return if preparation_callbacks_run?
130
- preparation_callbacks.each { |_, callback| callback.call }
131
- self.preparation_callbacks_run = true
132
- end
133
-
134
- # If the block raises, send status code as a last-ditch response.
135
- def failsafe_response(output, status, exception = nil)
136
- yield
137
- rescue Exception # errors from executed block
138
- begin
139
- output.write "Status: #{status}\r\n"
140
-
141
- if exception
142
- message = exception.to_s + "\r\n" + exception.backtrace.join("\r\n")
143
- error_path = File.join(RAILS_ROOT, 'public', '500.html')
144
-
145
- if defined?(RAILS_DEFAULT_LOGGER) && !RAILS_DEFAULT_LOGGER.nil?
146
- RAILS_DEFAULT_LOGGER.fatal(message)
147
-
148
- output.write "Content-Type: text/html\r\n\r\n"
149
-
150
- if File.exists?(error_path)
151
- output.write(IO.read(error_path))
152
- else
153
- output.write("<html><body><h1>Application error (Rails)</h1></body></html>")
154
- end
155
- else
156
- output.write "Content-Type: text/plain\r\n\r\n"
157
- output.write(message)
158
- end
159
- end
160
- rescue Exception # Logger or IO errors
161
- end
162
- end
163
- end
164
-
165
- self.preparation_callbacks = []
166
- self.preparation_callbacks_run = false
167
-
168
- end
169
-
170
- Dispatcher.to_prepare :activerecord_instantiate_observers do
171
- ActiveRecord::Base.instantiate_observers
172
- end if defined?(ActiveRecord)
23
+ require 'action_controller/dispatcher'
24
+ Dispatcher = ActionController::Dispatcher