code2docs 3.0.2__tar.gz → 3.0.3__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 (65) hide show
  1. {code2docs-3.0.2 → code2docs-3.0.3}/PKG-INFO +3 -3
  2. {code2docs-3.0.2 → code2docs-3.0.3}/README.md +2 -2
  3. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/__init__.py +1 -1
  4. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/analyzers/dependency_scanner.py +38 -0
  5. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/_registry_adapters.py +10 -4
  6. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/contributing_gen.py +2 -1
  7. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/examples_gen.py +38 -0
  8. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/getting_started_gen.py +2 -1
  9. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/mkdocs_gen.py +44 -4
  10. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs.egg-info/PKG-INFO +3 -3
  11. {code2docs-3.0.2 → code2docs-3.0.3}/pyproject.toml +1 -1
  12. {code2docs-3.0.2 → code2docs-3.0.3}/LICENSE +0 -0
  13. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/__main__.py +0 -0
  14. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/analyzers/__init__.py +0 -0
  15. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/analyzers/docstring_extractor.py +0 -0
  16. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/analyzers/endpoint_detector.py +0 -0
  17. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/analyzers/project_scanner.py +0 -0
  18. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/base.py +0 -0
  19. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/cli.py +0 -0
  20. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/config.py +0 -0
  21. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/examples/advanced_usage.py +0 -0
  22. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/examples/quickstart.py +0 -0
  23. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/formatters/__init__.py +0 -0
  24. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/formatters/badges.py +0 -0
  25. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/formatters/markdown.py +0 -0
  26. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/formatters/toc.py +0 -0
  27. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/__init__.py +0 -0
  28. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/_source_links.py +0 -0
  29. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/api_changelog_gen.py +0 -0
  30. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/api_reference_gen.py +0 -0
  31. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/architecture_gen.py +0 -0
  32. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/changelog_gen.py +0 -0
  33. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/code2llm_gen.py +0 -0
  34. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/config_docs_gen.py +0 -0
  35. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/coverage_gen.py +0 -0
  36. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/depgraph_gen.py +0 -0
  37. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/module_docs_gen.py +0 -0
  38. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/generators/readme_gen.py +0 -0
  39. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/llm_helper.py +0 -0
  40. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/registry.py +0 -0
  41. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/sync/__init__.py +0 -0
  42. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/sync/differ.py +0 -0
  43. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/sync/updater.py +0 -0
  44. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/sync/watcher.py +0 -0
  45. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/templates/api_module.md.j2 +0 -0
  46. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/templates/architecture.md.j2 +0 -0
  47. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/templates/example_usage.py.j2 +0 -0
  48. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/templates/index.md.j2 +0 -0
  49. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/templates/module_doc.md.j2 +0 -0
  50. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs/templates/readme.md.j2 +0 -0
  51. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs.egg-info/SOURCES.txt +0 -0
  52. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs.egg-info/dependency_links.txt +0 -0
  53. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs.egg-info/entry_points.txt +0 -0
  54. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs.egg-info/requires.txt +0 -0
  55. {code2docs-3.0.2 → code2docs-3.0.3}/code2docs.egg-info/top_level.txt +0 -0
  56. {code2docs-3.0.2 → code2docs-3.0.3}/setup.cfg +0 -0
  57. {code2docs-3.0.2 → code2docs-3.0.3}/tests/test_analyzers.py +0 -0
  58. {code2docs-3.0.2 → code2docs-3.0.3}/tests/test_cli.py +0 -0
  59. {code2docs-3.0.2 → code2docs-3.0.3}/tests/test_code2docs.py +0 -0
  60. {code2docs-3.0.2 → code2docs-3.0.3}/tests/test_config.py +0 -0
  61. {code2docs-3.0.2 → code2docs-3.0.3}/tests/test_formatters.py +0 -0
  62. {code2docs-3.0.2 → code2docs-3.0.3}/tests/test_generators.py +0 -0
  63. {code2docs-3.0.2 → code2docs-3.0.3}/tests/test_llm_helper.py +0 -0
  64. {code2docs-3.0.2 → code2docs-3.0.3}/tests/test_registry.py +0 -0
  65. {code2docs-3.0.2 → code2docs-3.0.3}/tests/test_sync.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code2docs
3
- Version: 3.0.2
3
+ Version: 3.0.3
4
4
  Summary: Auto-generate and sync project documentation from source code analysis
5
5
  Author-email: Tom Sapletta <tom@sapletta.com>
