graph-dependency-analyzer 0.2.0__py3-none-any.whl
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.
- graph_dependency_analyzer-0.2.0.dist-info/METADATA +158 -0
- graph_dependency_analyzer-0.2.0.dist-info/RECORD +86 -0
- graph_dependency_analyzer-0.2.0.dist-info/WHEEL +5 -0
- graph_dependency_analyzer-0.2.0.dist-info/entry_points.txt +2 -0
- graph_dependency_analyzer-0.2.0.dist-info/top_level.txt +1 -0
- src/__init__.py +0 -0
- src/application/__init__.py +0 -0
- src/application/dtos/__init__.py +0 -0
- src/application/dtos/affected_component.py +59 -0
- src/application/dtos/batch_processing_result.py +17 -0
- src/application/dtos/impact_analysis_response.py +56 -0
- src/application/dtos/impact_query_request.py +38 -0
- src/application/dtos/index_batch_request.py +53 -0
- src/application/dtos/index_batch_response.py +72 -0
- src/application/dtos/index_result.py +20 -0
- src/application/dtos/repository_index_result.py +79 -0
- src/application/exceptions.py +41 -0
- src/application/services/__init__.py +0 -0
- src/application/services/file_scanner_service.py +258 -0
- src/application/services/progress_tracker.py +132 -0
- src/application/use_cases/__init__.py +0 -0
- src/application/use_cases/clear_all_data_use_case.py +180 -0
- src/application/use_cases/index_batch_use_case.py +153 -0
- src/application/use_cases/index_repository_use_case.py +683 -0
- src/application/use_cases/indexing_orchestrator.py +181 -0
- src/application/use_cases/list_repositories_use_case.py +84 -0
- src/cli.py +512 -0
- src/config/__init__.py +5 -0
- src/config/container.py +211 -0
- src/config/logging_config.py +123 -0
- src/config/settings.py +165 -0
- src/domain/__init__.py +0 -0
- src/domain/entities/__init__.py +20 -0
- src/domain/entities/ast_node.py +32 -0
- src/domain/entities/code_chunk.py +45 -0
- src/domain/entities/code_file.py +44 -0
- src/domain/entities/dependency_graph.py +110 -0
- src/domain/entities/repository.py +46 -0
- src/domain/exceptions.py +36 -0
- src/domain/repositories/__init__.py +22 -0
- src/domain/repositories/i_code_parser.py +50 -0
- src/domain/repositories/i_dependency_extractor.py +35 -0
- src/domain/repositories/i_embedding_provider.py +31 -0
- src/domain/repositories/i_graph_repository.py +78 -0
- src/domain/repositories/i_vector_repository.py +55 -0
- src/domain/services/__init__.py +8 -0
- src/domain/services/dependency_extractor.py +962 -0
- src/domain/services/semantic_chunk_builder.py +719 -0
- src/domain/value_objects/__init__.py +12 -0
- src/domain/value_objects/chunk_type.py +24 -0
- src/domain/value_objects/dependency_type.py +22 -0
- src/domain/value_objects/node_type.py +22 -0
- src/domain/value_objects/qualified_name.py +78 -0
- src/infrastructure/__init__.py +0 -0
- src/infrastructure/exceptions.py +41 -0
- src/infrastructure/external_apis/__init__.py +0 -0
- src/infrastructure/external_apis/ollama_embedding_provider.py +134 -0
- src/infrastructure/external_apis/openai_embedding_provider.py +231 -0
- src/infrastructure/parsing/__init__.py +20 -0
- src/infrastructure/parsing/config_file_parser.py +347 -0
- src/infrastructure/parsing/gradle_dependency_parser.py +159 -0
- src/infrastructure/parsing/groovy_parser.py +198 -0
- src/infrastructure/parsing/maven_dependency_parser.py +147 -0
- src/infrastructure/parsing/microfrontend_config_parser.py +242 -0
- src/infrastructure/parsing/npm_package_dependency_parser.py +255 -0
- src/infrastructure/parsing/python_parser.py +211 -0
- src/infrastructure/parsing/sql_schema_parser.py +658 -0
- src/infrastructure/parsing/tree_sitter_java_parser.py +434 -0
- src/infrastructure/parsing/tree_sitter_typescript_parser.py +600 -0
- src/infrastructure/persistence/__init__.py +0 -0
- src/infrastructure/persistence/graph_export_repository.py +443 -0
- src/infrastructure/persistence/neo4j_dependency_repository.py +657 -0
- src/infrastructure/persistence/qdrant_vector_repository.py +357 -0
- src/infrastructure/persistence/repository_relationship_repository.py +1312 -0
- src/presentation/__init__.py +0 -0
- src/presentation/api/__init__.py +0 -0
- src/presentation/api/rest/__init__.py +0 -0
- src/presentation/api/rest/exception_handlers.py +174 -0
- src/presentation/api/rest/main.py +80 -0
- src/presentation/api/rest/routers/__init__.py +5 -0
- src/presentation/api/rest/routers/admin.py +103 -0
- src/presentation/api/rest/routers/analysis.py +980 -0
- src/presentation/api/rest/routers/export.py +442 -0
- src/presentation/api/rest/routers/health.py +117 -0
- src/presentation/api/rest/routers/indexing.py +148 -0
- src/presentation/api/rest/routers/relationships.py +1089 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: graph-dependency-analyzer
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Knowledge Graph for multi-language repository dependency analysis — Java, TypeScript, Python, Groovy, SQL/Oracle
|
|
5
|
+
Author: Graph Project Team
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/ciandt/new-arch-explorer-service
|
|
8
|
+
Project-URL: Repository, https://github.com/ciandt/new-arch-explorer-service
|
|
9
|
+
Project-URL: Issues, https://github.com/ciandt/new-arch-explorer-service/issues
|
|
10
|
+
Keywords: dependency-analysis,knowledge-graph,tree-sitter,neo4j,qdrant,architecture,impact-analysis,java,typescript,python,groovy,oracle
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
14
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
20
|
+
Classifier: Operating System :: OS Independent
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
Requires-Dist: fastapi>=0.115.0
|
|
24
|
+
Requires-Dist: uvicorn>=0.32.0
|
|
25
|
+
Requires-Dist: qdrant-client>=1.13.0
|
|
26
|
+
Requires-Dist: neo4j>=5.15.0
|
|
27
|
+
Requires-Dist: httpx>=0.28.0
|
|
28
|
+
Requires-Dist: structlog>=24.1.0
|
|
29
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
30
|
+
Requires-Dist: pydantic>=2.0.0
|
|
31
|
+
Requires-Dist: pydantic-settings>=2.0.0
|
|
32
|
+
Requires-Dist: dependency-injector>=4.41.0
|
|
33
|
+
Requires-Dist: tenacity>=8.2.0
|
|
34
|
+
Requires-Dist: tree-sitter>=0.25.2
|
|
35
|
+
Requires-Dist: tree-sitter-java>=0.23.5
|
|
36
|
+
Requires-Dist: tree-sitter-typescript>=0.23.2
|
|
37
|
+
Requires-Dist: lxml>=5.0.0
|
|
38
|
+
Requires-Dist: pyyaml>=6.0.0
|
|
39
|
+
Requires-Dist: click>=8.1.0
|
|
40
|
+
Provides-Extra: dev
|
|
41
|
+
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
42
|
+
Requires-Dist: pytest-asyncio>=0.24.0; extra == "dev"
|
|
43
|
+
Requires-Dist: pytest-cov>=7.0.0; extra == "dev"
|
|
44
|
+
Requires-Dist: mypy>=1.8.0; extra == "dev"
|
|
45
|
+
Requires-Dist: ruff>=0.9.0; extra == "dev"
|
|
46
|
+
|
|
47
|
+
# Graph Project - Dependency Analysis System
|
|
48
|
+
|
|
49
|
+
## 📍 Project Location
|
|
50
|
+
|
|
51
|
+
**Path**: `C:\DevWorkspace\Graph Project\`
|
|
52
|
+
|
|
53
|
+
## 🎯 Purpose
|
|
54
|
+
|
|
55
|
+
Sistema de análise de dependências de código com Clean Architecture para repositórios Java.
|
|
56
|
+
|
|
57
|
+
Este é um **novo projeto independente** que implementa:
|
|
58
|
+
- 🔍 Análise AST com Tree-sitter para extração de estruturas de código
|
|
59
|
+
- 🔗 Detecção de dependências internas (código-para-código) e externas (APIs, DBs, bibliotecas)
|
|
60
|
+
- 📊 Armazenamento de grafo de dependências no Neo4j para análise de impacto
|
|
61
|
+
- 🧠 Geração de embeddings (OpenAI) e armazenamento no Qdrant para busca semântica
|
|
62
|
+
- 🚀 Processamento paralelo de múltiplos repositórios
|
|
63
|
+
|
|
64
|
+
## 🏗️ Architecture
|
|
65
|
+
|
|
66
|
+
Clean Architecture com 4 camadas:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
src/
|
|
70
|
+
├── domain/ # 💎 Entities, Value Objects, Interfaces
|
|
71
|
+
│ ├── entities/
|
|
72
|
+
│ ├── value_objects/
|
|
73
|
+
│ ├── repositories/
|
|
74
|
+
│ └── services/
|
|
75
|
+
├── application/ # ⚙️ Use Cases, DTOs, Services
|
|
76
|
+
│ ├── use_cases/
|
|
77
|
+
│ ├── dtos/
|
|
78
|
+
│ └── services/
|
|
79
|
+
├── infrastructure/ # 🔧 Adaptadores (Qdrant, Neo4j, OpenAI, Tree-sitter)
|
|
80
|
+
│ ├── parsing/
|
|
81
|
+
│ ├── persistence/
|
|
82
|
+
│ └── external_apis/
|
|
83
|
+
└── presentation/ # 🌐 Controllers, Routers FastAPI
|
|
84
|
+
└── api/
|
|
85
|
+
└── rest/
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 🛠️ Technology Stack
|
|
89
|
+
|
|
90
|
+
- **Language**: Python 3.11+
|
|
91
|
+
- **Framework**: FastAPI
|
|
92
|
+
- **AST Parsing**: Tree-sitter + tree-sitter-java
|
|
93
|
+
- **Graph DB**: Neo4j 5.15+
|
|
94
|
+
- **Vector DB**: Qdrant 1.13+
|
|
95
|
+
- **Embeddings**: OpenAI text-embedding-3-small (1536 dims)
|
|
96
|
+
- **Build Tools**: Maven/Gradle parsing
|
|
97
|
+
|
|
98
|
+
## 🎓 Phase 1 Scope
|
|
99
|
+
|
|
100
|
+
- ✅ **Language Support**: Java only
|
|
101
|
+
- ✅ **Analysis**: Static (deterministic) - NO AI/LLM
|
|
102
|
+
- ✅ **Dependencies**: Internal + External (APIs, DBs, libraries)
|
|
103
|
+
- ✅ **Storage**: Dual (Neo4j graph + Qdrant vectors)
|
|
104
|
+
|
|
105
|
+
## 🚀 Future Phases
|
|
106
|
+
|
|
107
|
+
- 🔮 Phase 2: Multi-language (Python, JS/TS, Go, C#)
|
|
108
|
+
- 🔮 Phase 3: Advanced features (code quality, architectural patterns, complexity metrics)
|
|
109
|
+
|
|
110
|
+
## 📚 Documentation
|
|
111
|
+
|
|
112
|
+
- **Specifications**: `.sdd/specs/clean-architecture-batch-indexing/`
|
|
113
|
+
- `requirements.md` - Functional requirements
|
|
114
|
+
- `design.md` - Technical design
|
|
115
|
+
- `tasks.md` - Implementation tasks
|
|
116
|
+
- `research.md` - Research findings
|
|
117
|
+
|
|
118
|
+
## 🚀 Quick Start
|
|
119
|
+
|
|
120
|
+
**Ver guia completo:** [QUICKSTART.md](./QUICKSTART.md)
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# 1. Configurar .env
|
|
124
|
+
copy .env.example .env
|
|
125
|
+
# Editar .env com OPENAI_API_KEY
|
|
126
|
+
|
|
127
|
+
# 2. Subir Docker
|
|
128
|
+
docker-compose up -d
|
|
129
|
+
|
|
130
|
+
# 3. Instalar dependências
|
|
131
|
+
pip install -e .
|
|
132
|
+
|
|
133
|
+
# 4. Iniciar API
|
|
134
|
+
uvicorn src.presentation.api.rest.main:app --reload --port 8000
|
|
135
|
+
|
|
136
|
+
# 5. Testar
|
|
137
|
+
# Abrir http://localhost:8000/docs
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## 🧪 Testing
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# Run all tests
|
|
144
|
+
pytest tests/ -v
|
|
145
|
+
|
|
146
|
+
# Run with coverage
|
|
147
|
+
pytest tests/ --cov=src --cov-report=html
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## 📋 Status
|
|
151
|
+
|
|
152
|
+
**Current Phase**: Setup & Implementation
|
|
153
|
+
**Task Progress**: See `tasks.md` for detailed progress
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
**Created**: 2026-06-30
|
|
158
|
+
**Specification**: clean-architecture-batch-indexing
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
src/cli.py,sha256=Wgs3mLeku1O_aeU5td-i9vUqzovgcNNtHD8BXoCH9o4,21136
|
|
3
|
+
src/application/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
src/application/exceptions.py,sha256=GIRsTxzOqnGwamqWw6rgys8Z_lFip-FHBfxdoHZh8e8,986
|
|
5
|
+
src/application/dtos/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
+
src/application/dtos/affected_component.py,sha256=6t8ng1x5E7Tg4QPNHpWlp24PV3SPvCQtX0D7-zFXofk,1573
|
|
7
|
+
src/application/dtos/batch_processing_result.py,sha256=ifm18GncF6tf_iZ5Oi-3gdmmv0BGunmkcrjEFQFbLF0,371
|
|
8
|
+
src/application/dtos/impact_analysis_response.py,sha256=kzku0PLaOwswczS-y9u-oyQ-yFovgFjQG9Tlr_LPyX4,1771
|
|
9
|
+
src/application/dtos/impact_query_request.py,sha256=6qQL1XJ_ghWo0XWCMcexYbqWTCiAbUzXgm23E-wljmg,837
|
|
10
|
+
src/application/dtos/index_batch_request.py,sha256=gbxGww7iVA1TF1SePzGOt05IGMgpihkZsPxbcclTgWw,1303
|
|
11
|
+
src/application/dtos/index_batch_response.py,sha256=sNg1AyuQz5n6IpuDzDEcg2007Mrb3bN6ROKZmPISZn0,2062
|
|
12
|
+
src/application/dtos/index_result.py,sha256=MhkI89VYEy7RRaOM_5LD5EcOi8F46gITtwspVkmjuLw,428
|
|
13
|
+
src/application/dtos/repository_index_result.py,sha256=cNKCTbORSLYAEAG8hTiTFDejcqPsoi6JYx0p-fU9xMw,2274
|
|
14
|
+
src/application/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
+
src/application/services/file_scanner_service.py,sha256=dbF1c_TNXk89Lt0ZXMvYBcyKigPRlklwJxbRow4UD5E,8666
|
|
16
|
+
src/application/services/progress_tracker.py,sha256=Y3D_dGILo1J5D2V4UAaC1MkyPCfE_WH489QwalnqblQ,3728
|
|
17
|
+
src/application/use_cases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
+
src/application/use_cases/clear_all_data_use_case.py,sha256=DNLlDi76q15g3E2W3l0NKRhwTqHq5OPUbbJIJdshmNM,5715
|
|
19
|
+
src/application/use_cases/index_batch_use_case.py,sha256=bMjIzwvJQ_pfNj5WEskLxKaWPvBjuGYGBc3F8qMeC6I,5350
|
|
20
|
+
src/application/use_cases/index_repository_use_case.py,sha256=kUFHjgNhG_TpSsqVv9V1RVnGfg9pYV0h-kcE3KdF4F4,30318
|
|
21
|
+
src/application/use_cases/indexing_orchestrator.py,sha256=65iYr5U_awnbhM99zaK4YvIfObx5HsQ72vwpTllTRdo,5925
|
|
22
|
+
src/application/use_cases/list_repositories_use_case.py,sha256=JXO8VvQgfo_4aqOWoWJReK2tFI298Mt5Mzay4qYmDCY,2348
|
|
23
|
+
src/config/__init__.py,sha256=RuVR0QwIwtZcv8EpPD7XyoP9lHFgh6mQV_--lb_G4Cw,180
|
|
24
|
+
src/config/container.py,sha256=K6Hb3FWzEgv7GnIs1eSp-QDK6oEh8jBICQQebnGhK4Q,7641
|
|
25
|
+
src/config/logging_config.py,sha256=hwX3eJJvMdAI-MV7lCjRwbQF_XNJaLdBUN_M17mlMGQ,3250
|
|
26
|
+
src/config/settings.py,sha256=vqatApOjs8IJ3sNc4YZ0OfmHTNEGecXLbLOnTlYTncU,5729
|
|
27
|
+
src/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
+
src/domain/exceptions.py,sha256=53sEtEFHVMYyJuDK1OPqZ0RRYPIatXomyIZiK1xKKwY,820
|
|
29
|
+
src/domain/entities/__init__.py,sha256=EQuMftfo0levumGo-QkDJjx4NgxQSiIPVydYtUc0wMQ,499
|
|
30
|
+
src/domain/entities/ast_node.py,sha256=pGzFVWXYlQPyUdF1ssJyi-Tgx2l-uoPrjuTRPiBNsoY,1059
|
|
31
|
+
src/domain/entities/code_chunk.py,sha256=iSDrMCFG84o1xSDIU0lJB-JdFdsGF2Fnx3XE2WLilZ4,1425
|
|
32
|
+
src/domain/entities/code_file.py,sha256=WqJcqnhM_roIGzJlW_A-lUgt0skQJyhKTIjOJNrZDRA,1200
|
|
33
|
+
src/domain/entities/dependency_graph.py,sha256=8od2UIxfORFFV3SOf5P-OcjHADUttRyS1CZqjLzcsPc,3244
|
|
34
|
+
src/domain/entities/repository.py,sha256=xeu-iJ0V88_iY-5-asYp0AZs91y7mjpf1iXRljYWJrU,1335
|
|
35
|
+
src/domain/repositories/__init__.py,sha256=MQNM62UFMPVokbzpvdDFT5pjFWV7q1Y5NqKU25-VgFg,737
|
|
36
|
+
src/domain/repositories/i_code_parser.py,sha256=kPtCuphaaFT0kYMf7Kieiri3IEFVSdQ-CZ_xeIQUW2c,1523
|
|
37
|
+
src/domain/repositories/i_dependency_extractor.py,sha256=1WnPm_mae4zdHeQfS03WNVOO8xzLgfbS5npihq4hKW4,1127
|
|
38
|
+
src/domain/repositories/i_embedding_provider.py,sha256=rrFJMLyD95S87c0NGgmiUtRXPwk2g8MIAE_tspJitgA,818
|
|
39
|
+
src/domain/repositories/i_graph_repository.py,sha256=4PMEAOFkdprtVqaAdU67IngvWXnXzmqUgZHQoVgeA90,2053
|
|
40
|
+
src/domain/repositories/i_vector_repository.py,sha256=yuT1h6mIP6w1heEO09qyO2iapwTYvxxxGTYeDCuI4G4,1409
|
|
41
|
+
src/domain/services/__init__.py,sha256=iVWqvqGl24PwtNm77y9q_ubxOCQ4mTlpaT6kgxC9gp8,249
|
|
42
|
+
src/domain/services/dependency_extractor.py,sha256=e58GzYF0S8v7zjB2y4RQy0ToeBmm0m1Ctgk_50N7vnI,38587
|
|
43
|
+
src/domain/services/semantic_chunk_builder.py,sha256=mAbhHa-tGwWPqTD6J3qiDLYckKaVgpP9Ulc6Zow0yvY,24350
|
|
44
|
+
src/domain/value_objects/__init__.py,sha256=nsR8GXSQJVvJjzUshkqHt0hDHXugObJldudzc_D1VPM,374
|
|
45
|
+
src/domain/value_objects/chunk_type.py,sha256=WeRr0piTn-I7mcefIJ4cQ-ipjhCB1muXK-s3Z5c4cNs,737
|
|
46
|
+
src/domain/value_objects/dependency_type.py,sha256=1uc6dEkMM2vBJIXSu-9B7P62aZrTlyEtFUmY7DnH73I,760
|
|
47
|
+
src/domain/value_objects/node_type.py,sha256=8uUbP3eMYds7ScW4d1ZrCxOGspl-wTt12HdS_ga817o,572
|
|
48
|
+
src/domain/value_objects/qualified_name.py,sha256=zePR3cfRlU5SN-A_W7DkbkDOWFF5FesyAVFAV8WB_Vo,2548
|
|
49
|
+
src/infrastructure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
+
src/infrastructure/exceptions.py,sha256=owQP_SSoqimseZ0KRK1ZA5d004O2hfpJ0KrhbYfwXJI,1014
|
|
51
|
+
src/infrastructure/external_apis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
52
|
+
src/infrastructure/external_apis/ollama_embedding_provider.py,sha256=0wPfZdc3zIoy9vbgjAMq9Xi8-0yyZsiNwdeciOz7ZoE,4152
|
|
53
|
+
src/infrastructure/external_apis/openai_embedding_provider.py,sha256=j8G56oDiabo8L8Kl3QFSbBa_GQSdwE92b4GsAq6TE8w,6809
|
|
54
|
+
src/infrastructure/parsing/__init__.py,sha256=e2ZUgDHPYVrfgYMXEwu72Btkz__MtetxGLThzbUVLhM,944
|
|
55
|
+
src/infrastructure/parsing/config_file_parser.py,sha256=qzWvwq0IKPRf4hXrULJM2uwMWlZNRl2zQq4dfQ66bvI,12990
|
|
56
|
+
src/infrastructure/parsing/gradle_dependency_parser.py,sha256=PdhQROo8rZBmCYTilGvO7m3aF5D_TiY5b0vO4p58C3M,5567
|
|
57
|
+
src/infrastructure/parsing/groovy_parser.py,sha256=fULcilKPrztlZJLJlG9iwJfCfyxZZJbO7lRRiNhCHW4,7740
|
|
58
|
+
src/infrastructure/parsing/maven_dependency_parser.py,sha256=ZL2NZD2hEj6dLJGWo-Y2gsFCw9VTdsQm1DS9QRQVH5w,4789
|
|
59
|
+
src/infrastructure/parsing/microfrontend_config_parser.py,sha256=Ia-UZ4S1tfPweUKGPrAL1SyaI9py7cCx3ml5BB6KDiE,8095
|
|
60
|
+
src/infrastructure/parsing/npm_package_dependency_parser.py,sha256=dPnIptR_xmdplkUn2lKx3tt7g0xu8H4rEuZD7oeh-KU,9243
|
|
61
|
+
src/infrastructure/parsing/python_parser.py,sha256=wD6Z4J5CtDr2w9NzM7P48nggLZjYtRtTqsOGv_507bQ,8094
|
|
62
|
+
src/infrastructure/parsing/sql_schema_parser.py,sha256=vTnXOV56bjyGyFK8U5Kj1BIOVKHKr5M_rIF14dQp1nw,27475
|
|
63
|
+
src/infrastructure/parsing/tree_sitter_java_parser.py,sha256=J9LPHPNLirKkDvkcPCQHWCMgsYrgC4s6iVKI-tvqJh4,18118
|
|
64
|
+
src/infrastructure/parsing/tree_sitter_typescript_parser.py,sha256=FvEWx1GBY6wvkHmI4ZQURB4awomVZsRDX0xGC8ZU6WQ,22413
|
|
65
|
+
src/infrastructure/persistence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
66
|
+
src/infrastructure/persistence/graph_export_repository.py,sha256=G6JMN9k1P94K8EmMriw5fnXhY0o8AHKVjnwGsZ9m8i4,17402
|
|
67
|
+
src/infrastructure/persistence/neo4j_dependency_repository.py,sha256=vyleFsnXq39Aoq3Ql6VH-_BhDQkHUahMlE9JmXj2G4Q,23584
|
|
68
|
+
src/infrastructure/persistence/qdrant_vector_repository.py,sha256=J0I4H_lhveKG_VM8TYmmvTssNMImm_4aNhC0afRIOkM,12719
|
|
69
|
+
src/infrastructure/persistence/repository_relationship_repository.py,sha256=yPNCrIPX5_f7R4S54xh5_hIppMQsb3qVqKUVkkFpUJ8,70694
|
|
70
|
+
src/presentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
71
|
+
src/presentation/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
72
|
+
src/presentation/api/rest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
73
|
+
src/presentation/api/rest/exception_handlers.py,sha256=uJYx6T25ZMw8S6fP_eTHW2ojapjm899R9OvXZQcEhlk,4379
|
|
74
|
+
src/presentation/api/rest/main.py,sha256=XioTf4UZ2XdleC1_e_QMnC_nPGtgtucwBuiGLZ1knVY,2254
|
|
75
|
+
src/presentation/api/rest/routers/__init__.py,sha256=EBMMJt8gcWnI821K_6ijAbDKcyVUQPqjAWYAU4iHY1s,79
|
|
76
|
+
src/presentation/api/rest/routers/admin.py,sha256=RH1AZa8XoR0O390XHfM-aqDtlTl4FqaGyVmSEO7swTA,2861
|
|
77
|
+
src/presentation/api/rest/routers/analysis.py,sha256=pC2TxdL5QnoKCCfZeFDd3ljW0ZpFK1RLWHyfECjVYAc,35956
|
|
78
|
+
src/presentation/api/rest/routers/export.py,sha256=kpJ75hnzZzgmTvg0K3Yc_VJW9lCMQ0QNuWdy8HwwMXQ,18430
|
|
79
|
+
src/presentation/api/rest/routers/health.py,sha256=jXU4EDpw-RgidkQNRCowoVuPdWYZlRfDQ3kMnTzFmIs,3000
|
|
80
|
+
src/presentation/api/rest/routers/indexing.py,sha256=GPsLPoU9Tx_thsywAsRyyUQpQEUrcFnwOxzXX8a2LZQ,4493
|
|
81
|
+
src/presentation/api/rest/routers/relationships.py,sha256=RVTaL7fgqesMrBYIYWJ2vpxFsUxcDO1Aoa_O_Zew6PY,43847
|
|
82
|
+
graph_dependency_analyzer-0.2.0.dist-info/METADATA,sha256=WH5oabkKd8kip1Bf0VTOnszxwXscuTXVHu6iBMy6-bw,5074
|
|
83
|
+
graph_dependency_analyzer-0.2.0.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
|
|
84
|
+
graph_dependency_analyzer-0.2.0.dist-info/entry_points.txt,sha256=IMVvCL8kiz9VfCpUKLDjKab-tHkr70mz1Ucwx2X8T8E,48
|
|
85
|
+
graph_dependency_analyzer-0.2.0.dist-info/top_level.txt,sha256=74rtVfumQlgAPzR5_2CgYN24MB0XARCg0t-gzk6gTrM,4
|
|
86
|
+
graph_dependency_analyzer-0.2.0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
src
|
src/__init__.py
ADDED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""
|
|
2
|
+
AffectedComponent DTO (Task 9.1)
|
|
3
|
+
|
|
4
|
+
Component affected by an impact analysis.
|
|
5
|
+
"""
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from typing import Literal
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AffectedComponent(BaseModel):
|
|
11
|
+
"""
|
|
12
|
+
Component affected by a change.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
type: Component type (repository, class, or method)
|
|
16
|
+
name: Component name
|
|
17
|
+
qualified_name: Fully qualified name (optional, for classes/methods)
|
|
18
|
+
file_path: Path to the file containing this component (optional)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
type: Literal["repository", "class", "method"] = Field(
|
|
22
|
+
...,
|
|
23
|
+
description="Type of affected component"
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
name: str = Field(
|
|
27
|
+
...,
|
|
28
|
+
min_length=1,
|
|
29
|
+
description="Component name"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
qualified_name: str | None = Field(
|
|
33
|
+
default=None,
|
|
34
|
+
description="Fully qualified name (for classes/methods)"
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
file_path: str | None = Field(
|
|
38
|
+
default=None,
|
|
39
|
+
description="File path containing this component"
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
model_config = {
|
|
43
|
+
"json_schema_extra": {
|
|
44
|
+
"examples": [
|
|
45
|
+
{
|
|
46
|
+
"type": "class",
|
|
47
|
+
"name": "OrderService",
|
|
48
|
+
"qualified_name": "com.example.order.OrderService",
|
|
49
|
+
"file_path": "src/main/java/com/example/order/OrderService.java"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"type": "repository",
|
|
53
|
+
"name": "payment-service",
|
|
54
|
+
"qualified_name": None,
|
|
55
|
+
"file_path": None
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""
|
|
2
|
+
BatchProcessingResult DTO
|
|
3
|
+
|
|
4
|
+
Data transfer object for batch processing results.
|
|
5
|
+
"""
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from src.application.dtos.index_result import IndexResult
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class BatchProcessingResult:
|
|
12
|
+
"""Result of batch repository processing."""
|
|
13
|
+
|
|
14
|
+
total_processed: int
|
|
15
|
+
success_count: int
|
|
16
|
+
failed_count: int
|
|
17
|
+
results: list[IndexResult]
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ImpactAnalysisResponse DTO (Task 9.1)
|
|
3
|
+
|
|
4
|
+
Response for impact analysis queries.
|
|
5
|
+
"""
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from src.application.dtos.affected_component import AffectedComponent
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ImpactAnalysisResponse(BaseModel):
|
|
11
|
+
"""
|
|
12
|
+
Response for impact analysis.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
target: Original target from request
|
|
16
|
+
query_type: Type of query performed
|
|
17
|
+
affected_components: List of components affected by changes to target
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
target: str = Field(
|
|
21
|
+
...,
|
|
22
|
+
description="Target that was analyzed"
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
query_type: str = Field(
|
|
26
|
+
...,
|
|
27
|
+
description="Type of analysis performed (e.g., 'repo-dependents', 'class-impact')"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
affected_components: list[AffectedComponent] = Field(
|
|
31
|
+
default_factory=list,
|
|
32
|
+
description="Components that depend on or are affected by the target"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
model_config = {
|
|
36
|
+
"json_schema_extra": {
|
|
37
|
+
"example": {
|
|
38
|
+
"target": "com.example.PaymentService",
|
|
39
|
+
"query_type": "class-impact",
|
|
40
|
+
"affected_components": [
|
|
41
|
+
{
|
|
42
|
+
"type": "class",
|
|
43
|
+
"name": "OrderService",
|
|
44
|
+
"qualified_name": "com.example.order.OrderService",
|
|
45
|
+
"file_path": "src/main/java/com/example/order/OrderService.java"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"type": "method",
|
|
49
|
+
"name": "processPayment",
|
|
50
|
+
"qualified_name": "com.example.checkout.CheckoutService.processPayment",
|
|
51
|
+
"file_path": "src/main/java/com/example/checkout/CheckoutService.java"
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ImpactQueryRequest DTO (Task 9.1)
|
|
3
|
+
|
|
4
|
+
Request for impact analysis queries.
|
|
5
|
+
"""
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ImpactQueryRequest(BaseModel):
|
|
10
|
+
"""
|
|
11
|
+
Request for impact analysis.
|
|
12
|
+
|
|
13
|
+
Attributes:
|
|
14
|
+
target: Target identifier (repository name, class name, or API URL)
|
|
15
|
+
max_depth: Maximum depth for dependency traversal (1-10)
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
target: str = Field(
|
|
19
|
+
...,
|
|
20
|
+
min_length=1,
|
|
21
|
+
description="Target identifier (repo name, class, or API URL)"
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
max_depth: int = Field(
|
|
25
|
+
default=3,
|
|
26
|
+
ge=1,
|
|
27
|
+
le=10,
|
|
28
|
+
description="Maximum dependency traversal depth"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
model_config = {
|
|
32
|
+
"json_schema_extra": {
|
|
33
|
+
"example": {
|
|
34
|
+
"target": "com.example.PaymentService",
|
|
35
|
+
"max_depth": 3
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""
|
|
2
|
+
IndexBatchRequest DTO (Task 8.3)
|
|
3
|
+
|
|
4
|
+
Request for batch indexing of multiple repositories.
|
|
5
|
+
"""
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class IndexBatchRequest(BaseModel):
|
|
11
|
+
"""
|
|
12
|
+
Request for batch indexing.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
repositories: List of repository names (not full paths)
|
|
16
|
+
parallel: Maximum concurrent repositories processing
|
|
17
|
+
background: If True, async execution (not implemented Phase 1)
|
|
18
|
+
filters: Optional filters (not implemented Phase 1)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
repositories: list[str] = Field(
|
|
22
|
+
...,
|
|
23
|
+
min_length=1,
|
|
24
|
+
description="List of repository names"
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
parallel: int = Field(
|
|
28
|
+
default=3,
|
|
29
|
+
ge=1,
|
|
30
|
+
le=10,
|
|
31
|
+
description="Concurrency limit"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
background: bool = Field(
|
|
35
|
+
default=False,
|
|
36
|
+
description="Run in background (not implemented)"
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
filters: dict[str, Any] | None = Field(
|
|
40
|
+
default=None,
|
|
41
|
+
description="Global filters (not implemented)"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
model_config = {
|
|
45
|
+
"json_schema_extra": {
|
|
46
|
+
"example": {
|
|
47
|
+
"repositories": ["service-payment", "service-auth", "service-order"],
|
|
48
|
+
"parallel": 3,
|
|
49
|
+
"background": False,
|
|
50
|
+
"filters": None
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""
|
|
2
|
+
IndexBatchResponse DTO (Task 8.3)
|
|
3
|
+
|
|
4
|
+
Response for batch indexing with aggregated results.
|
|
5
|
+
"""
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from src.application.dtos.repository_index_result import RepositoryIndexResult
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class IndexBatchResponse(BaseModel):
|
|
11
|
+
"""
|
|
12
|
+
Response for batch indexing.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
total_processed: Total repositories processed
|
|
16
|
+
success_count: Number of successful repositories
|
|
17
|
+
failed_count: Number of failed repositories
|
|
18
|
+
results: List of individual results per repository
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
total_processed: int = Field(
|
|
22
|
+
...,
|
|
23
|
+
ge=0,
|
|
24
|
+
description="Total repositories processed"
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
success_count: int = Field(
|
|
28
|
+
...,
|
|
29
|
+
ge=0,
|
|
30
|
+
description="Successfully indexed repositories"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
failed_count: int = Field(
|
|
34
|
+
...,
|
|
35
|
+
ge=0,
|
|
36
|
+
description="Failed repositories"
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
results: list[RepositoryIndexResult] = Field(
|
|
40
|
+
default_factory=list,
|
|
41
|
+
description="Individual results"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
model_config = {
|
|
45
|
+
"json_schema_extra": {
|
|
46
|
+
"example": {
|
|
47
|
+
"total_processed": 3,
|
|
48
|
+
"success_count": 2,
|
|
49
|
+
"failed_count": 1,
|
|
50
|
+
"results": [
|
|
51
|
+
{
|
|
52
|
+
"repository": "service-payment",
|
|
53
|
+
"status": "success",
|
|
54
|
+
"files_processed": 45,
|
|
55
|
+
"chunks_created": 320,
|
|
56
|
+
"nodes_created": 125,
|
|
57
|
+
"relationships_created": 210,
|
|
58
|
+
"error_message": None
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"repository": "service-auth",
|
|
62
|
+
"status": "error",
|
|
63
|
+
"files_processed": 0,
|
|
64
|
+
"chunks_created": 0,
|
|
65
|
+
"nodes_created": 0,
|
|
66
|
+
"relationships_created": 0,
|
|
67
|
+
"error_message": "Failed to parse pom.xml"
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""
|
|
2
|
+
IndexResult DTO
|
|
3
|
+
|
|
4
|
+
Data transfer object for indexing operation results.
|
|
5
|
+
"""
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Literal
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class IndexResult:
|
|
12
|
+
"""Result of repository indexing operation."""
|
|
13
|
+
|
|
14
|
+
status: Literal["success", "error"]
|
|
15
|
+
repository_name: str
|
|
16
|
+
files_processed: int
|
|
17
|
+
chunks_created: int
|
|
18
|
+
nodes_created: int
|
|
19
|
+
relationships_created: int
|
|
20
|
+
error_message: str | None = None
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""
|
|
2
|
+
RepositoryIndexResult DTO (Task 8.3)
|
|
3
|
+
|
|
4
|
+
Individual repository indexing result.
|
|
5
|
+
"""
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from typing import Literal
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RepositoryIndexResult(BaseModel):
|
|
11
|
+
"""
|
|
12
|
+
Indexing result for a single repository.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
repository: Repository name
|
|
16
|
+
status: Indexing status (success or error)
|
|
17
|
+
files_processed: Number of files processed (None if error before scan)
|
|
18
|
+
chunks_created: Number of chunks created (None if error before chunking)
|
|
19
|
+
nodes_created: Number of nodes created in Neo4j (None if error)
|
|
20
|
+
relationships_created: Number of relationships created (None if error)
|
|
21
|
+
error_message: Error message (None if success)
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
repository: str = Field(..., description="Repository name")
|
|
25
|
+
|
|
26
|
+
status: Literal["success", "error"] = Field(
|
|
27
|
+
...,
|
|
28
|
+
description="Indexing status"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
files_processed: int | None = Field(
|
|
32
|
+
default=None,
|
|
33
|
+
description="Files processed"
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
chunks_created: int | None = Field(
|
|
37
|
+
default=None,
|
|
38
|
+
description="Chunks created"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
nodes_created: int | None = Field(
|
|
42
|
+
default=None,
|
|
43
|
+
description="Nodes created in Neo4j"
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
relationships_created: int | None = Field(
|
|
47
|
+
default=None,
|
|
48
|
+
description="Relationships created"
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
error_message: str | None = Field(
|
|
52
|
+
default=None,
|
|
53
|
+
description="Error message"
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
model_config = {
|
|
57
|
+
"json_schema_extra": {
|
|
58
|
+
"examples": [
|
|
59
|
+
{
|
|
60
|
+
"repository": "service-payment",
|
|
61
|
+
"status": "success",
|
|
62
|
+
"files_processed": 45,
|
|
63
|
+
"chunks_created": 320,
|
|
64
|
+
"nodes_created": 125,
|
|
65
|
+
"relationships_created": 210,
|
|
66
|
+
"error_message": None
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"repository": "service-broken",
|
|
70
|
+
"status": "error",
|
|
71
|
+
"files_processed": 0,
|
|
72
|
+
"chunks_created": 0,
|
|
73
|
+
"nodes_created": 0,
|
|
74
|
+
"relationships_created": 0,
|
|
75
|
+
"error_message": "Repository path not accessible"
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
}
|