opal 0.3.43 → 0.3.44
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +19 -0
- data/README.md +1 -0
- data/Rakefile +29 -19
- data/examples/native/Gemfile +3 -0
- data/examples/native/README.md +17 -0
- data/examples/native/app/app.rb +38 -0
- data/examples/native/config.ru +8 -0
- data/examples/native/index.html.erb +12 -0
- data/lib/opal/lexer.rb +5 -1
- data/lib/opal/parser.rb +36 -10
- data/lib/opal/processor.rb +10 -9
- data/lib/opal/server.rb +17 -7
- data/lib/opal/target_scope.rb +2 -2
- data/lib/opal/version.rb +1 -1
- data/opal/opal-browser/script_loader.rb +8 -13
- data/opal/opal.rb +23 -5
- data/opal/opal/array.rb +128 -14
- data/opal/opal/boolean.rb +1 -1
- data/opal/opal/class.rb +92 -18
- data/opal/opal/enumerable.rb +90 -0
- data/opal/opal/error.rb +1 -1
- data/opal/opal/hash.rb +2 -2
- data/opal/opal/kernel.rb +3 -3
- data/opal/opal/numeric.rb +1 -1
- data/opal/opal/proc.rb +1 -1
- data/opal/opal/regexp.rb +31 -31
- data/opal/opal/runtime.js +181 -69
- data/opal/opal/string.rb +561 -40
- data/opal/opal/time.rb +1 -1
- data/opal/rbconfig.rb +17 -3
- data/opal/strscan.rb +41 -5
- data/spec/opal/class/new_spec.rb +27 -0
- data/spec/opal/native_spec.rb +127 -0
- data/spec/ospec/runner.rb +0 -2
- data/spec/parser/strscan/get_byte_spec.rb +29 -0
- data/spec/parser/strscan/skip_spec.rb +40 -0
- data/spec/rubyspec/core/array/each_spec.rb +1 -1
- data/spec/rubyspec/core/array/intersection_spec.rb +5 -0
- data/spec/rubyspec/core/array/max_spec.rb +32 -0
- data/spec/rubyspec/core/array/min_spec.rb +32 -0
- data/spec/rubyspec/core/array/minus_spec.rb +7 -5
- data/spec/rubyspec/core/array/multiply_spec.rb +1 -1
- data/spec/rubyspec/core/array/plus_spec.rb +1 -1
- data/spec/rubyspec/core/array/pop_spec.rb +1 -1
- data/spec/rubyspec/core/array/push_spec.rb +1 -1
- data/spec/rubyspec/core/array/rassoc_spec.rb +1 -1
- data/spec/rubyspec/core/array/reject_spec.rb +2 -2
- data/spec/rubyspec/core/array/reverse_each_spec.rb +2 -2
- data/spec/rubyspec/core/array/rindex_spec.rb +2 -2
- data/spec/rubyspec/core/array/select_spec.rb +1 -1
- data/spec/rubyspec/core/array/shift_spec.rb +1 -1
- data/spec/rubyspec/core/array/slice_spec.rb +1 -1
- data/spec/rubyspec/core/array/sort_spec.rb +15 -15
- data/spec/rubyspec/core/array/to_a_spec.rb +1 -1
- data/spec/rubyspec/core/array/to_ary_spec.rb +1 -1
- data/spec/rubyspec/core/array/uniq_spec.rb +1 -1
- data/spec/rubyspec/core/array/unshift_spec.rb +1 -1
- data/spec/rubyspec/core/array/zip_spec.rb +1 -1
- data/spec/rubyspec/core/enumerable/select_spec.rb +4 -1
- data/spec/rubyspec/core/module/const_defined_spec.rb +86 -0
- data/spec/rubyspec/core/module/const_get_spec.rb +55 -3
- data/spec/rubyspec/core/module/const_set_spec.rb +2 -2
- data/spec/rubyspec/core/module/constants_spec.rb +49 -0
- data/spec/rubyspec/core/regexp/match_spec.rb +66 -1
- data/spec/rubyspec/core/string/center_spec.rb +71 -0
- data/spec/rubyspec/core/string/chomp_spec.rb +6 -1
- data/spec/rubyspec/core/string/clone_spec.rb +8 -0
- data/spec/rubyspec/core/string/dup_spec.rb +8 -0
- data/spec/rubyspec/core/string/end_with_spec.rb +5 -1
- data/spec/rubyspec/core/string/gsub_spec.rb +15 -1
- data/spec/rubyspec/core/string/lines_spec.rb +9 -0
- data/spec/rubyspec/core/string/ljust_spec.rb +17 -0
- data/spec/rubyspec/core/string/match_spec.rb +25 -3
- data/spec/rubyspec/core/string/rindex_spec.rb +50 -0
- data/spec/rubyspec/core/string/rjust_spec.rb +17 -0
- data/spec/rubyspec/core/string/scan_spec.rb +66 -0
- data/spec/rubyspec/core/string/sub_spec.rb +17 -1
- data/spec/rubyspec/core/string/tr_s_spec.rb +31 -0
- data/spec/rubyspec/core/string/tr_spec.rb +31 -0
- data/spec/rubyspec/fixtures/constants.rb +6 -0
- data/spec/rubyspec/language/class_spec.rb +4 -8
- data/spec/rubyspec/language/numbers_spec.rb +10 -4
- data/spec/rubyspec/language/predefined_spec.rb +69 -2
- data/spec/rubyspec/library/rbconfig/config_spec.rb +47 -0
- data/spec/rubyspec/spec_helper.rb +6 -0
- metadata +46 -25
- data/opal/opal-eventable.rb +0 -26
- data/opal/opal/native.rb +0 -115
- data/spec/opal/eventable_spec.rb +0 -75
- data/spec/opal/native/element_reference_spec.rb +0 -40
- data/spec/opal/native/equal_spec.rb +0 -17
- data/spec/opal/native/fixtures/classes.rb +0 -27
- data/spec/opal/native/global_spec.rb +0 -12
- data/spec/opal/native/initialize_spec.rb +0 -8
- data/spec/opal/native/method_missing_spec.rb +0 -53
- data/spec/opal/native/to_native_spec.rb +0 -8
- data/spec/rubyspec/core/string/demodulize_spec.rb +0 -10
- data/spec/rubyspec/core/string/underscore_spec.rb +0 -17
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
## 0.3.44 2013-05-31
|
2
|
+
|
3
|
+
* Cleanup runtime, and remove various flags and functions from opal
|
4
|
+
objects and classes (moving them to runtime methods).
|
5
|
+
|
6
|
+
* Remove some activesupport methods into external lib.
|
7
|
+
|
8
|
+
* Add/fix lots of String methods, with specs.
|
9
|
+
|
10
|
+
* Add more methods to MatchData class.
|
11
|
+
|
12
|
+
* Implement $' and $` variables.
|
13
|
+
|
14
|
+
* Opal can now call methods on all native objects, via method missing
|
15
|
+
dispatcher.
|
16
|
+
|
17
|
+
* Add Opal::Environment as custom sprockets subclass which adds all
|
18
|
+
opal load paths automatically.
|
19
|
+
|
1
20
|
## 0.3.43 2013-05-02
|
2
21
|
|
3
22
|
* Stop inlining respond_to? inside the parser. This now fully respects
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Opal
|
2
2
|
|
3
3
|
[![Build Status](https://secure.travis-ci.org/opal/opal.png?branch=master)](http://travis-ci.org/opal/opal)
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/opal.png)](http://badge.fury.io/rb/opal)
|
4
5
|
|
5
6
|
Opal is a ruby to javascript source-to-source compiler. It also has an
|
6
7
|
implementation of the ruby corelib.
|
data/Rakefile
CHANGED
@@ -47,21 +47,21 @@ namespace :spec do
|
|
47
47
|
#Example:
|
48
48
|
#spec:core => spec/core/
|
49
49
|
#spec:core:array:allocae => spec/core/array/allocate_spec.rb
|
50
|
-
def path(dirs)
|
50
|
+
def path(dirs)
|
51
51
|
path = "#{Dir.pwd}"
|
52
52
|
dirs.each do |dir|
|
53
|
-
base = path + "/#{dir}"
|
53
|
+
base = path + "/#{dir}"
|
54
54
|
if Dir.exists?(base)
|
55
55
|
path = base
|
56
56
|
else
|
57
57
|
path = Dir.glob("#{base}_spec.rb")
|
58
|
-
end
|
58
|
+
end
|
59
59
|
end
|
60
60
|
path = [path].flatten
|
61
61
|
raise "File or Dir with task #{t.name} not found." if path.empty?
|
62
62
|
path
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
RunSpec.new(path(t.name.split(":")))
|
66
66
|
end
|
67
67
|
end
|
@@ -70,27 +70,31 @@ desc "Build opal.js and opal-parser.js to build/"
|
|
70
70
|
task :dist do
|
71
71
|
Opal::Processor.arity_check_enabled = false
|
72
72
|
|
73
|
-
env =
|
74
|
-
Opal.paths.each { |p| env.append_path p }
|
73
|
+
env = Opal::Environment.new
|
75
74
|
|
76
75
|
Dir.mkdir 'build' unless File.directory? 'build'
|
77
76
|
|
78
|
-
|
79
|
-
|
80
|
-
end
|
77
|
+
%w[opal opal-parser].each do |lib|
|
78
|
+
puts "* building #{lib}..."
|
81
79
|
|
82
|
-
|
83
|
-
|
84
|
-
|
80
|
+
src = env[lib].to_s
|
81
|
+
min = uglify src
|
82
|
+
gzp = gzip min
|
85
83
|
|
86
|
-
|
87
|
-
|
84
|
+
File.open("build/#{lib}.js", 'w+') { |f| f << src }
|
85
|
+
File.open("build/#{lib}.min.js", 'w+') { |f| f << min } if min
|
86
|
+
File.open("build/#{lib}.min.js.gz", 'w+') { |f| f << gzp } if gzp
|
88
87
|
|
89
|
-
|
90
|
-
|
91
|
-
|
88
|
+
print "done. (development: #{src.size}B"
|
89
|
+
print ", minified: #{min.size}B" if min
|
90
|
+
print ", gzipped: #{gzp.size}Bx" if gzp
|
91
|
+
puts ")."
|
92
|
+
puts
|
93
|
+
end
|
94
|
+
end
|
92
95
|
|
93
|
-
|
96
|
+
desc "Check file sizes for opal.js runtime"
|
97
|
+
task :sizes => :dist do
|
94
98
|
end
|
95
99
|
|
96
100
|
desc "Rebuild grammar.rb for opal parser"
|
@@ -100,11 +104,14 @@ end
|
|
100
104
|
|
101
105
|
# Used for uglifying source to minify
|
102
106
|
def uglify(str)
|
103
|
-
IO.popen('uglifyjs -
|
107
|
+
IO.popen('uglifyjs --no-mangle --compress warnings=false', 'r+') do |i|
|
104
108
|
i.puts str
|
105
109
|
i.close_write
|
106
110
|
return i.read
|
107
111
|
end
|
112
|
+
rescue Errno::ENOENT
|
113
|
+
$stderr.puts '"uglifyjs" command not found (install with: "npm install -g uglify-js")'
|
114
|
+
nil
|
108
115
|
end
|
109
116
|
|
110
117
|
# Gzip code to check file size
|
@@ -114,4 +121,7 @@ def gzip(str)
|
|
114
121
|
i.close_write
|
115
122
|
return i.read
|
116
123
|
end
|
124
|
+
rescue Errno::ENOENT
|
125
|
+
$stderr.puts '"gzip" command not found, it is required to produce the .gz version'
|
126
|
+
nil
|
117
127
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# opal native example
|
2
|
+
|
3
|
+
This example shows how native objects and functions can be called
|
4
|
+
directly from ruby code.
|
5
|
+
|
6
|
+
## Usage
|
7
|
+
|
8
|
+
First, change into this directory and get required gems:
|
9
|
+
|
10
|
+
$ bundle install
|
11
|
+
|
12
|
+
Run the rack server:
|
13
|
+
|
14
|
+
$ bundle exec rackup
|
15
|
+
|
16
|
+
Now just visit `http://localhost:9292` in the browser, and view the
|
17
|
+
added elements on screen.
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'opal'
|
2
|
+
|
3
|
+
$window.addEventListener 'DOMContentLoaded', proc {
|
4
|
+
|
5
|
+
css = <<-CSS
|
6
|
+
body {
|
7
|
+
font-family: 'Arial';
|
8
|
+
}
|
9
|
+
CSS
|
10
|
+
|
11
|
+
title = $document.createElement 'h1'
|
12
|
+
title.className = 'main-title'
|
13
|
+
title.innerHTML = 'Opal Native Example'
|
14
|
+
|
15
|
+
desc = $document.createElement 'p'
|
16
|
+
desc.innerHTML = "Hello world! From Opal."
|
17
|
+
|
18
|
+
target = $document.getElementById 'native-example'
|
19
|
+
|
20
|
+
unless target
|
21
|
+
raise "'native-example' doesn't exist?"
|
22
|
+
end
|
23
|
+
|
24
|
+
target.appendChild title
|
25
|
+
target.appendChild desc
|
26
|
+
|
27
|
+
styles = $document.createElement 'style'
|
28
|
+
styles.type = 'text/css'
|
29
|
+
|
30
|
+
if styles.respond_to? :styleSheet
|
31
|
+
styles.styleSheet.cssText = css
|
32
|
+
else
|
33
|
+
styles.appendChild $document.createTextNode css
|
34
|
+
end
|
35
|
+
|
36
|
+
$document.getElementsByTagName('head')[0].appendChild(styles)
|
37
|
+
|
38
|
+
}, false
|
data/lib/opal/lexer.rb
CHANGED
@@ -807,7 +807,11 @@ module Opal
|
|
807
807
|
|
808
808
|
elsif scanner.check(/[0-9]/)
|
809
809
|
@lex_state = :expr_end
|
810
|
-
if scanner.scan(/
|
810
|
+
if scanner.scan(/0b?(0|1|_)+/)
|
811
|
+
return [:INTEGER, scanner.matched.to_i(2)]
|
812
|
+
elsif scanner.scan(/0o?([0-7]|_)+/)
|
813
|
+
return [:INTEGER, scanner.matched.to_i(8)]
|
814
|
+
elsif scanner.scan(/[\d_]+\.[\d_]+\b|[\d_]+(\.[\d_]+)?[eE][-+]?[\d_]+\b/)
|
811
815
|
return [:FLOAT, scanner.matched.gsub(/_/, '').to_f]
|
812
816
|
elsif scanner.scan(/[\d_]+\b/)
|
813
817
|
return [:INTEGER, scanner.matched.gsub(/_/, '').to_i]
|
data/lib/opal/parser.rb
CHANGED
@@ -22,7 +22,7 @@ module Opal
|
|
22
22
|
break case catch continue debugger default delete do else finally for
|
23
23
|
function if in instanceof new return switch this throw try typeof var let
|
24
24
|
void while with class enum export extends import super true false native
|
25
|
-
const
|
25
|
+
const static
|
26
26
|
)
|
27
27
|
|
28
28
|
# Statements which should not have ';' added to them.
|
@@ -52,6 +52,7 @@ module Opal
|
|
52
52
|
@optimized_operators = (options[:optimized_operators] != false)
|
53
53
|
@arity_check = options[:arity_check]
|
54
54
|
@const_missing = (options[:const_missing] != false)
|
55
|
+
@dynamic_require_severity = (options[:dynamic_require_severity] || :error)
|
55
56
|
|
56
57
|
@result = top(@sexp)
|
57
58
|
end
|
@@ -68,6 +69,15 @@ module Opal
|
|
68
69
|
raise SyntaxError, "#{msg} :#{@file}:#{@line}"
|
69
70
|
end
|
70
71
|
|
72
|
+
# This is called when a parsing/processing warning occurs. This
|
73
|
+
# method simply appends the filename and curent line number onto
|
74
|
+
# the message and issues a warning.
|
75
|
+
#
|
76
|
+
# @param [String] msg warning message to raise
|
77
|
+
def warning(msg)
|
78
|
+
warn "#{msg} :#{@file}:#{@line}"
|
79
|
+
end
|
80
|
+
|
71
81
|
# Instances of `Scope` can use this to determine the current
|
72
82
|
# scope indent. The indent is used to keep generated code easily
|
73
83
|
# readable.
|
@@ -643,7 +653,7 @@ module Opal
|
|
643
653
|
code += "\n#@indent" + process(body, :stmt)
|
644
654
|
|
645
655
|
if @scope.defines_defn
|
646
|
-
@scope.add_temp "def = (#{current_self}
|
656
|
+
@scope.add_temp "def = ((typeof(#{current_self}) === 'function') ? #{current_self}.prototype : #{current_self})"
|
647
657
|
end
|
648
658
|
|
649
659
|
code = "\n#@indent#{@scope.to_vars}\n#@indent#{code}"
|
@@ -780,7 +790,7 @@ module Opal
|
|
780
790
|
|
781
791
|
def handle_require(sexp)
|
782
792
|
str = handle_require_sexp sexp
|
783
|
-
@requires << str
|
793
|
+
@requires << str unless str.nil?
|
784
794
|
""
|
785
795
|
end
|
786
796
|
|
@@ -804,7 +814,13 @@ module Opal
|
|
804
814
|
end
|
805
815
|
end
|
806
816
|
|
807
|
-
|
817
|
+
|
818
|
+
case @dynamic_require_severity
|
819
|
+
when :error
|
820
|
+
error "Cannot handle dynamic require"
|
821
|
+
when :warning
|
822
|
+
warning "Cannot handle dynamic require"
|
823
|
+
end
|
808
824
|
end
|
809
825
|
|
810
826
|
def handle_expand_path(path, base = '')
|
@@ -931,7 +947,8 @@ module Opal
|
|
931
947
|
@scope.add_temp "__scope = #{current_self}._scope"
|
932
948
|
@scope.add_temp "def = #{current_self}.prototype"
|
933
949
|
|
934
|
-
|
950
|
+
body = process body, :stmt
|
951
|
+
code = @scope.to_vars + body
|
935
952
|
end
|
936
953
|
|
937
954
|
call = s(:call, recv, :singleton_class, s(:arglist))
|
@@ -1085,7 +1102,7 @@ module Opal
|
|
1085
1102
|
|
1086
1103
|
if recvr
|
1087
1104
|
if smethod
|
1088
|
-
"#{
|
1105
|
+
"__opal.defs(#{@scope.name}, '$#{mid}', #{defcode})"
|
1089
1106
|
else
|
1090
1107
|
"#{ recv }#{ jsid } = #{ defcode }"
|
1091
1108
|
end
|
@@ -1424,8 +1441,12 @@ module Opal
|
|
1424
1441
|
def process_const(sexp, level)
|
1425
1442
|
cname = sexp.shift.to_s
|
1426
1443
|
|
1427
|
-
|
1428
|
-
|
1444
|
+
if @const_missing
|
1445
|
+
with_temp do |t|
|
1446
|
+
"((#{t} = __scope.#{cname}) == null ? __opal.cm(#{cname.inspect}) : #{t})"
|
1447
|
+
end
|
1448
|
+
else
|
1449
|
+
"__scope.#{cname}"
|
1429
1450
|
end
|
1430
1451
|
end
|
1431
1452
|
|
@@ -1760,9 +1781,14 @@ module Opal
|
|
1760
1781
|
base = sexp[0]
|
1761
1782
|
cname = sexp[1].to_s
|
1762
1783
|
|
1763
|
-
|
1784
|
+
if @const_missing
|
1785
|
+
with_temp do |t|
|
1786
|
+
base = process base, :expr
|
1787
|
+
"((#{t} = (#{base})._scope).#{cname} == null ? #{t}.cm(#{cname.inspect}) : #{t}.#{cname})"
|
1788
|
+
end
|
1789
|
+
else
|
1764
1790
|
base = process base, :expr
|
1765
|
-
"(
|
1791
|
+
"(#{base})._scope.#{cname}"
|
1766
1792
|
end
|
1767
1793
|
end
|
1768
1794
|
|
data/lib/opal/processor.rb
CHANGED
@@ -4,10 +4,8 @@ module Opal
|
|
4
4
|
# Proccess using Sprockets
|
5
5
|
#
|
6
6
|
# Opal.process('opal-jquery') # => String
|
7
|
-
def self.process
|
8
|
-
|
9
|
-
Opal.paths.each { |p| env.append_path p }
|
10
|
-
env[file].to_s
|
7
|
+
def self.process asset
|
8
|
+
Environment.new[asset].to_s
|
11
9
|
end
|
12
10
|
|
13
11
|
# The Processor class is used to make ruby files (with rb or opal extensions)
|
@@ -31,12 +29,14 @@ module Opal
|
|
31
29
|
attr_accessor :optimized_operators_enabled
|
32
30
|
attr_accessor :arity_check_enabled
|
33
31
|
attr_accessor :const_missing_enabled
|
32
|
+
attr_accessor :dynamic_require_severity
|
34
33
|
end
|
35
34
|
|
36
35
|
self.method_missing_enabled = true
|
37
36
|
self.optimized_operators_enabled = true
|
38
37
|
self.arity_check_enabled = false
|
39
38
|
self.const_missing_enabled = true
|
39
|
+
self.dynamic_require_severity = :error # :error, :warning or :ignore
|
40
40
|
|
41
41
|
def initialize_engine
|
42
42
|
require_template_library 'opal'
|
@@ -47,11 +47,12 @@ module Opal
|
|
47
47
|
|
48
48
|
def evaluate(context, locals, &block)
|
49
49
|
options = {
|
50
|
-
:method_missing
|
51
|
-
:optimized_operators
|
52
|
-
:arity_check
|
53
|
-
:const_missing
|
54
|
-
:
|
50
|
+
:method_missing => self.class.method_missing_enabled,
|
51
|
+
:optimized_operators => self.class.optimized_operators_enabled,
|
52
|
+
:arity_check => self.class.arity_check_enabled,
|
53
|
+
:const_missing => self.class.const_missing_enabled,
|
54
|
+
:dynamic_require_severity => self.class.dynamic_require_severity,
|
55
|
+
:file => context.logical_path
|
55
56
|
}
|
56
57
|
|
57
58
|
parser = Opal::Parser.new
|
data/lib/opal/server.rb
CHANGED
@@ -1,22 +1,27 @@
|
|
1
1
|
require 'erb'
|
2
2
|
|
3
3
|
module Opal
|
4
|
+
class Environment < ::Sprockets::Environment
|
5
|
+
def initialize *args
|
6
|
+
super
|
7
|
+
Opal.paths.each { |p| append_path p }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
4
11
|
class Server
|
5
12
|
|
6
13
|
attr_accessor :debug, :index_path, :main, :public_dir, :sprockets
|
7
14
|
|
8
|
-
def initialize
|
9
|
-
@sprockets = ::Sprockets::Environment.new
|
10
|
-
Opal.paths.each { |p| @sprockets.append_path p }
|
11
|
-
|
15
|
+
def initialize debug = true
|
12
16
|
@public_dir = '.'
|
13
|
-
@
|
17
|
+
@sprockets = Environment.new
|
18
|
+
@debug = debug
|
14
19
|
|
15
20
|
yield self if block_given?
|
16
21
|
create_app
|
17
22
|
end
|
18
23
|
|
19
|
-
def append_path
|
24
|
+
def append_path path
|
20
25
|
@sprockets.append_path path
|
21
26
|
end
|
22
27
|
|
@@ -50,10 +55,15 @@ module Opal
|
|
50
55
|
end
|
51
56
|
end
|
52
57
|
|
58
|
+
# Returns the html content for the root path. Supports ERB
|
53
59
|
def html
|
54
60
|
source = if @index_path
|
55
61
|
raise "index does not exist: #{@index_path}" unless File.exist?(@index_path)
|
56
62
|
File.read @index_path
|
63
|
+
elsif File.exist? 'index.html'
|
64
|
+
File.read 'index.html'
|
65
|
+
elsif File.exist? 'index.html.erb'
|
66
|
+
File.read 'index.html.erb'
|
57
67
|
else
|
58
68
|
SOURCE
|
59
69
|
end
|
@@ -61,7 +71,7 @@ module Opal
|
|
61
71
|
::ERB.new(source).result binding
|
62
72
|
end
|
63
73
|
|
64
|
-
def javascript_include_tag
|
74
|
+
def javascript_include_tag source
|
65
75
|
if @server.debug
|
66
76
|
assets = @server.sprockets[source].to_a
|
67
77
|
|