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.
@@ -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
+ [![PyPI version](https://badge.fury.io/py/tree-docs.svg)](https://badge.fury.io/py/tree-docs)
36
+ [![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
37
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
38
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](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
+ [![PyPI version](https://badge.fury.io/py/tree-docs.svg)](https://badge.fury.io/py/tree-docs)
4
+ [![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](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,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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
+ [![PyPI version](https://badge.fury.io/py/tree-docs.svg)](https://badge.fury.io/py/tree-docs)
36
+ [![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
37
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
38
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](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,2 @@
1
+ [console_scripts]
2
+ tree-docs = tree_docs.cli:main
@@ -0,0 +1,8 @@
1
+
2
+ [dev]
3
+ pytest>=7.0.0
4
+ pytest-cov>=4.0.0
5
+ black>=22.0.0
6
+ flake8>=5.0.0
7
+ mypy>=0.990
8
+ pre-commit>=2.20.0
@@ -0,0 +1 @@
1
+ tree_docs