railties 4.0.0.beta1 → 4.0.0.rc1

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +120 -27
  3. data/RDOC_MAIN.rdoc +73 -0
  4. data/bin/rails +3 -1
  5. data/lib/rails/api/task.rb +158 -0
  6. data/lib/rails/app_rails_loader.rb +44 -20
  7. data/lib/rails/application.rb +55 -32
  8. data/lib/rails/application/configuration.rb +9 -7
  9. data/lib/rails/commands.rb +2 -0
  10. data/lib/rails/commands/console.rb +3 -1
  11. data/lib/rails/commands/server.rb +6 -2
  12. data/lib/rails/engine.rb +4 -3
  13. data/lib/rails/generators/actions.rb +1 -1
  14. data/lib/rails/generators/app_base.rb +52 -30
  15. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb +10 -1
  16. data/lib/rails/generators/erb/scaffold/templates/index.html.erb +9 -9
  17. data/lib/rails/generators/erb/scaffold/templates/show.html.erb +1 -2
  18. data/lib/rails/generators/generated_attribute.rb +4 -0
  19. data/lib/rails/generators/named_base.rb +2 -1
  20. data/lib/rails/generators/rails/app/templates/Gemfile +9 -4
  21. data/lib/rails/generators/rails/app/templates/config.ru +1 -1
  22. data/lib/rails/generators/rails/app/templates/config/application.rb +3 -2
  23. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +2 -0
  24. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +2 -2
  25. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +1 -1
  26. data/lib/rails/generators/rails/app/templates/config/initializers/secret_token.rb.tt +1 -1
  27. data/lib/rails/generators/rails/app/templates/config/initializers/session_store.rb.tt +1 -1
  28. data/lib/rails/generators/rails/app/templates/config/routes.rb +1 -1
  29. data/lib/rails/generators/rails/app/templates/public/404.html +41 -10
  30. data/lib/rails/generators/rails/app/templates/public/422.html +42 -10
  31. data/lib/rails/generators/rails/app/templates/public/500.html +41 -10
  32. data/lib/rails/generators/rails/app/templates/test/test_helper.rb +1 -1
  33. data/lib/rails/generators/rails/model/USAGE +16 -10
  34. data/lib/rails/generators/rails/plugin_new/plugin_new_generator.rb +9 -5
  35. data/lib/rails/generators/rails/plugin_new/templates/%name%.gemspec +0 -3
  36. data/lib/rails/generators/rails/plugin_new/templates/Gemfile +0 -8
  37. data/lib/rails/generators/rails/plugin_new/templates/rails/boot.rb +4 -8
  38. data/lib/rails/generators/rails/plugin_new/templates/rails/javascripts.js +13 -0
  39. data/lib/rails/generators/rails/plugin_new/templates/rails/stylesheets.css +13 -0
  40. data/lib/rails/generators/rails/scaffold/scaffold_generator.rb +1 -0
  41. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb +1 -1
  42. data/lib/rails/generators/test_case.rb +6 -211
  43. data/lib/rails/generators/test_unit/model/templates/fixtures.yml +7 -9
  44. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +5 -1
  45. data/lib/rails/generators/testing/assertions.rb +121 -0
  46. data/lib/rails/generators/testing/behaviour.rb +106 -0
  47. data/lib/rails/generators/testing/setup_and_teardown.rb +18 -0
  48. data/lib/rails/info.rb +2 -2
  49. data/lib/rails/tasks/documentation.rake +2 -46
  50. data/lib/rails/templates/rails/welcome/index.html.erb +1 -1
  51. data/lib/rails/test_unit/railtie.rb +4 -0
  52. data/lib/rails/test_unit/sub_test_task.rb +78 -1
  53. data/lib/rails/test_unit/testing.rake +32 -42
  54. data/lib/rails/version.rb +3 -3
  55. metadata +15 -23
  56. data/lib/rails/generators/rails/app/templates/app/assets/images/rails.png +0 -0
