opal/opal-haml

Require does not work on *.haml files on Windows

magynhard opened this issue · 2 comments

Hi there,

I'm playing with ruby at the moment and decided to do with opal.

With *.opalerb templates everything works fine.
But I wanted to use haml templates, but it does not work.

Seems that what u call to "add *.haml" to sprockets does not work. Maybe a Windows related problem?

Here is my sample app:

# app/application.rb
require 'opal'
require 'jquery'
require 'opal-jquery'

# require views/example.haml
require 'views/example'

# require views/example2.opalerb - working fine!
require 'views/example2'

Document.ready? do
  template = Template['views/example']
  puts template.render(Example.new)
end

I added opal-haml to the Gemfile and did bundle install. I tried the gem from rubygems as well as the github version. The behaviour is the same.

This is my rakefile

# Rakefile
require 'opal'
require 'opal-jquery'
require 'sass'

desc "Build our app - transpiling rb to js and scss to css and copying some files ..."
task :build do

  Opal.append_path "app"
  Opal.append_path "app/views"
  Opal.append_path "app/class"

  #
  # FRONTEND JS
  #

  js_container = ""

  # RUBY -> JS
  js_container << Opal::Builder.build("application").to_s

  File.binwrite "public/lib/app.js", js_container

  #
  # FRONTEND CSS
  #

  css_container = ""

  # SASS/SCSS -> CSS
  sass_file = File.read "app/assets/stylesheets/application.scss"
  sass_engine = Sass::Engine.new sass_file, { :load_paths => [ "app/assets/stylesheets" ], :syntax => :scss }
  css_container << sass_engine.render {}

  # FONT AWESOME
  fa_file = File.read "app/lib/font-awesome-4.5.0/css/font-awesome.min.css"
  css_container << fa_file
  FileUtils::cp_r "app/lib/font-awesome-4.5.0/fonts/.","public/fonts"

  File.binwrite "public/lib/app.css", css_container

  puts "... finished"
end

When i execute rake build i get the following output:

** Invoke build (first_time)
** Execute build
rake aborted!
Opal::Builder::MissingRequire: A file required by "application" wasn't found.
can't find file: "views/example" in ["C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/opal", "C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/stdlib",
"C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib", "C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-jquery-0.4.1/lib", "D:/project/example/app", "D:/project/example/app/views", "D:/project/example/app/class"]
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:118:in `read'
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:127:in `process_require'
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:42:in `block in build_str'
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:42:in `map'
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:42:in `build_str'
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:35:in `build'
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:30:in `build'
D:/project/example/rakefile.rb:25:in `block in <top (required)>'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:240:in `call'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:240:in `block in execute'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:235:in `each'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:235:in `execute'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:179:in `block in invoke_with_call_chain'
C:/Ruby22-x64/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:172:in `invoke_with_call_chain'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:165:in `invoke'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:150:in `invoke_task'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:106:in `block (2 levels) in top_level'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:106:in `each'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:106:in `block in top_level'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:115:in `run_with_threads'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:100:in `top_level'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:78:in `block in run'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:176:in `standard_exception_handling'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:75:in `run'
C:/Ruby22-x64/bin/rake:33:in `<main>'
Opal::Builder::MissingRequire: can't find file: "views/example" in ["C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/opal", "C:/Ruby22-x64/lib/ruby/gems/
2.2.0/gems/opal-0.9.0/stdlib", "C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib", "C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-jquery-0.4.1/lib", "
D:/project/example/app", "D:/project/example/app/views", "D:/FIRMA_MGH/PROJEKTE/_INTERN/_webg
ames/rubymaze/app/class"]
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:118:in `read'
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:127:in `process_require'
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:42:in `block in build_str'
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:42:in `map'
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:42:in `build_str'
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:35:in `build'
C:/Ruby22-x64/lib/ruby/gems/2.2.0/gems/opal-0.9.0/lib/opal/builder.rb:30:in `build'
D:/project/example/rakefile.rb:25:in `block in <top (required)>'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:240:in `call'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:240:in `block in execute'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:235:in `each'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:235:in `execute'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:179:in `block in invoke_with_call_chain'
C:/Ruby22-x64/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:172:in `invoke_with_call_chain'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/task.rb:165:in `invoke'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:150:in `invoke_task'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:106:in `block (2 levels) in top_level'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:106:in `each'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:106:in `block in top_level'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:115:in `run_with_threads'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:100:in `top_level'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:78:in `block in run'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:176:in `standard_exception_handling'
C:/Ruby22-x64/lib/ruby/2.2.0/rake/application.rb:75:in `run'
C:/Ruby22-x64/bin/rake:33:in `<main>'
Tasks: TOP => build

Ruby x64 @ Win7 x64

Any idea?

elia commented

Yes, here's the catch: opal-haml only works with the sprockets-based stack:

https://github.com/opal/opal/blob/master/docs/using_sprockets.md#opal--sprockets

Something more or less like the following:

require 'sprockets'
environment = Sprockets::Environment.new

require 'opal'
require 'opal-haml'

Opal.append_path "app"
Opal.append_path "app/views"
Opal.append_path "app/class"

Opal.paths.each do |path|
  environment.append_path path
end

File.binwrite "public/lib/app.js", environment['application.js'].to_s

I unfortunately don't get it work.

So i just created a repo for this here:
https://github.com/entwanderer/opal-haml-test

There I'm currently using the .opalerb-template and it builds fine with rake build

By renaming "example" to "exmaple2" (on require and @ Template[...]) in app/application.rb it should use the example2.haml, but I still get the same error as posted before when executing rake build

Do you have an idea?