示例#1
0
def prepare_data(pkl_file_name):
    """Prepares obj to be serialized into pickle file.
    pkl_file_name : str : name of the pickle file, without suffix
    return a list of all the object for requested proper and year.
    Example : prepare_data('romanus_1962')
    What does this function :
    - loads all the objects matching with pkl_file_name
    - prepares regex (call CompileRegex)
    - deletes useless attributes (such as regex_)
    - returns the list. At the end of the list, saturday of the Virgin Mary, and Ferie"""
    obj_list = [] # list which will be returned with all the files
    end_of_list = [] # this is necessary because feria and Virgin Saturday MUST be a the end
    # load
    for xml_file in [elt for elt in xml_files if pkl_file_name in elt ]:
        logger.debug(xml_file)
        with enc.Preferences(xml_file) as file:
            tmp_list = file.prefs
        if 'samedi_ferie' in xml_file:
            end_of_list = tmp_list
        else:
            obj_list += tmp_list
    obj_list += end_of_list
    # compile regex
    logger.info("Compile regex")
    [CompileRegex(obj) for obj in obj_list]
    # delete useless attributes
    logger.info('Delete useless attributes')
    for obj in obj_list:
        if obj.__dict__.get("regex_",False):
            delattr(obj,'regex_')    
    return obj_list
示例#2
0
def sauvegarde():
    global ajout
    global objets
    global objets_ancien
    global fichier
    if fichier == 'non':
        choix_fichier()
    os.chdir("./theoXML")
    if ajout != []:
        print("""Voici les objets ajoutés : """)
        for a in ajout:
            print(a.nom)
            for z,b in sorted(a.__dict__.items()):
                print(z,':',b)
    if objets != [] and objets_ancien != objets:
        print("""Voici les objets modifiés : """)
        for a in objets:
            if a not in objets_ancien:
                print(a.nom)
                for z,b in sorted(a.__dict__.items()):
                    print(z,':',b)
    print(objets is objets_ancien)
    reponse = 'peut-être'
    while reponse != 'non':
        reponse = input("""Voulez-vous sauvegarder ? (oui/non)""")
        if reponse == 'oui':
            objets = objets + ajout
            ajout = []
            with enc.Preferences(fichier,'w') as file:
                file.prefs = objets
            os.system('cat ' + fichier + '|xmllint --format - > tMpXmL && cat tMpXmL > ' + fichier + '&& rm tMpXmL')
            reponse = 'non'
            objets_ancien = objets.copy()
    os.chdir("..")
示例#3
0
def xml_to_pkl(name):
    """Takes an xml file and convert it to pickle file.
    Input must be a name without suffix, which exists in the theoXML folder
    Put the output to data folder"""
    path = os.path.dirname(enc.__file__) + '/'
    with enc.Preferences(path + 'theoXML/' + name + '.xml','r') as f:
        data = f.prefs
    with open(path + 'programme/data/' + name + '.pkl','bw') as f:
        pickle.Pickler(f).dump(data)
示例#4
0
def modify_in_obj(function,pattern='.*',auto_saved=False):
    """This function applies function
    to every file matching pattern.
    If pattern == '.*' (default) : every file
    function is a custom function which takes
    one parameter : a Feast like object
    auto_saved : if True, objects are saved in their
    own file just after function has called the whole file"""
    list_of_files = [file for file in xml_files if re.match(pattern,file) ]
    for file in list_of_files:
        logger.debug(file)
        with enc.Preferences(file,'r') as f:
            list_of_obj = f.prefs
        for obj in list_of_obj:
            function(obj)
        if auto_saved:
            with enc.Preferences(file,'w') as f:
                f.prefs = list_of_obj
示例#5
0
def to_dic_word_frequency(name):
    """Loads an xml file name, without suffix)
    which is {word:word_frequency}
    Builds a tuple(words,{word:wordcost},maxword)
    Save it as a pkl file"""
    path = os.path.dirname(enc.__file__) + '/'
    with enc.Preferences(path + 'theoXML/' + name + '.xml','r') as f:
        data = f.prefs
    if not isinstance(data,dict):
        raise ValueError("Please enter a dict")
    data = splitter.build_cost_dic(data)
    with open(path + 'programme/data/' + name + '.pkl','bw') as f:
        pickle.Pickler(f).dump(data)
