@kernlang/python 3.5.2
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 +678 -0
- package/README.md +26 -0
- package/dist/codegen-body-python.d.ts +152 -0
- package/dist/codegen-body-python.js +1648 -0
- package/dist/codegen-body-python.js.map +1 -0
- package/dist/codegen-helpers.d.ts +21 -0
- package/dist/codegen-helpers.js +352 -0
- package/dist/codegen-helpers.js.map +1 -0
- package/dist/codegen-python.d.ts +17 -0
- package/dist/codegen-python.js +106 -0
- package/dist/codegen-python.js.map +1 -0
- package/dist/fastapi-middleware.d.ts +8 -0
- package/dist/fastapi-middleware.js +87 -0
- package/dist/fastapi-middleware.js.map +1 -0
- package/dist/fastapi-portable.d.ts +9 -0
- package/dist/fastapi-portable.js +295 -0
- package/dist/fastapi-portable.js.map +1 -0
- package/dist/fastapi-raw-handler.d.ts +28 -0
- package/dist/fastapi-raw-handler.js +282 -0
- package/dist/fastapi-raw-handler.js.map +1 -0
- package/dist/fastapi-response.d.ts +13 -0
- package/dist/fastapi-response.js +150 -0
- package/dist/fastapi-response.js.map +1 -0
- package/dist/fastapi-route.d.ts +12 -0
- package/dist/fastapi-route.js +629 -0
- package/dist/fastapi-route.js.map +1 -0
- package/dist/fastapi-types.d.ts +39 -0
- package/dist/fastapi-types.js +5 -0
- package/dist/fastapi-types.js.map +1 -0
- package/dist/fastapi-utils.d.ts +16 -0
- package/dist/fastapi-utils.js +99 -0
- package/dist/fastapi-utils.js.map +1 -0
- package/dist/fastapi-websocket.d.ts +6 -0
- package/dist/fastapi-websocket.js +77 -0
- package/dist/fastapi-websocket.js.map +1 -0
- package/dist/generators/core.d.ts +23 -0
- package/dist/generators/core.js +906 -0
- package/dist/generators/core.js.map +1 -0
- package/dist/generators/data.d.ts +15 -0
- package/dist/generators/data.js +443 -0
- package/dist/generators/data.js.map +1 -0
- package/dist/generators/ground.d.ts +20 -0
- package/dist/generators/ground.js +333 -0
- package/dist/generators/ground.js.map +1 -0
- package/dist/generators/infra.d.ts +8 -0
- package/dist/generators/infra.js +109 -0
- package/dist/generators/infra.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/ir-semantics/python-leg.d.ts +45 -0
- package/dist/ir-semantics/python-leg.js +291 -0
- package/dist/ir-semantics/python-leg.js.map +1 -0
- package/dist/python-stdlib-preamble.d.ts +32 -0
- package/dist/python-stdlib-preamble.js +86 -0
- package/dist/python-stdlib-preamble.js.map +1 -0
- package/dist/transpiler-fastapi.d.ts +8 -0
- package/dist/transpiler-fastapi.js +593 -0
- package/dist/transpiler-fastapi.js.map +1 -0
- package/dist/type-map.d.ts +14 -0
- package/dist/type-map.js +288 -0
- package/dist/type-map.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ground Layer generators — Python generation for KERN's ground-truth nodes:
|
|
3
|
+
* derive, transform, action, guard, assume, invariant, each, collect, branch, resolve, expect, recover
|
|
4
|
+
*/
|
|
5
|
+
import { handlerCode } from '@kernlang/core';
|
|
6
|
+
import { buildPythonParamList, emitPyLowConfidenceTodo, emitPyReasonAnnotations, firstChild, kids, p, } from '../codegen-helpers.js';
|
|
7
|
+
import { mapTsTypeToPython, toSnakeCase } from '../type-map.js';
|
|
8
|
+
/**
|
|
9
|
+
* Common preamble extracted from all ground layer generators.
|
|
10
|
+
* Returns { annotations, todo, props, name } ready for use.
|
|
11
|
+
*/
|
|
12
|
+
function groundPreamble(node) {
|
|
13
|
+
const annotations = emitPyReasonAnnotations(node);
|
|
14
|
+
const conf = p(node).confidence;
|
|
15
|
+
const todo = emitPyLowConfidenceTodo(node, conf);
|
|
16
|
+
const props = p(node);
|
|
17
|
+
const name = toSnakeCase(props.name);
|
|
18
|
+
return { annotations, todo, props, name };
|
|
19
|
+
}
|
|
20
|
+
// ── derive ──────────────────────────────────────────────────────────────
|
|
21
|
+
export function generateDerive(node) {
|
|
22
|
+
const { annotations, todo, props, name } = groundPreamble(node);
|
|
23
|
+
const expr = props.expr;
|
|
24
|
+
const constType = props.type;
|
|
25
|
+
const typeAnnotation = constType ? `: ${mapTsTypeToPython(constType)}` : '';
|
|
26
|
+
return [...todo, ...annotations, `${name}${typeAnnotation} = ${expr}`];
|
|
27
|
+
}
|
|
28
|
+
// ── transform ───────────────────────────────────────────────────────────
|
|
29
|
+
export function generateTransform(node) {
|
|
30
|
+
const { annotations, todo, props, name } = groundPreamble(node);
|
|
31
|
+
const target = props.target;
|
|
32
|
+
const via = props.via;
|
|
33
|
+
const constType = props.type;
|
|
34
|
+
const code = handlerCode(node);
|
|
35
|
+
const typeAnnotation = constType ? `: ${mapTsTypeToPython(constType)}` : '';
|
|
36
|
+
if (code) {
|
|
37
|
+
const lines = [...todo, ...annotations];
|
|
38
|
+
lines.push(`def ${name}(state)${typeAnnotation}:`);
|
|
39
|
+
for (const line of code.split('\n')) {
|
|
40
|
+
lines.push(` ${line}`);
|
|
41
|
+
}
|
|
42
|
+
return lines;
|
|
43
|
+
}
|
|
44
|
+
if (target && via) {
|
|
45
|
+
return [
|
|
46
|
+
...todo,
|
|
47
|
+
...annotations,
|
|
48
|
+
`${name}${typeAnnotation} = ${via.replace(/\(/, `(${target}, `).replace(/, \)/, ')')}`,
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
if (via) {
|
|
52
|
+
return [...todo, ...annotations, `${name}${typeAnnotation} = ${via}`];
|
|
53
|
+
}
|
|
54
|
+
return [...todo, ...annotations, `${name}${typeAnnotation} = None`];
|
|
55
|
+
}
|
|
56
|
+
// ── action ──────────────────────────────────────────────────────────────
|
|
57
|
+
export function generateAction(node) {
|
|
58
|
+
const { annotations, todo, props, name } = groundPreamble(node);
|
|
59
|
+
const idempotent = props.idempotent === 'true' || props.idempotent === true;
|
|
60
|
+
const reversible = props.reversible === 'true' || props.reversible === true;
|
|
61
|
+
const returns = props.returns;
|
|
62
|
+
const code = handlerCode(node);
|
|
63
|
+
// Slice 3c P2 follow-up: target-neutral helper reads structured `param`
|
|
64
|
+
// children when present, falls back to legacy `params="..."` otherwise.
|
|
65
|
+
const paramList = buildPythonParamList(node);
|
|
66
|
+
const retClause = returns ? ` -> ${mapTsTypeToPython(returns)}` : ' -> None';
|
|
67
|
+
const lines = [...todo, ...annotations];
|
|
68
|
+
lines.push(`async def ${name}(${paramList})${retClause}:`);
|
|
69
|
+
// Docstring with metadata
|
|
70
|
+
const metaParts = [];
|
|
71
|
+
if (idempotent)
|
|
72
|
+
metaParts.push('idempotent=True');
|
|
73
|
+
if (reversible)
|
|
74
|
+
metaParts.push('reversible=True');
|
|
75
|
+
if (metaParts.length > 0) {
|
|
76
|
+
lines.push(` """@action ${metaParts.join(' ')}"""`);
|
|
77
|
+
}
|
|
78
|
+
if (code) {
|
|
79
|
+
for (const line of code.split('\n')) {
|
|
80
|
+
lines.push(` ${line}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
lines.push(' pass');
|
|
85
|
+
}
|
|
86
|
+
return lines;
|
|
87
|
+
}
|
|
88
|
+
// ── guard ───────────────────────────────────────────────────────────────
|
|
89
|
+
export function generateGuard(node) {
|
|
90
|
+
const annotations = emitPyReasonAnnotations(node);
|
|
91
|
+
const conf = p(node).confidence;
|
|
92
|
+
const todo = emitPyLowConfidenceTodo(node, conf);
|
|
93
|
+
const props = p(node);
|
|
94
|
+
const name = props.name || 'guard';
|
|
95
|
+
const expr = props.expr;
|
|
96
|
+
const elseCode = props.else;
|
|
97
|
+
if (elseCode && /^\d+$/.test(elseCode)) {
|
|
98
|
+
return [
|
|
99
|
+
...todo,
|
|
100
|
+
...annotations,
|
|
101
|
+
`if not (${expr}):\n raise HTTPException(status_code=${elseCode}, detail="Guard: ${name}")`,
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
else if (elseCode) {
|
|
105
|
+
return [...todo, ...annotations, `if not (${expr}):\n ${elseCode}`];
|
|
106
|
+
}
|
|
107
|
+
return [...todo, ...annotations, `if not (${expr}):\n raise ValueError("Guard failed: ${name}")`];
|
|
108
|
+
}
|
|
109
|
+
// ── assume ──────────────────────────────────────────────────────────────
|
|
110
|
+
export function generateAssume(node) {
|
|
111
|
+
const annotations = emitPyReasonAnnotations(node);
|
|
112
|
+
const conf = p(node).confidence;
|
|
113
|
+
const todo = emitPyLowConfidenceTodo(node, conf);
|
|
114
|
+
const props = p(node);
|
|
115
|
+
const expr = props.expr;
|
|
116
|
+
const name = props.name || 'assumption';
|
|
117
|
+
return [...todo, ...annotations, `assert ${expr}, "Assume failed: ${name}"`];
|
|
118
|
+
}
|
|
119
|
+
// ── invariant ───────────────────────────────────────────────────────────
|
|
120
|
+
export function generateInvariant(node) {
|
|
121
|
+
const annotations = emitPyReasonAnnotations(node);
|
|
122
|
+
const conf = p(node).confidence;
|
|
123
|
+
const todo = emitPyLowConfidenceTodo(node, conf);
|
|
124
|
+
const props = p(node);
|
|
125
|
+
const name = props.name || 'invariant';
|
|
126
|
+
const expr = props.expr;
|
|
127
|
+
return [...todo, ...annotations, `assert ${expr}, "Invariant: ${name}"`];
|
|
128
|
+
}
|
|
129
|
+
let _dispatcher = () => [];
|
|
130
|
+
/** Set the dispatcher function to break the circular dependency. */
|
|
131
|
+
export function setDispatcher(fn) {
|
|
132
|
+
_dispatcher = fn;
|
|
133
|
+
}
|
|
134
|
+
export function generateEach(node) {
|
|
135
|
+
const annotations = emitPyReasonAnnotations(node);
|
|
136
|
+
const conf = p(node).confidence;
|
|
137
|
+
const todo = emitPyLowConfidenceTodo(node, conf);
|
|
138
|
+
const props = p(node);
|
|
139
|
+
const name = props.name || 'item';
|
|
140
|
+
const collection = props.in;
|
|
141
|
+
const index = props.index;
|
|
142
|
+
const isAwait = props.await === true || props.await === 'true';
|
|
143
|
+
const lines = [...todo, ...annotations];
|
|
144
|
+
if (index) {
|
|
145
|
+
if (isAwait) {
|
|
146
|
+
throw new Error('each await=true cannot be combined with index=');
|
|
147
|
+
}
|
|
148
|
+
lines.push(`for ${index}, ${name} in enumerate(${collection}):`);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
lines.push(`${isAwait ? 'async ' : ''}for ${name} in ${collection}:`);
|
|
152
|
+
}
|
|
153
|
+
const children = kids(node);
|
|
154
|
+
if (children.length === 0) {
|
|
155
|
+
lines.push(' pass');
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
for (const child of children) {
|
|
159
|
+
const childLines = _dispatcher(child);
|
|
160
|
+
for (const line of childLines) {
|
|
161
|
+
lines.push(` ${line}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return lines;
|
|
166
|
+
}
|
|
167
|
+
// ── collect ─────────────────────────────────────────────────────────────
|
|
168
|
+
export function generateCollect(node) {
|
|
169
|
+
const { annotations, todo, props, name } = groundPreamble(node);
|
|
170
|
+
const from = props.from;
|
|
171
|
+
const where = props.where;
|
|
172
|
+
const limit = props.limit;
|
|
173
|
+
if (where && limit) {
|
|
174
|
+
return [...todo, ...annotations, `${name} = [item for item in ${from} if ${where}][:${limit}]`];
|
|
175
|
+
}
|
|
176
|
+
if (where) {
|
|
177
|
+
return [...todo, ...annotations, `${name} = [item for item in ${from} if ${where}]`];
|
|
178
|
+
}
|
|
179
|
+
if (limit) {
|
|
180
|
+
return [...todo, ...annotations, `${name} = ${from}[:${limit}]`];
|
|
181
|
+
}
|
|
182
|
+
return [...todo, ...annotations, `${name} = list(${from})`];
|
|
183
|
+
}
|
|
184
|
+
// ── branch / path ───────────────────────────────────────────────────────
|
|
185
|
+
export function generateBranch(node) {
|
|
186
|
+
const annotations = emitPyReasonAnnotations(node);
|
|
187
|
+
const conf = p(node).confidence;
|
|
188
|
+
const todo = emitPyLowConfidenceTodo(node, conf);
|
|
189
|
+
const props = p(node);
|
|
190
|
+
const name = props.name || 'branch';
|
|
191
|
+
const on = props.on;
|
|
192
|
+
const paths = kids(node, 'path');
|
|
193
|
+
const lines = [...todo, ...annotations];
|
|
194
|
+
lines.push(`# branch: ${name}`);
|
|
195
|
+
lines.push(`match ${on}:`);
|
|
196
|
+
for (const pathNode of paths) {
|
|
197
|
+
const pp = p(pathNode);
|
|
198
|
+
const value = pp.value;
|
|
199
|
+
lines.push(` case "${value}":`);
|
|
200
|
+
const children = kids(pathNode);
|
|
201
|
+
if (children.length === 0) {
|
|
202
|
+
lines.push(' pass');
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
for (const child of children) {
|
|
206
|
+
const childLines = _dispatcher(child);
|
|
207
|
+
for (const line of childLines) {
|
|
208
|
+
lines.push(` ${line}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return lines;
|
|
214
|
+
}
|
|
215
|
+
// ── resolve ─────────────────────────────────────────────────────────────
|
|
216
|
+
export function generateResolve(node) {
|
|
217
|
+
const { annotations, todo, name } = groundPreamble(node);
|
|
218
|
+
const candidates = kids(node, 'candidate');
|
|
219
|
+
const discriminator = firstChild(node, 'discriminator');
|
|
220
|
+
if (!discriminator)
|
|
221
|
+
return [`# resolve: ${name} — missing discriminator`];
|
|
222
|
+
const dp = p(discriminator);
|
|
223
|
+
const method = dp.method || 'select';
|
|
224
|
+
const metric = dp.metric || '';
|
|
225
|
+
const lines = [...todo, ...annotations];
|
|
226
|
+
lines.push(`# resolve: ${name}`);
|
|
227
|
+
lines.push(`_${name}_candidates = [`);
|
|
228
|
+
for (const c of candidates) {
|
|
229
|
+
const cp = p(c);
|
|
230
|
+
const cname = cp.name;
|
|
231
|
+
const code = handlerCode(c);
|
|
232
|
+
lines.push(` {"name": "${cname}", "fn": lambda signal: ${code.trim() || 'None'}},`);
|
|
233
|
+
}
|
|
234
|
+
lines.push(`]`);
|
|
235
|
+
lines.push('');
|
|
236
|
+
const discCode = handlerCode(discriminator);
|
|
237
|
+
lines.push(`async def resolve_${name}(signal):`);
|
|
238
|
+
lines.push(` candidates = _${name}_candidates`);
|
|
239
|
+
lines.push(` # discriminator: ${method}(${metric})`);
|
|
240
|
+
if (discCode) {
|
|
241
|
+
for (const line of discCode.split('\n')) {
|
|
242
|
+
lines.push(` ${line}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
lines.push(` return candidates[winner_idx]["fn"](signal)`);
|
|
246
|
+
return lines;
|
|
247
|
+
}
|
|
248
|
+
// ── expect ──────────────────────────────────────────────────────────────
|
|
249
|
+
export function generateExpect(node) {
|
|
250
|
+
const annotations = emitPyReasonAnnotations(node);
|
|
251
|
+
const conf = p(node).confidence;
|
|
252
|
+
const todo = emitPyLowConfidenceTodo(node, conf);
|
|
253
|
+
const props = p(node);
|
|
254
|
+
const name = toSnakeCase(props.name || 'expected');
|
|
255
|
+
const expr = props.expr;
|
|
256
|
+
const within = props.within;
|
|
257
|
+
const max = props.max;
|
|
258
|
+
const min = props.min;
|
|
259
|
+
if (within) {
|
|
260
|
+
const [lo, hi] = within.split('..');
|
|
261
|
+
return [
|
|
262
|
+
...todo,
|
|
263
|
+
...annotations,
|
|
264
|
+
`assert ${lo} <= (${expr}) <= ${hi}, f"Expected ${name} in [${lo}, ${hi}], got {${expr}}"`,
|
|
265
|
+
];
|
|
266
|
+
}
|
|
267
|
+
if (min && max) {
|
|
268
|
+
return [
|
|
269
|
+
...todo,
|
|
270
|
+
...annotations,
|
|
271
|
+
`assert ${min} <= (${expr}) <= ${max}, f"Expected ${name} in [${min}, ${max}], got {${expr}}"`,
|
|
272
|
+
];
|
|
273
|
+
}
|
|
274
|
+
if (max) {
|
|
275
|
+
return [...todo, ...annotations, `assert (${expr}) <= ${max}, f"Expected ${name} <= ${max}, got {${expr}}"`];
|
|
276
|
+
}
|
|
277
|
+
if (min) {
|
|
278
|
+
return [...todo, ...annotations, `assert (${expr}) >= ${min}, f"Expected ${name} >= ${min}, got {${expr}}"`];
|
|
279
|
+
}
|
|
280
|
+
return [...todo, ...annotations, `assert (${expr}) is not None, "Expected ${name} to be defined"`];
|
|
281
|
+
}
|
|
282
|
+
// ── recover ─────────────────────────────────────────────────────────────
|
|
283
|
+
export function generateRecover(node) {
|
|
284
|
+
const { annotations, todo, name } = groundPreamble(node);
|
|
285
|
+
const strategies = kids(node, 'strategy');
|
|
286
|
+
const lines = [...todo, ...annotations];
|
|
287
|
+
lines.push(`# recover: ${name}`);
|
|
288
|
+
lines.push(`async def ${name}_with_recovery(fn):`);
|
|
289
|
+
for (const strategy of strategies) {
|
|
290
|
+
const sp = p(strategy);
|
|
291
|
+
const sname = sp.name;
|
|
292
|
+
const code = handlerCode(strategy);
|
|
293
|
+
if (sname === 'retry') {
|
|
294
|
+
const max = Number(sp.max) || 3;
|
|
295
|
+
const delay = Number(sp.delay) || 1000;
|
|
296
|
+
lines.push(` # strategy: retry (max=${max}, delay=${delay}ms)`);
|
|
297
|
+
lines.push(` import asyncio`);
|
|
298
|
+
lines.push(` for _attempt in range(${max}):`);
|
|
299
|
+
lines.push(` try:`);
|
|
300
|
+
lines.push(` return await fn()`);
|
|
301
|
+
lines.push(` except Exception:`);
|
|
302
|
+
lines.push(` if _attempt < ${max - 1}:`);
|
|
303
|
+
lines.push(` await asyncio.sleep(${delay / 1000})`);
|
|
304
|
+
}
|
|
305
|
+
else if (sname === 'fallback') {
|
|
306
|
+
lines.push(` # strategy: fallback (terminal)`);
|
|
307
|
+
if (code) {
|
|
308
|
+
for (const line of code.split('\n')) {
|
|
309
|
+
lines.push(` ${line}`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
lines.push(` raise RuntimeError("All recovery strategies exhausted for ${name}")`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
lines.push(` # strategy: ${sname}`);
|
|
318
|
+
lines.push(` try:`);
|
|
319
|
+
if (code) {
|
|
320
|
+
for (const line of code.split('\n')) {
|
|
321
|
+
lines.push(` ${line}`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
lines.push(` pass`);
|
|
326
|
+
}
|
|
327
|
+
lines.push(` except Exception:`);
|
|
328
|
+
lines.push(` pass`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return lines;
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=ground.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ground.js","sourceRoot":"","sources":["../../src/generators/ground.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure generators — Python generation for KERN's infra nodes:
|
|
3
|
+
* job, storage, email
|
|
4
|
+
*/
|
|
5
|
+
import type { IRNode } from '@kernlang/core';
|
|
6
|
+
export declare function generatePythonJob(node: IRNode): string[];
|
|
7
|
+
export declare function generatePythonStorage(node: IRNode): string[];
|
|
8
|
+
export declare function generatePythonEmail(node: IRNode): string[];
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure generators — Python generation for KERN's infra nodes:
|
|
3
|
+
* job, storage, email
|
|
4
|
+
*/
|
|
5
|
+
import { handlerCode } from '@kernlang/core';
|
|
6
|
+
import { kids, p } from '../codegen-helpers.js';
|
|
7
|
+
import { mapTsTypeToPython, toSnakeCase } from '../type-map.js';
|
|
8
|
+
// ── Job (arq worker) ────────────────────────────────────────────────────
|
|
9
|
+
export function generatePythonJob(node) {
|
|
10
|
+
const props = p(node);
|
|
11
|
+
const name = toSnakeCase(props.name || 'job');
|
|
12
|
+
const _queue = props.queue || name;
|
|
13
|
+
const code = handlerCode(node);
|
|
14
|
+
const lines = [];
|
|
15
|
+
lines.push(`# Run: arq main.WorkerSettings`);
|
|
16
|
+
lines.push(`from arq import create_pool, func`);
|
|
17
|
+
lines.push(`from arq.connections import RedisSettings`);
|
|
18
|
+
lines.push('');
|
|
19
|
+
lines.push(`async def ${name}(ctx${kids(node, 'field').length > 0
|
|
20
|
+
? ', ' +
|
|
21
|
+
kids(node, 'field')
|
|
22
|
+
.map((f) => `${toSnakeCase(p(f).name)}: ${mapTsTypeToPython(p(f).type || 'Any')}`)
|
|
23
|
+
.join(', ')
|
|
24
|
+
: ''}):`);
|
|
25
|
+
if (code) {
|
|
26
|
+
for (const line of code.split('\n'))
|
|
27
|
+
lines.push(` ${line}`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
lines.push(` pass`);
|
|
31
|
+
}
|
|
32
|
+
lines.push('');
|
|
33
|
+
lines.push('');
|
|
34
|
+
lines.push(`class WorkerSettings:`);
|
|
35
|
+
lines.push(` functions = [func(${name}, name="${name}")]`);
|
|
36
|
+
lines.push(` redis_settings = RedisSettings()`);
|
|
37
|
+
return lines;
|
|
38
|
+
}
|
|
39
|
+
// ── Storage (S3/local) ──────────────────────────────────────────────────
|
|
40
|
+
export function generatePythonStorage(node) {
|
|
41
|
+
const props = p(node);
|
|
42
|
+
const provider = props.provider || 's3';
|
|
43
|
+
const bucket = props.bucket || 'my-app-uploads';
|
|
44
|
+
const lines = [];
|
|
45
|
+
if (provider === 's3') {
|
|
46
|
+
lines.push(`import aioboto3`);
|
|
47
|
+
lines.push(`import os`);
|
|
48
|
+
lines.push('');
|
|
49
|
+
lines.push(`BUCKET = os.environ.get("S3_BUCKET", "${bucket}")`);
|
|
50
|
+
lines.push(`REGION = os.environ.get("AWS_REGION", "us-east-1")`);
|
|
51
|
+
lines.push(`session = aioboto3.Session()`);
|
|
52
|
+
lines.push('');
|
|
53
|
+
lines.push(`async def upload_file(key: str, data: bytes, content_type: str) -> str:`);
|
|
54
|
+
lines.push(` async with session.client("s3", region_name=REGION) as s3:`);
|
|
55
|
+
lines.push(` await s3.put_object(Bucket=BUCKET, Key=key, Body=data, ContentType=content_type)`);
|
|
56
|
+
lines.push(` return key`);
|
|
57
|
+
lines.push('');
|
|
58
|
+
lines.push(`async def get_signed_url(key: str, expires_in: int = 3600) -> str:`);
|
|
59
|
+
lines.push(` async with session.client("s3", region_name=REGION) as s3:`);
|
|
60
|
+
lines.push(` return await s3.generate_presigned_url("get_object", Params={"Bucket": BUCKET, "Key": key}, ExpiresIn=expires_in)`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
lines.push(`from pathlib import Path`);
|
|
64
|
+
lines.push('');
|
|
65
|
+
lines.push(`STORAGE_DIR = Path("./uploads")`);
|
|
66
|
+
lines.push(`STORAGE_DIR.mkdir(parents=True, exist_ok=True)`);
|
|
67
|
+
lines.push('');
|
|
68
|
+
lines.push(`async def upload_file(key: str, data: bytes) -> str:`);
|
|
69
|
+
lines.push(` (STORAGE_DIR / key).write_bytes(data)`);
|
|
70
|
+
lines.push(` return key`);
|
|
71
|
+
lines.push('');
|
|
72
|
+
lines.push(`async def read_file(key: str) -> bytes:`);
|
|
73
|
+
lines.push(` return (STORAGE_DIR / key).read_bytes()`);
|
|
74
|
+
}
|
|
75
|
+
return lines;
|
|
76
|
+
}
|
|
77
|
+
// ── Email (SendGrid/SMTP) ───────────────────────────────────────────────
|
|
78
|
+
export function generatePythonEmail(node) {
|
|
79
|
+
const props = p(node);
|
|
80
|
+
const provider = props.provider || 'smtp';
|
|
81
|
+
const from = props.from || 'noreply@example.com';
|
|
82
|
+
const lines = [];
|
|
83
|
+
if (provider === 'sendgrid') {
|
|
84
|
+
lines.push(`import httpx`);
|
|
85
|
+
lines.push(`import os`);
|
|
86
|
+
lines.push('');
|
|
87
|
+
lines.push(`SENDGRID_API_KEY = os.environ.get("SENDGRID_API_KEY", "")`);
|
|
88
|
+
lines.push(`DEFAULT_FROM = "${from}"`);
|
|
89
|
+
lines.push('');
|
|
90
|
+
lines.push(`async def send_email(to: str, subject: str, html: str, sender: str = DEFAULT_FROM) -> None:`);
|
|
91
|
+
lines.push(` async with httpx.AsyncClient() as client:`);
|
|
92
|
+
lines.push(` await client.post("https://api.sendgrid.com/v3/mail/send", headers={"Authorization": f"Bearer {SENDGRID_API_KEY}"}, json={"personalizations": [{"to": [{"email": to}]}], "from": {"email": sender}, "subject": subject, "content": [{"type": "text/html", "value": html}]})`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
lines.push(`import aiosmtplib`);
|
|
96
|
+
lines.push(`from email.message import EmailMessage`);
|
|
97
|
+
lines.push(`import os`);
|
|
98
|
+
lines.push('');
|
|
99
|
+
lines.push(`async def send_email(to: str, subject: str, html: str, sender: str = "${from}") -> None:`);
|
|
100
|
+
lines.push(` msg = EmailMessage()`);
|
|
101
|
+
lines.push(` msg["From"] = sender`);
|
|
102
|
+
lines.push(` msg["To"] = to`);
|
|
103
|
+
lines.push(` msg["Subject"] = subject`);
|
|
104
|
+
lines.push(` msg.set_content(html, subtype="html")`);
|
|
105
|
+
lines.push(` await aiosmtplib.send(msg, hostname=os.environ.get("SMTP_HOST", "localhost"), port=int(os.environ.get("SMTP_PORT", "587")))`);
|
|
106
|
+
}
|
|
107
|
+
return lines;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=infra.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infra.js","sourceRoot":"","sources":["../../src/generators/infra.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @kernlang/python — FastAPI Python backend transpiler
|
|
3
|
+
*/
|
|
4
|
+
export { generatePythonCoreNode } from './codegen-python.js';
|
|
5
|
+
export { transpileFastAPI } from './transpiler-fastapi.js';
|
|
6
|
+
export { mapTsTypeToPython, toScreamingSnake, toSnakeCase } from './type-map.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @kernlang/python — FastAPI Python backend transpiler
|
|
3
|
+
*/
|
|
4
|
+
export { generatePythonCoreNode } from './codegen-python.js';
|
|
5
|
+
export { transpileFastAPI } from './transpiler-fastapi.js';
|
|
6
|
+
export { mapTsTypeToPython, toScreamingSnake, toSnakeCase } from './type-map.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python emitter leg — Phase 1 PR-3b.
|
|
3
|
+
*
|
|
4
|
+
* Council-approved design (6-engine agon brainstorm, run 1778871685720):
|
|
5
|
+
*
|
|
6
|
+
* - **(A) Fresh `python3 -u` subprocess per fixture.** Clean isolation;
|
|
7
|
+
* ~50-100ms overhead × 19 fixtures = ~1-2s test cost; no shared state.
|
|
8
|
+
* `-u` flag forces unbuffered stdio so short-lived fixtures cannot
|
|
9
|
+
* drop trace events to a half-flushed buffer.
|
|
10
|
+
* - **(ii) Dedicated FD 3 for trace transport.** stdout is reserved for
|
|
11
|
+
* emitted-code `print()` calls; FD3 carries one JSON event per line.
|
|
12
|
+
* This keeps user output from polluting the trace channel.
|
|
13
|
+
* - **(B1) Codegen hook injected in production Python emitter** behind
|
|
14
|
+
* `BodyEmitOptions.traceHooks.eachIterNext` (opt-in only; production
|
|
15
|
+
* callers never set it). Symmetric with TS leg's hook contract.
|
|
16
|
+
* - **(P1) Sentinel exception classes** `_KernReturn`/`_KernThrow`
|
|
17
|
+
* defined in the prelude. Lowered `throw` body-stmts raise them;
|
|
18
|
+
* a wrapping `async def __kern_run()` catches and resolves them
|
|
19
|
+
* into [[CompletionRecord]]s. Symmetric with TS sentinel approach.
|
|
20
|
+
*
|
|
21
|
+
* Council-flagged mitigations applied:
|
|
22
|
+
* - Deterministic JSON: `sort_keys=True` on Python side; we already do
|
|
23
|
+
* key-sorted serialization on TS side via `serializeValue`.
|
|
24
|
+
* - Unbuffered stdio: `python3 -u`.
|
|
25
|
+
* - Async-aware timeout: subprocess SIGKILLed after 10s if it hasn't
|
|
26
|
+
* exited; surfaces as PythonLegError.
|
|
27
|
+
*
|
|
28
|
+
* Fixture authors: do NOT use Python `print()` inside fixture bodies — the
|
|
29
|
+
* harness writes the completion record to stdout. Use `__trace` events with
|
|
30
|
+
* `op: 'stdout'` if you need to observe stdout-style output through the
|
|
31
|
+
* trace channel (FD 3).
|
|
32
|
+
*/
|
|
33
|
+
import type { NodeFixture, SemanticEnv, Trace } from '@kernlang/core';
|
|
34
|
+
export declare class PythonLegError extends Error {
|
|
35
|
+
constructor(message: string);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Run the Python emitter leg of the differential harness.
|
|
39
|
+
*
|
|
40
|
+
* Error model mirrors `runTsEmitterLeg`: ONLY the sentinel-resolved
|
|
41
|
+
* completions count as fixture-comparable; any other failure (spawn
|
|
42
|
+
* error, non-zero exit, malformed FD3 output) is thrown so the harness
|
|
43
|
+
* records `leg-error`.
|
|
44
|
+
*/
|
|
45
|
+
export declare function runPythonEmitterLeg(fixture: NodeFixture, env: SemanticEnv): Promise<Trace>;
|