Module: Spork::AppFramework::Rails::NinjaPatcher

Defined in:
lib/spork/app_framework/rails.rb

Overview

TODO - subclass this out to handle different versions of rails Also… this is the nastiest duck punch ever. Clean this up.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(klass) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/spork/app_framework/rails.rb', line 6

def self.included(klass)
  klass.class_eval do
    unless method_defined?(:load_environment_without_spork)
      alias :load_environment_without_spork :load_environment
      alias :load_environment :load_environment_with_spork
    end
    
    def self.run_with_spork(*args, &block) # it's all fun and games until someone gets an eye poked out
      if ENV['RAILS_ENV']
        Object.send(:remove_const, :RAILS_ENV)
        Object.const_set(:RAILS_ENV, ENV['RAILS_ENV'].dup)
      end
      run_without_spork(*args, &block)
    end
    
    class << self
      unless method_defined?(:run_without_spork)
        alias :run_without_spork :run
        alias :run :run_with_spork
      end
    end
  end
end

Instance Method Details

#auto_reestablish_db_connectionObject



81
82
83
84
85
86
87
88
89
# File 'lib/spork/app_framework/rails.rb', line 81

def auto_reestablish_db_connection
  if Object.const_defined?(:ActiveRecord)
    Spork.each_run do
      # rails lib/test_help.rb is very aggressive about overriding RAILS_ENV and will switch it back to test after the cucumber env was loaded
      reset_rails_env
      ActiveRecord::Base.establish_connection
    end
  end
end

#delay_app_preloadObject



61
62
63
64
65
# File 'lib/spork/app_framework/rails.rb', line 61

def delay_app_preload
  if ::Rails::Initializer.instance_methods.include?('load_application_classes')
    Spork.trap_method(::Rails::Initializer, :load_application_classes)
  end
end

#delay_application_controller_loadingObject



67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/spork/app_framework/rails.rb', line 67

def delay_application_controller_loading
  if application_controller_source = ["#{Dir.pwd}/app/controllers/application.rb", "#{Dir.pwd}/app/controllers/application_controller.rb"].find { |f| File.exist?(f) }
    application_helper_source = "#{Dir.pwd}/app/helpers/application_helper.rb"
    load_paths = (::ActiveSupport.const_defined?(:Dependencies) ? ::ActiveSupport::Dependencies : ::Dependencies).load_paths
    load_paths.unshift(File.expand_path('rails_stub_files', File.dirname(__FILE__)))
    Spork.each_run do
      require application_controller_source
      require application_helper_source if File.exist?(application_helper_source)
      # update the rails magic to refresh the module
      ApplicationController.send(:helper, ApplicationHelper)
    end
  end
end

#delay_eager_view_loadingObject



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/spork/app_framework/rails.rb', line 97

def delay_eager_view_loading
  # So, in testing mode it seems it would be optimal to not eager load 
  # views (as your may only run a test that uses one or two views).
  # However, I decided to delay eager loading rather than force it to 
  # disable because you may wish to eager load your views (I.E. you're 
  # testing concurrency)
  
  # Rails 2.3.x +
  if defined?(::ActionView::Template::EagerPath)
    Spork.trap_method(::ActionView::Template::EagerPath, :load!)
  end
  # Rails 2.2.x
  if defined?(::ActionView::PathSet::Path)
    Spork.trap_method(::ActionView::PathSet::Path, :load)
  end
  # Rails 2.0.5 - 2.1.x don't appear to eager cache views.
end

#delay_observer_loadingObject



51
52
53
54
55
56
57
58
59
# File 'lib/spork/app_framework/rails.rb', line 51

def delay_observer_loading
  if ::Rails::Initializer.instance_methods.include?('load_observers')
    Spork.trap_method(::Rails::Initializer, :load_observers)
  end
  if Object.const_defined?(:ActionController)
    require "action_controller/dispatcher.rb"
    Spork.trap_class_method(::ActionController::Dispatcher, :define_dispatcher_callbacks) if ActionController::Dispatcher.respond_to?(:define_dispatcher_callbacks)
  end
end

#delay_route_loadingObject



91
92
93
94
95
# File 'lib/spork/app_framework/rails.rb', line 91

def delay_route_loading
  if ::Rails::Initializer.instance_methods.include?('initialize_routing')
    Spork.trap_method(::Rails::Initializer, :initialize_routing)
  end
end

#install_hooksObject



36
37
38
39
40
41
42
43
# File 'lib/spork/app_framework/rails.rb', line 36

def install_hooks
  auto_reestablish_db_connection
  delay_observer_loading
  delay_app_preload
  delay_application_controller_loading
  delay_route_loading
  delay_eager_view_loading
end

#load_environment_with_sporkObject



30
31
32
33
34
# File 'lib/spork/app_framework/rails.rb', line 30

def load_environment_with_spork
  result = load_environment_without_spork
  install_hooks
  result
end

#reset_rails_envObject



45
46
47
48
49
# File 'lib/spork/app_framework/rails.rb', line 45

def reset_rails_env
  return unless ENV['RAILS_ENV']
  Object.send(:remove_const, :RAILS_ENV)
  Object.const_set(:RAILS_ENV, ENV['RAILS_ENV'].dup)
end