B. Architecture & organisation du code - uha-fr/endyear_2025_gr11_back GitHub Wiki

Architecture & organisation du code

Organisation du code

Le dossier PROJET-GIT contient une application constituΓ©e d’un serveur flask de modules d’analyse, des bases de donnΓ©es et une interface utilisateur.

  • archeologist/ : API code-archeologist pour l’analyse de dΓ©pots - service archeologist-db

  • archeologist-db/ : la base de donnΓ©es pour stocker les analyses faites par code-archeologist - service archeologist

  • backend/ : serveur API flask pour centraliser les traitements et flux de donnΓ©es - service api

      • app/modules/ : appel des modules modules d’analyse (archeologist)
      • app/routes/ : routes pour recevoir des demandes depuis le frontend
      • utils/ : fonctions utilitaires
  • data/ : les donnΓ©es Γ  traiter, fournies par l’utilisateur (au format JSON)

  • db_init/ : scripts d’initialisation des bases de donnΓ©es

  • frontend/ : interface utilisateur, mets en forme les donnΓ©es d’analyse - service front

graph TD
    A[PROJET-GIT]
    A --> B{Fichiers racine}
    B --> B1[README.md]
    B --> B2[docker-compose.yml]
    B --> B3[Dockerfile.flask]
    B --> B4[projet_git.sh]
    B --> B5[projet_git_exit.sh]
    B --> B6[projet_git_reset.sh]
    B --> B7[requirements.txt]
    B --> B8[wait-for-it.sh]

    A --> C[archeologist/]
    C --> C1[requirements.txt]
    C --> C2[backend/]
    C2 --> C2_1[app.mjs]
    C2 --> C2_2[Dockerfile.archeologist]
    C2 --> C2_3[eslint.config.js]
    C2 --> C2_4[package-lock.json]
    C2 --> C2_5[package.json]
    C2 --> C2_6[server.mjs]
    C --> C3[frontend/]
    C3 --> C3_1[index.html]
    C3 --> C3_2[package-lock.json]
    C3 --> C3_3[package.json]
    C3 --> C3_4[vite.config.js]
    C3 --> C3_5[public/]
    C3 --> C3_6[src/]
    C3_6 --> C3_6_1[App.vue]
    C3_6 --> C3_6_2[main.js]
    C3_6 --> C3_6_3[style.css]
    C3_6 --> C3_6_4[components/]
    C3_6_4 --> C3_6_4_1[AnalysisDashboard.vue]
    C3_6_4 --> C3_6_4_2[CodebaseHeatmap.vue]
    C3_6_4 --> C3_6_4_3[CommitActivityTimeline.vue]
    C3_6_4 --> C3_6_4_4[CommitQA.vue]
    C3_6_4 --> C3_6_4_5[CommitSummary.vue]
    C3_6_4 --> C3_6_4_6[ContributorStatistics.vue]
    C3_6_4 --> C3_6_4_7[DependencyGraph.vue]
    C3_6_4 --> C3_6_4_8[FileChangeFrequency.vue]
    C3_6_4 --> C3_6_4_9[IssueIntegration.vue]
    C3_6_4 --> C3_6_4_10[SimilarCommits.vue]
    C3_6 --> C3_6_5[store/]
    C3_6_5 --> C3_6_5_1[analysis.js]

    A --> D[archeologist-db/]
    D --> D1[Dockerfile.archeologist-db]

    A --> E[backend/]
    E --> E1[Dockerfile.flask]
    E --> E2[main.py]
    E --> E3[requirements.txt]
    E --> E4[app/]
    E4 --> E4_1[__init__.py]
    E4 --> E4_2[config.py]
    E4 --> E4_3[modules/]
    E4_3 --> E4_3_1[blame.py]
    E4_3 --> E4_3_2[code_archeologist.py]
    E4_3 --> E4_3_3[git_statistic.py]
    E4_3 --> E4_3_4[gitstats.py]
    E4_3 --> E4_3_5[notes_td.py]
    E4_3 --> E4_3_6[repo_analyzer.py]
    E4 --> E4_4[routes/]
    E4_4 --> E4_4_1[analysis.py]
    E4_4 --> E4_4_2[audit.py]
    E4_4 --> E4_4_3[groups.py]
    E4_4 --> E4_4_4[repositories_groups.py]
    E4_4 --> E4_4_5[repositories_students.py]
    E4_4 --> E4_4_6[stats.py]
    E4_4 --> E4_4_7[students.py]
    E4 --> E4_5[utils/]
    E4_5 --> E4_5_1[database.py]
    E4_5 --> E4_5_2[dir_manager.py]
    E4_5 --> E4_5_3[json_to_db.py]
    E4_5 --> E4_5_4[node_analyzer_client.py]
    E --> E5[data/]
    E5 --> E5_1[deadlines.json]
    E5 --> E5_2[groups.json]
    E5 --> E5_3[repositories.json]
    E5 --> E5_4[students.json]

    A --> F[data/]
    F --> F1[deadlines.json]
    F --> F2[groupes.json]
    F --> F3[groups.json]
    F --> F4[lestds.json]
    F --> F5[repos.json]
    F --> F6[repositories.json]
    F --> F7[students.json]
    F --> F8[tds.json]

    A --> G[db_init/]
    G --> G1[before_empty.sql]
    G --> G2[before_modif.sql]
    G --> G3[init-timescaledb.sql]
    G --> G4[init.sql]
    G --> G5[init_____aaaa.sql]
    G --> G6[init_old_1.sql]
    G --> G7[new.sql]

    A --> H[frontend/]
    H --> H1[Dockerfile.front]
    H --> H2[package-lock.json]
    H --> H3[package.json]
    H --> H4[.env]
    H --> H5[public/]
    H5 --> H5_1[index.html]
    H5 --> H5_2[manifest.json]
    H --> H6[src/]
    H6 --> H6_1[App.jsx]
    H6 --> H6_2[index.jsx]
    H6 --> H6_3[assets/]
    H6 --> H6_4[components/]
    H6_4 --> H6_4_1[AuditDisplay.jsx]
    H6_4 --> H6_4_2[Dashboard.jsx]
    H6_4 --> H6_4_3[GroupAnalysis.jsx]
    H6_4 --> H6_4_4[GroupList.jsx]
    H6_4 --> H6_4_5[StudentForm.jsx]
    H6_4 --> H6_4_6[StudentList.jsx]
    H6_4 --> H6_4_7[StudentProfile.jsx]
    H6_4 --> H6_4_8[Toolbar.jsx]
    H6 --> H6_5[graphs/]
    H6_5 --> H6_5_1[BlameChartEvolution.jsx]
    H6_5 --> H6_5_2[ClassScore.jsx]
    H6_5 --> H6_5_3[CodeEvolution.jsx]
    H6_5 --> H6_5_4[CommitActivityTimeline.jsx]
    H6_5 --> H6_5_5[CommitsChart.jsx]
    H6_5 --> H6_5_6[FileChangeFrequencyGraph.jsx]
    H6_5 --> H6_5_7[HeatMapFileChanges.jsx]
    H6 --> H6_6[scriptDB/]
    H6_6 --> H6_6_1["gitanalyser(2).sql"]
    H6 --> H6_7[style/]
    H6_7 --> H6_7_1[App.css]
    H6_7 --> H6_7_2[AuditResultsDisplay.css]
    H6_7 --> H6_7_3[Dashboard.css]
    H6_7 --> H6_7_4[Graphs.css]
    H6_7 --> H6_7_5[GroupAnalysis.css]
    H6_7 --> H6_7_6[GroupList.css]
    H6_7 --> H6_7_7[MainComponents.css]
    H6_7 --> H6_7_8[StudentList.css]
    H6_7 --> H6_7_9[StudentProfile.css]
    H6_7 --> H6_7_10[Toolbar.css]
    H6 --> H6_8[utils/]
    H6_8 --> H6_8_1[stringUtils.jsx]

    A --> I[json_utils/]
    I --> I1[deadlines.json]
└── PROJET-GIT

β”œβ”€β”€ README.md

β”œβ”€β”€ docker-compose.yml

β”œβ”€β”€ Dockerfile.flask

β”œβ”€β”€ projet_git.sh

β”œβ”€β”€ projet_git_exit.sh

β”œβ”€β”€ projet_git_reset.sh

β”œβ”€β”€ requirements.txt

β”œβ”€β”€ wait-for-it.sh

β”œβ”€β”€ archeologist/

β”‚ β”œβ”€β”€ requirements.txt

β”‚ β”œβ”€β”€ backend/

β”‚ β”‚ β”œβ”€β”€ app.mjs

β”‚ β”‚ β”œβ”€β”€ Dockerfile.archeologist

β”‚ β”‚ β”œβ”€β”€ eslint.config.js

β”‚ β”‚ β”œβ”€β”€ package-lock.json

β”‚ β”‚ β”œβ”€β”€ package.json

β”‚ β”‚ └── server.mjs

β”‚ └── frontend/

β”‚ β”œβ”€β”€ index.html

β”‚ β”œβ”€β”€ package-lock.json

β”‚ β”œβ”€β”€ package.json

β”‚ β”œβ”€β”€ vite.config.js

β”‚ β”œβ”€β”€ public/

β”‚ └── src/

