opal 1.2.0.beta1 → 1.2.0
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -1
- data/CHANGELOG.md +53 -0
- data/UNRELEASED.md +5 -1
- data/lib/opal/parser/patch.rb +10 -0
- data/lib/opal/rewriter.rb +2 -0
- data/lib/opal/rewriters/pattern_matching.rb +287 -0
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/constants.rb +2 -2
- data/opal/corelib/hash.rb +9 -0
- data/opal/corelib/pattern_matching.rb +159 -0
- data/opal/opal/full.rb +1 -0
- data/spec/filters/bugs/array.rb +0 -1
- data/spec/filters/bugs/hash.rb +1 -6
- data/spec/filters/bugs/language.rb +21 -76
- data/spec/filters/bugs/string.rb +1 -0
- data/spec/filters/bugs/struct.rb +0 -10
- data/spec/filters/unsupported/refinements.rb +3 -0
- data/spec/opal/core/language/pattern_matching_spec.rb +124 -0
- data/stdlib/promise/v1.rb +1 -0
- data/stdlib/promise/v2.rb +386 -0
- data/tasks/releasing.rake +1 -1
- data/tasks/testing.rake +0 -1
- data/test/opal/promisev2/test_always.rb +63 -0
- data/test/opal/promisev2/test_error.rb +16 -0
- data/test/opal/promisev2/test_rescue.rb +59 -0
- data/test/opal/promisev2/test_then.rb +90 -0
- data/test/opal/promisev2/test_trace.rb +52 -0
- data/test/opal/promisev2/test_value.rb +16 -0
- data/test/opal/promisev2/test_when.rb +35 -0
- metadata +24 -8
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'promise/v2'
|
3
|
+
|
4
|
+
class TestPromiseError < Test::Unit::TestCase
|
5
|
+
def test_rejects_the_promise_with_the_given_error
|
6
|
+
assert_equal(PromiseV2.error(23).error, 23)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_marks_the_promise_as_realized
|
10
|
+
assert_equal(PromiseV2.error(23).realized?, true)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_marks_the_promise_as_rejected
|
14
|
+
assert_equal(PromiseV2.error(23).rejected?, true)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'promise/v2'
|
3
|
+
|
4
|
+
class TestPromiseRescue < Test::Unit::TestCase
|
5
|
+
def test_calls_the_block_when_the_promise_has_already_been_rejected
|
6
|
+
x = 42
|
7
|
+
PromiseV2.error(23)
|
8
|
+
.rescue { |v| x = v }
|
9
|
+
.always { assert_equal(x, 23) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_calls_the_block_when_the_promise_is_rejected
|
13
|
+
a = PromiseV2.new
|
14
|
+
x = 42
|
15
|
+
|
16
|
+
pr = a.rescue { |v| x = v }
|
17
|
+
a.reject(23)
|
18
|
+
|
19
|
+
pr.always { assert_equal(x, 23) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_does_not_call_then_blocks_when_the_promise_is_rejected
|
23
|
+
x = 42
|
24
|
+
y = 23
|
25
|
+
|
26
|
+
PromiseV2.error(23).then { y = 42 }.rescue { |v| x = v }.always do
|
27
|
+
assert_equal(x, 23)
|
28
|
+
assert_equal(y, 23)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_does_not_call_subsequent_rescue_blocks
|
33
|
+
x = 42
|
34
|
+
PromiseV2.error(23).rescue { |v| x = v }.rescue { x = 42 }.always do
|
35
|
+
assert_equal(x, 23)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_can_be_called_multiple_times_on_the_same_promise
|
40
|
+
p = PromiseV2.error(2)
|
41
|
+
x = 1
|
42
|
+
|
43
|
+
ps = []
|
44
|
+
|
45
|
+
ps << p.then { x += 1 }.rescue{}
|
46
|
+
ps << p.rescue { x += 3 }
|
47
|
+
ps << p.rescue { x += 3 }
|
48
|
+
|
49
|
+
PromiseV2.when(ps).always { assert_equal(x, 7) }
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_raises_with_rescueB_if_a_promise_has_already_been_chained
|
53
|
+
p = PromiseV2.new
|
54
|
+
|
55
|
+
p.then! {}
|
56
|
+
|
57
|
+
assert_raise(ArgumentError) { p.rescue! {} }
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'promise/v2'
|
3
|
+
|
4
|
+
class TestPromiseThen < Test::Unit::TestCase
|
5
|
+
def test_calls_the_block_when_the_promise_has_already_been_resolved
|
6
|
+
x = 42
|
7
|
+
PromiseV2.value(23)
|
8
|
+
.then { |v| x = v }
|
9
|
+
.always { assert_equal(x, 23) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_calls_the_block_when_the_promise_is_resolved
|
13
|
+
a = PromiseV2.new
|
14
|
+
x = 42
|
15
|
+
|
16
|
+
p = a.then { |v| x = v }
|
17
|
+
a.resolve(23)
|
18
|
+
|
19
|
+
p.always { assert_equal(x, 23) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_works_with_multiple_chains
|
23
|
+
x = 42
|
24
|
+
PromiseV2.value(2)
|
25
|
+
.then { |v| v * 2 }
|
26
|
+
.then { |v| v * 4 }
|
27
|
+
.then { |v| x = v }
|
28
|
+
.always { assert_equal(x, 16) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_works_when_a_block_returns_a_promise
|
32
|
+
a = PromiseV2.new
|
33
|
+
b = PromiseV2.new
|
34
|
+
|
35
|
+
x = 42
|
36
|
+
p = a.then { b }.then { |v| x = v }
|
37
|
+
|
38
|
+
a.resolve(42)
|
39
|
+
b.resolve(23)
|
40
|
+
|
41
|
+
p.always { assert_equal(x, 23) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_sends_raised_exceptions_as_rejections
|
45
|
+
x = nil
|
46
|
+
|
47
|
+
PromiseV2.value(2)
|
48
|
+
.then { raise "hue" }
|
49
|
+
.rescue { |v| x = v }
|
50
|
+
.always { assert_equal(x.class, RuntimeError) }
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_sends_raised_exceptions_inside_rescue_blocks_as_next_errors
|
54
|
+
x = nil
|
55
|
+
|
56
|
+
PromiseV2.value(2)
|
57
|
+
.then { raise "hue" }
|
58
|
+
.rescue { raise "omg" }
|
59
|
+
.rescue { |v| x = v }
|
60
|
+
.always { assert_equal(x.class, RuntimeError) }
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_allows_then_to_be_called_multiple_times
|
64
|
+
pr = PromiseV2.value(2)
|
65
|
+
x = 1
|
66
|
+
|
67
|
+
ps = []
|
68
|
+
|
69
|
+
ps << pr.then { x += 1 }
|
70
|
+
ps << pr.then { x += 1 }
|
71
|
+
|
72
|
+
PromiseV2.when(ps).always { assert_equal(x, 3) }
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_raises_with_thenB_if_a_promise_has_already_been_chained
|
76
|
+
pr = PromiseV2.new
|
77
|
+
|
78
|
+
pr.then! {}
|
79
|
+
|
80
|
+
assert_raise(ArgumentError) { pr.then! {} }
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_should_pass_a_delayed_falsy_value
|
84
|
+
pr = PromiseV2.new.resolve(5).then { nil }
|
85
|
+
|
86
|
+
pr.always do |value|
|
87
|
+
assert_equal(value, nil)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'promise/v2'
|
3
|
+
|
4
|
+
class TestPromiseTrace < Test::Unit::TestCase
|
5
|
+
def test_calls_the_block_with_all_the_previous_results
|
6
|
+
x = 42
|
7
|
+
|
8
|
+
PromiseV2.value(1)
|
9
|
+
.then { 2 }
|
10
|
+
.then { 3 }
|
11
|
+
.trace {|a, b, c| x = a + b + c }
|
12
|
+
.always { assert_equal(x, 6) }
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_calls_the_then_after_the_trace
|
16
|
+
x = 42
|
17
|
+
|
18
|
+
PromiseV2.value(1)
|
19
|
+
.then { 2 }
|
20
|
+
.then { 3 }
|
21
|
+
.trace { |a, b, c| a + b + c }
|
22
|
+
.then { |v| x = v }
|
23
|
+
.always { assert_equal(x, 6) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_includes_the_first_value
|
27
|
+
x = 42
|
28
|
+
|
29
|
+
PromiseV2.value(1)
|
30
|
+
.trace { |a| x = a }
|
31
|
+
.always { assert_equal(x, 1) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_works_after_a_when
|
35
|
+
x = 42
|
36
|
+
|
37
|
+
PromiseV2.value(1).then {
|
38
|
+
PromiseV2.when PromiseV2.value(2), PromiseV2.value(3)
|
39
|
+
}.trace {|a, b|
|
40
|
+
#x = a + b[0] + b[1]
|
41
|
+
x = "#{a},#{b}"
|
42
|
+
}.always { assert_equal(x, "1,native") } # 6
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_raises_with_traceB_if_a_promise_has_already_been_chained
|
46
|
+
p = PromiseV2.new
|
47
|
+
|
48
|
+
p.then! {}
|
49
|
+
|
50
|
+
assert_raise(ArgumentError) { p.trace! {} }
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'promise/v2'
|
3
|
+
|
4
|
+
class TestPromiseValue < Test::Unit::TestCase
|
5
|
+
def test_resolves_the_promise_with_the_given_value
|
6
|
+
assert_equal(PromiseV2.value(23).value, 23)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_marks_the_promise_as_realized
|
10
|
+
assert_equal(PromiseV2.value(23).realized?, true)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_marks_the_promise_as_resolved
|
14
|
+
assert_equal(PromiseV2.value(23).resolved?, true)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'promise/v2'
|
3
|
+
|
4
|
+
class TestPromiseWhen < Test::Unit::TestCase
|
5
|
+
def test_calls_the_block_with_all_promises_results
|
6
|
+
a = PromiseV2.new
|
7
|
+
b = PromiseV2.new
|
8
|
+
|
9
|
+
x = 42
|
10
|
+
|
11
|
+
p = PromiseV2.when(a, b).then {|y, z|
|
12
|
+
x = y + z
|
13
|
+
}
|
14
|
+
|
15
|
+
a.resolve(1)
|
16
|
+
b.resolve(2)
|
17
|
+
|
18
|
+
p.always { assert_equal(x, 3) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_can_be_built_lazily
|
22
|
+
a = PromiseV2.new
|
23
|
+
b = PromiseV2.value(3)
|
24
|
+
|
25
|
+
x = 42
|
26
|
+
|
27
|
+
p = PromiseV2.when(a).and(b).then {|c, d|
|
28
|
+
x = c + d
|
29
|
+
}
|
30
|
+
|
31
|
+
a.resolve(2)
|
32
|
+
|
33
|
+
p.always { assert_equal(x, 5) }
|
34
|
+
end
|
35
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.0
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elia Schito
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-07-
|
13
|
+
date: 2021-07-28 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: ast
|
@@ -562,6 +562,7 @@ files:
|
|
562
562
|
- lib/opal/rewriters/mlhs_args.rb
|
563
563
|
- lib/opal/rewriters/numblocks.rb
|
564
564
|
- lib/opal/rewriters/opal_engine_check.rb
|
565
|
+
- lib/opal/rewriters/pattern_matching.rb
|
565
566
|
- lib/opal/rewriters/returnable_logic.rb
|
566
567
|
- lib/opal/rewriters/rubyspec/filters_rewriter.rb
|
567
568
|
- lib/opal/server.rb
|
@@ -606,6 +607,7 @@ files:
|
|
606
607
|
- opal/corelib/numeric.rb
|
607
608
|
- opal/corelib/object_space.rb
|
608
609
|
- opal/corelib/pack_unpack/format_string_parser.rb
|
610
|
+
- opal/corelib/pattern_matching.rb
|
609
611
|
- opal/corelib/proc.rb
|
610
612
|
- opal/corelib/process.rb
|
611
613
|
- opal/corelib/random.rb
|
@@ -814,6 +816,7 @@ files:
|
|
814
816
|
- spec/opal/core/language/keyword_arguments_spec.rb
|
815
817
|
- spec/opal/core/language/memoization_spec.rb
|
816
818
|
- spec/opal/core/language/numblocks_spec.rb
|
819
|
+
- spec/opal/core/language/pattern_matching_spec.rb
|
817
820
|
- spec/opal/core/language/safe_navigator_spec.rb
|
818
821
|
- spec/opal/core/language/while_spec.rb
|
819
822
|
- spec/opal/core/language_spec.rb
|
@@ -1011,6 +1014,8 @@ files:
|
|
1011
1014
|
- stdlib/pp.rb
|
1012
1015
|
- stdlib/prettyprint.rb
|
1013
1016
|
- stdlib/promise.rb
|
1017
|
+
- stdlib/promise/v1.rb
|
1018
|
+
- stdlib/promise/v2.rb
|
1014
1019
|
- stdlib/racc/parser.rb
|
1015
1020
|
- stdlib/rbconfig.rb
|
1016
1021
|
- stdlib/rbconfig/sizeof.rb
|
@@ -1047,6 +1052,13 @@ files:
|
|
1047
1052
|
- test/nodejs/test_string.rb
|
1048
1053
|
- test/opal/cat.png
|
1049
1054
|
- test/opal/http_server.rb
|
1055
|
+
- test/opal/promisev2/test_always.rb
|
1056
|
+
- test/opal/promisev2/test_error.rb
|
1057
|
+
- test/opal/promisev2/test_rescue.rb
|
1058
|
+
- test/opal/promisev2/test_then.rb
|
1059
|
+
- test/opal/promisev2/test_trace.rb
|
1060
|
+
- test/opal/promisev2/test_value.rb
|
1061
|
+
- test/opal/promisev2/test_when.rb
|
1050
1062
|
- test/opal/test_base64.rb
|
1051
1063
|
- test/opal/test_keyword.rb
|
1052
1064
|
- test/opal/test_matrix.rb
|
@@ -1073,10 +1085,10 @@ licenses:
|
|
1073
1085
|
metadata:
|
1074
1086
|
homepage_uri: https://opalrb.com/
|
1075
1087
|
bug_tracker_uri: https://github.com/opal/opal/issues
|
1076
|
-
changelog_uri: https://github.com/opal/opal/blob/v1.2.0
|
1077
|
-
readme_uri: https://github.com/opal/opal/blob/v1.2.0
|
1078
|
-
api_documentation_uri: http://opalrb.com/docs/api/v1.2.0
|
1079
|
-
guides_uri: http://opalrb.com/docs/guides/v1.2.0
|
1088
|
+
changelog_uri: https://github.com/opal/opal/blob/v1.2.0/CHANGELOG.md
|
1089
|
+
readme_uri: https://github.com/opal/opal/blob/v1.2.0/README.md
|
1090
|
+
api_documentation_uri: http://opalrb.com/docs/api/v1.2.0/index.html
|
1091
|
+
guides_uri: http://opalrb.com/docs/guides/v1.2.0/index.html
|
1080
1092
|
chat_uri: https://gitter.im/opal/opal
|
1081
1093
|
source_code_uri: https://github.com/opal/opal
|
1082
1094
|
post_install_message:
|
@@ -1090,9 +1102,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
1090
1102
|
version: '2.3'
|
1091
1103
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
1092
1104
|
requirements:
|
1093
|
-
- - "
|
1105
|
+
- - ">="
|
1094
1106
|
- !ruby/object:Gem::Version
|
1095
|
-
version:
|
1107
|
+
version: '0'
|
1096
1108
|
requirements: []
|
1097
1109
|
rubygems_version: 3.2.3
|
1098
1110
|
signing_key:
|
@@ -1426,6 +1438,7 @@ test_files:
|
|
1426
1438
|
- lib/opal/rewriters/mlhs_args.rb
|
1427
1439
|
- lib/opal/rewriters/numblocks.rb
|
1428
1440
|
- lib/opal/rewriters/opal_engine_check.rb
|
1441
|
+
- lib/opal/rewriters/pattern_matching.rb
|
1429
1442
|
- lib/opal/rewriters/returnable_logic.rb
|
1430
1443
|
- lib/opal/rewriters/rubyspec/filters_rewriter.rb
|
1431
1444
|
- lib/opal/server.rb
|
@@ -1470,6 +1483,7 @@ test_files:
|
|
1470
1483
|
- opal/corelib/numeric.rb
|
1471
1484
|
- opal/corelib/object_space.rb
|
1472
1485
|
- opal/corelib/pack_unpack/format_string_parser.rb
|
1486
|
+
- opal/corelib/pattern_matching.rb
|
1473
1487
|
- opal/corelib/proc.rb
|
1474
1488
|
- opal/corelib/process.rb
|
1475
1489
|
- opal/corelib/random.rb
|
@@ -1613,6 +1627,8 @@ test_files:
|
|
1613
1627
|
- stdlib/pp.rb
|
1614
1628
|
- stdlib/prettyprint.rb
|
1615
1629
|
- stdlib/promise.rb
|
1630
|
+
- stdlib/promise/v1.rb
|
1631
|
+
- stdlib/promise/v2.rb
|
1616
1632
|
- stdlib/racc/parser.rb
|
1617
1633
|
- stdlib/rbconfig.rb
|
1618
1634
|
- stdlib/rbconfig/sizeof.rb
|