def test_analyseLigneVille_Manque_Champ(): """ Ligne de description d'une ville trop courte : 3 champs au lieu de 4 manque champ tmth """ config = configparser.RawConfigParser() config.read('FinancesLocales.properties') # Recup chemin base de test databasePathDir = config.get('Test', 'database.testDir') databasePath = os.path.join(databasePathDir, config.get('Test', 'database.testName')) # Création base connDB = database.createDatabase(config, databasePath, False) dictPositionColumns, listMissingKeys = \ updateDataMinFiCommon.getColumnPosition('dep;icom;prod;fprod;mprod;tmth', "V", connDB, False) with pytest.raises(ValueError, match=r'manque clé tmth'): dictValues = updateDataMinFi.analyseLigneVille(config, '068;101;25.6;2.5;4.7', dictPositionColumns, True) # Fermeture base database.closeDatabase(connDB, True)
def test_getColumnPosition_Pb(): """ Test cas d'erreur fonction de validation d'un répertoire contenant les données issues du site gouvernemental """ config = configparser.RawConfigParser() config.read('FinancesLocales.properties') # Recup chemin base de test databasePathDir = config.get('Test', 'database.testDir') databasePath = os.path.join(databasePathDir, config.get('Test', 'database.testName')) # Création base connDB = database.createDatabase(config, databasePath, True) with pytest.raises(ValueError, match=r".*Entete CSV non valide.*"): dictPositionColumns, listMissingKeys = \ updateDataMinFiCommon.getColumnPosition("Entete tout moisi", "V", connDB, True) database.closeDatabase(connDB, True)
def test_analyseLigneGroupement(ligneGroupement, header, dictVerif): """ Récupération des valeurs dans une ligne de valeur pour une ville """ config = configparser.RawConfigParser() config.read('FinancesLocales.properties') # Recup chemin base de test databasePathDir = config.get('Test', 'database.testDir') databasePath = os.path.join(databasePathDir, config.get('Test', 'database.testName')) # Création base connDB = database.createDatabase(config, databasePath, False) dictPositionColumns, listMissingKeys = \ updateDataMinFiCommon.getColumnPosition(header, "GC", connDB, False) dictValues = updateDataMinFiGroupementCommunes.analyseLigneGroupement(ligneGroupement, dictPositionColumns, True) assert dictValues == dictVerif # Fermeture base database.closeDatabase(connDB, True)
def test_getColumnPosition(headerTest, dictKeyOk, missingKey): """ Récupération position des mots clés de la table dans l'entête de test """ config = configparser.RawConfigParser() config.read('FinancesLocales.properties') # Recup chemin base de test databasePathDir = config.get('Test', 'database.testDir') databasePath = os.path.join(databasePathDir, config.get('Test', 'database.testName')) # Création base connDB = database.createDatabase(config, databasePath, True) dictPositionColumns, listMissingKeys = \ updateDataMinFiCommon.getColumnPosition(headerTest, "V", connDB, True) # Controle des clés présentes et de leur position dans headerTest for keyOk in dictKeyOk: assert dictPositionColumns[keyOk] == dictKeyOk[keyOk] if listMissingKeys: assert missingKey in listMissingKeys else: assert not missingKey database.closeDatabase(connDB, True)
def main(argv=None): """ Met à jour les données de groupement de communes de la base de données du ministère des finances à partir des fichiers .csv du répertoire passé en paramètres. """ # Valeur par défaut des options verbose = False # Lecture du fichier de propriétés config = configparser.RawConfigParser() ficProperties = 'FinancesLocales.properties' config.read(ficProperties) ############################# # Analyse des arguments reçus ############################# if argv is None: argv = sys.argv nomProg = os.path.basename(argv[0]) # parse command line options try: opts, args = getopt.getopt(argv[1:], "huvV", ["help", "usage", "version", "verbose"]) except getopt.error as msg: print(msg) print("Pour avoir de l'aide : --help ou -h", file=sys.stderr) sys.exit(1) # process options for opt in opts: verboseOpt, sortiePgm = \ utilitaires.traiteOptionStd(config, opt[0], nomProg, __doc__, \ ['database/minfi.db ../recup_data_gouv_fr_colectivite/comptes-groupements.csv']) verbose = verbose or verboseOpt if sortiePgm: sys.exit(0) utilitaires.checkPythonVersion(config, verbose) # Récuperation et analyse des paramètres if len(args) != 2: msg = __doc__ + "\nDonnez au moins 2 paramètres :\n" + \ "chemin base .db et fichier .csv !" + \ "\nau lieu de : " + str(len(args)) print(msg, file=sys.stderr) sys.exit(1) # Vérifie et récupère le nom de la base à mettre à jour databasePath = args[0] if not databasePath.endswith(".db"): msg = __doc__ + "Erreur : Le nom de la base de donnée doit se terminer par .db :\n" + \ databasePath print(msg, file=sys.stderr) sys.exit(2) # Vérifie et récupère les noms des fichiers de données du ministère des finances pathCSVDataGouvFr = args[1] if not os.path.isfile(pathCSVDataGouvFr): msg = __doc__ + "Erreur : paramètre fichier .csv !\n" + \ "Ce fichiers .csv doit être récupérés sur\n" + \ config.get('Extraction', 'dataGouvFr.ComptesComptesGroupements') + ":\n" + \ pathCSVDataGouvFr print(msg, file=sys.stderr) sys.exit(3) print('Début de', nomProg) # Crée la base de données si elle n'existe pas connDB = database.createDatabase(config, databasePath, verbose) # Récupère les numéros de SIREN des groupements dans la base # ainsi que leurs noms et années des infos financières déjà enregistrées. dictSirenInfos = database.getSirenInfosGroupementsAnnees(connDB, verbose) if not dictSirenInfos: msg = "Erreur : La base de données :\n" + databasePath + \ "\n ne contient aucun groupement de commune à extraire," +\ "lancer updateGroupementsCommunes" print(msg, file=sys.stderr) # Met à jour la base de données le fichier .CSV passé en paramètres print("Traitement de :", pathCSVDataGouvFr, "...") with open(pathCSVDataGouvFr, mode='rt', buffering=config.getint('Extraction', 'updateDataMinFi.bufferReadingSize'), encoding='utf-8') as hFicMinFi: # Analyse l'entête du fichier header = hFicMinFi.readline().strip() dictPositionColumns, listMissingKeys = \ updateDataMinFiCommon.getColumnPosition(header, "GC", connDB, verbose) # Print missing columns if len(listMissingKeys) > 0: print("Attention : les motcles suivants n'ont pas été trouvés :\n", ";".join(listMissingKeys)) # Enregistre si nécessaire chaque ligne du fichier numLine = 1 numGroupement = 0 for ligneVille in hFicMinFi: numLine += 1 dictValues = analyseLigneGroupement(ligneVille, dictPositionColumns, verbose) # Analyse et enregistre les valeurs de cette ligne if "siren" in dictValues and dictValues["siren"].isdigit() and \ len(dictValues["siren"]) == 9 and \ "exer" in dictValues and dictValues["exer"].isdigit() and \ len(dictValues["exer"]) == 4 and \ dictValues["siren"] in dictSirenInfos and \ int(dictValues["exer"]) not in dictSirenInfos[dictValues["siren"]][2]: numGroupement += 1 database.enregistreLigneGroupementMinFi( dictValues, connDB, verbose) print('.', end='', flush=True) else: print('X', end='', flush=True) print("\n", numLine - 1, "lignes traitées,", numGroupement, "groupements enregistrés") # Ferme la base de données database.closeDatabase(connDB, verbose)
def main(argv=None): """ Met à jour la base de données du ministère des finances à partir des fichiers .csv du répertoire passé en paramètres. """ # Valeur par défaut des options verbose = False # Lecture du fichier de propriétés config = configparser.RawConfigParser() ficProperties = 'FinancesLocales.properties' config.read(ficProperties) ############################# # Analyse des arguments reçus ############################# if argv is None: argv = sys.argv nomProg = os.path.basename(argv[0]) # parse command line options try: opts, args = getopt.getopt(argv[1:], "huVv", ["help", "usage", "version", "verbose"]) except getopt.error as msg: print(msg) print("Pour avoir de l'aide : --help ou -h", file=sys.stderr) sys.exit(1) # process options for option, arg in opts: verboseOpt, sortiePgm = \ utilitaires.traiteOptionStd(config, option, nomProg, __doc__, ['database/minfi.db ../recup_data_gouv_fr']) verbose = verbose or verboseOpt if sortiePgm: sys.exit(0) utilitaires.checkPythonVersion(config, verbose) # Récuperation et analyse des paramètres if len(args) != 2: msg = __doc__ + "\nDonnez au moins 2 paramètres :\n" + \ "chemin base .db et répertoire des .csv !" + \ "\nau lieu de : " + str(len(args)) print(msg, file=sys.stderr) sys.exit(1) # Vérifie et récupère le nom de la base à mettre à jour databasePath = args[0] if not databasePath.endswith(".db"): msg = __doc__ + "Erreur : Le nom de la base de donnée doit se terminer par .db :\n" + \ databasePath print(msg, file=sys.stderr) sys.exit(2) # Vérifie et récupère les noms des fichiers de données du ministère des finances pathCSVDataGouvFr = args[1] listFileCSVMinFi = [] try: listFileCSVMinFi = checkPathCSVDataGouvFr(config, pathCSVDataGouvFr, verbose) except ValueError as exc: msg = __doc__ + "Erreur : paramètre répertoire des .csv !\n" + \ "Ce repertoire doit contenir les fichiers .csv" + \ "de données récupérés sur\n" + \ config.get('Extraction', 'dataGouvFr.Comptes') + "\n" + \ str(exc) print(msg, file=sys.stderr) sys.exit(3) print('Début de', nomProg) # Crée la base de données si elle n'existe pas connDB = database.createDatabase(config, databasePath, verbose) # récupère la liste des villes et des années présentes dans la base dictCodeCommuneAnnees = database.getDictCodeCommuneAnnees(connDB, verbose) if not dictCodeCommuneAnnees: msg = "Erreur : La base de données :\n" + databasePath + \ "\n ne contient aucune ville à extraire, lancer extractionWikipediaFr" print(msg, file=sys.stderr) # Met à jour la base de données avec chaque fichier .CSV trouvé for fileCSVMinFi in listFileCSVMinFi: print("Traitement de :", fileCSVMinFi, "...") with open(fileCSVMinFi, mode='rt', buffering=config.getint('Extraction', 'updateDataMinFi.bufferReadingSize'), encoding='utf-8') as hFicMinFi: # Analyse l'entête du fichier header = hFicMinFi.readline().strip() dictPositionColumns, listMissingKeys = \ updateDataMinFiCommon.getColumnPosition(header, "V", connDB, verbose) # Print missing columns if len(listMissingKeys) > 0: print( "Attention : les motcles suivants n'ont pas été trouvés :\n", ";".join(listMissingKeys)) # Enregistre si nécessaire chaque ligne du fichier numLine = 1 for ligneVille in hFicMinFi: numLine += 1 dictValues = analyseLigneVille(config, ligneVille, dictPositionColumns, verbose) if dictValues['codeCommune'] in dictCodeCommuneAnnees and \ int(dictValues[config.get("cleFi1Valeur", "clefi.annee")]) \ not in dictCodeCommuneAnnees[dictValues['codeCommune']]: database.enregistreLigneVilleMinFi(config, dictValues, connDB, verbose) print(numLine - 1, "villes traitées.") # Ferme la base de données database.closeDatabase(connDB, verbose)