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)
예제 #2
0
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)
예제 #4
0
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)
예제 #5
0
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)
예제 #6
0
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)