pynect 0.2.7 → 0.2.10
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/README.md +68 -27
- package/SECURITY.md +6 -6
- package/dist/cli/codegen.d.ts +3 -0
- package/dist/cli/codegen.d.ts.map +1 -1
- package/dist/cli/codegen.js +15 -3
- package/dist/cli/codegen.js.map +1 -1
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +38 -19
- package/dist/cli/sync.js.map +1 -1
- package/dist/config/project.d.ts +8 -52
- package/dist/config/project.d.ts.map +1 -1
- package/dist/config/project.js +74 -121
- package/dist/config/project.js.map +1 -1
- package/dist/core/isolated-worker.js +4 -4
- package/dist/core/isolated-worker.js.map +1 -1
- package/dist/core/py-proxy.d.ts +2 -1
- package/dist/core/py-proxy.d.ts.map +1 -1
- package/dist/core/py-proxy.js +55 -7
- package/dist/core/py-proxy.js.map +1 -1
- package/dist/core/py-runtime.d.ts +1 -5
- package/dist/core/py-runtime.d.ts.map +1 -1
- package/dist/core/py-runtime.js +36 -100
- package/dist/core/py-runtime.js.map +1 -1
- package/dist/core/pynect-callback.d.ts +16 -0
- package/dist/core/pynect-callback.d.ts.map +1 -0
- package/dist/core/pynect-callback.js +52 -0
- package/dist/core/pynect-callback.js.map +1 -0
- package/dist/env/project-environment.d.ts +9 -30
- package/dist/env/project-environment.d.ts.map +1 -1
- package/dist/env/project-environment.js +32 -217
- package/dist/env/project-environment.js.map +1 -1
- package/dist/env/python.d.ts +16 -0
- package/dist/env/python.d.ts.map +1 -0
- package/dist/env/python.js +9 -0
- package/dist/env/python.js.map +1 -0
- package/dist/index.d.ts +8 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -31
- package/dist/index.js.map +1 -1
- package/dist/native/native-addon-loader.d.ts.map +1 -1
- package/dist/native/native-addon-loader.js +15 -5
- package/dist/native/native-addon-loader.js.map +1 -1
- package/dist/types/addon.d.ts +6 -0
- package/dist/types/addon.d.ts.map +1 -1
- package/dist/types/addon.js.map +1 -1
- package/dist/types/config.d.ts +18 -85
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +17 -15
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/python.d.ts +2 -0
- package/dist/types/python.d.ts.map +1 -1
- package/package.json +3 -4
- package/prebuilds/darwin-arm64/pynect-prebuild.json +1 -1
- package/prebuilds/darwin-arm64/pynect_addon.node +0 -0
- package/prebuilds/darwin-x64/pynect-prebuild.json +1 -1
- package/prebuilds/darwin-x64/pynect_addon.node +0 -0
- package/prebuilds/linux-arm64/pynect-prebuild.json +1 -1
- package/prebuilds/linux-arm64/pynect_addon.node +0 -0
- package/prebuilds/linux-x64/pynect-prebuild.json +1 -1
- package/prebuilds/linux-x64/pynect_addon.node +0 -0
- package/prebuilds/win32-arm64/pynect-prebuild.json +1 -1
- package/prebuilds/win32-arm64/pynect_addon.node +0 -0
- package/prebuilds/win32-x64/pynect-prebuild.json +1 -1
- package/prebuilds/win32-x64/pynect_addon.node +0 -0
- package/python/pynect_runtime.py +1 -1
- package/python/type_inspector.py +12 -0
- package/scripts/build-native.js +4 -3
- package/scripts/postinstall.js +2 -2
- package/scripts/python.js +33 -0
- package/scripts/smoke-python-boundary.js +72 -21
- package/src/native/callback_bridge.h +11 -0
- package/src/native/native-addon-loader.ts +13 -4
- package/src/native/pynect_addon.cpp +346 -4
- package/src/native/python_bridge.cpp +12 -0
- package/src/native/python_bridge.h +7 -0
- package/src/native/thread_pool.cpp +62 -55
- package/src/native/thread_pool.h +13 -0
- package/src/native/type_converter.h +2 -0
- package/dist/env/executables.d.ts +0 -3
- package/dist/env/executables.d.ts.map +0 -1
- package/dist/env/executables.js +0 -14
- package/dist/env/executables.js.map +0 -1
- package/dist/env/package-installer.d.ts +0 -232
- package/dist/env/package-installer.d.ts.map +0 -1
- package/dist/env/package-installer.js +0 -615
- package/dist/env/package-installer.js.map +0 -1
- package/dist/env/pyfig-adapter.d.ts +0 -38
- package/dist/env/pyfig-adapter.d.ts.map +0 -1
- package/dist/env/pyfig-adapter.js +0 -10
- package/dist/env/pyfig-adapter.js.map +0 -1
- package/dist/env/python-detector.d.ts +0 -48
- package/dist/env/python-detector.d.ts.map +0 -1
- package/dist/env/python-detector.js +0 -182
- package/dist/env/python-detector.js.map +0 -1
- package/dist/env/python-provisioner.d.ts +0 -16
- package/dist/env/python-provisioner.d.ts.map +0 -1
- package/dist/env/python-provisioner.js +0 -42
- package/dist/env/python-provisioner.js.map +0 -1
- package/dist/env/venv-manager.d.ts +0 -56
- package/dist/env/venv-manager.d.ts.map +0 -1
- package/dist/env/venv-manager.js +0 -160
- package/dist/env/venv-manager.js.map +0 -1
- package/scripts/pyfig.js +0 -142
- package/scripts/python-provisioner.js +0 -23
|
@@ -1,615 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* pynect - PackageInstaller
|
|
4
|
-
*
|
|
5
|
-
* Repository-venv package installer. All Python and pip execution is routed
|
|
6
|
-
* through Pyfig so standalone or system pip can never be selected.
|
|
7
|
-
*
|
|
8
|
-
* Responsibilities
|
|
9
|
-
*
|
|
10
|
-
* - Resolve the "import name" from the "install name" (e.g. scikit-learn -> sklearn)
|
|
11
|
-
* - Check whether a package is already importable before trying to install it
|
|
12
|
-
* - Run pip with the correct flags (--quiet, --no-warn-script-location, etc.)
|
|
13
|
-
* - Support per-package version constraints ("numpy>=1.24,<2")
|
|
14
|
-
* - Support extras ("uvicorn[standard]")
|
|
15
|
-
* - Support index overrides (corporate PyPI mirrors, --extra-index-url)
|
|
16
|
-
* - Upgrade existing installations when requested
|
|
17
|
-
* - Emit structured progress events via EventEmitter
|
|
18
|
-
* - Retry transient network failures up to N times with back-off
|
|
19
|
-
* - Parse pip's JSON output (--report) for installed metadata when available
|
|
20
|
-
* - Return full InstallResult objects describing what happened
|
|
21
|
-
*
|
|
22
|
-
* Usage
|
|
23
|
-
*
|
|
24
|
-
* const installer = new PackageInstaller({ pythonExecutable: '/usr/bin/python3' });
|
|
25
|
-
*
|
|
26
|
-
* const result = await installer.install(['pandas', 'numpy>=1.24', 'torch']);
|
|
27
|
-
* console.log(result.installed); // ['pandas==2.2.2', 'numpy==1.26.4', ...]
|
|
28
|
-
*
|
|
29
|
-
* installer.on('progress', (ev) => console.log(ev.package, ev.status));
|
|
30
|
-
*/
|
|
31
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
32
|
-
if (k2 === undefined) k2 = k;
|
|
33
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
34
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
35
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
36
|
-
}
|
|
37
|
-
Object.defineProperty(o, k2, desc);
|
|
38
|
-
}) : (function(o, m, k, k2) {
|
|
39
|
-
if (k2 === undefined) k2 = k;
|
|
40
|
-
o[k2] = m[k];
|
|
41
|
-
}));
|
|
42
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
43
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
44
|
-
}) : function(o, v) {
|
|
45
|
-
o["default"] = v;
|
|
46
|
-
});
|
|
47
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
48
|
-
var ownKeys = function(o) {
|
|
49
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
50
|
-
var ar = [];
|
|
51
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
52
|
-
return ar;
|
|
53
|
-
};
|
|
54
|
-
return ownKeys(o);
|
|
55
|
-
};
|
|
56
|
-
return function (mod) {
|
|
57
|
-
if (mod && mod.__esModule) return mod;
|
|
58
|
-
var result = {};
|
|
59
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
60
|
-
__setModuleDefault(result, mod);
|
|
61
|
-
return result;
|
|
62
|
-
};
|
|
63
|
-
})();
|
|
64
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
-
exports.INSTALL_TO_IMPORT = exports.PackageInstaller = void 0;
|
|
66
|
-
exports.createSystemInstaller = createSystemInstaller;
|
|
67
|
-
exports.createVenvInstaller = createVenvInstaller;
|
|
68
|
-
exports.resolveImportName = resolveImportName;
|
|
69
|
-
exports.extractPackageName = extractPackageName;
|
|
70
|
-
const events_1 = require("events");
|
|
71
|
-
const fs = __importStar(require("fs"));
|
|
72
|
-
const path = __importStar(require("path"));
|
|
73
|
-
const logger_1 = require("../utils/logger");
|
|
74
|
-
const executables_1 = require("./executables");
|
|
75
|
-
const pyfig_adapter_1 = require("./pyfig-adapter");
|
|
76
|
-
const logger = new logger_1.Logger('PackageInstaller');
|
|
77
|
-
// Import-name alias table
|
|
78
|
-
// Maps pip install name -> Python import name.
|
|
79
|
-
// Only entries that differ from the install name need to be listed here.
|
|
80
|
-
const INSTALL_TO_IMPORT = {
|
|
81
|
-
'scikit-learn': 'sklearn',
|
|
82
|
-
'scikit_learn': 'sklearn',
|
|
83
|
-
'Pillow': 'PIL',
|
|
84
|
-
'pillow': 'PIL',
|
|
85
|
-
'opencv-python': 'cv2',
|
|
86
|
-
'opencv-python-headless': 'cv2',
|
|
87
|
-
'opencv_python': 'cv2',
|
|
88
|
-
'beautifulsoup4': 'bs4',
|
|
89
|
-
'beautifulsoup': 'bs4',
|
|
90
|
-
'pyyaml': 'yaml',
|
|
91
|
-
'PyYAML': 'yaml',
|
|
92
|
-
'python-dateutil': 'dateutil',
|
|
93
|
-
'python_dateutil': 'dateutil',
|
|
94
|
-
'typing-extensions': 'typing_extensions',
|
|
95
|
-
'typing_extensions': 'typing_extensions',
|
|
96
|
-
'pyzmq': 'zmq',
|
|
97
|
-
'Pyzmq': 'zmq',
|
|
98
|
-
'protobuf': 'google.protobuf',
|
|
99
|
-
'grpcio': 'grpc',
|
|
100
|
-
'psutil': 'psutil',
|
|
101
|
-
'python-dotenv': 'dotenv',
|
|
102
|
-
'python_dotenv': 'dotenv',
|
|
103
|
-
'Werkzeug': 'werkzeug',
|
|
104
|
-
'Flask': 'flask',
|
|
105
|
-
'Django': 'django',
|
|
106
|
-
'Jinja2': 'jinja2',
|
|
107
|
-
'SQLAlchemy': 'sqlalchemy',
|
|
108
|
-
'alembic': 'alembic',
|
|
109
|
-
'aiohttp': 'aiohttp',
|
|
110
|
-
'httpx': 'httpx',
|
|
111
|
-
'fastapi': 'fastapi',
|
|
112
|
-
'starlette': 'starlette',
|
|
113
|
-
'uvicorn': 'uvicorn',
|
|
114
|
-
'gunicorn': 'gunicorn',
|
|
115
|
-
'celery': 'celery',
|
|
116
|
-
'redis': 'redis',
|
|
117
|
-
'pymongo': 'pymongo',
|
|
118
|
-
'motor': 'motor',
|
|
119
|
-
'aiomysql': 'aiomysql',
|
|
120
|
-
'asyncpg': 'asyncpg',
|
|
121
|
-
'psycopg2': 'psycopg2',
|
|
122
|
-
'psycopg2-binary': 'psycopg2',
|
|
123
|
-
'psycopg2_binary': 'psycopg2',
|
|
124
|
-
'boto3': 'boto3',
|
|
125
|
-
'botocore': 'botocore',
|
|
126
|
-
'google-cloud-storage': 'google.cloud.storage',
|
|
127
|
-
'google-auth': 'google.auth',
|
|
128
|
-
'azure-storage-blob': 'azure.storage.blob',
|
|
129
|
-
'minio': 'minio',
|
|
130
|
-
'transformers': 'transformers',
|
|
131
|
-
'datasets': 'datasets',
|
|
132
|
-
'tokenizers': 'tokenizers',
|
|
133
|
-
'diffusers': 'diffusers',
|
|
134
|
-
'accelerate': 'accelerate',
|
|
135
|
-
'peft': 'peft',
|
|
136
|
-
'trl': 'trl',
|
|
137
|
-
'sentence-transformers': 'sentence_transformers',
|
|
138
|
-
'sentence_transformers': 'sentence_transformers',
|
|
139
|
-
'faiss-cpu': 'faiss',
|
|
140
|
-
'faiss-gpu': 'faiss',
|
|
141
|
-
'annoy': 'annoy',
|
|
142
|
-
'chromadb': 'chromadb',
|
|
143
|
-
'pinecone-client': 'pinecone',
|
|
144
|
-
'weaviate-client': 'weaviate',
|
|
145
|
-
'langchain': 'langchain',
|
|
146
|
-
'openai': 'openai',
|
|
147
|
-
'anthropic': 'anthropic',
|
|
148
|
-
'tiktoken': 'tiktoken',
|
|
149
|
-
'matplotlib': 'matplotlib',
|
|
150
|
-
'seaborn': 'seaborn',
|
|
151
|
-
'plotly': 'plotly',
|
|
152
|
-
'bokeh': 'bokeh',
|
|
153
|
-
'altair': 'altair',
|
|
154
|
-
'scipy': 'scipy',
|
|
155
|
-
'statsmodels': 'statsmodels',
|
|
156
|
-
'lightgbm': 'lightgbm',
|
|
157
|
-
'xgboost': 'xgboost',
|
|
158
|
-
'catboost': 'catboost',
|
|
159
|
-
'shap': 'shap',
|
|
160
|
-
'lime': 'lime',
|
|
161
|
-
'sympy': 'sympy',
|
|
162
|
-
'networkx': 'networkx',
|
|
163
|
-
'pyarrow': 'pyarrow',
|
|
164
|
-
'pyarrow[flight]': 'pyarrow',
|
|
165
|
-
'polars': 'polars',
|
|
166
|
-
'dask': 'dask',
|
|
167
|
-
'ray': 'ray',
|
|
168
|
-
'pydantic': 'pydantic',
|
|
169
|
-
'pydantic-settings': 'pydantic_settings',
|
|
170
|
-
'attrs': 'attr',
|
|
171
|
-
'cattrs': 'cattr',
|
|
172
|
-
'click': 'click',
|
|
173
|
-
'typer': 'typer',
|
|
174
|
-
'rich': 'rich',
|
|
175
|
-
'tqdm': 'tqdm',
|
|
176
|
-
'loguru': 'loguru',
|
|
177
|
-
'structlog': 'structlog',
|
|
178
|
-
'pendulum': 'pendulum',
|
|
179
|
-
'arrow': 'arrow',
|
|
180
|
-
'humanize': 'humanize',
|
|
181
|
-
'tabulate': 'tabulate',
|
|
182
|
-
'prettytable': 'prettytable',
|
|
183
|
-
'orjson': 'orjson',
|
|
184
|
-
'ujson': 'ujson',
|
|
185
|
-
'msgpack': 'msgpack',
|
|
186
|
-
'lz4': 'lz4',
|
|
187
|
-
'zstandard': 'zstd',
|
|
188
|
-
'cryptography': 'cryptography',
|
|
189
|
-
'paramiko': 'paramiko',
|
|
190
|
-
'fabric': 'fabric',
|
|
191
|
-
'invoke': 'invoke',
|
|
192
|
-
'pytest': 'pytest',
|
|
193
|
-
'hypothesis': 'hypothesis',
|
|
194
|
-
'mock': 'unittest.mock',
|
|
195
|
-
'freezegun': 'freezegun',
|
|
196
|
-
'factory-boy': 'factory',
|
|
197
|
-
'Faker': 'faker',
|
|
198
|
-
};
|
|
199
|
-
exports.INSTALL_TO_IMPORT = INSTALL_TO_IMPORT;
|
|
200
|
-
// Helpers
|
|
201
|
-
/**
|
|
202
|
-
* Extract the bare package name from a spec string.
|
|
203
|
-
* "numpy>=1.24,<2" -> "numpy"
|
|
204
|
-
* "torch==2.3.0+cu121" -> "torch"
|
|
205
|
-
* "uvicorn[standard]" -> "uvicorn"
|
|
206
|
-
*/
|
|
207
|
-
function extractPackageName(spec) {
|
|
208
|
-
// Remove VCS prefixes (git+https://...)
|
|
209
|
-
if (spec.startsWith('git+') || spec.startsWith('hg+') || spec.startsWith('svn+')) {
|
|
210
|
-
const eggIndex = spec.indexOf('#egg=');
|
|
211
|
-
if (eggIndex !== -1) {
|
|
212
|
-
return spec.slice(eggIndex + 5).split('&')[0].trim();
|
|
213
|
-
}
|
|
214
|
-
return spec;
|
|
215
|
-
}
|
|
216
|
-
// Remove extras [...], then split on version specifiers
|
|
217
|
-
return spec.replace(/\[.*?\]/g, '').split(/[><=!~;]/)[0].trim();
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Determine the Python import name for a given install spec.
|
|
221
|
-
*/
|
|
222
|
-
function resolveImportName(spec, override) {
|
|
223
|
-
if (override) {
|
|
224
|
-
return override;
|
|
225
|
-
}
|
|
226
|
-
const bare = extractPackageName(spec);
|
|
227
|
-
return INSTALL_TO_IMPORT[bare] ?? bare.replace(/-/g, '_');
|
|
228
|
-
}
|
|
229
|
-
/** Sleep helper. */
|
|
230
|
-
function sleep(ms) {
|
|
231
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
232
|
-
}
|
|
233
|
-
// PackageInstaller
|
|
234
|
-
class PackageInstaller extends events_1.EventEmitter {
|
|
235
|
-
_opts;
|
|
236
|
-
_pyfig;
|
|
237
|
-
constructor(options) {
|
|
238
|
-
super();
|
|
239
|
-
this._opts = {
|
|
240
|
-
pythonExecutable: options.pythonExecutable,
|
|
241
|
-
indexUrl: options.indexUrl ?? '',
|
|
242
|
-
extraIndexUrls: options.extraIndexUrls ?? [],
|
|
243
|
-
trustedHosts: options.trustedHosts ?? [],
|
|
244
|
-
maxRetries: options.maxRetries ?? 3,
|
|
245
|
-
retryDelayMs: options.retryDelayMs ?? 1000,
|
|
246
|
-
cwd: options.cwd ?? process.cwd(),
|
|
247
|
-
env: options.env ?? {},
|
|
248
|
-
timeoutMs: options.timeoutMs ?? 300_000,
|
|
249
|
-
quiet: options.quiet !== false,
|
|
250
|
-
upgrade: options.upgrade ?? false,
|
|
251
|
-
};
|
|
252
|
-
this._pyfig = (0, pyfig_adapter_1.createPynectPyfig)({
|
|
253
|
-
projectRoot: this._opts.cwd,
|
|
254
|
-
pythonPath: options.pythonExecutable,
|
|
255
|
-
env: this._opts.env,
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
// Public API
|
|
259
|
-
/**
|
|
260
|
-
* Install one or more packages.
|
|
261
|
-
*
|
|
262
|
-
* @param packages - Array of pip spec strings or PackageSpec objects.
|
|
263
|
-
* @returns InstallResult describing what happened to each package.
|
|
264
|
-
*/
|
|
265
|
-
async install(packages) {
|
|
266
|
-
const specs = packages.map((p) => typeof p === 'string' ? { spec: p } : p);
|
|
267
|
-
for (const item of specs) {
|
|
268
|
-
(0, executables_1.assertPythonPackageSpec)(item.spec);
|
|
269
|
-
if (item.importName && !(0, executables_1.isPythonModuleName)(item.importName)) {
|
|
270
|
-
throw new TypeError(`Invalid Python import name: ${item.importName}`);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
const result = {
|
|
274
|
-
installed: [],
|
|
275
|
-
alreadyInstalled: [],
|
|
276
|
-
failed: [],
|
|
277
|
-
success: false,
|
|
278
|
-
output: '',
|
|
279
|
-
};
|
|
280
|
-
const toInstall = [];
|
|
281
|
-
// 1. Pre-flight: check which are already importable
|
|
282
|
-
for (const spec of specs) {
|
|
283
|
-
const importName = resolveImportName(spec.spec, spec.importName);
|
|
284
|
-
if (!spec.forceReinstall && !this._opts.upgrade && this._isImportable(importName)) {
|
|
285
|
-
logger.debug(`Already importable: ${importName} (${spec.spec})`);
|
|
286
|
-
result.alreadyInstalled.push(spec.spec);
|
|
287
|
-
this._emit('already_installed', spec.spec);
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
toInstall.push(spec);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
if (toInstall.length === 0) {
|
|
294
|
-
result.success = true;
|
|
295
|
-
return result;
|
|
296
|
-
}
|
|
297
|
-
// 2. Install in a single pip invocation where possible
|
|
298
|
-
// Group specs that do not need individual treatment
|
|
299
|
-
const batchSpecs = toInstall.filter((s) => !s.preRelease);
|
|
300
|
-
const prerelSpecs = toInstall.filter((s) => s.preRelease);
|
|
301
|
-
const outputs = [];
|
|
302
|
-
if (batchSpecs.length > 0) {
|
|
303
|
-
const { out, perPackageResults } = await this._pipInstall(batchSpecs, false);
|
|
304
|
-
outputs.push(out);
|
|
305
|
-
this._mergeResults(result, perPackageResults);
|
|
306
|
-
}
|
|
307
|
-
if (prerelSpecs.length > 0) {
|
|
308
|
-
const { out, perPackageResults } = await this._pipInstall(prerelSpecs, true);
|
|
309
|
-
outputs.push(out);
|
|
310
|
-
this._mergeResults(result, perPackageResults);
|
|
311
|
-
}
|
|
312
|
-
result.output = outputs.join('\n');
|
|
313
|
-
result.success = result.failed.length === 0;
|
|
314
|
-
return result;
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Install a single package and return the installed version string.
|
|
318
|
-
* Throws on failure.
|
|
319
|
-
*/
|
|
320
|
-
async installOne(spec, options) {
|
|
321
|
-
const result = await this.install([{ spec, ...options }]);
|
|
322
|
-
if (!result.success) {
|
|
323
|
-
const err = result.failed[0];
|
|
324
|
-
throw new Error(`Failed to install ${spec}: ${err?.error ?? 'unknown error'}`);
|
|
325
|
-
}
|
|
326
|
-
return this.getVersion(extractPackageName(spec)) ?? spec;
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Upgrade a package to the latest version.
|
|
330
|
-
*/
|
|
331
|
-
async upgrade(spec) {
|
|
332
|
-
return this.installOne(spec, { forceReinstall: false });
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* Uninstall one or more packages.
|
|
336
|
-
*/
|
|
337
|
-
async uninstall(packages) {
|
|
338
|
-
if (packages.length === 0) {
|
|
339
|
-
return;
|
|
340
|
-
}
|
|
341
|
-
packages.forEach(executables_1.assertPythonPackageSpec);
|
|
342
|
-
const args = ['uninstall', ...packages];
|
|
343
|
-
logger.info(`Uninstalling: ${packages.join(', ')}`);
|
|
344
|
-
const result = this._pyfig.pipSync(args, {
|
|
345
|
-
encoding: 'utf8',
|
|
346
|
-
cwd: this._opts.cwd,
|
|
347
|
-
env: { ...process.env, ...this._opts.env },
|
|
348
|
-
});
|
|
349
|
-
if (result.status !== 0) {
|
|
350
|
-
throw new Error(`pip uninstall failed:\n${result.stderr}`);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Check whether a package is currently importable by Python.
|
|
355
|
-
*/
|
|
356
|
-
isImportable(importName) {
|
|
357
|
-
return this._isImportable(importName);
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
|
-
* Check whether a package (by install name) is installed and return
|
|
361
|
-
* its version string, or null if not installed.
|
|
362
|
-
*/
|
|
363
|
-
getVersion(packageName) {
|
|
364
|
-
const args = ['show', '--quiet', packageName];
|
|
365
|
-
const r = this._pyfig.pipSync(args, {
|
|
366
|
-
encoding: 'utf8',
|
|
367
|
-
env: { ...process.env, ...this._opts.env },
|
|
368
|
-
});
|
|
369
|
-
const stdout = String(r.stdout ?? '');
|
|
370
|
-
if (r.status !== 0 || !stdout) {
|
|
371
|
-
return null;
|
|
372
|
-
}
|
|
373
|
-
const match = stdout.match(/^Version:\s*(.+)$/m);
|
|
374
|
-
return match ? match[1].trim() : null;
|
|
375
|
-
}
|
|
376
|
-
/**
|
|
377
|
-
* Return full metadata for an installed package.
|
|
378
|
-
*/
|
|
379
|
-
getMetadata(packageName) {
|
|
380
|
-
const args = ['show', packageName];
|
|
381
|
-
const r = this._pyfig.pipSync(args, {
|
|
382
|
-
encoding: 'utf8',
|
|
383
|
-
env: { ...process.env, ...this._opts.env },
|
|
384
|
-
});
|
|
385
|
-
const stdout = String(r.stdout ?? '');
|
|
386
|
-
if (r.status !== 0 || !stdout) {
|
|
387
|
-
return null;
|
|
388
|
-
}
|
|
389
|
-
return this._parsePipShow(stdout);
|
|
390
|
-
}
|
|
391
|
-
/**
|
|
392
|
-
* List all packages installed in the current Python environment.
|
|
393
|
-
*/
|
|
394
|
-
listInstalled() {
|
|
395
|
-
const args = ['list', '--format=json'];
|
|
396
|
-
const r = this._pyfig.pipSync(args, {
|
|
397
|
-
encoding: 'utf8',
|
|
398
|
-
env: { ...process.env, ...this._opts.env },
|
|
399
|
-
});
|
|
400
|
-
const stdout = String(r.stdout ?? '');
|
|
401
|
-
if (r.status !== 0 || !stdout) {
|
|
402
|
-
return [];
|
|
403
|
-
}
|
|
404
|
-
try {
|
|
405
|
-
return JSON.parse(stdout);
|
|
406
|
-
}
|
|
407
|
-
catch {
|
|
408
|
-
return [];
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
/**
|
|
412
|
-
* Check which packages from the given list are missing.
|
|
413
|
-
*
|
|
414
|
-
* @param packages - Array of pip spec strings.
|
|
415
|
-
* @returns Array of spec strings that are NOT currently importable.
|
|
416
|
-
*/
|
|
417
|
-
getMissing(packages) {
|
|
418
|
-
return packages.filter((spec) => {
|
|
419
|
-
const importName = resolveImportName(spec);
|
|
420
|
-
return !this._isImportable(importName);
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
/**
|
|
424
|
-
* Ensure pip itself is up-to-date.
|
|
425
|
-
*/
|
|
426
|
-
async upgradePip() {
|
|
427
|
-
logger.debug('Pyfig uses uv directly; there is no environment-local pip to upgrade.');
|
|
428
|
-
}
|
|
429
|
-
// Private helpers
|
|
430
|
-
/**
|
|
431
|
-
* Run `python -c "import X"` to test importability.
|
|
432
|
-
* This is faster than `pip show` for the common case.
|
|
433
|
-
*/
|
|
434
|
-
_isImportable(importName) {
|
|
435
|
-
// Handle dotted names like "google.protobuf"
|
|
436
|
-
const topLevel = importName.split('.')[0];
|
|
437
|
-
if (!(0, executables_1.isPythonModuleName)(topLevel))
|
|
438
|
-
return false;
|
|
439
|
-
const code = `import importlib; importlib.import_module(${JSON.stringify(topLevel)})`;
|
|
440
|
-
const r = this._pyfig.pythonSync(['-c', code], {
|
|
441
|
-
encoding: 'utf8',
|
|
442
|
-
env: { ...process.env, ...this._opts.env },
|
|
443
|
-
});
|
|
444
|
-
return r.status === 0;
|
|
445
|
-
}
|
|
446
|
-
/**
|
|
447
|
-
* Build pip install argument list.
|
|
448
|
-
*/
|
|
449
|
-
_buildPipArgs(specs, preRelease) {
|
|
450
|
-
const args = ['install'];
|
|
451
|
-
if (this._opts.quiet) {
|
|
452
|
-
args.push('--quiet');
|
|
453
|
-
}
|
|
454
|
-
if (this._opts.upgrade) {
|
|
455
|
-
args.push('--upgrade');
|
|
456
|
-
}
|
|
457
|
-
if (preRelease) {
|
|
458
|
-
args.push('--pre');
|
|
459
|
-
}
|
|
460
|
-
args.push('--no-warn-script-location');
|
|
461
|
-
if (this._opts.indexUrl) {
|
|
462
|
-
args.push('--index-url', this._opts.indexUrl);
|
|
463
|
-
}
|
|
464
|
-
for (const url of this._opts.extraIndexUrls) {
|
|
465
|
-
args.push('--extra-index-url', url);
|
|
466
|
-
}
|
|
467
|
-
for (const host of this._opts.trustedHosts) {
|
|
468
|
-
args.push('--trusted-host', host);
|
|
469
|
-
}
|
|
470
|
-
for (const s of specs) {
|
|
471
|
-
if (s.forceReinstall) {
|
|
472
|
-
args.push('--force-reinstall');
|
|
473
|
-
}
|
|
474
|
-
args.push(s.spec);
|
|
475
|
-
}
|
|
476
|
-
return args;
|
|
477
|
-
}
|
|
478
|
-
/**
|
|
479
|
-
* Execute pip install with retry logic.
|
|
480
|
-
*/
|
|
481
|
-
async _pipInstall(specs, preRelease) {
|
|
482
|
-
const args = this._buildPipArgs(specs, preRelease);
|
|
483
|
-
const specList = specs.map((s) => s.spec).join(', ');
|
|
484
|
-
logger.info(`pip install: ${specList}`);
|
|
485
|
-
specs.forEach((s) => this._emit('installing', s.spec));
|
|
486
|
-
let lastError = '';
|
|
487
|
-
let lastOut = '';
|
|
488
|
-
for (let attempt = 1; attempt <= this._opts.maxRetries; attempt++) {
|
|
489
|
-
const { exitCode, stdout } = await this._runPip(args);
|
|
490
|
-
lastOut = stdout;
|
|
491
|
-
if (exitCode === 0) {
|
|
492
|
-
// Success - resolve versions
|
|
493
|
-
const results = specs.map((s) => {
|
|
494
|
-
const name = extractPackageName(s.spec);
|
|
495
|
-
const version = this.getVersion(name) ?? undefined;
|
|
496
|
-
this._emit('installed', s.spec, version);
|
|
497
|
-
return { spec: s.spec, status: 'installed', version };
|
|
498
|
-
});
|
|
499
|
-
return { out: stdout, perPackageResults: results };
|
|
500
|
-
}
|
|
501
|
-
lastError = stdout;
|
|
502
|
-
const isNetworkError = /connection error|timed out|network/i.test(stdout);
|
|
503
|
-
if (!isNetworkError || attempt === this._opts.maxRetries) {
|
|
504
|
-
break;
|
|
505
|
-
}
|
|
506
|
-
const delay = this._opts.retryDelayMs * 2 ** (attempt - 1);
|
|
507
|
-
logger.warn(`pip attempt ${attempt} failed (network). Retrying in ${delay}ms`);
|
|
508
|
-
await sleep(delay);
|
|
509
|
-
}
|
|
510
|
-
// Failure path - try each spec individually to isolate the bad one
|
|
511
|
-
const results = [];
|
|
512
|
-
if (specs.length > 1) {
|
|
513
|
-
logger.warn('Batch install failed; falling back to per-package install');
|
|
514
|
-
for (const s of specs) {
|
|
515
|
-
const single = await this._pipInstall([s], preRelease);
|
|
516
|
-
results.push(...single.perPackageResults);
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
else {
|
|
520
|
-
const s = specs[0];
|
|
521
|
-
logger.error(`Failed to install ${s.spec}: ${lastError.slice(0, 200)}`);
|
|
522
|
-
this._emit('failed', s.spec, undefined, lastError);
|
|
523
|
-
results.push({ spec: s.spec, status: 'failed', error: lastError });
|
|
524
|
-
}
|
|
525
|
-
return { out: lastOut, perPackageResults: results };
|
|
526
|
-
}
|
|
527
|
-
/**
|
|
528
|
-
* Spawn pip and collect output.
|
|
529
|
-
*/
|
|
530
|
-
async _runPip(args) {
|
|
531
|
-
const proc = await this._pyfig.pip(args, {
|
|
532
|
-
cwd: this._opts.cwd,
|
|
533
|
-
env: { ...process.env, ...this._opts.env },
|
|
534
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
535
|
-
});
|
|
536
|
-
return new Promise((resolve) => {
|
|
537
|
-
let stdout = '';
|
|
538
|
-
proc.stdout?.on('data', (d) => { stdout += d.toString(); });
|
|
539
|
-
proc.stderr?.on('data', (d) => { stdout += d.toString(); });
|
|
540
|
-
const timer = setTimeout(() => {
|
|
541
|
-
proc.kill('SIGKILL');
|
|
542
|
-
stdout += '\n[TIMEOUT]';
|
|
543
|
-
}, this._opts.timeoutMs);
|
|
544
|
-
proc.on('close', (code) => {
|
|
545
|
-
clearTimeout(timer);
|
|
546
|
-
resolve({ exitCode: code ?? 1, stdout });
|
|
547
|
-
});
|
|
548
|
-
});
|
|
549
|
-
}
|
|
550
|
-
/** Merge per-package results into the aggregate InstallResult. */
|
|
551
|
-
_mergeResults(result, perPackage) {
|
|
552
|
-
for (const r of perPackage) {
|
|
553
|
-
if (r.status === 'installed' || r.status === 'upgraded') {
|
|
554
|
-
result.installed.push(r.version ? `${r.spec}==${r.version}` : r.spec);
|
|
555
|
-
}
|
|
556
|
-
else if (r.status === 'already_installed') {
|
|
557
|
-
result.alreadyInstalled.push(r.spec);
|
|
558
|
-
}
|
|
559
|
-
else if (r.status === 'failed') {
|
|
560
|
-
result.failed.push({ spec: r.spec, error: r.error ?? 'unknown' });
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
/** Emit a typed progress event. */
|
|
565
|
-
_emit(status, pkg, version, error) {
|
|
566
|
-
const ev = { package: pkg, status, version, error };
|
|
567
|
-
this.emit('progress', ev);
|
|
568
|
-
}
|
|
569
|
-
/** Parse `pip show` output into PackageMetadata. */
|
|
570
|
-
_parsePipShow(raw) {
|
|
571
|
-
const get = (field) => {
|
|
572
|
-
const m = raw.match(new RegExp(`^${field}:\\s*(.*)$`, 'm'));
|
|
573
|
-
return m ? m[1].trim() : '';
|
|
574
|
-
};
|
|
575
|
-
const getList = (field) => {
|
|
576
|
-
const val = get(field);
|
|
577
|
-
return val ? val.split(/,\s*/).filter(Boolean) : [];
|
|
578
|
-
};
|
|
579
|
-
return {
|
|
580
|
-
name: get('Name'),
|
|
581
|
-
version: get('Version'),
|
|
582
|
-
location: get('Location'),
|
|
583
|
-
summary: get('Summary'),
|
|
584
|
-
requires: getList('Requires'),
|
|
585
|
-
requiredBy: getList('Required-by'),
|
|
586
|
-
};
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
exports.PackageInstaller = PackageInstaller;
|
|
590
|
-
// Factory helpers
|
|
591
|
-
/**
|
|
592
|
-
* Create an installer seeded from a system Python, while targeting the
|
|
593
|
-
* application environment selected by Pyfig.
|
|
594
|
-
*/
|
|
595
|
-
function createSystemInstaller(options) {
|
|
596
|
-
const python = process.env['PYNECT_PYTHON'] ?? '';
|
|
597
|
-
return new PackageInstaller({ pythonExecutable: python, ...options });
|
|
598
|
-
}
|
|
599
|
-
/**
|
|
600
|
-
* Create a PackageInstaller tied to a specific virtualenv directory.
|
|
601
|
-
*/
|
|
602
|
-
function createVenvInstaller(venvDir, options) {
|
|
603
|
-
const bin = process.platform === 'win32'
|
|
604
|
-
? path.join(venvDir, 'Scripts', 'python.exe')
|
|
605
|
-
: path.join(venvDir, 'bin', 'python');
|
|
606
|
-
if (!fs.existsSync(bin)) {
|
|
607
|
-
throw new Error(`Virtualenv python not found at: ${bin}`);
|
|
608
|
-
}
|
|
609
|
-
return new PackageInstaller({
|
|
610
|
-
pythonExecutable: bin,
|
|
611
|
-
cwd: options?.cwd ?? process.cwd(),
|
|
612
|
-
...options,
|
|
613
|
-
});
|
|
614
|
-
}
|
|
615
|
-
//# sourceMappingURL=package-installer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"package-installer.js","sourceRoot":"","sources":["../../src/env/package-installer.ts"],"names":[],"mappings":"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"}
|