I am trying to create a Rails application with konacha.
$ ruby --version
ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux]
- rails (3.2.11)
- konacha (2.5.1)
The problem is that konacha cannot run tests, though it can find them.
I explored the code and found that its initializer, named konacha.environment
, was executed AFTER each config.after_initialize
block.
Normally, the test directory of konacha should be added to config.assets.paths
in konacha.environment
, and then in config.after_initialize
, Sprockets::Bootstrap
runs to doing stuff about assets.paths
. But in my environment, the order is reversed, which means Sprocket loads asset paths before konacha updates them.
I further explored initializer, and found that the order of initializers was correct before the tsort
. But after that, the order has been reversed. I embedded debug expressions to the code and output the execution order.
Embedded debug expressions:
def run_initializers(group=:default, *args)
return if instance_variable_defined?(:@ran)
initializers.each do |i|
puts "before tsort: [[#{i.after.inspect}]]-> [[#{i.name.inspect}]] ->[[#{i.before.inspect}]]"
end.tsort.each do |i|
puts "after tsort: [[#{i.after.inspect}]]-> [[#{i.name.inspect}]] ->[[#{i.before.inspect}]]"
end.each do |initializer|
initializer.run(*args) if initializer.belongs_to?(group)
end
@ran = true
end
Output:
...
before tsort: [[:append_assets_path]]-> [[:prepend_helpers_path]] ->[[nil]]
before tsort: [[:prepend_helpers_path]]-> [[:load_config_initializers]] ->[[nil]]
before tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
before tsort: [[nil]]-> [["konacha.environment"]] ->[[nil]]
before tsort: [[nil]]-> [[:set_load_path]] ->[[:bootstrap_hook]]
before tsort: [[:set_load_path]]-> [[:set_autoload_paths]] ->[[:bootstrap_hook]]
before tsort: [[:set_autoload_paths]]-> [[:add_routing_paths]] ->[[nil]]
...
before tsort: [[:add_to_prepare_blocks]]-> [[:run_prepare_callbacks]] ->[[nil]]
before tsort: [[:run_prepare_callbacks]]-> [[:eager_load!]] ->[[nil]]
before tsort: [[:eager_load!]]-> [[:finisher_hook]] ->[[nil]]
before tsort: [[:finisher_hook]]-> [[:set_routes_reloader_hook]] ->[[nil]]
before tsort: [[:set_routes_reloader_hook]]-> [[:set_clear_dependencies_hook]] ->[[nil]]
before tsort: [[:set_clear_dependencies_hook]]-> [[:disable_dependency_loading]] ->[[nil]]
...
...
after tsort: [[:define_main_app_helper]]-> [[:add_to_prepare_blocks]] ->[[nil]]
after tsort: [[:add_to_prepare_blocks]]-> [[:run_prepare_callbacks]] ->[[nil]]
after tsort: [[:run_prepare_callbacks]]-> [[:eager_load!]] ->[[nil]]
after tsort: [[:eager_load!]]-> [[:finisher_hook]] ->[[nil]]
after tsort: [[:finisher_hook]]-> [[:set_routes_reloader_hook]] ->[[nil]]
after tsort: [[:set_routes_reloader_hook]]-> [["append marketable routes"]] ->[[nil]]
after tsort: [[:set_routes_reloader_hook]]-> [["add marketable route parts to reserved words"]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[nil]]-> [["konacha.environment"]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[nil]]-> [["static assets"]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[nil]]-> [["register refinerycms_town_story_articles plugin"]] ->[[nil]]
after tsort: [[:load_config_initializers]]-> [[:engines_blank_point]] ->[[nil]]
after tsort: [[:set_routes_reloader_hook]]-> [[:set_clear_dependencies_hook]] ->[[nil]]
after tsort: [[:set_clear_dependencies_hook]]-> [[:disable_dependency_loading]] ->[[nil]]
The entire output is on Gist.
Note that config.after_initialize
is called in an initializer named :finisher_hook
.
I also found a workaround to this problem. Just define the following empty initializer and everything works fine:
initializer "dummy", after: 'konacha.environment', before: :finisher_hook do |app|
end
But I want to know who is responsible for the problem. Is this konacha's issue, Rails's issue, or just my misunderstanding or something?