code2llm 0.5.11__tar.gz → 0.5.13__tar.gz

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 (86) hide show
  1. {code2llm-0.5.11 → code2llm-0.5.13}/PKG-INFO +1 -1
  2. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/__init__.py +1 -1
  3. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/cli.py +29 -6
  4. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/config.py +2 -1
  5. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/nlp/__init__.py +1 -1
  6. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm.egg-info/PKG-INFO +1 -1
  7. {code2llm-0.5.11 → code2llm-0.5.13}/pyproject.toml +1 -1
  8. {code2llm-0.5.11 → code2llm-0.5.13}/tests/test_prompt_txt.py +57 -6
  9. {code2llm-0.5.11 → code2llm-0.5.13}/LICENSE +0 -0
  10. {code2llm-0.5.11 → code2llm-0.5.13}/README.md +0 -0
  11. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/__main__.py +0 -0
  12. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/analysis/__init__.py +0 -0
  13. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/analysis/call_graph.py +0 -0
  14. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/analysis/cfg.py +0 -0
  15. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/analysis/coupling.py +0 -0
  16. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/analysis/data_analysis.py +0 -0
  17. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/analysis/dfg.py +0 -0
  18. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/analysis/pipeline_detector.py +0 -0
  19. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/analysis/side_effects.py +0 -0
  20. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/analysis/smells.py +0 -0
  21. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/analysis/type_inference.py +0 -0
  22. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/__init__.py +0 -0
  23. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/analyzer.py +0 -0
  24. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/core/__init__.py +0 -0
  25. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/core/file_analyzer.py +0 -0
  26. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/core/file_cache.py +0 -0
  27. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/core/file_filter.py +0 -0
  28. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/core/refactoring.py +0 -0
  29. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/models.py +0 -0
  30. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/streaming/__init__.py +0 -0
  31. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/streaming/cache.py +0 -0
  32. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/streaming/incremental.py +0 -0
  33. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/streaming/prioritizer.py +0 -0
  34. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/streaming/scanner.py +0 -0
  35. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/streaming/strategies.py +0 -0
  36. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/core/streaming_analyzer.py +0 -0
  37. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/__init__.py +0 -0
  38. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/base.py +0 -0
  39. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/context_exporter.py +0 -0
  40. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/evolution_exporter.py +0 -0
  41. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/flow_constants.py +0 -0
  42. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/flow_exporter.py +0 -0
  43. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/flow_renderer.py +0 -0
  44. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/json_exporter.py +0 -0
  45. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/llm_exporter.py +0 -0
  46. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/map_exporter.py +0 -0
  47. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/mermaid_exporter.py +0 -0
  48. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/readme_exporter.py +0 -0
  49. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/toon/__init__.py +0 -0
  50. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/toon/helpers.py +0 -0
  51. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/toon/metrics.py +0 -0
  52. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/toon/module_detail.py +0 -0
  53. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/toon/renderer.py +0 -0
  54. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/toon.py +0 -0
  55. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/exporters/yaml_exporter.py +0 -0
  56. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/generators/__init__.py +0 -0
  57. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/generators/llm_flow.py +0 -0
  58. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/generators/llm_task.py +0 -0
  59. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/generators/mermaid.py +0 -0
  60. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/nlp/config.py +0 -0
  61. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/nlp/entity_resolution.py +0 -0
  62. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/nlp/intent_matching.py +0 -0
  63. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/nlp/normalization.py +0 -0
  64. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/nlp/pipeline.py +0 -0
  65. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/patterns/__init__.py +0 -0
  66. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/patterns/detector.py +0 -0
  67. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/refactor/__init__.py +0 -0
  68. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm/refactor/prompt_engine.py +0 -0
  69. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm.egg-info/SOURCES.txt +0 -0
  70. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm.egg-info/dependency_links.txt +0 -0
  71. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm.egg-info/entry_points.txt +0 -0
  72. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm.egg-info/requires.txt +0 -0
  73. {code2llm-0.5.11 → code2llm-0.5.13}/code2llm.egg-info/top_level.txt +0 -0
  74. {code2llm-0.5.11 → code2llm-0.5.13}/setup.cfg +0 -0
  75. {code2llm-0.5.11 → code2llm-0.5.13}/setup.py +0 -0
  76. {code2llm-0.5.11 → code2llm-0.5.13}/tests/test_advanced_analysis.py +0 -0
  77. {code2llm-0.5.11 → code2llm-0.5.13}/tests/test_analyzer.py +0 -0
  78. {code2llm-0.5.11 → code2llm-0.5.13}/tests/test_deep_analysis.py +0 -0
  79. {code2llm-0.5.11 → code2llm-0.5.13}/tests/test_edge_cases.py +0 -0
  80. {code2llm-0.5.11 → code2llm-0.5.13}/tests/test_flow_exporter.py +0 -0
  81. {code2llm-0.5.11 → code2llm-0.5.13}/tests/test_format_quality.py +0 -0
  82. {code2llm-0.5.11 → code2llm-0.5.13}/tests/test_nlp_pipeline.py +0 -0
  83. {code2llm-0.5.11 → code2llm-0.5.13}/tests/test_pipeline_detector.py +0 -0
  84. {code2llm-0.5.11 → code2llm-0.5.13}/tests/test_prompt_engine.py +0 -0
  85. {code2llm-0.5.11 → code2llm-0.5.13}/tests/test_refactoring_engine.py +0 -0
  86. {code2llm-0.5.11 → code2llm-0.5.13}/tests/test_toon_v2.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code2llm
3
- Version: 0.5.11
3
+ Version: 0.5.13
4
4
  Summary: High-performance Python code flow analysis with optimized TOON format - CFG, DFG, call graphs, and intelligent code queries
5
5
  Home-page: https://github.com/wronai/stts
6
6
  Author: STTS Project
@@ -8,7 +8,7 @@ Includes NLP Processing Pipeline for query normalization, intent matching,
8
8
  and entity resolution with multilingual support.
9
9
  """
10
10
 
11
- __version__ = "0.5.11"
11
+ __version__ = "0.5.13"
12
12
  __author__ = "STTS Project"
13
13
 
14
14
  # Core analysis components
@@ -406,13 +406,25 @@ def _export_code2logic(args, source_path: Path, output_dir: Path, formats: list[
406
406
  '-o', str(output_dir),
407
407
  ]
408
408
 
409
+ if not args.verbose:
410
+ cmd.append('-q')
411
+
409
412
  try:
410
- res = subprocess.run(cmd, capture_output=True, text=True)
413
+ if args.verbose:
414
+ res = subprocess.run(cmd, capture_output=True, text=True)
415
+ else:
416
+ res = subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, text=True)
411
417
  except Exception as e:
412
418
  print(f"Error running code2logic: {e}", file=sys.stderr)
413
419
  sys.exit(1)
414
420
 
415
421
  if res.returncode != 0:
422
+ if not args.verbose:
423
+ try:
424
+ res = subprocess.run(cmd, capture_output=True, text=True)
425
+ except Exception as e:
426
+ print(f"Error running code2logic: {e}", file=sys.stderr)
427
+ sys.exit(1)
416
428
  if res.stdout:
417
429
  print(res.stdout, file=sys.stderr)
418
430
  if res.stderr:
@@ -453,9 +465,20 @@ def _export_prompt_txt(args, output_dir: Path, formats: list[str], source_path:
453
465
 
454
466
  prompt_path = output_dir / 'prompt.txt'
455
467
 
456
- # Determine absolute paths for display
457
- project_path = str(source_path.resolve()) if source_path else str(Path.cwd().resolve())
458
- output_abs_path = str(output_dir.resolve())
468
+ # Determine project name and relative output path for display
469
+ if source_path:
470
+ project_path = source_path.name if source_path.name else str(source_path)
471
+ try:
472
+ output_rel_path = str(output_dir.relative_to(source_path))
473
+ except ValueError:
474
+ output_rel_path = str(output_dir)
475
+ else:
476
+ cwd = Path.cwd()
477
+ project_path = cwd.name
478
+ try:
479
+ output_rel_path = str(output_dir.relative_to(cwd))
480
+ except ValueError:
481
+ output_rel_path = str(output_dir)
459
482
 
460
483
  files = [
461
484
  ('analysis.toon', 'Health diagnostics - complexity metrics, god modules, coupling issues, refactoring priorities'),
@@ -477,14 +500,14 @@ def _export_prompt_txt(args, output_dir: Path, formats: list[str], source_path:
477
500
  lines.append("Files for analysis:")
478
501
 
479
502
  for name, desc in existing:
480
- file_path = f"{output_abs_path}/{name}"
503
+ file_path = f"{output_rel_path}/{name}"
481
504
  lines.append(f"- {file_path} ({desc})")
482
505
 
483
506
  if missing:
484
507
  lines.append("")
485
508
  lines.append("Missing files (not generated in this run):")
486
509
  for name in missing:
487
- file_path = f"{output_abs_path}/{name}"
510
+ file_path = f"{output_rel_path}/{name}"
488
511
  lines.append(f"- {file_path}")
489
512
 
490
513
  lines.append("")
@@ -38,7 +38,8 @@ class FilterConfig:
38
38
  exclude_patterns: List[str] = field(default_factory=lambda: [
39
39
  "*test*", "*__pycache__*", "*.pyc", "*venv*", "*.venv*",
40
40
  "*node_modules*", "*.git*", "*build*", "*dist*",
41
- "*_test.py", "test_*.py", "conftest.py"
41
+ "*_test.py", "test_*.py", "conftest.py",
42
+ "*demo_langs/invalid*",
42
43
  ])
43
44
  include_patterns: List[str] = field(default_factory=list)
44
45
  min_function_lines: int = 1
@@ -4,7 +4,7 @@ Provides query normalization, intent matching, and entity resolution
4
4
  with multilingual support and fuzzy matching.
5
5
  """