β”‚ β”œβ”€β”€ App.vue

β”‚ β”œβ”€β”€ main.js

β”‚ β”œβ”€β”€ style.css

β”‚ β”œβ”€β”€ components/

β”‚ β”‚ β”œβ”€β”€ AnalysisDashboard.vue

β”‚ β”‚ β”œβ”€β”€ CodebaseHeatmap.vue

β”‚ β”‚ β”œβ”€β”€ CommitActivityTimeline.vue

β”‚ β”‚ β”œβ”€β”€ CommitQA.vue

β”‚ β”‚ β”œβ”€β”€ CommitSummary.vue

β”‚ β”‚ β”œβ”€β”€ ContributorStatistics.vue

β”‚ β”‚ β”œβ”€β”€ DependencyGraph.vue

β”‚ β”‚ β”œβ”€β”€ FileChangeFrequency.vue

β”‚ β”‚ β”œβ”€β”€ IssueIntegration.vue

β”‚ β”‚ └── SimilarCommits.vue

β”‚ └── store/

β”‚ └── analysis.js

β”œβ”€β”€ archeologist-db/

β”‚ └── Dockerfile.archeologist-db

β”œβ”€β”€ backend/

β”‚ β”œβ”€β”€ Dockerfile.flask

β”‚ β”œβ”€β”€ main.py

β”‚ β”œβ”€β”€ requirements.txt

β”‚ β”œβ”€β”€ app/

β”‚ β”‚ β”œβ”€β”€ __init__.py

β”‚ β”‚ β”œβ”€β”€ config.py

β”‚ β”‚ β”œβ”€β”€ modules/

β”‚ β”‚ β”‚ β”œβ”€β”€ blame.py

β”‚ β”‚ β”‚ β”œβ”€β”€ code_archeologist.py

β”‚ β”‚ β”‚ β”œβ”€β”€ git_statistic.py

β”‚ β”‚ β”‚ β”œβ”€β”€ gitstats.py

β”‚ β”‚ β”‚ β”œβ”€β”€ notes_td.py

β”‚ β”‚ β”‚ └── repo_analyzer.py

β”‚ β”‚ β”œβ”€β”€ routes/

β”‚ β”‚ β”‚ β”œβ”€β”€ analysis.py

β”‚ β”‚ β”‚ β”œβ”€β”€ audit.py

β”‚ β”‚ β”‚ β”œβ”€β”€ groups.py

β”‚ β”‚ β”‚ β”œβ”€β”€ repositories_groups.py

β”‚ β”‚ β”‚ β”œβ”€β”€ repositories_students.py

β”‚ β”‚ β”‚ β”œβ”€β”€ stats.py

β”‚ β”‚ β”‚ └── students.py

β”‚ β”‚ └── utils/

β”‚ β”‚ β”œβ”€β”€ database.py

β”‚ β”‚ β”œβ”€β”€ dir_manager.py

β”‚ β”‚ β”œβ”€β”€ json_to_db.py

β”‚ β”‚ └── node_analyzer_client.py

β”‚ └── data/

β”‚ β”œβ”€β”€ deadlines.json

β”‚ β”œβ”€β”€ groups.json

β”‚ β”œβ”€β”€ repositories.json

β”‚ └── students.json

β”œβ”€β”€ data/

β”‚ β”œβ”€β”€ deadlines.json

β”‚ β”œβ”€β”€ groupes.json

β”‚ β”œβ”€β”€ groups.json

β”‚ β”œβ”€β”€ lestds.json

β”‚ β”œβ”€β”€ repos.json

β”‚ β”œβ”€β”€ repositories.json

β”‚ β”œβ”€β”€ students.json

β”‚ └── tds.json

β”œβ”€β”€ db_init/

β”‚ β”œβ”€β”€ before_empty.sql

β”‚ β”œβ”€β”€ before_modif.sql

β”‚ β”œβ”€β”€ init-timescaledb.sql

β”‚ β”œβ”€β”€ init.sql

β”‚ β”œβ”€β”€ init_____aaaa.sql

β”‚ β”œβ”€β”€ init_old_1.sql

β”‚ └── new.sql

β”œβ”€β”€ frontend/

β”‚ β”œβ”€β”€ Dockerfile.front

β”‚ β”œβ”€β”€ package-lock.json

β”‚ β”œβ”€β”€ package.json

β”‚ β”œβ”€β”€ .env

β”‚ β”œβ”€β”€ public/

β”‚ β”‚ β”œβ”€β”€ index.html

β”‚ β”‚ └── manifest.json

β”‚ └── src/

β”‚ β”œβ”€β”€ App.jsx

β”‚ β”œβ”€β”€ index.jsx

β”‚ β”œβ”€β”€ assets/

β”‚ β”œβ”€β”€ components/

β”‚ β”‚ β”œβ”€β”€ AuditDisplay.jsx

β”‚ β”‚ β”œβ”€β”€ Dashboard.jsx

β”‚ β”‚ β”œβ”€β”€ GroupAnalysis.jsx

β”‚ β”‚ β”œβ”€β”€ GroupList.jsx

β”‚ β”‚ β”œβ”€β”€ StudentForm.jsx

β”‚ β”‚ β”œβ”€β”€ StudentList.jsx

β”‚ β”‚ β”œβ”€β”€ StudentProfile.jsx

β”‚ β”‚ └── Toolbar.jsx

β”‚ β”œβ”€β”€ graphs/

β”‚ β”‚ β”œβ”€β”€ BlameChartEvolution.jsx

β”‚ β”‚ β”œβ”€β”€ ClassScore.jsx

β”‚ β”‚ β”œβ”€β”€ CodeEvolution.jsx

β”‚ β”‚ β”œβ”€β”€ CommitActivityTimeline.jsx

β”‚ β”‚ β”œβ”€β”€ CommitsChart.jsx

β”‚ β”‚ β”œβ”€β”€ FileChangeFrequencyGraph.jsx

β”‚ β”‚ └── HeatMapFileChanges.jsx

β”‚ β”œβ”€β”€ scriptDB/

β”‚ β”‚ └── gitanalyser(2).sql

β”‚ β”œβ”€β”€ style/

β”‚ β”‚ β”œβ”€β”€ App.css

β”‚ β”‚ β”œβ”€β”€ AuditResultsDisplay.css

β”‚ β”‚ β”œβ”€β”€ Dashboard.css

β”‚ β”‚ β”œβ”€β”€ Graphs.css

β”‚ β”‚ β”œβ”€β”€ GroupAnalysis.css

β”‚ β”‚ β”œβ”€β”€ GroupList.css

β”‚ β”‚ β”œβ”€β”€ MainComponents.css

β”‚ β”‚ β”œβ”€β”€ StudentList.css

β”‚ β”‚ β”œβ”€β”€ StudentProfile.css

β”‚ β”‚ └── Toolbar.css

β”‚ └── utils/

β”‚ └── stringUtils.jsx

└── json_utils/

└── deadlines.json


Containers

Chaque service aura son container dΓ©diΓ© dans lequel seront copiΓ©s les fichiers qui lui sont relatif :

  • projet-git-archeologist-1
  • projet-git-archeologist-db
  • projet-git-front-1
  • projet-git-db-1
  • projet-git-api-1

Pour y accΓ©der et effectuer des commandes dessus : docker exec -it projet-git-db-1 bash


Volumes

Les donnΓ©es persistantes seront stockΓ©es dans des volumes montΓ©e dans l’image docker :

  • projet-git-archeologist-data : donnΓ©es d’analyses persistantes stockΓ©es dans archeologist-db. Accessibles depuis le service archeologist sur : /home/postgres/pgdata/data
  • projet-git-mysql-data : donnΓ©es persistantes extraites des fichiers JSON fournies par l’utilisateur. Accessible depuis le service db sur : /var/lib/mysql
  • projet-git-repo : stockage des clones des dΓ©pots analysΓ©s. Accessible depuis les services api et archeologist sur : /app/clones

  1. Audit automatique d’un dΓ©pΓ΄t Git(GitHub/GitLab) :
  • Nombre de commits, rΓ©partition par auteur, co-modifications.

  • Fichiers les plus modifiΓ©s.

  • ComplexitΓ© cyclomatique de chaque fichier.

  • Contributions en ligne (ajouts/suppressions).

  • Γ‰volution temporelle (graphique + deadline).

  • Rapport HTML complet GitStats.

  1. Statistiques de classe pour un ensemble de dΓ©pΓ΄ts d’étudiants :
  • Analyse TD par TD (commits le samedi, score, Γ  l’heure ou non).

  • Score global par Γ©tudiant.

  • Tableaux et graphiques consolidΓ©s.

  • DΓ©tection de patterns de code communs entre tous les TDs.

  • IntΓ©gration API GitHub : branches, PR, issues, reviews, CI/CD.