rapydscript-ns 0.9.2 → 0.9.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.
Files changed (151) hide show
  1. package/.agignore +1 -1
  2. package/.github/workflows/ci.yml +38 -38
  3. package/=template.pyj +5 -5
  4. package/CHANGELOG.md +19 -0
  5. package/HACKING.md +103 -103
  6. package/LICENSE +24 -24
  7. package/PYTHON_GAPS.md +420 -0
  8. package/README.md +153 -29
  9. package/TODO.md +16 -118
  10. package/add-toc-to-readme +2 -2
  11. package/bin/export +75 -75
  12. package/bin/rapydscript +70 -70
  13. package/bin/web-repl-export +102 -102
  14. package/build +2 -2
  15. package/language-service/index.js +237 -8
  16. package/memory/project_string_impl.md +43 -0
  17. package/package.json +1 -1
  18. package/publish.py +37 -37
  19. package/release/baselib-plain-pretty.js +248 -38
  20. package/release/baselib-plain-ugly.js +8 -8
  21. package/release/compiler.js +778 -277
  22. package/release/signatures.json +30 -30
  23. package/session.vim +4 -4
  24. package/setup.cfg +2 -2
  25. package/src/ast.pyj +4 -1
  26. package/src/baselib-builtins.pyj +56 -2
  27. package/src/baselib-containers.pyj +2 -0
  28. package/src/baselib-errors.pyj +7 -3
  29. package/src/baselib-internal.pyj +51 -6
  30. package/src/baselib-str.pyj +5 -3
  31. package/src/compiler.pyj +36 -36
  32. package/src/errors.pyj +30 -30
  33. package/src/lib/aes.pyj +646 -646
  34. package/src/lib/asyncio.pyj +534 -0
  35. package/src/lib/base64.pyj +399 -0
  36. package/src/lib/bisect.pyj +73 -0
  37. package/src/lib/collections.pyj +1 -1
  38. package/src/lib/copy.pyj +120 -120
  39. package/src/lib/csv.pyj +494 -0
  40. package/src/lib/elementmaker.pyj +83 -83
  41. package/src/lib/encodings.pyj +126 -126
  42. package/src/lib/gettext.pyj +569 -569
  43. package/src/lib/heapq.pyj +98 -0
  44. package/src/lib/html.pyj +382 -0
  45. package/src/lib/http/__init__.pyj +98 -0
  46. package/src/lib/http/client.pyj +304 -0
  47. package/src/lib/http/cookies.pyj +236 -0
  48. package/src/lib/itertools.pyj +580 -580
  49. package/src/lib/logging.pyj +672 -0
  50. package/src/lib/math.pyj +193 -193
  51. package/src/lib/operator.pyj +11 -11
  52. package/src/lib/pythonize.pyj +20 -20
  53. package/src/lib/random.pyj +118 -118
  54. package/src/lib/react.pyj +74 -74
  55. package/src/lib/string.pyj +357 -0
  56. package/src/lib/textwrap.pyj +329 -0
  57. package/src/lib/traceback.pyj +63 -63
  58. package/src/lib/urllib/__init__.pyj +14 -0
  59. package/src/lib/urllib/error.pyj +66 -0
  60. package/src/lib/urllib/parse.pyj +475 -0
  61. package/src/lib/urllib/request.pyj +86 -0
  62. package/src/lib/uuid.pyj +77 -77
  63. package/src/monaco-language-service/analyzer.js +5 -2
  64. package/src/monaco-language-service/completions.js +26 -0
  65. package/src/monaco-language-service/diagnostics.js +202 -3
  66. package/src/monaco-language-service/dts.js +550 -550
  67. package/src/monaco-language-service/scope.js +1 -0
  68. package/src/output/comments.pyj +45 -45
  69. package/src/output/exceptions.pyj +201 -201
  70. package/src/output/functions.pyj +152 -6
  71. package/src/output/jsx.pyj +164 -164
  72. package/src/output/loops.pyj +17 -2
  73. package/src/output/modules.pyj +1 -1
  74. package/src/output/operators.pyj +15 -0
  75. package/src/output/stream.pyj +0 -1
  76. package/src/output/treeshake.pyj +182 -182
  77. package/src/output/utils.pyj +72 -72
  78. package/src/parse.pyj +80 -17
  79. package/src/string_interpolation.pyj +72 -72
  80. package/src/tokenizer.pyj +1 -1
  81. package/src/unicode_aliases.pyj +576 -576
  82. package/src/utils.pyj +192 -192
  83. package/test/_import_one.pyj +37 -37
  84. package/test/_import_two/__init__.pyj +11 -11
  85. package/test/_import_two/level2/deep.pyj +4 -4
  86. package/test/_import_two/other.pyj +6 -6
  87. package/test/_import_two/sub.pyj +13 -13
  88. package/test/aes_vectors.pyj +421 -421
  89. package/test/annotations.pyj +80 -80
  90. package/test/async_generators.pyj +144 -0
  91. package/test/asyncio.pyj +307 -0
  92. package/test/base64.pyj +202 -0
  93. package/test/bisect.pyj +178 -0
  94. package/test/csv.pyj +405 -0
  95. package/test/decorators.pyj +77 -77
  96. package/test/docstrings.pyj +39 -39
  97. package/test/elementmaker_test.pyj +45 -45
  98. package/test/float_special.pyj +64 -0
  99. package/test/functions.pyj +151 -151
  100. package/test/generators.pyj +41 -41
  101. package/test/generic.pyj +370 -370
  102. package/test/heapq.pyj +174 -0
  103. package/test/html.pyj +212 -0
  104. package/test/http.pyj +259 -0
  105. package/test/imports.pyj +79 -72
  106. package/test/internationalization.pyj +73 -73
  107. package/test/lint.pyj +164 -164
  108. package/test/logging.pyj +356 -0
  109. package/test/long.pyj +130 -0
  110. package/test/loops.pyj +85 -85
  111. package/test/numpy.pyj +734 -734
  112. package/test/parenthesized_with.pyj +141 -0
  113. package/test/python_compat.pyj +3 -5
  114. package/test/python_modulo.pyj +76 -0
  115. package/test/python_modulo_off.pyj +21 -0
  116. package/test/repl.pyj +121 -121
  117. package/test/scoped_flags.pyj +76 -76
  118. package/test/str.pyj +14 -0
  119. package/test/string.pyj +245 -0
  120. package/test/textwrap.pyj +172 -0
  121. package/test/type_display.pyj +48 -0
  122. package/test/type_enforcement.pyj +164 -0
  123. package/test/unit/index.js +14 -6
  124. package/test/unit/language-service-completions.js +119 -0
  125. package/test/unit/language-service-dts.js +543 -543
  126. package/test/unit/language-service-hover.js +455 -455
  127. package/test/unit/language-service-scope.js +32 -0
  128. package/test/unit/language-service.js +127 -3
  129. package/test/unit/run-language-service.js +17 -3
  130. package/test/unit/web-repl.js +2094 -29
  131. package/test/urllib.pyj +193 -0
  132. package/tools/compile.js +1 -1
  133. package/tools/compiler.d.ts +367 -367
  134. package/tools/completer.js +131 -131
  135. package/tools/embedded_compiler.js +7 -7
  136. package/tools/gettext.js +185 -185
  137. package/tools/ini.js +65 -65
  138. package/tools/msgfmt.js +187 -187
  139. package/tools/repl.js +223 -223
  140. package/tools/test.js +118 -118
  141. package/tools/utils.js +128 -128
  142. package/tools/web_repl.js +95 -95
  143. package/try +41 -41
  144. package/web-repl/env.js +196 -196
  145. package/web-repl/index.html +163 -163
  146. package/web-repl/main.js +1 -1
  147. package/web-repl/prism.css +139 -139
  148. package/web-repl/prism.js +113 -113
  149. package/web-repl/rapydscript.js +224 -224
  150. package/web-repl/sha1.js +25 -25
  151. package/test/omit_function_metadata.pyj +0 -20
