@aiready/context-analyzer 0.21.25 → 0.21.27
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/.turbo/turbo-build.log +32 -25
- package/.turbo/turbo-test.log +51 -87
- package/coverage/clover.xml +392 -1878
- package/coverage/coverage-final.json +15 -19
- package/coverage/index.html +48 -63
- package/coverage/src/analyzers/index.html +21 -21
- package/coverage/src/analyzers/python-context.ts.html +96 -96
- package/coverage/src/ast-utils.ts.html +34 -109
- package/coverage/src/classifier.ts.html +104 -104
- package/coverage/src/classify/classification-patterns.ts.html +1 -1
- package/coverage/src/classify/file-classifiers.ts.html +1 -1
- package/coverage/src/classify/index.html +1 -1
- package/coverage/src/cluster-detector.ts.html +72 -72
- package/coverage/src/defaults.ts.html +1 -1
- package/coverage/src/graph-builder.ts.html +131 -131
- package/coverage/src/index.html +101 -116
- package/coverage/src/index.ts.html +2 -2
- package/coverage/src/issue-analyzer.ts.html +32 -83
- package/coverage/src/mapper.ts.html +20 -2
- package/coverage/src/metrics.ts.html +127 -130
- package/coverage/src/orchestrator.ts.html +13 -13
- package/coverage/src/provider.ts.html +19 -19
- package/coverage/src/remediation.ts.html +59 -59
- package/coverage/src/report/console-report.ts.html +2 -2
- package/coverage/src/report/html-report.ts.html +60 -84
- package/coverage/src/report/index.html +7 -7
- package/coverage/src/report/interactive-setup.ts.html +1 -1
- package/coverage/src/scoring.ts.html +62 -62
- package/coverage/src/semantic/co-usage.ts.html +1 -1
- package/coverage/src/semantic/consolidation.ts.html +1 -1
- package/coverage/src/semantic/domain-inference.ts.html +1 -1
- package/coverage/src/semantic/index.html +1 -1
- package/coverage/src/semantic/type-graph.ts.html +1 -1
- package/coverage/src/summary.ts.html +67 -67
- package/coverage/src/types.ts.html +1 -1
- package/coverage/src/utils/dependency-graph-utils.ts.html +41 -41
- package/coverage/src/utils/index.html +21 -21
- package/coverage/src/utils/string-utils.ts.html +1 -1
- package/dist/chunk-22ZO4EKZ.mjs +1297 -0
- package/dist/chunk-4U4LDWGF.mjs +360 -0
- package/dist/chunk-BA7QGUHN.mjs +1722 -0
- package/dist/chunk-BCEZGRXI.mjs +1297 -0
- package/dist/chunk-BQCISA2F.mjs +91 -0
- package/dist/chunk-EMYD7NS6.mjs +137 -0
- package/dist/chunk-EWFR366Y.mjs +1740 -0
- package/dist/chunk-FO6YT6RG.mjs +1751 -0
- package/dist/chunk-J3SZQZNU.mjs +221 -0
- package/dist/chunk-OZE3FVZT.mjs +1089 -0
- package/dist/chunk-WHB7QI7N.mjs +91 -0
- package/dist/cli-action-CXIHOVAC.mjs +95 -0
- package/dist/cli-action-SA7SCYNV.mjs +95 -0
- package/dist/cli-action-YAJOJCXJ.mjs +95 -0
- package/dist/cli.js +688 -566
- package/dist/cli.mjs +4 -88
- package/dist/index.js +889 -773
- package/dist/index.mjs +21 -14
- package/dist/orchestrator-3L3NAZYP.mjs +10 -0
- package/dist/orchestrator-MONOZHVW.mjs +10 -0
- package/dist/orchestrator-ZR7JSKWI.mjs +10 -0
- package/dist/summary-7PZVW72O.mjs +7 -0
- package/dist/summary-LKUCJAIS.mjs +7 -0
- package/package.json +2 -2
- package/src/__tests__/analyzer.test.ts +1 -1
- package/src/__tests__/enhanced-cohesion.test.ts +4 -1
- package/src/__tests__/orchestrator.test.ts +19 -4
- package/src/__tests__/python-context.test.ts +6 -0
- package/src/__tests__/report/html-report.test.ts +8 -2
- package/src/ast-utils.ts +1 -26
- package/src/cli-definition.ts +4 -2
- package/src/issue-analyzer.ts +4 -19
- package/src/metrics.ts +1 -2
- package/src/provider.ts +4 -4
- package/src/report/html-report.ts +43 -59
- package/coverage/dist/chunk-64U3PNO3.mjs.html +0 -367
- package/coverage/dist/chunk-J3MUOWHC.mjs.html +0 -5326
- package/coverage/dist/index.html +0 -146
- package/coverage/dist/index.mjs.html +0 -1396
- package/coverage/src/analyzer.ts.html +0 -88
|
@@ -23,30 +23,30 @@
|
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">
|
|
26
|
+
<span class="strong">75.58% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>65/86</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">38.46% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>10/26</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">
|
|
40
|
+
<span class="strong">88.88% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>8/9</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">
|
|
47
|
+
<span class="strong">75% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>60/80</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
</div>
|
|
62
62
|
</template>
|
|
63
63
|
</div>
|
|
64
|
-
<div class='status-line
|
|
64
|
+
<div class='status-line medium'></div>
|
|
65
65
|
<pre><table class="coverage">
|
|
66
66
|
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
67
|
<a name='L2'></a><a href='#L2'>2</a>
|
|
@@ -413,39 +413,39 @@
|
|
|
413
413
|
<span class="cline-any cline-yes">4x</span>
|
|
414
414
|
<span class="cline-any cline-yes">4x</span>
|
|
415
415
|
<span class="cline-any cline-yes">4x</span>
|
|
416
|
-
<span class="cline-any cline-
|
|
416
|
+
<span class="cline-any cline-yes">4x</span>
|
|
417
417
|
<span class="cline-any cline-neutral"> </span>
|
|
418
|
-
<span class="cline-any cline-
|
|
418
|
+
<span class="cline-any cline-yes">6x</span>
|
|
419
419
|
<span class="cline-any cline-neutral"> </span>
|
|
420
420
|
<span class="cline-any cline-neutral"> </span>
|
|
421
421
|
<span class="cline-any cline-neutral"> </span>
|
|
422
422
|
<span class="cline-any cline-neutral"> </span>
|
|
423
423
|
<span class="cline-any cline-neutral"> </span>
|
|
424
424
|
<span class="cline-any cline-neutral"> </span>
|
|
425
|
-
<span class="cline-any cline-
|
|
425
|
+
<span class="cline-any cline-yes">6x</span>
|
|
426
426
|
<span class="cline-any cline-neutral"> </span>
|
|
427
427
|
<span class="cline-any cline-neutral"> </span>
|
|
428
428
|
<span class="cline-any cline-neutral"> </span>
|
|
429
429
|
<span class="cline-any cline-neutral"> </span>
|
|
430
430
|
<span class="cline-any cline-neutral"> </span>
|
|
431
|
-
<span class="cline-any cline-
|
|
432
|
-
<span class="cline-any cline-
|
|
431
|
+
<span class="cline-any cline-yes">4x</span>
|
|
432
|
+
<span class="cline-any cline-yes">4x</span>
|
|
433
433
|
<span class="cline-any cline-neutral"> </span>
|
|
434
434
|
<span class="cline-any cline-neutral"> </span>
|
|
435
435
|
<span class="cline-any cline-neutral"> </span>
|
|
436
436
|
<span class="cline-any cline-neutral"> </span>
|
|
437
|
-
<span class="cline-any cline-
|
|
437
|
+
<span class="cline-any cline-yes">4x</span>
|
|
438
438
|
<span class="cline-any cline-neutral"> </span>
|
|
439
439
|
<span class="cline-any cline-neutral"> </span>
|
|
440
440
|
<span class="cline-any cline-neutral"> </span>
|
|
441
441
|
<span class="cline-any cline-neutral"> </span>
|
|
442
|
-
<span class="cline-any cline-
|
|
443
|
-
<span class="cline-any cline-
|
|
442
|
+
<span class="cline-any cline-yes">4x</span>
|
|
443
|
+
<span class="cline-any cline-yes">4x</span>
|
|
444
444
|
<span class="cline-any cline-neutral"> </span>
|
|
445
445
|
<span class="cline-any cline-neutral"> </span>
|
|
446
446
|
<span class="cline-any cline-no"> </span>
|
|
447
447
|
<span class="cline-any cline-neutral"> </span>
|
|
448
|
-
<span class="cline-any cline-
|
|
448
|
+
<span class="cline-any cline-yes">4x</span>
|
|
449
449
|
<span class="cline-any cline-neutral"> </span>
|
|
450
450
|
<span class="cline-any cline-neutral"> </span>
|
|
451
451
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -460,7 +460,7 @@
|
|
|
460
460
|
<span class="cline-any cline-neutral"> </span>
|
|
461
461
|
<span class="cline-any cline-neutral"> </span>
|
|
462
462
|
<span class="cline-any cline-neutral"> </span>
|
|
463
|
-
<span class="cline-any cline-yes">
|
|
463
|
+
<span class="cline-any cline-yes">3x</span>
|
|
464
464
|
<span class="cline-any cline-neutral"> </span>
|
|
465
465
|
<span class="cline-any cline-neutral"> </span>
|
|
466
466
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -482,21 +482,21 @@
|
|
|
482
482
|
<span class="cline-any cline-yes">4x</span>
|
|
483
483
|
<span class="cline-any cline-yes">4x</span>
|
|
484
484
|
<span class="cline-any cline-yes">4x</span>
|
|
485
|
-
<span class="cline-any cline-
|
|
485
|
+
<span class="cline-any cline-yes">4x</span>
|
|
486
486
|
<span class="cline-any cline-neutral"> </span>
|
|
487
|
-
<span class="cline-any cline-
|
|
487
|
+
<span class="cline-any cline-yes">4x</span>
|
|
488
488
|
<span class="cline-any cline-neutral"> </span>
|
|
489
|
-
<span class="cline-any cline-
|
|
490
|
-
<span class="cline-any cline-
|
|
491
|
-
<span class="cline-any cline-
|
|
489
|
+
<span class="cline-any cline-yes">4x</span>
|
|
490
|
+
<span class="cline-any cline-yes">6x</span>
|
|
491
|
+
<span class="cline-any cline-yes">6x</span>
|
|
492
492
|
<span class="cline-any cline-no"> </span>
|
|
493
493
|
<span class="cline-any cline-neutral"> </span>
|
|
494
494
|
<span class="cline-any cline-neutral"> </span>
|
|
495
495
|
<span class="cline-any cline-neutral"> </span>
|
|
496
|
-
<span class="cline-any cline-no"> </span>
|
|
497
|
-
<span class="cline-any cline-neutral"> </span>
|
|
498
496
|
<span class="cline-any cline-yes">4x</span>
|
|
499
497
|
<span class="cline-any cline-neutral"> </span>
|
|
498
|
+
<span class="cline-any cline-no"> </span>
|
|
499
|
+
<span class="cline-any cline-neutral"> </span>
|
|
500
500
|
<span class="cline-any cline-neutral"> </span>
|
|
501
501
|
<span class="cline-any cline-neutral"> </span>
|
|
502
502
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -511,49 +511,49 @@
|
|
|
511
511
|
<span class="cline-any cline-neutral"> </span>
|
|
512
512
|
<span class="cline-any cline-neutral"> </span>
|
|
513
513
|
<span class="cline-any cline-neutral"> </span>
|
|
514
|
-
<span class="cline-any cline-
|
|
514
|
+
<span class="cline-any cline-yes">12x</span>
|
|
515
515
|
<span class="cline-any cline-neutral"> </span>
|
|
516
516
|
<span class="cline-any cline-neutral"> </span>
|
|
517
|
-
<span class="cline-any cline-
|
|
518
|
-
<span class="cline-any cline-
|
|
519
|
-
<span class="cline-any cline-
|
|
520
|
-
<span class="cline-any cline-
|
|
521
|
-
<span class="cline-any cline-
|
|
522
|
-
<span class="cline-any cline-
|
|
517
|
+
<span class="cline-any cline-yes">12x</span>
|
|
518
|
+
<span class="cline-any cline-yes">6x</span>
|
|
519
|
+
<span class="cline-any cline-yes">6x</span>
|
|
520
|
+
<span class="cline-any cline-yes">6x</span>
|
|
521
|
+
<span class="cline-any cline-yes">6x</span>
|
|
522
|
+
<span class="cline-any cline-yes">6x</span>
|
|
523
523
|
<span class="cline-any cline-neutral"> </span>
|
|
524
524
|
<span class="cline-any cline-neutral"> </span>
|
|
525
|
-
<span class="cline-any cline-
|
|
526
|
-
<span class="cline-any cline-
|
|
525
|
+
<span class="cline-any cline-yes">6x</span>
|
|
526
|
+
<span class="cline-any cline-yes">6x</span>
|
|
527
527
|
<span class="cline-any cline-no"> </span>
|
|
528
528
|
<span class="cline-any cline-neutral"> </span>
|
|
529
529
|
<span class="cline-any cline-neutral"> </span>
|
|
530
|
-
<span class="cline-any cline-
|
|
531
|
-
<span class="cline-any cline-
|
|
530
|
+
<span class="cline-any cline-yes">6x</span>
|
|
531
|
+
<span class="cline-any cline-yes">6x</span>
|
|
532
532
|
<span class="cline-any cline-neutral"> </span>
|
|
533
533
|
<span class="cline-any cline-neutral"> </span>
|
|
534
534
|
<span class="cline-any cline-neutral"> </span>
|
|
535
535
|
<span class="cline-any cline-neutral"> </span>
|
|
536
|
-
<span class="cline-any cline-
|
|
537
|
-
<span class="cline-any cline-
|
|
536
|
+
<span class="cline-any cline-yes">6x</span>
|
|
537
|
+
<span class="cline-any cline-yes">12x</span>
|
|
538
538
|
<span class="cline-any cline-no"> </span>
|
|
539
539
|
<span class="cline-any cline-neutral"> </span>
|
|
540
540
|
<span class="cline-any cline-neutral"> </span>
|
|
541
541
|
<span class="cline-any cline-neutral"> </span>
|
|
542
542
|
<span class="cline-any cline-neutral"> </span>
|
|
543
|
-
<span class="cline-any cline-
|
|
544
|
-
<span class="cline-any cline-
|
|
543
|
+
<span class="cline-any cline-yes">6x</span>
|
|
544
|
+
<span class="cline-any cline-yes">6x</span>
|
|
545
545
|
<span class="cline-any cline-neutral"> </span>
|
|
546
546
|
<span class="cline-any cline-neutral"> </span>
|
|
547
547
|
<span class="cline-any cline-neutral"> </span>
|
|
548
548
|
<span class="cline-any cline-neutral"> </span>
|
|
549
|
-
<span class="cline-any cline-
|
|
550
|
-
<span class="cline-any cline-
|
|
549
|
+
<span class="cline-any cline-yes">6x</span>
|
|
550
|
+
<span class="cline-any cline-yes">12x</span>
|
|
551
551
|
<span class="cline-any cline-no"> </span>
|
|
552
552
|
<span class="cline-any cline-neutral"> </span>
|
|
553
553
|
<span class="cline-any cline-neutral"> </span>
|
|
554
554
|
<span class="cline-any cline-neutral"> </span>
|
|
555
555
|
<span class="cline-any cline-neutral"> </span>
|
|
556
|
-
<span class="cline-any cline-
|
|
556
|
+
<span class="cline-any cline-yes">12x</span>
|
|
557
557
|
<span class="cline-any cline-neutral"> </span>
|
|
558
558
|
<span class="cline-any cline-neutral"> </span>
|
|
559
559
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -565,15 +565,15 @@
|
|
|
565
565
|
<span class="cline-any cline-neutral"> </span>
|
|
566
566
|
<span class="cline-any cline-neutral"> </span>
|
|
567
567
|
<span class="cline-any cline-neutral"> </span>
|
|
568
|
-
<span class="cline-any cline-
|
|
569
|
-
<span class="cline-any cline-
|
|
568
|
+
<span class="cline-any cline-yes">1x</span>
|
|
569
|
+
<span class="cline-any cline-yes">1x</span>
|
|
570
570
|
<span class="cline-any cline-neutral"> </span>
|
|
571
571
|
<span class="cline-any cline-neutral"> </span>
|
|
572
572
|
<span class="cline-any cline-neutral"> </span>
|
|
573
|
-
<span class="cline-any cline-
|
|
574
|
-
<span class="cline-any cline-
|
|
573
|
+
<span class="cline-any cline-yes">1x</span>
|
|
574
|
+
<span class="cline-any cline-yes">1x</span>
|
|
575
575
|
<span class="cline-any cline-neutral"> </span>
|
|
576
|
-
<span class="cline-any cline-
|
|
576
|
+
<span class="cline-any cline-yes">1x</span>
|
|
577
577
|
<span class="cline-any cline-neutral"> </span>
|
|
578
578
|
<span class="cline-any cline-neutral"> </span>
|
|
579
579
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -586,7 +586,7 @@
|
|
|
586
586
|
<span class="cline-any cline-neutral"> </span>
|
|
587
587
|
<span class="cline-any cline-neutral"> </span>
|
|
588
588
|
<span class="cline-any cline-neutral"> </span>
|
|
589
|
-
<span class="cline-any cline-
|
|
589
|
+
<span class="cline-any cline-yes">1x</span>
|
|
590
590
|
<span class="cline-any cline-neutral"> </span>
|
|
591
591
|
<span class="cline-any cline-neutral"> </span>
|
|
592
592
|
<span class="cline-any cline-no"> </span>
|
|
@@ -666,7 +666,7 @@ export async function analyzePythonContext(
|
|
|
666
666
|
rootDir: string
|
|
667
667
|
): Promise<PythonContextMetrics[]> {
|
|
668
668
|
const results: PythonContextMetrics[] = [];
|
|
669
|
-
const parser = getParser('dummy.py');
|
|
669
|
+
const parser = await getParser('dummy.py');
|
|
670
670
|
|
|
671
671
|
if (!parser) {
|
|
672
672
|
console.warn('Python parser not available');
|
|
@@ -688,39 +688,39 @@ export async function analyzePythonContext(
|
|
|
688
688
|
for (const file of pythonFiles) {
|
|
689
689
|
try {
|
|
690
690
|
const code = await fs.promises.readFile(file, 'utf-8');
|
|
691
|
-
const result =
|
|
691
|
+
const result = parser.parse(code, file);
|
|
692
692
|
|
|
693
|
-
const imports: PythonImportInfo[] =
|
|
693
|
+
const imports: PythonImportInfo[] = result.imports.map((imp) => ({
|
|
694
694
|
source: imp.source,
|
|
695
695
|
specifiers: imp.specifiers,
|
|
696
696
|
isRelative: imp.source.startsWith('.'),
|
|
697
697
|
resolvedPath: resolvePythonImport(file, imp.source, rootDir),
|
|
698
698
|
}));
|
|
699
699
|
|
|
700
|
-
const exports: PythonExportInfo[] =
|
|
700
|
+
const exports: PythonExportInfo[] = result.exports.map((exp) => ({
|
|
701
701
|
name: exp.name,
|
|
702
702
|
type: exp.type,
|
|
703
703
|
}));
|
|
704
704
|
|
|
705
705
|
// Calculate metrics
|
|
706
|
-
const linesOfCode =
|
|
707
|
-
const
|
|
706
|
+
const linesOfCode = code.split('\n').length;
|
|
707
|
+
const importDepth = calculateImportDepthFromEdges(
|
|
708
708
|
file,
|
|
709
709
|
dependencyGraph,
|
|
710
710
|
new Set()
|
|
711
711
|
);
|
|
712
|
-
const contextBudget =
|
|
712
|
+
const contextBudget = estimateContextBudget(
|
|
713
713
|
code,
|
|
714
714
|
imports,
|
|
715
715
|
dependencyGraph
|
|
716
716
|
);
|
|
717
|
-
const cohesion =
|
|
718
|
-
const
|
|
717
|
+
const cohesion = calculatePythonCohesion(exports, imports);
|
|
718
|
+
const circularDependencies = detectGraphCyclesFromFile(
|
|
719
719
|
file,
|
|
720
720
|
dependencyGraph
|
|
721
721
|
).map(<span class="fstat-no" title="function not covered" >(c</span>ycle) => <span class="cstat-no" title="statement not covered" >cycle.join(' -> '))</span>;
|
|
722
722
|
|
|
723
|
-
|
|
723
|
+
results.push({
|
|
724
724
|
file,
|
|
725
725
|
importDepth,
|
|
726
726
|
contextBudget,
|
|
@@ -750,27 +750,27 @@ async function buildPythonDependencyGraph(
|
|
|
750
750
|
rootDir: string
|
|
751
751
|
): Promise<Map<string, Set<string>>> {
|
|
752
752
|
const graph = new Map<string, Set<string>>();
|
|
753
|
-
const parser = getParser('dummy.py');
|
|
753
|
+
const parser = await getParser('dummy.py');
|
|
754
754
|
|
|
755
755
|
<span class="missing-if-branch" title="if path not taken" >I</span>if (!parser) <span class="cstat-no" title="statement not covered" >return graph;</span>
|
|
756
756
|
|
|
757
757
|
for (const file of files) {
|
|
758
758
|
try {
|
|
759
759
|
const code = await fs.promises.readFile(file, 'utf-8');
|
|
760
|
-
const result =
|
|
760
|
+
const result = parser.parse(code, file);
|
|
761
761
|
|
|
762
|
-
const dependencies =
|
|
762
|
+
const dependencies = new Set<string>();
|
|
763
763
|
|
|
764
|
-
|
|
765
|
-
const resolved =
|
|
766
|
-
<span class="
|
|
764
|
+
for (const imp of result.imports) {
|
|
765
|
+
const resolved = resolvePythonImport(file, imp.source, rootDir);
|
|
766
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (resolved && <span class="branch-1 cbranch-no" title="branch not covered" >files.includes(resolved)) {</span>
|
|
767
767
|
<span class="cstat-no" title="statement not covered" > dependencies.add(resolved);</span>
|
|
768
768
|
}
|
|
769
769
|
}
|
|
770
770
|
|
|
771
|
-
|
|
771
|
+
graph.set(file, dependencies);
|
|
772
772
|
} catch (error) {
|
|
773
|
-
void error
|
|
773
|
+
<span class="cstat-no" title="statement not covered" > void error;</span>
|
|
774
774
|
// Skip files with errors
|
|
775
775
|
}
|
|
776
776
|
}
|
|
@@ -781,74 +781,74 @@ async function buildPythonDependencyGraph(
|
|
|
781
781
|
/**
|
|
782
782
|
* Resolve Python import to file path
|
|
783
783
|
*/
|
|
784
|
-
function
|
|
784
|
+
function resolvePythonImport(
|
|
785
785
|
fromFile: string,
|
|
786
786
|
importPath: string,
|
|
787
787
|
rootDir: string
|
|
788
788
|
): string | undefined {
|
|
789
|
-
const
|
|
789
|
+
const dir = dirname(fromFile);
|
|
790
790
|
|
|
791
791
|
// Handle relative imports
|
|
792
|
-
|
|
793
|
-
const parts =
|
|
794
|
-
let upCount =
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
792
|
+
if (importPath.startsWith('.')) {
|
|
793
|
+
const parts = importPath.split('.');
|
|
794
|
+
let upCount = 0;
|
|
795
|
+
while (parts[0] === '') {
|
|
796
|
+
upCount++;
|
|
797
|
+
parts.shift();
|
|
798
798
|
}
|
|
799
799
|
|
|
800
|
-
let targetDir =
|
|
801
|
-
|
|
800
|
+
let targetDir = dir;
|
|
801
|
+
for (let i = 0; i < upCount - 1; i++) {
|
|
802
802
|
<span class="cstat-no" title="statement not covered" > targetDir = dirname(targetDir);</span>
|
|
803
803
|
}
|
|
804
804
|
|
|
805
|
-
const modulePath =
|
|
806
|
-
const possiblePaths =
|
|
805
|
+
const modulePath = parts.join('/');
|
|
806
|
+
const possiblePaths = [
|
|
807
807
|
resolve(targetDir, `${modulePath}.py`),
|
|
808
808
|
resolve(targetDir, modulePath, '__init__.py'),
|
|
809
809
|
];
|
|
810
810
|
|
|
811
|
-
|
|
812
|
-
<span class="
|
|
811
|
+
for (const path of possiblePaths) {
|
|
812
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (fs.existsSync(path)) {
|
|
813
813
|
<span class="cstat-no" title="statement not covered" > return path;</span>
|
|
814
814
|
}
|
|
815
815
|
}
|
|
816
816
|
} else {
|
|
817
817
|
// Handle absolute imports (from project root)
|
|
818
|
-
const modulePath =
|
|
819
|
-
const possiblePaths =
|
|
818
|
+
const modulePath = importPath.replace(/\./g, '/');
|
|
819
|
+
const possiblePaths = [
|
|
820
820
|
resolve(rootDir, `${modulePath}.py`),
|
|
821
821
|
resolve(rootDir, modulePath, '__init__.py'),
|
|
822
822
|
];
|
|
823
823
|
|
|
824
|
-
|
|
825
|
-
<span class="
|
|
824
|
+
for (const path of possiblePaths) {
|
|
825
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (fs.existsSync(path)) {
|
|
826
826
|
<span class="cstat-no" title="statement not covered" > return path;</span>
|
|
827
827
|
}
|
|
828
828
|
}
|
|
829
829
|
}
|
|
830
830
|
|
|
831
|
-
|
|
831
|
+
return undefined;
|
|
832
832
|
}
|
|
833
833
|
|
|
834
834
|
/**
|
|
835
835
|
* Estimate context budget (tokens needed for file + direct deps)
|
|
836
836
|
*/
|
|
837
|
-
function
|
|
837
|
+
function estimateContextBudget(
|
|
838
838
|
code: string,
|
|
839
839
|
imports: PythonImportInfo[],
|
|
840
840
|
dependencyGraph: Map<string, Set<string>>
|
|
841
841
|
): number {
|
|
842
842
|
// File tokens
|
|
843
|
-
|
|
844
|
-
let
|
|
843
|
+
void dependencyGraph;
|
|
844
|
+
let budget = estimateTokens(code);
|
|
845
845
|
|
|
846
846
|
// Add tokens for direct dependencies (simplified)
|
|
847
847
|
// In a full implementation, we'd load each dependency file
|
|
848
|
-
const avgTokensPerDep =
|
|
849
|
-
|
|
848
|
+
const avgTokensPerDep = 500; // Conservative estimate
|
|
849
|
+
budget += imports.length * avgTokensPerDep;
|
|
850
850
|
|
|
851
|
-
|
|
851
|
+
return budget;
|
|
852
852
|
}
|
|
853
853
|
|
|
854
854
|
/**
|
|
@@ -857,11 +857,11 @@ function <span class="fstat-no" title="function not covered" >estimateContextBud
|
|
|
857
857
|
* Cohesion = How related are the exports to each other?
|
|
858
858
|
* Higher cohesion = better (single responsibility)
|
|
859
859
|
*/
|
|
860
|
-
function
|
|
860
|
+
function calculatePythonCohesion(
|
|
861
861
|
exports: PythonExportInfo[],
|
|
862
862
|
imports: PythonImportInfo[]
|
|
863
863
|
): number {
|
|
864
|
-
<span class="
|
|
864
|
+
<span class="missing-if-branch" title="else path not taken" >E</span>if (exports.length === 0) return 1;
|
|
865
865
|
|
|
866
866
|
// Simple heuristic: files with many exports but few imports are less cohesive
|
|
867
867
|
const exportCount = <span class="cstat-no" title="statement not covered" >exports.length;</span>
|
|
@@ -895,7 +895,7 @@ function <span class="fstat-no" title="function not covered" >calculatePythonCoh
|
|
|
895
895
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
896
896
|
Code coverage generated by
|
|
897
897
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
898
|
-
at 2026-03-
|
|
898
|
+
at 2026-03-24T11:20:59.666Z
|
|
899
899
|
</div>
|
|
900
900
|
<script src="../../prettify.js"></script>
|
|
901
901
|
<script>
|