6
6
  License-Expression: Apache-2.0
@@ -50,7 +50,7 @@ Dynamic: license-file
50
50
 
51
51
  # code2docs
52
52
 
53
- ![version](https://img.shields.io/badge/version-3.0.2-blue) ![python](https://img.shields.io/badge/python-%3E%3D3.9-blue) ![docs](https://img.shields.io/badge/docs-auto--generated-blueviolet)
53
+ ![version](https://img.shields.io/badge/version-3.0.3-blue) ![python](https://img.shields.io/badge/python-%3E%3D3.9-blue) ![docs](https://img.shields.io/badge/docs-auto--generated-blueviolet)
54
54
 
55
55
  > Auto-generate and sync project documentation from source code analysis.
56
56
 
@@ -190,7 +190,7 @@ code2docs can update only specific sections of an existing README using markers:
190
190
  ```markdown
191
191
  <!-- code2docs:start --># code2docs
192
192
 
193
- ![version](https://img.shields.io/badge/version-3.0.2-blue) ![python](https://img.shields.io/badge/python-%3E%3D3.9-blue) ![coverage](https://img.shields.io/badge/coverage-unknown-lightgrey) ![functions](https://img.shields.io/badge/functions-276-green)
193
+ ![version](https://img.shields.io/badge/version-3.0.3-blue) ![python](https://img.shields.io/badge/python-%3E%3D3.9-blue) ![coverage](https://img.shields.io/badge/coverage-unknown-lightgrey) ![functions](https://img.shields.io/badge/functions-276-green)
194
194
  > **276** functions | **57** classes | **51** files | CC̄ = 3.8
195
195
 
196
196
  > Auto-generated project documentation from source code analysis.
@@ -1,6 +1,6 @@
1
1
  # code2docs
2
2
 
3
- ![version](https://img.shields.io/badge/version-3.0.2-blue) ![python](https://img.shields.io/badge/python-%3E%3D3.9-blue) ![docs](https://img.shields.io/badge/docs-auto--generated-blueviolet)
3
+ ![version](https://img.shields.io/badge/version-3.0.3-blue) ![python](https://img.shields.io/badge/python-%3E%3D3.9-blue) ![docs](https://img.shields.io/badge/docs-auto--generated-blueviolet)
4
4
 
5
5
  > Auto-generate and sync project documentation from source code analysis.
6
6
 
@@ -140,7 +140,7 @@ code2docs can update only specific sections of an existing README using markers:
140
140
  ```markdown
141
141
  <!-- code2docs:start --># code2docs
142
142
 
143
- ![version](https://img.shields.io/badge/version-3.0.2-blue) ![python](https://img.shields.io/badge/python-%3E%3D3.9-blue) ![coverage](https://img.shields.io/badge/coverage-unknown-lightgrey) ![functions](https://img.shields.io/badge/functions-276-green)
143
+ ![version](https://img.shields.io/badge/version-3.0.3-blue) ![python](https://img.shields.io/badge/python-%3E%3D3.9-blue) ![coverage](https://img.shields.io/badge/coverage-unknown-lightgrey) ![functions](https://img.shields.io/badge/functions-276-green)
144
144
  > **276** functions | **57** classes | **51** files | CC̄ = 3.8
145
145
 
146
146
  > Auto-generated project documentation from source code analysis.
@@ -5,7 +5,7 @@ Uses code2llm's AnalysisResult to produce human-readable documentation:
5
5
  README.md, API references, module docs, examples, and architecture diagrams.
6
6
  """
7
7
 
8
- __version__ = "3.0.2"
8
+ __version__ = "3.0.3"
9
9
  __author__ = "Tom Sapletta"
10
10
 
11
11
  from .config import Code2DocsConfig
@@ -32,6 +32,11 @@ class ProjectDependencies:
32
32
  optional_groups: Dict[str, List[DependencyInfo]] = field(default_factory=dict)
33
33
  install_command: str = "pip install ."
34
34
  source_file: str = ""
35
+ # Additional metadata from pyproject.toml
36
+ keywords: List[str] = field(default_factory=list)
37
+ classifiers: List[str] = field(default_factory=list)
38
+ urls: Dict[str, str] = field(default_factory=dict)
39
+ version: str = ""
35
40
 
36
41
 
37
42
  class DependencyScanner:
@@ -76,6 +81,10 @@ class DependencyScanner:
76
81
 
77
82
  project = data.get("project", {})
78
83
  deps.python_version = project.get("requires-python", "")
84
+ deps.version = project.get("version", "")
85
+ deps.keywords = project.get("keywords", [])
86
+ deps.classifiers = project.get("classifiers", [])
87
+ deps.urls = project.get("urls", {})
79
88
 
80
89
  # Main dependencies
81
90
  for dep_str in project.get("dependencies", []):
@@ -96,6 +105,9 @@ class DependencyScanner:
96
105
  if name:
97
106
  deps.install_command = f"pip install {name}"
98
107
 
108
+ # Detect version with fallback to git tags or VERSION file
109
+ deps.version = self._detect_version(path.parent, deps.version)
110
+
99
111
  return deps
100
112
 
101
113
  def _parse_pyproject_regex(self, path: Path) -> ProjectDependencies:
@@ -157,3 +169,29 @@ class DependencyScanner:
157
169
  version_spec=match.group(2).strip(),
158
170
  )
159
171
  return DependencyInfo(name=dep_str.strip())
172
+
173
+ def _detect_version(self, project_path: Path, pyproject_version: str = "") -> str:
174
+ """Detect version from pyproject.toml, git tags, or VERSION file."""
175
+ # Priority 1: pyproject.toml version
176
+ if pyproject_version:
177
+ return pyproject_version
178
+
179
+ # Priority 2: VERSION file
180
+ version_file = project_path / "VERSION"
181
+ if version_file.exists():
182
+ return version_file.read_text(encoding="utf-8").strip()
183
+
184
+ # Priority 3: git tags (latest tag)
185
+ try:
186
+ import subprocess
187
+ result = subprocess.run(
188
+ ["git", "describe", "--tags", "--abbrev=0"],
189
+ cwd=str(project_path),
190
+ capture_output=True, text=True, timeout=5,
191
+ )
192
+ if result.returncode == 0:
193
+ return result.stdout.strip().lstrip("v")
194
+ except (subprocess.TimeoutExpired, FileNotFoundError):
195
+ pass
196
+
197
+ return ""
@@ -25,7 +25,12 @@ class ReadmeGeneratorAdapter(BaseGenerator):
25
25
  preview = content[:500] + "..." if len(content) > 500 else content
26
26
  click.echo(preview)
27
27
  return None
28
- readme_path = ctx.project / self.config.readme_output
28
+ # Use docs_dir if readme_output is a simple filename, otherwise respect the path
29
+ readme_output = Path(self.config.readme_output)
30
+ if readme_output.parent == Path("."):
31
+ readme_path = ctx.docs_dir / readme_output.name
32
+ else:
33
+ readme_path = ctx.project / readme_output
29
34
  gen.write(str(readme_path), content)
30
35
  return f"✅ {readme_path.relative_to(ctx.project)}"
31
36
 
@@ -141,7 +146,7 @@ class ExamplesAdapter(BaseGenerator):
141
146
  files = gen.generate_all()
142
147
  if ctx.dry_run:
143
148
  return f"[dry-run] examples/ ({len(files)} files)"
144
- examples_dir = ctx.project / "examples"
149
+ examples_dir = ctx.docs_dir / "examples"
145
150
  gen.write_all(str(examples_dir), files)
146
151
  return f"✅ examples/ ({len(files)} files)"
147
152
 
@@ -158,7 +163,7 @@ class MkDocsAdapter(BaseGenerator):
158
163
  content = gen.generate(str(ctx.docs_dir))
159
164
  if ctx.dry_run:
160
165
  return "[dry-run] mkdocs.yml"
161
- gen.write(str(ctx.project / "mkdocs.yml"), content)
166
+ gen.write(str(ctx.docs_dir / "mkdocs.yml"), content)
162
167
  return "✅ mkdocs.yml"
163
168
 
164
169
 
@@ -208,7 +213,8 @@ class ContributingAdapter(BaseGenerator):
208
213
  content = gen.generate()
209
214
  if ctx.dry_run:
210
215
  return "[dry-run] CONTRIBUTING.md"
211
- (ctx.project / "CONTRIBUTING.md").write_text(content, encoding="utf-8")
216
+ ctx.docs_dir.mkdir(parents=True, exist_ok=True)
217
+ (ctx.docs_dir / "CONTRIBUTING.md").write_text(content, encoding="utf-8")
212
218
  return "✅ CONTRIBUTING.md"
213
219
 
214
220
 
@@ -54,10 +54,11 @@ class ContributingGenerator:
54
54
  def _render_setup(self, tools: Dict[str, bool]) -> str:
55
55
  """Render development setup instructions."""
56
56
  project = self.config.project_name or "project"
57
+ repo_url = self.config.repo_url or "<repository-url>"
57
58
  lines = [
58
59
  "## Development Setup\n",
59
60
  "```bash",
60
- f"git clone <repository-url>",
61
+ f"git clone {repo_url}",
61
62
  f"cd {project}",
62
63
  "python -m venv .venv",
63
64
  "source .venv/bin/activate # or .venv\\Scripts\\activate on Windows",
@@ -59,6 +59,44 @@ class ExamplesGenerator:
59
59
  self.result = result
60
60
  self._pkg = self._detect_package_name()
61
61
 
62
+ def _get_example_value(self, arg_name: str) -> str:
63
+ """Get realistic example value based on actual project config."""
64
+ project_name = self.config.project_name or Path(self.result.project_path).name
65
+
66
+ # Map argument names to actual config values
67
+ arg_mappings = {
68
+ "project_path": f'"./{project_name}"',
69
+ "path": f'"./{project_name}"',
70
+ "source": f'"{self.config.source}"' if self.config.source else '"./src"',
71
+ "output": f'"{self.config.output}"' if self.config.output else '"./docs"',
72
+ "output_dir": f'"{self.config.output}"' if self.config.output else '"./docs"',
73
+ "output_path": f'"{self.config.readme_output}"' if self.config.readme_output else '"./docs/README.md"',
74
+ "config": "config",
75
+ "config_path": '"code2docs.yaml"',
76
+ "result": "result",
77
+ "name": f'"{project_name}"',
78
+ "project_name": f'"{project_name}"',
79
+ "verbose": "True",
80
+ "dry_run": "False",
81
+ "readme_only": "False",
82
+ "sections": '["overview", "install", "quickstart"]',
83
+ "content": '"# My Doc\\n## Section"',
84
+ "markdown_content": '"# My Doc\\n## Section"',
85
+ "max_depth": "3",
86
+ "target": "80",
87
+ "badge_types": '["version", "python"]',
88
+ "stats": "{}",
89
+ "deps": "[]",
90
+ "sync_markers": "True",
91
+ "docstring": '"""My function docstring."""',
92
+ }
93
+
94
+ if arg_name in arg_mappings:
95
+ return arg_mappings[arg_name]
96
+
97
+ # Fallback to original static examples
98
+ return _ARG_EXAMPLES.get(arg_name, '"..."')
99
+
62
100
  def generate_all(self) -> Dict[str, str]:
63
101
  """Generate all example files. Returns {filename: content}."""
64
102
  files: Dict[str, str] = {}
@@ -59,6 +59,7 @@ class GettingStartedGenerator:
59
59
  dep_scanner = DependencyScanner()
60
60
  deps = dep_scanner.scan(self.result.project_path)
61
61
  cmd = deps.install_command or f"pip install {self.config.project_name or '.'}"
62
+ repo_url = self.config.repo_url or "<repository-url>"
62
63
  lines = [
63
64
  "## Installation\n",
64
65
  "```bash",
@@ -66,7 +67,7 @@ class GettingStartedGenerator:
66
67
  "```\n",
67
68
  "To install from source:\n",
68
69
  "```bash",
69
- "git clone <repository-url>",
70
+ f"git clone {repo_url}",
70
71
  f"cd {self.config.project_name or 'project'}",
71
72
  "pip install -e .",
72
73
  "```",
@@ -1,7 +1,7 @@
1
1
  """MkDocs configuration generator — auto-generate mkdocs.yml from docs tree."""
2
2
 
3
3
  from pathlib import Path
4
- from typing import Dict, List, Optional
4
+ from typing import Any, Dict, List, Optional
5
5
 
6
6
  import yaml
7
7
 
@@ -22,11 +22,14 @@ class MkDocsGenerator:
22
22
  project_name = self.config.project_name or "Project"
23
23
  nav = self._build_nav(docs_dir)
24
24
 
25
+ # Read MkDocs config from pyproject.toml if available
26
+ mkdocs_config = self._read_pyproject_mkdocs()
27
+
25
28
  data = {
26
29
  "site_name": f"{project_name} Documentation",
27
- "theme": {"name": "material"},
30
+ "theme": mkdocs_config.get("theme", {"name": "material"}),
28
31
  "nav": nav,
29
- "markdown_extensions": [
32
+ "markdown_extensions": mkdocs_config.get("markdown_extensions", [
30
33
  "admonition",
31
34
  "pymdownx.highlight",
32
35
  "pymdownx.superfences",
@@ -37,10 +40,47 @@ class MkDocsGenerator:
37
40
  "format": "!!python/name:pymdownx.superfences.fence_code_format",
38
41
  }]
39
42
  }},
40
- ],
43
+ ]),
41
44
  }
45
+
46
+ # Add extra fields from pyproject.toml if present
47
+ for key in ["extra_css", "extra_javascript", "plugins", "copyright"]:
48
+ if key in mkdocs_config:
49
+ data[key] = mkdocs_config[key]
50
+
42
51
  return yaml.dump(data, default_flow_style=False, sort_keys=False)
43
52
 
53
+ def _read_pyproject_mkdocs(self) -> Dict[str, Any]:
54
+ """Read MkDocs configuration from [tool.mkdocs] in pyproject.toml."""
55
+ project_path = Path(self.result.project_path)
56
+ pyproject_path = project_path / "pyproject.toml"
57
+
58
+ if not pyproject_path.exists():
59
+ # Also check parent directory (for nested packages)
60
+ pyproject_path = project_path.parent / "pyproject.toml"
61
+
62
+ if not pyproject_path.exists():
63
+ return {}
64
+
65
+ try:
66
+ import tomllib
67
+ with open(pyproject_path, "rb") as f:
68
+ data = tomllib.load(f)
69
+
70
+ # Support both [tool.mkdocs] and [tool.poetry.plugins.mkdocs] formats
71
+ tool_data = data.get("tool", {})
72
+ mkdocs_data = tool_data.get("mkdocs", {})
73
+
74
+ # Also check for poetry-style config
75
+ if not mkdocs_data:
76
+ poetry = tool_data.get("poetry", {})
77
+ plugins = poetry.get("plugins", {})
78
+ mkdocs_data = plugins.get("mkdocs", {})
79
+
80
+ return mkdocs_data
81
+ except Exception:
82
+ return {}
83
+
44
84
  def _build_nav(self, docs_dir: Optional[str] = None) -> List:
45
85
  """Build navigation structure from docs tree and analysis."""
46
86
  nav: List = [{"Home": "index.md"}]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code2docs
3
- Version: 3.0.2
3
+ Version: 3.0.3
4
4
  Summary: Auto-generate and sync project documentation from source code analysis
5
5
  Author-email: Tom Sapletta <tom@sapletta.com>
6
6
  License-Expression: Apache-2.0
@@ -50,7 +50,7 @@ Dynamic: license-file
50
50
 
51
51
  # code2docs
52
52
 
53
- ![version](https://img.shields.io/badge/version-3.0.2-blue) ![python](https://img.shields.io/badge/python-%3E%3D3.9-blue) ![docs](https://img.shields.io/badge/docs-auto--generated-blueviolet)
53
+ ![version](https://img.shields.io/badge/version-3.0.3-blue) ![python](https://img.shields.io/badge/python-%3E%3D3.9-blue) ![docs](https://img.shields.io/badge/docs-auto--generated-blueviolet)
54
54
 
55
55
  > Auto-generate and sync project documentation from source code analysis.
56
56
 
@@ -190,7 +190,7 @@ code2docs can update only specific sections of an existing README using markers:
190
190
  ```markdown
191
191
  <!-- code2docs:start --># code2docs
192
192
 
193
- ![version](https://img.shields.io/badge/version-3.0.2-blue) ![python](https://img.shields.io/badge/python-%3E%3D3.9-blue) ![coverage](https://img.shields.io/badge/coverage-unknown-lightgrey) ![functions](https://img.shields.io/badge/functions-276-green)
193
+ ![version](https://img.shields.io/badge/version-3.0.3-blue) ![python](https://img.shields.io/badge/python-%3E%3D3.9-blue) ![coverage](https://img.shields.io/badge/coverage-unknown-lightgrey) ![functions](https://img.shields.io/badge/functions-276-green)
194
194
  > **276** functions | **57** classes | **51** files | CC̄ = 3.8
195
195
 
196
196
  > Auto-generated project documentation from source code analysis.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code2docs"
7
- version = "3.0.2"
7
+ version = "3.0.3"
8
8
  description = "Auto-generate and sync project documentation from source code analysis"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes