opal 0.3.29 → 0.3.30
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/core/date.rb +34 -0
- data/core/hash.rb +98 -157
- data/core/json.rb +1 -2
- data/core/kernel.rb +157 -1
- data/core/load_order +2 -1
- data/core/proc.rb +3 -1
- data/core/string.rb +6 -7
- data/core/time.rb +4 -0
- data/lib/opal.rb +1 -0
- data/lib/opal/erb.rb +13 -0
- data/lib/opal/lexer.rb +9 -9
- data/lib/opal/parser.rb +22 -18
- data/lib/opal/scope.rb +1 -1
- data/lib/opal/version.rb +1 -1
- data/spec/core/date/new_spec.rb +8 -0
- data/spec/core/date/to_s_spec.rb +5 -0
- data/spec/core/date/today_spec.rb +5 -0
- data/spec/core/kernel/format_spec.rb +122 -0
- data/spec/core/kernel/method_spec.rb +31 -0
- data/spec/core/kernel/printf_spec.rb +9 -0
- data/spec/core/kernel/sprintf_spec.rb +5 -0
- data/spec/core/string/format_spec.rb +9 -0
- data/spec/grammar/begin_spec.rb +4 -0
- data/spec/grammar/call_spec.rb +22 -1
- data/spec/parser/erb_spec.rb +32 -0
- data/spec/parser/simple_spec.rb +4 -1
- data/spec/spec_helper.rb +4 -0
- metadata +23 -3
data/core/date.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
date_constructor = `Date`
|
2
|
+
|
3
|
+
class Date
|
4
|
+
def self.today
|
5
|
+
%x{
|
6
|
+
var date = #{new};
|
7
|
+
date._date = new date_constructor();
|
8
|
+
return date;
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(year, month, day)
|
13
|
+
`#{self}._date = new date_constructor(year, month - 1, day)`
|
14
|
+
end
|
15
|
+
|
16
|
+
def day
|
17
|
+
`#{self}._date.getDate()`
|
18
|
+
end
|
19
|
+
|
20
|
+
def month
|
21
|
+
`#{self}._date.getMonth() + 1`
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
%x{
|
26
|
+
var d = #{self}._date;
|
27
|
+
return '' + d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate();
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def year
|
32
|
+
`#{self}._date.getFullYear()`
|
33
|
+
end
|
34
|
+
end
|
data/core/hash.rb
CHANGED
@@ -28,9 +28,8 @@ class Hash
|
|
28
28
|
// strings as keys. The map and keys array can be constructed at
|
29
29
|
// compile time, so they are just added here by the constructor
|
30
30
|
// function
|
31
|
-
__hash2 = Opal.hash2 = function(
|
31
|
+
__hash2 = Opal.hash2 = function(map) {
|
32
32
|
var hash = new Hash;
|
33
|
-
hash.keys = keys;
|
34
33
|
hash.map = map;
|
35
34
|
return hash;
|
36
35
|
}
|
@@ -46,10 +45,9 @@ class Hash
|
|
46
45
|
|
47
46
|
def self.from_native(obj)
|
48
47
|
%x{
|
49
|
-
var hash = __hash(), map = hash.map
|
48
|
+
var hash = __hash(), map = hash.map;
|
50
49
|
|
51
50
|
for (var key in obj) {
|
52
|
-
keys.push(key);
|
53
51
|
map[key] = obj[key];
|
54
52
|
}
|
55
53
|
|
@@ -78,19 +76,15 @@ class Hash
|
|
78
76
|
return true;
|
79
77
|
}
|
80
78
|
|
81
|
-
if (
|
82
|
-
return false;
|
83
|
-
}
|
84
|
-
|
85
|
-
if (#{self}.keys.length !== other.keys.length) {
|
79
|
+
if (other.map == null) {
|
86
80
|
return false;
|
87
81
|
}
|
88
82
|
|
89
83
|
var map = #{self}.map,
|
90
84
|
map2 = other.map;
|
91
85
|
|
92
|
-
for (var
|
93
|
-
var
|
86
|
+
for (var key in map) {
|
87
|
+
var obj = map[key], obj2 = map2[key];
|
94
88
|
|
95
89
|
if (#{`obj` != `obj2`}) {
|
96
90
|
return false;
|
@@ -103,10 +97,10 @@ class Hash
|
|
103
97
|
|
104
98
|
def [](key)
|
105
99
|
%x{
|
106
|
-
var
|
100
|
+
var obj = #{self}.map[key];
|
107
101
|
|
108
|
-
if (
|
109
|
-
return
|
102
|
+
if (obj != null) {
|
103
|
+
return obj;
|
110
104
|
}
|
111
105
|
|
112
106
|
var proc = #{@proc};
|
@@ -121,27 +115,18 @@ class Hash
|
|
121
115
|
|
122
116
|
def []=(key, value)
|
123
117
|
%x{
|
124
|
-
|
125
|
-
|
126
|
-
if (!__hasOwn.call(map, key)) {
|
127
|
-
#{self}.keys.push(key);
|
128
|
-
}
|
129
|
-
|
130
|
-
map[key] = value;
|
131
|
-
|
118
|
+
#{self}.map[key] = value;
|
132
119
|
return value;
|
133
120
|
}
|
134
121
|
end
|
135
122
|
|
136
123
|
def assoc(object)
|
137
124
|
%x{
|
138
|
-
var
|
139
|
-
|
140
|
-
for (var i = 0, length = keys.length; i < length; i++) {
|
141
|
-
key = keys[i];
|
125
|
+
var map = #{self}.map;
|
142
126
|
|
127
|
+
for (var key in map) {
|
143
128
|
if (#{`key` == object}) {
|
144
|
-
return [key,
|
129
|
+
return [key, map[key]];
|
145
130
|
}
|
146
131
|
}
|
147
132
|
|
@@ -152,7 +137,6 @@ class Hash
|
|
152
137
|
def clear
|
153
138
|
%x{
|
154
139
|
#{self}.map = {};
|
155
|
-
#{self}.keys = [];
|
156
140
|
return #{self};
|
157
141
|
}
|
158
142
|
end
|
@@ -161,12 +145,10 @@ class Hash
|
|
161
145
|
%x{
|
162
146
|
var result = __hash(),
|
163
147
|
map = #{self}.map,
|
164
|
-
map2 = result.map
|
165
|
-
keys2 = result.keys;
|
148
|
+
map2 = result.map;
|
166
149
|
|
167
|
-
for (var
|
168
|
-
|
169
|
-
map2[#{self}.keys[i]] = map[#{self}.keys[i]];
|
150
|
+
for (var key in map) {
|
151
|
+
map2[key] = map[key];
|
170
152
|
}
|
171
153
|
|
172
154
|
return result;
|
@@ -191,12 +173,10 @@ class Hash
|
|
191
173
|
|
192
174
|
def delete(key)
|
193
175
|
%x{
|
194
|
-
var map
|
176
|
+
var map = #{self}.map, result = map[key];
|
195
177
|
|
196
178
|
if (result != null) {
|
197
179
|
delete map[key];
|
198
|
-
#{self}.keys.$delete(key);
|
199
|
-
|
200
180
|
return result;
|
201
181
|
}
|
202
182
|
|
@@ -206,21 +186,15 @@ class Hash
|
|
206
186
|
|
207
187
|
def delete_if(&block)
|
208
188
|
%x{
|
209
|
-
var map = #{self}.map,
|
210
|
-
|
211
|
-
for (var i = 0, length = keys.length; i < length; i++) {
|
212
|
-
var key = keys[i], obj = map[key];
|
189
|
+
var map = #{self}.map, value;
|
213
190
|
|
214
|
-
|
191
|
+
for (var key in map) {
|
192
|
+
if ((value = block.call(__context, key, map[key])) === __breaker) {
|
215
193
|
return __breaker.$v;
|
216
194
|
}
|
217
195
|
|
218
196
|
if (value !== false && value !== nil) {
|
219
|
-
|
220
|
-
delete map[key];
|
221
|
-
|
222
|
-
length--;
|
223
|
-
i--;
|
197
|
+
delete map[key]
|
224
198
|
}
|
225
199
|
}
|
226
200
|
|
@@ -232,11 +206,9 @@ class Hash
|
|
232
206
|
|
233
207
|
def each(&block)
|
234
208
|
%x{
|
235
|
-
var map = #{self}.map
|
236
|
-
|
237
|
-
for (var i = 0, length = keys.length; i < length; i++) {
|
238
|
-
var key = keys[i];
|
209
|
+
var map = #{self}.map;
|
239
210
|
|
211
|
+
for (var key in map) {
|
240
212
|
if (block.call(__context, key, map[key]) === __breaker) {
|
241
213
|
return __breaker.$v;
|
242
214
|
}
|
@@ -248,11 +220,9 @@ class Hash
|
|
248
220
|
|
249
221
|
def each_key(&block)
|
250
222
|
%x{
|
251
|
-
var
|
252
|
-
|
253
|
-
for (var i = 0, length = keys.length; i < length; i++) {
|
254
|
-
var key = keys[i];
|
223
|
+
var map = #{self}.map;
|
255
224
|
|
225
|
+
for (var key in map) {
|
256
226
|
if (block.call(__context, key) === __breaker) {
|
257
227
|
return __breaker.$v;
|
258
228
|
}
|
@@ -266,10 +236,10 @@ class Hash
|
|
266
236
|
|
267
237
|
def each_value(&block)
|
268
238
|
%x{
|
269
|
-
var map = #{self}.map
|
239
|
+
var map = #{self}.map;
|
270
240
|
|
271
|
-
for (var
|
272
|
-
if (block.call(__context, map[
|
241
|
+
for (var key in map) {
|
242
|
+
if (block.call(__context, map[key]) === __breaker) {
|
273
243
|
return __breaker.$v;
|
274
244
|
}
|
275
245
|
}
|
@@ -280,7 +250,11 @@ class Hash
|
|
280
250
|
|
281
251
|
def empty?
|
282
252
|
%x{
|
283
|
-
|
253
|
+
for (var key in #{self}.map) {
|
254
|
+
return false;
|
255
|
+
}
|
256
|
+
|
257
|
+
return true;
|
284
258
|
}
|
285
259
|
end
|
286
260
|
|
@@ -314,10 +288,10 @@ class Hash
|
|
314
288
|
|
315
289
|
def flatten(level=undefined)
|
316
290
|
%x{
|
317
|
-
var map = #{self}.map,
|
291
|
+
var map = #{self}.map, result = [];
|
318
292
|
|
319
|
-
for (var
|
320
|
-
var
|
293
|
+
for (var key in map) {
|
294
|
+
var value = map[key];
|
321
295
|
|
322
296
|
result.push(key);
|
323
297
|
|
@@ -344,8 +318,10 @@ class Hash
|
|
344
318
|
|
345
319
|
def has_value?(value)
|
346
320
|
%x{
|
347
|
-
|
348
|
-
|
321
|
+
var map = #{self}.map;
|
322
|
+
|
323
|
+
for (var key in map) {
|
324
|
+
if (#{`map[key]` == value}) {
|
349
325
|
return true;
|
350
326
|
}
|
351
327
|
}
|
@@ -362,11 +338,9 @@ class Hash
|
|
362
338
|
|
363
339
|
def index(object)
|
364
340
|
%x{
|
365
|
-
var map = #{self}.map
|
366
|
-
|
367
|
-
for (var i = 0, length = keys.length; i < length; i++) {
|
368
|
-
var key = keys[i];
|
341
|
+
var map = #{self}.map;
|
369
342
|
|
343
|
+
for (var key in map) {
|
370
344
|
if (#{object == `map[key]`}) {
|
371
345
|
return key;
|
372
346
|
}
|
@@ -381,13 +355,13 @@ class Hash
|
|
381
355
|
var result = [], map = #{self}.map, val;
|
382
356
|
|
383
357
|
for (var i = 0, length = keys.length; i < length; i++) {
|
384
|
-
|
358
|
+
val = map[keys[i]];
|
385
359
|
|
386
360
|
if (val != null) {
|
387
361
|
result.push(val);
|
388
362
|
}
|
389
363
|
else {
|
390
|
-
result.push(#{
|
364
|
+
result.push(#{@none});
|
391
365
|
}
|
392
366
|
}
|
393
367
|
|
@@ -399,10 +373,9 @@ class Hash
|
|
399
373
|
|
400
374
|
def inspect
|
401
375
|
%x{
|
402
|
-
var inspect = [],
|
376
|
+
var inspect = [], map = #{self}.map;
|
403
377
|
|
404
|
-
for (var
|
405
|
-
var key = keys[i];
|
378
|
+
for (var key in map) {
|
406
379
|
inspect.push(#{`key`.inspect} + '=>' + #{`map[key]`.inspect});
|
407
380
|
}
|
408
381
|
|
@@ -412,13 +385,10 @@ class Hash
|
|
412
385
|
|
413
386
|
def invert
|
414
387
|
%x{
|
415
|
-
var result = __hash(),
|
416
|
-
keys2 = result.keys, map2 = result.map;
|
388
|
+
var result = __hash(), map = #{self}.map, map2 = result.map;
|
417
389
|
|
418
|
-
for (var
|
419
|
-
var
|
420
|
-
|
421
|
-
keys2.push(obj);
|
390
|
+
for (var key in map) {
|
391
|
+
var obj = map[key];
|
422
392
|
map2[obj] = key;
|
423
393
|
}
|
424
394
|
|
@@ -428,21 +398,17 @@ class Hash
|
|
428
398
|
|
429
399
|
def keep_if(&block)
|
430
400
|
%x{
|
431
|
-
var map = #{self}.map,
|
401
|
+
var map = #{self}.map, value;
|
432
402
|
|
433
|
-
for (var
|
434
|
-
var
|
403
|
+
for (var key in map) {
|
404
|
+
var obj = map[key];
|
435
405
|
|
436
406
|
if ((value = block.call(__context, key, obj)) === __breaker) {
|
437
407
|
return __breaker.$v;
|
438
408
|
}
|
439
409
|
|
440
410
|
if (value === false || value === nil) {
|
441
|
-
keys.splice(i, 1);
|
442
411
|
delete map[key];
|
443
|
-
|
444
|
-
length--;
|
445
|
-
i--;
|
446
412
|
}
|
447
413
|
}
|
448
414
|
|
@@ -456,13 +422,25 @@ class Hash
|
|
456
422
|
|
457
423
|
def keys
|
458
424
|
%x{
|
459
|
-
|
425
|
+
var result = [], map = #{self}.map;
|
426
|
+
|
427
|
+
for (var key in map) {
|
428
|
+
result.push(key);
|
429
|
+
}
|
430
|
+
|
431
|
+
return result;
|
460
432
|
}
|
461
433
|
end
|
462
434
|
|
463
435
|
def length
|
464
436
|
%x{
|
465
|
-
|
437
|
+
var length = 0, map = #{self}.map;
|
438
|
+
|
439
|
+
for (var key in map) {
|
440
|
+
length++;
|
441
|
+
}
|
442
|
+
|
443
|
+
return length;
|
466
444
|
}
|
467
445
|
end
|
468
446
|
|
@@ -470,35 +448,22 @@ class Hash
|
|
470
448
|
|
471
449
|
def merge(other, &block)
|
472
450
|
%x{
|
473
|
-
var
|
474
|
-
result = __hash(), keys2 = result.keys, map2 = result.map;
|
475
|
-
|
476
|
-
for (var i = 0, length = keys.length; i < length; i++) {
|
477
|
-
var key = keys[i];
|
451
|
+
var map = #{self}.map, result = __hash(), map2 = result.map;
|
478
452
|
|
479
|
-
|
453
|
+
for (var key in map) {
|
480
454
|
map2[key] = map[key];
|
481
455
|
}
|
482
456
|
|
483
|
-
|
457
|
+
map = other.map;
|
484
458
|
|
485
459
|
if (block === nil) {
|
486
|
-
for (
|
487
|
-
var key = keys[i];
|
488
|
-
|
489
|
-
if (map2[key] == null) {
|
490
|
-
keys2.push(key);
|
491
|
-
}
|
492
|
-
|
460
|
+
for (key in map) {
|
493
461
|
map2[key] = map[key];
|
494
462
|
}
|
495
463
|
}
|
496
464
|
else {
|
497
|
-
for (
|
498
|
-
var key = keys[i];
|
499
|
-
|
465
|
+
for (key in map) {
|
500
466
|
if (map2[key] == null) {
|
501
|
-
keys2.push(key);
|
502
467
|
map2[key] = map[key];
|
503
468
|
}
|
504
469
|
else {
|
@@ -513,26 +478,16 @@ class Hash
|
|
513
478
|
|
514
479
|
def merge!(other, &block)
|
515
480
|
%x{
|
516
|
-
var
|
517
|
-
keys2 = other.keys, map2 = other.map;
|
481
|
+
var map = #{self}.map, map2 = other.map;
|
518
482
|
|
519
483
|
if (block === nil) {
|
520
|
-
for (var
|
521
|
-
var key = keys2[i];
|
522
|
-
|
523
|
-
if (map[key] == null) {
|
524
|
-
keys.push(key);
|
525
|
-
}
|
526
|
-
|
484
|
+
for (var key in map2) {
|
527
485
|
map[key] = map2[key];
|
528
486
|
}
|
529
487
|
}
|
530
488
|
else {
|
531
|
-
for (
|
532
|
-
var key = keys2[i];
|
533
|
-
|
489
|
+
for (key in map2) {
|
534
490
|
if (map[key] == null) {
|
535
|
-
keys.push(key);
|
536
491
|
map[key] = map2[key];
|
537
492
|
}
|
538
493
|
else {
|
@@ -547,10 +502,10 @@ class Hash
|
|
547
502
|
|
548
503
|
def rassoc(object)
|
549
504
|
%x{
|
550
|
-
var
|
505
|
+
var map = #{self}.map;
|
551
506
|
|
552
|
-
for (var
|
553
|
-
var
|
507
|
+
for (var key in map) {
|
508
|
+
var obj = map[key];
|
554
509
|
|
555
510
|
if (#{`obj` == object}) {
|
556
511
|
return [key, obj];
|
@@ -563,18 +518,16 @@ class Hash
|
|
563
518
|
|
564
519
|
def reject(&block)
|
565
520
|
%x{
|
566
|
-
var
|
567
|
-
result = __hash(), map2 = result.map, keys2 = result.keys;
|
521
|
+
var map = #{self}.map, result = __hash(), map2 = result.map;
|
568
522
|
|
569
|
-
for (var
|
570
|
-
var
|
523
|
+
for (var key in map) {
|
524
|
+
var obj = map[key], value;
|
571
525
|
|
572
526
|
if ((value = block.call(__context, key, obj)) === __breaker) {
|
573
527
|
return __breaker.$v;
|
574
528
|
}
|
575
529
|
|
576
530
|
if (value === false || value === nil) {
|
577
|
-
keys2.push(key);
|
578
531
|
map2[key] = obj;
|
579
532
|
}
|
580
533
|
}
|
@@ -585,12 +538,10 @@ class Hash
|
|
585
538
|
|
586
539
|
def replace(other)
|
587
540
|
%x{
|
588
|
-
var map = #{self}.map = {},
|
541
|
+
var map = #{self}.map = {}, map2 = other.map;
|
589
542
|
|
590
|
-
for (var
|
591
|
-
|
592
|
-
keys.push(key);
|
593
|
-
map[key] = other.map[key];
|
543
|
+
for (var key in map2) {
|
544
|
+
map[key] = map2[key];
|
594
545
|
}
|
595
546
|
|
596
547
|
return #{self};
|
@@ -599,18 +550,16 @@ class Hash
|
|
599
550
|
|
600
551
|
def select(&block)
|
601
552
|
%x{
|
602
|
-
var
|
603
|
-
result = __hash(), map2 = result.map, keys2 = result.keys;
|
553
|
+
var map = #{self}.map, result = __hash(), map2 = result.map;
|
604
554
|
|
605
|
-
for (var
|
606
|
-
var
|
555
|
+
for (var key in map) {
|
556
|
+
var obj = map[key], value;
|
607
557
|
|
608
558
|
if ((value = block.call(__context, key, obj)) === __breaker) {
|
609
559
|
return __breaker.$v;
|
610
560
|
}
|
611
561
|
|
612
562
|
if (value !== false && value !== nil) {
|
613
|
-
keys2.push(key);
|
614
563
|
map2[key] = obj;
|
615
564
|
}
|
616
565
|
}
|
@@ -621,21 +570,18 @@ class Hash
|
|
621
570
|
|
622
571
|
def select!(&block)
|
623
572
|
%x{
|
624
|
-
var map = #{self}.map,
|
573
|
+
var map = #{self}.map, value, result = nil;
|
625
574
|
|
626
|
-
for (var
|
627
|
-
var
|
575
|
+
for (var key in map) {
|
576
|
+
var obj = map[key];
|
628
577
|
|
629
578
|
if ((value = block.call(__context, key, obj)) === __breaker) {
|
630
579
|
return __breaker.$v;
|
631
580
|
}
|
632
581
|
|
633
582
|
if (value === false || value === nil) {
|
634
|
-
keys.splice(i, 1);
|
635
583
|
delete map[key];
|
636
584
|
|
637
|
-
length--;
|
638
|
-
i--;
|
639
585
|
result = #{self}
|
640
586
|
}
|
641
587
|
}
|
@@ -646,14 +592,11 @@ class Hash
|
|
646
592
|
|
647
593
|
def shift
|
648
594
|
%x{
|
649
|
-
var
|
650
|
-
|
651
|
-
if (keys.length) {
|
652
|
-
var key = keys[0], obj = map[key];
|
595
|
+
var map = #{self}.map;
|
653
596
|
|
597
|
+
for (var key in map) {
|
598
|
+
var obj = map[key];
|
654
599
|
delete map[key];
|
655
|
-
keys.splice(0, 1);
|
656
|
-
|
657
600
|
return [key, obj];
|
658
601
|
}
|
659
602
|
|
@@ -665,10 +608,9 @@ class Hash
|
|
665
608
|
|
666
609
|
def to_a
|
667
610
|
%x{
|
668
|
-
var
|
611
|
+
var map = #{self}.map, result = [];
|
669
612
|
|
670
|
-
for (var
|
671
|
-
var key = keys[i];
|
613
|
+
for (var key in map) {
|
672
614
|
result.push([key, map[key]]);
|
673
615
|
}
|
674
616
|
|
@@ -682,10 +624,9 @@ class Hash
|
|
682
624
|
|
683
625
|
def to_json
|
684
626
|
%x{
|
685
|
-
var inspect = [],
|
627
|
+
var inspect = [], map = #{self}.map;
|
686
628
|
|
687
|
-
for (var
|
688
|
-
var key = keys[i];
|
629
|
+
for (var key in map) {
|
689
630
|
inspect.push(#{`key`.to_json} + ': ' + #{`map[key]`.to_json});
|
690
631
|
}
|
691
632
|
|
@@ -695,10 +636,10 @@ class Hash
|
|
695
636
|
|
696
637
|
def to_native
|
697
638
|
%x{
|
698
|
-
var result = {},
|
639
|
+
var result = {}, map = #{self}.map;
|
699
640
|
|
700
|
-
for (var
|
701
|
-
var
|
641
|
+
for (var key in map) {
|
642
|
+
var obj = map[key];
|
702
643
|
|
703
644
|
if (obj.$to_native) {
|
704
645
|
result[key] = #{`obj`.to_native};
|