tywrap 0.1.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/LICENSE +21 -0
- package/README.md +319 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +263 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +41 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +234 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/analyzer.d.ts +63 -0
- package/dist/core/analyzer.d.ts.map +1 -0
- package/dist/core/analyzer.js +676 -0
- package/dist/core/analyzer.js.map +1 -0
- package/dist/core/discovery.d.ts +85 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +344 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/generator.d.ts +37 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +368 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/mapper.d.ts +40 -0
- package/dist/core/mapper.d.ts.map +1 -0
- package/dist/core/mapper.js +401 -0
- package/dist/core/mapper.js.map +1 -0
- package/dist/core/validation.d.ts +79 -0
- package/dist/core/validation.d.ts.map +1 -0
- package/dist/core/validation.js +486 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/base.d.ts +12 -0
- package/dist/runtime/base.d.ts.map +1 -0
- package/dist/runtime/base.js +6 -0
- package/dist/runtime/base.js.map +1 -0
- package/dist/runtime/errors.d.ts +17 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +21 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/http.d.ts +22 -0
- package/dist/runtime/http.d.ts.map +1 -0
- package/dist/runtime/http.js +79 -0
- package/dist/runtime/http.js.map +1 -0
- package/dist/runtime/index.d.ts +8 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +17 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/node.d.ts +48 -0
- package/dist/runtime/node.d.ts.map +1 -0
- package/dist/runtime/node.js +328 -0
- package/dist/runtime/node.js.map +1 -0
- package/dist/runtime/optimized-node.d.ts +131 -0
- package/dist/runtime/optimized-node.d.ts.map +1 -0
- package/dist/runtime/optimized-node.js +622 -0
- package/dist/runtime/optimized-node.js.map +1 -0
- package/dist/runtime/protocol.d.ts +3 -0
- package/dist/runtime/protocol.d.ts.map +1 -0
- package/dist/runtime/protocol.js +3 -0
- package/dist/runtime/protocol.js.map +1 -0
- package/dist/runtime/pyodide.d.ts +27 -0
- package/dist/runtime/pyodide.d.ts.map +1 -0
- package/dist/runtime/pyodide.js +191 -0
- package/dist/runtime/pyodide.js.map +1 -0
- package/dist/tools/python_suite.js +173 -0
- package/dist/tools/python_suite.js.map +1 -0
- package/dist/types/index.d.ts +299 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/tywrap.d.ts +29 -0
- package/dist/tywrap.d.ts.map +1 -0
- package/dist/tywrap.js +589 -0
- package/dist/tywrap.js.map +1 -0
- package/dist/utils/bundle-optimizer.d.ts +182 -0
- package/dist/utils/bundle-optimizer.d.ts.map +1 -0
- package/dist/utils/bundle-optimizer.js +680 -0
- package/dist/utils/bundle-optimizer.js.map +1 -0
- package/dist/utils/cache.d.ts +149 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +492 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/codec.d.ts +94 -0
- package/dist/utils/codec.d.ts.map +1 -0
- package/dist/utils/codec.js +150 -0
- package/dist/utils/codec.js.map +1 -0
- package/dist/utils/logger.d.ts +42 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +140 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/memory-profiler.d.ts +123 -0
- package/dist/utils/memory-profiler.d.ts.map +1 -0
- package/dist/utils/memory-profiler.js +426 -0
- package/dist/utils/memory-profiler.js.map +1 -0
- package/dist/utils/parallel-processor.d.ts +146 -0
- package/dist/utils/parallel-processor.d.ts.map +1 -0
- package/dist/utils/parallel-processor.js +636 -0
- package/dist/utils/parallel-processor.js.map +1 -0
- package/dist/utils/python.d.ts +8 -0
- package/dist/utils/python.d.ts.map +1 -0
- package/dist/utils/python.js +56 -0
- package/dist/utils/python.js.map +1 -0
- package/dist/utils/runtime.d.ts +153 -0
- package/dist/utils/runtime.d.ts.map +1 -0
- package/dist/utils/runtime.js +519 -0
- package/dist/utils/runtime.js.map +1 -0
- package/package.json +136 -0
- package/runtime/python_bridge.py +476 -0
- package/src/cli.ts +331 -0
- package/src/config/index.ts +289 -0
- package/src/core/analyzer.ts +788 -0
- package/src/core/discovery.ts +415 -0
- package/src/core/generator.ts +447 -0
- package/src/core/mapper.ts +504 -0
- package/src/core/validation.ts +693 -0
- package/src/index.ts +83 -0
- package/src/runtime/base.ts +32 -0
- package/src/runtime/errors.ts +19 -0
- package/src/runtime/http.ts +132 -0
- package/src/runtime/index.ts +24 -0
- package/src/runtime/node.ts +431 -0
- package/src/runtime/optimized-node.ts +838 -0
- package/src/runtime/protocol.ts +2 -0
- package/src/runtime/pyodide.ts +228 -0
- package/src/types/global.d.ts +60 -0
- package/src/types/index.ts +410 -0
- package/src/tywrap.ts +669 -0
- package/src/utils/bundle-optimizer.ts +876 -0
- package/src/utils/cache.ts +634 -0
- package/src/utils/codec.ts +275 -0
- package/src/utils/logger.ts +201 -0
- package/src/utils/memory-profiler.ts +582 -0
- package/src/utils/parallel-processor.ts +879 -0
- package/src/utils/python.ts +79 -0
- package/src/utils/runtime.ts +616 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pyodide runtime bridge (browser)
|
|
3
|
+
*/
|
|
4
|
+
import { RuntimeBridge } from './base.js';
|
|
5
|
+
export interface PyodideBridgeOptions {
|
|
6
|
+
indexURL: string;
|
|
7
|
+
packages?: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare class PyodideBridge extends RuntimeBridge {
|
|
10
|
+
private readonly indexURL;
|
|
11
|
+
private readonly packages;
|
|
12
|
+
private py?;
|
|
13
|
+
private initPromise?;
|
|
14
|
+
constructor(options?: PyodideBridgeOptions);
|
|
15
|
+
private ensureReady;
|
|
16
|
+
private doInit;
|
|
17
|
+
init(): Promise<void>;
|
|
18
|
+
private resolveLoadPyodide;
|
|
19
|
+
private bootstrapHelpers;
|
|
20
|
+
call<T = unknown>(module: string, functionName: string, args: unknown[], kwargs?: Record<string, unknown>): Promise<T>;
|
|
21
|
+
instantiate<T = unknown>(module: string, className: string, args: unknown[], kwargs?: Record<string, unknown>): Promise<T>;
|
|
22
|
+
callMethod<T = unknown>(handle: string, methodName: string, args: unknown[], kwargs?: Record<string, unknown>): Promise<T>;
|
|
23
|
+
disposeInstance(handle: string): Promise<void>;
|
|
24
|
+
dispose(): Promise<void>;
|
|
25
|
+
private destroyPyProxy;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=pyodide.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pyodide.d.ts","sourceRoot":"","sources":["../../src/runtime/pyodide.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAYD,qBAAa,aAAc,SAAQ,aAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,EAAE,CAAC,CAAkB;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAgB;gBAExB,OAAO,GAAE,oBAAwE;YAM/E,WAAW;YAaX,MAAM;IAYd,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIb,kBAAkB;YAmBlB,gBAAgB;IA8BxB,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,OAAO,EAAE,EACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;IAuBP,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,EAAE,EACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;IAuBP,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO,EAAE,EACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC;IAuBP,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,OAAO,CAAC,cAAc;CASvB"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pyodide runtime bridge (browser)
|
|
3
|
+
*/
|
|
4
|
+
import { RuntimeBridge } from './base.js';
|
|
5
|
+
export class PyodideBridge extends RuntimeBridge {
|
|
6
|
+
indexURL;
|
|
7
|
+
packages;
|
|
8
|
+
py;
|
|
9
|
+
initPromise;
|
|
10
|
+
constructor(options = { indexURL: 'https://cdn.jsdelivr.net/pyodide/' }) {
|
|
11
|
+
super();
|
|
12
|
+
this.indexURL = options.indexURL;
|
|
13
|
+
this.packages = [...(options.packages ?? [])];
|
|
14
|
+
}
|
|
15
|
+
async ensureReady() {
|
|
16
|
+
if (this.py) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// If already initializing, wait for that promise
|
|
20
|
+
if (this.initPromise) {
|
|
21
|
+
return this.initPromise;
|
|
22
|
+
}
|
|
23
|
+
// Start initialization and store the promise to prevent concurrent initialization
|
|
24
|
+
this.initPromise = this.doInit();
|
|
25
|
+
return this.initPromise;
|
|
26
|
+
}
|
|
27
|
+
async doInit() {
|
|
28
|
+
const loadPyodideFn = await this.resolveLoadPyodide();
|
|
29
|
+
if (!loadPyodideFn) {
|
|
30
|
+
throw new Error('Pyodide is not available in this environment');
|
|
31
|
+
}
|
|
32
|
+
this.py = await loadPyodideFn({ indexURL: this.indexURL });
|
|
33
|
+
if (this.packages.length > 0) {
|
|
34
|
+
await this.py.loadPackage([...this.packages]);
|
|
35
|
+
}
|
|
36
|
+
await this.bootstrapHelpers();
|
|
37
|
+
}
|
|
38
|
+
async init() {
|
|
39
|
+
await this.ensureReady();
|
|
40
|
+
}
|
|
41
|
+
async resolveLoadPyodide() {
|
|
42
|
+
// Prefer global loadPyodide when present (browser script tag include)
|
|
43
|
+
const g = globalThis ?? {};
|
|
44
|
+
if (typeof g.loadPyodide === 'function') {
|
|
45
|
+
return g.loadPyodide;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
// Attempt dynamic import if available
|
|
49
|
+
const mod = (await import('pyodide'));
|
|
50
|
+
if (typeof mod.loadPyodide === 'function') {
|
|
51
|
+
return mod.loadPyodide;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Ignore import errors - pyodide may not be installed
|
|
56
|
+
// This is expected in most environments
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
async bootstrapHelpers() {
|
|
61
|
+
if (!this.py) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const helper = [
|
|
65
|
+
'import importlib',
|
|
66
|
+
'__tywrap_instances = {}',
|
|
67
|
+
'def __tywrap_call(module, function_name, args, kwargs):',
|
|
68
|
+
' mod = importlib.import_module(module)',
|
|
69
|
+
' fn = getattr(mod, function_name)',
|
|
70
|
+
' return fn(*args, **(kwargs or {}))',
|
|
71
|
+
'def __tywrap_instantiate(module, class_name, args, kwargs):',
|
|
72
|
+
' mod = importlib.import_module(module)',
|
|
73
|
+
' cls = getattr(mod, class_name)',
|
|
74
|
+
' obj = cls(*args, **(kwargs or {}))',
|
|
75
|
+
' handle = str(id(obj))',
|
|
76
|
+
' __tywrap_instances[handle] = obj',
|
|
77
|
+
' return handle',
|
|
78
|
+
'def __tywrap_call_method(handle, method_name, args, kwargs):',
|
|
79
|
+
' if handle not in __tywrap_instances:',
|
|
80
|
+
' raise KeyError(f"Unknown handle: {handle}")',
|
|
81
|
+
' obj = __tywrap_instances[handle]',
|
|
82
|
+
' fn = getattr(obj, method_name)',
|
|
83
|
+
' return fn(*args, **(kwargs or {}))',
|
|
84
|
+
'def __tywrap_dispose_instance(handle):',
|
|
85
|
+
' return __tywrap_instances.pop(handle, None) is not None',
|
|
86
|
+
].join('\n');
|
|
87
|
+
await this.py.runPythonAsync(helper);
|
|
88
|
+
}
|
|
89
|
+
async call(module, functionName, args, kwargs) {
|
|
90
|
+
await this.ensureReady();
|
|
91
|
+
const py = this.py;
|
|
92
|
+
if (!py) {
|
|
93
|
+
throw new Error('Pyodide not initialized');
|
|
94
|
+
}
|
|
95
|
+
const fn = py.globals.get('__tywrap_call');
|
|
96
|
+
if (!fn) {
|
|
97
|
+
throw new Error('Pyodide helper not initialized');
|
|
98
|
+
}
|
|
99
|
+
const invoke = fn;
|
|
100
|
+
const pyArgs = py.toPy(args ?? []);
|
|
101
|
+
const pyKwargs = py.toPy(kwargs ?? {});
|
|
102
|
+
try {
|
|
103
|
+
const out = invoke(module, functionName, pyArgs, pyKwargs);
|
|
104
|
+
return out;
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
this.destroyPyProxy(pyArgs);
|
|
108
|
+
this.destroyPyProxy(pyKwargs);
|
|
109
|
+
this.destroyPyProxy(fn);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async instantiate(module, className, args, kwargs) {
|
|
113
|
+
await this.ensureReady();
|
|
114
|
+
const py = this.py;
|
|
115
|
+
if (!py) {
|
|
116
|
+
throw new Error('Pyodide not initialized');
|
|
117
|
+
}
|
|
118
|
+
const fn = py.globals.get('__tywrap_instantiate');
|
|
119
|
+
if (!fn) {
|
|
120
|
+
throw new Error('Pyodide helper not initialized');
|
|
121
|
+
}
|
|
122
|
+
const invoke = fn;
|
|
123
|
+
const pyArgs = py.toPy(args ?? []);
|
|
124
|
+
const pyKwargs = py.toPy(kwargs ?? {});
|
|
125
|
+
try {
|
|
126
|
+
const out = invoke(module, className, pyArgs, pyKwargs);
|
|
127
|
+
return out;
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
this.destroyPyProxy(pyArgs);
|
|
131
|
+
this.destroyPyProxy(pyKwargs);
|
|
132
|
+
this.destroyPyProxy(fn);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async callMethod(handle, methodName, args, kwargs) {
|
|
136
|
+
await this.ensureReady();
|
|
137
|
+
const py = this.py;
|
|
138
|
+
if (!py) {
|
|
139
|
+
throw new Error('Pyodide not initialized');
|
|
140
|
+
}
|
|
141
|
+
const fn = py.globals.get('__tywrap_call_method');
|
|
142
|
+
if (!fn) {
|
|
143
|
+
throw new Error('Pyodide helper not initialized');
|
|
144
|
+
}
|
|
145
|
+
const invoke = fn;
|
|
146
|
+
const pyArgs = py.toPy(args ?? []);
|
|
147
|
+
const pyKwargs = py.toPy(kwargs ?? {});
|
|
148
|
+
try {
|
|
149
|
+
const out = invoke(handle, methodName, pyArgs, pyKwargs);
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
this.destroyPyProxy(pyArgs);
|
|
154
|
+
this.destroyPyProxy(pyKwargs);
|
|
155
|
+
this.destroyPyProxy(fn);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async disposeInstance(handle) {
|
|
159
|
+
await this.ensureReady();
|
|
160
|
+
const py = this.py;
|
|
161
|
+
if (!py) {
|
|
162
|
+
throw new Error('Pyodide not initialized');
|
|
163
|
+
}
|
|
164
|
+
const fn = py.globals.get('__tywrap_dispose_instance');
|
|
165
|
+
if (!fn) {
|
|
166
|
+
throw new Error('Pyodide helper not initialized');
|
|
167
|
+
}
|
|
168
|
+
const invoke = fn;
|
|
169
|
+
try {
|
|
170
|
+
invoke(handle);
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
this.destroyPyProxy(fn);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async dispose() {
|
|
177
|
+
// Pyodide has no explicit dispose for instance; rely on GC
|
|
178
|
+
this.py = undefined;
|
|
179
|
+
}
|
|
180
|
+
destroyPyProxy(value) {
|
|
181
|
+
if (value && typeof value.destroy === 'function') {
|
|
182
|
+
try {
|
|
183
|
+
value.destroy();
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// ignore cleanup failures
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=pyodide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pyodide.js","sourceRoot":"","sources":["../../src/runtime/pyodide.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Python library integration suite runner
|
|
3
|
+
- Creates an isolated venv under .tywrap/python-suite/<suite>/.venv
|
|
4
|
+
- Installs pinned requirements for the selected suite
|
|
5
|
+
- Runs test/python/library_integration.py against that venv
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import { spawnSync } from 'node:child_process';
|
|
11
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
12
|
+
// Platform utilities (inlined to avoid importing from src/ which is outside tools rootDir)
|
|
13
|
+
const isWindows = () => process.platform === 'win32';
|
|
14
|
+
const getVenvBinDir = () => (isWindows() ? 'Scripts' : 'bin');
|
|
15
|
+
const getVenvPythonExe = () => (isWindows() ? 'python.exe' : 'python');
|
|
16
|
+
function usage() {
|
|
17
|
+
// eslint-disable-next-line no-console
|
|
18
|
+
console.error('Usage: node dist/tools/python_suite.js <core|data|ml|all>');
|
|
19
|
+
}
|
|
20
|
+
function runCapture(command, args, options = {}) {
|
|
21
|
+
const { encoding: _encoding, ...rest } = options;
|
|
22
|
+
const res = spawnSync(command, args, {
|
|
23
|
+
encoding: 'utf8',
|
|
24
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
25
|
+
...rest,
|
|
26
|
+
});
|
|
27
|
+
if (res.error) {
|
|
28
|
+
throw res.error;
|
|
29
|
+
}
|
|
30
|
+
return res;
|
|
31
|
+
}
|
|
32
|
+
function runInherit(command, args, options = {}) {
|
|
33
|
+
const res = spawnSync(command, args, { stdio: 'inherit', ...options });
|
|
34
|
+
if (res.error) {
|
|
35
|
+
throw res.error;
|
|
36
|
+
}
|
|
37
|
+
if (res.status !== 0) {
|
|
38
|
+
throw new Error(`${command} ${args.join(' ')} failed with exit code ${res.status}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function resolvePythonBin() {
|
|
42
|
+
const envPython = process.env.PYTHON_BIN?.trim();
|
|
43
|
+
const candidates = envPython
|
|
44
|
+
? [envPython]
|
|
45
|
+
: isWindows()
|
|
46
|
+
? ['python', 'py']
|
|
47
|
+
: ['python3.12', 'python3.11', 'python3.10', 'python3', 'python'];
|
|
48
|
+
for (const candidate of candidates) {
|
|
49
|
+
try {
|
|
50
|
+
const args = candidate === 'py' ? ['-3', '-V'] : ['-V'];
|
|
51
|
+
const res = runCapture(candidate, args);
|
|
52
|
+
if (res.status === 0) {
|
|
53
|
+
return { python: candidate, argsPrefix: candidate === 'py' ? ['-3'] : [] };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// ignore
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
throw new Error(`No Python interpreter found (tried ${candidates.join(', ')}${envPython ? '' : ' and PYTHON_BIN'}).`);
|
|
61
|
+
}
|
|
62
|
+
function venvPythonPath(venvDir) {
|
|
63
|
+
const binDir = path.join(venvDir, getVenvBinDir());
|
|
64
|
+
return path.join(binDir, getVenvPythonExe());
|
|
65
|
+
}
|
|
66
|
+
function requirementsForSuite(rootDir, suite) {
|
|
67
|
+
const baseDir = path.join(rootDir, 'test', 'python');
|
|
68
|
+
const core = path.join(baseDir, 'requirements-suite-core.txt');
|
|
69
|
+
const data = path.join(baseDir, 'requirements-suite-data.txt');
|
|
70
|
+
const ml = path.join(baseDir, 'requirements-suite-ml.txt');
|
|
71
|
+
if (suite === 'core') {
|
|
72
|
+
return { suite: 'core', pipArgs: ['-r', core], hashFiles: [core] };
|
|
73
|
+
}
|
|
74
|
+
if (suite === 'data') {
|
|
75
|
+
return { suite: 'data', pipArgs: ['-r', data], hashFiles: [data] };
|
|
76
|
+
}
|
|
77
|
+
if (suite === 'ml') {
|
|
78
|
+
return { suite: 'ml', pipArgs: ['-r', ml], hashFiles: [ml] };
|
|
79
|
+
}
|
|
80
|
+
if (suite === 'all') {
|
|
81
|
+
return { suite: 'all', pipArgs: ['-r', core, '-r', data, '-r', ml], hashFiles: [core, data, ml] };
|
|
82
|
+
}
|
|
83
|
+
throw new Error(`Unknown suite: ${suite}`);
|
|
84
|
+
}
|
|
85
|
+
function computeRequirementsHash(files) {
|
|
86
|
+
const hash = createHash('sha256');
|
|
87
|
+
for (const filePath of files) {
|
|
88
|
+
hash.update(`${path.basename(filePath)}\0`);
|
|
89
|
+
hash.update(readFileSync(filePath));
|
|
90
|
+
hash.update('\0');
|
|
91
|
+
}
|
|
92
|
+
return hash.digest('hex');
|
|
93
|
+
}
|
|
94
|
+
function ensureDir(dirPath) {
|
|
95
|
+
mkdirSync(dirPath, { recursive: true });
|
|
96
|
+
}
|
|
97
|
+
function ensureVenv(venvDir, python, argsPrefix) {
|
|
98
|
+
const pythonBin = venvPythonPath(venvDir);
|
|
99
|
+
try {
|
|
100
|
+
const res = runCapture(pythonBin, ['-V']);
|
|
101
|
+
if (res.status === 0) {
|
|
102
|
+
return pythonBin;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// ignore
|
|
107
|
+
}
|
|
108
|
+
ensureDir(path.dirname(venvDir));
|
|
109
|
+
ensureDir(venvDir);
|
|
110
|
+
runInherit(python, [...argsPrefix, '-m', 'venv', venvDir]);
|
|
111
|
+
return pythonBin;
|
|
112
|
+
}
|
|
113
|
+
function ensureRequirementsInstalled(pythonBin, suiteDir, requirements) {
|
|
114
|
+
const markerPath = path.join(suiteDir, 'requirements.sha256');
|
|
115
|
+
const currentHash = computeRequirementsHash(requirements.hashFiles);
|
|
116
|
+
const existingHash = existsSync(markerPath) ? readFileSync(markerPath, 'utf8').trim() : '';
|
|
117
|
+
if (existingHash === currentHash) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const pipEnv = {
|
|
121
|
+
PIP_DISABLE_PIP_VERSION_CHECK: '1',
|
|
122
|
+
PIP_PROGRESS_BAR: 'off',
|
|
123
|
+
};
|
|
124
|
+
runInherit(pythonBin, ['-m', 'pip', 'install', '--upgrade', 'pip'], {
|
|
125
|
+
env: { ...process.env, ...pipEnv },
|
|
126
|
+
});
|
|
127
|
+
runInherit(pythonBin, ['-m', 'pip', 'install', ...requirements.pipArgs], {
|
|
128
|
+
env: { ...process.env, ...pipEnv },
|
|
129
|
+
});
|
|
130
|
+
writeFileSync(markerPath, `${currentHash}\n`, 'utf8');
|
|
131
|
+
}
|
|
132
|
+
function findRepoRoot(startDir) {
|
|
133
|
+
let current = startDir;
|
|
134
|
+
while (true) {
|
|
135
|
+
if (existsSync(path.join(current, 'package.json'))) {
|
|
136
|
+
return current;
|
|
137
|
+
}
|
|
138
|
+
const parent = path.dirname(current);
|
|
139
|
+
if (parent === current) {
|
|
140
|
+
return startDir;
|
|
141
|
+
}
|
|
142
|
+
current = parent;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export function run(argv = process.argv.slice(2)) {
|
|
146
|
+
const suite = String(argv[0] ?? '').trim();
|
|
147
|
+
if (!suite) {
|
|
148
|
+
usage();
|
|
149
|
+
process.exitCode = 2;
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
153
|
+
const rootDir = findRepoRoot(here);
|
|
154
|
+
const requirements = requirementsForSuite(rootDir, suite);
|
|
155
|
+
const suiteDir = path.join(rootDir, '.tywrap', 'python-suite', suite);
|
|
156
|
+
const venvDir = path.join(suiteDir, '.venv');
|
|
157
|
+
ensureDir(suiteDir);
|
|
158
|
+
const { python, argsPrefix } = resolvePythonBin();
|
|
159
|
+
const pythonBin = ensureVenv(venvDir, python, argsPrefix);
|
|
160
|
+
ensureRequirementsInstalled(pythonBin, suiteDir, requirements);
|
|
161
|
+
runInherit(pythonBin, [path.join(rootDir, 'test', 'python', 'library_integration.py'), '--suite', suite], { cwd: rootDir });
|
|
162
|
+
}
|
|
163
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
164
|
+
try {
|
|
165
|
+
run();
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
// eslint-disable-next-line no-console
|
|
169
|
+
console.error(error);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=python_suite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python_suite.js","sourceRoot":"","sources":["../../tools/python_suite.ts"],"names":[],"mappings":"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"}
|