From f30f4d688dc15b0385e340144607790411fea92b Mon Sep 17 00:00:00 2001 From: Andrey Avtomonov Date: Mon, 11 May 2026 12:00:01 +0200 Subject: [PATCH] refactor: share managed runtime install policy parsing --- packages/cli/src/commands/sl-commands.ts | 14 ++------------ packages/cli/src/managed-python-command.test.ts | 16 ++++++++++++++++ packages/cli/src/managed-python-command.ts | 13 +++++++++++++ 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/packages/cli/src/commands/sl-commands.ts b/packages/cli/src/commands/sl-commands.ts index 8627dd83..36d75fac 100644 --- a/packages/cli/src/commands/sl-commands.ts +++ b/packages/cli/src/commands/sl-commands.ts @@ -6,7 +6,7 @@ import { resolveCommandProjectDir, } from '../cli-program.js'; import { slQueryCommandSchema } from '../command-schemas.js'; -import type { KtxManagedPythonInstallPolicy } from '../managed-python-command.js'; +import { runtimeInstallPolicyFromFlags } from '../managed-python-command.js'; import type { KtxSlArgs } from '../sl.js'; import { profileMark } from '../startup-profile.js'; @@ -33,16 +33,6 @@ function collectOrderBy( return [...previous, parseOrderBy(value)]; } -function runtimeInstallPolicy(options: { yes?: boolean; input?: boolean }): KtxManagedPythonInstallPolicy { - if (options.yes === true && options.input === false) { - throw new Error('Choose only one runtime install mode: --yes or --no-input'); - } - if (options.yes === true) { - return 'auto'; - } - return options.input === false ? 'never' : 'prompt'; -} - async function runSlArgs(context: KtxCliCommandContext, args: KtxSlArgs): Promise { const runner = context.deps.sl ?? (await import('../sl.js')).runKtxSl; context.setExitCode(await runner(args, context.io)); @@ -155,7 +145,7 @@ export function registerSlCommands(program: Command, context: KtxCliCommandConte format: options.format, execute: options.execute === true, cliVersion: context.packageInfo.version, - runtimeInstallPolicy: runtimeInstallPolicy(options), + runtimeInstallPolicy: runtimeInstallPolicyFromFlags(options), ...(options.maxRows !== undefined ? { maxRows: options.maxRows } : {}), }); await runSlArgs(context, args); diff --git a/packages/cli/src/managed-python-command.test.ts b/packages/cli/src/managed-python-command.test.ts index 91244f53..d081c320 100644 --- a/packages/cli/src/managed-python-command.test.ts +++ b/packages/cli/src/managed-python-command.test.ts @@ -2,6 +2,7 @@ import { describe, expect, it, vi } from 'vitest'; import { createManagedPythonSemanticLayerComputePort, managedRuntimeInstallCommand, + runtimeInstallPolicyFromFlags, } from './managed-python-command.js'; import type { InstalledKtxRuntimeManifest, @@ -114,6 +115,21 @@ describe('managedRuntimeInstallCommand', () => { }); }); +describe('runtimeInstallPolicyFromFlags', () => { + it('maps command flags to managed runtime install policies', () => { + expect(runtimeInstallPolicyFromFlags({})).toBe('prompt'); + expect(runtimeInstallPolicyFromFlags({ yes: false })).toBe('prompt'); + expect(runtimeInstallPolicyFromFlags({ yes: true })).toBe('auto'); + expect(runtimeInstallPolicyFromFlags({ input: false })).toBe('never'); + }); + + it('rejects conflicting runtime install flags', () => { + expect(() => runtimeInstallPolicyFromFlags({ yes: true, input: false })).toThrow( + 'Choose only one runtime install mode: --yes or --no-input', + ); + }); +}); + describe('createManagedPythonSemanticLayerComputePort', () => { it('uses the managed ktx-daemon executable when the runtime is ready', async () => { const io = makeIo(); diff --git a/packages/cli/src/managed-python-command.ts b/packages/cli/src/managed-python-command.ts index 71665b56..0a8a193c 100644 --- a/packages/cli/src/managed-python-command.ts +++ b/packages/cli/src/managed-python-command.ts @@ -15,6 +15,19 @@ import { export type KtxManagedPythonInstallPolicy = 'prompt' | 'auto' | 'never'; +export function runtimeInstallPolicyFromFlags(options: { + yes?: boolean; + input?: boolean; +}): KtxManagedPythonInstallPolicy { + if (options.yes === true && options.input === false) { + throw new Error('Choose only one runtime install mode: --yes or --no-input'); + } + if (options.yes === true) { + return 'auto'; + } + return options.input === false ? 'never' : 'prompt'; +} + export interface ManagedPythonCommandRuntime { layout: ManagedPythonRuntimeLayout; manifest: InstalledKtxRuntimeManifest;