rails 1.0.0 → 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 (177) hide show
  1. data/CHANGELOG +1020 -10
  2. data/MIT-LICENSE +1 -1
  3. data/README +110 -60
  4. data/Rakefile +74 -139
  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/process/{spinner → inspector} +1 -1
  12. data/bin/rails +10 -12
  13. data/bin/runner +1 -1
  14. data/bin/server +1 -1
  15. data/{lib/rails_info.rb → builtin/rails_info/rails/info.rb} +33 -14
  16. data/builtin/rails_info/rails/info_controller.rb +9 -0
  17. data/builtin/rails_info/rails/info_helper.rb +2 -0
  18. data/builtin/rails_info/rails_info_controller.rb +2 -0
  19. data/configs/apache.conf +1 -1
  20. data/configs/databases/frontbase.yml +28 -0
  21. data/configs/databases/mysql.yml +54 -0
  22. data/configs/databases/oracle.yml +39 -0
  23. data/configs/databases/postgresql.yml +48 -0
  24. data/configs/databases/sqlite2.yml +16 -0
  25. data/configs/databases/sqlite3.yml +19 -0
  26. data/configs/initializers/inflections.rb +10 -0
  27. data/configs/initializers/mime_types.rb +5 -0
  28. data/configs/lighttpd.conf +29 -15
  29. data/configs/routes.rb +27 -11
  30. data/doc/README_FOR_APP +1 -1
  31. data/environments/boot.rb +103 -14
  32. data/environments/development.rb +5 -6
  33. data/environments/environment.rb +36 -30
  34. data/environments/production.rb +2 -3
  35. data/environments/test.rb +5 -2
  36. data/fresh_rakefile +2 -2
  37. data/helpers/application.rb +8 -2
  38. data/helpers/test_helper.rb +10 -0
  39. data/html/404.html +27 -5
  40. data/html/422.html +30 -0
  41. data/html/500.html +27 -5
  42. data/html/index.html +6 -6
  43. data/html/javascripts/application.js +2 -0
  44. data/html/javascripts/controls.js +532 -319
  45. data/html/javascripts/dragdrop.js +521 -133
  46. data/html/javascripts/effects.js +708 -442
  47. data/html/javascripts/prototype.js +3393 -953
  48. data/html/robots.txt +5 -1
  49. data/lib/code_statistics.rb +2 -2
  50. data/lib/commands/console.rb +18 -9
  51. data/lib/commands/performance/profiler.rb +25 -9
  52. data/lib/commands/performance/request.rb +6 -0
  53. data/lib/commands/plugin.rb +196 -96
  54. data/lib/commands/process/inspector.rb +68 -0
  55. data/lib/commands/process/reaper.rb +90 -71
  56. data/lib/commands/process/spawner.rb +188 -21
  57. data/lib/commands/process/spinner.rb +3 -3
  58. data/lib/commands/runner.rb +28 -7
  59. data/lib/commands/server.rb +20 -9
  60. data/lib/commands/servers/base.rb +31 -0
  61. data/lib/commands/servers/lighttpd.rb +60 -26
  62. data/lib/commands/servers/mongrel.rb +69 -0
  63. data/lib/commands/servers/webrick.rb +18 -11
  64. data/lib/console_app.rb +30 -0
  65. data/lib/console_sandbox.rb +2 -2
  66. data/lib/console_with_helpers.rb +26 -0
  67. data/lib/dispatcher.rb +3 -78
  68. data/lib/fcgi_handler.rb +98 -64
  69. data/lib/initializer.rb +323 -194
  70. data/lib/rails/plugin/loader.rb +150 -0
  71. data/lib/rails/plugin/locator.rb +78 -0
  72. data/lib/rails/plugin.rb +84 -0
  73. data/lib/{rails_version.rb → rails/version.rb} +1 -1
  74. data/lib/rails_generator/base.rb +85 -25
  75. data/lib/rails_generator/commands.rb +122 -40
  76. data/lib/rails_generator/generated_attribute.rb +42 -0
  77. data/lib/rails_generator/generators/applications/app/USAGE +0 -7
  78. data/lib/rails_generator/generators/applications/app/app_generator.rb +67 -28
  79. data/lib/rails_generator/generators/components/controller/USAGE +11 -12
  80. data/lib/rails_generator/generators/components/controller/controller_generator.rb +2 -3
  81. data/lib/rails_generator/generators/components/controller/templates/functional_test.rb +1 -11
  82. data/lib/rails_generator/generators/components/controller/templates/{view.rhtml → view.html.erb} +0 -0
  83. data/lib/rails_generator/generators/components/integration_test/USAGE +8 -0
  84. data/lib/rails_generator/generators/components/integration_test/integration_test_generator.rb +16 -0
  85. data/lib/rails_generator/generators/components/integration_test/templates/integration_test.rb +10 -0
  86. data/lib/rails_generator/generators/components/mailer/USAGE +9 -11
  87. data/lib/rails_generator/generators/components/mailer/mailer_generator.rb +10 -8
  88. data/lib/rails_generator/generators/components/mailer/templates/fixture.erb +3 -0
  89. data/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -3
  90. data/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +9 -25
  91. data/lib/rails_generator/generators/components/mailer/templates/view.erb +3 -0
  92. data/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -3
  93. data/lib/rails_generator/generators/components/migration/USAGE +23 -8
  94. data/lib/rails_generator/generators/components/migration/migration_generator.rb +15 -2
  95. data/lib/rails_generator/generators/components/migration/templates/migration.rb +7 -3
  96. data/lib/rails_generator/generators/components/model/USAGE +21 -11
  97. data/lib/rails_generator/generators/components/model/model_generator.rb +28 -1
  98. data/lib/rails_generator/generators/components/model/templates/fixtures.yml +18 -4
  99. data/lib/rails_generator/generators/components/model/templates/migration.rb +16 -0
  100. data/lib/rails_generator/generators/components/model/templates/unit_test.rb +2 -4
  101. data/lib/rails_generator/generators/components/observer/USAGE +13 -0
  102. data/lib/rails_generator/generators/components/observer/observer_generator.rb +16 -0
  103. data/lib/rails_generator/generators/components/observer/templates/observer.rb +2 -0
  104. data/lib/rails_generator/generators/components/observer/templates/unit_test.rb +8 -0
  105. data/lib/rails_generator/generators/components/plugin/USAGE +10 -18
  106. data/lib/rails_generator/generators/components/plugin/plugin_generator.rb +6 -0
  107. data/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +20 -0
  108. data/lib/rails_generator/generators/components/plugin/templates/README +10 -1
  109. data/lib/rails_generator/generators/components/plugin/templates/Rakefile +1 -1
  110. data/lib/rails_generator/generators/components/plugin/templates/USAGE +1 -1
  111. data/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -1
  112. data/lib/rails_generator/generators/components/plugin/templates/install.rb +1 -0
  113. data/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -1
  114. data/lib/rails_generator/generators/components/plugin/templates/tasks.rake +1 -1
  115. data/lib/rails_generator/generators/components/plugin/templates/uninstall.rb +1 -0
  116. data/lib/rails_generator/generators/components/resource/USAGE +23 -0
  117. data/lib/rails_generator/generators/components/resource/resource_generator.rb +74 -0
  118. data/lib/rails_generator/generators/components/resource/templates/controller.rb +2 -0
  119. data/lib/rails_generator/generators/components/resource/templates/functional_test.rb +8 -0
  120. data/lib/rails_generator/generators/components/resource/templates/helper.rb +2 -0
  121. data/lib/rails_generator/generators/components/scaffold/USAGE +24 -31
  122. data/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +45 -137
  123. data/lib/rails_generator/generators/components/scaffold/templates/controller.rb +65 -34
  124. data/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +23 -76
  125. data/lib/rails_generator/generators/components/scaffold/templates/layout.html.erb +17 -0
  126. data/lib/rails_generator/generators/components/scaffold/templates/style.css +5 -5
  127. data/lib/rails_generator/generators/components/scaffold/templates/view_edit.html.erb +19 -0
  128. data/lib/rails_generator/generators/components/scaffold/templates/view_index.html.erb +24 -0
  129. data/lib/rails_generator/generators/components/scaffold/templates/view_new.html.erb +18 -0
  130. data/lib/rails_generator/generators/components/scaffold/templates/view_show.html.erb +10 -0
  131. data/lib/rails_generator/generators/components/session_migration/USAGE +6 -11
  132. data/lib/rails_generator/generators/components/session_migration/session_migration_generator.rb +7 -1
  133. data/lib/rails_generator/generators/components/session_migration/templates/migration.rb +8 -7
  134. data/lib/rails_generator/lookup.rb +46 -12
  135. data/lib/rails_generator/options.rb +11 -8
  136. data/lib/rails_generator/scripts/destroy.rb +23 -0
  137. data/lib/rails_generator/scripts.rb +7 -4
  138. data/lib/rails_generator/secret_key_generator.rb +160 -0
  139. data/lib/rails_generator/spec.rb +1 -1
  140. data/lib/rails_generator.rb +1 -1
  141. data/lib/railties_path.rb +1 -1
  142. data/lib/ruby_version_check.rb +17 -0
  143. data/lib/source_annotation_extractor.rb +62 -0
  144. data/lib/tasks/annotations.rake +23 -0
  145. data/lib/tasks/databases.rake +328 -133
  146. data/lib/tasks/documentation.rake +72 -68
  147. data/lib/tasks/framework.rake +99 -58
  148. data/lib/tasks/log.rake +9 -0
  149. data/lib/tasks/misc.rake +2 -17
  150. data/lib/tasks/rails.rb +2 -2
  151. data/lib/tasks/routes.rake +17 -0
  152. data/lib/tasks/statistics.rake +10 -8
  153. data/lib/tasks/testing.rake +99 -31
  154. data/lib/tasks/tmp.rake +37 -0
  155. data/lib/test_help.rb +8 -5
  156. data/lib/webrick_server.rb +11 -16
  157. metadata +312 -272
  158. data/bin/breakpointer +0 -3
  159. data/builtin/controllers/rails_info_controller.rb +0 -11
  160. data/configs/database.yml +0 -85
  161. data/lib/binding_of_caller.rb +0 -85
  162. data/lib/breakpoint.rb +0 -523
  163. data/lib/breakpoint_client.rb +0 -196
  164. data/lib/commands/breakpointer.rb +0 -1
  165. data/lib/rails_generator/generators/components/scaffold/templates/form.rhtml +0 -3
  166. data/lib/rails_generator/generators/components/scaffold/templates/form_scaffolding.rhtml +0 -1
  167. data/lib/rails_generator/generators/components/scaffold/templates/layout.rhtml +0 -13
  168. data/lib/rails_generator/generators/components/scaffold/templates/view_edit.rhtml +0 -9
  169. data/lib/rails_generator/generators/components/scaffold/templates/view_list.rhtml +0 -27
  170. data/lib/rails_generator/generators/components/scaffold/templates/view_new.rhtml +0 -8
  171. data/lib/rails_generator/generators/components/scaffold/templates/view_show.rhtml +0 -8
  172. data/lib/rails_generator/generators/components/web_service/USAGE +0 -28
  173. data/lib/rails_generator/generators/components/web_service/templates/api_definition.rb +0 -5
  174. data/lib/rails_generator/generators/components/web_service/templates/controller.rb +0 -8
  175. data/lib/rails_generator/generators/components/web_service/templates/functional_test.rb +0 -19
  176. data/lib/rails_generator/generators/components/web_service/web_service_generator.rb +0 -29
  177. data/lib/tasks/javascripts.rake +0 -6
