opal 0.4.2 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +5 -0
- data/README.md +42 -2
- data/Rakefile +7 -6
- data/bin/opal +2 -2
- data/{opal → corelib}/opal.rb +21 -21
- data/{opal → corelib}/opal/array.rb +37 -24
- data/{opal → corelib}/opal/basic_object.rb +0 -0
- data/{opal → corelib}/opal/boolean.rb +0 -0
- data/{opal → corelib}/opal/class.rb +45 -22
- data/{opal → corelib}/opal/comparable.rb +0 -0
- data/{opal → corelib}/opal/enumerable.rb +0 -0
- data/{opal → corelib}/opal/enumerator.rb +0 -0
- data/{opal → corelib}/opal/error.rb +16 -12
- data/{opal → corelib}/opal/hash.rb +2 -2
- data/{opal → corelib}/opal/kernel.rb +16 -14
- data/{opal → corelib}/opal/native.rb +0 -0
- data/{opal → corelib}/opal/nil_class.rb +1 -1
- data/{opal → corelib}/opal/numeric.rb +0 -0
- data/{opal → corelib}/opal/proc.rb +0 -0
- data/{opal → corelib}/opal/range.rb +2 -2
- data/{opal → corelib}/opal/regexp.rb +0 -0
- data/{opal → corelib}/opal/runtime.js +92 -126
- data/{opal → corelib}/opal/string.rb +14 -13
- data/{opal → corelib}/opal/time.rb +0 -0
- data/lib/opal.rb +9 -8
- data/lib/opal/builder.rb +81 -0
- data/lib/opal/erb.rb +17 -0
- data/lib/opal/grammar.rb +33 -30
- data/lib/opal/grammar.y +18 -15
- data/lib/opal/grammar_helpers.rb +5 -5
- data/lib/opal/lexer.rb +3 -2
- data/lib/opal/parser.rb +58 -41
- data/lib/opal/require_parser.rb +77 -0
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +1 -1
- data/{config.ru → spec/config.ru} +0 -0
- data/spec/opal/array/to_json_spec.rb +3 -1
- data/spec/opal/boolean/to_json_spec.rb +3 -1
- data/spec/opal/erb/erb_spec.rb +25 -0
- data/spec/opal/erb/quoted.opalerb +1 -0
- data/spec/opal/erb/simple.opalerb +1 -0
- data/spec/opal/json/parse_spec.rb +3 -1
- data/spec/opal/kernel/to_json_spec.rb +3 -1
- data/spec/opal/nil/to_json_spec.rb +3 -1
- data/spec/opal/string/to_json_spec.rb +3 -1
- data/spec/parser/int_spec.rb +13 -0
- data/spec/parser/regexp_spec.rb +16 -0
- data/spec/parser/str_spec.rb +11 -0
- data/spec/rubyspec/core/array/plus_spec.rb +7 -2
- data/spec/rubyspec/core/hash/to_json_spec.rb +3 -1
- data/spec/rubyspec/core/numeric/to_json_spec.rb +3 -1
- data/spec/rubyspec/language/defined_spec.rb +9 -0
- data/spec/rubyspec/library/stringscanner/pos_spec.rb +20 -0
- data/{opal → stdlib}/date.rb +0 -0
- data/stdlib/erb.rb +26 -0
- data/{opal → stdlib}/fileutils.rb +0 -0
- data/{opal → stdlib}/iconv.rb +0 -0
- data/{opal/opal → stdlib}/json.rb +0 -0
- data/{opal → stdlib}/observer.rb +0 -0
- data/{opal → stdlib}/opal-browser/local_storage.rb +0 -0
- data/{opal → stdlib}/opal-browser/script_loader.rb +1 -1
- data/{opal → stdlib}/opal-parser.js.erb +1 -1
- data/{opal → stdlib}/opal-source-maps.js.erb +0 -0
- data/{opal → stdlib}/pp.rb +0 -0
- data/{opal → stdlib}/racc.rb +0 -0
- data/{opal → stdlib}/rbconfig.rb +0 -0
- data/{opal → stdlib}/source_map.rb +1 -1
- data/{opal → stdlib}/source_map/generator.rb +0 -0
- data/{opal → stdlib}/source_map/parser.rb +0 -0
- data/{opal → stdlib}/source_map/vlq.rb +0 -0
- data/{opal → stdlib}/strscan.rb +15 -0
- data/{opal → stdlib}/yaml.rb +0 -0
- metadata +87 -77
- checksums.yaml +0 -7
- data/CHANGELOG.md +0 -176
- data/examples/native/Gemfile +0 -3
- data/examples/native/README.md +0 -17
- data/examples/native/app/app.rb +0 -57
- data/examples/native/config.ru +0 -8
- data/examples/native/index.html.erb +0 -12
- data/examples/rack/Gemfile +0 -3
- data/examples/rack/README.md +0 -22
- data/examples/rack/app/app.rb +0 -5
- data/examples/rack/config.ru +0 -20
- data/examples/rack/index.html +0 -12
- data/examples/server/Gemfile +0 -3
- data/examples/server/README.md +0 -22
- data/examples/server/app/app.rb +0 -18
- data/examples/server/config.ru +0 -10
- data/examples/server/index.html.erb +0 -10
- data/opal/opal-template.rb +0 -33
- data/spec/opal/class/_inherited_spec.rb +0 -32
- data/spec/opal/class/new_spec.rb +0 -27
data/lib/opal/grammar_helpers.rb
CHANGED
|
@@ -259,8 +259,8 @@ module Opal
|
|
|
259
259
|
ref
|
|
260
260
|
when :ivar, :gvar, :cvar
|
|
261
261
|
ref
|
|
262
|
-
when :
|
|
263
|
-
# this is when we passed __LINE__ which is converted into :
|
|
262
|
+
when :int
|
|
263
|
+
# this is when we passed __LINE__ which is converted into :int
|
|
264
264
|
ref
|
|
265
265
|
when :str
|
|
266
266
|
# returns for __FILE__ as it is converted into str
|
|
@@ -301,7 +301,7 @@ module Opal
|
|
|
301
301
|
return s(:nil) unless str
|
|
302
302
|
case str[0]
|
|
303
303
|
when :str
|
|
304
|
-
str[0] = :
|
|
304
|
+
str[0] = :sym
|
|
305
305
|
str[1] = str[1].to_sym
|
|
306
306
|
when :dstr
|
|
307
307
|
str[0] = :dsym
|
|
@@ -329,10 +329,10 @@ module Opal
|
|
|
329
329
|
end
|
|
330
330
|
|
|
331
331
|
def new_regexp(reg, ending)
|
|
332
|
-
return s(:
|
|
332
|
+
return s(:regexp, //) unless reg
|
|
333
333
|
case reg[0]
|
|
334
334
|
when :str
|
|
335
|
-
s(:
|
|
335
|
+
s(:regexp, Regexp.new(reg[1], ending))
|
|
336
336
|
when :evstr
|
|
337
337
|
s(:dregx, "", reg)
|
|
338
338
|
when :dstr
|
data/lib/opal/lexer.rb
CHANGED
|
@@ -117,7 +117,8 @@ module Opal
|
|
|
117
117
|
@lex_state = :expr_end
|
|
118
118
|
|
|
119
119
|
if str_parse[:regexp]
|
|
120
|
-
|
|
120
|
+
result = scanner.scan(/\w+/)
|
|
121
|
+
return :REGEXP_END, result
|
|
121
122
|
end
|
|
122
123
|
return :STRING_END, scanner.matched
|
|
123
124
|
else
|
|
@@ -576,7 +577,7 @@ module Opal
|
|
|
576
577
|
@lex_state = :expr_end
|
|
577
578
|
return '<<', '<<'
|
|
578
579
|
elsif ![:expr_end, :expr_dot, :expr_endarg, :expr_class].include?(@lex_state) && space_seen
|
|
579
|
-
if scanner.scan(/(-?)(\w+)
|
|
580
|
+
if scanner.scan(/(-?)['"]?(\w+)['"]?/)
|
|
580
581
|
heredoc = scanner[2]
|
|
581
582
|
# for now just scrap rest of line + skip down one line for
|
|
582
583
|
# string content
|
data/lib/opal/parser.rb
CHANGED
|
@@ -191,6 +191,7 @@ module Opal
|
|
|
191
191
|
scope.line = sexp.line
|
|
192
192
|
|
|
193
193
|
code = process(scope, :stmt)
|
|
194
|
+
code = [code] unless code.is_a? Array
|
|
194
195
|
code.unshift fragment(@indent, sexp)
|
|
195
196
|
}
|
|
196
197
|
|
|
@@ -198,7 +199,7 @@ module Opal
|
|
|
198
199
|
@scope.add_temp "__scope = __opal"
|
|
199
200
|
@scope.add_temp "$mm = __opal.mm"
|
|
200
201
|
@scope.add_temp "nil = __opal.nil"
|
|
201
|
-
@scope.add_temp "def = __opal.Object.
|
|
202
|
+
@scope.add_temp "def = __opal.Object._proto" if @scope.defines_defn
|
|
202
203
|
@helpers.keys.each { |h| @scope.add_temp "__#{h} = __opal.#{h}" }
|
|
203
204
|
|
|
204
205
|
vars = [fragment(INDENT, sexp), @scope.to_vars, fragment("\n", sexp)]
|
|
@@ -307,11 +308,11 @@ module Opal
|
|
|
307
308
|
# of the format "process_<sexp_name>". Any sexp handler should
|
|
308
309
|
# return a string of content.
|
|
309
310
|
#
|
|
310
|
-
# For example, calling `process` with `s(:
|
|
311
|
+
# For example, calling `process` with `s(:sym, 42)` will call the
|
|
311
312
|
# method `#process_lit`. If a method with that name cannot be
|
|
312
313
|
# found, then an error is raised.
|
|
313
314
|
#
|
|
314
|
-
# process(s(:
|
|
315
|
+
# process(s(:int, 42), :stmt)
|
|
315
316
|
# # => "42"
|
|
316
317
|
#
|
|
317
318
|
# @param [Array] sexp the sexp to process
|
|
@@ -413,7 +414,7 @@ module Opal
|
|
|
413
414
|
# into a block sexp. A block sexp just holds any number of other
|
|
414
415
|
# sexps.
|
|
415
416
|
#
|
|
416
|
-
# s(:block, s(:str, "hey"), s(:
|
|
417
|
+
# s(:block, s(:str, "hey"), s(:int, 42))
|
|
417
418
|
#
|
|
418
419
|
# A block can actually be empty. As opal requires real values to
|
|
419
420
|
# be returned (to appease javascript values), a nil sexp
|
|
@@ -564,29 +565,31 @@ module Opal
|
|
|
564
565
|
fragment((reverse ? "#{ name } === nil" : "#{ name } !== nil"), sexp)
|
|
565
566
|
end
|
|
566
567
|
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
fragment((
|
|
582
|
-
when Range
|
|
583
|
-
@helpers[:range] = true
|
|
584
|
-
"__range(#{val.begin}, #{val.end}, #{val.exclude_end?})"
|
|
568
|
+
def process_sym(sexp, level)
|
|
569
|
+
fragment(sexp[0].to_s.inspect, sexp)
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
def process_int(sexp, level)
|
|
573
|
+
handle_number sexp, level
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
def process_float(sexp, level)
|
|
577
|
+
handle_number sexp, level
|
|
578
|
+
end
|
|
579
|
+
|
|
580
|
+
def handle_number(sexp, level)
|
|
581
|
+
if level == :recv
|
|
582
|
+
fragment("(#{sexp[0]})", sexp)
|
|
585
583
|
else
|
|
586
|
-
|
|
584
|
+
fragment(sexp[0].to_s, sexp)
|
|
587
585
|
end
|
|
588
586
|
end
|
|
589
587
|
|
|
588
|
+
def process_regexp(sexp, level)
|
|
589
|
+
val = sexp[0]
|
|
590
|
+
fragment((val == // ? /^/.inspect : val.inspect), sexp)
|
|
591
|
+
end
|
|
592
|
+
|
|
590
593
|
def process_dregx(sexp, level)
|
|
591
594
|
result = []
|
|
592
595
|
|
|
@@ -653,6 +656,8 @@ module Opal
|
|
|
653
656
|
fragment("(__scope.#{part[1].to_s} != null)", sexp)
|
|
654
657
|
when :colon2
|
|
655
658
|
fragment("false", sexp)
|
|
659
|
+
when :colon3
|
|
660
|
+
fragment("(__opal.Object._scope.#{sexp[0][1]} == null ? nil : 'constant')", sexp)
|
|
656
661
|
when :ivar
|
|
657
662
|
ivar_name = part[1].to_s[1..-1]
|
|
658
663
|
with_temp do |t|
|
|
@@ -739,7 +744,7 @@ module Opal
|
|
|
739
744
|
code << process(body, :stmt)
|
|
740
745
|
|
|
741
746
|
if @scope.defines_defn
|
|
742
|
-
@scope.add_temp "def = ((
|
|
747
|
+
@scope.add_temp "def = ((#{current_self}._isClass) ? #{current_self}._proto : #{current_self})"
|
|
743
748
|
end
|
|
744
749
|
|
|
745
750
|
to_vars = [fragment("\n#@indent", sexp), @scope.to_vars, fragment("\n#@indent", sexp)]
|
|
@@ -782,7 +787,7 @@ module Opal
|
|
|
782
787
|
# using the Module#attr_* methods as expected.
|
|
783
788
|
#
|
|
784
789
|
# @param [Symbol] meth :attr_{reader,writer,accessor}
|
|
785
|
-
# @param [Array<Sexp>] attrs array of s(:
|
|
790
|
+
# @param [Array<Sexp>] attrs array of s(:sym) or s(:str)
|
|
786
791
|
# @return [String] precompiled attr methods
|
|
787
792
|
def handle_attr_optimize(meth, attrs)
|
|
788
793
|
out = []
|
|
@@ -880,8 +885,19 @@ module Opal
|
|
|
880
885
|
result = dispatch
|
|
881
886
|
else
|
|
882
887
|
args = process arglist, :expr
|
|
883
|
-
|
|
884
|
-
|
|
888
|
+
|
|
889
|
+
dispatch = if tmprecv
|
|
890
|
+
[fragment("(#{tmprecv} = ", sexp), recv_code, fragment(")#{mid}", sexp)]
|
|
891
|
+
else
|
|
892
|
+
[recv_code, fragment(mid, sexp)]
|
|
893
|
+
end
|
|
894
|
+
|
|
895
|
+
result = if splat
|
|
896
|
+
[dispatch, fragment(".apply(", sexp), (tmprecv ? fragment(tmprecv, sexp) : recv_code),
|
|
897
|
+
fragment(", ", sexp), args, fragment(")", sexp)]
|
|
898
|
+
else
|
|
899
|
+
[dispatch, fragment("(", sexp), args, fragment(")", sexp)]
|
|
900
|
+
end
|
|
885
901
|
end
|
|
886
902
|
|
|
887
903
|
@scope.queue_temp tmpfunc if tmpfunc
|
|
@@ -941,7 +957,7 @@ module Opal
|
|
|
941
957
|
def process_splat(sexp, level)
|
|
942
958
|
if sexp.first == [:nil]
|
|
943
959
|
[fragment("[]", sexp)]
|
|
944
|
-
elsif sexp.first.first == :
|
|
960
|
+
elsif sexp.first.first == :sym
|
|
945
961
|
[fragment("[", sexp), process(sexp.first, :expr), fragment("]", sexp)]
|
|
946
962
|
else
|
|
947
963
|
process sexp.first, :recv
|
|
@@ -975,7 +991,7 @@ module Opal
|
|
|
975
991
|
indent do
|
|
976
992
|
in_scope(:class) do
|
|
977
993
|
@scope.name = name
|
|
978
|
-
@scope.add_temp "#{ @scope.proto } = #{name}.
|
|
994
|
+
@scope.add_temp "#{ @scope.proto } = #{name}._proto", "__scope = #{name}._scope"
|
|
979
995
|
|
|
980
996
|
if Array === body.last
|
|
981
997
|
# A single statement will need a block
|
|
@@ -1019,7 +1035,7 @@ module Opal
|
|
|
1019
1035
|
|
|
1020
1036
|
in_scope(:sclass) do
|
|
1021
1037
|
@scope.add_temp "__scope = #{current_self}._scope"
|
|
1022
|
-
@scope.add_temp "def = #{current_self}.
|
|
1038
|
+
@scope.add_temp "def = #{current_self}._proto"
|
|
1023
1039
|
|
|
1024
1040
|
body = process body, :stmt
|
|
1025
1041
|
code << @scope.to_vars << body
|
|
@@ -1055,7 +1071,7 @@ module Opal
|
|
|
1055
1071
|
indent do
|
|
1056
1072
|
in_scope(:module) do
|
|
1057
1073
|
@scope.name = name
|
|
1058
|
-
@scope.add_temp "#{ @scope.proto } = #{name}.
|
|
1074
|
+
@scope.add_temp "#{ @scope.proto } = #{name}._proto", "__scope = #{name}._scope"
|
|
1059
1075
|
body = process body, :stmt
|
|
1060
1076
|
|
|
1061
1077
|
code << fragment(@indent, sexp)
|
|
@@ -1193,7 +1209,7 @@ module Opal
|
|
|
1193
1209
|
|
|
1194
1210
|
if recvr
|
|
1195
1211
|
if smethod
|
|
1196
|
-
[fragment("
|
|
1212
|
+
[fragment("#{@scope.name}.constructor.prototype['$#{mid}'] = ", sexp), result]
|
|
1197
1213
|
else
|
|
1198
1214
|
[recv, fragment("#{jsid} = ", sexp), result]
|
|
1199
1215
|
end
|
|
@@ -1341,7 +1357,7 @@ module Opal
|
|
|
1341
1357
|
end
|
|
1342
1358
|
end
|
|
1343
1359
|
|
|
1344
|
-
if keys.all? { |k| [:
|
|
1360
|
+
if keys.all? { |k| [:sym, :str].include? k[0] }
|
|
1345
1361
|
hash_obj = {}
|
|
1346
1362
|
hash_keys = []
|
|
1347
1363
|
keys.size.times do |i|
|
|
@@ -1454,7 +1470,7 @@ module Opal
|
|
|
1454
1470
|
|
|
1455
1471
|
# alias foo bar
|
|
1456
1472
|
#
|
|
1457
|
-
# s(:alias, s(:
|
|
1473
|
+
# s(:alias, s(:sym, :foo), s(:sym, :bar))
|
|
1458
1474
|
def process_alias(exp, level)
|
|
1459
1475
|
new = mid_to_jsid exp[0][1].to_s
|
|
1460
1476
|
old = mid_to_jsid exp[1][1].to_s
|
|
@@ -1464,7 +1480,7 @@ module Opal
|
|
|
1464
1480
|
fragment("%s%s = %s%s" % [@scope.proto, new, @scope.proto, old], exp)
|
|
1465
1481
|
else
|
|
1466
1482
|
current = current_self
|
|
1467
|
-
fragment("%s.
|
|
1483
|
+
fragment("%s._proto%s = %s._proto%s" % [current, new, current, old], exp)
|
|
1468
1484
|
end
|
|
1469
1485
|
end
|
|
1470
1486
|
|
|
@@ -1494,9 +1510,10 @@ module Opal
|
|
|
1494
1510
|
code << fragment(", ", sexp) unless code.empty?
|
|
1495
1511
|
|
|
1496
1512
|
if l.first == :splat
|
|
1497
|
-
s = l[1]
|
|
1498
|
-
|
|
1499
|
-
|
|
1513
|
+
if s = l[1]
|
|
1514
|
+
s << s(:js_tmp, "__slice.call(#{tmp}, #{idx})")
|
|
1515
|
+
code << process(s, :expr)
|
|
1516
|
+
end
|
|
1500
1517
|
else
|
|
1501
1518
|
if idx >= len
|
|
1502
1519
|
l << s(:js_tmp, "(#{tmp}[#{idx}] == null ? nil : #{tmp}[#{idx}])")
|
|
@@ -2038,19 +2055,19 @@ module Opal
|
|
|
2038
2055
|
|
|
2039
2056
|
elsif @scope.type == :def
|
|
2040
2057
|
@scope.identify!
|
|
2041
|
-
cls_name = @scope.parent.name || "#{current_self}.
|
|
2058
|
+
cls_name = @scope.parent.name || "#{current_self}._klass._proto"
|
|
2042
2059
|
jsid = mid_to_jsid @scope.mid.to_s
|
|
2043
2060
|
|
|
2044
2061
|
if @scope.defs
|
|
2045
2062
|
[fragment(("%s._super%s.apply(this, " % [cls_name, jsid]), sexp), args, fragment(")", sexp)]
|
|
2046
2063
|
else
|
|
2047
|
-
[fragment("#{current_self}.
|
|
2064
|
+
[fragment("#{current_self}._klass._super._proto#{jsid}.apply(#{current_self}, ", sexp), args, fragment(")", sexp)]
|
|
2048
2065
|
end
|
|
2049
2066
|
|
|
2050
2067
|
elsif @scope.type == :iter
|
|
2051
2068
|
chain, defn, mid = @scope.get_super_chain
|
|
2052
2069
|
trys = chain.map { |c| "#{c}._sup" }.join ' || '
|
|
2053
|
-
[fragment("(#{trys} || #{current_self}.
|
|
2070
|
+
[fragment("(#{trys} || #{current_self}._klass._super._proto[#{mid}]).apply(#{current_self}, ", sexp), args, fragment(")", sexp)]
|
|
2054
2071
|
else
|
|
2055
2072
|
raise "Cannot call super() from outside a method block"
|
|
2056
2073
|
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require 'opal/parser'
|
|
2
|
+
|
|
3
|
+
module Opal
|
|
4
|
+
# A parser which collects all require() statments for dependency building
|
|
5
|
+
class RequireParser < Parser
|
|
6
|
+
def self.parse source, options = {}
|
|
7
|
+
self.new.parse source, options
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Holds an array of paths which this file 'requires'.
|
|
11
|
+
# @return Array<String>
|
|
12
|
+
attr_reader :requires
|
|
13
|
+
|
|
14
|
+
def parse source, options = {}
|
|
15
|
+
@requires = []
|
|
16
|
+
@dynamic_require_severity = (options[:dynamic_require_severity] || :error)
|
|
17
|
+
super source, options
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def process_call sexp, level
|
|
21
|
+
if sexp[1] == :require
|
|
22
|
+
return handle_require sexp[2][1]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
super sexp, level
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def handle_require(sexp)
|
|
29
|
+
str = handle_require_sexp sexp
|
|
30
|
+
@requires << str unless str.nil? if @requires
|
|
31
|
+
fragment("", sexp)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def handle_require_sexp(sexp)
|
|
35
|
+
type = sexp.shift
|
|
36
|
+
|
|
37
|
+
if type == :str
|
|
38
|
+
return sexp[0]
|
|
39
|
+
elsif type == :call
|
|
40
|
+
recv, meth, args = sexp
|
|
41
|
+
parts = args[1..-1].map { |s| handle_require_sexp s }
|
|
42
|
+
|
|
43
|
+
if recv == [:const, :File]
|
|
44
|
+
if meth == :expand_path
|
|
45
|
+
return handle_expand_path(*parts)
|
|
46
|
+
elsif meth == :join
|
|
47
|
+
return handle_expand_path parts.join("/")
|
|
48
|
+
elsif meth == :dirname
|
|
49
|
+
return handle_expand_path parts[0].split("/")[0...-1].join("/")
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
case @dynamic_require_severity
|
|
56
|
+
when :error
|
|
57
|
+
error "Cannot handle dynamic require"
|
|
58
|
+
when :warning
|
|
59
|
+
warning "Cannot handle dynamic require"
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def handle_expand_path(path, base = '')
|
|
64
|
+
"#{base}/#{path}".split("/").inject([]) do |p, part|
|
|
65
|
+
if part == ''
|
|
66
|
+
# we had '//', so ignore
|
|
67
|
+
elsif part == '..'
|
|
68
|
+
p.pop
|
|
69
|
+
else
|
|
70
|
+
p << part
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
p
|
|
74
|
+
end.join "/"
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
data/lib/opal/version.rb
CHANGED
data/opal.gemspec
CHANGED
|
@@ -21,5 +21,5 @@ Gem::Specification.new do |s|
|
|
|
21
21
|
s.add_development_dependency 'uglifier'
|
|
22
22
|
s.add_development_dependency 'rake'
|
|
23
23
|
s.add_development_dependency 'racc'
|
|
24
|
-
s.add_development_dependency 'opal-sprockets', '~> 0.1.
|
|
24
|
+
s.add_development_dependency 'opal-sprockets', '~> 0.1.1'
|
|
25
25
|
end
|
|
File without changes
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
1
3
|
describe "Array#to_json" do
|
|
2
4
|
it "returns a string of all array elements converted to json" do
|
|
3
5
|
[].to_json.should == "[]"
|
|
4
6
|
[1, 2, 3].to_json.should == "[1, 2, 3]"
|
|
5
7
|
[true, nil, false, "3", 42].to_json.should == '[true, null, false, "3", 42]'
|
|
6
8
|
end
|
|
7
|
-
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'erb'
|
|
2
|
+
|
|
3
|
+
require File.expand_path('../simple', __FILE__)
|
|
4
|
+
require File.expand_path('../quoted', __FILE__)
|
|
5
|
+
|
|
6
|
+
describe "ERB files" do
|
|
7
|
+
before :each do
|
|
8
|
+
@simple = Template['opal/erb/simple']
|
|
9
|
+
@quoted = Template['opal/erb/quoted']
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should be defined by their filename on Template namespace" do
|
|
13
|
+
@simple.should be_kind_of(ERB)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "calling the block with a context should render the block" do
|
|
17
|
+
@some_data = "hello"
|
|
18
|
+
@simple.render(self).should == "<div>hello</div>\n"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should accept quotes in strings" do
|
|
22
|
+
@name = "adam"
|
|
23
|
+
@quoted.render(self).should == "<div class=\"foo\">hello there adam</div>\n"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<div class="foo">hello <%= "there " + @name %></div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<div><%= @some_data %></div>
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
1
3
|
describe "JSON.parse" do
|
|
2
4
|
it "parses null into nil" do
|
|
3
5
|
JSON.parse("null").should be_nil
|
|
@@ -28,4 +30,4 @@ describe "JSON.parse" do
|
|
|
28
30
|
JSON.parse('{"a": "b"}').should == {"a" => "b"}
|
|
29
31
|
JSON.parse('{"a": null, "b": 10, "c": [true, false]}').should == {"a" => nil, "b" => 10, "c" => [true, false]}
|
|
30
32
|
end
|
|
31
|
-
end
|
|
33
|
+
end
|