rapydscript-ns 0.8.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.
- package/.agignore +1 -0
- package/.gitattributes +4 -0
- package/.github/workflows/ci.yml +38 -0
- package/.github/workflows/web-repl-page-deploy.yml +42 -0
- package/=template.pyj +5 -0
- package/CHANGELOG.md +456 -0
- package/CONTRIBUTORS +13 -0
- package/HACKING.md +103 -0
- package/LICENSE +24 -0
- package/README.md +2512 -0
- package/TODO.md +327 -0
- package/add-toc-to-readme +2 -0
- package/bin/export +75 -0
- package/bin/rapydscript +70 -0
- package/bin/web-repl-export +102 -0
- package/build +3 -0
- package/package.json +46 -0
- package/publish.py +37 -0
- package/release/baselib-plain-pretty.js +4370 -0
- package/release/baselib-plain-ugly.js +3 -0
- package/release/compiler.js +18394 -0
- package/release/signatures.json +31 -0
- package/session.vim +4 -0
- package/setup.cfg +2 -0
- package/src/ast.pyj +1356 -0
- package/src/baselib-builtins.pyj +279 -0
- package/src/baselib-containers.pyj +723 -0
- package/src/baselib-errors.pyj +37 -0
- package/src/baselib-internal.pyj +421 -0
- package/src/baselib-itertools.pyj +97 -0
- package/src/baselib-str.pyj +798 -0
- package/src/compiler.pyj +36 -0
- package/src/errors.pyj +30 -0
- package/src/lib/aes.pyj +646 -0
- package/src/lib/collections.pyj +695 -0
- package/src/lib/elementmaker.pyj +83 -0
- package/src/lib/encodings.pyj +126 -0
- package/src/lib/functools.pyj +148 -0
- package/src/lib/gettext.pyj +569 -0
- package/src/lib/itertools.pyj +580 -0
- package/src/lib/math.pyj +193 -0
- package/src/lib/numpy.pyj +2101 -0
- package/src/lib/operator.pyj +11 -0
- package/src/lib/pythonize.pyj +20 -0
- package/src/lib/random.pyj +118 -0
- package/src/lib/re.pyj +470 -0
- package/src/lib/traceback.pyj +63 -0
- package/src/lib/uuid.pyj +77 -0
- package/src/monaco-language-service/analyzer.js +526 -0
- package/src/monaco-language-service/builtins.js +543 -0
- package/src/monaco-language-service/completions.js +498 -0
- package/src/monaco-language-service/diagnostics.js +643 -0
- package/src/monaco-language-service/dts.js +550 -0
- package/src/monaco-language-service/hover.js +121 -0
- package/src/monaco-language-service/index.js +386 -0
- package/src/monaco-language-service/scope.js +162 -0
- package/src/monaco-language-service/signature.js +144 -0
- package/src/output/__init__.pyj +0 -0
- package/src/output/classes.pyj +296 -0
- package/src/output/codegen.pyj +492 -0
- package/src/output/comments.pyj +45 -0
- package/src/output/exceptions.pyj +105 -0
- package/src/output/functions.pyj +491 -0
- package/src/output/literals.pyj +109 -0
- package/src/output/loops.pyj +444 -0
- package/src/output/modules.pyj +329 -0
- package/src/output/operators.pyj +429 -0
- package/src/output/statements.pyj +463 -0
- package/src/output/stream.pyj +309 -0
- package/src/output/treeshake.pyj +182 -0
- package/src/output/utils.pyj +72 -0
- package/src/parse.pyj +3106 -0
- package/src/string_interpolation.pyj +72 -0
- package/src/tokenizer.pyj +702 -0
- package/src/unicode_aliases.pyj +576 -0
- package/src/utils.pyj +192 -0
- package/test/_import_one.pyj +37 -0
- package/test/_import_two/__init__.pyj +11 -0
- package/test/_import_two/level2/__init__.pyj +0 -0
- package/test/_import_two/level2/deep.pyj +4 -0
- package/test/_import_two/other.pyj +6 -0
- package/test/_import_two/sub.pyj +13 -0
- package/test/aes_vectors.pyj +421 -0
- package/test/annotations.pyj +80 -0
- package/test/baselib.pyj +319 -0
- package/test/classes.pyj +452 -0
- package/test/collections.pyj +152 -0
- package/test/decorators.pyj +77 -0
- package/test/dict_spread.pyj +76 -0
- package/test/docstrings.pyj +39 -0
- package/test/elementmaker_test.pyj +45 -0
- package/test/ellipsis.pyj +49 -0
- package/test/functions.pyj +151 -0
- package/test/generators.pyj +41 -0
- package/test/generic.pyj +370 -0
- package/test/imports.pyj +72 -0
- package/test/internationalization.pyj +73 -0
- package/test/lint.pyj +164 -0
- package/test/loops.pyj +85 -0
- package/test/numpy.pyj +734 -0
- package/test/omit_function_metadata.pyj +20 -0
- package/test/regexp.pyj +55 -0
- package/test/repl.pyj +121 -0
- package/test/scoped_flags.pyj +76 -0
- package/test/starargs.pyj +506 -0
- package/test/starred_assign.pyj +104 -0
- package/test/str.pyj +198 -0
- package/test/subscript_tuple.pyj +53 -0
- package/test/unit/fixtures/fibonacci_expected.js +46 -0
- package/test/unit/index.js +2989 -0
- package/test/unit/language-service-builtins.js +815 -0
- package/test/unit/language-service-completions.js +1067 -0
- package/test/unit/language-service-dts.js +543 -0
- package/test/unit/language-service-hover.js +455 -0
- package/test/unit/language-service-scope.js +833 -0
- package/test/unit/language-service-signature.js +458 -0
- package/test/unit/language-service.js +705 -0
- package/test/unit/run-language-service.js +41 -0
- package/test/unit/web-repl.js +484 -0
- package/tools/build-language-service.js +190 -0
- package/tools/cli.js +547 -0
- package/tools/compile.js +219 -0
- package/tools/compiler.js +108 -0
- package/tools/completer.js +131 -0
- package/tools/embedded_compiler.js +251 -0
- package/tools/export.js +316 -0
- package/tools/gettext.js +185 -0
- package/tools/ini.js +65 -0
- package/tools/lint.js +705 -0
- package/tools/msgfmt.js +187 -0
- package/tools/repl.js +223 -0
- package/tools/self.js +162 -0
- package/tools/test.js +118 -0
- package/tools/utils.js +128 -0
- package/tools/web_repl.js +95 -0
- package/try +41 -0
- package/web-repl/env.js +74 -0
- package/web-repl/index.html +163 -0
- package/web-repl/language-service.js +4084 -0
- package/web-repl/main.js +254 -0
- package/web-repl/prism.css +139 -0
- package/web-repl/prism.js +113 -0
- package/web-repl/rapydscript.js +435 -0
- package/web-repl/sha1.js +25 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# vim:fileencoding=utf-8
|
|
2
|
+
# Tests for dict merge literal {**d1, **d2}
|
|
3
|
+
|
|
4
|
+
# Basic merge of two JS-object dicts
|
|
5
|
+
d1 = {'a': 1, 'b': 2}
|
|
6
|
+
d2 = {'c': 3, 'd': 4}
|
|
7
|
+
merged = {**d1, **d2}
|
|
8
|
+
assrt.equal(merged['a'], 1)
|
|
9
|
+
assrt.equal(merged['b'], 2)
|
|
10
|
+
assrt.equal(merged['c'], 3)
|
|
11
|
+
assrt.equal(merged['d'], 4)
|
|
12
|
+
|
|
13
|
+
# Later key wins (rightmost takes priority)
|
|
14
|
+
da = {'x': 1}
|
|
15
|
+
db = {'x': 99, 'y': 2}
|
|
16
|
+
r = {**da, **db}
|
|
17
|
+
assrt.equal(r['x'], 99)
|
|
18
|
+
assrt.equal(r['y'], 2)
|
|
19
|
+
|
|
20
|
+
# Mix of spread and literal key-value pairs
|
|
21
|
+
base = {'a': 10, 'b': 20}
|
|
22
|
+
result = {**base, 'c': 30}
|
|
23
|
+
assrt.equal(result['a'], 10)
|
|
24
|
+
assrt.equal(result['b'], 20)
|
|
25
|
+
assrt.equal(result['c'], 30)
|
|
26
|
+
|
|
27
|
+
# Literal key before spread (spread overrides)
|
|
28
|
+
result2 = {'a': 0, **base}
|
|
29
|
+
assrt.equal(result2['a'], 10)
|
|
30
|
+
|
|
31
|
+
# Multiple spreads with interleaved key-value pairs
|
|
32
|
+
x = {'x': 1}
|
|
33
|
+
y = {'y': 2}
|
|
34
|
+
z = {'z': 3}
|
|
35
|
+
combined = {**x, 'mid': 99, **y, **z}
|
|
36
|
+
assrt.equal(combined['x'], 1)
|
|
37
|
+
assrt.equal(combined['mid'], 99)
|
|
38
|
+
assrt.equal(combined['y'], 2)
|
|
39
|
+
assrt.equal(combined['z'], 3)
|
|
40
|
+
|
|
41
|
+
# Single spread only
|
|
42
|
+
src = {'p': 7, 'q': 8}
|
|
43
|
+
copy = {**src}
|
|
44
|
+
assrt.equal(copy['p'], 7)
|
|
45
|
+
assrt.equal(copy['q'], 8)
|
|
46
|
+
|
|
47
|
+
# Empty dict spread
|
|
48
|
+
empty = {}
|
|
49
|
+
r2 = {**empty, 'k': 42}
|
|
50
|
+
assrt.equal(r2['k'], 42)
|
|
51
|
+
|
|
52
|
+
# Trailing comma allowed
|
|
53
|
+
tc = {**d1,}
|
|
54
|
+
assrt.equal(tc['a'], 1)
|
|
55
|
+
|
|
56
|
+
# Python dict literals with dict_literals scoped flag
|
|
57
|
+
def test_pydict_spread():
|
|
58
|
+
from __python__ import dict_literals, overload_getitem
|
|
59
|
+
pd1 = {'alpha': 1, 'beta': 2}
|
|
60
|
+
pd2 = {'gamma': 3}
|
|
61
|
+
merged_py = {**pd1, **pd2}
|
|
62
|
+
assrt.ok(isinstance(merged_py, dict))
|
|
63
|
+
assrt.equal(merged_py['alpha'], 1)
|
|
64
|
+
assrt.equal(merged_py['beta'], 2)
|
|
65
|
+
assrt.equal(merged_py['gamma'], 3)
|
|
66
|
+
# Key override in pydict
|
|
67
|
+
pd3 = {'alpha': 999}
|
|
68
|
+
overridden = {**pd1, **pd3}
|
|
69
|
+
assrt.equal(overridden['alpha'], 999)
|
|
70
|
+
assrt.equal(overridden['beta'], 2)
|
|
71
|
+
# Mix spread and literal
|
|
72
|
+
mixed = {**pd1, 'delta': 4}
|
|
73
|
+
assrt.equal(mixed['alpha'], 1)
|
|
74
|
+
assrt.equal(mixed['delta'], 4)
|
|
75
|
+
|
|
76
|
+
test_pydict_spread()
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# vim:fileencoding=utf-8
|
|
2
|
+
# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
|
3
|
+
# globals: ρσ_module_doc__
|
|
4
|
+
|
|
5
|
+
import _import_one
|
|
6
|
+
|
|
7
|
+
def f():
|
|
8
|
+
" A basic docstring "
|
|
9
|
+
pass
|
|
10
|
+
|
|
11
|
+
assrt.equal(f.__doc__, 'A basic docstring')
|
|
12
|
+
assrt.equal(_import_one.__doc__, 'Module level ds1\n\nModule level ds2\nline2\n\nModule level ds 3')
|
|
13
|
+
|
|
14
|
+
def g():
|
|
15
|
+
'''
|
|
16
|
+
A more complex docstring:
|
|
17
|
+
xxx
|
|
18
|
+
yyyy
|
|
19
|
+
|
|
20
|
+
the end
|
|
21
|
+
'''
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
assrt.equal(g.__doc__, 'A more complex docstring:\n xxx\n yyyy\n\nthe end')
|
|
25
|
+
|
|
26
|
+
class D:
|
|
27
|
+
' Docstring for a class '
|
|
28
|
+
|
|
29
|
+
def method(self):
|
|
30
|
+
'ds for a method'
|
|
31
|
+
pass
|
|
32
|
+
|
|
33
|
+
assrt.equal(D().__doc__, 'Docstring for a class')
|
|
34
|
+
assrt.equal(D().method.__doc__, 'ds for a method')
|
|
35
|
+
|
|
36
|
+
x = def():
|
|
37
|
+
'xxx'
|
|
38
|
+
|
|
39
|
+
assrt.equal(x.__doc__, 'xxx')
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# vim:fileencoding=utf-8
|
|
2
|
+
# License: BSD Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
|
|
3
|
+
# globals: assrt
|
|
4
|
+
|
|
5
|
+
from elementmaker import E
|
|
6
|
+
|
|
7
|
+
eq = assrt.equal
|
|
8
|
+
|
|
9
|
+
def dummy_elem_eq(a, b):
|
|
10
|
+
eq(jstype(a), jstype(b))
|
|
11
|
+
if (jstype(a) == 'string'):
|
|
12
|
+
eq(a, b)
|
|
13
|
+
return
|
|
14
|
+
eq(a.attributes.length, b.attributes.length)
|
|
15
|
+
eq(a.children.length, b.children.length)
|
|
16
|
+
eq(a.name, b.name)
|
|
17
|
+
for attr in a.attributes:
|
|
18
|
+
eq(a[attr], b[attr])
|
|
19
|
+
for i, child in enumerate(a.children):
|
|
20
|
+
dummy_elem_eq(child, b.children[i])
|
|
21
|
+
|
|
22
|
+
q = E.div('text', id='1', class_='c', data_x='x')
|
|
23
|
+
dummy_elem_eq(q, {'name':'div', 'children':['text'], 'attributes':{'id':'1', 'class':'c', 'data-x': 'x'}})
|
|
24
|
+
|
|
25
|
+
q = E.div(
|
|
26
|
+
E.span('a'),
|
|
27
|
+
E.span('b'),
|
|
28
|
+
E.a(),
|
|
29
|
+
id='1',
|
|
30
|
+
boolean_attr=True,
|
|
31
|
+
)
|
|
32
|
+
dummy_elem_eq(q, {'name':'div', 'children':[
|
|
33
|
+
{
|
|
34
|
+
'name':'span',
|
|
35
|
+
'children':['a'], 'attributes': {}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
'name':'span',
|
|
39
|
+
'children':['b'], 'attributes': {}
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
'name':'a',
|
|
43
|
+
'children':[], 'attributes': {}
|
|
44
|
+
},
|
|
45
|
+
], 'attributes':{'id':'1', 'boolean-attr':'boolean-attr'}})
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# globals: assrt
|
|
2
|
+
|
|
3
|
+
# Ellipsis is a singleton — two uses of ... reference the same object
|
|
4
|
+
assrt.ok(... is ..., "... is ...")
|
|
5
|
+
assrt.ok(... is Ellipsis, "... is Ellipsis")
|
|
6
|
+
assrt.ok(Ellipsis is ..., "Ellipsis is ...")
|
|
7
|
+
|
|
8
|
+
# Ellipsis is not null/undefined/false
|
|
9
|
+
assrt.ok(... is not None, "... is not None")
|
|
10
|
+
assrt.ok(... is not undefined, "... is not undefined")
|
|
11
|
+
assrt.ok(... is not False, "... is not False")
|
|
12
|
+
|
|
13
|
+
# str(...) should return 'Ellipsis'
|
|
14
|
+
assrt.equal(str(...), 'Ellipsis', "str(...) == 'Ellipsis'")
|
|
15
|
+
assrt.equal(str(Ellipsis), 'Ellipsis', "str(Ellipsis) == 'Ellipsis'")
|
|
16
|
+
|
|
17
|
+
# Assignment and re-use
|
|
18
|
+
e = ...
|
|
19
|
+
assrt.ok(e is ..., "assigned ... is ...")
|
|
20
|
+
assrt.ok(e is Ellipsis, "assigned ... is Ellipsis")
|
|
21
|
+
|
|
22
|
+
# Ellipsis in a list
|
|
23
|
+
lst = [1, ..., 3]
|
|
24
|
+
assrt.ok(lst[1] is ..., "Ellipsis in list")
|
|
25
|
+
|
|
26
|
+
# Ellipsis as function argument
|
|
27
|
+
def identity(x):
|
|
28
|
+
return x
|
|
29
|
+
|
|
30
|
+
assrt.ok(identity(...) is ..., "passing ... to function")
|
|
31
|
+
|
|
32
|
+
# Ellipsis as return value
|
|
33
|
+
def get_ellipsis():
|
|
34
|
+
return ...
|
|
35
|
+
|
|
36
|
+
assrt.ok(get_ellipsis() is ..., "returning ...")
|
|
37
|
+
|
|
38
|
+
# Ellipsis as function body placeholder (like pass)
|
|
39
|
+
def placeholder():
|
|
40
|
+
...
|
|
41
|
+
|
|
42
|
+
placeholder() # should not raise
|
|
43
|
+
|
|
44
|
+
# Ellipsis used as dict value
|
|
45
|
+
d = {'key': ...}
|
|
46
|
+
assrt.ok(d['key'] is ..., "Ellipsis as dict value")
|
|
47
|
+
|
|
48
|
+
# Ellipsis truthiness (should be truthy, like in Python)
|
|
49
|
+
assrt.ok(..., "... is truthy")
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# globals: assrt
|
|
2
|
+
|
|
3
|
+
def nothing():
|
|
4
|
+
pass
|
|
5
|
+
assrt.equal(nothing(), undefined)
|
|
6
|
+
|
|
7
|
+
add = def(a, b):
|
|
8
|
+
return a+b
|
|
9
|
+
def sub(a, b):
|
|
10
|
+
return a-b
|
|
11
|
+
|
|
12
|
+
mul = None
|
|
13
|
+
(def():
|
|
14
|
+
nonlocal mul
|
|
15
|
+
mul = def(a, b):
|
|
16
|
+
return a*b
|
|
17
|
+
|
|
18
|
+
div = def(a, b): # noqa:unused-local
|
|
19
|
+
return a/b
|
|
20
|
+
)()
|
|
21
|
+
|
|
22
|
+
assrt.equal(add(1,2), 3)
|
|
23
|
+
assrt.equal(sub(1,2), -1)
|
|
24
|
+
assrt.equal(mul(2,2), 4)
|
|
25
|
+
# for some reason input to throws must be of type block, hence the 'def' wrapper
|
|
26
|
+
assrt.throws(
|
|
27
|
+
def():
|
|
28
|
+
div(6,3) # noqa: undef
|
|
29
|
+
,
|
|
30
|
+
/div is not defined/
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
arr = [8,4]
|
|
34
|
+
assrt.equal(add(*arr), 12)
|
|
35
|
+
assrt.ok(Array.isArray(arr))
|
|
36
|
+
|
|
37
|
+
def sum(*args):
|
|
38
|
+
ttl = 0
|
|
39
|
+
for i in args:
|
|
40
|
+
ttl += i
|
|
41
|
+
return ttl
|
|
42
|
+
assrt.equal(sum(1,2,3), 6)
|
|
43
|
+
assrt.equal(sum(1,*[2,3]), 6)
|
|
44
|
+
|
|
45
|
+
num = 4
|
|
46
|
+
def():
|
|
47
|
+
nonlocal num
|
|
48
|
+
num = 5
|
|
49
|
+
.call(this)
|
|
50
|
+
|
|
51
|
+
assrt.equal(num, 5)
|
|
52
|
+
|
|
53
|
+
x = "foo"
|
|
54
|
+
y = 5
|
|
55
|
+
def swap(x, y):
|
|
56
|
+
return y, x
|
|
57
|
+
x, y = swap(x, y)
|
|
58
|
+
assrt.equal(x, 5)
|
|
59
|
+
assrt.equal(y, "foo")
|
|
60
|
+
|
|
61
|
+
count = 0
|
|
62
|
+
f, r = (def():
|
|
63
|
+
def fake_increment():
|
|
64
|
+
count += 1
|
|
65
|
+
def real_increment():
|
|
66
|
+
nonlocal count
|
|
67
|
+
count += 1
|
|
68
|
+
return fake_increment, real_increment
|
|
69
|
+
).call(this)
|
|
70
|
+
|
|
71
|
+
f()
|
|
72
|
+
assrt.equal(count, 0)
|
|
73
|
+
r()
|
|
74
|
+
assrt.equal(count, 1)
|
|
75
|
+
|
|
76
|
+
st = "this is a string"
|
|
77
|
+
assrt.equal(jstype(st), v"typeof st")
|
|
78
|
+
|
|
79
|
+
# testing inlined functions
|
|
80
|
+
inlined = [
|
|
81
|
+
def(x): return x+1;, def(x): return x+2;,
|
|
82
|
+
def(x): return x+3
|
|
83
|
+
,
|
|
84
|
+
def(x): return x+4
|
|
85
|
+
]
|
|
86
|
+
assrt.equal(inlined[0](1), 2)
|
|
87
|
+
assrt.equal(inlined[1](1), 3)
|
|
88
|
+
assrt.equal(inlined[2](1), 4)
|
|
89
|
+
assrt.equal(inlined[3](1), 5)
|
|
90
|
+
|
|
91
|
+
# decorators
|
|
92
|
+
def makebold(fn):
|
|
93
|
+
def wrapped(arg):
|
|
94
|
+
return "<b>" + fn(arg) + "</b>"
|
|
95
|
+
return wrapped
|
|
96
|
+
|
|
97
|
+
def makeitalic(fn):
|
|
98
|
+
def wrapped(arg):
|
|
99
|
+
return "<i>" + fn(arg) + "</i>"
|
|
100
|
+
return wrapped
|
|
101
|
+
|
|
102
|
+
@makebold
|
|
103
|
+
@makeitalic
|
|
104
|
+
def hello(something):
|
|
105
|
+
return "hello " + something
|
|
106
|
+
|
|
107
|
+
assrt.equal(hello("world"), "<b><i>hello world</i></b>")
|
|
108
|
+
assrt.equal(hello.__module__, '__main__')
|
|
109
|
+
assrt.equal(hello.__argnames__.length, 1)
|
|
110
|
+
assrt.equal(hello.__argnames__[0], 'arg')
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def simple_wrapper(f):
|
|
114
|
+
f.test_attr = 'test'
|
|
115
|
+
return f
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@simple_wrapper
|
|
119
|
+
def fw(x):
|
|
120
|
+
pass
|
|
121
|
+
|
|
122
|
+
assrt.equal(fw.__module__, '__main__')
|
|
123
|
+
assrt.equal(fw.__argnames__.length, 1)
|
|
124
|
+
assrt.equal(fw.__argnames__[0], 'x')
|
|
125
|
+
# just because something is a reserved keyword in RapydScript, doesn't mean other libraries won't attempt to use it
|
|
126
|
+
# let's make sure we parse that correctly
|
|
127
|
+
five = {}
|
|
128
|
+
v"five.is = function(n) { return 5 == n };"
|
|
129
|
+
assrt.ok(five.is(5))
|
|
130
|
+
|
|
131
|
+
# function assignment via conditional
|
|
132
|
+
foo = (def(): return 5;) if 0 else (def(): return 6;)
|
|
133
|
+
bar = (def(): return 5;) if 0 < 1 else (def(): return 6;)
|
|
134
|
+
baz = (def():
|
|
135
|
+
return 5
|
|
136
|
+
) if 1 else (def():
|
|
137
|
+
return 6
|
|
138
|
+
)
|
|
139
|
+
assrt.equal(foo(), 6)
|
|
140
|
+
assrt.equal(bar(), 5)
|
|
141
|
+
assrt.equal(baz(), 5)
|
|
142
|
+
|
|
143
|
+
def trailing_comma(a, b,):
|
|
144
|
+
return a + b
|
|
145
|
+
assrt.equal(trailing_comma(1, 2), 3)
|
|
146
|
+
assrt.equal(trailing_comma(1, 2,), 3)
|
|
147
|
+
|
|
148
|
+
def return_string_with_newline():
|
|
149
|
+
return '''a
|
|
150
|
+
b'''
|
|
151
|
+
assrt.equal(return_string_with_newline(), 'a\nb')
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# vim:fileencoding=utf-8
|
|
2
|
+
# License: BSD
|
|
3
|
+
# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>
|
|
4
|
+
|
|
5
|
+
def g1():
|
|
6
|
+
yield 1
|
|
7
|
+
yield 2
|
|
8
|
+
|
|
9
|
+
def g2():
|
|
10
|
+
for i in range(2):
|
|
11
|
+
yield from g1()
|
|
12
|
+
|
|
13
|
+
def g3():
|
|
14
|
+
data = yield 1
|
|
15
|
+
yield data
|
|
16
|
+
|
|
17
|
+
class A:
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
self.items = [1, 2, 3]
|
|
21
|
+
|
|
22
|
+
def __iter__(self):
|
|
23
|
+
for x in self.items:
|
|
24
|
+
yield x
|
|
25
|
+
|
|
26
|
+
assrt.deepEqual([x for x in g1()], [1, 2])
|
|
27
|
+
assrt.deepEqual([x for x in g2()], [1, 2, 1, 2])
|
|
28
|
+
assrt.deepEqual([x for x in A()], [1, 2, 3])
|
|
29
|
+
|
|
30
|
+
g = g3()
|
|
31
|
+
assrt.equal(g.next().value, 1)
|
|
32
|
+
assrt.equal(g.next('a').value, 'a')
|
|
33
|
+
|
|
34
|
+
a = (x for x in range(3))
|
|
35
|
+
assrt.deepEqual(list(a), [0, 1, 2])
|
|
36
|
+
a = ([x, x**2] for x in range(3))
|
|
37
|
+
assrt.deepEqual(list(a), [[0, 0], [1, 1], [2, 4]])
|
|
38
|
+
assrt.deepEqual(list(x for x in range(3)), [0, 1, 2])
|
|
39
|
+
def t(a, b):
|
|
40
|
+
assrt.deepEqual(list(a), list(b))
|
|
41
|
+
t((x for x in range(1)), (y for y in range(1)))
|