code2logic 1.0.6__tar.gz → 1.0.7__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 (90) hide show
  1. {code2logic-1.0.6 → code2logic-1.0.7}/PKG-INFO +8 -5
  2. {code2logic-1.0.6 → code2logic-1.0.7}/README.md +7 -4
  3. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/__init__.py +1 -1
  4. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/analyzer.py +17 -3
  5. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/cli.py +69 -14
  6. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/generators.py +867 -142
  7. code2logic-1.0.7/code2logic/models.py +337 -0
  8. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/parsers.py +510 -84
  9. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/schemas/yaml_schema.py +24 -3
  10. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/toon_format.py +153 -0
  11. {code2logic-1.0.6 → code2logic-1.0.7}/pyproject.toml +2 -2
  12. {code2logic-1.0.6 → code2logic-1.0.7}/tests/test_yaml_compact.py +39 -9
  13. code2logic-1.0.6/code2logic/models.py +0 -177
  14. {code2logic-1.0.6 → code2logic-1.0.7}/.gitignore +0 -0
  15. {code2logic-1.0.6 → code2logic-1.0.7}/CHANGELOG.md +0 -0
  16. {code2logic-1.0.6 → code2logic-1.0.7}/LICENSE +0 -0
  17. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/__main__.py +0 -0
  18. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/adaptive.py +0 -0
  19. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/base.py +0 -0
  20. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/benchmark.py +0 -0
  21. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/benchmarks/__init__.py +0 -0
  22. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/benchmarks/common.py +0 -0
  23. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/benchmarks/results.py +0 -0
  24. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/benchmarks/runner.py +0 -0
  25. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/chunked_reproduction.py +0 -0
  26. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/code_review.py +0 -0
  27. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/config.py +0 -0
  28. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/core/__init__.py +0 -0
  29. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/dependency.py +0 -0
  30. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/errors.py +0 -0
  31. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/file_formats.py +0 -0
  32. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/formats/__init__.py +0 -0
  33. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/gherkin.py +0 -0
  34. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/integrations/__init__.py +0 -0
  35. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/intent.py +0 -0
  36. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/llm/__init__.py +0 -0
  37. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/llm.py +0 -0
  38. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/llm_clients.py +0 -0
  39. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/llm_profiler.py +0 -0
  40. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/logicml.py +0 -0
  41. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/markdown_format.py +0 -0
  42. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/mcp_server.py +0 -0
  43. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/metrics.py +0 -0
  44. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/project_reproducer.py +0 -0
  45. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/prompts.py +0 -0
  46. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/py.typed +0 -0
  47. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/quality.py +0 -0
  48. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/refactor.py +0 -0
  49. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/reproducer.py +0 -0
  50. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/reproduction.py +0 -0
  51. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/schemas/__init__.py +0 -0
  52. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/schemas/json_schema.py +0 -0
  53. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/schemas/logicml_schema.py +0 -0
  54. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/schemas/markdown_schema.py +0 -0
  55. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/shared_utils.py +0 -0
  56. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/similarity.py +0 -0
  57. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/terminal.py +0 -0
  58. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/tools/__init__.py +0 -0
  59. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/universal.py +0 -0
  60. {code2logic-1.0.6 → code2logic-1.0.7}/code2logic/utils.py +0 -0
  61. {code2logic-1.0.6 → code2logic-1.0.7}/tests/__init__.py +0 -0
  62. {code2logic-1.0.6 → code2logic-1.0.7}/tests/conftest.py +0 -0
  63. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_algorithms.py +0 -0
  64. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_api.py +0 -0
  65. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_async.py +0 -0
  66. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_class.py +0 -0
  67. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_dataclasses.py +0 -0
  68. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_enum.py +0 -0
  69. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_functions.py +0 -0
  70. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_go.go +0 -0
  71. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_javascript.js +0 -0
  72. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_pydantic.py +0 -0
  73. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_reexport/__init__.py +0 -0
  74. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_reexport/exceptions.py +0 -0
  75. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_reexport/models.py +0 -0
  76. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_reexport/utils.py +0 -0
  77. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_rust.rs +0 -0
  78. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_sql.sql +0 -0
  79. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_sql_dsl.py +0 -0
  80. {code2logic-1.0.6 → code2logic-1.0.7}/tests/samples/sample_typescript.ts +0 -0
  81. {code2logic-1.0.6 → code2logic-1.0.7}/tests/test_analyzer.py +0 -0
  82. {code2logic-1.0.6 → code2logic-1.0.7}/tests/test_error_handling.py +0 -0
  83. {code2logic-1.0.6 → code2logic-1.0.7}/tests/test_formats.py +0 -0
  84. {code2logic-1.0.6 → code2logic-1.0.7}/tests/test_generators.py +0 -0
  85. {code2logic-1.0.6 → code2logic-1.0.7}/tests/test_intent.py +0 -0
  86. {code2logic-1.0.6 → code2logic-1.0.7}/tests/test_llm_priority.py +0 -0
  87. {code2logic-1.0.6 → code2logic-1.0.7}/tests/test_llm_profiler.py +0 -0
  88. {code2logic-1.0.6 → code2logic-1.0.7}/tests/test_parser_integrity.py +0 -0
  89. {code2logic-1.0.6 → code2logic-1.0.7}/tests/test_reproduction.py +0 -0
  90. {code2logic-1.0.6 → code2logic-1.0.7}/tests/test_shared_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code2logic
