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.
- data/CHANGELOG +3 -0
- data/MIT-LICENSE +20 -0
- data/README +309 -0
- data/Rakefile +339 -0
- data/bin/about +4 -0
- data/bin/console +3 -0
- data/bin/dbconsole +3 -0
- data/bin/destroy +3 -0
- data/bin/erails +19 -0
- data/bin/generate +3 -0
- data/bin/performance/benchmarker +3 -0
- data/bin/performance/profiler +3 -0
- data/bin/performance/request +3 -0
- data/bin/plugin +3 -0
- data/bin/process/inspector +3 -0
- data/bin/process/reaper +3 -0
- data/bin/process/spawner +3 -0
- data/bin/runner +3 -0
- data/bin/server +3 -0
- data/builtin/rails_info/rails/info.rb +125 -0
- data/builtin/rails_info/rails/info_controller.rb +9 -0
- data/builtin/rails_info/rails/info_helper.rb +2 -0
- data/builtin/rails_info/rails_info_controller.rb +2 -0
- data/configs/apache.conf +40 -0
- data/configs/databases/frontbase.yml +28 -0
- data/configs/databases/mysql.yml +54 -0
- data/configs/databases/oracle.yml +39 -0
- data/configs/databases/postgresql.yml +48 -0
- data/configs/databases/sqlite2.yml +16 -0
- data/configs/databases/sqlite3.yml +19 -0
- data/configs/empty.log +0 -0
- data/configs/initializers/inflections.rb +10 -0
- data/configs/initializers/mime_types.rb +5 -0
- data/configs/initializers/new_rails_defaults.rb +17 -0
- data/configs/lighttpd.conf +54 -0
- data/configs/routes.rb +43 -0
- data/dispatches/dispatch.fcgi +24 -0
- data/dispatches/dispatch.rb +10 -0
- data/dispatches/gateway.cgi +97 -0
- data/doc/README_FOR_APP +2 -0
- data/environments/boot.rb +109 -0
- data/environments/development.rb +16 -0
- data/environments/environment.rb +71 -0
- data/environments/production.rb +22 -0
- data/environments/test.rb +22 -0
- data/fresh_rakefile +10 -0
- data/helpers/application.rb +15 -0
- data/helpers/application_helper.rb +3 -0
- data/helpers/test_helper.rb +38 -0
- data/html/404.html +30 -0
- data/html/422.html +30 -0
- data/html/500.html +30 -0
- data/html/favicon.ico +0 -0
- data/html/images/rails.png +0 -0
- data/html/index.html +274 -0
- data/html/javascripts/application.js +2 -0
- data/html/robots.txt +5 -0
- data/lib/code_statistics.rb +107 -0
- data/lib/commands/about.rb +3 -0
- data/lib/commands/console.rb +32 -0
- data/lib/commands/dbconsole.rb +67 -0
- data/lib/commands/destroy.rb +6 -0
- data/lib/commands/generate.rb +6 -0
- data/lib/commands/ncgi/listener +86 -0
- data/lib/commands/ncgi/tracker +69 -0
- data/lib/commands/performance/benchmarker.rb +24 -0
- data/lib/commands/performance/profiler.rb +50 -0
- data/lib/commands/performance/request.rb +6 -0
- data/lib/commands/plugin.rb +950 -0
- data/lib/commands/process/inspector.rb +68 -0
- data/lib/commands/process/reaper.rb +149 -0
- data/lib/commands/process/spawner.rb +219 -0
- data/lib/commands/process/spinner.rb +57 -0
- data/lib/commands/runner.rb +48 -0
- data/lib/commands/server.rb +39 -0
- data/lib/commands/servers/base.rb +31 -0
- data/lib/commands/servers/lighttpd.rb +94 -0
- data/lib/commands/servers/mongrel.rb +69 -0
- data/lib/commands/servers/new_mongrel.rb +16 -0
- data/lib/commands/servers/webrick.rb +66 -0
- data/lib/commands/update.rb +4 -0
- data/lib/commands.rb +17 -0
- data/lib/console_app.rb +30 -0
- data/lib/console_sandbox.rb +6 -0
- data/lib/console_with_helpers.rb +26 -0
- data/lib/dispatcher.rb +24 -0
- data/lib/fcgi_handler.rb +239 -0
- data/lib/initializer.rb +926 -0
- data/lib/rails/gem_builder.rb +21 -0
- data/lib/rails/gem_dependency.rb +129 -0
- data/lib/rails/mongrel_server/commands.rb +342 -0
- data/lib/rails/mongrel_server/handler.rb +55 -0
- data/lib/rails/plugin/loader.rb +152 -0
- data/lib/rails/plugin/locator.rb +100 -0
- data/lib/rails/plugin.rb +116 -0
- data/lib/rails/version.rb +9 -0
- data/lib/rails_generator/base.rb +263 -0
- data/lib/rails_generator/commands.rb +622 -0
- data/lib/rails_generator/generated_attribute.rb +42 -0
- data/lib/rails_generator/generators/applications/app/USAGE +9 -0
- data/lib/rails_generator/generators/applications/app/app_generator.rb +174 -0
- data/lib/rails_generator/generators/components/controller/USAGE +29 -0
- data/lib/rails_generator/generators/components/controller/controller_generator.rb +37 -0
- data/lib/rails_generator/generators/components/controller/templates/controller.rb +7 -0
- data/lib/rails_generator/generators/components/controller/templates/functional_test.rb +8 -0
- data/lib/rails_generator/generators/components/controller/templates/helper.rb +2 -0
- data/lib/rails_generator/generators/components/controller/templates/view.html.erb +2 -0
- data/lib/rails_generator/generators/components/integration_test/USAGE +8 -0
- data/lib/rails_generator/generators/components/integration_test/integration_test_generator.rb +16 -0
- data/lib/rails_generator/generators/components/integration_test/templates/integration_test.rb +10 -0
- data/lib/rails_generator/generators/components/mailer/USAGE +16 -0
- data/lib/rails_generator/generators/components/mailer/mailer_generator.rb +30 -0
- data/lib/rails_generator/generators/components/mailer/templates/fixture.erb +3 -0
- data/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -0
- data/lib/rails_generator/generators/components/mailer/templates/mailer.rb +15 -0
- data/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +21 -0
- data/lib/rails_generator/generators/components/mailer/templates/view.erb +3 -0
- data/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -0
- data/lib/rails_generator/generators/components/migration/USAGE +29 -0
- data/lib/rails_generator/generators/components/migration/migration_generator.rb +20 -0
- data/lib/rails_generator/generators/components/migration/templates/migration.rb +11 -0
- data/lib/rails_generator/generators/components/model/USAGE +27 -0
- data/lib/rails_generator/generators/components/model/model_generator.rb +45 -0
- data/lib/rails_generator/generators/components/model/templates/fixtures.yml +19 -0
- data/lib/rails_generator/generators/components/model/templates/migration.rb +16 -0
- data/lib/rails_generator/generators/components/model/templates/model.rb +2 -0
- data/lib/rails_generator/generators/components/model/templates/unit_test.rb +8 -0
- data/lib/rails_generator/generators/components/observer/USAGE +13 -0
- data/lib/rails_generator/generators/components/observer/observer_generator.rb +16 -0
- data/lib/rails_generator/generators/components/observer/templates/observer.rb +2 -0
- data/lib/rails_generator/generators/components/observer/templates/unit_test.rb +8 -0
- data/lib/rails_generator/generators/components/plugin/USAGE +25 -0
- data/lib/rails_generator/generators/components/plugin/plugin_generator.rb +39 -0
- data/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +20 -0
- data/lib/rails_generator/generators/components/plugin/templates/README +13 -0
- data/lib/rails_generator/generators/components/plugin/templates/Rakefile +22 -0
- data/lib/rails_generator/generators/components/plugin/templates/USAGE +8 -0
- data/lib/rails_generator/generators/components/plugin/templates/generator.rb +8 -0
- data/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -0
- data/lib/rails_generator/generators/components/plugin/templates/install.rb +1 -0
- data/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -0
- data/lib/rails_generator/generators/components/plugin/templates/tasks.rake +4 -0
- data/lib/rails_generator/generators/components/plugin/templates/uninstall.rb +1 -0
- data/lib/rails_generator/generators/components/plugin/templates/unit_test.rb +8 -0
- data/lib/rails_generator/generators/components/resource/USAGE +23 -0
- data/lib/rails_generator/generators/components/resource/resource_generator.rb +74 -0
- data/lib/rails_generator/generators/components/resource/templates/controller.rb +2 -0
- data/lib/rails_generator/generators/components/resource/templates/functional_test.rb +8 -0
- data/lib/rails_generator/generators/components/resource/templates/helper.rb +2 -0
- data/lib/rails_generator/generators/components/scaffold/USAGE +25 -0
- data/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +93 -0
- data/lib/rails_generator/generators/components/scaffold/templates/controller.rb +85 -0
- data/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +45 -0
- data/lib/rails_generator/generators/components/scaffold/templates/helper.rb +2 -0
- data/lib/rails_generator/generators/components/scaffold/templates/layout.html.erb +17 -0
- data/lib/rails_generator/generators/components/scaffold/templates/style.css +54 -0
- data/lib/rails_generator/generators/components/scaffold/templates/view_edit.html.erb +18 -0
- data/lib/rails_generator/generators/components/scaffold/templates/view_index.html.erb +24 -0
- data/lib/rails_generator/generators/components/scaffold/templates/view_new.html.erb +17 -0
- data/lib/rails_generator/generators/components/scaffold/templates/view_show.html.erb +10 -0
- data/lib/rails_generator/generators/components/session_migration/USAGE +10 -0
- data/lib/rails_generator/generators/components/session_migration/session_migration_generator.rb +18 -0
- data/lib/rails_generator/generators/components/session_migration/templates/migration.rb +16 -0
- data/lib/rails_generator/lookup.rb +249 -0
- data/lib/rails_generator/manifest.rb +53 -0
- data/lib/rails_generator/options.rb +150 -0
- data/lib/rails_generator/scripts/destroy.rb +30 -0
- data/lib/rails_generator/scripts/generate.rb +7 -0
- data/lib/rails_generator/scripts/update.rb +12 -0
- data/lib/rails_generator/scripts.rb +89 -0
- data/lib/rails_generator/secret_key_generator.rb +164 -0
- data/lib/rails_generator/simple_logger.rb +46 -0
- data/lib/rails_generator/spec.rb +44 -0
- data/lib/rails_generator.rb +43 -0
- data/lib/railties_path.rb +1 -0
- data/lib/ruby_version_check.rb +17 -0
- data/lib/rubyprof_ext.rb +35 -0
- data/lib/source_annotation_extractor.rb +102 -0
- data/lib/tasks/annotations.rake +23 -0
- data/lib/tasks/databases.rake +389 -0
- data/lib/tasks/documentation.rake +80 -0
- data/lib/tasks/framework.rake +105 -0
- data/lib/tasks/gems.rake +64 -0
- data/lib/tasks/log.rake +9 -0
- data/lib/tasks/misc.rake +57 -0
- data/lib/tasks/rails.rb +8 -0
- data/lib/tasks/routes.rake +17 -0
- data/lib/tasks/statistics.rake +18 -0
- data/lib/tasks/testing.rake +118 -0
- data/lib/tasks/tmp.rake +37 -0
- data/lib/test_help.rb +28 -0
- data/lib/webrick_server.rb +165 -0
- metadata +356 -0
data/lib/tasks/misc.rake
ADDED
|
@@ -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
|
data/lib/tasks/rails.rb
ADDED
|
@@ -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
|
data/lib/tasks/tmp.rake
ADDED
|
@@ -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
|