2

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?

Community
  • 1
  • 1
Akihiro HARAI
  • 574
  • 1
  • 8
  • 17

0 Answers0