Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] Héritage des clés de type liste dans le parser pl #484

Open
ddoyen opened this issue Mar 24, 2022 · 1 comment
Open

[BUG] Héritage des clés de type liste dans le parser pl #484

ddoyen opened this issue Mar 24, 2022 · 1 comment
Labels
Bug Something isn't working

Comments

@ddoyen
Copy link

ddoyen commented Mar 24, 2022

@nimdanor

Il y a un problème avec l'héritage des clés de type liste dans le parser pl.

L'héritage est traité de la façon suivante dans le parser pl. Si le fichier A.pl hérite des fichiers B.pl et C.pl, le parser produit le dictionnaire des clés de A.pl, puis il produit le dictionnaire des clés de B.pl et étend le dictionnaire des clés de A.pl, puis il produit le dictionnaire des clés de C.pl et étend à nouveau le dictionnaire des clés de A.pl (et tout ça est récursif).

La procédure d'extension d'un dictionnaire A par un dictionnaire B est la suivante.

  • toutes les clés de B qui n'existent pas dans A sont ajoutées
  • pour les clés de B qui existent aussi dans A, ça dépend du type de la valeur associée à la clé:
    • si c'est une liste, on concatène les deux valeurs
    • si c'est un dictionnaire, on fait une extension (récursivement)
    • sinon, on garde le valeur de A

Voilà la fonction qui fait cette extension (apps/loader/utils.py)

def extends_dict(target, source):
    """ Will copy every key and value of source in target if key is not present in target """
    for key, value in source.items():
        if key not in target:
            target[key] = value
        elif type(target[key]) is dict:
            extends_dict(target[key], value)
        elif type(target[key]) is list:
            target[key] += value
    
    return target

Il faut absolument supprimer cette concaténation des listes. Elle n'est pas du tout naturelle. En tant que créateur d'exercices, on pense écraser une liste par une nouvelle valeur et on se retrouve avec une concaténation.

En plus ça crée un bug dans la parsing lui-même puisque les noms des fichiers dont on hérite sont stockés dans une liste dans le dictionnaire (dic['__extends']). Cette liste subit donc des concaténations indésirables au moment des extensions, alors qu'on itère dessus !

def process_extends(dic):
    """ Extends dic with file in dic['__extends'].
        
        Return newly extended dic.
        
        Raise from loader.exceptions:
            - DirectoryNotFound if trying to load from a nonexistent directory
            - FileNotFound if the file do not exists."""
    
    warnings = []
    for item in dic['__extends']:
        try:
            directory = Directory.objects.get(name=item['directory_name'])
            ext_dic, warnings_ext = parse_file(directory, item['path'], extending=True)
            warnings += warnings_ext
            dic = extends_dict(dic, ext_dic)

apps/loader/parser.py

@ddoyen ddoyen added the Bug Something isn't working label Mar 24, 2022
@nimdanor
Copy link
Member

nimdanor commented Apr 6, 2022

A corriger
il aut jeter aussi un coup d'oeil sur le champs "__dependencies".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants