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.
Files changed (86) hide show
  1. graph_dependency_analyzer-0.2.0.dist-info/METADATA +158 -0
  2. graph_dependency_analyzer-0.2.0.dist-info/RECORD +86 -0
  3. graph_dependency_analyzer-0.2.0.dist-info/WHEEL +5 -0
  4. graph_dependency_analyzer-0.2.0.dist-info/entry_points.txt +2 -0
  5. graph_dependency_analyzer-0.2.0.dist-info/top_level.txt +1 -0
  6. src/__init__.py +0 -0
  7. src/application/__init__.py +0 -0
  8. src/application/dtos/__init__.py +0 -0
  9. src/application/dtos/affected_component.py +59 -0
  10. src/application/dtos/batch_processing_result.py +17 -0
  11. src/application/dtos/impact_analysis_response.py +56 -0
  12. src/application/dtos/impact_query_request.py +38 -0
  13. src/application/dtos/index_batch_request.py +53 -0
  14. src/application/dtos/index_batch_response.py +72 -0
  15. src/application/dtos/index_result.py +20 -0
  16. src/application/dtos/repository_index_result.py +79 -0
  17. src/application/exceptions.py +41 -0
  18. src/application/services/__init__.py +0 -0
  19. src/application/services/file_scanner_service.py +258 -0
  20. src/application/services/progress_tracker.py +132 -0
  21. src/application/use_cases/__init__.py +0 -0
  22. src/application/use_cases/clear_all_data_use_case.py +180 -0
  23. src/application/use_cases/index_batch_use_case.py +153 -0
  24. src/application/use_cases/index_repository_use_case.py +683 -0
  25. src/application/use_cases/indexing_orchestrator.py +181 -0
  26. src/application/use_cases/list_repositories_use_case.py +84 -0
  27. src/cli.py +512 -0
  28. src/config/__init__.py +5 -0
  29. src/config/container.py +211 -0
  30. src/config/logging_config.py +123 -0
  31. src/config/settings.py +165 -0
  32. src/domain/__init__.py +0 -0
  33. src/domain/entities/__init__.py +20 -0
  34. src/domain/entities/ast_node.py +32 -0
  35. src/domain/entities/code_chunk.py +45 -0
  36. src/domain/entities/code_file.py +44 -0
  37. src/domain/entities/dependency_graph.py +110 -0
  38. src/domain/entities/repository.py +46 -0
  39. src/domain/exceptions.py +36 -0
  40. src/domain/repositories/__init__.py +22 -0
  41. src/domain/repositories/i_code_parser.py +50 -0
  42. src/domain/repositories/i_dependency_extractor.py +35 -0
  43. src/domain/repositories/i_embedding_provider.py +31 -0
  44. src/domain/repositories/i_graph_repository.py +78 -0
  45. src/domain/repositories/i_vector_repository.py +55 -0
  46. src/domain/services/__init__.py +8 -0
  47. src/domain/services/dependency_extractor.py +962 -0
  48. src/domain/services/semantic_chunk_builder.py +719 -0
  49. src/domain/value_objects/__init__.py +12 -0
  50. src/domain/value_objects/chunk_type.py +24 -0
  51. src/domain/value_objects/dependency_type.py +22 -0
  52. src/domain/value_objects/node_type.py +22 -0
  53. src/domain/value_objects/qualified_name.py +78 -0
  54. src/infrastructure/__init__.py +0 -0
  55. src/infrastructure/exceptions.py +41 -0
  56. src/infrastructure/external_apis/__init__.py +0 -0
  57. src/infrastructure/external_apis/ollama_embedding_provider.py +134 -0
  58. src/infrastructure/external_apis/openai_embedding_provider.py +231 -0
  59. src/infrastructure/parsing/__init__.py +20 -0
  60. src/infrastructure/parsing/config_file_parser.py +347 -0
  61. src/infrastructure/parsing/gradle_dependency_parser.py +159 -0
  62. src/infrastructure/parsing/groovy_parser.py +198 -0
  63. src/infrastructure/parsing/maven_dependency_parser.py +147 -0
  64. src/infrastructure/parsing/microfrontend_config_parser.py +242 -0
  65. src/infrastructure/parsing/npm_package_dependency_parser.py +255 -0
  66. src/infrastructure/parsing/python_parser.py +211 -0
  67. src/infrastructure/parsing/sql_schema_parser.py +658 -0
  68. src/infrastructure/parsing/tree_sitter_java_parser.py +434 -0
  69. src/infrastructure/parsing/tree_sitter_typescript_parser.py +600 -0
  70. src/infrastructure/persistence/__init__.py +0 -0
  71. src/infrastructure/persistence/graph_export_repository.py +443 -0
  72. src/infrastructure/persistence/neo4j_dependency_repository.py +657 -0
  73. src/infrastructure/persistence/qdrant_vector_repository.py +357 -0
  74. src/infrastructure/persistence/repository_relationship_repository.py +1312 -0
  75. src/presentation/__init__.py +0 -0
  76. src/presentation/api/__init__.py +0 -0
  77. src/presentation/api/rest/__init__.py +0 -0
  78. src/presentation/api/rest/exception_handlers.py +174 -0
  79. src/presentation/api/rest/main.py +80 -0
  80. src/presentation/api/rest/routers/__init__.py +5 -0
  81. src/presentation/api/rest/routers/admin.py +103 -0
  82. src/presentation/api/rest/routers/analysis.py +980 -0
  83. src/presentation/api/rest/routers/export.py +442 -0
  84. src/presentation/api/rest/routers/health.py +117 -0
  85. src/presentation/api/rest/routers/indexing.py +148 -0
  86. 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,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (83.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ graph-explorer = src.cli:main
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
+ }