Découvrez comment Aibolit fonctionne dans notre livre blanc.
Tout d'abord, vous l'installez (vous devez avoir Python 3.7.7 et PIP installé):
$ pip3 install aibolit Pour analyser vos sources Java, situées à src/java (par exemple), exécutez:
$ aibolit check --filenames src/java/File.java src/java/AnotherFile.javaou
$ aibolit recommend --filenames src/java/File.java src/java/AnotherFile.javaVous pouvez également définir un dossier avec des fichiers Java:
$ aibolit recommend --folder src/java Il exécutera une fonction de recommandation pour le modèle (le modèle est situé dans Aibolit / binary_files / modèle.pkl. Le modèle trouve un modèle que la contribution est la plus grande à la complexité cyclomatique. Si 0 chose est trouvé, vous verrez toutes les recommandations pour les modèles mentionnés. Vous pouvez voir la liste de tous les modèles. n'ont pas 1 2 .
Vous pouvez supprimer certains modèles (valeur séparée par virgule) et ils seront ignorés. Ils ne seront pas inclus dans le rapport, leur importance sera également fixée à 0.
$ aibolit recommend --folder src/java --suppress=P12,P13 Vous pouvez modifier le format, en utilisant le paramètre --format . La valeur par défaut est --format=compact .
$ aibolit recommend --folder src/java --format=compact --fullIl sortira les modèles triés par importance dans l'ordre descendants et regroupé par un nom de modèle:
Show all patterns
/mnt/d/src/java/Configuration.java score: 127.67642529949538
/mnt/d/src/java/Configuration.java[3840]: Var in the middle (P21: 30.95612931128819 1/4)
/mnt/d/src/java/Configuration.java[3844]: Var in the middle (P21: 30.95612931128819 1/4)
/mnt/d/src/java/Configuration.java[3848]: Var in the middle (P21: 30.95612931128819 1/4)
/mnt/d/src/java/Configuration.java[2411]: Null Assignment (P28: 10.76 2/4)
/mnt/d/src/java/Configuration.java[826]: Many primary constructors (P9: 10.76 3/4)
/mnt/d/src/java/Configuration.java[840]: Many primary constructors (P9: 10.76 3/4)
/mnt/d/src/java/Configuration.java[829]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[841]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[865]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[2586]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[3230]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[3261]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[3727]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[3956]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/ErrorExample.java: error when calculating patterns: Can't count P1 metric:
Total score: 127.67642529949538
(P21: 30.95612931128819 1/4) signifie ce qui suit:
30.95612931128819 is the score of this pattern
1 is the position of this pattern in the total list of patterns found in the file
4 is the total number of found patterns
Vous pouvez utiliser format=long . Dans ce cas, tous les résultats seront triés par un numéro de ligne:
Show all patterns
/mnt/d/src/java/Configuration.java: some issues found
/mnt/d/src/java/Configuration.java score: 127.67642529949538
/mnt/d/src/java/Configuration.java[826]: Many primary constructors (P9: 10.76 3/4)
/mnt/d/src/java/Configuration.java[829]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[840]: Many primary constructors (P9: 10.76 3/4)
/mnt/d/src/java/Configuration.java[841]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[865]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[2411]: Null Assignment (P28: 10.76 2/4)
/mnt/d/src/java/Configuration.java[2586]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[3230]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[3261]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[3727]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/Configuration.java[3840]: Var in the middle (P21: 30.95612931128819 1/4)
/mnt/d/src/java/Configuration.java[3844]: Var in the middle (P21: 30.95612931128819 1/4)
/mnt/d/src/java/Configuration.java[3848]: Var in the middle (P21: 30.95612931128819 1/4)
/mnt/d/src/java/Configuration.java[3956]: Partial synchronized (P14: 0.228 4/4)
/mnt/d/src/java/ErrorExample.java: error when calculating patterns: Can't count P1 metric:
/mnt/d/src/java/MavenSlice.java: your code is perfect in aibolit's opinion
Total score: 127.67642529949538
Vous pouvez également choisir le format XML. Il aura le même format que le mode compact , mais XML sera créé:
< report >
< score >127.67642529949538</ score >
<!-- Show all patterns -->
< files >
< file >
< path >/mnt/d/src/java/Configuration.java</ path >
< summary >Some issues found</ summary >
< score >127.67642529949538</ score >
< patterns >
< pattern code = " P13 " >
< details >Null check</ details >
< lines >
< number >294</ number >
< number >391</ number >
</ lines >
< score >30.95612931128819</ score >
< order >1/4</ order >
</ pattern >
< pattern code = " P12 " >
< details >Non final attribute</ details >
< lines >
< number >235</ number >
</ lines >
< score >10.76</ score >
< order >2/4</ order >
</ pattern >
< pattern code = " P21 " >
< details >Var in the middle</ details >
< lines >
< number >235</ number >
</ lines >
< score >2.056</ score >
< order >3/4</ order >
</ pattern >
< pattern code = " P28 " >
< details >Null Assignment</ details >
< lines >
< number >2411</ number >
</ lines >
< score >0.228</ score >
< order >4/4</ order >
</ pattern >
</ patterns >
</ file >
< file >
< path >/mnt/d/src/java/ErrorExample.java</ path >
< summary >Error when calculating patterns: Can't count P1 metric: </ summary >
</ file >
< file >
< path >/mnt/d/src/java/MavenSlice.java</ path >
< summary >Your code is perfect in aibolit's opinion</ summary >
</ file >
</ files >
</ report >
Le score est l'importance relative du modèle (il n'y a pas de plage pour cela). Le score plus important est que le schéma le plus important est. Par exemple, si vous avez plusieurs modèles, vous devez d'abord réparer le modèle avec le score de 5,45:
/mnt/d/src/java/SampleTests.java[43]: Non final attribute (P12: 5.45 1/10)
/mnt/d/src/java/SampleTests.java[44]: Non final attribute (P12: 5.45 1/10)
/mnt/d/src/java/SampleTests.java[80]: Var in the middle (P21: 3.71 2/10)
/mnt/d/src/java/SampleTests.java[121]: Var in the middle (P21: 3.71 2/10)
/mnt/d/src/java/SampleTests.java[122]: Var declaration distance for 5 lines (P20_5: 2.13 3/10)
/mnt/d/src/java/SampleTests.java[41]: Non final class (P24: 1.95 4/10)
/mnt/d/src/java/SampleTests.java[59]: Force Type Casting (P5: 1.45 5/10)
/mnt/d/src/java/SampleTests.java[122]: Var declaration distance for 7 lines (P20_7: 1.07 6/10)
/mnt/d/src/java/SampleTests.java[122]: Var declaration distance for 11 lines (P20_11: 0.78 7/10)
/mnt/d/src/java/SampleTests.java[51]: Protected Method (P30: 0.60 8/10)
/mnt/d/src/java/SampleTests.java[52]: Super Method (P18: 0.35 9/10)
/mnt/d/src/java/SampleTests.java[100]: Partial synchronized (P14: 0.08 10/10)
/mnt/d/src/java/SampleTests.java[106]: Partial synchronized (P14: 0.08 10/10)
/mnt/d/src/java/SampleTests.java[113]: Partial synchronized (P14: 0.08 10/10)
Le score par classe est la somme de tous les scores de modèles.
/mnt/d/src/java/SampleTests.java score: 17.54698560768407
Le score total est une moyenne parmi tous les fichiers Java dans un projet (dossier que vous avez mis pour analyser)
Total average score: 4.0801854775508914
Si vous avez 2 dizaines de projets différents, le pire projet est celui qui a le score le plus élevé.
Le modèle est automatiquement installé avec le package Aibolit , mais vous pouvez également essayer votre propre modèle
$ aibolit recommend --folder src/java --model /mnt/d/some_folder/model.pkl Vous pouvez obtenir un rapport complet avec la commande --full , puis tous les modèles seront inclus à la sortie:
$ aibolit recommend --folder src/java --full Vous pouvez exclure les fichiers avec --exclude Commande. Vous pour définir des modèles globaux pour ignorer:
$ aibolit recommend --folder src/java --exclude= ** / * Test * .java --exclude= ** / * Impl * .javaSi vous avez besoin d'aide, courez
$ aibolit recommend --help La commande Train fait ce qui suit:
Le train ne fonctionne qu'avec le référentiel GIT cloné.
Clone Aibolit Repository
Allez sur cloned_aibolit_path
Exécutez pip install .
Définir la variable Env export HOME_AIBOLIT=cloned_aibolit_path (exemple pour Linux).
Définissez la variable Env TARGET_FOLDER si vous devez enregistrer tous les fichiers de jeu de données dans un autre répertoire.
Vous devez spécifier un ensemble de données de train et de test: définissez la variable d'environnement HOME_TRAIN_DATASET pour l'ensemble de données de train et la variable d'environnement HOME_TEST_DATASET pour l'ensemble de données de test. Habituellement, ces fichiers se trouvent dans scripts/target/08 répertoire après la collection de jeux de données (si vous ne l'avez pas sauté). Mais vous pouvez utiliser vos propres ensembles de données.
Veuillez noter que si vous définissez TARGET_FOLDER , vos fichiers de jeu de données seront dans TARGET_FOLDER/target . C'est pourquoi il est nécessaire de définir home_train_dataset = TARGET_FOLDER Target 08 08-Train.csv, home_test_dataset = TARGET_FOLDER Target 08 08-Test.csv
Si vous devez configurer son propre répertoire où le modèle sera enregistré, configurez également la variable d'environnement SAVE_MODEL_FOLDER . Sinon, le modèle sera enregistré dans cloned_aibolit_path/aibolit/binary_files/model.pkl
Si vous avez besoin de configurer son propre dossier avec des fichiers Java, utilisez --java_folder parameter , la valeur par défaut sera scripts/target/01 du repo cloné Aibolit
Ou vous pouvez utiliser notre image docker (le lien sera bientôt ici)
Exécuter le pipeline de train:
$ aibolit train --java_folder=src/java [--max_classes = 100] [--dataset_file] Si vous devez enregistrer l'ensemble de données avec toutes les mesures calculées dans un autre répertoire, vous devez utiliser le paramètre dataset_file
$ aibolit train --java_folder=src/java --dataset_file /mnt/d/new_dir/dataset.csv Vous pouvez ignorer la collection de jeux de données avec le paramètre skip_collect_dataset . Dans ce cas, le modèle sera formé avec un ensemble de données prédéfini (voir 5 points):
$ aibolit train --java_folder=src/java --skip_collect_datasetTout d'abord, vous devez installer:
Installez les packages suivants si vous n'avez pas:
$ apt-get install ruby-dev libz-dev libxml2Ensuite, vous fourrez le dépôt et apportez les modifications. Ensuite, vous vous assurez que la construction est toujours propre, en fonctionnant:
$ makePour construire du papier blanc:
$ cd wp
$ latexmk -c && latexmk -pdf wp.texSi tout va bien, soumettez une demande de traction.
Utilisation du pipeline de recommandation Docker
$ docker run --rm -it
-v < absolute_path_to_folder_with_classes > :/in
-v < absolute_path_to_out_dir > :/out
cqfn/aibolit-image