tree-docs 0.1.0__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.
- tree_docs-0.1.0/PKG-INFO +57 -0
- tree_docs-0.1.0/README.md +25 -0
- tree_docs-0.1.0/pyproject.toml +85 -0
- tree_docs-0.1.0/setup.cfg +4 -0
- tree_docs-0.1.0/tests/test_generator.py +76 -0
- tree_docs-0.1.0/tree_docs/__init__.py +19 -0
- tree_docs-0.1.0/tree_docs/cli.py +100 -0
- tree_docs-0.1.0/tree_docs/config.py +58 -0
- tree_docs-0.1.0/tree_docs/defaults.py +159 -0
- tree_docs-0.1.0/tree_docs/generator.py +258 -0
- tree_docs-0.1.0/tree_docs.egg-info/PKG-INFO +57 -0
- tree_docs-0.1.0/tree_docs.egg-info/SOURCES.txt +14 -0
- tree_docs-0.1.0/tree_docs.egg-info/dependency_links.txt +1 -0
- tree_docs-0.1.0/tree_docs.egg-info/entry_points.txt +2 -0
- tree_docs-0.1.0/tree_docs.egg-info/requires.txt +8 -0
- tree_docs-0.1.0/tree_docs.egg-info/top_level.txt +1 -0
tree_docs-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: tree-docs
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Gerador automático de árvore de diretórios com emojis e comentários para documentação em Markdown
|
|
5
|
+
Author-email: Kelvin Matheus <kmathews.blaze@email.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/seu-usuario/tree-docs
|
|
8
|
+
Project-URL: Documentation, https://tree-docs.readthedocs.io
|
|
9
|
+
Project-URL: Repository, https://github.com/seu-usuario/tree-docs
|
|
10
|
+
Project-URL: Issues, https://github.com/seu-usuario/tree-docs/issues
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Topic :: Documentation
|
|
14
|
+
Classifier: Topic :: Software Development :: Documentation
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Operating System :: OS Independent
|
|
23
|
+
Requires-Python: >=3.8
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
28
|
+
Requires-Dist: black>=22.0.0; extra == "dev"
|
|
29
|
+
Requires-Dist: flake8>=5.0.0; extra == "dev"
|
|
30
|
+
Requires-Dist: mypy>=0.990; extra == "dev"
|
|
31
|
+
Requires-Dist: pre-commit>=2.20.0; extra == "dev"
|
|
32
|
+
|
|
33
|
+
# 🌳 TreeDocs
|
|
34
|
+
|
|
35
|
+
[](https://badge.fury.io/py/tree-docs)
|
|
36
|
+
[](https://www.python.org/downloads/)
|
|
37
|
+
[](https://opensource.org/licenses/MIT)
|
|
38
|
+
[](https://github.com/psf/black)
|
|
39
|
+
|
|
40
|
+
Gerador automático de árvore de diretórios com emojis e comentários para documentação em Markdown.
|
|
41
|
+
|
|
42
|
+
## ✨ Features
|
|
43
|
+
|
|
44
|
+
- 🚀 **Geração automática** da estrutura de diretórios
|
|
45
|
+
- 🎨 **Emojis** para identificar tipos de arquivos
|
|
46
|
+
- 📝 **Comentários** explicativos para pastas e arquivos
|
|
47
|
+
- 🎯 **Alinhamento** profissional dos comentários
|
|
48
|
+
- 🔧 **Altamente configurável**
|
|
49
|
+
- 💻 **CLI** e **API Python** disponíveis
|
|
50
|
+
- 📦 **Zero dependências** externas
|
|
51
|
+
|
|
52
|
+
## 📦 Instalação
|
|
53
|
+
|
|
54
|
+
### Via pip (recomendado)
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pip install tree-docs
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# 🌳 TreeDocs
|
|
2
|
+
|
|
3
|
+
[](https://badge.fury.io/py/tree-docs)
|
|
4
|
+
[](https://www.python.org/downloads/)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
[](https://github.com/psf/black)
|
|
7
|
+
|
|
8
|
+
Gerador automático de árvore de diretórios com emojis e comentários para documentação em Markdown.
|
|
9
|
+
|
|
10
|
+
## ✨ Features
|
|
11
|
+
|
|
12
|
+
- 🚀 **Geração automática** da estrutura de diretórios
|
|
13
|
+
- 🎨 **Emojis** para identificar tipos de arquivos
|
|
14
|
+
- 📝 **Comentários** explicativos para pastas e arquivos
|
|
15
|
+
- 🎯 **Alinhamento** profissional dos comentários
|
|
16
|
+
- 🔧 **Altamente configurável**
|
|
17
|
+
- 💻 **CLI** e **API Python** disponíveis
|
|
18
|
+
- 📦 **Zero dependências** externas
|
|
19
|
+
|
|
20
|
+
## 📦 Instalação
|
|
21
|
+
|
|
22
|
+
### Via pip (recomendado)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pip install tree-docs
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "tree-docs"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Gerador automático de árvore de diretórios com emojis e comentários para documentação em Markdown"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
authors = [
|
|
11
|
+
{name = "Kelvin Matheus", email = "kmathews.blaze@email.com"}
|
|
12
|
+
]
|
|
13
|
+
license = {text = "MIT"}
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 4 - Beta",
|
|
16
|
+
"Intended Audience :: Developers",
|
|
17
|
+
"Topic :: Documentation",
|
|
18
|
+
"Topic :: Software Development :: Documentation",
|
|
19
|
+
"License :: OSI Approved :: MIT License",
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Programming Language :: Python :: 3.8",
|
|
22
|
+
"Programming Language :: Python :: 3.9",
|
|
23
|
+
"Programming Language :: Python :: 3.10",
|
|
24
|
+
"Programming Language :: Python :: 3.11",
|
|
25
|
+
"Programming Language :: Python :: 3.12",
|
|
26
|
+
"Operating System :: OS Independent",
|
|
27
|
+
]
|
|
28
|
+
requires-python = ">=3.8"
|
|
29
|
+
dependencies = []
|
|
30
|
+
|
|
31
|
+
[project.scripts]
|
|
32
|
+
tree-docs = "tree_docs.cli:main"
|
|
33
|
+
|
|
34
|
+
[project.urls]
|
|
35
|
+
Homepage = "https://github.com/seu-usuario/tree-docs"
|
|
36
|
+
Documentation = "https://tree-docs.readthedocs.io"
|
|
37
|
+
Repository = "https://github.com/seu-usuario/tree-docs"
|
|
38
|
+
Issues = "https://github.com/seu-usuario/tree-docs/issues"
|
|
39
|
+
|
|
40
|
+
[project.optional-dependencies]
|
|
41
|
+
dev = [
|
|
42
|
+
"pytest>=7.0.0",
|
|
43
|
+
"pytest-cov>=4.0.0",
|
|
44
|
+
"black>=22.0.0",
|
|
45
|
+
"flake8>=5.0.0",
|
|
46
|
+
"mypy>=0.990",
|
|
47
|
+
"pre-commit>=2.20.0",
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
[tool.black]
|
|
51
|
+
line-length = 100
|
|
52
|
+
target-version = ['py38', 'py39', 'py310', 'py311', 'py312']
|
|
53
|
+
|
|
54
|
+
[tool.isort]
|
|
55
|
+
profile = "black"
|
|
56
|
+
line_length = 100
|
|
57
|
+
|
|
58
|
+
[tool.mypy]
|
|
59
|
+
python_version = "3.8"
|
|
60
|
+
warn_return_any = true
|
|
61
|
+
warn_unused_configs = true
|
|
62
|
+
disallow_untyped_defs = true
|
|
63
|
+
|
|
64
|
+
[tool.pytest.ini_options]
|
|
65
|
+
testpaths = ["tests"]
|
|
66
|
+
python_files = "test_*.py"
|
|
67
|
+
python_classes = "Test*"
|
|
68
|
+
python_functions = "test_*"
|
|
69
|
+
addopts = "--cov=tree_docs --cov-report=term-missing --cov-report=html"
|
|
70
|
+
|
|
71
|
+
[tool.coverage.run]
|
|
72
|
+
source = ["tree_docs"]
|
|
73
|
+
omit = ["tests/*", "examples/*"]
|
|
74
|
+
|
|
75
|
+
[tool.coverage.report]
|
|
76
|
+
exclude_lines = [
|
|
77
|
+
"pragma: no cover",
|
|
78
|
+
"def __repr__",
|
|
79
|
+
"if self.debug:",
|
|
80
|
+
"if __name__ == .__main__.:",
|
|
81
|
+
"raise AssertionError",
|
|
82
|
+
"raise NotImplementedError",
|
|
83
|
+
"if 0:",
|
|
84
|
+
"if False:",
|
|
85
|
+
]
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Testes para o TreeDocs
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import tempfile
|
|
7
|
+
import unittest
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from tree_docs import TreeGenerator, Config
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class TestTreeGenerator(unittest.TestCase):
|
|
14
|
+
"""Testes para o TreeGenerator"""
|
|
15
|
+
|
|
16
|
+
def setUp(self):
|
|
17
|
+
"""Configura ambiente de teste"""
|
|
18
|
+
self.temp_dir = tempfile.mkdtemp()
|
|
19
|
+
self.old_cwd = os.getcwd()
|
|
20
|
+
os.chdir(self.temp_dir)
|
|
21
|
+
|
|
22
|
+
# Cria estrutura de teste
|
|
23
|
+
os.makedirs("src/sub")
|
|
24
|
+
os.makedirs("tests")
|
|
25
|
+
os.makedirs("docs")
|
|
26
|
+
|
|
27
|
+
with open("src/__init__.py", "w") as f:
|
|
28
|
+
f.write("# Test")
|
|
29
|
+
with open("src/main.py", "w") as f:
|
|
30
|
+
f.write("# Main")
|
|
31
|
+
with open("README.md", "w") as f:
|
|
32
|
+
f.write("# README")
|
|
33
|
+
|
|
34
|
+
def tearDown(self):
|
|
35
|
+
"""Limpa ambiente de teste"""
|
|
36
|
+
os.chdir(self.old_cwd)
|
|
37
|
+
import shutil
|
|
38
|
+
shutil.rmtree(self.temp_dir)
|
|
39
|
+
|
|
40
|
+
def test_generator_basic(self):
|
|
41
|
+
"""Testa geração básica"""
|
|
42
|
+
generator = TreeGenerator()
|
|
43
|
+
generator.gerar_documentacao(
|
|
44
|
+
nome_projeto="teste",
|
|
45
|
+
arquivo_saida="docs/teste.md",
|
|
46
|
+
root_dir="."
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
self.assertTrue(os.path.exists("docs/teste.md"))
|
|
50
|
+
|
|
51
|
+
with open("docs/teste.md", "r") as f:
|
|
52
|
+
content = f.read()
|
|
53
|
+
self.assertIn("teste/", content)
|
|
54
|
+
self.assertIn("src", content)
|
|
55
|
+
self.assertIn("README.md", content)
|
|
56
|
+
|
|
57
|
+
def test_custom_config(self):
|
|
58
|
+
"""Testa configuração personalizada"""
|
|
59
|
+
config = Config(
|
|
60
|
+
max_depth=2,
|
|
61
|
+
ignore_dirs={"tests"}
|
|
62
|
+
)
|
|
63
|
+
generator = TreeGenerator(config)
|
|
64
|
+
generator.gerar_documentacao(
|
|
65
|
+
nome_projeto="teste",
|
|
66
|
+
arquivo_saida="docs/teste.md",
|
|
67
|
+
root_dir="."
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
with open("docs/teste.md", "r") as f:
|
|
71
|
+
content = f.read()
|
|
72
|
+
self.assertNotIn("tests", content)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
if __name__ == "__main__":
|
|
76
|
+
unittest.main()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""
|
|
2
|
+
TreeDocs - Gerador automático de árvore de diretórios para documentação em Markdown
|
|
3
|
+
|
|
4
|
+
Uma ferramenta simples e poderosa para gerar documentação visual da estrutura
|
|
5
|
+
de seus projetos, com emojis, comentários e formatação profissional.
|
|
6
|
+
|
|
7
|
+
Exemplo de uso:
|
|
8
|
+
>>> from tree_docs import TreeGenerator
|
|
9
|
+
>>> generator = TreeGenerator()
|
|
10
|
+
>>> generator.gerar_documentacao("Meu Projeto", "docs/estrutura.md")
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from .generator import TreeGenerator
|
|
14
|
+
from .config import Config
|
|
15
|
+
from .defaults import DEFAULTS
|
|
16
|
+
from .cli import main
|
|
17
|
+
|
|
18
|
+
__version__ = "0.1.0"
|
|
19
|
+
__all__ = ["TreeGenerator", "Config", "DEFAULTS", "main"]
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""
|
|
3
|
+
Interface de linha de comando para o TreeDocs
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from .generator import TreeGenerator
|
|
11
|
+
from .config import Config
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def main() -> int:
|
|
15
|
+
"""Ponto de entrada principal da CLI"""
|
|
16
|
+
|
|
17
|
+
parser = argparse.ArgumentParser(
|
|
18
|
+
prog="tree-docs",
|
|
19
|
+
description="Gerador de árvore de diretórios para documentação em Markdown",
|
|
20
|
+
epilog="Exemplo: tree-docs -d . -o docs/estrutura.md -n 'Meu Projeto'"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
parser.add_argument(
|
|
24
|
+
"-d", "--directory",
|
|
25
|
+
default=".",
|
|
26
|
+
help="Diretório raiz para escanear (padrão: .)"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
parser.add_argument(
|
|
30
|
+
"-o", "--output",
|
|
31
|
+
default="docs/estrutura_projeto.md",
|
|
32
|
+
help="Arquivo de saída (padrão: docs/estrutura_projeto.md)"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
parser.add_argument(
|
|
36
|
+
"-n", "--name",
|
|
37
|
+
default=None,
|
|
38
|
+
help="Nome do projeto (padrão: nome do diretório)"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
parser.add_argument(
|
|
42
|
+
"--max-depth",
|
|
43
|
+
type=int,
|
|
44
|
+
default=5,
|
|
45
|
+
help="Profundidade máxima da árvore (padrão: 5)"
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
parser.add_argument(
|
|
49
|
+
"--ignore",
|
|
50
|
+
default="venv,__pycache__,.git,.pytest_cache,migrations,node_modules,.idea,.vscode,logs,media,static,__pycache__,dist,build,*.egg-info",
|
|
51
|
+
help="Pastas a ignorar (separadas por vírgula)"
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
parser.add_argument(
|
|
55
|
+
"--no-emojis",
|
|
56
|
+
action="store_true",
|
|
57
|
+
help="Desativa emojis na saída (útil para terminais sem suporte)"
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
parser.add_argument(
|
|
61
|
+
"-v", "--version",
|
|
62
|
+
action="version",
|
|
63
|
+
version=f"tree-docs {__import__('tree_docs').__version__}"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
args = parser.parse_args()
|
|
67
|
+
|
|
68
|
+
# Define o nome do projeto
|
|
69
|
+
project_name = args.name or Path(args.directory).name
|
|
70
|
+
|
|
71
|
+
# Configura pastas a ignorar
|
|
72
|
+
ignore_dirs = set(args.ignore.split(','))
|
|
73
|
+
|
|
74
|
+
# Cria configuração
|
|
75
|
+
config = Config(
|
|
76
|
+
ignore_dirs=ignore_dirs,
|
|
77
|
+
max_depth=args.max_depth,
|
|
78
|
+
project_name=project_name,
|
|
79
|
+
output_file=args.output
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# Gera a documentação
|
|
83
|
+
try:
|
|
84
|
+
generator = TreeGenerator(config)
|
|
85
|
+
generator.gerar_documentacao(
|
|
86
|
+
nome_projeto=project_name,
|
|
87
|
+
arquivo_saida=args.output,
|
|
88
|
+
root_dir=args.directory
|
|
89
|
+
)
|
|
90
|
+
return 0
|
|
91
|
+
except KeyboardInterrupt:
|
|
92
|
+
print("\n⚠️ Operação cancelada pelo usuário")
|
|
93
|
+
return 1
|
|
94
|
+
except Exception as e:
|
|
95
|
+
print(f"❌ Erro: {e}", file=sys.stderr)
|
|
96
|
+
return 1
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
if __name__ == "__main__":
|
|
100
|
+
sys.exit(main())
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Configuração personalizada para o TreeDocs
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Dict, Set, Optional
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
|
|
8
|
+
@dataclass
|
|
9
|
+
class Config:
|
|
10
|
+
"""Configuração do TreeDocs"""
|
|
11
|
+
|
|
12
|
+
# Pastas a ignorar
|
|
13
|
+
ignore_dirs: Set[str] = field(default_factory=set)
|
|
14
|
+
|
|
15
|
+
# Emojis personalizados
|
|
16
|
+
emojis: Dict[str, str] = field(default_factory=dict)
|
|
17
|
+
|
|
18
|
+
# Comentários personalizados para pastas
|
|
19
|
+
pasta_comentarios: Dict[str, str] = field(default_factory=dict)
|
|
20
|
+
|
|
21
|
+
# Comentários personalizados para arquivos
|
|
22
|
+
arquivo_comentarios: Dict[str, str] = field(default_factory=dict)
|
|
23
|
+
|
|
24
|
+
# Profundidade máxima
|
|
25
|
+
max_depth: int = 5
|
|
26
|
+
|
|
27
|
+
# Projeto
|
|
28
|
+
project_name: str = "projeto"
|
|
29
|
+
|
|
30
|
+
# Arquivo de saída
|
|
31
|
+
output_file: str = "docs/estrutura_projeto.md"
|
|
32
|
+
|
|
33
|
+
def merge_with_defaults(self, defaults):
|
|
34
|
+
"""Mescla configurações com os padrões"""
|
|
35
|
+
|
|
36
|
+
# Mescla ignore_dirs
|
|
37
|
+
if not self.ignore_dirs:
|
|
38
|
+
self.ignore_dirs = defaults.IGNORE_DIRS.copy()
|
|
39
|
+
else:
|
|
40
|
+
self.ignore_dirs = defaults.IGNORE_DIRS | self.ignore_dirs
|
|
41
|
+
|
|
42
|
+
# Mescla emojis
|
|
43
|
+
if not self.emojis:
|
|
44
|
+
self.emojis = defaults.EMOJIS.copy()
|
|
45
|
+
else:
|
|
46
|
+
self.emojis = {**defaults.EMOJIS, **self.emojis}
|
|
47
|
+
|
|
48
|
+
# Mescla pasta_comentarios
|
|
49
|
+
if not self.pasta_comentarios:
|
|
50
|
+
self.pasta_comentarios = defaults.PASTA_COMENTARIOS.copy()
|
|
51
|
+
else:
|
|
52
|
+
self.pasta_comentarios = {**defaults.PASTA_COMENTARIOS, **self.pasta_comentarios}
|
|
53
|
+
|
|
54
|
+
# Mescla arquivo_comentarios
|
|
55
|
+
if not self.arquivo_comentarios:
|
|
56
|
+
self.arquivo_comentarios = defaults.ARQUIVO_COMENTARIOS.copy()
|
|
57
|
+
else:
|
|
58
|
+
self.arquivo_comentarios = {**defaults.ARQUIVO_COMENTARIOS, **self.arquivo_comentarios}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Configurações padrão do TreeDocs
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Dict, Set
|
|
6
|
+
|
|
7
|
+
class DEFAULTS:
|
|
8
|
+
"""Configurações padrão para o gerador"""
|
|
9
|
+
|
|
10
|
+
# Pastas a ignorar automaticamente
|
|
11
|
+
IGNORE_DIRS: Set[str] = {
|
|
12
|
+
"venv", "__pycache__", ".git", ".pytest_cache",
|
|
13
|
+
"migrations", "node_modules", ".idea", ".vscode",
|
|
14
|
+
"logs", "media", "static", "docs", "__pycache__",
|
|
15
|
+
"dist", "build", "*.egg-info", ".tox", ".mypy_cache",
|
|
16
|
+
".coverage", "htmlcov", ".pytest_cache"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
# Emojis por extensão de arquivo
|
|
20
|
+
EMOJIS: Dict[str, str] = {
|
|
21
|
+
'.py': '🐍 ',
|
|
22
|
+
'.md': '📝 ',
|
|
23
|
+
'.yml': '⚙️ ',
|
|
24
|
+
'.yaml': '⚙️ ',
|
|
25
|
+
'.sh': '</> ',
|
|
26
|
+
'.json': '📊 ',
|
|
27
|
+
'.txt': '📄 ',
|
|
28
|
+
'.env': '🌿 ',
|
|
29
|
+
'.envrc': '🌿 ',
|
|
30
|
+
'.gitignore': '♦️ ',
|
|
31
|
+
'.dockerfile': '🐳 ',
|
|
32
|
+
'.Dockerfile': '🐳 ',
|
|
33
|
+
'.toml': '📦 ',
|
|
34
|
+
'.lock': '🔒',
|
|
35
|
+
'.js': '📜 ',
|
|
36
|
+
'.ts': '📘 ',
|
|
37
|
+
'.jsx': '⚛️ ',
|
|
38
|
+
'.tsx': '⚛️ ',
|
|
39
|
+
'.css': '🎨 ',
|
|
40
|
+
'.html': '🌐 ',
|
|
41
|
+
'.xml': '📋 ',
|
|
42
|
+
'.sql': '🗄️ ',
|
|
43
|
+
'.go': '🐹 ',
|
|
44
|
+
'.rs': '🦀 ',
|
|
45
|
+
'.java': '☕ ',
|
|
46
|
+
'.cpp': '⚡ ',
|
|
47
|
+
'.c': '⚡ ',
|
|
48
|
+
'.h': '🔧 ',
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
# Comentários padrão para pastas comuns
|
|
52
|
+
PASTA_COMENTARIOS: Dict[str, str] = {
|
|
53
|
+
"backend": "Configurações principais do Backend",
|
|
54
|
+
"frontend": "Configurações principais do Frontend",
|
|
55
|
+
"core": "Núcleo da aplicação - Funcionalidades compartilhadas",
|
|
56
|
+
"api": "Endpoints da API REST",
|
|
57
|
+
"services": "Lógica de negócio e serviços",
|
|
58
|
+
"tests": "Testes unitários e de integração",
|
|
59
|
+
"migrations": "Migrações do banco de dados",
|
|
60
|
+
"models": "Modelos de dados",
|
|
61
|
+
"serializers": "Serializers para API",
|
|
62
|
+
"views": "Views e controladores",
|
|
63
|
+
"utils": "Funções utilitárias",
|
|
64
|
+
"templates": "Templates HTML",
|
|
65
|
+
"static": "Arquivos estáticos (CSS, JS, imagens)",
|
|
66
|
+
"media": "Arquivos de mídia (uploads)",
|
|
67
|
+
"config": "Arquivos de configuração",
|
|
68
|
+
"scripts": "Scripts auxiliares",
|
|
69
|
+
"docker": "Configurações Docker",
|
|
70
|
+
"kubernetes": "Manifestos Kubernetes",
|
|
71
|
+
"helm": "Charts Helm",
|
|
72
|
+
"terraform": "Configurações Terraform",
|
|
73
|
+
"ansible": "Playbooks Ansible",
|
|
74
|
+
"github": "Configurações GitHub",
|
|
75
|
+
"gitlab": "Configurações GitLab",
|
|
76
|
+
"vscode": "Configurações VS Code",
|
|
77
|
+
"idea": "Configurações IntelliJ/PyCharm",
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
# Comentários padrão para arquivos comuns
|
|
81
|
+
ARQUIVO_COMENTARIOS: Dict[str, str] = {
|
|
82
|
+
# Python/Django
|
|
83
|
+
"settings.py": "Configurações do projeto",
|
|
84
|
+
"urls.py": "Rotas da aplicação",
|
|
85
|
+
"wsgi.py": "Configuração WSGI para deploy",
|
|
86
|
+
"asgi.py": "Configuração ASGI para deploy",
|
|
87
|
+
"models.py": "Modelos do banco de dados",
|
|
88
|
+
"serializers.py": "Serializers para API REST",
|
|
89
|
+
"views.py": "Views/ViewSets da API",
|
|
90
|
+
"admin.py": "Configuração do Django Admin",
|
|
91
|
+
"apps.py": "Configuração do app Django",
|
|
92
|
+
"manage.py": "Script de gerenciamento do Django",
|
|
93
|
+
|
|
94
|
+
# Documentação
|
|
95
|
+
"README.md": "Documentação principal do projeto",
|
|
96
|
+
"LICENSE": "Licença do projeto",
|
|
97
|
+
"CHANGELOG.md": "Histórico de versões",
|
|
98
|
+
"CONTRIBUTING.md": "Guia de contribuição",
|
|
99
|
+
"CODE_OF_CONDUCT.md": "Código de conduta",
|
|
100
|
+
"SECURITY.md": "Política de segurança",
|
|
101
|
+
|
|
102
|
+
# Configuração Python
|
|
103
|
+
"pyproject.toml": "Configuração do projeto e dependências",
|
|
104
|
+
"setup.py": "Script de instalação do pacote",
|
|
105
|
+
"requirements.txt": "Dependências do projeto",
|
|
106
|
+
"requirements-dev.txt": "Dependências de desenvolvimento",
|
|
107
|
+
".flake8": "Configuração do Flake8",
|
|
108
|
+
".isort.cfg": "Configuração do isort",
|
|
109
|
+
".black": "Configuração do Black",
|
|
110
|
+
"mypy.ini": "Configuração do Mypy",
|
|
111
|
+
"pytest.ini": "Configuração do Pytest",
|
|
112
|
+
|
|
113
|
+
# Ambiente
|
|
114
|
+
".env": "Variáveis de ambiente",
|
|
115
|
+
".env.example": "Exemplo de variáveis de ambiente",
|
|
116
|
+
".envrc": "Configuração do direnv",
|
|
117
|
+
".gitignore": "Arquivos ignorados no Git",
|
|
118
|
+
".dockerignore": "Arquivos ignorados no Docker",
|
|
119
|
+
|
|
120
|
+
# CI/CD
|
|
121
|
+
".gitlab-ci.yml": "Pipeline CI/CD do GitLab",
|
|
122
|
+
".github/workflows/": "Workflows GitHub Actions",
|
|
123
|
+
".travis.yml": "Configuração Travis CI",
|
|
124
|
+
"Jenkinsfile": "Pipeline Jenkins",
|
|
125
|
+
|
|
126
|
+
# Docker
|
|
127
|
+
"Dockerfile": "Imagem Docker para desenvolvimento",
|
|
128
|
+
"Dockerfile.prod": "Imagem Docker para produção",
|
|
129
|
+
"docker-compose.yml": "Orquestração de containers Docker",
|
|
130
|
+
|
|
131
|
+
# Kubernetes
|
|
132
|
+
"deployment.yaml": "Deployment Kubernetes",
|
|
133
|
+
"service.yaml": "Service Kubernetes",
|
|
134
|
+
"ingress.yaml": "Ingress Kubernetes",
|
|
135
|
+
"configmap.yaml": "ConfigMap Kubernetes",
|
|
136
|
+
"secret.yaml": "Secret Kubernetes",
|
|
137
|
+
"hpa.yaml": "Horizontal Pod Autoscaler",
|
|
138
|
+
|
|
139
|
+
# Frontend
|
|
140
|
+
"package.json": "Dependências Node.js",
|
|
141
|
+
"package-lock.json": "Lock de dependências Node",
|
|
142
|
+
"yarn.lock": "Lock de dependências Yarn",
|
|
143
|
+
"webpack.config.js": "Configuração Webpack",
|
|
144
|
+
"vite.config.js": "Configuração Vite",
|
|
145
|
+
"tsconfig.json": "Configuração TypeScript",
|
|
146
|
+
|
|
147
|
+
# Scripts
|
|
148
|
+
"entrypoint.sh": "Script de entrada do container",
|
|
149
|
+
"entrypoint.prod.sh": "Script de entrada (produção)",
|
|
150
|
+
"start.sh": "Script de inicialização",
|
|
151
|
+
"build.sh": "Script de build",
|
|
152
|
+
"deploy.sh": "Script de deploy",
|
|
153
|
+
|
|
154
|
+
# Outros
|
|
155
|
+
"Makefile": "Comandos automatizados",
|
|
156
|
+
"gunicorn_conf.py": "Configuração do Gunicorn",
|
|
157
|
+
"celery.py": "Configuração do Celery",
|
|
158
|
+
"tasks.py": "Tarefas assíncronas",
|
|
159
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Núcleo do gerador de árvore de diretórios
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import datetime
|
|
7
|
+
from typing import Optional, Set, Dict, List, Tuple
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from .defaults import DEFAULTS
|
|
11
|
+
from .config import Config
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TreeGenerator:
|
|
15
|
+
"""
|
|
16
|
+
Gerador de árvore de diretórios com emojis e comentários
|
|
17
|
+
|
|
18
|
+
Exemplo:
|
|
19
|
+
>>> generator = TreeGenerator()
|
|
20
|
+
>>> generator.gerar_documentacao(
|
|
21
|
+
... nome_projeto="meu-projeto",
|
|
22
|
+
... arquivo_saida="docs/estrutura.md"
|
|
23
|
+
... )
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def __init__(self, config: Optional[Config] = None):
|
|
27
|
+
"""
|
|
28
|
+
Inicializa o gerador
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
config: Configuração personalizada (opcional)
|
|
32
|
+
"""
|
|
33
|
+
self.config = config or Config()
|
|
34
|
+
self.config.merge_with_defaults(DEFAULTS)
|
|
35
|
+
|
|
36
|
+
self.root_dir = "."
|
|
37
|
+
self.max_depth = self.config.max_depth
|
|
38
|
+
|
|
39
|
+
# Atalhos para as configurações
|
|
40
|
+
self.ignore_dirs = self.config.ignore_dirs
|
|
41
|
+
self.emojis = self.config.emojis
|
|
42
|
+
self.pasta_comentarios = self.config.pasta_comentarios
|
|
43
|
+
self.arquivo_comentarios = self.config.arquivo_comentarios
|
|
44
|
+
|
|
45
|
+
def gerar_comentario(self, diretorio_pai: str, item: str, is_dir: bool) -> Optional[str]:
|
|
46
|
+
"""
|
|
47
|
+
Gera comentário explicativo para um item
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
diretorio_pai: Diretório pai do item
|
|
51
|
+
item: Nome do item
|
|
52
|
+
is_dir: True se for diretório
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
Comentário ou None se não houver
|
|
56
|
+
"""
|
|
57
|
+
if is_dir:
|
|
58
|
+
# Verifica se o item está nos comentários de pasta
|
|
59
|
+
if item in self.pasta_comentarios:
|
|
60
|
+
return self.pasta_comentarios[item]
|
|
61
|
+
|
|
62
|
+
# Comentário genérico para pastas de API
|
|
63
|
+
if 'api' in diretorio_pai or diretorio_pai.endswith('/api'):
|
|
64
|
+
nome_limpo = item.replace('_', ' ').title()
|
|
65
|
+
return f"API de {nome_limpo}"
|
|
66
|
+
|
|
67
|
+
return None
|
|
68
|
+
|
|
69
|
+
# Arquivo
|
|
70
|
+
if item in self.arquivo_comentarios:
|
|
71
|
+
return self.arquivo_comentarios[item]
|
|
72
|
+
|
|
73
|
+
# Padrões para arquivos Python
|
|
74
|
+
if item.endswith('.py'):
|
|
75
|
+
nome = item[:-3]
|
|
76
|
+
if 'test' in nome.lower():
|
|
77
|
+
return "Testes unitários"
|
|
78
|
+
if 'serializer' in nome.lower():
|
|
79
|
+
return "Serializers para API"
|
|
80
|
+
if 'view' in nome.lower():
|
|
81
|
+
return "Views da API"
|
|
82
|
+
if 'model' in nome.lower():
|
|
83
|
+
return "Modelos de dados"
|
|
84
|
+
if 'admin' in nome.lower():
|
|
85
|
+
return "Configuração do Admin"
|
|
86
|
+
if 'urls' in nome.lower():
|
|
87
|
+
return "Rotas da aplicação"
|
|
88
|
+
if 'utils' in nome.lower():
|
|
89
|
+
return "Funções utilitárias"
|
|
90
|
+
|
|
91
|
+
return None
|
|
92
|
+
|
|
93
|
+
def gerar_arvore(
|
|
94
|
+
self,
|
|
95
|
+
diretorio: str = ".",
|
|
96
|
+
prefixo: str = "",
|
|
97
|
+
nivel: int = 0
|
|
98
|
+
) -> str:
|
|
99
|
+
"""
|
|
100
|
+
Gera a árvore de diretórios recursivamente
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
diretorio: Diretório atual
|
|
104
|
+
prefixo: Prefixo para formatação da árvore
|
|
105
|
+
nivel: Nível atual de profundidade
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
String com a árvore formatada
|
|
109
|
+
"""
|
|
110
|
+
if nivel > self.max_depth:
|
|
111
|
+
return ""
|
|
112
|
+
|
|
113
|
+
resultado: List[str] = []
|
|
114
|
+
|
|
115
|
+
try:
|
|
116
|
+
itens = [i for i in os.listdir(diretorio) if not i.startswith('.')]
|
|
117
|
+
except PermissionError:
|
|
118
|
+
return ""
|
|
119
|
+
|
|
120
|
+
# Filtra itens ignorados
|
|
121
|
+
itens = [i for i in itens if i not in self.ignore_dirs]
|
|
122
|
+
|
|
123
|
+
# Se não há itens, retorna indicador de pasta vazia
|
|
124
|
+
if not itens:
|
|
125
|
+
if diretorio != ".":
|
|
126
|
+
return f"{prefixo} └── ..."
|
|
127
|
+
return ""
|
|
128
|
+
|
|
129
|
+
# Separa pastas e arquivos
|
|
130
|
+
pastas: List[str] = []
|
|
131
|
+
arquivos: List[str] = []
|
|
132
|
+
|
|
133
|
+
for item in itens:
|
|
134
|
+
caminho = os.path.join(diretorio, item)
|
|
135
|
+
if os.path.isdir(caminho):
|
|
136
|
+
pastas.append(item)
|
|
137
|
+
else:
|
|
138
|
+
arquivos.append(item)
|
|
139
|
+
|
|
140
|
+
# Ordena e junta (pastas primeiro)
|
|
141
|
+
pastas.sort()
|
|
142
|
+
arquivos.sort()
|
|
143
|
+
itens_ordenados = pastas + arquivos
|
|
144
|
+
|
|
145
|
+
# Coleta dados de cada item
|
|
146
|
+
itens_com_dados: List[Tuple[str, bool, Optional[str], str]] = []
|
|
147
|
+
for item in itens_ordenados:
|
|
148
|
+
caminho = os.path.join(diretorio, item)
|
|
149
|
+
is_dir = os.path.isdir(caminho)
|
|
150
|
+
comentario = self.gerar_comentario(diretorio, item, is_dir)
|
|
151
|
+
itens_com_dados.append((item, is_dir, comentario, caminho))
|
|
152
|
+
|
|
153
|
+
# Calcula o tamanho máximo para alinhamento
|
|
154
|
+
max_len = 0
|
|
155
|
+
for item, is_dir, _, _ in itens_com_dados:
|
|
156
|
+
linha = f"{prefixo}{'├── '}{'📁 ' if is_dir else '🐍 '}{item}"
|
|
157
|
+
max_len = max(max_len, len(linha))
|
|
158
|
+
|
|
159
|
+
# Gera a saída
|
|
160
|
+
for i, (item, is_dir, comentario, caminho) in enumerate(itens_com_dados):
|
|
161
|
+
is_ultimo = (i == len(itens_com_dados) - 1)
|
|
162
|
+
|
|
163
|
+
# Define caracteres da árvore
|
|
164
|
+
if is_ultimo:
|
|
165
|
+
conector = "└── "
|
|
166
|
+
prefixo_filho = prefixo + " "
|
|
167
|
+
else:
|
|
168
|
+
conector = "├── "
|
|
169
|
+
prefixo_filho = prefixo + "│ "
|
|
170
|
+
|
|
171
|
+
# Emoji apropriado
|
|
172
|
+
if is_dir:
|
|
173
|
+
emoji = "📁 "
|
|
174
|
+
else:
|
|
175
|
+
ext = os.path.splitext(item)[1].lower()
|
|
176
|
+
emoji = self.emojis.get(ext, '📄 ')
|
|
177
|
+
|
|
178
|
+
# Monta a linha
|
|
179
|
+
linha_base = f"{prefixo}{conector}{emoji}{item}"
|
|
180
|
+
|
|
181
|
+
# Adiciona comentário alinhado à direita
|
|
182
|
+
if comentario:
|
|
183
|
+
espacos = max_len - len(linha_base) + 2
|
|
184
|
+
if espacos < 2:
|
|
185
|
+
espacos = 2
|
|
186
|
+
resultado.append(f"{linha_base}{' ' * espacos}# {comentario}")
|
|
187
|
+
else:
|
|
188
|
+
resultado.append(linha_base)
|
|
189
|
+
|
|
190
|
+
# Processa subdiretórios
|
|
191
|
+
if is_dir:
|
|
192
|
+
sub = self.gerar_arvore(caminho, prefixo_filho, nivel + 1)
|
|
193
|
+
if sub:
|
|
194
|
+
resultado.append(sub)
|
|
195
|
+
|
|
196
|
+
return "\n".join(resultado)
|
|
197
|
+
|
|
198
|
+
def gerar_documentacao(
|
|
199
|
+
self,
|
|
200
|
+
nome_projeto: str = "projeto",
|
|
201
|
+
arquivo_saida: str = "docs/estrutura_projeto.md",
|
|
202
|
+
root_dir: str = "."
|
|
203
|
+
) -> None:
|
|
204
|
+
"""
|
|
205
|
+
Gera a documentação completa em Markdown
|
|
206
|
+
|
|
207
|
+
Args:
|
|
208
|
+
nome_projeto: Nome do projeto
|
|
209
|
+
arquivo_saida: Caminho do arquivo de saída
|
|
210
|
+
root_dir: Diretório raiz do projeto
|
|
211
|
+
"""
|
|
212
|
+
self.root_dir = root_dir
|
|
213
|
+
|
|
214
|
+
# Cria diretório de saída se não existir
|
|
215
|
+
os.makedirs(os.path.dirname(arquivo_saida) or ".", exist_ok=True)
|
|
216
|
+
|
|
217
|
+
# Gera a árvore
|
|
218
|
+
arvore = self.gerar_arvore(root_dir)
|
|
219
|
+
|
|
220
|
+
# Prepara o conteúdo
|
|
221
|
+
conteudo: List[str] = []
|
|
222
|
+
conteudo.append(f"# 🌳 Estrutura do Projeto - {nome_projeto}\n")
|
|
223
|
+
conteudo.append(f"\n*Gerado em: {datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S')}*\n")
|
|
224
|
+
conteudo.append("\n```bash\n")
|
|
225
|
+
conteudo.append(f"{nome_projeto}/\n")
|
|
226
|
+
conteudo.append(arvore)
|
|
227
|
+
conteudo.append("\n```\n")
|
|
228
|
+
|
|
229
|
+
# Legenda
|
|
230
|
+
conteudo.append("\n## 📖 Legenda\n\n")
|
|
231
|
+
conteudo.append("| Emoji | Significado |\n")
|
|
232
|
+
conteudo.append("|-------|-------------|\n")
|
|
233
|
+
legendas = [
|
|
234
|
+
("📁", "Pasta/Diretório"),
|
|
235
|
+
("🐍", "Arquivo Python"),
|
|
236
|
+
("📝", "Documentação (MD)"),
|
|
237
|
+
("⚙️", "Configuração (YAML)"),
|
|
238
|
+
("</>", "Script Shell"),
|
|
239
|
+
("📊", "Dados (JSON)"),
|
|
240
|
+
("📄", "Arquivo texto"),
|
|
241
|
+
("🌿", "Variáveis de ambiente"),
|
|
242
|
+
("♦️", "Git"),
|
|
243
|
+
("🐳", "Docker"),
|
|
244
|
+
("📦", "Pacote Python"),
|
|
245
|
+
("🔒", "Arquivo de lock"),
|
|
246
|
+
]
|
|
247
|
+
for emoji, desc in legendas:
|
|
248
|
+
conteudo.append(f"| {emoji} | {desc} |\n")
|
|
249
|
+
|
|
250
|
+
conteudo.append("\n> **Nota:** Pastas marcadas com `...` estão vazias ou contêm apenas arquivos ignorados.\n")
|
|
251
|
+
|
|
252
|
+
# Escreve o arquivo
|
|
253
|
+
with open(arquivo_saida, "w", encoding="utf-8") as f:
|
|
254
|
+
f.write("".join(conteudo))
|
|
255
|
+
f.flush()
|
|
256
|
+
os.fsync(f.fileno())
|
|
257
|
+
|
|
258
|
+
print(f"✅ Documentação gerada com sucesso: {arquivo_saida}")
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: tree-docs
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Gerador automático de árvore de diretórios com emojis e comentários para documentação em Markdown
|
|
5
|
+
Author-email: Kelvin Matheus <kmathews.blaze@email.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/seu-usuario/tree-docs
|
|
8
|
+
Project-URL: Documentation, https://tree-docs.readthedocs.io
|
|
9
|
+
Project-URL: Repository, https://github.com/seu-usuario/tree-docs
|
|
10
|
+
Project-URL: Issues, https://github.com/seu-usuario/tree-docs/issues
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Topic :: Documentation
|
|
14
|
+
Classifier: Topic :: Software Development :: Documentation
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Operating System :: OS Independent
|
|
23
|
+
Requires-Python: >=3.8
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
27
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
28
|
+
Requires-Dist: black>=22.0.0; extra == "dev"
|
|
29
|
+
Requires-Dist: flake8>=5.0.0; extra == "dev"
|
|
30
|
+
Requires-Dist: mypy>=0.990; extra == "dev"
|
|
31
|
+
Requires-Dist: pre-commit>=2.20.0; extra == "dev"
|
|
32
|
+
|
|
33
|
+
# 🌳 TreeDocs
|
|
34
|
+
|
|
35
|
+
[](https://badge.fury.io/py/tree-docs)
|
|
36
|
+
[](https://www.python.org/downloads/)
|
|
37
|
+
[](https://opensource.org/licenses/MIT)
|
|
38
|
+
[](https://github.com/psf/black)
|
|
39
|
+
|
|
40
|
+
Gerador automático de árvore de diretórios com emojis e comentários para documentação em Markdown.
|
|
41
|
+
|
|
42
|
+
## ✨ Features
|
|
43
|
+
|
|
44
|
+
- 🚀 **Geração automática** da estrutura de diretórios
|
|
45
|
+
- 🎨 **Emojis** para identificar tipos de arquivos
|
|
46
|
+
- 📝 **Comentários** explicativos para pastas e arquivos
|
|
47
|
+
- 🎯 **Alinhamento** profissional dos comentários
|
|
48
|
+
- 🔧 **Altamente configurável**
|
|
49
|
+
- 💻 **CLI** e **API Python** disponíveis
|
|
50
|
+
- 📦 **Zero dependências** externas
|
|
51
|
+
|
|
52
|
+
## 📦 Instalação
|
|
53
|
+
|
|
54
|
+
### Via pip (recomendado)
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pip install tree-docs
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
tests/test_generator.py
|
|
4
|
+
tree_docs/__init__.py
|
|
5
|
+
tree_docs/cli.py
|
|
6
|
+
tree_docs/config.py
|
|
7
|
+
tree_docs/defaults.py
|
|
8
|
+
tree_docs/generator.py
|
|
9
|
+
tree_docs.egg-info/PKG-INFO
|
|
10
|
+
tree_docs.egg-info/SOURCES.txt
|
|
11
|
+
tree_docs.egg-info/dependency_links.txt
|
|
12
|
+
tree_docs.egg-info/entry_points.txt
|
|
13
|
+
tree_docs.egg-info/requires.txt
|
|
14
|
+
tree_docs.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
tree_docs
|