3
- Version: 1.0.6
3
+ Version: 1.0.7
4
4
  Summary: Convert source code to logical representation for LLM analysis
5
5
  Project-URL: Homepage, https://github.com/wronai/code2logic
6
6
  Project-URL: Documentation, https://code2logic.readthedocs.io
@@ -318,11 +318,14 @@ pip install code2logic[nlp] # Enhanced intents
318
318
  # Standard Markdown output
319
319
  code2logic /path/to/project
320
320
 
321
- # Compact format (10-15x smaller)
322
- code2logic /path/to/project -f compact
321
+ # Compact YAML (14% smaller, meta.legend transparency)
322
+ code2logic /path/to/project -f yaml --compact -o analysis-compact.yaml
323
323
 
324
- # JSON for RAG systems
325
- code2logic /path/to/project -f json -o project.json
324
+ # Ultra-compact TOON (71% smaller, single-letter keys)
325
+ code2logic /path/to/project -f toon --ultra-compact -o analysis-ultra.toon
326
+
327
+ # Generate schema alongside output
328
+ code2logic /path/to/project -f yaml --compact --with-schema
326
329
 
327
330
  # With detailed analysis
328
331
  code2logic /path/to/project -d detailed
@@ -49,11 +49,14 @@ pip install code2logic[nlp] # Enhanced intents
49
49
  # Standard Markdown output
50
50
  code2logic /path/to/project
51
51
 
52
- # Compact format (10-15x smaller)
53
- code2logic /path/to/project -f compact
52
+ # Compact YAML (14% smaller, meta.legend transparency)
53
+ code2logic /path/to/project -f yaml --compact -o analysis-compact.yaml
54
54
 
55
- # JSON for RAG systems
56
- code2logic /path/to/project -f json -o project.json
55
+ # Ultra-compact TOON (71% smaller, single-letter keys)
56
+ code2logic /path/to/project -f toon --ultra-compact -o analysis-ultra.toon
57
+
58
+ # Generate schema alongside output
59
+ code2logic /path/to/project -f yaml --compact --with-schema
57
60
 
58
61
  # With detailed analysis
59
62
  code2logic /path/to/project -d detailed
@@ -18,7 +18,7 @@ Example:
18
18
  >>> print(output)
19
19
  """
20
20
 
21
- __version__ = "1.0.6"
21
+ __version__ = "1.0.7"
22
22
  __author__ = "Softreck"
23
23
  __email__ = "info@softreck.dev"
24
24
  __license__ = "MIT"
@@ -157,6 +157,7 @@ class ProjectAnalyzer:
157
157
  similar_functions=similar,
158
158
  total_files=len(self.modules),
159
159
  total_lines=sum(m.lines_total for m in self.modules),
160
+ total_bytes=sum(getattr(m, 'file_bytes', 0) for m in self.modules),
160
161
  generated_at=datetime.now().isoformat()
161
162
  )
162
163
 
@@ -192,13 +193,26 @@ class ProjectAnalyzer:
192
193
 
193
194
  # Try Tree-sitter first, then fallback
194
195
  module = None
195
- if self.ts_parser and self.ts_parser.is_available(language):
196
- module = self.ts_parser.parse(rel_path, content, language)
196
+ try:
197
+ if self.ts_parser and self.ts_parser.is_available(language):
198
+ module = self.ts_parser.parse(rel_path, content, language)
199
+ except Exception as e:
200
+ if self.verbose:
201
+ print(f"Tree-sitter parser failed for {rel_path}: {e}", file=sys.stderr)
197
202
 
198
203
  if module is None:
199
- module = self.fallback_parser.parse(rel_path, content, language)
204
+ try:
205
+ module = self.fallback_parser.parse(rel_path, content, language)
206
+ except Exception as e:
207
+ if self.verbose:
208
+ print(f"Fallback parser failed for {rel_path}: {e}", file=sys.stderr)
209
+ continue
200
210
 
201
211
  if module:
212
+ try:
213
+ module.file_bytes = fp.stat().st_size
214
+ except Exception:
215
+ module.file_bytes = len(content.encode('utf-8', errors='ignore'))
202
216
  self.modules.append(module)
203
217
 
204
218
  def _detect_entrypoints(self) -> List[str]:
@@ -540,6 +540,7 @@ Output formats (token efficiency):
540
540
  yaml - Readable (~35K tokens/100 files) - nested/flat
541
541
  logicml - Compressed (best compression) - reproduction-oriented
542
542
  toon - Token-oriented (~JSON-size, more LLM-friendly) - tabular arrays
543
+ hybrid - Optimal balance (70% YAML size, 90% info, best LLM quality)
543
544
  gherkin - Behavioral scenarios - good for minimal implementations
544
545
  markdown - Documentation (~55K tokens/100 files)
545
546
 
@@ -610,6 +611,26 @@ code2logic [path] [options]
610
611
  action='store_true',
611
612
  help='Use flat structure (for json/yaml) - better for comparisons'
612
613
  )
614
+ parser.add_argument(
615
+ '--compact',
616
+ action='store_true',
617
+ help='Use compact YAML format (14% smaller, meta.legend transparency)'
618
+ )
619
+ parser.add_argument(
620
+ '--ultra-compact',
621
+ action='store_true',
622
+ help='Use ultra-compact TOON format (71% smaller, single-letter keys)'
623
+ )
624
+ parser.add_argument(
625
+ '--hybrid',
626
+ action='store_true',
627
+ help='Use hybrid format (70% of YAML size, 90% of info, best LLM quality)'
628
+ )
629
+ parser.add_argument(
630
+ '--with-schema',
631
+ action='store_true',
632
+ help='Generate JSON schema alongside output'
633
+ )
613
634
  parser.add_argument(
614
635
  '--no-install',
615
636
  action='store_true',
@@ -822,22 +843,56 @@ code2logic [path] [options]
822
843
  output = generator.generate(project, flat=args.flat, detail=args.detail)
823
844
  elif args.format == 'yaml':
824
845
  generator = YAMLGenerator()
825
- output = generator.generate(project, flat=args.flat, detail=args.detail)
826
- elif args.format == 'csv':
827
- generator = CSVGenerator()
828
- output = generator.generate(project, detail=args.detail)
829
- elif args.format == 'gherkin':
830
- generator = GherkinGenerator()
831
- output = generator.generate(project, detail=args.detail)
832
-
846
+ compact = args.compact if hasattr(args, 'compact') else False
847
+ hybrid = args.hybrid if hasattr(args, 'hybrid') else False
848
+
849
+ if hybrid:
850
+ output = generator.generate_hybrid(project, detail=args.detail)
851
+ else:
852
+ output = generator.generate(project, flat=args.flat, detail=args.detail, compact=compact)
853
+
854
+ # Generate schema if requested
855
+ if args.with_schema:
856
+ if hybrid:
857
+ schema = generator.generate_schema('hybrid')
858
+ else:
859
+ schema = generator.generate_schema('compact' if compact else 'full')
860
+ base_name = os.path.splitext(args.output)[0] if args.output else 'output'
861
+ schema_path = f"{base_name}.yaml-schema.json"
862
+ with open(schema_path, 'w', encoding='utf-8') as f:
863
+ f.write(schema)
864
+ if args.verbose:
865
+ log.success(f"Schema written to: {schema_path}")
866
+
833
867
  elif args.format == 'toon':
834
868
  generator = TOONGenerator()
835
- detail_map = {
836
- 'minimal': 'compact',
837
- 'standard': 'standard',
838
- 'full': 'full',
839
- }
840
- output = generator.generate(project, detail=detail_map.get(args.detail, 'standard'))
869
+ # For TOON, --compact means ultra-compact format
870
+ compact = args.compact if hasattr(args, 'compact') else False
871
+ ultra_compact = args.ultra_compact if hasattr(args, 'ultra_compact') else False
872
+
873
+ # Use compact or ultra_compact flag (compact takes precedence for TOON)
874
+ use_ultra_compact = ultra_compact or compact
875
+
876
+ if use_ultra_compact:
877
+ output = generator.generate_ultra_compact(project)
878
+ else:
879
+ detail_map = {
880
+ 'minimal': 'compact',
881
+ 'standard': 'standard',
882
+ 'full': 'full',
883
+ }
884
+ output = generator.generate(project, detail=detail_map.get(args.detail, 'standard'))
885
+
886
+ # Generate schema if requested
887
+ if args.with_schema:
888
+ schema_type = 'ultra_compact' if use_ultra_compact else 'standard'
889
+ schema = generator.generate_schema(schema_type)
890
+ base_name = os.path.splitext(args.output)[0] if args.output else 'output'
891
+ schema_path = f"{base_name}.toon-schema.json"
892
+ with open(schema_path, 'w', encoding='utf-8') as f:
893
+ f.write(schema)
894
+ if args.verbose:
895
+ log.success(f"Schema written to: {schema_path}")
841
896
 
842
897
  elif args.format == 'logicml':
843
898
  generator = LogicMLGenerator()