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
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("..")
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)
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
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)
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
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("..")
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
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)