1+ load ("@bazel_skylib//rules:copy_file.bzl" , "copy_file" )
12load ("@bazel_skylib//rules:expand_template.bzl" , "expand_template" )
23load ("//:build/python_metadata.bzl" , "BUNDLE_VERSION_INFO" )
34load ("//:build/wd_test.bzl" , "wd_test" )
@@ -12,16 +13,29 @@ def _py_wd_test_helper(
1213 name ,
1314 src ,
1415 python_flag ,
15- make_snapshot ,
1616 * ,
17- args = [],
17+ make_snapshot ,
18+ use_snapshot ,
19+ args ,
20+ data = [],
1821 ** kwargs ):
1922 name_flag = name + "_" + python_flag
2023 templated_src = name_flag .replace ("/" , "-" ) + "@template"
2124 templated_src = "/" .join (src .split ("/" )[:- 1 ] + [templated_src ])
2225 flags = _get_enable_flags (python_flag )
2326 feature_flags_txt = "," .join (['"{}"' .format (flag ) for flag in flags ])
2427
28+ load_snapshot = None
29+ if use_snapshot :
30+ version_info = BUNDLE_VERSION_INFO [python_flag ]
31+
32+ snapshot = version_info [use_snapshot + "_snapshot" ]
33+ data = data + [":python_snapshots" ]
34+ load_snapshot = snapshot
35+
36+ if load_snapshot and not make_snapshot :
37+ args += ["--python-load-snapshot" , "load_snapshot.bin" ]
38+
2539 expand_template (
2640 name = name_flag + "@rule" ,
2741 out = templated_src ,
@@ -34,9 +48,56 @@ def _py_wd_test_helper(
3448 name = name_flag + "@" ,
3549 args = args ,
3650 python_snapshot_test = make_snapshot ,
51+ data = data ,
52+ load_snapshot = load_snapshot ,
3753 ** kwargs
3854 )
3955
56+ def _snapshot_file (snapshot ):
57+ if not snapshot :
58+ return []
59+ copy_file (
60+ name = "pyodide-snapshot-%s@copy" % snapshot ,
61+ src = "@pyodide-snapshot-%s//file" % snapshot ,
62+ out = snapshot ,
63+ visibility = ["//visibility:public" ],
64+ )
65+ return [":" + snapshot ]
66+
67+ def _snapshot_files (
68+ baseline_snapshot = None ,
69+ numpy_snapshot = None ,
70+ fastapi_snapshot = None ,
71+ ** _kwds ):
72+ result = []
73+ result += _snapshot_file (baseline_snapshot )
74+ result += _snapshot_file (numpy_snapshot )
75+ result += _snapshot_file (fastapi_snapshot )
76+ return result
77+
78+ def python_test_setup ():
79+ # pyodide_dev.capnp.bin represents a custom pyodide version "dev" that is generated
80+ # at build time using the latest contents of the src/pyodide directory.
81+ # This is used to run tests to ensure that they are always run against the latest build of
82+ # the Pyodide bundle.
83+ copy_file (
84+ name = "pyodide_dev.capnp.bin@rule" ,
85+ src = "//src/pyodide:pyodide.capnp.bin_cross" ,
86+ out = "pyodide-bundle-cache/pyodide_dev.capnp.bin" ,
87+ visibility = ["//visibility:public" ],
88+ )
89+ data = []
90+ for x in BUNDLE_VERSION_INFO .values ():
91+ if x ["name" ] == "development" :
92+ continue
93+ data += _snapshot_files (** x )
94+
95+ native .filegroup (
96+ name = "python_snapshots" ,
97+ data = data ,
98+ visibility = ["//visibility:public" ],
99+ )
100+
40101def py_wd_test (
41102 directory = None ,
42103 * ,
@@ -49,12 +110,16 @@ def py_wd_test(
49110 size = "enormous" ,
50111 tags = [],
51112 make_snapshot = True ,
113+ use_snapshot = None ,
114+ skip_default_data = False ,
52115 ** kwargs ):
53116 if python_flags == "all" :
54117 python_flags = BUNDLE_VERSION_INFO .keys ()
55118 python_flags = [flag for flag in python_flags if flag not in skip_python_flags and flag in BUNDLE_VERSION_INFO ]
56- if data == None and directory != None :
57- data = native .glob (
119+ if data == None :
120+ data = []
121+ if directory and not skip_default_data :
122+ data += native .glob (
58123 [
59124 directory + "/**" ,
60125 ],
@@ -82,8 +147,10 @@ def py_wd_test(
82147 src ,
83148 python_flag ,
84149 make_snapshot = make_snapshot ,
150+ use_snapshot = use_snapshot ,
85151 data = data ,
86152 args = args ,
87153 size = size ,
88154 tags = tags ,
155+ ** kwargs
89156 )
0 commit comments