6
6
 
7
- __version__ = "0.5.11"
7
+ __version__ = "0.5.13"
8
8
 
9
9
  from .pipeline import NLPPipeline
10
10
  from .normalization import QueryNormalizer
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code2llm
3
- Version: 0.5.11
3
+ Version: 0.5.13
4
4
  Summary: High-performance Python code flow analysis with optimized TOON format - CFG, DFG, call graphs, and intelligent code queries
5
5
  Home-page: https://github.com/wronai/stts
6
6
  Author: STTS Project
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code2llm"
7
- version = "0.5.11"
7
+ version = "0.5.13"
8
8
  description = "High-performance Python code flow analysis with optimized TOON format - CFG, DFG, call graphs, and intelligent code queries"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -3,9 +3,9 @@
3
3
  import pytest
4
4
  import tempfile
5
5
  from pathlib import Path
6
- from unittest.mock import MagicMock
6
+ from unittest.mock import MagicMock, patch
7
7
 
8
- from code2llm.cli import _export_prompt_txt
8
+ from code2llm.cli import _export_prompt_txt, _export_code2logic
9
9
 
10
10
 
11
11
  class TestPromptTxtGeneration:
@@ -73,9 +73,9 @@ class TestPromptTxtGeneration:
73
73
  prompt_file = temp_output_dir / 'prompt.txt'
74
74
  content = prompt_file.read_text()
75
75
 
76
- # Check that project path is shown
76
+ # Check that project name is shown (just folder name, not full path)
77
77
  assert "we are in project path:" in content
78
- assert "/home/user/myproject" in content
78
+ assert "myproject" in content
79
79
 
80
80
  # Check that existing files are listed with paths and descriptions
81
81
  assert "Files for analysis:" in content
@@ -138,17 +138,68 @@ class TestPromptTxtGeneration:
138
138
  "Prompt should start with AI assistant instruction"
139
139
  assert any("we are in project path:" in line for line in lines), \
140
140
  "Project path should be present"
141
+
141
142
  assert any("Files for analysis:" in line for line in lines), \
142
143
  "Files section should be present"
143
-
144
+
144
145
  # All files should be listed without missing section
145
146
  assert "Missing files" not in content, "No missing section when all files exist"
146
147
  for f in all_files:
147
148
  assert f in content, f"All files should be listed: {f}"
148
-
149
+
149
150
  # Check for file paths with descriptions
150
151
  assert "- " in content, "Files should be listed with bullet points"
151
152
  assert "Health diagnostics" in content, "Descriptions should be present"
153
+
154
+
155
+ class TestCode2logicExport:
156
+ """Test the _export_code2logic wrapper."""
157
+
158
+ @pytest.fixture
159
+ def temp_output_dir(self):
160
+ """Create temporary output directory."""
161
+ with tempfile.TemporaryDirectory() as tmpdir:
162
+ yield Path(tmpdir)
163
+
164
+ def test_export_code2logic_adds_quiet_flag_when_not_verbose(self, temp_output_dir):
165
+ args = MagicMock()
166
+ args.verbose = False
167
+
168
+ source_path = Path('/home/user/myproject')
169
+ formats = ['code2logic']
170
+
171
+ completed = MagicMock()
172
+ completed.returncode = 0
173
+ completed.stdout = ""
174
+ completed.stderr = ""
175
+
176
+ with patch('code2llm.cli.shutil.which', return_value='/usr/bin/code2logic'), \
177
+ patch('code2llm.cli.subprocess.run', return_value=completed) as run_mock, \
178
+ patch('pathlib.Path.exists', return_value=True):
179
+ _export_code2logic(args, source_path, temp_output_dir, formats)
180
+
181
+ called_cmd = run_mock.call_args[0][0]
182
+ assert '-q' in called_cmd
183
+
184
+ def test_export_code2logic_does_not_add_quiet_flag_when_verbose(self, temp_output_dir):
185
+ args = MagicMock()
186
+ args.verbose = True
187
+
188
+ source_path = Path('/home/user/myproject')
189
+ formats = ['code2logic']
190
+
191
+ completed = MagicMock()
192
+ completed.returncode = 0
193
+ completed.stdout = ""
194
+ completed.stderr = ""
195
+
196
+ with patch('code2llm.cli.shutil.which', return_value='/usr/bin/code2logic'), \
197
+ patch('code2llm.cli.subprocess.run', return_value=completed) as run_mock, \
198
+ patch('pathlib.Path.exists', return_value=True):
199
+ _export_code2logic(args, source_path, temp_output_dir, formats)
200
+
201
+ called_cmd = run_mock.call_args[0][0]
202
+ assert '-q' not in called_cmd
152
203
 
153
204
  def test_prompt_txt_no_verbose_output(self, temp_output_dir):
154
205
  """Test that no print occurs when verbose is False."""
File without changes
File without changes
File without changes
File without changes