@@ -4,35 +4,104 @@ const { loadPyodide } = require("pyodide");
4
4
async function findWheel ( distDir ) {
5
5
const dir = await opendir ( distDir ) ;
6
6
for await ( const dirent of dir ) {
7
- if ( dirent . name . endsWith ( "whl" ) ) {
7
+ if ( dirent . name . includes ( "emscripten" ) && dirent . name . endsWith ( "whl" ) ) {
8
8
return dirent . name ;
9
9
}
10
10
}
11
11
}
12
12
13
+ function make_tty_ops ( stream ) {
14
+ return {
15
+ // get_char has 3 particular return values:
16
+ // a.) the next character represented as an integer
17
+ // b.) undefined to signal that no data is currently available
18
+ // c.) null to signal an EOF
19
+ get_char ( tty ) {
20
+ if ( ! tty . input . length ) {
21
+ var result = null ;
22
+ var BUFSIZE = 256 ;
23
+ var buf = Buffer . alloc ( BUFSIZE ) ;
24
+ var bytesRead = fs . readSync ( process . stdin . fd , buf , 0 , BUFSIZE , - 1 ) ;
25
+ if ( bytesRead === 0 ) {
26
+ return null ;
27
+ }
28
+ result = buf . slice ( 0 , bytesRead ) ;
29
+ tty . input = Array . from ( result ) ;
30
+ }
31
+ return tty . input . shift ( ) ;
32
+ } ,
33
+ put_char ( tty , val ) {
34
+ try {
35
+ if ( val !== null ) {
36
+ tty . output . push ( val ) ;
37
+ }
38
+ if ( val === null || val === 10 ) {
39
+ process . stdout . write ( Buffer . from ( tty . output ) ) ;
40
+ tty . output = [ ] ;
41
+ }
42
+ } catch ( e ) {
43
+ console . warn ( e ) ;
44
+ }
45
+ } ,
46
+ flush ( tty ) {
47
+ if ( ! tty . output || tty . output . length === 0 ) {
48
+ return ;
49
+ }
50
+ stream . write ( Buffer . from ( tty . output ) ) ;
51
+ tty . output = [ ] ;
52
+ }
53
+ } ;
54
+ }
55
+
56
+ function setupStreams ( FS , TTY ) {
57
+ let mytty = FS . makedev ( FS . createDevice . major ++ , 0 ) ;
58
+ let myttyerr = FS . makedev ( FS . createDevice . major ++ , 0 ) ;
59
+ TTY . register ( mytty , make_tty_ops ( process . stdout ) )
60
+ TTY . register ( myttyerr , make_tty_ops ( process . stderr ) )
61
+ FS . mkdev ( '/dev/mytty' , mytty ) ;
62
+ FS . mkdev ( '/dev/myttyerr' , myttyerr ) ;
63
+ FS . unlink ( '/dev/stdin' ) ;
64
+ FS . unlink ( '/dev/stdout' ) ;
65
+ FS . unlink ( '/dev/stderr' ) ;
66
+ FS . symlink ( '/dev/mytty' , '/dev/stdin' ) ;
67
+ FS . symlink ( '/dev/mytty' , '/dev/stdout' ) ;
68
+ FS . symlink ( '/dev/myttyerr' , '/dev/stderr' ) ;
69
+ FS . closeStream ( 0 ) ;
70
+ FS . closeStream ( 1 ) ;
71
+ FS . closeStream ( 2 ) ;
72
+ var stdin = FS . open ( '/dev/stdin' , 0 ) ;
73
+ var stdout = FS . open ( '/dev/stdout' , 1 ) ;
74
+ var stderr = FS . open ( '/dev/stderr' , 1 ) ;
75
+ }
76
+
77
+
13
78
const pkgDir = process . argv [ 2 ] ;
14
79
const distDir = pkgDir + "/dist" ;
15
80
const testDir = pkgDir + "/tests" ;
16
81
17
82
async function main ( ) {
18
83
const wheelName = await findWheel ( distDir ) ;
19
84
const wheelURL = `file:${ distDir } /${ wheelName } ` ;
85
+ let errcode = 1 ;
20
86
21
87
try {
22
88
pyodide = await loadPyodide ( ) ;
23
89
const FS = pyodide . FS ;
90
+ setupStreams ( FS , pyodide . _module . TTY ) ;
24
91
const NODEFS = FS . filesystems . NODEFS ;
25
92
FS . mkdir ( "/test_dir" ) ;
26
93
FS . mount ( NODEFS , { root : testDir } , "/test_dir" ) ;
27
94
await pyodide . loadPackage ( [ "micropip" , "pytest" , "tomli" ] ) ;
28
95
const micropip = pyodide . pyimport ( "micropip" ) ;
96
+ await micropip . install ( "beautifulsoup4" ) ;
29
97
await micropip . install ( wheelURL ) ;
30
98
const pytest = pyodide . pyimport ( "pytest" ) ;
31
- errcode = pytest . main ( pyodide . toPy ( [ "/test_dir" , "-vv" ] ) ) ;
99
+ errcode = pytest . main ( pyodide . toPy ( [ "/test_dir" ] ) ) ;
32
100
} catch ( e ) {
33
101
console . error ( e ) ;
34
102
process . exit ( 1 ) ;
35
103
}
104
+ process . exit ( errcode ) ;
36
105
}
37
106
38
107
main ( ) ;
0 commit comments