示例#6
0
def dossier_d_objets():
    """Une fonction qui charge le contenu des fichiers xml de theoXML"""
    os.chdir("./theoXML")
    liste = subprocess.run(['ls'],stdout=subprocess.PIPE)
    liste = liste.stdout.decode().split('\n')
    fichiers = {}
    for file in liste:
        if file.split('.')[-1] != 'xml':
            continue
        try:
            with enc.Preferences(file,'r') as f:
                fichiers[file] = f.prefs
        except:
            exit("L'un des fichiers ne semble pas avoir le bon format, ou bien est corrompu : {}".format(file))
    os.chdir('..')
    return fichiers
示例#7
0
def choix_fichier():
    global fichier
    global objets_ancien
    os.chdir("./theoXML")
    subprocess.run(['ls'])
    readline.parse_and_bind("tab: complete")
    fichier=finput("""Entrez le nom du fichier. Si ce fichier n'existe pas, il sera automatiquement créé. """)
    global objets
    try:
        with enc.Preferences(fichier,'r') as file:
            objets = file.prefs
        print("Fichier {} chargé.".format(fichier))
    except: # Il y a un problème avec le Parser
        objets = []
        print("""Un nouveau fichier sera créé lorsque vous procéderez à l'enregistrement.""")
    objets_ancien = objets.copy()
    os.chdir("..")