@@ -1,71 +1,112 @@
1
- desc "Lock this application to the current gems (by unpacking them into vendor/rails)"
2
- task :freeze_gems do
3
- deps = %w(actionpack activerecord actionmailer activesupport actionwebservice)
4
- require 'rubygems'
5
-
6
- rails = if version = ENV['VERSION']
7
- Gem.cache.search('rails', "= #{version}").first
8
- else
9
- Gem.cache.search('rails').sort_by { |g| g.version }.last
10
- end
11
- version ||= rails.version
12
-
13
- unless rails
14
- puts "No rails gem #{version} is installed. Do 'gem list rails' to see what you have available."
15
- exit
16
- end
1
+ namespace :rails do
2
+ namespace :freeze do
3
+ desc "Lock this application to the current gems (by unpacking them into vendor/rails)"
4
+ task :gems do
5
+ deps = %w(actionpack activerecord actionmailer activesupport activeresource)
6
+ require 'rubygems'
7
+ Gem.manage_gems
17
8
 
18
- puts "Freezing to the gems for Rails #{rails.version}"
19
- rm_rf "vendor/rails"
20
- mkdir_p "vendor/rails"
9
+ rails = (version = ENV['VERSION']) ?
10
+ Gem.cache.find_name('rails', "= #{version}").first :
11
+ Gem.cache.find_name('rails').sort_by { |g| g.version }.last
21
12
 