@@ -1,45 +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'}})
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,64 @@
1
+ # vim:fileencoding=utf-8
2
+ # globals: assrt
3
+
4
+ ae = assrt.equal
5
+ ok = assrt.ok
6
+
7
+ # ── float() — special string values ───────────────────────────────────────────
8
+
9
+ # 'inf' / '+inf'
10
+ ae(float('inf'), v'Infinity')
11
+ ae(float('+inf'), v'Infinity')
12
+ ae(float('INF'), v'Infinity')
13
+ ae(float('Inf'), v'Infinity')
14
+
15
+ # '-inf'
16
+ ae(float('-inf'), v'-Infinity')
17
+ ae(float('-INF'), v'-Infinity')
18
+ ae(float('-Inf'), v'-Infinity')
19
+
20
+ # 'infinity' variants
21
+ ae(float('infinity'), v'Infinity')
22
+ ae(float('+infinity'), v'Infinity')
23
+ ae(float('-infinity'), v'-Infinity')
24
+ ae(float('Infinity'), v'Infinity')
25
+ ae(float('+Infinity'), v'Infinity')
26
+ ae(float('-Infinity'), v'-Infinity')
27
+ ae(float('INFINITY'), v'Infinity')
28
+ ae(float('-INFINITY'), v'-Infinity')
29
+
30
+ # 'nan' variants
31
+ ok(isNaN(float('nan')))
32
+ ok(isNaN(float('NaN')))
33
+ ok(isNaN(float('NAN')))
34
+ ok(isNaN(float('+nan')))
35
+ ok(isNaN(float('-nan')))
36
+
37
+ # leading/trailing whitespace is accepted (matches Python)
38
+ ae(float(' inf '), v'Infinity')
39
+ ae(float(' -inf '), v'-Infinity')
40
+ ok(isNaN(float(' nan ')))
41
+
42
+ # numeric strings still work
43
+ ae(float('3.14'), 3.14)
44
+ ae(float('1e10'), 1e10)
45
+ ae(float('-2.5'), -2.5)
46
+
47
+ # passing a real Infinity/NaN JS value through float() still works
48
+ ae(float(v'Infinity'), v'Infinity')
49
+ ae(float(v'-Infinity'), v'-Infinity')
50
+
51
+ # ValueError is still raised for unrecognised strings
52
+ _err = False
53
+ try:
54
+ float('not_a_number')
55
+ except ValueError:
56
+ _err = True
57
+ ok(_err)
58
+
59
+ _err2 = False
60
+ try:
61
+ float('')
62
+ except ValueError:
63
+ _err2 = True
64
+ ok(_err2)
@@ -1,151 +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')
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')
@@ -1,41 +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)))
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)))