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.
Files changed (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +319 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +263 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/index.d.ts +41 -0
  8. package/dist/config/index.d.ts.map +1 -0
  9. package/dist/config/index.js +234 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/core/analyzer.d.ts +63 -0
  12. package/dist/core/analyzer.d.ts.map +1 -0
  13. package/dist/core/analyzer.js +676 -0
  14. package/dist/core/analyzer.js.map +1 -0
  15. package/dist/core/discovery.d.ts +85 -0
  16. package/dist/core/discovery.d.ts.map +1 -0
  17. package/dist/core/discovery.js +344 -0
  18. package/dist/core/discovery.js.map +1 -0
  19. package/dist/core/generator.d.ts +37 -0
  20. package/dist/core/generator.d.ts.map +1 -0
  21. package/dist/core/generator.js +368 -0
  22. package/dist/core/generator.js.map +1 -0
  23. package/dist/core/mapper.d.ts +40 -0
  24. package/dist/core/mapper.d.ts.map +1 -0
  25. package/dist/core/mapper.js +401 -0
  26. package/dist/core/mapper.js.map +1 -0
  27. package/dist/core/validation.d.ts +79 -0
  28. package/dist/core/validation.d.ts.map +1 -0
  29. package/dist/core/validation.js +486 -0
  30. package/dist/core/validation.js.map +1 -0
  31. package/dist/index.d.ts +26 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +29 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/runtime/base.d.ts +12 -0
  36. package/dist/runtime/base.d.ts.map +1 -0
  37. package/dist/runtime/base.js +6 -0
  38. package/dist/runtime/base.js.map +1 -0
  39. package/dist/runtime/errors.d.ts +17 -0
  40. package/dist/runtime/errors.d.ts.map +1 -0
  41. package/dist/runtime/errors.js +21 -0
  42. package/dist/runtime/errors.js.map +1 -0
  43. package/dist/runtime/http.d.ts +22 -0
  44. package/dist/runtime/http.d.ts.map +1 -0
  45. package/dist/runtime/http.js +79 -0
  46. package/dist/runtime/http.js.map +1 -0
  47. package/dist/runtime/index.d.ts +8 -0
  48. package/dist/runtime/index.d.ts.map +1 -0
  49. package/dist/runtime/index.js +17 -0
  50. package/dist/runtime/index.js.map +1 -0
  51. package/dist/runtime/node.d.ts +48 -0
  52. package/dist/runtime/node.d.ts.map +1 -0
  53. package/dist/runtime/node.js +328 -0
  54. package/dist/runtime/node.js.map +1 -0
  55. package/dist/runtime/optimized-node.d.ts +131 -0
  56. package/dist/runtime/optimized-node.d.ts.map +1 -0
  57. package/dist/runtime/optimized-node.js +622 -0
  58. package/dist/runtime/optimized-node.js.map +1 -0
  59. package/dist/runtime/protocol.d.ts +3 -0
  60. package/dist/runtime/protocol.d.ts.map +1 -0
  61. package/dist/runtime/protocol.js +3 -0
  62. package/dist/runtime/protocol.js.map +1 -0
  63. package/dist/runtime/pyodide.d.ts +27 -0
  64. package/dist/runtime/pyodide.d.ts.map +1 -0
  65. package/dist/runtime/pyodide.js +191 -0
  66. package/dist/runtime/pyodide.js.map +1 -0
  67. package/dist/tools/python_suite.js +173 -0
  68. package/dist/tools/python_suite.js.map +1 -0
  69. package/dist/types/index.d.ts +299 -0
  70. package/dist/types/index.d.ts.map +1 -0
  71. package/dist/types/index.js +5 -0
  72. package/dist/types/index.js.map +1 -0
  73. package/dist/tywrap.d.ts +29 -0
  74. package/dist/tywrap.d.ts.map +1 -0
  75. package/dist/tywrap.js +589 -0
  76. package/dist/tywrap.js.map +1 -0
  77. package/dist/utils/bundle-optimizer.d.ts +182 -0
  78. package/dist/utils/bundle-optimizer.d.ts.map +1 -0
  79. package/dist/utils/bundle-optimizer.js +680 -0
  80. package/dist/utils/bundle-optimizer.js.map +1 -0
  81. package/dist/utils/cache.d.ts +149 -0
  82. package/dist/utils/cache.d.ts.map +1 -0
  83. package/dist/utils/cache.js +492 -0
  84. package/dist/utils/cache.js.map +1 -0
  85. package/dist/utils/codec.d.ts +94 -0
  86. package/dist/utils/codec.d.ts.map +1 -0
  87. package/dist/utils/codec.js +150 -0
  88. package/dist/utils/codec.js.map +1 -0
  89. package/dist/utils/logger.d.ts +42 -0
  90. package/dist/utils/logger.d.ts.map +1 -0
  91. package/dist/utils/logger.js +140 -0
  92. package/dist/utils/logger.js.map +1 -0
  93. package/dist/utils/memory-profiler.d.ts +123 -0
  94. package/dist/utils/memory-profiler.d.ts.map +1 -0
  95. package/dist/utils/memory-profiler.js +426 -0
  96. package/dist/utils/memory-profiler.js.map +1 -0
  97. package/dist/utils/parallel-processor.d.ts +146 -0
  98. package/dist/utils/parallel-processor.d.ts.map +1 -0
  99. package/dist/utils/parallel-processor.js +636 -0
  100. package/dist/utils/parallel-processor.js.map +1 -0
  101. package/dist/utils/python.d.ts +8 -0
  102. package/dist/utils/python.d.ts.map +1 -0
  103. package/dist/utils/python.js +56 -0
  104. package/dist/utils/python.js.map +1 -0
  105. package/dist/utils/runtime.d.ts +153 -0
  106. package/dist/utils/runtime.d.ts.map +1 -0
  107. package/dist/utils/runtime.js +519 -0
  108. package/dist/utils/runtime.js.map +1 -0
  109. package/package.json +136 -0
  110. package/runtime/python_bridge.py +476 -0
  111. package/src/cli.ts +331 -0
  112. package/src/config/index.ts +289 -0
  113. package/src/core/analyzer.ts +788 -0
  114. package/src/core/discovery.ts +415 -0
  115. package/src/core/generator.ts +447 -0
  116. package/src/core/mapper.ts +504 -0
  117. package/src/core/validation.ts +693 -0
  118. package/src/index.ts +83 -0
  119. package/src/runtime/base.ts +32 -0
  120. package/src/runtime/errors.ts +19 -0
  121. package/src/runtime/http.ts +132 -0
  122. package/src/runtime/index.ts +24 -0
  123. package/src/runtime/node.ts +431 -0
  124. package/src/runtime/optimized-node.ts +838 -0
  125. package/src/runtime/protocol.ts +2 -0
  126. package/src/runtime/pyodide.ts +228 -0
  127. package/src/types/global.d.ts +60 -0
  128. package/src/types/index.ts +410 -0
  129. package/src/tywrap.ts +669 -0
  130. package/src/utils/bundle-optimizer.ts +876 -0
  131. package/src/utils/cache.ts +634 -0
  132. package/src/utils/codec.ts +275 -0
  133. package/src/utils/logger.ts +201 -0
  134. package/src/utils/memory-profiler.ts +582 -0
  135. package/src/utils/parallel-processor.ts +879 -0
  136. package/src/utils/python.ts +79 -0
  137. 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":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAiB1C,MAAM,OAAO,aAAc,SAAQ,aAAa;IAC7B,QAAQ,CAAS;IACjB,QAAQ,CAAoB;IACrC,EAAE,CAAmB;IACrB,WAAW,CAAiB;IAEpC,YAAY,UAAgC,EAAE,QAAQ,EAAE,mCAAmC,EAAE;QAC3F,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,iDAAiD;QACjD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QACD,kFAAkF;QAClF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,MAAM,aAAa,GAA4B,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC/E,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,EAAE,GAAG,MAAM,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC9B,sEAAsE;QACtE,MAAM,CAAC,GAAI,UAAuD,IAAI,EAAE,CAAC;QACzE,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YACxC,OAAO,CAAC,CAAC,WAAW,CAAC;QACvB,CAAC;QACD,IAAI,CAAC;YACH,sCAAsC;YACtC,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAA6C,CAAC;YAClF,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;gBAC1C,OAAO,GAAG,CAAC,WAAW,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;YACtD,wCAAwC;QAC1C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG;YACb,kBAAkB;YAClB,yBAAyB;YACzB,yDAAyD;YACzD,2CAA2C;YAC3C,sCAAsC;YACtC,wCAAwC;YACxC,6DAA6D;YAC7D,2CAA2C;YAC3C,oCAAoC;YACpC,wCAAwC;YACxC,2BAA2B;YAC3B,sCAAsC;YACtC,mBAAmB;YACnB,8DAA8D;YAC9D,0CAA0C;YAC1C,qDAAqD;YACrD,sCAAsC;YACtC,oCAAoC;YACpC,wCAAwC;YACxC,wCAAwC;YACxC,6DAA6D;SAC9D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAc,EACd,YAAoB,EACpB,IAAe,EACf,MAAgC;QAEhC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,MAAM,GAAG,EAAoE,CAAC;QACpF,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC3D,OAAO,GAAQ,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9B,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CACf,MAAc,EACd,SAAiB,EACjB,IAAe,EACf,MAAgC;QAEhC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAClD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,MAAM,GAAG,EAAoE,CAAC;QACpF,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YACxD,OAAO,GAAQ,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9B,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CACd,MAAc,EACd,UAAkB,EAClB,IAAe,EACf,MAAgC;QAEhC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAClD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,MAAM,GAAG,EAA+D,CAAC;QAC/E,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YACzD,OAAO,GAAQ,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9B,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACvD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,MAAM,GAAG,EAA4B,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,CAAC;QACjB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,2DAA2D;QAC3D,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;IACtB,CAAC;IAEO,cAAc,CAAC,KAAc;QACnC,IAAI,KAAK,IAAI,OAAQ,KAAkC,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAC/E,IAAI,CAAC;gBACF,KAAiC,CAAC,OAAO,EAAE,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -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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"}