示例#8
0
def ajouter(modele,entrees={}):
    global ajout
    global objets
    nouveau = getattr(adjutoria,modele)()
    numero=-1
    if entrees != {}:
        for i, elt in enumerate(objets):
            if entrees == elt.__dict__:
                numero = i
                print('Pris en compte')
        for hideux,a in nouveau.__dict__.items():
            try:
                nouveau.__dict__[hideux] = entrees[hideux]
            except KeyError:
                pass
    
    boucle = True
    erreur = 'Erreur dans les informations rentrées.'
    
    def valider(text='',prerempli='',typ='int'):
        boucle = True
        while boucle:
            prerempli = finput(text,prerempli)
            try:
                if typ == 'int':
                    return int(prerempli)
                elif typ == 'bool':
                    if prerempli == 'True':
                        return True
                    elif prerempli == 'False':
                        return False
                    else:
                        raise ValueError
            except ValueError:
                print(erreur)
            
    while boucle:
        nouveau.nom['la'] = finput('Rentrez le nom de la fête en latin',nouveau.nom['la'])
        nouveau.nom['fr'] = finput('Rentrez le nom de la fête en français',nouveau.nom['fr'])
        nouveau.nom['en'] = finput('Rentrez le nom de la fête en anglais',nouveau.nom['en'])
        #nouveau.ordo=valider('Rentrez l\'année de l\'ordo de référence.',nouveau.ordo)
        nouveau.propre = finput('Rentrez le propre de cette fête.',nouveau.propre)
        
        nouveau.degre = valider('Rentrez le degré de la fête (1 à 5)',nouveau.degre)
        print("""Voici les différents degrés de préséance :""")
        for i,a in sorted(variables.priorites.items()):
            print(i,':',a)
        nouveau._priorite = valider('Rentrez le degré de préséance de la fête',nouveau._priorite)
        print("""Voici les différents degrés de commémoraison : """)
        for i,a in sorted(variables.priorites_de_commemoraison.items()):
            print(i,':',a)
        nouveau.commemoraison_privilegiee = valider('Rentrez le degré de commémoraison.',nouveau.commemoraison_privilegiee)
        #nouveau.degre = 6 # pal
        #nouveau._priorite = 50 # pal
        #nouveau.commemoraison_privilegiee = 0 # pal
        
        #nouveau.pal = valider('La messe peut-elle être Pro aliquibus locis ?',nouveau.pal,'bool')
        nouveau.pal = False
        #nouveau.votive = valider('La messe est-elle votive, ou peut-elle être reprise comme votive ?',nouveau.votive,'bool')
        nouveau.occurrence_perpetuelle = valider('La fête souffre-t-elle d\'une occurrence perpétuelle avec une autre fête ?',nouveau.occurrence_perpetuelle,'bool')
        nouveau.dimanche = valider('La fête tombe-t-elle un dimanche ?',nouveau.dimanche,'bool')
        #nouveau.repris_en_ferie = valider('La fête est-elle reprise en férie ?',nouveau.repris_en_ferie,'bool')
        nouveau.fete_du_Seigneur = valider('La fête est-elle une fête du Seigneur ?',nouveau.fete_du_Seigneur,'bool')
        nouveau.temporal = valider('La fête fait-elle partie du Temporal ?', nouveau.temporal,'bool')
        #nouveau.temporal = False
        #nouveau.sanctoral = False
        if not nouveau.temporal:
            nouveau.sanctoral = True
        else:
            reponse = finput('Cette fête appartient-elle à un temps liturgique variable ?',nouveau._temps_liturgique)
            if reponse == 'variable':
                nouveau._temps_liturgique = 'variable'
            elif reponse == str(nouveau._temps_liturgique):
                pass
            else:
                menu_temps = {'title': "Temps liturgique", 'type': MENU, 'subtitle': "Choississez le temps liturgique",'options':[]}
                i = 0
                for key, value in variables.temps_liturgiques.items():
                    menu_temps['options'].append({'title': "Temps liturgique : {}".format(value), 'type': EQUAL, ARGS: key})
                    i+=1
                nouveau._temps_liturgique = menu(menu_temps, direct_exit = True,renvoi = True)
                
        nouveau._couleur = finput('Rentrez la couleur de la fête.',nouveau._couleur)
        nouveau.link = finput('Merci de rentrer le lien vers les textes sur le site Introibo.fr',nouveau.link)
        if nouveau.personne == {"deuxieme"}:
            nouveau.personne = ""
        nouveau.personne = finput("""Quelle personne est célébrée dans cette fête ?
            Règles :
            1 - Pour les personnes divines :
                Père = premiere
                Fils = deuxieme
                Saint-Esprit = troisieme
            2 - Pour les saints :
                Sainte Vierge = marie
                Saints anciens = prénom exclusivement, en minuscules, sans le titre.
                    Ex : pierre, paul
                Homonymes : toujours le prénom d'abord ; on ne note ni les prépositions (de,à, au...) ni les articles (le, la...)
                    Ex : jean_baptiste, jean_apotre, jean_croix, jean_chrysostome, jean_aumonier, jean_avila...
                Prénoms composés :
                    Ex : jean-marie, jean-pierre.
            S'il y a plusieurs personnes, séparez les noms par des espaces."""," ".join(nouveau.personne))
        nouveau.personne = set(nouveau.personne.split())
        
        """for key, value in sorted(nouveau.regex_.items()):
            prerempli = ''
            for a in value:
                prerempli += a +' '
            nouveau.regex_[key] = finput("Rentrez les mots-clefs de la partie '{}'. N'oubliez pas de les séparer par des blancs.".format(key),prerempli).lower().split()"""
        nouveau.tokens_ = finput("""Please enter tokens for research""",nouveau.tokens_)
        
        if modele == 'FeteFixe' or modele == 'FeteMobileCivile':
            nouveau.date_['mois'] = valider('Rentrez le numéro du mois',nouveau.date_['mois'])
            nouveau.date_['jour'] = valider('Rentrez le jour du mois',nouveau.date_['jour'])
            if modele == 'FeteMobileCivile':
                nouveau.semaine = valider('Rentrez le nombre de semaines d\'écart',nouveau.semaine)
                nouveau.jour_de_semaine = valider("Rentrez le jour de la semaine (dimanche = 0)",nouveau.jour_de_semaine)
        elif modele == 'FeteMobilePaques':
            nouveau.date_ = valider('Rentrez le nombre de jour par rapport à Pâques. Avant Pâques = négatif.',nouveau.date_)
        elif modele == 'FeteFixeBissextile':
            nouveau.date_['bissextile']['mois'] = valider('Rentrez le numéro du mois dans le cas d\'une année bissextile.',nouveau.date_['bissextile']['mois'])
            nouveau.date_['bissextile']['jour'] = valider("Rentrez le numéro du jour du mois dans le cas d'une année bissextile.",nouveau.date_['bissextile']['jour'])
            nouveau.date_['ordinaire']['mois'] = valider("Rentrez le numéro du mois dans le cas d'une année ordinaire.",nouveau.date_['ordinaire']['mois'])
            nouveau.date_['ordinaire']['jour'] = valider("Rentrez le numéro du jour du mois dans le cas d'une année ordinaire.",nouveau.date_['ordinaire']['jour'])        
        elif modele == 'FeteMobileDerniersDimanchesPentecote':
            print("""Choisissez quel dimanche vous voulez créer.""")
            for i,a in enumerate(variables.derniers_dimanches_apres_pentecote[0][1:]):
                i +=1
                print("""{}. {}.""".format(i,a))
            boucle_trois = True
            while boucle_trois:
                reponse_trois = valider()
                if reponse_trois <= i and reponse_trois > 0:
                    boucle_trois = False
                    for a in variables.derniers_dimanches_apres_pentecote[1:]:
                        if a[reponse_trois] != 0:
                            nouveau.date_[a[0]] = a[reponse_trois]
                else:
                    print('Choix invalide')
                    
        elif modele == 'FeteMobileAvent':
            nouveau.date_ = valider('Rentrez le nombre de jour par rapport au quatrième dimanche de l\'Avent. Le chiffre doit être positif.',nouveau.date_)
        elif modele == 'FeteMobileNoel':
            nouveau.date_ = valider('Rentrez le nombre de jour par rapport au premier dimanche après Noël. Avant ce dimanche = négatif.',nouveau.date_)
        elif modele == 'FeteMobileEpiphanie':
            nouveau.date_ = valider('Rentrez le nombre de jour par rapport au premier dimanche après l\'Épiphanie. Avant ce dimanche = négatif.',nouveau.date_)
        elif modele == 'FeteMobileMois' or modele == 'FeastMonthDayCompared':
            nouveau.date_['mois'] = valider('Rentrez le numéro du mois',nouveau.date_['mois'])
            nouveau.date_['jour'] = valider('Rentrez le numéro du jour de la semaine (lundi = 0)',nouveau.date_['jour'])
            nouveau.date_['ordre'] = valider("Rentrez le rang du jour par rapport au mois. 0 = premier, -1 = dernier.",nouveau.date_['ordre'])
            if modele == "FeastMonthDayCompared":
                nouveau.date_['distance'] = valider("Enter number of days compared to base. before = negative",nouveau.date_['distance'])
        elif modele == 'FeteFixeTransferablePaques':
            print("""Informations concernant la date de base :""")
            nouveau.date_['mois'] = valider('Rentrez le numéro du mois',nouveau.date_['mois'])
            nouveau.date_['jour'] = valider('Rentrez le jour du mois',nouveau.date_['jour'])
            print("""Informations concernant le transfert de la fête :\n
                Rentrez les bornes de début et de fin par rapport à Pâques de la période pendant laquelle la fête ne pourra pas être célébrée (chiffre négatif si avant Pâques, positif après).""")
            nouveau.borne_debut = valider('Borne de début',nouveau.borne_debut)
            nouveau.borne_fin = valider('Borne de fin',nouveau.borne_fin)
            nouveau.transfert = valider("Rentrez le nombre de jours après Pâques qui doivent être comptés pour le transfert de la fête.",nouveau.transfert)
        elif modele == 'FeteFixeTransferableDimanche':
            print("""Informations concernant la date de base :""")
            nouveau.date_['mois'] = valider('Rentrez le numéro du mois',nouveau.date_['mois'])
            nouveau.date_['jour'] = valider('Rentrez le jour du mois',nouveau.date_['jour'])
            print("""Informations concernant le transfert de la fête :""")
            nouveau.ecart_dimanche = valider("Combien de dimanches d'écart doit-il y avoir ? (0 pour le dimanche suivant la fête, cas le plus fréquent)",nouveau.ecart_dimanche)
            nouveau.apres = valider("La fête transférée se fête-t-elle le dimanche suivant ? (cas le plus fréquent)",nouveau.apres,'bool')
        elif modele == 'FeteFerie': # rien de particulier à rentrer
            pass
        elif modele == 'Samedi': # rien de particulier à rentrer
            pass
        elif modele == 'TSNJ': # rien de particulier à rentrer
            pass
        elif modele == 'Defunts': # rien de particulier à rentrer
            pass
        
        nouveau._images = finput('Rentrez le nom de la clef pour les images. La personne peut être une bonne solution.',nouveau._images).lower()
        """proposition_repo = ''
        if nouveau.sanctoral:
            proposition_repo += 'sanctoral/'
            if modele == 'FeteFixe':
                mois = ('','janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre')
                proposition_repo += mois[nouveau.date_['mois']]
        else:
            proposition_repo += 'temporal/'
            if nouveau.fete_du_Seigneur:
                proposition_repo += 'fetesduseigneur'
            elif nouveau.dimanche:
                proposition_repo += 'dimanches'
        #nouveau.images_rep = finput('Rentrez le dossier où se trouvent les images',proposition_repo)"""
        
        nouveau.addendum['fr'] = finput('Avez-vous des choses à ajouter ? (Laissez vide sinon)',nouveau.addendum['fr'])
        print("""Notre objet {} est construit. Voici ses caractéristiques :""".format(type(nouveau)))
        for a,b in sorted(nouveau.__dict__.items()):
            print(a,':',b)
        print("""Voulez-vous le (V)alider, le (M)odifier ou (A)nnuler ?""". format(type(nouveau),nouveau.__dict__))
        reponse = 'nothing'
        boucle_deux = True
        while boucle_deux:
            reponse=input()
            if reponse == '':
                continue
            elif reponse[0].lower() == 'v':
                with enc.Preferences(fichier_tmp,'w') as tmp:
                    tmp.prefs = ajout + [nouveau]
                os.system('cat ' + fichier_tmp + '|xmllint --format - > tMpXmL && cat tMpXmL > ' + fichier_tmp + '&& rm tMpXmL')
                if numero == -1:
                    ajout.append(nouveau)
                    print("""Objet ajouté.""")
                else:
                    objets[numero]=nouveau
                    print("""Objet modifié.""")
                boucle = False
                boucle_deux = False
            elif reponse[0].lower() == 'm':
                boucle = True
                boucle_deux = False
            elif reponse[0].lower() == 'a':
                print("""Abandon.""")
                boucle = False
                boucle_deux = False
示例#9
0
            if isinstance(obj,list):
                for a in obj:
                    a.regex = CompileRegex(a)
                    tmp.append(a)
            else:
                tmp = obj
            pic.dump(tmp)
elif args.indent:
    fichiers = dossier_d_objets()
    os.chdir("./theoXML")
    for fichier in fichiers:
        os.system('cat ' + fichier + '|xmllint --format - > tMpXmL && cat tMpXmL > ' + fichier + '&& rm tMpXmL')
elif args.add:
    for file in os.listdir(dossier):
        if file.split('.')[-1] == 'xml':
            with enc.Preferences(dossier + file,'r') as f:
                liste = f.prefs
            for obj in liste: # obj est un objet type Fete
                temoin = obj.__class__()
                for a in temoin.__dict__:
                    if a not in obj.__dict__:
                        setattr(obj,a,temoin.__dict__[a])
            with enc.Preferences(dossier + file,'w') as f:
                f.prefs = liste
else:
    menu(menus)