/
barista.rb
78 lines (60 loc) · 1.95 KB
/
barista.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
require 'active_support'
require 'pathname'
module Barista
autoload :Compiler, 'barista/compiler'
autoload :AroundFilter, 'barista/around_filter'
class << self
def root
@root ||= Rails.root.join("app", "scripts")
end
def root=(value)
@root = Pathname(value.to_s)
end
def output_root
@output_root ||= Rails.root.join("public", "javascripts")
end
def output_root=(value)
@output_root = Pathname(value.to_s)
end
def render_path(path)
full_path = root.join("#{path.gsub(/(\A\/|\/\Z)/, '')}.coffee")
return unless full_path.exist? && full_path.readable?
Compiler.compile(full_path.read)
rescue SysCallError
nil
end
def compile_file!(file, force = false)
file = file.to_s
file = root.join(file).to_s unless file.include?(root.to_s)
destination_path = file.gsub(/\.(coffee|js)\Z/, '').gsub(root.to_s, output_root.to_s) + ".js"
return unless force || should_compile_file?(file, destination_path)
File.open(destination_path, "w+") do |f|
f.write Compiler.compile(File.read(file))
end
true
rescue SysCallError
false
end
def should_compile_file?(from, to)
File.exist?(from) && (!File.exist?(to) || File.mtime(to) < File.mtime(from))
end
def compile_all!(force = false)
Dir[root.join("**", "*.coffee")].each {|file| compile_file! file, force }
true
end
# By default, only add it in dev / test
def add_filter?
Rails.env.test? || Rails.env.development?
end
end
if defined?(Rails::Engine)
class Engine < Rails::Engine
rake_tasks do
load File.expand_path('./barista/tasks/barista.rake', File.dirname(__FILE__))
end
initializer "barista.wrap_filter" do
ApplicationController.around_filter(Barista::AroundFilter) if Barista.add_filter?
end
end
end
end