22
- rails.dependencies.select { |g| deps.include? g.name }.each do |g|
23
- system "cd vendor/rails; gem unpack -v '#{g.version_requirements}' #{g.name}; mv #{g.name}* #{g.name}"
24
- end
25
- system "cd vendor/rails; gem unpack -v '=#{version}' rails"
26
-
27
- FileUtils.mv(Dir.glob("vendor/rails/rails*").first, "vendor/rails/railties")
28
- end
13
+ version ||= rails.version
29
14
 
30
- desc "Lock this application to the Edge Rails (by exporting from Subversion). Defaults to svn HEAD; do 'rake freeze_edge REVISION=1234' to lock to a specific revision."
31
- task :freeze_edge do
32
- $verbose = false
33
- `svn --version` rescue nil
34
- unless !$?.nil? && $?.success?
35
- $stderr.puts "ERROR: Must have subversion (svn) available in the PATH to lock this application to Edge Rails"
36
- exit 1
37
- end
15
+ unless rails
16
+ puts "No rails gem #{version} is installed. Do 'gem list rails' to see what you have available."
17
+ exit
18
+ end
19
+
20
+ puts "Freezing to the gems for Rails #{rails.version}"
21
+ rm_rf "vendor/rails"
22
+ mkdir_p "vendor/rails"
23
+
24
+ chdir("vendor/rails") do
25
+ rails.dependencies.select { |g| deps.include? g.name }.each do |g|
26
+ Gem::GemRunner.new.run(["unpack", "-v", "#{g.version_requirements}", "#{g.name}"])
27
+ mv(Dir.glob("#{g.name}*").first, g.name)
28
+ end
29
+
30
+ Gem::GemRunner.new.run(["unpack", "-v", "=#{version}", "rails"])
31
+ FileUtils.mv(Dir.glob("rails*").first, "railties")
32
+ end
33
+ end
34
+
35
+ desc "Lock to latest Edge Rails or a specific revision with REVISION=X (ex: REVISION=4021) or a tag with TAG=Y (ex: TAG=rel_1-1-0)"
36
+ task :edge do
37
+ $verbose = false
38
+ `svn --version` rescue nil
39
+ unless !$?.nil? && $?.success?
40
+ $stderr.puts "ERROR: Must have subversion (svn) available in the PATH to lock this application to Edge Rails"
41
+ exit 1
42
+ end
43
+
44
+ rm_rf "vendor/rails"
45
+ mkdir_p "vendor/rails"
46
+
47
+ svn_root = "http://dev.rubyonrails.org/svn/rails/"
48
+
49
+ if ENV['TAG']
50
+ rails_svn = "#{svn_root}/tags/#{ENV['TAG']}"
51
+ touch "vendor/rails/TAG_#{ENV['TAG']}"
52
+ else
53
+ rails_svn = "#{svn_root}/trunk"
38
54
 