@@ -0,0 +1,106 @@
1
+ require 'active_support/core_ext/class/attribute'
2
+ require 'active_support/core_ext/module/delegation'
3
+ require 'active_support/core_ext/hash/reverse_merge'
4
+ require 'active_support/core_ext/kernel/reporting'
5
+ require 'active_support/concern'
6
+ require 'rails/generators'
7
+
8
+ module Rails
9
+ module Generators
10
+ module Testing
11
+ module Behaviour
12
+ extend ActiveSupport::Concern
13
+
14
+ included do
15
+ class_attribute :destination_root, :current_path, :generator_class, :default_arguments
16
+
17
+ # Generators frequently change the current path using +FileUtils.cd+.
18
+ # So we need to store the path at file load and revert back to it after each test.
19
+ self.current_path = File.expand_path(Dir.pwd)
20
+ self.default_arguments = []
21
+ end
22
+
23
+ module ClassMethods
24
+ # Sets which generator should be tested:
25
+ #
26
+ # tests AppGenerator
27
+ def tests(klass)
28
+ self.generator_class = klass
29
+ end
30
+
31
+ # Sets default arguments on generator invocation. This can be overwritten when
32
+ # invoking it.
33
+ #
34
+ # arguments %w(app_name --skip-active-record)
35
+ def arguments(array)
36
+ self.default_arguments = array
37
+ end
38
+
39
+ # Sets the destination of generator files:
40
+ #
41
+ # destination File.expand_path("../tmp", File.dirname(__FILE__))
42
+ def destination(path)
43
+ self.destination_root = path
44
+ end
45
+ end
46
+
47
+ # Runs the generator configured for this class. The first argument is an array like
48
+ # command line arguments:
49
+ #
50
+ # class AppGeneratorTest < Rails::Generators::TestCase
51
+ # tests AppGenerator
52
+ # destination File.expand_path("../tmp", File.dirname(__FILE__))
53
+ # teardown :cleanup_destination_root
54
+ #
55
+ # test "database.yml is not created when skipping Active Record" do
56
+ # run_generator %w(myapp --skip-active-record)
57
+ # assert_no_file "config/database.yml"
58
+ # end
59
+ # end
60
+ #
61
+ # You can provide a configuration hash as second argument. This method returns the output
62
+ # printed by the generator.
63
+ def run_generator(args=self.default_arguments, config={})
64
+ capture(:stdout) do
65
+ args += ['--skip-bundle'] unless args.include? '--dev'
66
+ self.generator_class.start(args, config.reverse_merge(destination_root: destination_root))
67
+ end
68
+ end
69
+
70
+ # Instantiate the generator.
71
+ def generator(args=self.default_arguments, options={}, config={})
72
+ @generator ||= self.generator_class.new(args, options, config.reverse_merge(destination_root: destination_root))
73
+ end
74
+
75
+ # Create a Rails::Generators::GeneratedAttribute by supplying the
76
+ # attribute type and, optionally, the attribute name:
77
+ #
78
+ # create_generated_attribute(:string, 'name')
79
+ def create_generated_attribute(attribute_type, name = 'test', index = nil)
80
+ Rails::Generators::GeneratedAttribute.parse([name, attribute_type, index].compact.join(':'))
81
+ end
82
+
83
+ protected
84
+
85
+ def destination_root_is_set? # :nodoc:
86
+ raise "You need to configure your Rails::Generators::TestCase destination root." unless destination_root
87
+ end
88
+
89
+ def ensure_current_path # :nodoc:
90
+ cd current_path
91
+ end
92
+
93
+ def prepare_destination # :nodoc:
94
+ rm_rf(destination_root)
95
+ mkdir_p(destination_root)
96
+ end
97
+
98
+ def migration_file_name(relative) # :nodoc:
99
+ absolute = File.expand_path(relative, destination_root)
100
+ dirname, file_name = File.dirname(absolute), File.basename(absolute).sub(/\.rb$/, '')
101
+ Dir.glob("#{dirname}/[0-9]*_*.rb").grep(/\d+_#{file_name}.rb$/).first
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,18 @@
1
+ module Rails
2
+ module Generators
3
+ module Testing
4
+ module SetupAndTeardown
5
+ def setup # :nodoc:
6
+ destination_root_is_set?
7
+ ensure_current_path
8
+ super
9
+ end
10
+
11
+ def teardown # :nodoc:
12
+ ensure_current_path
13
+ super
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -29,7 +29,7 @@ module Rails
29
29
  def framework_version(framework)
30
30
  if Object.const_defined?(framework.classify)
31
31
  require "#{framework}/version"
32
- "#{framework.classify}::VERSION::STRING".constantize
32
+ framework.classify.constantize.version.to_s
33
33
  end
34
34
  end
35
35
 
@@ -75,7 +75,7 @@ module Rails
75
75
 
76
76
  # The Rails version.
77
77
  property 'Rails version' do
78
- Rails::VERSION::STRING
78
+ Rails.version.to_s
79
79
  end
80
80
 
81
81
  property 'JavaScript Runtime' do
@@ -1,4 +1,5 @@
1
1
  require 'rdoc/task'
2
+ require 'rails/api/task'
2
3
 
3
4
  # Monkey-patch to remove redoc'ing and clobber descriptions to cut down on rake -T noise
4
5
  class RDocTaskWithoutDescriptions < RDoc::Task
@@ -52,52 +53,7 @@ namespace :doc do
52
53
  Rake::Task['doc:app'].comment = "Generate docs for the app -- also available doc:rails, doc:guides (options: TEMPLATE=/rdoc-template.rb, TITLE=\"Custom Title\")"
53
54
 
54
55
  # desc 'Generate documentation for the Rails framework.'
55
- RDocTaskWithoutDescriptions.new("rails") { |rdoc|
56
- rdoc.rdoc_dir = 'doc/api'
57
- rdoc.template = "#{ENV['template']}.rb" if ENV['template']
58
- rdoc.title = "Rails Framework Documentation"
59
- rdoc.options << '--line-numbers'
60
-
61
- gem_path('rails') do |rails|
62
- rdoc.options << '-m' << "#{rails}/README.rdoc"
63
- end
64
-
65
- gem_path('actionmailer') do |actionmailer|
66
- %w(README.rdoc CHANGELOG.md MIT-LICENSE lib/action_mailer/base.rb).each do |file|
67
- rdoc.rdoc_files.include("#{actionmailer}/#{file}")
68
- end
69
- end
70
-
71
- gem_path('actionpack') do |actionpack|
72
- %w(README.rdoc CHANGELOG.md MIT-LICENSE lib/action_controller/**/*.rb lib/action_view/**/*.rb).each do |file|
73
- rdoc.rdoc_files.include("#{actionpack}/#{file}")
74
- end
75
- end
76
-
77
- gem_path('activemodel') do |activemodel|
78
- %w(README.rdoc CHANGELOG.md MIT-LICENSE lib/active_model/**/*.rb).each do |file|
79
- rdoc.rdoc_files.include("#{activemodel}/#{file}")
80
- end
81
- end
82
-
83
- gem_path('activerecord') do |activerecord|
84
- %w(README.rdoc CHANGELOG.md lib/active_record/**/*.rb).each do |file|
85
- rdoc.rdoc_files.include("#{activerecord}/#{file}")
86
- end
87
- end
88
-
89
- gem_path('activesupport') do |activesupport|
90
- %w(README.rdoc CHANGELOG.md lib/active_support/**/*.rb).each do |file|
91
- rdoc.rdoc_files.include("#{activesupport}/#{file}")
92
- end
93
- end
94
-
95
- gem_path('railties') do |railties|
96
- %w(README.rdoc CHANGELOG.md lib/{*.rb,commands/*.rb,generators/*.rb}).each do |file|
97
- rdoc.rdoc_files.include("#{railties}/#{file}")
98
- end
99
- end
100
- }
56
+ Rails::API::AppTask.new('rails')
101
57
 
102
58
  # desc "Generate Rails Guides"
103
59
  task :guides do
@@ -59,7 +59,7 @@
59
59
 
60
60
 
61
61
  #header {
62
- background-image: url("/assets/rails.png");
62
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABACAYAAABY1SR7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAGZhJREFUeNqsWwmUXGWV/t5Sr9aurl6qO0l3Z9/DEoJh18gZQGAUxPHIyQHH7eioZ8bjnAFHZ0RndNxxRBhGcUbxoKIHBkTEcUYREIHIGpKQjUDS6U660/tSVV3Lq/fefPf/Xy2dBFGYx3npqvde/e/e/97v3u/e/8e4Lt2L8DCCAFcGwF8ZBjYbgM1rAZoO+WLwZhDMu9y4+YcOozbAqzwXNA3GdzX/5hV+KnKO2+GXFj/AvzmW8e72iG202CYiphbY403f9/k3QHZtJ9oWtyCQe7wGX79TKVb7rP9pXJPDVxf0Rz+oyxm4HNWrahFNixdk3EAJbERMWOm4ulctVODNVeEVK0DeRVDgb1wfJgcqUo6duaKnFOH7bm6JmH+5LOEgZprwRIHAV3JYfLjKM55Noz3bBqdcgt0Wg52Kq/cHHkXns0qIukKBlltk9rU2QaiouiefPQ+RdBuseAJeqYTK1CTH8mE4NsyIpRWu8nssCs+xULWpjGVwTvieKl/sV6mIXzOib/OftzuG8d6l8SiVMODyRb46oazg8YPP2Wnvy9ISNqplzsxYAW6hjGhHEmYiBoPC+hRMfFMrESgrBC5n0KS+lq1nPahZh2OXymg9bSNWX/u3FKyKI//7Exx96B4Y8RiCEseq8t0VznyxjMDidFIJ8QSf3hJEOFbZEAHVhIkFTX54fxtnIW5pJUQIeZ8ooZShkInuDOLpFIX1ldtCBix7KI/k4E7OwbTjcNIdiCQzsONp2LEk7GgUnZsuQN9lW2En45xlukrUghWzeZq8FsXsi8+gND6MSCqD9k3nwulIUShKZxt0LYPWortRSY0NXreC8J6pZNDChEDh53PT1NIPLaEnLbQKNTETEaR7sycA0jD1INXZAnzObjTbiWh7Vr1A3Knn4nciu+lCvstUig09cp96cVCtcELoFpEIFUjjyIM/osWIg+IMXS3DcfNwZ3NQHmmKU9OqroX2jWdgatduuPkpmA4ViZrK9RqKABEBtg9tDeW+oUIyTIYuFaX7eCG4aqbU+hhKocD3UBoZISBLiC9cpAQKyq5SQo6OjVswtec5VHLTiHUuIN4WonXlqUj2riS0DIUXwZlERFHSK+SQGzqI3MHdmNm7CzMvvowF527B8qvejZ3/+iXk9vVTao5tiTKN0OUHISZEGS/8W6UbRdoTSHe3E1f+CRaR3xhBLVJSIQ7qleZQGBigZYoYdR+ElUjBaW3H6JMPIrV0Hdo2bEayZ7my0KsdLctPBS64EuWZMYw/9wTGnvod0mtzWH71Vuz66o10bVpK8FIx6orUMejpCKYBTvfM9HXBJtA8z3/1BKDivaksVJmaYsgsYPDnd6LzzAuw8I1XUIGleC1HtDWLnguv5BiX4+jDD2D4sQeV1bQvNXBi6vAb1MGtrEEHjRPgqfZ0qMRJElYYSudfq12nmzAvtJ2yib69iRadRGnySD0Uv5bDtCPou/gqnPY3N6DnLRczgtHxCf4aVnUeUdgw6i6FqM1w292Ujo/TJdB5wHcJ2iDCaBTRmVfw4rkw4yksuvQyJJf0YvrgNiayvBLESS9AYuFqJLLLCPb4SQWulosojhxmeCeoDeaQSoVuy8lPtSKxYKnC2Bmf+DwtvBgv3/qfTI6uEtGuJV7PCBTIq5zNtt5uxBgyvap30pf55TISfX1Y/PatGPrVvcgPvEyAJ1GenaPZLSy//G2IL+qki43CNCMwk620iovy9FGUJgYwm8gwpK/guRJOS5dyD688h+n9z2L28F4Ujx2ia04jEl8Ad3oGVTePaGcnQ3sKLb1rkD3nIqx594dRIh733n6PmmrrvGj671sjVlxczRWAkxZ0r+rTrhfMJ0uEM8xKUYXONR+5nr57BdpP24TCsX6M/f5F5AYLWPauK9F11htUwjOIL8GNZH1qpKwiyVGELk0OoDj2EtziFOaODSN3aC/v24xmZzAU51TgcJKd/DktHo9jyRXvg0Or7PvejTj22KPKiyafew6zg8MYypVLNsLkJ2bxaZXM4i5EmCBPsEaoWJUUpfeSK7DgvEtQmh4ihTDQdf5FOHDHr7HqPVeh99KL4OVzpE50N18CtqnCdBCY6rsEcTsqIGUGD6rY9e3bMPzIHmTWLsbqa7ai84wL6YrTqEyOqEmwonEExSoO//R7dLcJWiWCueF+7P7mjZAUY8YdJZqySMo24j5zQSybQdeyhdrX5imho4NhEEnkRbkDQyjSRVJLeziCgef/6avIrFuOtR95P2lJNSSshg4l6rdm+Ht9inWsqIOX7voN+u/eRoEM5PvHMbbjGcwcfg7jO3YxbCcRiaaYQOXnpEaFGeahGQaMCidJRidt8RghS6Q344XQIowmFq2QXdLNdwsx8zUFqCOQNIECVqdp8pESB53Fvhdux9T2FxBb1AWX4XbjDX/HFzjEmgedB4XYKT5D4T0VTLRCtIiTwOBvfovpvS8T+Bm4MyW6jw13tIIDt/9G/TTWk8HKvzgbmd4+YldYQIdixgHJYkC82Ul6UDnQSbEGdsFGZlEWyUyLyiEyYwajRVAoAXNlEjR+pjUCUmiDQcKOORwwgpFfP4cg5mPzTZ9FoqePdGVWuZRPYQNPcgrd0/dCpqpdy3DIsQ4fxtiTu7Hxkx8iRXkcB+94iM86/K0Jx4opi5aOzGJs14toWeLAdYXWxFQCtJlkA+LUq+bI7QR3mj3YoqVNgGcXd5NWUOiZAk9GH86S4jK25jWBLVREl1uK5Voywz6WXf1WLHjTm0lPigSyxoUpnEqU8c26Wyk/Y24RMjhw/yMoj+cQbWvH0isuwuijL6BwaJwcyq7XUTaBP7N3HOU3ke7HSONJb8RTBGoGKZPFyTE8saTZyCPtrC2coxOoTuY5+x4UTzHNsNjR6d6Qa8JJ5BIV8ksVtKzpwcr3v5dyOrzHKMWXizsZAnK6k1ImPDmAqjOmdr9AwXcodzr4kwfQfuY6VKbzyhpGU96S75WxIqb2DaPnvNWKklQD4WSuzB+sVILjOYjm/VARSWKTBQQzlZCFmErYeubzVJJR14SlQtVQMjO0xrXvoulXkq3OKnxAXqSsoSmNUbOM/BV35RjDDz9JrBXpnnEM3vsYjj38LLyZihI8QNAgQhITOCmTO46i+6w1MPm86RVIiC09/RJUGcECCe2UU0G6QIyUjEC5hGaCNd4RqHKU6VuDylQlI2N8hfXDWibEdyhCKXREuZUVUX8lyhh2+Jl5Q/6akSgT4izGn3wBFu+JwYOKj8qwtsbJaYmJuYEZ5AYmFOWXPCN1jTodzeuqM0WtSI1rzXrV0LSNKRFuZLYQ2EYVPjEQVuQUMsCya65GvL1HWUwJS+FNUcBsUiZUQv7aLGlndr+I8ug4XUMVAJw4U7FmI8SFETTmUaGK2gas1SeeP8znoizIEso9DaUIy2FWkNU5V0VYs/azWXKncuCHqgQq1CHiY831H8TGr34erRvXKdD6LD3b+HnRn12qGgdqlmxHZe2aRcy6NbQScl8y8dSOfWQE1yK9YYmqXYww3xhNObemUI2IWraF2d1HMTeeh83MbkUiylKiiMdy2wjzXBjxWYdRiSkhfDVVKGSstxM9l16JxZe/E2+848c49bPXK9D2vPUyEsBOVZMINmpCW6HgEOuIQjXF6FYuAV2aHsWyrVfj9C9er5SR5Kms0PTf8QoZtIo7WSJW+mmRJLGSpDK2ipzV2bK6X6fxtWOCicYVqyhGXkXn+WeTcfape5ZDsPGM91C5iy8LI0s445bd9FkrAFHICt1N8DE+gdyeQczs34+uzeei68LNLGfdea50st6VbiyYmHq+nxTFRSSRVsD3ii7xyeQbdt/M5h/MERMT4i6GjlAWeUxh6HCN8+LIz+5H5zlUbtHSOnVp4MCa51JaIQ16i0kwP9CP0uExPP+JL2DggfuYN8jTJClYxnH4aNimdpp0r7nDkyx9h5gE0+RqSVTyZXXTsMz5FaJyMJrrGLNopyWUIImj//1LjPzuUZLCC5gzVqMwPIglV7/rxCaihFaCPCDOxDUl1EoylFP4mUlFCgPDStLKWB47PnUjrSSsNqrJsa/zR02ZwGjYRoVkEZh0ZHzbfmTPXE85SWrnKip6GeFE2I1iKVBCzNK9pmiVhS1x+Axx7myRJesvgHvvR3rNKmQ3n/OKPVGND1MVXTqHiFK6qVFiwlXgTVDhkq+ChhnyJCW9GeaoIGQOdV0M9YhYZWbvUXrIJJ+rKL6lJ9CYj5Fai0iKqyPkx0HcUsJYrBbtREIJ2H72GxTI/2CL1zAbLkZ8WIxYgUvsKebq6Zl3rEZvymx6echo1N+au9XcS3oHsxWMPrGTFH+CLhsmbhMNRWrNB4SZVSwyJ5WDFRb3DAAmaXf2rPP+6BpbkmStkBLAWwkHmdNWKfYqFaZRp2GGdo+mhpv6bBkNhepRzERpdASeW1aKSZ5RidpoUsRAvQ+NJCnJHHl+bcZ80vjkij661vo/rWMQSitWskgnNv7LP+MNN38NadYuCPtYCItIFTjMRgfeqClkhkFZ+FXCQmpFuyKXii7xNI93LT9szdrUMsNZnJkuwZX6zlKdaqRXrESiq/e19kBC3NisLt+Gc/7jW0gtZ51Bl1MCmUaoM//aRv0aapnF0l362KIUnI6EyuhCUOuWrIVfAZcRAj5NJWJ0C5epP19y1awJLWhdt/a1t3KcGF8Yxb5bbsLItoeYmxZRkRWq46IrR9StX/tcw4oKsYH+nlrZpmbcZQ7R1tDPBvMbdIwofLpVKIfcJy5nCa5WRhnDFkVOx+s5kr29GPzpfUxsuxg0zlQUxSZudG/CqNOSIJxYCclGCA7fDRDpiCK6gIVfidVmWXrHRh0fmBd+eSYIIEcWdRhdJJsWp+aQT1vI9nYjnl3wuhSJLuhAJJ1WQWDisadUELCi0bD1WlscMpq6lrV1Ft0riC9tVcFD8odfDVS9bod5pNGgC3+XFnxsXA2rsw25/gHMTcwiRxdbvLgPsY7s61IktWSZinw6l8SbupNGvUlphB1yZY3aIhfZtRmz4XS3oMoA5JP6BywdvBIr24ytMdzsWjHaMcnI0nXRG5FkdCrnS6gy6QzccxeMZDsJW+r1KbJ4pbKAVy6huXoyauVUaAUjRK5WjN9cH05PCiZl84VfsXaSVTKf191C6F61qCXjtjAORtvTSPb0sgYoEi/UmEmnMj6JkpXA6z2cTAbxxV26GdEEZB12DVVV63BrIuwYaWpCGZyuJBWSFSxPLTB5PH1+rhDDKlQbuvajNUzE+UVyRTTdQt+zWIrGWIJOozo8hjmashq8PkXsZAoty1Yqi/gVnq6ru+p1pUKFTM3dENJzu421TiqKKq3hhUp45apSyM1VGMH0xOi+liz0yOxUyijs2w2DlRjI+8tHB3XUIP+fGBxA9+LFr1kRgwV769p1fPkEQ+9KRq+dKE9MsGKc1BmxltEC7W6CEdW0aUtocIvw0tcSt5JGu3R4OA+zIxW1uKoUOUZzFxmxRp/ai+iz+xi9CK5EVJGdqBNBlG4xdvBlRq9eTQteawhm0MgPLsSGj92gVqjKk8ew/TOfxPjjz8BKxhvLFGHjWUBuJh0Cu6pqD7WCTGz4BDqKpE30rIlj05rw6sKFxuCXPP9O8MEjxQqOTuQwNjJLa1mItaRRGB3GLHnO6znaNmxC/nA/cocPKNoS61iEZVdfEy5LBHVKUieCLY5eeKIiXp6RapJuNVJFMCamYGnOUFyslBo0Xronai0dIfXmnZIqtKhgNIaj/F3ULSLx4j60dnXXy8s/OZe0dyGW7cLOL34arevXI9rayWgYhZPtoJtNqsTbyPKUgwzamyCw867MtG5NBUF9bSBXLCkeKOzDroUutaZODax52yUk5sfgsyrL897+PXtQHTmK7vWnomPpCkSTf3pI7j7/Qmz/5HWY3r5LNziYeC3WPlYsovOJJ7VKVbuPENcgXEyvuV3IbKXpPlcqqh0acqGe2S1oq1jzqmZ+b0mGDJNaM2bnjrHuPnYUifZOtDMKda9ah1RnZ30F99WO9jM2MzouZw0vLdJIuCsiUInOz0vbiVNa9DSBtITyWo3VAV/XG/KmPEuBKrmard7rNxKiyCoN7EBnpXlLCiYTmfibuEHSSSkLV4uzGNr5NEYP7EZb31J0rd6AzMIevtf+g4oIg+7e8iYM3H03J5muw9n3ZquqfwU3aGDdMBqdztr+lXBbhyg+R2xYTb5jN7YG6SKnyh870r8Ki6Py0CiO3fcTNWaCBU3E8FVDr7ZPRjbcDLHO30N/TmazdLk+JFMxVoZh6errUrcmnDQp5o4MocrI4o3N6dmXhp1hoHkOFV2R5CXtVwm3Qc0aBip8Z6lY0HtRpJ8GYz5pVFgxgkaHiaCuDE1gfOAhFdNbJIKxplCKNJqqyoqi0CT9tp9/IyyPE2SryYyDKD9LVKxKUqXbuFOM+yVDN/Rq+0ia1mLmtYNqK8rhTiSpLLNbLkDLuZvQ0X8QBoG+//5fIMjP4AQ/kJkuM+vW+sS1wkgiVSTi0Fq2XqoLFfFYMMkyHSFL2mOpHQmy+aU4xXHoLk6rrIkYiE1JNpZOJjO1ivduOLSkZeuk6/YBwR54jaVv6chXpmZQmJnEssveQjwVcPCXv1IWt4//sUVB7K4WpGTREqhvJCrO5MhtGLMTKWU5pUSpDKs1glhbB4W3VCSpTM6gOl2GQzxJt+RQUMFcOoENrXG0FEhESSvMmIVIZ6uaHL9QZn6Y067VNJueV4bdmYDdktJ7pAJNKKfG+pG/cz8GH/gfGLIARF4o9fs8RWSrUmZxN7Z+9za0sooTPiRuI22bsUMHsevWW1B+iFnYdOgqFWTPPxWnXPdxtK5eV8fB9IH92Pn1m1hz7MQh00Xm/C34+K23MiOXsPvLX8bgbXej5bz1OPs7tzIhduHgnXfghX/8OplEsr6U4ZtV9G69HMvf8wEkKUfgaUeWbs4zX/8Sxm/+AbzxCRVF1VpFM9hrvS2ZmZbuRUh2LpxPw7t60EWK8vgHPoCZ5w4i1pvBps99Bu2nbJ73XLyzB4kvLcAPt27F2LFR9MTjSKbb1L1h4mIq4iNL14u2ZRFJysazZCNHqA0DZXRcuBGnf+bz6v4JLDqVgk3r247DnMdJDkOzffJtDfoY2b0dg08/gbZlq7BiyyWk+MuQ2bAGU9v2snTtQnxBj3pu9OnfYXr/Hiq1EZ0bz0ZsUS+sFUvgDB+DFfh1v3X9Kg4xknfLRNZ21h2/RYTX29avU0pUSwUcuP07KLw0oBZrA5bGozt2MlA5updgzGuJnYyp6rt7778HP37fX+OJW77ZaKzKoo5eOdfRhMehO3+EbXzu8H/dXW/SOTwj0gZqeoVck+h3xES9LDjpVp3QXeRdqSVLkDllrepy5oeHMPH0brq2qdteRmNJwj7pYKFVlr75YrztKw6ya9aFTzF8Tk+pBZrmXRGRdCsSLMiQbKlfE7PLrjarCcSSA0QZvQQevGKncnrfXpVwZTde3+XvqN9b8d4PYfuNn8O+b9zO56K6oGpOiMYreNfSc7eoE+FO00P334XJx3fQzM685zd8/Hqs/uCHGGEy9QEslaT0Cm9t7rVyYqnGWogEGIl+nqUTmyxwTj62HTs/91ks3XqN2u8VBLKZoVt14pe/42oc/O6dzB2+qnEMNGHEPHHbSfiSqloakGP7D7+Dpz79BfT6cRXu5rHatk51Nh9aEaOJu2mOZIf36uDu6EDi3PVoIQGV5efiwSG1Rjny8COY3P4sI1WM2HKx4bpPYdEFlzA9RMOlhCAsLJssYqGxRbcZI8//9MfIrliDvjPOwqqL/xwD996P6rY9zGHWPNMNPf8UJl9+Cdm169G9YWOdapjB8auShsJMc85YdekVWL7lQgroKHd68qMfRcAEu+lrX1GdSdmBKjQn0aOrU9lso5bK53uSLiyscNu10tAy66FganAQD9zwD6jM5ZBe2IeLbvoGWs5YofZQyfKXxbpejl133omfXfth7P/Fz8NRLbXgb0nGNe26GhGST5MzFmEYll2oCl+sd2IZCcWtTKxd6rokwdYVpyK9fB1z1KnIrD0NDt1WiNGB738X3kxJVapiWVmR5pCurc2iSaIkmNJ0Hr+9+WYkMu0YfHI7Dv9+J+766Eew8vSNiFP4WGsGBanhh6bw1K3fRjSdwfSel5FikTT67At4+t9vgVssojA0Rp6VwOyhfjx9262qABrfw1KaJW15YprXvsVcEG1sT5eCji40fXSURVyAvTd9TSmv6nTVifQx/uwzmHiU7kb3Clu+GC27MsY247p07+SihN0m/Kgc6EXRIjmMgDvCF9mcsXJxDgniZSnN3xFLIcc6Yormd1mhCX2QpWc7SteolNUpNUQkIUvJpDkUrsrfqy1L8ZjaFSTrJKLsCbvz6BqxaBwdBReWbJmF3kTa2NYRVYFGHEYKqqFKFXtzMg6uUhaJyzZyQ/d/FdUm8LwmAuYwO/vhQBU+m+ddmy+NpBKNWpIzF7EdRSxrOygMMl6LruUw2tQXOTy1akNFk/XtU/V70H3g6YyNNk5GtOIp/DYvlKp9LoJLWuIl2fADfJ/X71PQ8Jo2Vzbv620OAFI9jtIqCQ7tnfC/JxhNT4dShds4UKvB66s1ftPnRqOh/l13hDDqWGhxqUgTsIV1Fzg5Y7TEpKsK+B/w+sdqUWuqv1CxUN8K/MqHLMnhj/g/J/4/juDky9VSg0kh/zQj322897Pao/8nwAC+AZicLeuzngAAAABJRU5ErkJggg==);
63
63
  background-repeat: no-repeat;
64
64
  background-position: top left;
65
65
  height: 64px;
@@ -1,3 +1,7 @@
1
+ if defined?(Rake) && Rake.application.top_level_tasks.grep(/^(default$|test(:|$))/).any?
2
+ ENV['RAILS_ENV'] ||= 'test'
3
+ end
4
+
1
5
  module Rails
2
6
  class TestUnitRailtie < Rails::Railtie
3
7
  config.app_generators do |c|
@@ -1,6 +1,83 @@
1
+ require 'rake/testtask'
2
+
1
3
  module Rails
4
+ class TestTask < Rake::TestTask # :nodoc: all
5
+ class TestInfo
6
+ def initialize(tasks)
7
+ @tasks = tasks
8
+ end
9
+
10
+ def files
11
+ @tasks.map { |task|
12
+ [task, translate(task)].find { |file| test_file?(file) }
13
+ }.compact
14
+ end
15
+
16
+ def translate(file)
17
+ if file =~ /^app\/(.*)$/
18
+ "test/#{$1.sub(/\.rb$/, '')}_test.rb"
19
+ else
20
+ "test/#{file}_test.rb"
21
+ end
22
+ end
23
+
24
+ def tasks
25
+ @tasks - test_file_tasks - opt_names
26
+ end
27
+
28
+ def opts
29
+ opts = opt_names
30
+ if opts.any?
31
+ "-n #{opts.join ' '}"
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def test_file_tasks
38
+ @tasks.find_all { |task|
39
+ [task, translate(task)].any? { |file| test_file?(file) }
40
+ }
41
+ end
42
+
43
+ def test_file?(file)
44
+ file =~ /^test/ && File.file?(file) && !File.directory?(file)
45
+ end
46
+
47
+ def opt_names
48
+ (@tasks - test_file_tasks).reject { |t| task_defined? t }
49
+ end
50
+
51
+ def task_defined?(task)
52
+ Rake::Task.task_defined? task
53
+ end
54
+ end
55
+
56
+ def self.test_info(tasks)
57
+ TestInfo.new tasks
58
+ end
59
+
60
+ def initialize(name = :test)
61
+ super
62
+ @libs << "test" # lib *and* test seem like a better default
63
+ end
64
+
65
+ def define
66
+ task @name do
67
+ if ENV['TESTOPTS']
68
+ ARGV.replace Shellwords.split ENV['TESTOPTS']
69
+ end
70
+ libs = @libs - $LOAD_PATH
71
+ $LOAD_PATH.unshift(*libs)
72
+ file_list.each { |fl|
73
+ FileList[fl].to_a.each { |f| require File.expand_path f }
74
+ }
75
+ end
76
+ end
77
+ end
78
+
2
79
  # Silence the default description to cut down on `rake -T` noise.
3
- class SubTestTask < Rake::TestTask
80
+ class SubTestTask < Rake::TestTask # :nodoc:
4
81
  def desc(string)
5
82
  # Ignore the description.
6
83
  end
@@ -1,6 +1,7 @@
1
1
  require 'rbconfig'
2
2
  require 'rake/testtask'
3
3
  require 'rails/test_unit/sub_test_task'
4
+ require 'active_support/deprecation'
4
5
 
5
6
  TEST_CHANGES_SINCE = Time.now - 600
6
7
 
@@ -47,7 +48,18 @@ task default: :test
47
48
 
48
49
  desc 'Runs test:units, test:functionals, test:integration together'
49
50
  task :test do
50
- Rake::Task[ENV['TEST'] ? 'test:single' : 'test:run'].invoke
51
+ info = Rails::TestTask.test_info Rake.application.top_level_tasks
52
+ if info.files.any?
53
+ Rails::TestTask.new('test:single') { |t|
54
+ t.test_files = info.files
55
+ }
56
+ ENV['TESTOPTS'] ||= info.opts
57
+ Rake.application.top_level_tasks.replace info.tasks
58
+
59
+ Rake::Task['test:single'].invoke
60
+ else
61
+ Rake::Task[ENV['TEST'] ? 'test:single' : 'test:run'].invoke
62
+ end
51
63
  end
52
64
 
53
65
  namespace :test do
@@ -55,26 +67,11 @@ namespace :test do
55
67
  # Placeholder task for other Railtie and plugins to enhance. See Active Record for an example.
56
68
  end
57
69
 
58
- task :run do
59
- errors = %w(test:units test:functionals test:integration).collect do |task|
60
- begin
61
- Rake::Task[task].invoke
62
- nil
63
- rescue => e
64
- { task: task, exception: e }
65
- end
66
- end.compact
67
-
68
- if errors.any?
69
- puts errors.map { |e| "Errors running #{e[:task]}! #{e[:exception].inspect}" }.join("\n")
70
- abort
71
- end
72
- end
70
+ task :run => ['test:units', 'test:functionals', 'test:integration']
73
71
 
74
72
  # Inspired by: http://ngauthier.com/2012/02/quick-tests-with-bash.html
75
73
  desc "Run tests quickly by merging all types and not resetting db"
76
- Rake::TestTask.new(:all) do |t|
77
- t.libs << "test"
74
+ Rails::TestTask.new(:all) do |t|
78
75
  t.pattern = "test/**/*_test.rb"
79
76
  end
80
77
 
@@ -83,7 +80,12 @@ namespace :test do
83
80
  task :db => %w[db:test:prepare test:all]
84
81
  end
85
82
 
86
- Rake::TestTask.new(recent: "test:prepare") do |t|
83
+ # Display deprecation message
84
+ task :deprecated do
85
+ ActiveSupport::Deprecation.warn "`rake #{ARGV.first}` is deprecated with no replacement."
86
+ end
87
+
88
+ Rake::TestTask.new(recent: ["test:deprecated", "test:prepare"]) do |t|
87
89
  since = TEST_CHANGES_SINCE
88
90
  touched = FileList['test/**/*_test.rb'].select { |path| File.mtime(path) > since } +
89
91
  recent_tests('app/models/**/*.rb', 'test/models', since) +
@@ -91,12 +93,11 @@ namespace :test do
91
93
  recent_tests('app/controllers/**/*.rb', 'test/controllers', since) +
92
94
  recent_tests('app/controllers/**/*.rb', 'test/functional', since)
93
95
 
94
- t.libs << 'test'
95
96
  t.test_files = touched.uniq
96
97
  end
97
- Rake::Task['test:recent'].comment = "Test recent changes"
98
+ Rake::Task['test:recent'].comment = "Deprecated; Test recent changes"
98
99
 
99
- Rake::TestTask.new(uncommitted: "test:prepare") do |t|
100
+ Rake::TestTask.new(uncommitted: ["test:deprecated", "test:prepare"]) do |t|
100
101
  def t.file_list
101
102
  if File.directory?(".svn")
102
103
  changed_since_checkin = silence_stderr { `svn status` }.split.map { |path| path.chomp[7 .. -1] }
@@ -115,47 +116,36 @@ namespace :test do
115
116
  controllers.map { |controller| "test/functional/#{File.basename(controller, '.rb')}_test.rb" }
116
117
  (unit_tests + functional_tests).uniq.select { |file| File.exist?(file) }
117
118
  end
118
-
119
- t.libs << 'test'
120
119
  end
121
- Rake::Task['test:uncommitted'].comment = "Test changes since last checkin (only Subversion and Git)"
120
+ Rake::Task['test:uncommitted'].comment = "Deprecated; Test changes since last checkin (only Subversion and Git)"
122
121
 
123
- Rake::TestTask.new(single: "test:prepare") do |t|
124
- t.libs << "test"
125
- end
122
+ Rails::TestTask.new(single: "test:prepare")
126
123
 
127
- Rails::SubTestTask.new(models: "test:prepare") do |t|
128
- t.libs << "test"
124
+ Rails::TestTask.new(models: "test:prepare") do |t|
129
125
  t.pattern = 'test/models/**/*_test.rb'
130
126
  end
131
127
 
132
- Rails::SubTestTask.new(helpers: "test:prepare") do |t|
133
- t.libs << "test"
128
+ Rails::TestTask.new(helpers: "test:prepare") do |t|
134
129
  t.pattern = 'test/helpers/**/*_test.rb'
135
130
  end
136
131
 
137
- Rails::SubTestTask.new(units: "test:prepare") do |t|
138
- t.libs << "test"
132
+ Rails::TestTask.new(units: "test:prepare") do |t|
139
133
  t.pattern = 'test/{models,helpers,unit}/**/*_test.rb'
140
134
  end
141
135
 
142
- Rails::SubTestTask.new(controllers: "test:prepare") do |t|
143
- t.libs << "test"
136
+ Rails::TestTask.new(controllers: "test:prepare") do |t|
144
137
  t.pattern = 'test/controllers/**/*_test.rb'
145
138
  end
146
139
 
147
- Rails::SubTestTask.new(mailers: "test:prepare") do |t|
148
- t.libs << "test"
140
+ Rails::TestTask.new(mailers: "test:prepare") do |t|
149
141
  t.pattern = 'test/mailers/**/*_test.rb'
150
142
  end
151
143
 
152
- Rails::SubTestTask.new(functionals: "test:prepare") do |t|
153
- t.libs << "test"
144
+ Rails::TestTask.new(functionals: "test:prepare") do |t|
154
145
  t.pattern = 'test/{controllers,mailers,functional}/**/*_test.rb'
155
146
  end
156
147
 
157
- Rails::SubTestTask.new(integration: "test:prepare") do |t|
158
- t.libs << "test"
148
+ Rails::TestTask.new(integration: "test:prepare") do |t|
159
149
  t.pattern = 'test/integration/**/*_test.rb'
160
150
  end
161
151
  end