Skip to content

Commit

Permalink
Use Haml 5's new API to avoid using deprecated private method. (#312)
Browse files Browse the repository at this point in the history
* Use Haml 5's new API

to avoid using deprecated private method.

* Test with Haml >= 4

Haml < 4 is no longer maintained.
  • Loading branch information
k0kubun authored and judofyr committed May 16, 2017
1 parent 51d9a3f commit 90c603c
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 38 deletions.
2 changes: 1 addition & 1 deletion Gemfile
Expand Up @@ -12,7 +12,7 @@ can_execjs = (RUBY_VERSION >= '1.9.3')

group :primary do
gem 'builder'
gem 'haml', '>= 2.2.11', '< 4'
gem 'haml', '>= 4'
gem 'erubis'
gem 'markaby'
gem 'sass'
Expand Down
97 changes: 60 additions & 37 deletions lib/tilt/haml.rb
Expand Up @@ -7,51 +7,74 @@ module Tilt
class HamlTemplate < Template
self.default_mime_type = 'text/html'

def prepare
options = @options.merge(:filename => eval_file, :line => line)
@engine = ::Haml::Engine.new(data, options)
end

def evaluate(scope, locals, &block)
raise ArgumentError, 'invalid scope: must not be frozen' if scope.frozen?
# `Gem::Version.correct?` may return false because of Haml::VERSION #=> "3.1.8 (Separated Sally)". After Haml 4, it's always correct.
if Gem::Version.correct?(Haml::VERSION) && Gem::Version.new(Haml::VERSION) >= Gem::Version.new('5.0.0.beta.2')
def prepare
@engine = ::Haml::TempleEngine.new(@options.merge(filename: eval_file, line: line))
@engine.compile(data)
end

if @engine.respond_to?(:precompiled_method_return_value, true)
def evaluate(scope, locals, &block)
raise ArgumentError, 'invalid scope: must not be frozen' if scope.frozen?
super
else
@engine.render(scope, locals, &block)
end
end

# Precompiled Haml source. Taken from the precompiled_with_ambles
# method in Haml::Precompiler:
# http://github.com/nex3/haml/blob/master/lib/haml/precompiler.rb#L111-126
def precompiled_template(locals)
@engine.precompiled
end

def precompiled_preamble(locals)
local_assigns = super
@engine.instance_eval do
<<-RUBY
begin
extend Haml::Helpers
_hamlout = @haml_buffer = Haml::Buffer.new(@haml_buffer, #{options_for_buffer.inspect})
_erbout = _hamlout.buffer
def precompiled_template(locals)
@engine.precompiled_with_ambles(
[],
after_preamble: <<-RUBY
__in_erb_template = true
_haml_locals = locals
#{local_assigns}
RUBY
RUBY
)
end
else # Following definitions are for Haml <= 4 and deprecated.
def prepare
options = @options.merge(:filename => eval_file, :line => line)
@engine = ::Haml::Engine.new(data, options)
end

def evaluate(scope, locals, &block)
raise ArgumentError, 'invalid scope: must not be frozen' if scope.frozen?

if @engine.respond_to?(:precompiled_method_return_value, true)
super
else
@engine.render(scope, locals, &block)
end
end

# Precompiled Haml source. Taken from the precompiled_with_ambles
# method in Haml::Precompiler:
# http://github.com/nex3/haml/blob/master/lib/haml/precompiler.rb#L111-126
def precompiled_template(locals)
@engine.precompiled
end

def precompiled_preamble(locals)
local_assigns = super
@engine.instance_eval do
<<-RUBY
begin
extend Haml::Helpers
_hamlout = @haml_buffer = Haml::Buffer.new(@haml_buffer, #{options_for_buffer.inspect})
_erbout = _hamlout.buffer
__in_erb_template = true
_haml_locals = locals
#{local_assigns}
RUBY
end
end
end

def precompiled_postamble(locals)
@engine.instance_eval do
<<-RUBY
#{precompiled_method_return_value}
ensure
@haml_buffer = @haml_buffer.upper if @haml_buffer
end
RUBY
def precompiled_postamble(locals)
@engine.instance_eval do
<<-RUBY
#{precompiled_method_return_value}
ensure
@haml_buffer = @haml_buffer.upper if @haml_buffer
end
RUBY
end
end
end
end
Expand Down

0 comments on commit 90c603c

Please sign in to comment.