39
- rm_rf "vendor/rails"
40
- mkdir_p "vendor/rails"
55
+ if ENV['REVISION'].nil?
56
+ ENV['REVISION'] = /^r(\d+)/.match(%x{svn -qr HEAD log #{svn_root}})[1]
57
+ puts "REVISION not set. Using HEAD, which is revision #{ENV['REVISION']}."
58
+ end
41
59
 
42
- revision_switch = ENV['REVISION'] ? " -r #{ENV['REVISION']}" : ''
43
- for framework in %w( railties actionpack activerecord actionmailer activesupport actionwebservice )
44
- mkdir_p "vendor/rails/#{framework}"
45
- system "svn export http://dev.rubyonrails.org/svn/rails/trunk/#{framework}/lib vendor/rails/#{framework}/lib #{revision_switch}"
60
+ touch "vendor/rails/REVISION_#{ENV['REVISION']}"
61
+ end
62
+
63
+ for framework in %w(railties actionpack activerecord actionmailer activesupport activeresource)
64
+ system "svn export #{rails_svn}/#{framework} vendor/rails/#{framework}" + (ENV['REVISION'] ? " -r #{ENV['REVISION']}" : "")
65
+ end
66
+ end
46
67
  end
47
- end
48
68
 
49
- desc "Unlock this application from freeze of gems or edge and return to a fluid use of system gems"
50
- task :unfreeze_rails do
51
- rm_rf "vendor/rails"
52
- end
69
+ desc "Unlock this application from freeze of gems or edge and return to a fluid use of system gems"
70
+ task :unfreeze do
71
+ rm_rf "vendor/rails"
72
+ end
53
73
 
54
- desc "Add new scripts to the application script/ directory"
55
- task :add_new_scripts do
56
- local_base = "script"
57
- edge_base = "#{File.dirname(__FILE__)}/../../bin"
74
+ desc "Update both configs, scripts and public/javascripts from Rails"
75
+ task :update => [ "update:scripts", "update:javascripts", "update:configs" ]
58
76
 
59
- local = Dir["#{local_base}/**/*"].reject { |path| File.directory?(path) }
60
- edge = Dir["#{edge_base}/**/*"].reject { |path| File.directory?(path) }
77
+ namespace :update do
78
+ desc "Add new scripts to the application script/ directory"
79
+ task :scripts do
80
+ local_base = "script"
81
+ edge_base = "#{File.dirname(__FILE__)}/../../bin"
82
+
83
+ local = Dir["#{local_base}/**/*"].reject { |path| File.directory?(path) }
84
+ edge = Dir["#{edge_base}/**/*"].reject { |path| File.directory?(path) }
61
85
 
62
- edge.each do |script|
63
- base_name = script[(edge_base.length+1)..-1]
64
- next if base_name == "rails"
65
- next if local.detect { |path| base_name == path[(local_base.length+1)..-1] }
66
- if !File.directory?("#{local_base}/#{File.dirname(base_name)}")
67
- mkdir_p "#{local_base}/#{File.dirname(base_name)}"
86
+ edge.each do |script|
87
+ base_name = script[(edge_base.length+1)..-1]
88
+ next if base_name == "rails"
89
+ next if local.detect { |path| base_name == path[(local_base.length+1)..-1] }
90
+ if !File.directory?("#{local_base}/#{File.dirname(base_name)}")
91
+ mkdir_p "#{local_base}/#{File.dirname(base_name)}"
92
+ end
93
+ install script, "#{local_base}/#{base_name}", :mode => 0755
94
+ end
95
+ end
96
+
97
+ desc "Update your javascripts from your current rails install"
98
+ task :javascripts do
99
+ require 'railties_path'
100
+ project_dir = RAILS_ROOT + '/public/javascripts/'
101
+ scripts = Dir[RAILTIES_PATH + '/html/javascripts/*.js']
102
+ scripts.reject!{|s| File.basename(s) == 'application.js'} if File.exists?(project_dir + 'application.js')
103
+ FileUtils.cp(scripts, project_dir)
104
+ end
105
+
106
+ desc "Update config/boot.rb from your current rails install"
107
+ task :configs do
108
+ require 'railties_path'
109
+ FileUtils.cp(RAILTIES_PATH + '/environments/boot.rb', RAILS_ROOT + '/config/boot.rb')
68
110
  end
69
- install script, "#{local_base}/#{base_name}", :mode => 0755
70
111
  end
71
112
  end
@@ -0,0 +1,9 @@
1
+ namespace :log do
2
+ desc "Truncates all *.log files in log/ to zero bytes"
3
+ task :clear do
4
+ FileList["log/*.log"].each do |log_file|
5
+ f = File.open(log_file, "w")
6
+ f.close
7
+ end
8
+ end
9
+ end
data/lib/tasks/misc.rake CHANGED
@@ -1,19 +1,4 @@
1
- desc "Run all the tests on a fresh test database"
2
- task :default do
3
- Rake::Task[:test_units].invoke rescue got_error = true
4
- Rake::Task[:test_functional].invoke rescue got_error = true
5
- raise "Test failures" if got_error
6
- end
7
-
1
+ task :default => :test
8
2
  task :environment do
9
3
  require(File.join(RAILS_ROOT, 'config', 'environment'))
10
- end
11
-
12
-
13
- desc "Clears all *.log files in log/"
14
- task :clear_logs do
15
- FileList["log/*.log"].each do |log_file|
16
- f = File.open(log_file, "w")
17
- f.close
18
- end
19
- end
4
+ end
data/lib/tasks/rails.rb CHANGED
@@ -4,5 +4,5 @@ $VERBOSE = nil
4
4
  Dir["#{File.dirname(__FILE__)}/*.rake"].each { |ext| load ext }
5
5
 
6
6
  # Load any custom rakefile extensions
7
- Dir["./lib/tasks/**/*.rake"].sort.each { |ext| load ext }
8
- Dir["./vendor/plugins/*/tasks/**/*.rake"].sort.each { |ext| load ext }
7
+ Dir["#{RAILS_ROOT}/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
8
+ Dir["#{RAILS_ROOT}/vendor/plugins/*/**/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
@@ -1,12 +1,14 @@
1
1
  STATS_DIRECTORIES = [
2
- %w(Helpers app/helpers),
3
- %w(Controllers app/controllers),
4
- %w(APIs app/apis),
5
- %w(Components components),
6
- %w(Functional\ tests test/functional),
7
- %w(Models app/models),
8
- %w(Unit\ tests test/unit),
9
- %w(Libraries lib/)
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
+
10
12
  ].collect { |name, dir| [ name, "#{RAILS_ROOT}/#{dir}" ] }.select { |name, dir| File.directory?(dir) }
11
13
 
12
14
  desc "Report code statistics (KLOCs, etc) from the application"
@@ -4,47 +4,115 @@ TEST_CHANGES_SINCE = Time.now - 600
4
4
  def recent_tests(source_pattern, test_path, touched_since = 10.minutes.ago)
5
5
  FileList[source_pattern].map do |path|
6
6
  if File.mtime(path) > touched_since
7
- test = "#{test_path}/#{File.basename(path, '.rb')}_test.rb"
8
- test if File.exists?(test)
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.exists?(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.exists?(test)
21
+
22
+ return tests
23
+
9
24
  end
10
- end.compact
25
+ end.flatten.compact
11
26
  end
12
27
 
13
- desc 'Test recent changes'
14
- Rake::TestTask.new(:recent => [ :prepare_test_database ]) do |t|
15
- since = TEST_CHANGES_SINCE
16
- touched = FileList['test/**/*_test.rb'].select { |path| File.mtime(path) > since } +
17
- recent_tests('app/models/*.rb', 'test/unit', since) +
18
- recent_tests('app/controllers/*.rb', 'test/functional', since)
19
28
 
20
- t.libs << 'test'
21
- t.verbose = true
22
- t.test_files = touched.uniq
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
23
39
  end
24
40
 
25
- desc "Run the unit tests in test/unit"
26
- Rake::TestTask.new(:test_units => [ :prepare_test_database ]) do |t|
27
- t.libs << "test"
28
- t.pattern = 'test/unit/**/*_test.rb'
29
- t.verbose = true
41
+ desc 'Test all units and functionals'
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?
30
52
  end
31
53
 
32
- desc "Run the functional tests in test/functional"
33
- Rake::TestTask.new(:test_functional => [ :prepare_test_database ]) do |t|
34
- t.libs << "test"
35
- t.pattern = 'test/functional/**/*_test.rb'
36
- t.verbose = true
37
- end
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)
38
60
 
39
- desc "Run the plugin tests in vendor/plugins/**/test (or specify with PLUGIN=name)"
40
- Rake::TestTask.new(:test_plugins => :environment) do |t|
41
- t.libs << "test"
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"
42
66
 
43
- if ENV['PLUGIN']
44
- t.pattern = "vendor/plugins/#{ENV['PLUGIN']}/test/**/*_test.rb"
45
- else
46
- t.pattern = 'vendor/plugins/**/test/**/*_test.rb'
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
47
89
  end
90
+ Rake::Task['test:units'].comment = "Run the unit tests in test/unit"
48
91
 
49
- t.verbose = true
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)"
50
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 CHANGED
@@ -1,17 +1,20 @@
1
- require 'application'
1
+ require_dependency 'application'
2
2
 
3
- # Make double-sure the RAILS_ENV is set to test,
3
+ # Make double-sure the RAILS_ENV is set to test,
4
4
  # so fixtures are loaded to the right database
5
5
  silence_warnings { RAILS_ENV = "test" }
6
6
 
7
7
  require 'test/unit'
8
+ require 'active_support/test_case'
8
9
  require 'active_record/fixtures'
10
+ require 'action_controller/test_case'
9
11
  require 'action_controller/test_process'
10
- require 'action_web_service/test_invoke'
11
- require 'breakpoint'
12
+ require 'action_controller/integration'
13
+ require 'action_mailer/test_case' if defined?(ActionMailer)
12
14
 
13
15
  Test::Unit::TestCase.fixture_path = RAILS_ROOT + "/test/fixtures/"
16
+ ActionController::IntegrationTest.fixture_path = Test::Unit::TestCase.fixture_path
14
17
 
15
18
  def create_fixtures(*table_names)
16
- Fixtures.create_fixtures(RAILS_ROOT + "/test/fixtures", table_names)
19
+ Fixtures.create_fixtures(Test::Unit::TestCase.fixture_path, table_names)
17
20
  end
@@ -3,13 +3,10 @@
3
3
  require 'webrick'
4
4
  require 'cgi'
5
5
  require 'stringio'
6
+ require 'dispatcher'
6
7
 
7
8
  include WEBrick
8
9
 
9
- ABSOLUTE_RAILS_ROOT = File.expand_path(RAILS_ROOT)
10
-
11
- ActiveRecord::Base.threaded_connections = false
12
-
13
10
  class CGI #:nodoc:
14
11
  def stdinput
15
12
  @stdin || $stdin
@@ -62,31 +59,29 @@ class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet
62
59
  server.mount('/', DispatchServlet, options)
63
60
 
64
61
  trap("INT") { server.shutdown }
65
-
66
- require File.join(@server_options[:server_root], "..", "config", "environment") unless defined?(RAILS_ROOT)
67
- require "dispatcher"
68
-
69
62
  server.start
70
63
  end
71
64
 
72
65
  def initialize(server, options) #:nodoc:
73
66
  @server_options = options
74
67
  @file_handler = WEBrick::HTTPServlet::FileHandler.new(server, options[:server_root])
75
- Dir.chdir(ABSOLUTE_RAILS_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 railties/lib/commands/servers/webrick.rb
70
+ Dir.chdir(OPTIONS['working_directory']) if defined?(OPTIONS) && File.directory?(OPTIONS['working_directory'])
76
71
  super
77
72
  end
78
73
 
79
74
  def service(req, res) #:nodoc:
80
- begin
81
- unless handle_file(req, res)
75
+ unless handle_file(req, res)
76
+ begin
82
77
  REQUEST_MUTEX.lock unless ActionController::Base.allow_concurrency
83
78
  unless handle_dispatch(req, res)
84
79
  raise WEBrick::HTTPStatus::NotFound, "`#{req.path}' not found."
85
80
  end
86
- end
87
- ensure
88
- unless ActionController::Base.allow_concurrency
89
- REQUEST_MUTEX.unlock if REQUEST_MUTEX.locked?
81
+ ensure
82
+ unless ActionController::Base.allow_concurrency
83
+ REQUEST_MUTEX.unlock if REQUEST_MUTEX.locked?
84
+ end
90
85
  end
91
86
  end
92
87
  end
@@ -147,7 +142,7 @@ class DispatchServlet < WEBrick::HTTPServlet::AbstractServlet
147
142
  data.rewind
148
143
  data = data.read
149
144
 
150
- raw_header, body = *data.split(/^[\xd\xa]+/on, 2)
145
+ raw_header, body = *data.split(/^[\xd\xa]{2}/on, 2)
151
146
  header = WEBrick::HTTPUtils::parse_header(raw_header)
152
147
 
153
148
  return header, body